use crate::message::{GgaData, GllData, GnsData, GsaData, GsvData, RmcData, VtgData};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ParseError {
InvalidChecksum,
InvalidMessage,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum TalkerId {
GP, GL, GA, GB, GN, BD, QZ, Unknown,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum MessageType {
GGA, RMC, GSA, GSV, GLL, VTG, GNS, Unknown,
}
#[derive(Debug, Clone)]
pub enum NmeaMessage {
GGA(GgaData),
RMC(RmcData),
GSA(GsaData),
GSV(GsvData),
GLL(GllData),
VTG(VtgData),
GNS(GnsData),
}
impl NmeaMessage {
pub fn message_type(&self) -> MessageType {
match self {
NmeaMessage::GGA(_) => MessageType::GGA,
NmeaMessage::RMC(_) => MessageType::RMC,
NmeaMessage::GSA(_) => MessageType::GSA,
NmeaMessage::GSV(_) => MessageType::GSV,
NmeaMessage::GLL(_) => MessageType::GLL,
NmeaMessage::VTG(_) => MessageType::VTG,
NmeaMessage::GNS(_) => MessageType::GNS,
}
}
pub fn talker_id(&self) -> TalkerId {
match self {
NmeaMessage::GGA(d) => d.talker_id,
NmeaMessage::RMC(d) => d.talker_id,
NmeaMessage::GSA(d) => d.talker_id,
NmeaMessage::GSV(d) => d.talker_id,
NmeaMessage::GLL(d) => d.talker_id,
NmeaMessage::VTG(d) => d.talker_id,
NmeaMessage::GNS(d) => d.talker_id,
}
}
pub fn as_gga(&self) -> Option<&GgaData> {
if let NmeaMessage::GGA(data) = self {
Some(data)
} else {
None
}
}
pub fn as_rmc(&self) -> Option<&RmcData> {
if let NmeaMessage::RMC(data) = self {
Some(data)
} else {
None
}
}
pub fn as_gsa(&self) -> Option<&GsaData> {
if let NmeaMessage::GSA(data) = self {
Some(data)
} else {
None
}
}
pub fn as_gsv(&self) -> Option<&GsvData> {
if let NmeaMessage::GSV(data) = self {
Some(data)
} else {
None
}
}
pub fn as_gll(&self) -> Option<&GllData> {
if let NmeaMessage::GLL(data) = self {
Some(data)
} else {
None
}
}
pub fn as_vtg(&self) -> Option<&VtgData> {
if let NmeaMessage::VTG(data) = self {
Some(data)
} else {
None
}
}
pub fn as_gns(&self) -> Option<&GnsData> {
if let NmeaMessage::GNS(data) = self {
Some(data)
} else {
None
}
}
}