From c4a65893fec1fa407c187203110ec2cc8edb9298 Mon Sep 17 00:00:00 2001 From: Theodore Zilist <14153237+tzilist@users.noreply.github.com> Date: Thu, 13 Nov 2025 10:52:26 -0800 Subject: [PATCH 1/3] make timestamp pad and use seconds correctly --- swiftnav/Cargo.toml | 1 + swiftnav/src/nmea/gga.rs | 23 ++++++++++++++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/swiftnav/Cargo.toml b/swiftnav/Cargo.toml index 7880145..55d9c7d 100644 --- a/swiftnav/Cargo.toml +++ b/swiftnav/Cargo.toml @@ -20,6 +20,7 @@ thiserror = "2.0.17" [dev-dependencies] float_eq = "1.0.1" proptest = "1.9.0" +nmea = "0.7" # This tells docs.rs to include the katex header for math formatting # To do this locally diff --git a/swiftnav/src/nmea/gga.rs b/swiftnav/src/nmea/gga.rs index cd710c8..61cef44 100644 --- a/swiftnav/src/nmea/gga.rs +++ b/swiftnav/src/nmea/gga.rs @@ -117,7 +117,7 @@ impl GGA { let second = f64::from(self.time.second()); let second_fracs = f64::from(self.time.nanosecond()) / 1_000_000_000.0; - let timestamp = format!("{hour}{minute}{:.2}", second + second_fracs); + let timestamp = format!("{hour:0>2}{minute:0>2}{:05.2}", second + second_fracs); let (lat_deg, lat_mins) = self.llh.latitude_degree_decimal_minutes(); let lat_hemisphere = self.llh.latitudinal_hemisphere(); @@ -165,6 +165,27 @@ impl GGA { mod test { use super::*; + #[test] + fn nmea_crate_can_parse_gga_sentence() { + let gga = GGA::builder() + .sat_in_use(12) + .time(DateTime::from_timestamp(1_761_351_489, 89_999_999).unwrap()) + .gps_quality(GPSQuality::SPS) + .hdop(0.9) + .llh(super::LLHDegrees::new(37.7749, -122.4194, 10.0)) + .build(); + + let parse_result = ::nmea::parse_str(dbg!(&gga.to_sentence().as_str())) + .expect("Failed to parse GGA sentence"); + + let ::nmea::ParseResult::GGA(parsed_gga) = parse_result else { + panic!("Parsed result is not a GGA sentence"); + }; + + assert_eq!(parsed_gga.latitude.unwrap(), 37.7749); + assert_eq!(parsed_gga.longitude.unwrap(), -122.4194); + } + #[test] fn gga_can_be_turned_into_an_nmea_sentence() { let gga = GGA::builder() From 72670e396aa4fef292101673ea9e172811d8edfb Mon Sep 17 00:00:00 2001 From: Theodore Zilist <14153237+tzilist@users.noreply.github.com> Date: Thu, 13 Nov 2025 10:57:21 -0800 Subject: [PATCH 2/3] fix other tests --- swiftnav/src/nmea/gga.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/swiftnav/src/nmea/gga.rs b/swiftnav/src/nmea/gga.rs index 61cef44..5251826 100644 --- a/swiftnav/src/nmea/gga.rs +++ b/swiftnav/src/nmea/gga.rs @@ -200,7 +200,7 @@ mod test { assert_eq!( sentence, - "$GPGGA,0189.00,3746.4940000,N,12225.1640000,W,1,12,0.9,0.0,M,,,*01\r\n" + "$GPGGA,001809.00,3746.4940000,N,12225.1640000,W,1,12,0.9,0.0,M,,,*01\r\n" ); } @@ -221,7 +221,7 @@ mod test { assert_eq!( sentence, - "$GPGGA,0189.00,3403.1320000,N,01814.6220000,W,2,8,1.2,0.0,M,1.00,2,42*1C\r\n" + "$GPGGA,001809.00,3403.1320000,N,01814.6220000,W,2,8,1.2,0.0,M,1.00,2,42*1C\r\n" ); } From e5b696d96fe1058877dd93940f7f9084a2bb14ce Mon Sep 17 00:00:00 2001 From: Theodore Zilist <14153237+tzilist@users.noreply.github.com> Date: Thu, 13 Nov 2025 11:08:59 -0800 Subject: [PATCH 3/3] fix clippy lint/dbg --- swiftnav/src/nmea/gga.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/swiftnav/src/nmea/gga.rs b/swiftnav/src/nmea/gga.rs index 5251826..4ced7b4 100644 --- a/swiftnav/src/nmea/gga.rs +++ b/swiftnav/src/nmea/gga.rs @@ -166,6 +166,7 @@ mod test { use super::*; #[test] + #[allow(clippy::float_cmp, reason = "testing exact parsing")] fn nmea_crate_can_parse_gga_sentence() { let gga = GGA::builder() .sat_in_use(12) @@ -175,8 +176,8 @@ mod test { .llh(super::LLHDegrees::new(37.7749, -122.4194, 10.0)) .build(); - let parse_result = ::nmea::parse_str(dbg!(&gga.to_sentence().as_str())) - .expect("Failed to parse GGA sentence"); + let parse_result = + ::nmea::parse_str(&gga.to_sentence()).expect("Failed to parse GGA sentence"); let ::nmea::ParseResult::GGA(parsed_gga) = parse_result else { panic!("Parsed result is not a GGA sentence");