use super::*;
#[derive(Clone, Debug, PartialEq)]
pub struct AssignmentModeCommand {
pub own_vessel: bool,
pub station: Station,
pub assigned_for_single_station: bool,
pub mmsi: u32,
pub mmsi1: u32,
pub offset1: u16,
pub increment1: u16,
pub mmsi2: Option<u32>,
pub offset2: Option<u16>,
pub increment2: Option<u16>,
}
pub(crate) fn handle(
bv: &BitVec,
station: Station,
own_vessel: bool,
) -> Result<ParsedMessage, ParseError> {
let single = bv.len() < 144;
Ok(ParsedMessage::AssignmentModeCommand(
AssignmentModeCommand {
own_vessel: { own_vessel },
station: { station },
assigned_for_single_station: { single },
mmsi: { pick_u64(bv, 8, 30) as u32 },
mmsi1: { pick_u64(bv, 40, 30) as u32 },
offset1: { pick_u64(bv, 70, 12) as u16 },
increment1: { pick_u64(bv, 82, 10) as u16 },
mmsi2: {
if single {
None
} else {
Some(pick_u64(bv, 92, 30) as u32)
}
},
offset2: {
if single {
None
} else {
Some(pick_u64(bv, 122, 12) as u16)
}
},
increment2: {
if single {
None
} else {
Some(pick_u64(bv, 134, 10) as u16)
}
},
},
))
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn test_parse_vdm_type16() {
let mut p = NmeaParser::new();
match p.parse_sentence("!AIVDM,1,1,,A,@01uEO@mMk7P<P00,0*18") {
Ok(ps) => {
match ps {
ParsedMessage::AssignmentModeCommand(i) => {
assert_eq!(i.mmsi, 2053501);
assert_eq!(i.mmsi1, 224251000);
assert_eq!(i.offset1, 200);
assert_eq!(i.increment1, 0);
assert_eq!(i.mmsi2, None);
assert_eq!(i.offset2, None);
assert_eq!(i.increment2, None);
}
ParsedMessage::Incomplete => {
assert!(false);
}
_ => {
assert!(false);
}
}
}
Err(e) => {
assert_eq!(e.to_string(), "OK");
}
}
}
}