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
use super::*;
#[derive(Clone, Debug, PartialEq)]
pub struct VbwData {
pub source: NavigationSystem,
pub lon_water_speed_knots: Option<f64>,
pub tr_water_speed_knots: Option<f64>,
pub water_speed_valid: Option<bool>,
pub lon_ground_speed_knots: Option<f64>,
pub tr_ground_speed_knots: Option<f64>,
pub ground_speed_valid: Option<bool>,
}
pub(crate) fn handle(
sentence: &str,
nav_system: NavigationSystem,
) -> Result<ParsedMessage, ParseError> {
let split: Vec<&str> = sentence.split(',').collect();
Ok(ParsedMessage::Vbw(VbwData {
source: nav_system,
lon_water_speed_knots: pick_number_field(&split, 1)?,
tr_water_speed_knots: pick_number_field(&split, 2)?,
water_speed_valid: {
match *split.get(3).unwrap_or(&"") {
"A" => Some(true),
"" => None,
_ => Some(false),
}
},
lon_ground_speed_knots: pick_number_field(&split, 4)?,
tr_ground_speed_knots: pick_number_field(&split, 5)?,
ground_speed_valid: {
match *split.get(6).unwrap_or(&"") {
"A" => Some(true),
"" => None,
_ => Some(false),
}
},
}))
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn test_parse_cpvbw() {
match NmeaParser::new().parse_sentence("$GPVBW,2.0,1.5,A,2.1,1.6,X") {
Ok(ps) => match ps {
ParsedMessage::Vbw(vbw) => {
assert_eq!(vbw.source, NavigationSystem::Gps);
assert::close(vbw.lon_water_speed_knots.unwrap_or(0.0), 2.0, 0.1);
assert::close(vbw.tr_water_speed_knots.unwrap_or(0.0), 1.5, 0.1);
assert_eq!(vbw.water_speed_valid, Some(true));
assert::close(vbw.lon_ground_speed_knots.unwrap_or(0.0), 2.1, 0.1);
assert::close(vbw.tr_ground_speed_knots.unwrap_or(0.0), 1.6, 0.1);
assert_eq!(vbw.ground_speed_valid, Some(false));
}
ParsedMessage::Incomplete => {
assert!(false);
}
_ => {
assert!(false);
}
},
Err(e) => {
assert_eq!(e.to_string(), "OK");
}
}
}
}