use super::*;
#[derive(Clone, Debug, PartialEq)]
pub struct DgnssBroadcastBinaryMessage {
pub own_vessel: bool,
pub station: Station,
pub mmsi: u32,
pub latitude: Option<f64>,
pub longitude: Option<f64>,
pub payload: BitVec,
}
pub(crate) fn handle(
bv: &BitVec,
station: Station,
own_vessel: bool,
) -> Result<ParsedMessage, ParseError> {
Ok(ParsedMessage::DgnssBroadcastBinaryMessage(
DgnssBroadcastBinaryMessage {
own_vessel: { own_vessel },
station: { station },
mmsi: { pick_u64(bv, 8, 30) as u32 },
latitude: {
let lat_raw = pick_i64(bv, 58, 17) as i32;
if lat_raw != 0xd548 {
Some((lat_raw as f64) / 600.0)
} else {
None
}
},
longitude: {
let lon_raw = pick_i64(bv, 40, 18) as i32;
if lon_raw != 0x1a838 {
Some((lon_raw as f64) / 600.0)
} else {
None
}
},
payload: bv.iter().skip(80).collect(),
},
))
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn test_parse_vdm_type17() {
let mut p = NmeaParser::new();
match p.parse_sentence(
"!AIVDM,2,1,5,A,A02VqLPA4I6C07h5Ed1h<OrsuBTTwS?r:C?w`?la<gno1RTRwSP9:BcurA8a,0*3A",
) {
Ok(ps) => match ps {
ParsedMessage::Incomplete => {
assert!(true);
}
_ => {
assert!(false);
}
},
Err(e) => {
assert_eq!(e.to_string(), "OK");
}
}
match p.parse_sentence("!AIVDM,2,2,5,A,:Oko02TSwu8<:Jbb,0*11") {
Ok(ps) => {
match ps {
ParsedMessage::DgnssBroadcastBinaryMessage(i) => {
assert_eq!(i.mmsi, 2734450);
assert::close(i.latitude.unwrap_or(0.0), 59.987, 0.001);
assert::close(i.longitude.unwrap_or(0.0), 29.130, 0.001);
assert_eq!(i.payload.len(), 376);
}
ParsedMessage::Incomplete => {
assert!(false);
}
_ => {
assert!(false);
}
}
}
Err(e) => {
assert_eq!(e.to_string(), "OK");
}
}
}
}