public void TestGpgsv() { string input = "$GPGSV,3,3,11,22,42,067,42,75,14,311,43,50,05,244,00,,,,*49"; var msg = NmeaMessage.Parse(input); Assert.IsInstanceOfType(msg, typeof(Gpgsv)); Gpgsv gsv = (Gpgsv)msg; Assert.AreEqual(3, gsv.TotalMessages); Assert.AreEqual(3, gsv.MessageNumber); Assert.AreEqual(11, gsv.SVsInView); Assert.IsNotNull(gsv.SVs); Assert.AreEqual(3, gsv.SVs.Count); var sv = gsv.SVs[0]; Assert.AreEqual(22, sv.PrnNumber); Assert.AreEqual(42, sv.Elevation); Assert.AreEqual(67, sv.Azimuth); Assert.AreEqual(42, sv.SignalToNoiseRatio); Assert.AreEqual(SatelliteSystem.Gps, sv.System); sv = gsv.SVs[1]; Assert.AreEqual(75, sv.PrnNumber); Assert.AreEqual(14, sv.Elevation); Assert.AreEqual(311, sv.Azimuth); Assert.AreEqual(43, sv.SignalToNoiseRatio); Assert.AreEqual(SatelliteSystem.Glonass, sv.System); sv = gsv.SVs[2]; Assert.AreEqual(50, sv.PrnNumber); Assert.AreEqual(5, sv.Elevation); Assert.AreEqual(244, sv.Azimuth); Assert.AreEqual(00, sv.SignalToNoiseRatio); Assert.AreEqual(SatelliteSystem.Waas, sv.System); }
/// <summary> /// Event handler for the SerialGPS, parses the NMEA message and updates CurrentGeopoint. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void _serialGPSDevice_MessageReceived(object sender, NmeaMessageReceivedEventArgs e) { if (!_serialGPSDeviceFound) { _serialGPSDeviceFound = true; } double Latitude = 0.0, Longitude = 0.0; NMEAMessage = e.Message.ToString(); //Parse all NMEA messages supported by BU353-s4. //Only GGA, RMC, and GLL support location switch (e.Message.MessageType) { case "GPGGA": Gpgga gga = (Gpgga)e.Message; Latitude = gga.Latitude; Longitude = gga.Longitude; break; case "GPRMC": Gprmc rmc = (Gprmc)e.Message; Latitude = rmc.Latitude; Longitude = rmc.Longitude; break; case "GPGLL": Gpgll gll = (Gpgll)e.Message; Latitude = gll.Latitude; Longitude = gll.Longitude; break; case "GPGSA": Gpgsa gsa = (Gpgsa)e.Message; break; case "GPGSV": Gpgsv gsv = (Gpgsv)e.Message; break; } //make sure the delta-p is above a threshold if (Latitude != 0.0 && Longitude != 0.0) { double distance = Haversine(Latitude, Longitude, CurrentGeopoint.Position.Latitude, CurrentGeopoint.Position.Longitude); if (distance > 0) //2.5m is minimum accuracy of BU-353 S4 and WAAS/SBAS corrections { CurrentGeopoint = CreateGeopoint(Latitude, Longitude); } } }
private void NmeaStreamDevice_MessageReceived(object sender, NmeaMessageReceivedEventArgs e) { if (!messageStats.ContainsKey(e.Message.MessageType)) { messageStats.Add(e.Message.MessageType, 0); } messageStats[e.Message.MessageType]++; switch (e.Message.MessageType) { case "GPGSV": Gpgsv gpgsv = (Gpgsv)e.Message; numSattelites = gpgsv.SVsInView; break; case "GPGLL": //enthält GPS Daten Gpgll gpgll = (Gpgll)e.Message; if (gpgll.DataActive) { lon = gpgll.Longitude; lat = gpgll.Latitude; validGpsSignal = true; gpsLlTimestamp = DateTime.Now; } break; case "GPGSA": Gpgsa gpgsa = (Gpgsa)e.Message; fixMode = gpgsa.FixMode; break; case "GPRMC": //enthält GPS Daten Gprmc gprmc = (Gprmc)e.Message; break; case "GPVTG": break; case "GPZDA": break; case "GPGGA": //enthält GPS Daten Gpgga gpgga = (Gpgga)e.Message; altitude = gpgga.Altitude; break; default: lock (lockVictim) { tourStreamWriter.WriteLine(String.Format("UNIMP_GPS;", e.Message.ToString())); } break; } }
public void TestGpgsv_Empty() { string input = "$GPGSV,1,1,0,,,,,,,,,,,,,,,,*49"; var msg = NmeaMessage.Parse(input); Assert.IsInstanceOfType(msg, typeof(Gpgsv)); Gpgsv gsv = (Gpgsv)msg; Assert.AreEqual(1, gsv.TotalMessages); Assert.AreEqual(1, gsv.MessageNumber); Assert.AreEqual(0, gsv.SVsInView); Assert.IsNotNull(gsv.SVs); Assert.AreEqual(0, gsv.SVs.Count); }