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); }
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); }
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); }
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); } } }
public Nmea() { NmeaMsg.InitDefaults(); }