using System; using Microsoft.SPOT; using System.Text; using System.IO.Ports; 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 Radiometer1 : SatlanticOCR504 { private Radiometer1() : base("Radiometer 1", "COM8", 57600, Parity.None, 8, StopBits.One, 5000, 20, false, 0) { } private static Radiometer1 instance; public static Radiometer1 Instance { get { return instance ?? (instance = new Radiometer1()); } } } public class SatlanticOCR504 { private static StringBuilder sbTemp = new StringBuilder(256); private const int flbbPkt = 1; private const int flbbAve = 20; private I2CSerialPort IOPort; private MotherBoard motherboard = MotherBoard.Instance; //TODO P1: Need to harmonize NativeUART and I2CSerialPort constructors public SatlanticOCR504 (string id, string portName, int baudRate, Parity parity, int dataBits, StopBits stopBits, int readTimeout, int writeTimeout, bool useSTX, byte STX) { IOPort = new I2CSerialPort(portName, baudRate, dataBits, parity, stopBits); } public void init() { IOPort.DataReceived += port_DataReceived; IOPort.Open(); powerOff(); Thread.Sleep(1000); powerOn(); Thread.Sleep(1000); sendStopFreeRun(); Thread.Sleep(1000); sendAutoTelemetryOff(); Thread.Sleep(1000); sendNetworkModeOff(); Thread.Sleep(1000); sendAverageOff(); Thread.Sleep(1000); sendFrametypeShort(); Thread.Sleep(1000); sendCalOn(); Thread.Sleep(1000); } private static byte[] txBytes = new byte[64]; private static byte[] stopFreeRun = { 0x13 }; private void sendStopFreeRun() { EngrLogger.writeToColumns("Sending radiometer stopFreeRun"); IOPort.Write(stopFreeRun, 0, stopFreeRun.Length); } private static byte[] pollSample = { 0x20 }; public void sendPollSample() { EngrLogger.writeToColumns("Sending radiometer pollSample"); IOPort.Write(pollSample, 0, pollSample.Length); } private static byte[] autoTelemetryOff = UTF8Encoding.UTF8.GetBytes("set initat off"); private void sendAutoTelemetryOff() { EngrLogger.writeToColumns("Sending radiometer autoTelemetryOff"); IOPort.Write(autoTelemetryOff, 0, autoTelemetryOff.Length); } private static byte[] networkModeOff = UTF8Encoding.UTF8.GetBytes("set netmode off"); private void sendNetworkModeOff() { EngrLogger.writeToColumns("Sending radiometer networkModeOff"); IOPort.Write(networkModeOff, 0, networkModeOff.Length); } private static byte[] averageOff = UTF8Encoding.UTF8.GetBytes("set avg off"); private void sendAverageOff() { EngrLogger.writeToColumns("Sending radiometer averageOff"); IOPort.Write(averageOff, 0, averageOff.Length); } private static byte[] frametypeShort = UTF8Encoding.UTF8.GetBytes("set frametype short"); private void sendFrametypeShort() { EngrLogger.writeToColumns("Sending radiometer frametypeShort"); IOPort.Write(frametypeShort, 0, frametypeShort.Length); } private static byte[] calOn = UTF8Encoding.UTF8.GetBytes("set Cal On"); private void sendCalOn() { EngrLogger.writeToColumns("Sending radiometer calOn"); IOPort.Write(calOn, 0, calOn.Length); } private static StringBuilder sbTemp2 = new StringBuilder(128); private static readonly StringBuilder radiometerHeader = new StringBuilder("Radiometer Message"); private static DateTime timeNow = new DateTime(); public void powerOn() { motherboard.EnableChannelPower(MotherBoard.ChannelNames.RadiometerChannel); } public void powerOff() { motherboard.DisableChannelPower(MotherBoard.ChannelNames.RadiometerChannel); } 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, radiometerHeader, EngrLogger.ColumnNums.pressure, SV.Pressure, EngrLogger.ColumnNums.FLBB, qRecord.byteArray); if (SciLogger.samplingInstruments) SciLogger.logSciSample(QRecordType.FLBB, qRecord.byteArray); } //TODO P1: this needs to be replaced with something that enques and all that jazz private void port_DataReceived(object sender, EventArgs e) { var inbuff = new byte[1024]; var port = (I2CSerialPort)sender; port.Read(inbuff, 0, port.BytesToRead); sbTemp.Append(SafeEncoding.GetChars(inbuff)); EngrLogger.writeToColumns("Got OCR504 Line: " + sbTemp.ToString()); Debug.Print("Got OCR504 Line: " + sbTemp.ToString()); } } }