Skip to main content

sbf_tools/
lib.rs

1//! # SBF - Septentrio Binary Format Parser
2//!
3//! Parse Septentrio Binary Format (SBF) streams from GNSS receivers.
4//!
5//! ## Features
6//!
7//! - Read SBF blocks from any `Read` source
8//! - Decode measurement, PVT, nav, status, SBAS, INS, and event blocks
9//! - Decode `Meas3` epochs with the stateful `Meas3Decoder`
10//! - Keep unknown blocks as raw payloads
11//! - Parse-only API
12//!
13//! ## Quick Start
14//!
15//! ```no_run
16//! use std::fs::File;
17//! use sbf_tools::{SbfReader, SbfBlock};
18//!
19//! let file = File::open("data.sbf").unwrap();
20//! let reader = SbfReader::new(file);
21//!
22//! for result in reader {
23//!     match result {
24//!         Ok(block) => match block {
25//!             SbfBlock::PvtGeodetic(pvt) => {
26//!                 if let (Some(lat), Some(lon)) = (pvt.latitude_deg(), pvt.longitude_deg()) {
27//!                     println!("Position: {:.6}°, {:.6}°", lat, lon);
28//!                 }
29//!             }
30//!             SbfBlock::Dop(dop) => {
31//!                 println!("PDOP: {:.2}, HDOP: {:.2}", dop.pdop(), dop.hdop());
32//!             }
33//!             _ => {}
34//!         },
35//!         Err(e) => eprintln!("Error: {}", e),
36//!     }
37//! }
38//! ```
39//!
40//! See `README.md` and the examples under `examples/` for block counting and `Meas3` decoding.
41
42pub mod blocks;
43pub mod crc;
44pub mod error;
45pub mod header;
46pub mod reader;
47pub mod types;
48
49// Re-export commonly used items at crate root
50pub use blocks::{
51    // Block IDs
52    block_ids,
53    block_name,
54    fallback_name,
55    // Position
56    BaseVectorCartBlock,
57    BaseVectorGeodBlock,
58    BdsAlmBlock,
59    BdsCNav2Block,
60    BdsCNav3Block,
61    // Extended nav / position
62    BdsNavBlock,
63    BdsRawB1cBlock,
64    BdsRawB2aBlock,
65    BdsUtcBlock,
66    // Status
67    ChannelStatusBlock,
68    CosmosStatusBlock,
69    DiskData,
70    DiskStatusBlock,
71    DopBlock,
72    DynDnsStatusBlock,
73    EncapsulatedOutputBlock,
74    // Time
75    EndOfPvtBlock,
76    ExtEventAttEulerBlock,
77    ExtEventBaseVectGeodBlock,
78    // Navigation
79    GalNavBlock,
80    GeoRawL5Block,
81    GisActionBlock,
82    GisDatabaseStatus,
83    GisStatusBlock,
84    GloNavBlock,
85    GpsNavBlock,
86    IrnssRawBlock,
87    LBandBeamInfo,
88    LBandBeamsBlock,
89    Meas3BlockSet,
90    Meas3Cn0HiResBlock,
91    Meas3DecodedEpoch,
92    Meas3Decoder,
93    Meas3DopplerBlock,
94    Meas3Measurement,
95    Meas3MpBlock,
96    Meas3PpBlock,
97    Meas3RangesBlock,
98    Meas3Satellite,
99    // Measurement
100    MeasEpochBlock,
101    NtripClientStatusBlock,
102    NtripConnectionSlot,
103    NtripServerStatusBlock,
104    P2ppSession,
105    P2ppStatusBlock,
106    PosCartBlock,
107    PosCovCartesianBlock,
108    PosCovGeodeticBlock,
109    PosLocalBlock,
110    PosProjectedBlock,
111    PvtCartesianBlock,
112    PvtGeodeticBlock,
113    PvtSupportABlock,
114    QzsAlmBlock,
115    QzsNavBlock,
116    ReceiverStatusBlock,
117    ReceiverTimeBlock,
118    RfBandEntry,
119    RfStatusBlock,
120    RtcmDatumBlock,
121    RxMessageBlock,
122    SatVisibilityBlock,
123    SatVisibilityInfo,
124    SatelliteMeasurement,
125    // Main enum
126    SbfBlock,
127    VelCovCartesianBlock,
128    VelCovGeodeticBlock,
129};
130
131pub use crc::{calculate_block_crc, crc16_ccitt, validate_block};
132pub use error::{SbfError, SbfResult};
133pub use header::{SbfHeader, SBF_SYNC};
134pub use reader::{ReaderStats, SbfReadExt, SbfReader};
135pub use types::{Constellation, PvtError, PvtMode, SatelliteId, SignalType};
136
137/// Library version
138pub const VERSION: &str = env!("CARGO_PKG_VERSION");
139
140/// SBF sync bytes
141pub const SYNC_BYTES: [u8; 2] = SBF_SYNC;
142
143#[cfg(test)]
144mod tests {
145    use super::*;
146
147    #[test]
148    fn test_version() {
149        let parts: Vec<_> = VERSION.split('.').collect();
150        assert_eq!(parts.len(), 3);
151        assert!(parts.iter().all(|part| !part.is_empty()));
152    }
153
154    #[test]
155    fn test_sync_bytes() {
156        assert_eq!(SYNC_BYTES, [0x24, 0x40]);
157    }
158}