Exemplo n.º 1
0
        public static void Add(NmeaMsg msg)
        {
            if (msg == null)
            {
                return;
            }
            if (handlers == null)
            {
                handlers = new List <NmeaMsg>();
            }

            bool suc = handlers.Any(n => n.id == msg.id);

            if (suc)
            {
                return;      //去除重复语句
            }
            handlers.Add(msg);
        }
Exemplo n.º 2
0
        private void ParseLine(string line)
        {
            if (line == null || line.Length <= 0)
            {
                return;
            }

            NmeaMsg outMsg = null;

            try
            {
                int csIndex = line.LastIndexOf('*');
                if (csIndex <= 0)
                {
                    return;
                }
                csIndex++;
                if (csIndex >= line.Length)
                {
                    return;
                }
                string   cs       = line.Substring(csIndex, line.Length - csIndex);
                string   tempLine = line.Substring(0, csIndex - 1);
                string[] parts    = tempLine.ToUpper().Split(',');
                if (parts.Length <= 0)
                {
                    return;
                }
                if (!ValidateChecksum(tempLine, cs))
                {
                    return;
                }
                outMsg = NmeaMsg.Parse(parts);
            }
            catch (Exception ex)
            {
                outMsg = new Error(line, ex);
            }
            FireNewMessage(outMsg);
        }
Exemplo n.º 3
0
        public static NmeaMsg Parse(string[] nmea)
        {
            if ((nmea == null) || (nmea.Length <= 0))
            {
                return(null);
            }
            if (handlers == null)
            {
                return(null);
            }

            foreach (NmeaMsg m in handlers)
            {
                if (m.CanHandle(nmea))
                {
                    NmeaMsg result = m.CreateEmpty();
                    result.FromNMEA(nmea);
                    m.LastNmeaTime = DateTimeHelper.Now;
                    return(result);
                }
            }

            return(null);
        }
Exemplo n.º 4
0
        private void FireNewMessage(NmeaMsg msg)
        {
            if (msg == null)
            {
                return;
            }

            if (msg.id == NmeaMsg.MsgType.GPGSV)
            {
                gpSateNum = msg.GetFieldByName("NoSV").GetInt(0);
            }
            else if (msg.id == NmeaMsg.MsgType.BDGSV)
            {
                bdSateNum = msg.GetFieldByName("NoSV").GetInt(0);
            }
            else if (msg.id == NmeaMsg.MsgType.GGA)
            {
                int useNum = msg.GetFieldByName("NoSv").GetInt(0);

                if (useNum != useSateNum || useNum == 0)
                {
                    if ((DateTimeHelper.Now - NmeaMsg.GetMsgHandle(NmeaMsg.MsgType.BDGSV).LastNmeaTime).TotalSeconds > 5)
                    {//大于5秒认为模式切换
                        bdSateNum = 0;
                    }
                    if ((DateTimeHelper.Now - NmeaMsg.GetMsgHandle(NmeaMsg.MsgType.GPGSV).LastNmeaTime).TotalSeconds > 5)
                    { //大于5秒认为模式切换
                        gpSateNum = 0;
                    }
                    useSateNum = useNum;
                }
                FireSateNumChanged(useNum);

                if (IsLocated)
                {
                    Altitude = msg.GetFieldByName("msl").GetDouble(0);
                }
            }
            else if (msg.id == NmeaMsg.MsgType.RMC)
            {
                char status = msg.GetFieldByName("status").GetChar('V');
                IsLocated = status == 'A';

                TimeSpan time = msg.GetFieldByName("time").GetTime(DateTime.UtcNow.TimeOfDay);
                DateTime date = msg.GetFieldByName("date").GetDate(DateTime.UtcNow.Date);
                GnssTime = date.Add(time).ToLocalTime();
                if (AutoSyncTime)
                {
                    if (Math.Abs((DateTime.Now - GnssTime).TotalSeconds) > 30)
                    {
                        //系统时间与GPS时间相差 30秒校准系统时间
                        DateTimeHelperEx.SetSystemTime(GnssTime);
                        DateTimeHelper.Now = GnssTime;
                    }
                }
            }
            else if (msg.id == NmeaMsg.MsgType.GPRS)
            {
                Mileage = msg.GetFieldByName("mileage").GetInt(0);
            }

            if (NewMessage != null)
            {
                try
                {
                    NewMessage(msg);
                }
                catch (Exception ex)
                {
                    System.Diagnostics.Debug.WriteLine(ex);
                }
            }
        }
Exemplo n.º 5
0
 public Nmea()
 {
     NmeaMsg.InitDefaults();
 }