using System; using Microsoft.SPOT; using System.Threading; using System.IO.Ports; using System.Text; namespace CPF { public static class EVK7GPS { public static SerialPort evk7Port = new SerialPort("COM5", 19200, Parity.None, 8, StopBits.One); private static object evk7Lock = new object(); private static StructQueue.qStruct qS = new StructQueue.qStruct(); public static void init() { qS.byteArray = new byte[StructQueue.qRecordWidth]; evk7Port.ReadTimeout = 5000; evk7Port.Open(); evk7Port.DiscardInBuffer(); evk7Port.DiscardOutBuffer(); evk7Port.DataReceived += new SerialDataReceivedEventHandler(evk7DataReceived); } private static byte[] txBytes = new byte[64]; private const string evk7PUBXCmd = "$PUBX,00*33\r\n"; public static void getPUBX() { Array.Clear(txBytes, 0, txBytes.Length); Array.Copy(UTF8Encoding.UTF8.GetBytes(evk7PUBXCmd), txBytes, evk7PUBXCmd.Length); evk7Port.Write(txBytes, 0, evk7PUBXCmd.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 evk7DataReceived(object sender, SerialDataReceivedEventArgs e) { bytesToRead = evk7Port.BytesToRead; try { evk7Port.Read(bytesRead, 0, bytesToRead); } catch { Debug.Print("EVK7 GPS 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("EVK7 Message = " + sbTemp.ToString()); Array.Clear(qS.byteArray, 0, qS.byteArray.Length); Array.Copy(messageBytes, qS.byteArray, messageIndex + 1); qS.qRecordType = StructQueue.QRecordType.EVK7; lock (evk7Lock) { Program.sQueue.Enqueue(qS); } messageIndex = 0; Array.Clear(messageBytes, 0, messageBytes.Length); } else { messageIndex = messageIndex + 1; } } } } }