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", 9600, 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 ExarUart 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 ExarUart(id, processMessage, portName, baudRate, parity, dataBits, stopBits, readTimeout, writeTimeout, false, 0); } public void init() { if (!IOPort.IsOpen) IOPort.Open(); //TODO P2 Do we really need both these 5 second sleeps? EngrLogger.writeToColumns("Powering down OCR504"); motherboard.DisableChannelPower(MotherBoard.ChannelNames.RadiometerChannel); Thread.Sleep(5000); EngrLogger.writeToColumns("Powering up OCR504"); motherboard.EnableChannelPower(MotherBoard.ChannelNames.RadiometerChannel); Thread.Sleep(5000); } public void powerUp() { EngrLogger.writeToColumns("Powering up OCR504"); motherboard.EnableChannelPower(MotherBoard.ChannelNames.RadiometerChannel); } public void powerDown() { EngrLogger.writeToColumns("Powering down OCR504"); motherboard.DisableChannelPower(MotherBoard.ChannelNames.RadiometerChannel); } 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[] startCommandMode = { 0x03 }; private void sendStartCommandMode() { EngrLogger.writeToColumns("Sending start command mode"); IOPort.Write(startCommandMode, 0, startCommandMode.Length); } public 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\r"); private void sendAutoTelemetryOff() { EngrLogger.writeToColumns("Sending radiometer autoTelemetryOff"); IOPort.Write(autoTelemetryOff, 0, autoTelemetryOff.Length); } private static byte[] networkModeOff = UTF8Encoding.UTF8.GetBytes("set netmode off\r"); private void sendNetworkModeOff() { EngrLogger.writeToColumns("Sending radiometer networkModeOff"); IOPort.Write(networkModeOff, 0, networkModeOff.Length); } private static byte[] averageOff = UTF8Encoding.UTF8.GetBytes("set avg off\r"); private void sendAverageOff() { EngrLogger.writeToColumns("Sending radiometer averageOff"); IOPort.Write(averageOff, 0, averageOff.Length); } private static byte[] averageOn = UTF8Encoding.UTF8.GetBytes("set avg on\r"); private void sendAverageOn() { EngrLogger.writeToColumns("Sending radiometer averageOn"); IOPort.Write(averageOn, 0, averageOn.Length); } private static byte[] frameRate1 = UTF8Encoding.UTF8.GetBytes("set framerate 1\r"); private void sendFrameRate1() { EngrLogger.writeToColumns("Sending framerate 1"); IOPort.Write(frameRate1, 0, frameRate1.Length); } private static byte[] frametypeShort = UTF8Encoding.UTF8.GetBytes("set frametype short\r"); private void sendFrametypeShort() { EngrLogger.writeToColumns("Sending radiometer frametypeShort"); IOPort.Write(frametypeShort, 0, frametypeShort.Length); } private static byte[] calOn = UTF8Encoding.UTF8.GetBytes("set Cal On\r"); private void sendCalOn() { EngrLogger.writeToColumns("Sending radiometer calOn"); IOPort.Write(calOn, 0, calOn.Length); } private static byte[] calOff = UTF8Encoding.UTF8.GetBytes("set Cal Off\r"); private void sendCalOff() { EngrLogger.writeToColumns("Sending radiometer calOff"); IOPort.Write(calOff, 0, calOn.Length); } int delay = 25; private static byte[] showAll = UTF8Encoding.UTF8.GetBytes("show all\r"); private void sendShowAll() { EngrLogger.writeToColumns("Sending show all"); for (int i = 0; i < showAll.Length; i++) { Thread.Sleep(delay); IOPort.WriteByte(showAll[i]); } } private static byte[] exit = UTF8Encoding.UTF8.GetBytes("exit\r"); private void sendExit() { EngrLogger.writeToColumns("Sending exit"); for (int i = 0; i -1) { sbTemp.Clear(); sbTemp.Append(SafeEncoding.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); } if(SV.Pressure == double.NaN) EngrLogger.writeToColumns(EngrLogger.ColumnNums.dateTime, timeNow, EngrLogger.ColumnNums.state, qRecord.state, EngrLogger.ColumnNums.comment, radiometerHeader, EngrLogger.ColumnNums.OCR, qRecord.byteArray); else EngrLogger.writeToColumns(EngrLogger.ColumnNums.dateTime, timeNow, EngrLogger.ColumnNums.state, qRecord.state, EngrLogger.ColumnNums.comment, radiometerHeader, EngrLogger.ColumnNums.CTDSalinity, SV.Pressure, EngrLogger.ColumnNums.OCR, qRecord.byteArray); if (SciLogger.getRadiometer) { sbTemp.Clear(); sbTemp.Append(UTF8Encoding.UTF8.GetChars(qRecord.byteArray)); SciLogger.postSample(SciLogger.Instrument.Radiometer, sbTemp); sbTemp2.Clear(); sbTemp2.Append("Radiometer post: "); sbTemp2.Append(sbTemp); EngrLogger.writeToColumns(sbTemp2); } } ////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()); //} } }