use super::*;
#[derive(Default, Clone, Debug, PartialEq)]
pub struct AddressedSafetyRelatedMessage {
pub own_vessel: bool,
pub station: Station,
pub source_mmsi: u32,
pub sequence_number: u8,
pub destination_mmsi: u32,
pub retransmit_flag: bool,
pub text: String,
}
pub(crate) fn handle(
bv: &BitVec,
station: Station,
own_vessel: bool,
) -> Result<ParsedMessage, ParseError> {
Ok(ParsedMessage::AddressedSafetyRelatedMessage(
AddressedSafetyRelatedMessage {
own_vessel: { own_vessel },
station: { station },
source_mmsi: { pick_u64(bv, 8, 30) as u32 },
sequence_number: { pick_u64(bv, 38, 2) as u8 },
destination_mmsi: { pick_u64(bv, 40, 30) as u32 },
retransmit_flag: { pick_u64(bv, 70, 1) != 0 },
text: { pick_string(bv, 72, 156) },
},
))
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn test_parse_vdm_type12() {
let mut p = NmeaParser::new();
match p.parse_sentence(
"!AIVDM,1,1,,A,<02:oP0kKcv0@<51C5PB5@?BDPD?P:?2?EB7PDB16693P381>>5<PikP,0*37",
) {
Ok(ps) => {
match ps {
ParsedMessage::AddressedSafetyRelatedMessage(asrm) => {
assert_eq!(asrm.source_mmsi, 2275200);
assert_eq!(asrm.sequence_number, 0);
assert_eq!(asrm.destination_mmsi, 215724000);
assert!(!asrm.retransmit_flag);
assert_eq!(asrm.text, "PLEASE REPORT TO JOBOURG TRAFFIC CHANNEL 13");
}
ParsedMessage::Incomplete => {
assert!(false);
}
_ => {
assert!(false);
}
}
}
Err(e) => {
assert_eq!(e.to_string(), "OK");
}
}
match p.parse_sentence(
"!AIVDM,1,1,,A,<CR3B@<0TO3j5@PmkiP31BCPphPDB13;CPihkP=?D?PmP3B5GPpn,0*3A",
) {
Ok(ps) => {
match ps {
ParsedMessage::AddressedSafetyRelatedMessage(asrm) => {
assert_eq!(asrm.source_mmsi, 237032000);
assert_eq!(asrm.sequence_number, 3);
assert_eq!(asrm.destination_mmsi, 2391100);
assert!(asrm.retransmit_flag);
assert_eq!(asrm.text, "EP 531 CARS 80 TRACKS 103 MOTO 5 CREW 86");
}
ParsedMessage::Incomplete => {
assert!(false);
}
_ => {
assert!(false);
}
}
}
Err(e) => {
assert_eq!(e.to_string(), "OK");
}
}
}
}