using System; using Microsoft.SPOT; using System.IO.Ports; using System.Text; using System.Threading; using SWModules; namespace HWModules { // This is a Singleton instantiation of FIFOQueue class 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 IridiumModem1 : NAL_A3LAR { private IridiumModem1() : base("IridiumModem1", "COM3", 19200, Parity.None, 8, StopBits.One, 5000, 20, false, (byte)0) { MotherBoard mb = MotherBoard.Instance; //mb.EnableChannelPower(1); //mb.EnableChannelPower(2); } private static IridiumModem1 instance; public static IridiumModem1 Instance { get { instance = instance ?? (new IridiumModem1()); return instance; } } } public class NAL_A3LAR { public enum ReturnCodes : int { none = 0, CSQ, SBDWT, SBDIX, } public int returnCode; public NativeUART IOPort; private MotherBoard motherboard = MotherBoard.Instance; //private BTConsole btConsole; public NAL_A3LAR(string id, string portName, int baudRate, Parity parity, int dataBits, StopBits stopBits, int readTimeout, int writeTimeout, bool useSTX, byte STX) { //btConsole = BTConsole.Instance; IOPort = new NativeUART(id, processMessage, portName, baudRate, parity, dataBits, stopBits, readTimeout, writeTimeout, useSTX, STX); } public NAL_A3LAR() { } public void init() { if (!IOPort.IsOpen) { IOPort.Open(); AttachDataHandler(); } IOPort.DiscardInBuffer(); IOPort.DiscardOutBuffer(); Thread.Sleep(3000); sendD0(); Thread.Sleep(1000); sendK0(); Thread.Sleep(1000); sendSBDD2(); Thread.Sleep(1000); sendGSN(); Thread.Sleep(1000); sendSBDC(); Thread.Sleep(1000); sendNoEcho(); Thread.Sleep(1000); sendCICCID(); } public void simpleInit() { if (!IOPort.IsOpen) { IOPort.Open(); AttachDataHandler(); } IOPort.DiscardInBuffer(); IOPort.DiscardOutBuffer(); } public void powerUp() { IOPort.DiscardInBuffer(); IOPort.DiscardOutBuffer(); EngrLogger.writeToColumns("Powering up Iridium Modem"); motherboard.EnableChannelPower(MotherBoard.ChannelNames.IridiumChannel); Thread.Sleep(3000); sendD0(); Thread.Sleep(1000); sendK0(); Thread.Sleep(1000); sendSBDD2(); Thread.Sleep(1000); sendGSN(); Thread.Sleep(1000); sendSBDC(); Thread.Sleep(1000); sendNoEcho(); Thread.Sleep(1000); sendCICCID(); } public void powerDown() { EngrLogger.writeToColumns("Powering down Iridium Modem"); motherboard.DisableChannelPower(MotherBoard.ChannelNames.IridiumChannel); } private static readonly StringBuilder IModemHeader = new StringBuilder("A3LA Message"); public void processMessage(QRecord qRecord) { //btConsole.checkForConsoleCommands(qRecord.byteArray); EngrLogger.writeToColumns(EngrLogger.ColumnNums.dateTime, qRecord.timeStamp, EngrLogger.ColumnNums.state, qRecord.state, EngrLogger.ColumnNums.comment, IModemHeader, EngrLogger.ColumnNums.IModem, qRecord.byteArray); //TODO P0 Well I broke something here.... EJM //if (SurfaceOps.Substate == (int)NAL_A3LAR.commands.csq) //{ // parseSQ(qRecord.byteArray); //} //Check for expected response if (waitingForResponse && !gotResponse) checkResponse(qRecord.byteArray); } private static readonly byte[] a3laAT = Encoding.UTF8.GetBytes("AT\r"); public int sendAT() { WriteArray(a3laAT); return (1); } //Reset the MOMSN (mobile origniated message sequence number private static readonly byte[] a3laSBDC = Encoding.UTF8.GetBytes("AT+SBDC\r"); public int sendSBDC() { //Debug.Print(DateTime.Now + " Sending SBDC"); WriteArray(a3laSBDC); return (1); } //Get the IMEI number private static readonly byte[] a3laGSN = Encoding.UTF8.GetBytes("AT+GSN\r"); public int sendGSN() { //Debug.Print(DateTime.Now + " Sending GSN"); WriteArray(a3laGSN); IOPort.WriteByte(13); return (1); } private static readonly byte[] a3laCSQ = Encoding.UTF8.GetBytes("AT+CSQ\r"); public int sendCSQ() { //Debug.Print(DateTime.Now + " Sending CSQ"); WriteArray(a3laCSQ); return (1); } private static readonly byte[] a3laD0 = Encoding.UTF8.GetBytes("AT&D0\r"); public void sendD0() { //Debug.Print(DateTime.Now + " Sending D0"); WriteArray(a3laD0); } private static readonly byte[] setFactoryDefault = Encoding.UTF8.GetBytes("AT&F0\r"); public void sendFactoryDefault() { //Debug.Print(DateTime.Now + " Sending D0"); WriteArray(setFactoryDefault); } private static readonly byte[] baEscapeSeq = Encoding.UTF8.GetBytes("+"); public void sendEscapeSequence() { //Debug.Print(DateTime.Now + " Sending Escape Sequence"); WriteArray(baEscapeSeq); Thread.Sleep(150); WriteArray(baEscapeSeq); Thread.Sleep(250); WriteArray(baEscapeSeq); } private static readonly byte[] noEcho = Encoding.UTF8.GetBytes("ATEn=0\r"); public void sendNoEcho() { //Debug.Print(DateTime.Now + " Sending No Echo"); WriteArray(noEcho); } private static readonly byte[] a3laK0 = Encoding.UTF8.GetBytes("AT&K0\r"); public void sendK0() { //Debug.Print(DateTime.Now + " Sending K0"); WriteArray(a3laK0); } //TODO P1 readonly and 2000? that doesn't seem right and neither does the sbdwtMsg below this private StringBuilder sbdwtMsg = new StringBuilder(2000); public StringBuilder SBDWTMsg { get { return sbdwtMsg; } set { sbdwtMsg = value; } } private static readonly StringBuilder sbTemp = new StringBuilder(2000); private static byte[] baCR = new byte[] { 13 }; public int loadSBDWTBuffer() { int msgLength = 0; if (sbdwtMsg.Length > 1910) msgLength = 1910; else msgLength = sbdwtMsg.Length; IOPort.Write(UTF8Encoding.UTF8.GetBytes(sbdwtMsg.ToString()), 0, msgLength); IOPort.Write(baCR, 0, 1); sbTemp.Clear(); sbTemp.Append("Loaded SBDWT Buffer with->"); sbTemp.Append(sbdwtMsg); sbTemp.Append("<-"); EngrLogger.writeToColumns(sbTemp); return (1); } private static readonly byte[] baSBDWT = Encoding.UTF8.GetBytes("AT+SBDWT\r"); public void sendSBDWTCommand() { //Debug.Print(DateTime.Now + " Sending SBDWT"); WriteArray(baSBDWT); sbTemp.Clear(); sbTemp.Append("Sent SBDWT Command"); EngrLogger.writeToColumns(sbTemp); } private void WriteArray(byte[] ba) { IOPort.Write(ba, 0, ba.Length); } private static readonly byte[] baSBDRT = Encoding.UTF8.GetBytes("AT+SBDRT\r"); public void sendSBDRT() { //Debug.Print(DateTime.Now + " Sending SBDRT"); WriteArray(baSBDRT); sbTemp.Clear(); sbTemp.Append("Sent SBDRT Command"); EngrLogger.writeToColumns(sbTemp); } private static readonly byte[] baSBDD2 = Encoding.UTF8.GetBytes("AT+SBDD2\r"); public int sendSBDD2() { //Debug.Print(DateTime.Now + " Sending SBDD2"); WriteArray(baSBDD2); return (1); } private static readonly byte[] baSBDI = Encoding.UTF8.GetBytes("AT+SBDI\r"); public int sendSBDI() { //Debug.Print(DateTime.Now + " Sending SBDI"); WriteArray(baSBDI); return (1); } //private static readonly StringBuilder sbSBDIX = new StringBuilder("AT+SBDIX\r"); private static readonly byte[] baSBDIX = Encoding.UTF8.GetBytes("AT+SBDIX\r"); public void sendSBDIX() { //Debug.Print(DateTime.Now + " Sending SBDIX"); WriteArray(baSBDIX); sbTemp.Clear(); sbTemp.Append("Sent SBDIX Command"); EngrLogger.writeToColumns(sbTemp); } // private static readonly StringBuilder sbCREG = new StringBuilder("AT+CREG?\r"); private static readonly byte[] baCREG = Encoding.UTF8.GetBytes("AT+CREG?\r"); public void sendCREG() { //Debug.Print(DateTime.Now + " Sending CREG?"); WriteArray(baCREG); } // private static readonly StringBuilder sbPAPUBX00 = new StringBuilder("AT+PA=A\r"); private static readonly byte[] baPAPUBX00 = Encoding.UTF8.GetBytes("AT+PA=A\r"); public void sendPAPUBX00() { //Debug.Print(DateTime.Now + " Sending PA=A"); WriteArray(baPAPUBX00); } private static readonly byte[] baCMEEVerbose = Encoding.UTF8.GetBytes("AT+CMEE=2\r"); private static readonly byte[] baCMEE = Encoding.UTF8.GetBytes("AT+CMEE\r"); public void sendCMEE() { WriteArray(baCMEEVerbose); Thread.Sleep(1000); WriteArray(baCMEE); } private static readonly byte[] baCICCID = Encoding.UTF8.GetBytes("AT+CICCID\r"); public void sendCICCID() { WriteArray(baCICCID); } private static readonly byte[] baCIER11 = Encoding.UTF8.GetBytes("AT+CIER=1,1\r"); public void sendCIER11() { WriteArray(baCIER11); } // private static readonly StringBuilder sbPAPUBX04 = new StringBuilder("AT+PA=C\r"); private static readonly byte[] baPAPUBX04 = Encoding.UTF8.GetBytes("AT+PA=C\r"); public void sendPAPUBX04() { //Debug.Print(DateTime.Now + " Sending PA=C"); WriteArray(baPAPUBX04); } private static readonly byte[] baATH0 = Encoding.UTF8.GetBytes("ATH0\r"); public void sendATH0() { WriteArray(baATH0); } private static readonly byte[] baCHUP = Encoding.UTF8.GetBytes("AT+CHUP\r"); public void sendCHUP() { WriteArray(baCHUP); } public void parseSQ(byte[] inBytes) { int colonIndex = -1; //if ((inBytes[0] == 43) && (inBytes[1] == 67) && (inBytes[2] == 83) && (inBytes[3] == 81)) // SignalQuality = (int)inBytes[5] - 48; colonIndex = Array.IndexOf(inBytes, (byte)':'); if (colonIndex >= 0) SignalQuality = (int)inBytes[colonIndex + 1] - 48; else SignalQuality = -1; } private static byte LF = 10; private static byte[] bytesRead = new byte[2048]; public static byte[] messageBytes = new byte[2048]; private static int bytesToRead; private static int messageIndex = 0; //private static StructQueue.qStruct qS = new StructQueue.qStruct(); //Singnal quality property moved from Program class to IModem class //in CPF_43 this var was set to -1 on state and substate entry, and exit, but was only every recorded //in EngrLog - never used to evaluate or determine action. private static int signalQuality = -1; public static int SignalQuality { get { return signalQuality; } set { signalQuality = value; } } private static readonly byte[] baATD = Encoding.UTF8.GetBytes("ATD"); private static readonly byte[] baATDRUDICS = Encoding.UTF8.GetBytes("atdt00881600005391\r"); public int dialNumber(byte[] baNumber) { int retval = 0; //input check if (baNumber.Length <= 0) return -1; WriteArray(baATDRUDICS); //WriteArray(baNumber); //check if baNumber has /r if (baNumber[baNumber.Length - 1] != (byte)'\r') IOPort.WriteByte((byte)'\r'); return retval; } public int dialDefaultRudics() { WriteArray(baATDRUDICS); return 0; } public void ReleaseDataHandler() { //Debug.Print("Releasing Handler"); IOPort.ReleaseDefaultDataHandler(); } public void AttachDataHandler() { // return the serial port handler //Debug.Print("Attaching Handler"); IOPort.AttachDefaultDataHandler(); } //private void iModemDataReceived(object sender, SerialDataReceivedEventArgs e) //{ // bytesToRead = IOPort.BytesToRead; // try // { // IOPort.Read(bytesRead, 0, bytesToRead); // } // catch // { // //Debug.Print("Iridium Modem Read Exception"); //TODO P3 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 = SV.CurrentState; // sbTemp.Clear(); // sbTemp.Append(UTF8Encoding.UTF8.GetChars(messageBytes, 0, messageIndex - 1)); // //Debug.Print(DateTime.Now + " iModem Message = " + sbTemp.ToString()); // Array.Clear(qS.byteArray, 0, qS.byteArray.Length); // Array.Copy(messageBytes, qS.byteArray, messageIndex + 1); // qS.qRecordType = StructQueue.QRecordType.IModem; // Program.sQueue.Enqueue(qS); // messageIndex = 0; // Array.Clear(messageBytes, 0, messageBytes.Length); // returnCode = 0; // } // else // { // messageIndex = messageIndex + 1; // } // } //} private static byte[] fakeMTSBDMessage = UTF8Encoding.UTF8.GetBytes("$PARKTIME,5;$PARKPRESSURE,30;\r\n"); public static void fakeMTSBD() { //qS.timeStamp = DateTime.Now; //qS.state = SV.CurrentState; //sbTemp.Clear(); //sbTemp.Append(UTF8Encoding.UTF8.GetChars(fakeMTSBDMessage)); ////Debug.Print(DateTime.Now + " iModem Message = " + sbTemp.ToString()); //Array.Clear(qS.byteArray, 0, qS.byteArray.Length); //Array.Copy(fakeMTSBDMessage, qS.byteArray, fakeMTSBDMessage.Length); //qS.qRecordType = StructQueue.QRecordType.IModem; //Program.sQueue.Enqueue(qS); } public enum CallSpeed { AUTO = 0, BPS300 = 1, BPS1200 = 2, BPS2400 = 3, BPS4800 = 6, BPS9600 = 7, BPS300V110 = 65, BPS1200V110 = 66, BPS2400V110 = 68, BPS4800V110 = 70, BPS9600V110 = 71 } public void SelectBearerServiceType(CallSpeed speed) { int iSpeed = (int)speed; WriteArray(Encoding.UTF8.GetBytes("AT+CBST=" + iSpeed.ToString() + ",0,1\r")); } public enum commands : int { none = 0, d0, k0, sbdd2, creg, csq, sendSBDWT, loadSBDWTBuffer, sbdi, sbdix, papubx00, papubx04, nocarrier, connected, escapeSeq, ath0, chup } public static bool waitingForResponse = false; public static bool gotResponse = false; private static readonly StringBuilder d0Response = new StringBuilder("AT&D0"); //TODO P2 maybe these should all be UTF8Encoding.GetBytes on string literals private static readonly StringBuilder k0Response = new StringBuilder("AT&K0"); private static readonly StringBuilder sbdd2Response = new StringBuilder("AT+SBDD2"); private static readonly StringBuilder cregResponse = new StringBuilder("+CREG:000,001"); private static readonly StringBuilder csqResponse = new StringBuilder("+CSQ:"); private static readonly StringBuilder sendSBDWTResponse = new StringBuilder("READY"); private static readonly StringBuilder loadSBDWTResponse = new StringBuilder("OK"); private static readonly StringBuilder sbdiResponse = new StringBuilder("+SBDI:"); private static readonly StringBuilder sbdixResponse0 = new StringBuilder("+SBDIX: 0,"); private static readonly StringBuilder sbdixResponse1 = new StringBuilder("+SBDIX: 1,"); private static readonly StringBuilder sbdixResponse2 = new StringBuilder("+SBDIX: 2,"); private static readonly StringBuilder sbdixResponse3 = new StringBuilder("+SBDIX: 3,"); private static readonly StringBuilder sbdixResponse4 = new StringBuilder("+SBDIX: 4,"); private static readonly StringBuilder[] sbdixResponses = new StringBuilder[] { sbdixResponse0, sbdixResponse1, sbdixResponse2, sbdixResponse3, sbdixResponse4, }; private static readonly StringBuilder papubx00Response = new StringBuilder("$PUBX,00"); private static readonly StringBuilder papubx04Response = new StringBuilder("$PUBX,04"); private static readonly StringBuilder noCarrierResponse = new StringBuilder("NO CARRIER"); private static readonly StringBuilder connectedResponse = new StringBuilder("CONNECT"); private static readonly StringBuilder okResponse = new StringBuilder("OK"); public static int sbdixMTQueued = -1; public int sbdixMTStatus = -1; //TODO P2 should this be static and accessed with a property public static int sbdixMOStatus = -1; private static readonly StringBuilder expectedResponseSB = new StringBuilder(64); private static byte[] expectedResponse = new byte[64]; private static int expectedResponseLength = 0; private static int numRetries = 0; private static readonly int maxNumRetries = 3; private static DateTime wfrStartTime = new DateTime(); private static readonly TimeSpan wfrTimeout = new TimeSpan(0, 0, 40); private static readonly string wfrFail = "IModem waitingForResponse expended all retries"; private static commands currentCommand = commands.none; //TODO P2 find and use OO oriented version of this method public int waitForResponse(commands commandNum) { if (waitingForResponse) //Do this after the first call to this method { if (gotResponse) //success { waitingForResponse = false; numRetries = 0; currentCommand = commands.none; //Debug.Print("Got IModem Response"); return (1); } else if ((DateTime.Now - wfrStartTime) > wfrTimeout) //if timeout has expired, try again up to the max number of retries { if (numRetries > maxNumRetries) { waitingForResponse = false; numRetries = 0; gotResponse = false; currentCommand = commands.none; EngrLogger.writeToColumns(wfrFail); return (-1); } else { waitingForResponse = false; sbTemp.Clear(); sbTemp.Append("IModem waitingForResponse try number "); sbTemp.Append(numRetries); return (-2); } } else return (0); } else //Do this the first time the method is called and after a timeout { currentCommand = commandNum; Array.Clear(expectedResponse, 0, expectedResponse.Length); switch (commandNum) { case commands.d0: Array.Copy(UTF8Encoding.UTF8.GetBytes(d0Response.ToString()), expectedResponse, d0Response.Length); expectedResponseSB.Clear(); expectedResponseSB.Append(d0Response); expectedResponseLength = d0Response.Length; //Debug.Print(DateTime.Now.TimeOfDay.ToString() + " Sending ds command"); EngrLogger.writeToColumns("Sending D0 cmd"); sendD0(); break; case commands.k0: Array.Copy(UTF8Encoding.UTF8.GetBytes(k0Response.ToString()), expectedResponse, k0Response.Length); expectedResponseSB.Clear(); expectedResponseSB.Append(k0Response); expectedResponseLength = k0Response.Length; //Debug.Print(DateTime.Now.TimeOfDay.ToString() + " Sending ds command"); EngrLogger.writeToColumns("Sending K0 cmd"); sendK0(); break; case commands.sbdd2: Array.Copy(UTF8Encoding.UTF8.GetBytes(sbdd2Response.ToString()), expectedResponse, sbdd2Response.Length); expectedResponseSB.Clear(); expectedResponseSB.Append(sbdd2Response); expectedResponseLength = sbdd2Response.Length; //Debug.Print(DateTime.Now.TimeOfDay.ToString() + " Sending SBE41 CR/LF"); EngrLogger.writeToColumns("Sending SBDD2 cmd"); sendSBDD2(); break; case commands.creg: Array.Copy(UTF8Encoding.UTF8.GetBytes(cregResponse.ToString()), expectedResponse, cregResponse.Length); expectedResponseSB.Clear(); expectedResponseSB.Append(cregResponse); expectedResponseLength = cregResponse.Length; //Debug.Print(DateTime.Now.TimeOfDay.ToString() + " Sending SBE41 creg"); EngrLogger.writeToColumns("Sending CREG cmd"); sendCREG(); break; case commands.csq: Array.Copy(UTF8Encoding.UTF8.GetBytes(csqResponse.ToString()), expectedResponse, csqResponse.Length); expectedResponseSB.Clear(); expectedResponseSB.Append(csqResponse); expectedResponseLength = csqResponse.Length; //Debug.Print(DateTime.Now.TimeOfDay.ToString() + " Sending SBE41 csq"); EngrLogger.writeToColumns("Sending CSQ cmd"); sendCSQ(); break; case commands.sendSBDWT: Array.Copy(UTF8Encoding.UTF8.GetBytes(sendSBDWTResponse.ToString()), expectedResponse, sendSBDWTResponse.Length); expectedResponseSB.Clear(); expectedResponseSB.Append(sendSBDWTResponse); expectedResponseLength = sendSBDWTResponse.Length; //Debug.Print(DateTime.Now.TimeOfDay.ToString() + " Sending SBE41 sbdwt command"); EngrLogger.writeToColumns("Sending SBDWT cmd"); sendSBDWTCommand(); break; case commands.loadSBDWTBuffer: Array.Copy(UTF8Encoding.UTF8.GetBytes(loadSBDWTResponse.ToString()), expectedResponse, loadSBDWTResponse.Length); expectedResponseSB.Clear(); expectedResponseSB.Append(loadSBDWTResponse); expectedResponseLength = loadSBDWTResponse.Length; //Debug.Print(DateTime.Now.TimeOfDay.ToString() + " Sending SBE41 sbdwt command"); EngrLogger.writeToColumns("Sending loadSBDWT cmd"); loadSBDWTBuffer(); break; case commands.sbdi: Array.Copy(UTF8Encoding.UTF8.GetBytes(sbdiResponse.ToString()), expectedResponse, sbdiResponse.Length); expectedResponseSB.Clear(); expectedResponseSB.Append(sbdiResponse); expectedResponseLength = sbdiResponse.Length; //Debug.Print(DateTime.Now.TimeOfDay.ToString() + " Sending SBE41 csq"); EngrLogger.writeToColumns("Sending SBDI cmd"); sendSBDI(); break; case commands.sbdix: //Debug.Print(DateTime.Now.TimeOfDay.ToString() + " Sending SBE41 csq"); sbdixMTQueued = -1; sbdixMOStatus = -1; sbdixMTStatus = -1; EngrLogger.writeToColumns("Sending SBDIX cmd"); //sendAT(); //added explicit sendAT action to surface ops sendSBDIX(); break; case commands.papubx00: Array.Copy(UTF8Encoding.UTF8.GetBytes(papubx00Response.ToString()), expectedResponse, papubx00Response.Length); expectedResponseSB.Clear(); expectedResponseSB.Append(papubx00Response); expectedResponseLength = papubx00Response.Length; //Debug.Print(DateTime.Now.TimeOfDay.ToString() + " Sending SBE41 csq"); EngrLogger.writeToColumns("Sending PAPUBX00 cmd"); sendPAPUBX00(); break; case commands.papubx04: Array.Copy(UTF8Encoding.UTF8.GetBytes(papubx04Response.ToString()), expectedResponse, papubx04Response.Length); expectedResponseSB.Clear(); expectedResponseSB.Append(papubx04Response); expectedResponseLength = papubx04Response.Length; //Debug.Print(DateTime.Now.TimeOfDay.ToString() + " Sending SBE41 csq"); EngrLogger.writeToColumns("Sending PAPUBX04 cmd"); sendPAPUBX04(); break; case commands.nocarrier: Array.Copy(Encoding.UTF8.GetBytes(noCarrierResponse.ToString()), expectedResponse, noCarrierResponse.Length); expectedResponseSB.Clear(); expectedResponseSB.Append(noCarrierResponse); expectedResponseLength = noCarrierResponse.Length; break; case commands.ath0: Array.Copy(Encoding.UTF8.GetBytes(okResponse.ToString()), expectedResponse, okResponse.Length); expectedResponseSB.Clear(); expectedResponseSB.Append(okResponse); expectedResponseLength = okResponse.Length; EngrLogger.writeToColumns("Sending ATH0 cmd"); sendATH0(); break; case commands.chup: Array.Copy(Encoding.UTF8.GetBytes(okResponse.ToString()), expectedResponse, okResponse.Length); expectedResponseSB.Clear(); expectedResponseSB.Append(okResponse); expectedResponseLength = okResponse.Length; EngrLogger.writeToColumns("Sending CHUP cmd"); sendCHUP(); break; case commands.escapeSeq: Array.Copy(Encoding.UTF8.GetBytes(okResponse.ToString()), expectedResponse, okResponse.Length); expectedResponseSB.Clear(); expectedResponseSB.Append(okResponse); expectedResponseLength = okResponse.Length; EngrLogger.writeToColumns("Sending Escape sequence"); sendEscapeSequence(); break; } wfrStartTime = DateTime.Now; numRetries++; gotResponse = false; waitingForResponse = true; return (0); } } private static StringBuilder sbResponse = new StringBuilder(512); private static StringBuilder sbExpectedResponse = new StringBuilder(512); private static byte[] returnField = new byte[16]; private static byte[] returnField2 = new byte[16]; private const byte commaByte = (byte)','; private const byte colonByte = (byte)':'; public void checkResponse(byte[] response) { int msgLength = response.Length; //check for expectedResponse anywhere in the IModem response message if (NAL_A3LAR.waitingForResponse) { if (msgLength > expectedResponseLength) { //start at the beginning of the qStructure byte array and test for the right character sequence //then start at the 2nd character in the qStrucutre byte array and so on if (currentCommand != commands.sbdix) { sbExpectedResponse.Clear(); sbExpectedResponse.Append("Looking for IModem-->"); sbExpectedResponse.Append(UTF8Encoding.UTF8.GetChars(expectedResponse)); sbExpectedResponse.AppendLine("<--"); //Debug.Print(sbExpectedResponse.ToString()); sbResponse.Clear(); sbResponse.Append("Got-->"); sbResponse.Append(UTF8Encoding.UTF8.GetChars(response)); sbResponse.AppendLine("<--"); //Debug.Print(sbResponse.ToString()); if (GHI.Utilities.Arrays.Contains(response, 0, expectedResponse, 0, expectedResponseLength) >= 0) { gotResponse = true; sbTemp.Clear(); sbTemp.Append("iModem correct response: "); sbTemp.Append(sbExpectedResponse); sbTemp.Append(sbResponse); EngrLogger.writeToColumns(sbTemp); if (currentCommand == commands.csq) parseSQ(response); } else { sbTemp.Clear(); sbTemp.Append("iModem invalid response: "); sbTemp.Append(sbExpectedResponse); sbTemp.Append(sbResponse); EngrLogger.writeToColumns(sbTemp); } } else { //Cycle through the acceptable sbdix responses for (int i = 0; i < sbdixResponses.Length; i++) { Array.Copy(UTF8Encoding.UTF8.GetBytes(sbdixResponses[i].ToString()), expectedResponse, sbdixResponses[i].Length); expectedResponseSB.Clear(); expectedResponseSB.Append(sbdixResponses[i]); expectedResponseLength = sbdixResponses[i].Length; sbExpectedResponse.Clear(); sbExpectedResponse.Append("Looking for IModem-->"); sbExpectedResponse.Append(UTF8Encoding.UTF8.GetChars(expectedResponse)); sbExpectedResponse.AppendLine("<--"); //Debug.Print(sbExpectedResponse.ToString()); sbResponse.Clear(); sbResponse.Append("Got-->"); sbResponse.Append(UTF8Encoding.UTF8.GetChars(response)); sbResponse.AppendLine("<--"); //Debug.Print(sbResponse.ToString()); if (GHI.Utilities.Arrays.Contains(response, 0, expectedResponse, 0, expectedResponseLength) >= 0) { gotResponse = true; sbTemp.Clear(); Array.Clear(returnField, 0, returnField.Length); Array.Clear(returnField2, 0, returnField2.Length); Utils.getField(response, commaByte, 0, ref returnField); Utils.getField(returnField, colonByte, 1, ref returnField2); sbTemp.Append(UTF8Encoding.UTF8.GetChars(returnField2)); sbdixMOStatus = int.Parse(sbTemp.ToString()); sbTemp.Clear(); Array.Clear(returnField, 0, returnField.Length); Utils.getField(response, commaByte, 2, ref returnField); sbTemp.Append(UTF8Encoding.UTF8.GetChars(returnField)); sbdixMTStatus = int.Parse(sbTemp.ToString()); sbTemp.Clear(); Array.Clear(returnField, 0, returnField.Length); Utils.getField(response, commaByte, 5, ref returnField); sbTemp.Append(UTF8Encoding.UTF8.GetChars(returnField)); sbdixMTQueued = int.Parse(sbTemp.ToString()); sbTemp.Clear(); sbTemp.Append("SBDIX Response: "); sbTemp.Append(UTF8Encoding.UTF8.GetChars(response)); sbTemp.Append(" sbdixMOStatus = "); sbTemp.Append(sbdixMOStatus.ToString()); sbTemp.Append(" sbdixMTStatus = "); sbTemp.Append(sbdixMTStatus.ToString()); sbTemp.Append(" sbdixMTQueued = "); sbTemp.Append(sbdixMTQueued.ToString()); EngrLogger.writeToColumns(sbTemp); break; } else { sbTemp.Clear(); sbTemp.Append("iModem invalid response: "); sbTemp.Append(sbExpectedResponse); sbTemp.Append(sbResponse); EngrLogger.writeToColumns(sbTemp); } } } } } } } }