rustedbytes_nmea/
types.rs1use crate::message::{GgaData, GllData, GnsData, GsaData, GsvData, RmcData, VtgData};
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq)]
7pub enum ParseError {
8 InvalidChecksum,
10 InvalidMessage,
12}
13
14#[derive(Debug, Clone, Copy, PartialEq, Eq)]
16pub enum TalkerId {
17 GP, GL, GA, GB, GN, BD, QZ, Unknown,
25}
26
27#[derive(Debug, Clone, Copy, PartialEq, Eq)]
29pub enum MessageType {
30 GGA, RMC, GSA, GSV, GLL, VTG, GNS, Unknown,
38}
39
40#[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 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 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 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 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 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 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 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 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 pub fn as_gns(&self) -> Option<&GnsData> {
135 if let NmeaMessage::GNS(data) = self {
136 Some(data)
137 } else {
138 None
139 }
140 }
141}