void TryInitModem() { // Try pistoning the modem with higher frequency. This does no harm (such as redundant logging) PrepareU9Modem(); // Will do nothing if modem is okay if (!_initFailureTimeout.IsTimedOut()) { return; // Don't try too frequently } if (modemPort != null) { return; } const string modemPortName = "Basecom HS-USB NMEA 9000"; const int speed = 115200; string portName = Hardware.Misc.SerialPortFromFriendlyName(modemPortName); if (portName == null) { NihLog.Write(NihLog.Level.Error, "Modem not found (yet). "); _initFailureTimeout.Reset(); return; } NihLog.Write(NihLog.Level.Info, string.Format("Found modem port \"{0}\" at {1}", modemPortName, portName)); modemPort = new System.IO.Ports.SerialPort(portName, speed); modemPort.ReadTimeout = 3000; modemPort.NewLine = "\r\n"; modemPort.Open(); modemPort.DiscardInBuffer(); modemPort.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(delegate { _mainThreadOwnder.Invoke(dataReceivedDelegate); }); // called in different thread! _lastModemKeepAlive = new Timeouter(60, true); WriteToModem("AT+CFUN=1\r"); CurrentModemState = ModemState.PowerUp; }
public void HeartBeat() { if (CurrentModemState == ModemState.NotInitialized) { TryInitModem(); return; } if (IsTransitionalState(CurrentModemState) && ModemStateTimeouter.IsTimedOut()) { NihLog.Write(NihLog.Level.Error, "Modem error. Timed out during " + CurrentModemState); CurrentModemState = ModemState.Error; return; } if (CurrentModemState == ModemState.Idle && _lastModemKeepAlive.IsTimedOut()) { // Send keepalive WriteToModem("AT\r"); CurrentModemState = ModemState.KeepAliveAwaitingResponse; return; } if (CurrentModemState == ModemState.Error) { NihLog.Write(NihLog.Level.Debug, "Reenumerating modem..."); UninitModem(); return; } if (_outSmses.Count != 0 && CurrentModemState == ModemState.Idle) { SendSmsNow(); return; } }