using System; using System.IO.Ports; using System.Text; using System.Threading; using SWModules; namespace HWModules { // This is a Singleton instantiation based on // C# in Depth, Third Edition Jon Skeet // http://csharpindepth.com/Articles/General/Singleton.aspx // "a singleton is a class which only allows a single instance of itself to be created, and usually gives simple access to that instance" public sealed class FLBB1 : WetlabsFLBB2K { private FLBB1() : base("FLBB1", "COM5", 19200, Parity.None, 8, StopBits.One, 5000, 20, true, (byte)'/') { } private static FLBB1 instance; public static FLBB1 Instance { get { return instance ?? (instance = new FLBB1()); } } } public class WetlabsFLBB2K { private static StringBuilder sbTemp = new StringBuilder(256); private const int flbbPkt = 1; private const int flbbAve = 20; private NativeUART IOPort; public WetlabsFLBB2K (string id, string portName, int baudRate, Parity parity, int dataBits, StopBits stopBits, int readTimeout, int writeTimeout, bool useSTX, byte STX) { IOPort = new NativeUART(id, processMessage, portName, baudRate, parity, dataBits, stopBits, readTimeout, writeTimeout, useSTX, STX); } public void init() { IOPort.Open(); IOPort.DiscardInBuffer(); IOPort.DiscardOutBuffer(); sendStopCmd(); Thread.Sleep(1500); sendPktCmd(flbbPkt); Thread.Sleep(1000); sendAveCmd(flbbAve); } private static byte[] txBytes = new byte[64]; private static StringBuilder pktCmd = new StringBuilder("$pkt "); private const string pktCmdHeader = "Sending FLBB pkt command"; private void sendPktCmd(int numPkt) { //Debug.Print("Sending FLBB pkt command"); sbTemp.Clear(); sbTemp.Append(pktCmdHeader); sbTemp.Append(": "); sbTemp.Append(pktCmd); sbTemp.AppendLine(numPkt.ToString()); //Array.Clear(qS.byteArray, 0, qS.byteArray.Length); //Array.Copy(UTF8Encoding.UTF8.GetBytes(sbTemp.ToString()), qS.byteArray, sbTemp.Length); //qS.state = SV.CurrentState; //qS.qRecordType = StructQueue.QRecordType.FLBB; //qS.timeStamp = DateTime.Now; //Program.sQueue.Enqueue(qS); EngrLogger.writeToColumns(sbTemp); sbTemp.Clear(); sbTemp.Append(pktCmd); sbTemp.AppendLine(numPkt.ToString()); Array.Clear(txBytes, 0, txBytes.Length); Array.Copy(UTF8Encoding.UTF8.GetBytes(sbTemp.ToString()), txBytes, sbTemp.Length); IOPort.Write(txBytes, 0, sbTemp.Length); } private static StringBuilder aveCmd = new StringBuilder("$ave "); private const string aveCmdHeader = "Sending FLBB ave command"; private void sendAveCmd(int numAve) { //Debug.Print("Sending FLBB ave command"); sbTemp.Clear(); sbTemp.Append(aveCmdHeader); sbTemp.Append(": "); sbTemp.Append(aveCmd); sbTemp.AppendLine(numAve.ToString()); //Array.Clear(qS.byteArray, 0, qS.byteArray.Length); //Array.Copy(UTF8Encoding.UTF8.GetBytes(sbTemp.ToString()), qS.byteArray, sbTemp.Length); //qS.state = SV.CurrentState; //qS.qRecordType = StructQueue.QRecordType.FLBB; //qS.timeStamp = DateTime.Now; //Program.sQueue.Enqueue(qS); EngrLogger.writeToColumns(sbTemp); sbTemp.Clear(); sbTemp.Append(aveCmd); sbTemp.AppendLine(numAve.ToString()); Array.Clear(txBytes, 0, txBytes.Length); Array.Copy(UTF8Encoding.UTF8.GetBytes(sbTemp.ToString()), txBytes, sbTemp.Length); IOPort.Write(txBytes, 0, sbTemp.Length); } private static readonly byte[] stopCmd = UTF8Encoding.UTF8.GetBytes("!!!!!!!!!!!!!!!"); private const string stopCmdHeader = "Sending FLBB stop command"; public void sendStopCmd() { //Debug.Print("Sending FLBB stop command"); //Array.Clear(qS.byteArray, 0, qS.byteArray.Length); //Array.Copy(UTF8Encoding.UTF8.GetBytes(stopCmdHeader), qS.byteArray, stopCmdHeader.Length); //qS.state = SV.CurrentState; //qS.qRecordType = StructQueue.QRecordType.FLBB; //qS.timeStamp = DateTime.Now; //Program.sQueue.Enqueue(qS); EngrLogger.writeToColumns(stopCmdHeader); IOPort.Write(stopCmd, 0, stopCmd.Length); } private static readonly byte[] runCmd = UTF8Encoding.UTF8.GetBytes("$run\r\n"); private const string runCmdHeader = "Sending FLBB run command"; public void sendRunCmd() { //Debug.Print("Sending FLBB run command"); //Array.Clear(qS.byteArray, 0, qS.byteArray.Length); //Array.Copy(UTF8Encoding.UTF8.GetBytes(runCmdHeader), qS.byteArray, runCmdHeader.Length); //qS.state = SV.CurrentState; //qS.qRecordType = StructQueue.QRecordType.FLBB; //qS.timeStamp = DateTime.Now; //Program.sQueue.Enqueue(qS); EngrLogger.writeToColumns(runCmdHeader); IOPort.Write(runCmd, 0, runCmd.Length); } private static StringBuilder sbTemp2 = new StringBuilder(128); private static readonly StringBuilder FLBBHeader = new StringBuilder("FLBB Message"); private static DateTime timeNow = new DateTime(); public void processMessage(QRecord qRecord) { timeNow = DateTime.Now; if (Array.IndexOf(qRecord.byteArray, (byte)'\t') > -1) { sbTemp.Clear(); sbTemp.Append(UTF8Encoding.UTF8.GetChars(qRecord.byteArray)); //TODO P2 get rid of try catch block; maybe check for tabs then get rid of them try { sbTemp.Replace('\t', ','); } catch { sbTemp2.Clear(); sbTemp2.Append("Program /t .Replace error location 1 string: "); sbTemp2.Append(sbTemp); EngrLogger.writeToColumns(sbTemp2); } Array.Clear(qRecord.byteArray, 0, qRecord.byteArray.Length); Array.Copy(UTF8Encoding.UTF8.GetBytes(sbTemp.ToString()), qRecord.byteArray, sbTemp.Length); } EngrLogger.writeToColumns(EngrLogger.ColumnNums.dateTime, timeNow, EngrLogger.ColumnNums.state, qRecord.state, EngrLogger.ColumnNums.comment, FLBBHeader, EngrLogger.ColumnNums.pressure, SV.Pressure, EngrLogger.ColumnNums.FLBB, qRecord.byteArray); if (SciLogger.samplingInstruments) SciLogger.logSciSample(QRecordType.FLBB, qRecord.byteArray); } } }