nmea_0183/messages/
gst.rs

1use crate::fields::distance::*;
2use crate::fields::time::*;
3use chrono::naive::NaiveTime;
4use nom::sequence::tuple;
5use nom::IResult;
6
7#[derive(Debug, PartialEq)]
8/// GNSS Pseudo Range Error Statistics
9pub struct GSTMessage {
10    /// UTC time of associated position fix
11    pub time: Option<NaiveTime>,
12    /// RMS value of the standard deviation of the ranges
13    pub range_rms: Option<Meter>,
14    /// Standard deviation of semi-major axis
15    pub std_major: Option<Meter>,
16    /// Standard deviation of semi-minor axis
17    pub std_minor: Option<Meter>,
18    /// Orientation of semi-major axis
19    pub orient: Option<Degree>,
20    /// Standard deviation of latitude error
21    pub std_lat: Option<Meter>,
22    /// Standard deviation of longitude error
23    pub std_lon: Option<Meter>,
24    /// Standard deviation of altitude error
25    pub std_alt: Option<Meter>,
26}
27
28pub fn parse_gst(input: &str) -> IResult<&str, GSTMessage> {
29    let (remaining, (time, range_rms, std_major, std_minor, orient, std_lat, std_lon, std_alt)) =
30        tuple((
31            parse_time,
32            parse_meter,
33            parse_meter,
34            parse_meter,
35            parse_degree,
36            parse_meter,
37            parse_meter,
38            parse_meter,
39        ))(input)?;
40    Ok((
41        remaining,
42        GSTMessage {
43            time,
44            range_rms,
45            std_major,
46            std_minor,
47            orient,
48            std_lat,
49            std_lon,
50            std_alt,
51        },
52    ))
53}
54
55#[cfg(test)]
56mod tests {
57    use super::*;
58
59    #[test]
60    fn test_parse_gst() {
61        let input = "082356.00,1.8,,,,1.7,1.3,2.2";
62        let expected = Ok((
63            "",
64            GSTMessage {
65                time: Some(NaiveTime::from_hms(08, 23, 56)),
66                range_rms: Some(Meter(1.8)),
67                std_major: None,
68                std_minor: None,
69                orient: None,
70                std_lat: Some(Meter(1.7)),
71                std_lon: Some(Meter(1.3)),
72                std_alt: Some(Meter(2.2)),
73            },
74        ));
75
76        assert_eq!(expected, parse_gst(input));
77    }
78}