use super::*;
#[derive(Clone, Debug, PartialEq)]
pub struct DataLinkManagementMessage {
pub own_vessel: bool,
pub station: Station,
pub case: InterrogationCase,
pub mmsi: u32,
pub offset1: u16,
pub number1: u8,
pub timeout1: u8,
pub increment1: u8,
pub offset2: u16,
pub number2: u8,
pub timeout2: u8,
pub increment2: u8,
pub offset3: u16,
pub number3: u8,
pub timeout3: u8,
pub increment3: u8,
pub offset4: u16,
pub number4: u8,
pub timeout4: u8,
pub increment4: u8,
}
pub(crate) fn handle(
bv: &BitVec,
station: Station,
own_vessel: bool,
) -> Result<ParsedMessage, ParseError> {
let case = InterrogationCase::new(bv);
Ok(ParsedMessage::DataLinkManagementMessage(
DataLinkManagementMessage {
own_vessel,
station,
case,
mmsi: { pick_u64(bv, 8, 30) as u32 },
offset1: { pick_u64(bv, 40, 12) as u16 },
number1: { pick_u64(bv, 52, 4) as u8 },
timeout1: { pick_u64(bv, 56, 3) as u8 },
increment1: { pick_u64(bv, 59, 11) as u8 },
offset2: { pick_u64(bv, 70, 12) as u16 },
number2: { pick_u64(bv, 82, 4) as u8 },
timeout2: { pick_u64(bv, 86, 3) as u8 },
increment2: { pick_u64(bv, 89, 11) as u8 },
offset3: { pick_u64(bv, 100, 12) as u16 },
number3: { pick_u64(bv, 112, 4) as u8 },
timeout3: { pick_u64(bv, 116, 3) as u8 },
increment3: { pick_u64(bv, 119, 11) as u8 },
offset4: { pick_u64(bv, 130, 12) as u16 },
number4: { pick_u64(bv, 142, 4) as u8 },
timeout4: { pick_u64(bv, 146, 3) as u8 },
increment4: { pick_u64(bv, 149, 11) as u8 },
},
))
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn test_parse_vdm_type20() {
let mut p = NmeaParser::new();
match p.parse_sentence("!AIVDM,1,1,,A,Dh3OvjB8IN>4,0*1D") {
Ok(ps) => {
match ps {
ParsedMessage::DataLinkManagementMessage(dlmm) => {
assert_eq!(dlmm.mmsi, 3669705);
assert_eq!(dlmm.offset1, 2182);
assert_eq!(dlmm.number1, 5);
assert_eq!(dlmm.timeout1, 7);
assert_eq!(dlmm.increment1, 225);
}
ParsedMessage::Incomplete => {
assert!(false);
}
_ => {
assert!(false);
}
}
}
Err(e) => {
assert_eq!(e.to_string(), "OK");
}
}
}
}