use super::*;
#[derive(Default, Clone, Debug, PartialEq)]
pub struct SingleSlotBinaryMessage {
pub own_vessel: bool,
pub station: Station,
pub mmsi: u32,
pub dest_mmsi: Option<u32>,
pub app_id: Option<u16>,
pub data: BitVec,
}
#[allow(clippy::collapsible_if)]
pub(crate) fn handle(
bv: &BitVec,
station: Station,
own_vessel: bool,
) -> Result<ParsedMessage, ParseError> {
let addressed = pick_u64(bv, 38, 1) != 0;
let structured = pick_u64(bv, 39, 1) != 0;
Ok(ParsedMessage::SingleSlotBinaryMessage(
SingleSlotBinaryMessage {
own_vessel: { own_vessel },
station: { station },
mmsi: { pick_u64(bv, 8, 30) as u32 },
dest_mmsi: {
if addressed {
Some(pick_u64(bv, 40, 30) as u32)
} else {
None
}
},
app_id: {
if addressed {
None
} else if structured {
Some(pick_u64(bv, 70, 16) as u16)
} else {
None
}
},
data: {
if addressed {
BitVec::from_bitslice(&bv[70..max(70, bv.len())])
} else if structured {
BitVec::from_bitslice(&bv[86..max(86, bv.len())])
} else {
BitVec::from_bitslice(&bv[40..max(40, bv.len())])
}
},
},
))
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn test_parse_vdm_type25() {
let mut p = NmeaParser::new();
match p.parse_sentence("!AIVDM,1,1,,A,I6SWo?8P00a3PKpEKEVj0?vNP<65,0*73") {
Ok(ps) => {
match ps {
ParsedMessage::SingleSlotBinaryMessage(ssbm) => {
assert_eq!(ssbm.mmsi, 440006460);
assert_eq!(ssbm.dest_mmsi, Some(134218384));
assert_eq!(ssbm.app_id, None);
}
ParsedMessage::Incomplete => {
assert!(false);
}
_ => {
assert!(false);
}
}
}
Err(e) => {
assert_eq!(e.to_string(), "OK");
}
}
match p.parse_sentence("!AIVDM,1,1,,A,I8IRGB40QPPa0:<HP::V=gwv0l48,0*0E") {
Ok(ps) => {
match ps {
ParsedMessage::SingleSlotBinaryMessage(ssbm) => {
assert_eq!(ssbm.mmsi, 563648328);
assert_eq!(ssbm.dest_mmsi, None);
assert_eq!(ssbm.app_id, Some(16424));
}
ParsedMessage::Incomplete => {
assert!(false);
}
_ => {
assert!(false);
}
}
}
Err(e) => {
assert_eq!(e.to_string(), "OK");
}
}
match p.parse_sentence("!AIVDM,1,1,,A,I6SWVNP001a3P8FEKNf=Qb0@00S8,0*6B") {
Ok(ps) => {
match ps {
ParsedMessage::SingleSlotBinaryMessage(ssbm) => {
assert_eq!(ssbm.mmsi, 440002170);
assert_eq!(ssbm.dest_mmsi, None);
assert_eq!(ssbm.app_id, None);
}
ParsedMessage::Incomplete => {
assert!(false);
}
_ => {
assert!(false);
}
}
}
Err(e) => {
assert_eq!(e.to_string(), "OK");
}
}
}
}