예제 #1
0
        private void Parse(int sourceID, string message)
        {
            NMEAIncomingMessageReceived.Rise(this, new NMEAMessageEventArgs(sourceID, message));

            try
            {
                var pResult = NMEAParser.Parse(message);

                if (pResult is NMEAStandartSentence)
                {
                    NMEAStandartSentence sentence = (NMEAStandartSentence)pResult;
                    if (standardSenteceParsers.ContainsKey(sentence.SentenceID))
                    {
                        standardSenteceParsers[sentence.SentenceID](sourceID, sentence.TalkerID, sentence.parameters);
                    }
                    else
                    {
                        NMEAStandartUnsupportedSentenceParsed.Rise(this, new NMEAUnsupportedStandartEventArgs(sourceID, sentence));
                    }
                }
                else
                {
                    NMEAProprietaryUnsupportedSentenceParsed.Rise(this, new NMEAUnsupportedProprietaryEventArgs(sourceID, (pResult as NMEAProprietarySentence)));
                }
            }
            catch (Exception ex)
            {
                LogEventHandler.Rise(this, new LogEventArgs(LogLineType.ERROR, ex));
            }
        }
예제 #2
0
 public void Send(string message)
 {
     if ((port != null) && port.IsOpen)
     {
         port.SendData(message);
         LogEventHandler.Rise(this, new LogEventArgs(LogLineType.INFO, string.Format("{0} ({1}) << {2}", PortName, PortDescription, message)));
     }
 }
예제 #3
0
        public void Stop()
        {
            StopTimer();
            SafelyClosePort(false);

            detected = false;
            IsActive = false;

            OnClosed();
            LogEventHandler.Rise(this, new LogEventArgs(LogLineType.INFO, string.Format("{0} Stopped", PortDescription)));
        }
예제 #4
0
 public void Open()
 {
     foreach (var port in ports)
     {
         try
         {
             port.Value.Open();
             port.Value.DataReceived  += dataReceivedHandler;
             port.Value.ErrorReceived += errorReceivedHandler;
         }
         catch (Exception ex)
         {
             LogEventHandler.Rise(this, new LogEventArgs(LogLineType.ERROR, ex));
         }
     }
 }
예제 #5
0
        public void Start()
        {
            StopTimer();
            checkedPortNames.Clear();

            if ((port != null) && port.IsOpen)
            {
                SafelyClosePort(true);
            }

            IsActive = true;
            detected = false;

            LogEventHandler.Rise(this, new LogEventArgs(LogLineType.INFO, string.Format("{0} Starting detection...", PortDescription)));
            TryNextPort();
        }
예제 #6
0
        private void port_NewNMEAMessage(object sender, NewNMEAMessageEventArgs e)
        {
            if (IsLogIncoming)
            {
                LogEventHandler.Rise(this, new LogEventArgs(LogLineType.INFO, string.Format("{0} ({1}) >> {2}", PortName, PortDescription, e.Message)));
            }

            try
            {
                var _result = NMEAParser.Parse(e.Message);
                ProcessIncoming(_result);
            }
            catch (Exception ex)
            {
                LogEventHandler.Rise(this, new LogEventArgs(LogLineType.ERROR, string.Format("{0} ({1}) >> {2} Caused error ({3})", PortName, PortDescription, e.Message, ex.Message)));
            }
        }
예제 #7
0
        private void SafelyClosePort(bool isCallOnClosed)
        {
            if (port != null)
            {
                try
                {
                    port.NewNMEAMessage -= port_NewNMEAMessageHandler;
                    port.PortError      -= port_PortErrorHandler;

                    if (port.IsOpen)
                    {
                        port.Close();
                        LogEventHandler.Rise(this, new LogEventArgs(LogLineType.INFO, string.Format("{0} ({1}) Closed", port.PortName, PortDescription)));
                    }
                }
                catch { }
            }

            if (isCallOnClosed)
            {
                OnClosed();
            }
        }
예제 #8
0
 private void port_PortError(object sender, SerialErrorReceivedEventArgs e)
 {
     LogEventHandler.Rise(this, new LogEventArgs(LogLineType.ERROR, string.Format("{0} ({1}) >> {2}", PortName, PortDescription, e.EventType.ToString())));
 }
예제 #9
0
        private void TryNextPort()
        {
            StopTimer();
            SafelyClosePort(true);

            string pName = string.Empty;

            // Will try the previously detected port, if it has been
            if (!string.IsNullOrEmpty(detectedPortName) &&
                !checkedPortNames.Contains(detectedPortName))
            {
                pName = detectedPortName;
            }
            else
            {
                pName = GetNextPortName(checkedPortNames);
            }

            if (!string.IsNullOrEmpty(pName))
            {
                checkedPortNames.Add(pName);
                LogEventHandler.Rise(this,
                                     new LogEventArgs(LogLineType.INFO,
                                                      string.Format("Trying {0} as {1}...", pName, PortDescription)));

                try
                {
                    port = new NMEASerialPort(new SerialPortSettings(pName,
                                                                     Baudrate, Parity.None, DataBits.dataBits8, StopBits.One, Handshake.None));

                    port.IsRawModeOnly   = false;
                    port.PortError      += port_PortErrorHandler;
                    port.NewNMEAMessage += port_NewNMEAMessageHandler;

                    port.Open();

                    if (!supress_try_send)
                    {
                        port.SendRaw(new byte[] { 0x00, 0x00, 0x00 });
                    }

                    InitQuerySend();
                    StartTimer(1000);
                }
                catch (Exception ex)
                {
                    LogEventHandler.Rise(this, new LogEventArgs(LogLineType.ERROR, ex));
                    StartTimer(0); // To avoid recursion - timer expiration will cause a next TryNextPort() call
                }
            }
            else
            {
                if (IsTryAlways)
                {
                    checkedPortNames.Clear();
                    LogEventHandler.Rise(this, new LogEventArgs(LogLineType.ERROR, string.Format("{0} was not detected, retrying in a moment... ", PortDescription)));
                    StartTimer(1000);
                }
                else
                {
                    PortDetectionFailed.Rise(this, new EventArgs());
                }
            }
        }