Skip to main content

gnss_protos/
lib.rs

1#![doc(html_logo_url = "https://raw.githubusercontent.com/rtk-rs/.github/master/logos/logo2.jpg")]
2#![doc = include_str!("../README.md")]
3#![cfg_attr(docsrs, feature(doc_cfg))]
4
5/*
6 * gnss-protos is part of the rtk-rs framework.
7 *
8 * Authors: Guillaume W. Bres <guillaume.bressaix@gmail.com> et al.
9 * (cf. https://github.com/rtk-rs/gnss-protos/graphs/contributors)
10 *
11 * This framework is shipped under Mozilla Public V2 license.
12 */
13
14mod errors;
15pub use errors::Error;
16
17#[cfg(feature = "gps")]
18mod gps;
19
20#[cfg(feature = "gps")]
21pub use gps::*;
22
23#[cfg(test)]
24mod tests;
25
26/// Two's complement parsing & interpretation.
27/// ## Input
28/// - raw bytes as [u32]
29/// - bits_mask: masking u32
30/// - sign_bit_mask: sign bit
31#[cfg(feature = "gps")]
32pub(crate) fn twos_complement(value: u32, bits_mask: u32, sign_bit_mask: u32) -> i32 {
33    let value = value & bits_mask;
34
35    let signed = (value & sign_bit_mask) > 0;
36
37    if signed {
38        (value | !bits_mask) as i32
39    } else {
40        value as i32
41    }
42}
43
44#[cfg(test)]
45#[cfg(feature = "gps")]
46mod test {
47    use crate::twos_complement;
48
49    #[test]
50    fn test_twos_complement() {
51        let value = 0x3fff;
52        let parsed = twos_complement(value, 0x3fff, 0x2000);
53        assert_eq!(parsed, 0xffffffffu32 as i32);
54    }
55}