use super::*;
#[derive(Default, Clone, Debug, PartialEq)]
pub struct SafetyRelatedBroadcastMessage {
pub own_vessel: bool,
pub station: Station,
pub mmsi: u32,
pub text: String,
}
pub(crate) fn handle(
bv: &BitVec,
station: Station,
own_vessel: bool,
) -> Result<ParsedMessage, ParseError> {
Ok(ParsedMessage::SafetyRelatedBroadcastMessage(
SafetyRelatedBroadcastMessage {
own_vessel: { own_vessel },
station: { station },
mmsi: { pick_u64(bv, 8, 30) as u32 },
text: { pick_string(bv, 40, 161) },
},
))
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn test_parse_vdm_type14() {
let mut p = NmeaParser::new();
match p.parse_sentence("!AIVDM,1,1,,A,>5?Per18=HB1U:1@E=B0m<L,2*51") {
Ok(ps) => {
match ps {
ParsedMessage::SafetyRelatedBroadcastMessage(srbm) => {
assert_eq!(srbm.mmsi, 351809000);
assert_eq!(srbm.text, "RCVD YR TEST MSG");
}
ParsedMessage::Incomplete => {
assert!(false);
}
_ => {
assert!(false);
}
}
}
Err(e) => {
assert_eq!(e.to_string(), "OK");
}
}
match p.parse_sentence("!AIVDM,1,1,,A,>3R1p10E3;;R0USCR0HO>0@gN10kGJp,2*7F") {
Ok(ps) => {
match ps {
ParsedMessage::SafetyRelatedBroadcastMessage(srbm) => {
assert_eq!(srbm.mmsi, 237008900);
assert_eq!(srbm.text, "EP228 IX48 FG3 DK7 PL56.");
}
ParsedMessage::Incomplete => {
assert!(false);
}
_ => {
assert!(false);
}
}
}
Err(e) => {
assert_eq!(e.to_string(), "OK");
}
}
match p.parse_sentence("!AIVDM,1,1,,A,>4aDT81@E=@,2*2E") {
Ok(ps) => {
match ps {
ParsedMessage::SafetyRelatedBroadcastMessage(srbm) => {
assert_eq!(srbm.mmsi, 311764000);
assert_eq!(srbm.text, "TEST");
}
ParsedMessage::Incomplete => {
assert!(false);
}
_ => {
assert!(false);
}
}
}
Err(e) => {
assert_eq!(e.to_string(), "OK");
}
}
}
}