1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
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_eq!(bam.retransmit_flag, false);
assert_eq!(bam.dac, 669);
assert_eq!(bam.fid, 11);
}
ParsedMessage::Incomplete => {
assert!(false);
}
_ => {
assert!(false);
}
}
}
Err(e) => {
assert_eq!(e.to_string(), "OK");
}
}
}
}