rustedbytes_nmea/
types.rs

1//! NMEA message types and data structures
2
3use crate::message::{GgaData, GllData, GnsData, GsaData, GsvData, RmcData, VtgData};
4
5/// Parse error types
6#[derive(Debug, Clone, Copy, PartialEq, Eq)]
7pub enum ParseError {
8    /// Checksum verification failed
9    InvalidChecksum,
10    /// Message is syntactically complete but missing mandatory fields
11    InvalidMessage,
12}
13
14/// Represents the GNSS constellation (talker ID)
15#[derive(Debug, Clone, Copy, PartialEq, Eq)]
16pub enum TalkerId {
17    GP, // GPS
18    GL, // GLONASS
19    GA, // Galileo
20    GB, // BeiDou
21    GN, // Multi-GNSS (combined)
22    BD, // BeiDou (alternative)
23    QZ, // QZSS (Quasi-Zenith Satellite System)
24    Unknown,
25}
26
27/// Represents the different NMEA message type identifiers
28#[derive(Debug, Clone, Copy, PartialEq, Eq)]
29pub enum MessageType {
30    GGA, // Global Positioning System Fix Data
31    RMC, // Recommended Minimum Navigation Information
32    GSA, // GPS DOP and active satellites
33    GSV, // GPS Satellites in view
34    GLL, // Geographic Position - Latitude/Longitude
35    VTG, // Track Made Good and Ground Speed
36    GNS, // GNSS Fix Data
37    Unknown,
38}
39
40/// Parsed NMEA message with associated data
41#[derive(Debug, Clone)]
42pub enum NmeaMessage {
43    GGA(GgaData),
44    RMC(RmcData),
45    GSA(GsaData),
46    GSV(GsvData),
47    GLL(GllData),
48    VTG(VtgData),
49    GNS(GnsData),
50}
51
52impl NmeaMessage {
53    /// Get the message type
54    pub fn message_type(&self) -> MessageType {
55        match self {
56            NmeaMessage::GGA(_) => MessageType::GGA,
57            NmeaMessage::RMC(_) => MessageType::RMC,
58            NmeaMessage::GSA(_) => MessageType::GSA,
59            NmeaMessage::GSV(_) => MessageType::GSV,
60            NmeaMessage::GLL(_) => MessageType::GLL,
61            NmeaMessage::VTG(_) => MessageType::VTG,
62            NmeaMessage::GNS(_) => MessageType::GNS,
63        }
64    }
65
66    /// Get the talker ID
67    pub fn talker_id(&self) -> TalkerId {
68        match self {
69            NmeaMessage::GGA(d) => d.talker_id,
70            NmeaMessage::RMC(d) => d.talker_id,
71            NmeaMessage::GSA(d) => d.talker_id,
72            NmeaMessage::GSV(d) => d.talker_id,
73            NmeaMessage::GLL(d) => d.talker_id,
74            NmeaMessage::VTG(d) => d.talker_id,
75            NmeaMessage::GNS(d) => d.talker_id,
76        }
77    }
78
79    /// Extract GGA data if this is a GGA message
80    pub fn as_gga(&self) -> Option<&GgaData> {
81        if let NmeaMessage::GGA(data) = self {
82            Some(data)
83        } else {
84            None
85        }
86    }
87
88    /// Extract RMC data if this is an RMC message
89    pub fn as_rmc(&self) -> Option<&RmcData> {
90        if let NmeaMessage::RMC(data) = self {
91            Some(data)
92        } else {
93            None
94        }
95    }
96
97    /// Extract GSA data if this is a GSA message
98    pub fn as_gsa(&self) -> Option<&GsaData> {
99        if let NmeaMessage::GSA(data) = self {
100            Some(data)
101        } else {
102            None
103        }
104    }
105
106    /// Extract GSV data if this is a GSV message
107    pub fn as_gsv(&self) -> Option<&GsvData> {
108        if let NmeaMessage::GSV(data) = self {
109            Some(data)
110        } else {
111            None
112        }
113    }
114
115    /// Extract GLL data if this is a GLL message
116    pub fn as_gll(&self) -> Option<&GllData> {
117        if let NmeaMessage::GLL(data) = self {
118            Some(data)
119        } else {
120            None
121        }
122    }
123
124    /// Extract VTG data if this is a VTG message
125    pub fn as_vtg(&self) -> Option<&VtgData> {
126        if let NmeaMessage::VTG(data) = self {
127            Some(data)
128        } else {
129            None
130        }
131    }
132
133    /// Extract GNS data if this is a GNS message
134    pub fn as_gns(&self) -> Option<&GnsData> {
135        if let NmeaMessage::GNS(data) = self {
136            Some(data)
137        } else {
138            None
139        }
140    }
141}