Skip to content

Commit 750e0a9

Browse files
authored
Merge pull request #85 from JasminFragnaud/dbk-sentence-parsing
Add DBK sentence
2 parents fcbe1b0 + 405170c commit 750e0a9

File tree

5 files changed

+159
-0
lines changed

5 files changed

+159
-0
lines changed

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ NMEA Standard Sentences
1515
- ALM
1616
- BOD
1717
- BWC
18+
- DBK
1819
- GBS
1920
- GGA *
2021
- GLL *

src/parse.rs

+2
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ pub enum ParseResult {
101101
ALM(AlmData),
102102
BOD(BodData),
103103
BWC(BwcData),
104+
DBK(DbkData),
104105
GBS(GbsData),
105106
GGA(GgaData),
106107
GLL(GllData),
@@ -127,6 +128,7 @@ impl From<&ParseResult> for SentenceType {
127128
ParseResult::ALM(_) => SentenceType::ALM,
128129
ParseResult::BOD(_) => SentenceType::BOD,
129130
ParseResult::BWC(_) => SentenceType::BWC,
131+
ParseResult::DBK(_) => SentenceType::DBK,
130132
ParseResult::GBS(_) => SentenceType::GBS,
131133
ParseResult::GGA(_) => SentenceType::GGA,
132134
ParseResult::GLL(_) => SentenceType::GLL,

src/parser.rs

+1
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,7 @@ impl<'a> Nmea {
354354
}
355355
ParseResult::BWC(_)
356356
| ParseResult::BOD(_)
357+
| ParseResult::DBK(_)
357358
| ParseResult::GBS(_)
358359
| ParseResult::AAM(_)
359360
| ParseResult::ALM(_)

src/sentences/dbk.rs

+153
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
1+
use nom::{
2+
character::complete::{char, one_of},
3+
combinator::opt,
4+
number::complete::double,
5+
sequence::preceded,
6+
IResult,
7+
};
8+
9+
use crate::{parse::NmeaSentence, Error, SentenceType};
10+
11+
/// DBK - Depth Below Keel
12+
///
13+
/// <https://gpsd.gitlab.io/gpsd/NMEA.html#_dbk_depth_below_keel>
14+
///
15+
/// ```text
16+
/// 1 2 3 4 5 6 7
17+
/// | | | | | | |
18+
/// $--DBK,x.x,f,x.x,M,x.x,F*hh<CR><LF>
19+
/// ```
20+
/// 1: Depth, feet
21+
/// 2: f = feet
22+
/// 3: Depth, meters
23+
/// 4: M = meters
24+
/// 5: Depth, Fathoms
25+
/// 6: F = Fathoms
26+
/// 7: Mandatory NMEA checksum
27+
#[derive(Debug, PartialEq)]
28+
pub struct DbkData {
29+
pub depth_feet: Option<f64>,
30+
pub depth_meters: Option<f64>,
31+
pub depth_fathoms: Option<f64>,
32+
}
33+
34+
/// # Parse DBK message
35+
///
36+
/// Information from DBK:
37+
///
38+
/// NMEA 0183 standard Depth Below Keel. (Obsolete sentence)
39+
/// <https://gpsd.gitlab.io/gpsd/NMEA.html#_dbk_depth_below_keel>
40+
///
41+
/// ## Example (Ignore the line break):
42+
/// ```text
43+
/// $SDDBK,1330.5,f,0405.5,M,0221.6,F*2E
44+
///```
45+
///
46+
/// 1: 1330.5 Depth feet
47+
/// 2: f Units: f = feet
48+
/// 3: 0405.5 Depth meters
49+
/// 4: M Units: M = meters
50+
/// 5: 0221.6 Depth Fathoms
51+
/// 6: F Units: F = Fathoms
52+
/// 7: 2E CRC Checksum of NMEA data
53+
pub fn parse_dbk(sentence: NmeaSentence) -> Result<DbkData, Error> {
54+
if sentence.message_id != SentenceType::DBK {
55+
Err(Error::WrongSentenceHeader {
56+
expected: SentenceType::DBK,
57+
found: sentence.message_id,
58+
})
59+
} else {
60+
Ok(do_parse_dbk(sentence.data)?.1)
61+
}
62+
}
63+
64+
fn do_parse_dbk(i: &str) -> IResult<&str, DbkData> {
65+
let (i, depth_feet_value) = opt(double)(i)?;
66+
let (i, _) = preceded(char(','), one_of("f"))(i)?;
67+
let (i, _) = char(',')(i)?;
68+
let (i, depth_meters_value) = opt(double)(i)?;
69+
let (i, _) = preceded(char(','), one_of("M"))(i)?;
70+
let (i, _) = char(',')(i)?;
71+
let (i, depth_fathoms_value) = opt(double)(i)?;
72+
let (i, _) = preceded(char(','), one_of("F"))(i)?;
73+
Ok((
74+
i,
75+
DbkData {
76+
depth_feet: depth_feet_value,
77+
depth_meters: depth_meters_value,
78+
depth_fathoms: depth_fathoms_value,
79+
},
80+
))
81+
}
82+
83+
#[cfg(test)]
84+
mod tests {
85+
use super::*;
86+
use crate::parse::parse_nmea_sentence;
87+
88+
#[test]
89+
fn test_parse_dbk() {
90+
let s = parse_nmea_sentence("$SDDBK,1330.5,f,0405.5,M,0221.6,F*2E").unwrap();
91+
assert_eq!(s.checksum, s.calc_checksum());
92+
assert_eq!(s.checksum, 0x2E);
93+
let dbk_data = parse_dbk(s).unwrap();
94+
assert_eq!(Some(1330.5), dbk_data.depth_feet);
95+
assert_eq!(Some(405.5), dbk_data.depth_meters);
96+
assert_eq!(Some(221.6), dbk_data.depth_fathoms);
97+
}
98+
#[test]
99+
fn test_parse_dbk_invalid_depth_feet_value() {
100+
let s = parse_nmea_sentence("$SDDBK,1FF0.5,f,0405.5,M,0221.6,F*2E").unwrap();
101+
assert_eq!(s.checksum, s.calc_checksum());
102+
assert_eq!(s.checksum, 0x2E);
103+
assert_eq!(true, parse_dbk(s).is_err());
104+
}
105+
106+
#[test]
107+
fn test_parse_dbk_invalid_depth_feet_unit() {
108+
let s = parse_nmea_sentence("$SDDBK,1330.5,X,0405.5,M,0221.6,F*10").unwrap();
109+
assert_eq!(s.checksum, s.calc_checksum());
110+
assert_eq!(s.checksum, 0x10);
111+
assert_eq!(true, parse_dbk(s).is_err());
112+
}
113+
114+
#[test]
115+
fn test_parse_dbk_invalid_depth_meters_value() {
116+
let s = parse_nmea_sentence("$SDDBK,1330.5,f,04F5.5,M,0221.6,F*58").unwrap();
117+
assert_eq!(s.checksum, s.calc_checksum());
118+
assert_eq!(s.checksum, 0x58);
119+
assert_eq!(true, parse_dbk(s).is_err());
120+
}
121+
122+
#[test]
123+
fn test_parse_dbk_invalid_depth_meters_unit() {
124+
let s = parse_nmea_sentence("$SDDBK,1330.5,f,0405.5,X,0221.6,F*3B").unwrap();
125+
assert_eq!(s.checksum, s.calc_checksum());
126+
assert_eq!(s.checksum, 0x3B);
127+
assert_eq!(true, parse_dbk(s).is_err());
128+
}
129+
130+
#[test]
131+
fn test_parse_dbk_invalid_depth_fathoms_value() {
132+
let s = parse_nmea_sentence("$SDDBK,1330.5,f,0405.5,M,02F1.6,F*5A").unwrap();
133+
assert_eq!(s.checksum, s.calc_checksum());
134+
assert_eq!(s.checksum, 0x5A);
135+
assert_eq!(true, parse_dbk(s).is_err());
136+
}
137+
138+
#[test]
139+
fn test_parse_dbk_invalid_depth_fathoms_unit() {
140+
let s = parse_nmea_sentence("$SDDBK,1330.5,f,0405.5,M,0221.6,X*30").unwrap();
141+
assert_eq!(s.checksum, s.calc_checksum());
142+
assert_eq!(s.checksum, 0x30);
143+
assert_eq!(true, parse_dbk(s).is_err());
144+
}
145+
146+
#[test]
147+
fn test_parse_dbk_invalid_sentence_type() {
148+
let s = parse_nmea_sentence("$INMTW,17.9,x*20").unwrap();
149+
assert_eq!(s.checksum, s.calc_checksum());
150+
assert_eq!(s.checksum, 0x20);
151+
assert_eq!(true, parse_dbk(s).is_err());
152+
}
153+
}

src/sentences/mod.rs

+2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ mod aam;
44
mod alm;
55
mod bod;
66
mod bwc;
7+
mod dbk;
78
mod gbs;
89
mod gga;
910
mod gll;
@@ -30,6 +31,7 @@ pub use {
3031
alm::{parse_alm, AlmData},
3132
bod::{parse_bod, BodData},
3233
bwc::{parse_bwc, BwcData},
34+
dbk::{parse_dbk, DbkData},
3335
faa_mode::{FaaMode, FaaModes},
3436
fix_type::FixType,
3537
gbs::{parse_gbs, GbsData},

0 commit comments

Comments
 (0)