private void OnModemResponse(bool ok) { if (CurrentModemState == ModemState.SendingSMS) { ProcessSmsResult(ok); } if (!ok) { NihLog.Write(NihLog.Level.Error, "Error during state " + CurrentModemState.ToString()); CurrentModemState = ModemState.Error; return; } switch (CurrentModemState) { case ModemState.NotInitialized: return; case ModemState.PowerUp: WriteToModem("ATE0;+CMGF=1;+CSCS=\"IRA\";+CNMI=1,2\r"); CurrentModemState = ModemState.Initializing; break; case ModemState.Initializing: case ModemState.SendingSMS: case ModemState.KeepAliveAwaitingResponse: CurrentModemState = ModemState.Idle; break; } }
private void OnDataReceived() { // Called in the main thread string nowWhat = modemPort.ReadExisting(); pendingData += nowWhat; string[] lines = pendingData.Split(new string[] { "\r\n" }, StringSplitOptions.None); if (lines.Length == 0) { pendingData = string.Empty; return; } else { pendingData = lines[lines.Length - 1]; } // This happens in main thread. for (int i = 0; i < lines.Length - 1; i++) { string line = lines[i]; if (line.Length >= 5 && line.Substring(0, 5) == "+CMT:") { // s+= read one more line if (i == lines.Length - 1) // no next line { pendingData = line + "\r\n" + pendingData; // unread the line continue; } string line2 = lines[++i]; NihLog.Write(NihLog.Level.Debug, "RX " + line); NihLog.Write(NihLog.Level.Debug, "RX " + line2); InboundSMS sms = new InboundSMS(); sms.ParseCMT(line, line2); if (OnNewSMS != null) { OnNewSMS(sms); } } else // Not a composite { NihLog.Write(NihLog.Level.Debug, "RX " + line); } if (line == "OK") { OnModemResponse(true); } else if (line == "ERROR") { OnModemResponse(false); NihLog.Write(NihLog.Level.Error, "Modem error"); } } }
void CheatU9Telit() { // U9 telit appears as USB CDrom on the bus, until disk eject is sent. // Then, it reappears as normal stuff. VolumeDeviceClass volumeDeviceClass = new VolumeDeviceClass(); foreach (Volume device in volumeDeviceClass.Devices) { if (device.FriendlyName == "PCL HSUPA Modem USB Device") { NihLog.Write(NihLog.Level.Info, "Trying to initialize: " + device.FriendlyName); device.EjectCDRomNoUI(); } } }
private void ProcessSmsResult(bool ok) { if (!ok) { OutboundSMS sms = _outSmses.Peek(); if (sms.Attempt < sms.MaxTries) { NihLog.Write(NihLog.Level.Info, "Retrying sms..."); return; } NihLog.Write(NihLog.Level.Error, "Failed to send SMS: " + sms.ToString()); } _outSmses.Dequeue(); }
private void CloseU9TelitNativeApp() { bool doneSomething; do { doneSomething = false; Process[] processes = Process.GetProcessesByName("wirelesscard"); foreach (Process p in processes) { p.CloseMainWindow(); doneSomething = true; NihLog.Write(NihLog.Level.Info, "Killed native U9 app"); System.Threading.Thread.Sleep(1000); // Will not wait if no native app is started } } while (doneSomething); }
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; }
private void SendSmsNow() { OutboundSMS sms = _outSmses.Peek(); sms.Attempt++; if (sms.Attempt > sms.MaxTries) { NihLog.Write(NihLog.Level.Error, "Failure to send after " + sms.MaxTries + " tries"); _outSmses.Dequeue(); return; } NihLog.Write(NihLog.Level.Info, "Sending SMS: " + sms.ToString()); WriteToModem("AT+CMGS=\"" + sms.Destination + "\"\r"); System.Threading.Thread.Sleep(500); WriteToModem(sms.Text); byte[] buffer = new byte[1]; buffer[0] = 26; // ^Z modemPort.Write(buffer, offset: 0, count: 1); CurrentModemState = ModemState.SendingSMS; }
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; } }
void WriteToModem(string s) { modemPort.Write(s); NihLog.Write(NihLog.Level.Debug, "TX " + s); }