using System; using Microsoft.SPOT; using System.Threading; using System.IO.Ports; using System.Text; namespace CPF { class IModem { public enum returnCode : int { none = 0, CSQ, SBDWT, SBDIX, } public static SerialPort iModemPort = new SerialPort("COM2", 19200, Parity.None, 8, StopBits.One); private static object iModemLock = new object(); private static StructQueue.qStruct qS = new StructQueue.qStruct(); public static void init() { qS.byteArray = new byte[StructQueue.qRecordWidth]; iModemPort.ReadTimeout = 5000; iModemPort.Open(); iModemPort.DiscardInBuffer(); iModemPort.DiscardOutBuffer(); iModemPort.DataReceived += new SerialDataReceivedEventHandler(iModemDataReceived); } private static byte[] txBytes = new byte[1024]; private const string a3laCSQ = "AT+CSQ\r"; public static void sendCSQ() { //Debug.Print("Sending CSQ"); Array.Clear(txBytes, 0, txBytes.Length); Array.Copy(UTF8Encoding.UTF8.GetBytes(a3laCSQ), txBytes, a3laCSQ.Length); qS.returnCode = (int)returnCode.CSQ; iModemPort.Write(txBytes, 0, a3laCSQ.Length); } private static StringBuilder sbTemp = new StringBuilder(1024); public static void sendSBDWT(byte[] inBytes) { sbTemp.Clear(); sbTemp.Append(UTF8Encoding.UTF8.GetChars(inBytes)); Debug.Print("SBDWT string = " + sbTemp.ToString()); Array.Clear(txBytes, 0, txBytes.Length); Array.Copy(UTF8Encoding.UTF8.GetBytes(sbTemp.ToString()), txBytes, sbTemp.Length); qS.returnCode = (int)returnCode.SBDWT; iModemPort.Write(txBytes, 0, sbTemp.Length); } private static StringBuilder sbSBDIX = new StringBuilder("AT+SBDIX\r"); public static void sendSBDIX() { Array.Clear(txBytes, 0, txBytes.Length); Array.Copy(UTF8Encoding.UTF8.GetBytes(sbSBDIX.ToString()), txBytes, sbSBDIX.Length); qS.returnCode = (int)returnCode.SBDIX; iModemPort.Write(txBytes, 0, sbTemp.Length); } private static byte LF = 10; private static byte[] bytesRead = new byte[2048]; private static byte[] messageBytes = new byte[2048]; private static int bytesToRead; private static int messageIndex = 0; private static void iModemDataReceived(object sender, SerialDataReceivedEventArgs e) { bytesToRead = iModemPort.BytesToRead; try { iModemPort.Read(bytesRead, 0, bytesToRead); } catch { Debug.Print("Iridium Modem Read Exception"); //TODO do something smarter here } for (int i = 0; i < bytesToRead; i++) { messageBytes[messageIndex] = bytesRead[i]; if (messageBytes[messageIndex] == LF) { qS.timeStamp = DateTime.Now; qS.state = Program.CPFState; //sbTemp.Clear(); //sbTemp.Append(UTF8Encoding.UTF8.GetChars(messageBytes, 0, messageIndex - 1)); //Debug.Print("iModem Message = " + sbTemp.ToString()); Array.Clear(qS.byteArray, 0, qS.byteArray.Length); Array.Copy(messageBytes, qS.byteArray, messageIndex + 1); qS.qRecordType = StructQueue.QRecordType.IModem; lock (iModemLock) { Program.sQueue.Enqueue(qS); } messageIndex = 0; Array.Clear(messageBytes, 0, messageBytes.Length); qS.returnCode = 0; } else { messageIndex = messageIndex + 1; } } } } }