use super::*;
#[derive(Default, Clone, Debug, PartialEq)]
pub struct BinaryAddressedMessage {
pub own_vessel: bool,
pub station: Station,
pub mmsi: u32,
pub sequence_number: u8,
pub destination_mmsi: u32,
pub retransmit_flag: bool,
pub dac: u16,
pub fid: u8,
}
impl LatLon for BinaryAddressedMessage {
fn latitude(&self) -> Option<f64> {
None }
fn longitude(&self) -> Option<f64> {
None }
}
pub(crate) fn handle(
bv: &BitVec,
station: Station,
own_vessel: bool,
) -> Result<ParsedMessage, ParseError> {
Ok(ParsedMessage::BinaryAddressedMessage(
BinaryAddressedMessage {
own_vessel: { own_vessel },
station: { station },
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 },
dac: { pick_u64(bv, 72, 10) as u16 },
fid: { pick_u64(bv, 82, 6) as u8 }, },
))
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn test_parse_vdm_type6() {
let mut p = NmeaParser::new();
match p.parse_sentence("!AIVDM,1,1,,B,6B?n;be:cbapalgc;i6?Ow4,2*4A") {
Ok(ps) => {
match ps {
ParsedMessage::BinaryAddressedMessage(bam) => {
assert_eq!(bam.mmsi, 150834090);
assert_eq!(bam.sequence_number, 3);
assert_eq!(bam.destination_mmsi, 313240222);
assert!(!bam.retransmit_flag);
assert_eq!(bam.dac, 669);
assert_eq!(bam.fid, 11);
}
ParsedMessage::Incomplete => {
assert!(false);
}
_ => {
assert!(false);
}
}
}
Err(e) => {
assert_eq!(e.to_string(), "OK");
}
}
}
}