tbf/TestBenchFramework/BenchControl/Cameras/IdcCamera/SerialFileIO.cs
2014-07-28 09:56:40 +02:00

228 lines
6.1 KiB
C#

using System;
using System.Diagnostics;
using System.IO;
using System.Text;
using log4net;
using TBF.UiBridge;
namespace TBF.BenchControl.Cameras.IdcCamera
{
///
/// File I/O implementation
///
public class SerialFileIO
{
static readonly ILog log = LogManager.GetLogger(typeof(SerialFileIO));
static TBF.Tools.ByteFormatter byteFormatter = new TBF.Tools.ByteFormatter();
const int BUFSIZE = 1024;
const int MAXFNAMESIZE = 62;
int cameraIdx;
string imagesPath;
StringBuilder fioFilenameBuilder;
string fioFullPathname;
int packetSize;
byte[] fioBuffer;
BinaryWriter fioWriter;
enum FioState
{
Command, /// 'o', 'c' or 'w'
Open, /// 'p'
Open2, /// 'e'
Open3, /// 'n'
Open4, /// 1
Filename,
Close, /// 'l'
Close2, /// 'o'
Close3, /// 's'
Close4, /// 'e'
Close5, /// 1
Write, /// 'r'
Write2, /// 'i'
Write3, /// 't'
Write4, /// 'e'
Write5, /// 1
PktSize1,
PktSize2,
PktSize3,
Data,
}
FioState state;
public string TransferredFile
{
get { return fioFullPathname; }
}
public SerialFileIO(int cameraIdx, string imagesPath)
{
this.cameraIdx = cameraIdx;
this.imagesPath = imagesPath;
state = FioState.Command;
fioFullPathname = string.Empty;
fioFilenameBuilder = new StringBuilder(16);
fioBuffer = new byte[BUFSIZE];
}
public void ProcessByte(byte b)
{
///
/// Reaching break in any case of the following switch is an error
///
if (state == FioState.Data)
{
if (packetSize > 0)
{
if (fioWriter != null)
{
fioWriter.Write(b);
}
if (--packetSize == 0)
{
state = FioState.Command;
}
return;
}
log.ErrorFormat("{0}: FIO error 17", cameraIdx);
}
else
{
switch (state)
{
case FioState.Command:
if ((char)b == 'o') { state = FioState.Open; return; }
if ((char)b == 'c') { state = FioState.Close; return; }
if ((char)b == 'w') { state = FioState.Write; return; }
log.ErrorFormat("{0}: FIO error 1, fullPathName={1}", cameraIdx, fioFullPathname);
break;
case FioState.Open:
if ((char)b == 'p') { state = FioState.Open2; return; }
log.ErrorFormat("{0}: FIO error 2", cameraIdx);
break;
case FioState.Open2:
if ((char)b == 'e') { state = FioState.Open3; return; }
log.ErrorFormat("{0}: FIO error 3", cameraIdx);
break;
case FioState.Open3:
if ((char)b == 'n') { state = FioState.Open4; return; }
log.ErrorFormat("{0}: FIO error 4", cameraIdx);
break;
case FioState.Open4:
if (b == 1)
{
fioFilenameBuilder.Clear();
state = FioState.Filename;
return;
}
log.ErrorFormat("{0}: FIO error 5", cameraIdx);
break;
case FioState.Filename:
if (b == 0)
{
if (fioWriter != null)
{
fioWriter.Close();
fioWriter.Dispose();
}
try
{
fioFullPathname = imagesPath + fioFilenameBuilder.ToString();
fioWriter = new BinaryWriter(File.Open(fioFullPathname, FileMode.Create));
log.DebugFormat("{0}: Open(\"{1}\")", cameraIdx, fioFullPathname);
}
catch
{
fioWriter = null;
log.WarnFormat("{0}: Failed to open(\"{1}\")", cameraIdx, fioFullPathname);
}
state = FioState.Command;
return;
}
else if (fioFilenameBuilder.Length < MAXFNAMESIZE)
{
fioFilenameBuilder.Append((char)b);
return;
}
log.ErrorFormat("{0}: FIO error 6", cameraIdx);
break;
case FioState.Close:
if ((char)b == 'l') { state = FioState.Close2; return; }
log.ErrorFormat("{0}: FIO error 7", cameraIdx);
break;
case FioState.Close2:
if ((char)b == 'o') { state = FioState.Close3; return; }
log.ErrorFormat("{0}: FIO error 8", cameraIdx);
break;
case FioState.Close3:
if ((char)b == 's') { state = FioState.Close4; return; }
log.ErrorFormat("{0}: FIO error 9", cameraIdx);
break;
case FioState.Close4:
if ((char)b == 'e') { state = FioState.Close5; return; }
log.ErrorFormat("{0}: FIO error 10", cameraIdx);
break;
case FioState.Close5:
if ((char)b == '1' && fioWriter != null)
{
log.DebugFormat("{0}: Close()", cameraIdx);
fioWriter.Close();
fioWriter.Dispose();
fioWriter = null;
Bridge.OnImageUpdated(this, new ImageUpdatedEventArgs(cameraIdx, fioFullPathname));
fioFullPathname = String.Empty;
state = FioState.Command;
return;
}
log.ErrorFormat("{0}: FIO error 11", cameraIdx);
break;
case FioState.Write:
if ((char)b == 'r') { state = FioState.Write2; return; }
log.ErrorFormat("{0}: FIO error 12", cameraIdx);
break;
case FioState.Write2:
if ((char)b == 'i') { state = FioState.Write3; return; }
log.ErrorFormat("{0}: FIO error 13", cameraIdx);
break;
case FioState.Write3:
if ((char)b == 't') { state = FioState.Write4; return; }
log.ErrorFormat("{0}: FIO error 14", cameraIdx);
break;
case FioState.Write4:
if ((char)b == 'e') { state = FioState.Write5; return; }
log.ErrorFormat("{0}: FIO error 15", cameraIdx);
break;
case FioState.Write5:
if ((char)b == '1') { state = FioState.PktSize1; return; }
log.ErrorFormat("{0}: FIO error 16", cameraIdx);
break;
case FioState.PktSize1:
packetSize = (int)b;
state = FioState.PktSize2;
return;
case FioState.PktSize2:
packetSize = (256 * packetSize) + (int)b;
state = FioState.PktSize3;
return;
case FioState.PktSize3:
packetSize = (256 * packetSize) + (int)b;
log.DebugFormat("{0}: write(len={1})", cameraIdx, packetSize);
state = FioState.Data;
return;
default:
log.ErrorFormat("{0}: FIO error 18", cameraIdx);
break;
}
}
state = FioState.Command;
}
}
}