Пример #1
0
        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;
            }
        }
Пример #2
0
        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");
                }
            }
        }
Пример #3
0
        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();
                }
            }
        }
Пример #4
0
        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();
        }
Пример #5
0
        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);
        }
Пример #6
0
        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;
        }
Пример #7
0
        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;
        }
Пример #8
0
        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;
            }
        }
Пример #9
0
 void WriteToModem(string s)
 {
     modemPort.Write(s);
     NihLog.Write(NihLog.Level.Debug, "TX " + s);
 }