using System; using Microsoft.SPOT; namespace CPF { public static class Iridium { private static A3LA _modem; private static byte[] _message; private static byte[] _response; private static int _responseLength; private static int _originatedStatus; private static int _originatedSeqnum; private static int _terminatedStatus; private static int _terminatedSeqnum; private static int _lengthOfMobileTerminatedMessage; private static int _numberOfQueuedMessagesAwaitingReception; private static StructQueue.qStruct _qe; private static Object _iridiumLock; private static ByteString _bs; public static void PowerOn(string comPort) { _response = new byte[2048]; _message = new byte[2048]; _bs = new ByteString(); _modem = new A3LA("COM2", 19200); _iridiumLock = new Object(); _qe.byteArray = new Byte[StructQueue.qRecordWidth]; _modem.PowerOn(); _modem.ClearMobileOriginatedSequenceNumber(); _modem.ClearBuffers(A3LA.BuffersToClear.BothOriginatedAndTerminated); } public static void ReportPosition() { Array.Clear(_qe.byteArray, 0, _qe.byteArray.Length); Array.Clear(_response, 0, _response.Length); _modem.Position(_response, out _responseLength); _bs.Append(_response, _responseLength); _bs.Append(IridiumStrings.BVMSG, IridiumStrings.BVMSG.Length); _qe.errorCode = (int) _modem.SendTextMessage(_qe.byteArray, _responseLength); if (_qe.errorCode == (int)A3LA.Response.Match) { _modem.Status(out _originatedStatus, out _originatedSeqnum, out _terminatedStatus, out _terminatedSeqnum, out _lengthOfMobileTerminatedMessage, out _numberOfQueuedMessagesAwaitingReception); _qe.errorCode = _originatedStatus; _modem.ClearBuffers(A3LA.BuffersToClear.MobileOriginated); if (_qe.errorCode == A3LA.MO_TransferredSuccessfully) { _qe.errorCode = _numberOfQueuedMessagesAwaitingReception + 1; QueueMessage(StructQueue.QRecordType.PositionReport); if ((_terminatedStatus == 1) && (_lengthOfMobileTerminatedMessage > 0)) { Array.Clear(_qe.byteArray, 0, _qe.byteArray.Length); _modem.ReceiveTextMessage(_qe.byteArray, out _responseLength); QueueMessage(StructQueue.QRecordType.MT_MessageArrived); do { _modem.Status(out _originatedStatus, out _originatedSeqnum, out _terminatedStatus, out _terminatedSeqnum, out _lengthOfMobileTerminatedMessage, out _numberOfQueuedMessagesAwaitingReception); if ((_terminatedStatus == 1) && (_lengthOfMobileTerminatedMessage > 0)) { Array.Clear(_qe.byteArray, 0, _qe.byteArray.Length); _modem.ReceiveTextMessage(_qe.byteArray, out _responseLength); QueueMessage(StructQueue.QRecordType.MT_MessageArrived); } } while (_numberOfQueuedMessagesAwaitingReception > 0); } } } } public static void GetTimeAndDate() { _modem.SatelliteTimeAndDate(_response, out _responseLength); Debug.Print("Response from Time Request:\t\t" + Utils.StringFromBytes(_response, _responseLength)); } private static void QueueMessage(StructQueue.QRecordType eventType) { Debug.Print("Queued Message:\t\t" + Utils.StringFromBytes(_qe.byteArray, _lengthOfMobileTerminatedMessage)); _qe.timeStamp = DateTime.Now; _qe.state = Program.CPFState; _qe.qRecordType = eventType; _qe.errorCode = _terminatedStatus + A3LA.MT_Offset; lock (_iridiumLock) { Program.sQueue.Enqueue(_qe); } } private static double BatteryVoltage() { return 1234.567; } public static void PowerOff() { } } }