diff --git a/Cargo.lock b/Cargo.lock index 56ffec312..e6d9a2102 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -71,12 +71,6 @@ dependencies = [ "backtrace", ] -[[package]] -name = "arrayvec" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" - [[package]] name = "async_logger" version = "0.3.3" @@ -359,7 +353,6 @@ dependencies = [ "glob", "indexmap", "lazy_static", - "libsettings", "log", "logtest", "minreq", @@ -372,6 +365,7 @@ dependencies = [ "regex", "rust-ini", "sbp", + "sbp-settings", "semver 1.0.4", "serde", "serde-pickle", @@ -820,19 +814,6 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" -[[package]] -name = "lexical-core" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6607c62aa161d23d17a9072cc5da0be67cdfc89d3afb1e8d9c842bebc2525ffe" -dependencies = [ - "arrayvec", - "bitflags", - "cfg-if 1.0.0", - "ryu", - "static_assertions", -] - [[package]] name = "libc" version = "0.2.102" @@ -849,31 +830,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "libsettings" -version = "0.1.0" -source = "git+https://github.com/swift-nav/libsettings.git?rev=ee2b62d1c7234d081c7ce7aa69ad718eba6d2b89#ee2b62d1c7234d081c7ce7aa69ad718eba6d2b89" -dependencies = [ - "crossbeam-channel", - "crossbeam-utils", - "libsettings-sys", - "log", - "once_cell", - "parking_lot", - "sbp", - "serde", - "serde_yaml", -] - -[[package]] -name = "libsettings-sys" -version = "0.1.0" -source = "git+https://github.com/swift-nav/libsettings.git?rev=ee2b62d1c7234d081c7ce7aa69ad718eba6d2b89#ee2b62d1c7234d081c7ce7aa69ad718eba6d2b89" -dependencies = [ - "bindgen", - "cmake", -] - [[package]] name = "libudev" version = "0.2.0" @@ -1028,7 +984,6 @@ checksum = "e7413f999671bd4745a7b624bd370a569fb6bc574b23c83a3c5ed2e453f3d5e2" dependencies = [ "bitvec", "funty", - "lexical-core", "memchr", "version_check", ] @@ -1530,21 +1485,37 @@ dependencies = [ [[package]] name = "sbp" -version = "3.4.11-alpha" -source = "git+https://github.com/swift-nav/libsbp.git?rev=a14a85123ac4e4a3b8830388cac72bc926799d17#a14a85123ac4e4a3b8830388cac72bc926799d17" +version = "3.4.11-beta.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aac2c7f17930555b54e02a304278a2fade0cda9229b79f2599b6a7cb1e7758ea" dependencies = [ "base64", - "byteorder", "bytes", "crc16", "dencode", "log", - "nom", "serde", "serde_json", "slotmap", "swiftnav", - "thiserror", +] + +[[package]] +name = "sbp-settings" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de2eb145b9cc793da8d947e8fb0c19f6bd95972c80195fe80d40ae36565df108" +dependencies = [ + "bindgen", + "cmake", + "crossbeam-channel", + "crossbeam-utils", + "log", + "once_cell", + "parking_lot", + "sbp", + "serde", + "serde_yaml", ] [[package]] @@ -1731,12 +1702,6 @@ dependencies = [ "version_check", ] -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - [[package]] name = "stdweb" version = "0.4.20" @@ -1818,16 +1783,18 @@ dependencies = [ [[package]] name = "swiftnav" -version = "0.6.1" -source = "git+https://github.com/swift-nav/swiftnav-rs?tag=v0.6.1#295ff5969245242c5705d513fcffab55bfc2f989" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1327b1980ace390626603d314b572d90ccfc628783c0ed1ad24fb15ad27de4d8" dependencies = [ "swiftnav-sys", ] [[package]] name = "swiftnav-sys" -version = "0.6.1" -source = "git+https://github.com/swift-nav/swiftnav-rs?tag=v0.6.1#295ff5969245242c5705d513fcffab55bfc2f989" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba1ab75340a2ca76fc93c979d2811de32b8f0f133761246659ba4eb486e6f563" dependencies = [ "bindgen", "cmake", @@ -1907,26 +1874,6 @@ dependencies = [ "unicode-width", ] -[[package]] -name = "thiserror" -version = "1.0.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "602eca064b2d83369e2b2f34b09c70b605402801927c65c11071ac911d299b88" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bad553cc2c78e8de258400763a647e80e6d1b31ee237275d756f6836d204494c" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "time" version = "0.1.43" diff --git a/console_backend/Cargo.toml b/console_backend/Cargo.toml index a452e20af..8ff20dee6 100644 --- a/console_backend/Cargo.toml +++ b/console_backend/Cargo.toml @@ -40,17 +40,10 @@ minreq = { version = "2.4.2", features = ["https"] } regex = { version = "1.5.4" } semver = { version = "1" } rust-ini = "0.17.0" +sbp = { version = "3.4.11-beta", features = ["json", "link", "swiftnav"] } +sbp-settings = "0.1.0" env_logger = { version = "0.9", optional = true } -[dependencies.sbp] -git = "https://github.com/swift-nav/libsbp.git" -rev = "a14a85123ac4e4a3b8830388cac72bc926799d17" -features = ["json", "swiftnav", "link"] - -[dependencies.libsettings] -git = "https://github.com/swift-nav/libsettings.git" -rev = "ee2b62d1c7234d081c7ce7aa69ad718eba6d2b89" - [target.'cfg(any(target_os = "macos", target_os = "windows"))'.dependencies] serialport = "4.0.1" diff --git a/console_backend/benches/cpu_benches.rs b/console_backend/benches/cpu_benches.rs index 2316b10e4..461e2cb47 100644 --- a/console_backend/benches/cpu_benches.rs +++ b/console_backend/benches/cpu_benches.rs @@ -2,7 +2,7 @@ use criterion::{criterion_group, criterion_main, Criterion}; use crossbeam::channel; use glob::glob; -use sbp::sbp_tools::SBPTools; +use sbp::SbpIterExt; use std::{ fs, io, path::Path, diff --git a/console_backend/src/advanced_spectrum_analyzer_tab.rs b/console_backend/src/advanced_spectrum_analyzer_tab.rs index 656f4bc74..79942adea 100644 --- a/console_backend/src/advanced_spectrum_analyzer_tab.rs +++ b/console_backend/src/advanced_spectrum_analyzer_tab.rs @@ -120,7 +120,7 @@ impl AdvancedSpectrumAnalyzerTab { mod tests { use super::*; use crate::{constants::SIGNALS_TOTAL, types::TestSender}; - use sbp::messages::{gnss::GPSTime, piksi::MsgSpecan}; + use sbp::messages::{gnss::GpsTime, piksi::MsgSpecan}; #[test] fn handle_specan_empty_amplitude_value_test() { @@ -131,7 +131,7 @@ mod tests { let wn = 1000; let tow = 10001; let ns_residual = 100011; - let t = GPSTime { + let t = GpsTime { tow, ns_residual, wn, @@ -167,7 +167,7 @@ mod tests { let wn = 1000; let tow = 10001; let ns_residual = 100011; - let t = GPSTime { + let t = GpsTime { tow, ns_residual, wn, diff --git a/console_backend/src/advanced_system_monitor_tab.rs b/console_backend/src/advanced_system_monitor_tab.rs index 27e8d2912..51dbfd3a9 100644 --- a/console_backend/src/advanced_system_monitor_tab.rs +++ b/console_backend/src/advanced_system_monitor_tab.rs @@ -97,12 +97,11 @@ impl AdvancedSystemMonitorTab { } pub fn handle_thread_state(&mut self, msg: MsgThreadState) { - let mut name = msg.name.to_string(); - if name.is_empty() { - name = NO_NAME.to_string(); + let name = if msg.name.as_bytes().iter().all(|b| b == &0) { + NO_NAME.to_string() } else { - name = name.trim_end_matches('\0').to_string(); - } + msg.name.to_string().trim_end_matches('\0').to_string() + }; let thread_state = ThreadStateFields { name, cpu: OrderedFloat::from(normalize_cpu_usage(msg.cpu)), @@ -163,8 +162,7 @@ impl AdvancedSystemMonitorTab { sender_id: Some(WRITE_TO_DEVICE_SENDER_ID), flags: 0, }; - let msg = sbp::messages::SBP::from(msg); - self.wtr.send(msg)?; + self.wtr.send(msg.into())?; Ok(()) } @@ -432,37 +430,46 @@ mod tests { let client_send = TestSender { inner: Vec::new() }; let wtr = MsgSender::new(sink()); let mut tab = AdvancedSystemMonitorTab::new(shared_state, client_send, wtr); - let name1 = "mcdonald".to_string(); + let name1 = thread_name("mcdonald"); let msg1 = MsgThreadState { sender_id: Some(1337), - name: SbpString::from(name1.clone()), + name: name1.clone(), cpu: 66, stack_free: 13, }; assert!(tab.threads.is_empty()); tab.handle_thread_state(msg1); assert_eq!(tab.threads.len(), 1); - let name2 = NO_NAME.to_string(); + let name2 = thread_name(NO_NAME); let msg2 = MsgThreadState { sender_id: Some(1337), - name: SbpString::from("".to_string()), + name: SbpString::new([0u8; 20]), cpu: 6, stack_free: 133, }; tab.handle_thread_state(msg2); assert_eq!(tab.threads.len(), 2); - let name3 = "farm".to_string(); + let name3 = thread_name("farm"); let msg3 = MsgThreadState { sender_id: Some(1337), - name: SbpString::from(format!("{}\0\0\0\0\0", name3)), + name: name3.clone(), cpu: 667, stack_free: 133, }; tab.handle_thread_state(msg3); assert_eq!(tab.threads.len(), 3); - assert_eq!(tab.threads[0].name, name1); - assert_eq!(tab.threads[1].name, name2); - assert_eq!(tab.threads[2].name, name3); + assert_eq!( + tab.threads[0].name, + name1.to_string().trim_end_matches('\0') + ); + assert_eq!( + tab.threads[1].name, + name2.to_string().trim_end_matches('\0') + ); + assert_eq!( + tab.threads[2].name, + name3.to_string().trim_end_matches('\0') + ); } #[test] @@ -474,26 +481,26 @@ mod tests { assert!(tab.threads_table_list.is_empty()); tab.handle_heartbeat(); assert!(tab.threads_table_list.is_empty()); - let name1 = "mcdonald".to_string(); + let name1 = thread_name("mcdonald"); let msg1 = MsgThreadState { sender_id: Some(1337), - name: SbpString::from(name1.clone()), + name: name1.clone(), cpu: 66, stack_free: 13, }; tab.handle_thread_state(msg1.clone()); - let name2 = NO_NAME.to_string(); + let name2 = thread_name(NO_NAME); let msg2 = MsgThreadState { sender_id: Some(1337), - name: SbpString::from("".to_string()), + name: SbpString::new([0u8; 20]), cpu: 6, stack_free: 133, }; tab.handle_thread_state(msg2.clone()); - let name3 = "farm".to_string(); + let name3 = thread_name("farm"); let msg3 = MsgThreadState { sender_id: Some(1337), - name: SbpString::from(format!("{}\0\0\0\0\0", name3)), + name: name3.clone(), cpu: 667, stack_free: 133, }; @@ -503,23 +510,37 @@ mod tests { tab.handle_heartbeat(); assert!(tab.threads.is_empty()); assert!(!tab.threads_table_list.is_empty()); - assert_eq!(tab.threads_table_list[0].name, name3); + assert_eq!( + tab.threads_table_list[0].name, + name3.to_string().trim_end_matches('\0') + ); assert_eq!( tab.threads_table_list[0].cpu, OrderedFloat(msg3.cpu as f64 / 10.0) ); assert_eq!(tab.threads_table_list[0].stack_free, msg3.stack_free); - assert_eq!(tab.threads_table_list[1].name, name1); + assert_eq!( + tab.threads_table_list[1].name, + name1.to_string().trim_end_matches('\0') + ); assert_eq!( tab.threads_table_list[1].cpu, OrderedFloat(msg1.cpu as f64 / 10.0) ); assert_eq!(tab.threads_table_list[1].stack_free, msg1.stack_free); - assert_eq!(tab.threads_table_list[2].name, name2); + assert_eq!( + tab.threads_table_list[2].name, + name2.to_string().trim_end_matches('\0') + ); assert_eq!( tab.threads_table_list[2].cpu, OrderedFloat(msg2.cpu as f64 / 10.0) ); assert_eq!(tab.threads_table_list[2].stack_free, msg2.stack_free); } + fn thread_name(name: &str) -> SbpString<[u8; 20], sbp::sbp_string::NullTerminated> { + let mut arr = [0u8; 20]; + arr[0..name.len()].copy_from_slice(name.as_bytes()); + SbpString::new(arr) + } } diff --git a/console_backend/src/baseline_tab.rs b/console_backend/src/baseline_tab.rs index a74b4cfa4..f1b7c33fe 100644 --- a/console_backend/src/baseline_tab.rs +++ b/console_backend/src/baseline_tab.rs @@ -251,10 +251,10 @@ impl BaselineTab { } } - /// Handle MsgBaselineNED / MsgBaselineNEDDepA messages. + /// Handle MsgBaselineNed / MsgBaselineNedDepA messages. /// /// # Parameters - /// - `msg`: MsgBaselineNED / MsgBaselineNEDDepA to extract data from. + /// - `msg`: MsgBaselineNed / MsgBaselineNedDepA to extract data from. pub fn handle_baseline_ned(&mut self, msg: BaselineNED) { let baseline_ned_fields = msg.fields(); let n = mm_to_m(baseline_ned_fields.n as f64); @@ -402,8 +402,7 @@ impl BaselineTab { sender_id: Some(WRITE_TO_DEVICE_SENDER_ID), filter: 0, }; - let msg = sbp::messages::SBP::from(msg); - self.wtr.send(msg)?; + self.wtr.send(msg.into())?; Ok(()) } @@ -519,7 +518,7 @@ mod tests { use super::*; use crate::types::TestSender; use chrono::{TimeZone, Utc}; - use sbp::messages::navigation::{MsgBaselineNED, MsgBaselineNEDDepA, MsgGPSTime}; + use sbp::messages::navigation::{MsgBaselineNed, MsgBaselineNedDepA, MsgGpsTime}; use std::io::sink; #[test] fn handle_age_corrections_test() { @@ -557,7 +556,7 @@ mod tests { let wn = 0_u16; let ns_residual = 1337_i32; let bad_flags = 0_u8; - let msg = MsgGPSTime { + let msg = MsgGpsTime { sender_id: Some(1337), wn, tow: 0, @@ -573,7 +572,7 @@ mod tests { assert_eq!(baseline_table.nsec, Some(old_nsec)); let good_flags = 1_u8; - let msg = MsgGPSTime { + let msg = MsgGpsTime { sender_id: Some(1337), wn, tow: 0, @@ -696,7 +695,7 @@ mod tests { let h_accuracy = 0; let v_accuracy = 0; let tow = 1337; - let msg = BaselineNED::MsgBaselineNED(MsgBaselineNED { + let msg = BaselineNED::MsgBaselineNed(MsgBaselineNed { sender_id: Some(1337), flags: bad_flags, n, @@ -763,7 +762,7 @@ mod tests { baseline_tab.handle_age_corrections(msg); let good_flags = 0x02; - let msg = BaselineNED::MsgBaselineNED(MsgBaselineNED { + let msg = BaselineNED::MsgBaselineNed(MsgBaselineNed { sender_id: Some(1337), flags: good_flags, n, @@ -812,7 +811,7 @@ mod tests { assert_eq!(baseline_tab.last_mode, 2); - let msg = BaselineNED::MsgBaselineNEDDepA(MsgBaselineNEDDepA { + let msg = BaselineNED::MsgBaselineNedDepA(MsgBaselineNedDepA { sender_id: Some(1337), flags: good_flags, n, diff --git a/console_backend/src/bin/fft_monitor.rs b/console_backend/src/bin/fft_monitor.rs index 166ee94df..f8ebf3eb2 100644 --- a/console_backend/src/bin/fft_monitor.rs +++ b/console_backend/src/bin/fft_monitor.rs @@ -1,7 +1,7 @@ use anyhow::Context; use clap::Clap; use crossbeam::{channel, scope}; -use sbp::{messages::piksi::MsgSpecan, sbp_tools::SBPTools}; +use sbp::messages::piksi::MsgSpecan; use console_backend::{ broadcaster::Broadcaster, connection::Connection, fft_monitor::FftMonitor, types::Result, @@ -38,6 +38,7 @@ impl CliFftMonitor { #[cfg(feature = "fft")] fn main() -> Result<()> { use console_backend::types::Specan; + use sbp::SbpIterExt; use serde_pickle::ser; use std::{fs::File, thread::sleep, time::Duration}; diff --git a/console_backend/src/bin/fileio.rs b/console_backend/src/bin/fileio.rs index d3157668a..e8d70115d 100644 --- a/console_backend/src/bin/fileio.rs +++ b/console_backend/src/bin/fileio.rs @@ -5,7 +5,7 @@ use std::{ use clap::Clap; use crossbeam::{channel, scope}; -use sbp::{link::LinkSource, sbp_tools::SBPTools}; +use sbp::{link::LinkSource, SbpIterExt}; use console_backend::{ cli_options::Input, diff --git a/console_backend/src/broadcaster.rs b/console_backend/src/broadcaster.rs index e74516c18..514849ebe 100644 --- a/console_backend/src/broadcaster.rs +++ b/console_backend/src/broadcaster.rs @@ -1,12 +1,13 @@ -use std::{convert::TryInto, marker::PhantomData, sync::Arc, time::Duration}; +use std::{marker::PhantomData, sync::Arc, time::Duration}; use crossbeam::channel; use parking_lot::Mutex; use sbp::{ - messages::{ConcreteMessage, SBPMessage, SBP}, + link::Event, time::{GpsTime, GpsTimeError}, + Sbp, SbpMessage, }; -use slotmap::{DenseSlotMap, HopSlotMap}; +use slotmap::HopSlotMap; type MaybeGpsTime = Option>; @@ -21,8 +22,8 @@ impl Broadcaster { } } - pub fn send(&self, message: &SBP, gps_time: MaybeGpsTime) { - let msg_type = message.get_message_type(); + pub fn send(&self, message: &Sbp, gps_time: MaybeGpsTime) { + let msg_type = message.message_type(); let mut channels = self.channels.lock(); channels.retain(|_, chan| { if chan.msg_types.iter().any(|ty| ty == &msg_type) { @@ -83,13 +84,13 @@ impl Default for Broadcaster { /// A wrapper around a channel sender that knows what message types its receivers expect. struct Sender { - inner: channel::Sender<(SBP, MaybeGpsTime)>, + inner: channel::Sender<(Sbp, MaybeGpsTime)>, msg_types: &'static [u16], } /// A wrapper around a channel receiver that converts to the appropriate event. pub struct Receiver { - inner: channel::Receiver<(SBP, MaybeGpsTime)>, + inner: channel::Receiver<(Sbp, MaybeGpsTime)>, marker: PhantomData, } @@ -136,231 +137,17 @@ where // other channel methods as needed } -/// An event you can receive via a `Broadcaster`. It's implemented for all SBP -/// message types, but could also be implemented for composite messages like `Observations`. -pub trait Event { - /// The message types from which the event can be derived. - const MESSAGE_TYPES: &'static [u16]; - - /// Conversion from SBP. The message type of `msg` is guaranteed to be in - /// `Self::MESSAGE_TYPES`. - fn from_sbp(msg: SBP) -> Self; -} - -// All concrete message types can be used as events. -impl Event for T -where - T: ConcreteMessage, -{ - const MESSAGE_TYPES: &'static [u16] = &[T::MESSAGE_TYPE]; - - fn from_sbp(msg: SBP) -> Self { - msg.try_into().unwrap() - } -} - -pub trait Handler { - fn run(&mut self, event: Event, time: MaybeGpsTime); -} - -pub struct WithTime; - -impl Handler for F -where - F: FnMut(E, MaybeGpsTime), - E: Event, -{ - fn run(&mut self, event: E, time: MaybeGpsTime) { - (self)(event, time) - } -} - -pub struct WithoutTime; - -impl Handler for F -where - F: FnMut(E), - E: Event, -{ - fn run(&mut self, event: E, _time: MaybeGpsTime) { - (self)(event) - } -} - -pub struct OnlyTime; - -impl Handler for F -where - F: FnMut(GpsTime), - E: Event, -{ - fn run(&mut self, _event: E, time: MaybeGpsTime) { - if let Some(Ok(time)) = time { - (self)(time) - } - } -} - -enum Callback<'a> { - Id { - func: Box, - msg_type: u16, - }, - Event { - func: Box, - msg_types: &'static [u16], - }, -} - -impl<'a> Callback<'a> { - fn run(&mut self, msg: SBP, time: MaybeGpsTime) { - match self { - Callback::Id { func, .. } | Callback::Event { func, .. } => (func)(msg, time), - } - } - - fn should_run(&self, msg: u16) -> bool { - match self { - Callback::Id { msg_type, .. } => msg_type == &msg, - Callback::Event { msg_types, .. } => msg_types.contains(&msg), - } - } -} - -pub fn with_link<'env, F>(f: F) -where - F: FnOnce(&LinkSource<'env>), -{ - let source: LinkSource<'env> = LinkSource { link: Link::new() }; - f(&source); -} - -pub struct LinkSource<'env> { - link: Link<'env>, -} - -impl<'env> LinkSource<'env> { - pub fn link<'scope>(&self) -> Link<'scope> - where - 'env: 'scope, - { - let link: Link<'scope> = unsafe { std::mem::transmute(self.link.clone()) }; - link - } - - pub fn send(&self, message: &SBP, gps_time: MaybeGpsTime) -> bool { - self.link.send(message, gps_time) - } -} - -impl<'env> Drop for LinkSource<'env> { - fn drop(&mut self) { - self.link.callbacks.lock().clear(); - } -} - -pub struct Link<'a> { - callbacks: Arc>>>, -} - -impl<'a> Link<'a> { - pub fn new() -> Self { - Self { - callbacks: Arc::new(Mutex::new(DenseSlotMap::with_key())), - } - } - - pub fn send(&self, message: &SBP, gps_time: MaybeGpsTime) -> bool { - let msg_type = message.get_message_type(); - let mut cbs = self.callbacks.lock(); - let to_call = cbs.values_mut().filter(|cb| cb.should_run(msg_type)); - let mut called = false; - for cb in to_call { - cb.run(message.clone(), gps_time.clone()); - called = true; - } - called - } - - pub fn register_cb_by_id(&self, id: u16, mut handler: H) -> Key - where - H: FnMut(SBP) + Send + 'a, - { - let mut cbs = self.callbacks.lock(); - let inner = cbs.insert(Callback::Id { - func: Box::new(move |msg, _time| (handler)(msg)), - msg_type: id, - }); - Key { inner } - } - - pub fn register_cb(&self, mut handler: H) -> Key - where - H: Handler + Send + 'a, - E: Event, - { - let mut cbs = self.callbacks.lock(); - let inner = cbs.insert(Callback::Event { - func: Box::new(move |msg, time| { - let event = E::from_sbp(msg); - handler.run(event, time) - }), - msg_types: E::MESSAGE_TYPES, - }); - Key { inner } - } - - pub fn unregister_cb(&self, key: Key) { - let mut cbs = self.callbacks.lock(); - cbs.remove(key.inner); - } -} - -impl Clone for Link<'_> { - fn clone(&self) -> Self { - Self { - callbacks: Arc::clone(&self.callbacks), - } - } -} - -impl<'a> Default for Link<'a> { - fn default() -> Self { - Self::new() - } -} - #[cfg(test)] mod tests { use crossbeam::scope; use sbp::messages::{ self, observation::{MsgObs, MsgObsDepA, ObservationHeader, ObservationHeaderDep}, + ConcreteMessage, }; use super::*; - struct Counter { - count: usize, - } - - impl Counter { - fn obs(&mut self, _: MsgObs) { - self.count += 1; - } - } - - #[test] - fn test_dispatcher() { - let d = Link::new(); - let mut c = Counter { count: 0 }; - d.register_cb(|obs| c.obs(obs)); - d.send(&make_msg_obs(), None); - d.send(&make_msg_obs_dep_a(), None); - drop(d); - assert_eq!(c.count, 1); - } - #[test] fn test_broadcaster() { let b = Broadcaster::new(); @@ -489,20 +276,20 @@ mod tests { impl Event for ObsMsg { const MESSAGE_TYPES: &'static [u16] = &[MsgObs::MESSAGE_TYPE, MsgObsDepA::MESSAGE_TYPE]; - fn from_sbp(msg: SBP) -> Self { + fn from_sbp(msg: Sbp) -> Self { match msg { - SBP::MsgObs(m) => ObsMsg::Obs(m), - SBP::MsgObsDepA(m) => ObsMsg::DepA(m), + Sbp::MsgObs(m) => ObsMsg::Obs(m), + Sbp::MsgObsDepA(m) => ObsMsg::DepA(m), _ => unreachable!("wrong event keys"), } } } - fn make_msg_obs() -> SBP { + fn make_msg_obs() -> Sbp { MsgObs { sender_id: Some(1), header: ObservationHeader { - t: messages::gnss::GPSTime { + t: messages::gnss::GpsTime { tow: 1, ns_residual: 1, wn: 1, @@ -514,11 +301,11 @@ mod tests { .into() } - fn make_msg_obs_dep_a() -> SBP { + fn make_msg_obs_dep_a() -> Sbp { MsgObsDepA { sender_id: Some(1), header: ObservationHeaderDep { - t: messages::gnss::GPSTimeDep { tow: 1, wn: 1 }, + t: messages::gnss::GpsTimeDep { tow: 1, wn: 1 }, n_obs: 1, }, obs: vec![], diff --git a/console_backend/src/fft_monitor.rs b/console_backend/src/fft_monitor.rs index f28c57bd4..fbf7c0217 100644 --- a/console_backend/src/fft_monitor.rs +++ b/console_backend/src/fft_monitor.rs @@ -190,7 +190,7 @@ impl FftMonitor { mod tests { use super::*; use crate::constants::SIGNALS_TOTAL; - use sbp::messages::{gnss::GPSTime, piksi::MsgSpecan}; + use sbp::messages::{gnss::GpsTime, piksi::MsgSpecan}; #[test] fn get_frequencies_test() { @@ -222,7 +222,7 @@ mod tests { fn get_specan_msg(channel_tag: u16, wn: u16, incomplete: bool) -> Specan { let tow = 10001; let ns_residual = 100011; - let t = GPSTime { + let t = GpsTime { tow, ns_residual, wn, diff --git a/console_backend/src/fileio.rs b/console_backend/src/fileio.rs index 5ce986c83..ce7273457 100644 --- a/console_backend/src/fileio.rs +++ b/console_backend/src/fileio.rs @@ -8,13 +8,9 @@ use anyhow::{anyhow, bail}; use crossbeam::{atomic::AtomicCell, channel, scope, select, utils::Backoff}; use rand::Rng; use sbp::link::Link; -use sbp::messages::{ - file_io::{ - MsgFileioConfigReq, MsgFileioConfigResp, MsgFileioReadDirReq, MsgFileioReadDirResp, - MsgFileioReadReq, MsgFileioReadResp, MsgFileioRemove, MsgFileioWriteReq, - MsgFileioWriteResp, - }, - SBP, +use sbp::messages::file_io::{ + MsgFileioConfigReq, MsgFileioConfigResp, MsgFileioReadDirReq, MsgFileioReadDirResp, + MsgFileioReadReq, MsgFileioReadResp, MsgFileioRemove, MsgFileioWriteReq, MsgFileioWriteResp, }; use crate::errors::FILEIO_CHANNEL_SEND_FAILURE; @@ -55,13 +51,16 @@ impl<'a> Fileio<'a> { let sender = self.sender.clone(); let send_msg = move |sequence, offset| { - sender.send(SBP::from(MsgFileioReadReq { - sender_id: None, - filename: path.clone().into(), - chunk_size: READ_CHUNK_SIZE as u8, - sequence, - offset, - })) + sender.send( + MsgFileioReadReq { + sender_id: None, + filename: path.clone().into(), + chunk_size: READ_CHUNK_SIZE as u8, + sequence, + offset, + } + .into(), + ) }; let (stop_req_tx, stop_req_rx) = channel::bounded(0); @@ -209,13 +208,16 @@ impl<'a> Fileio<'a> { let sender = self.sender.clone(); let send_msg = |state: &WriteState, req: &WriteReq| { - sender.send(SBP::from(MsgFileioWriteReq { - sender_id: None, - sequence: state.sequence, - offset: state.offset as u32, - filename: state.filename(), - data: data[req.offset..req.end_offset].to_vec(), - })) + sender.send( + MsgFileioWriteReq { + sender_id: None, + sequence: state.sequence, + offset: state.offset as u32, + filename: state.filename().into(), + data: data[req.offset..req.end_offset].to_vec(), + } + .into(), + ) }; let data_len = data.len(); @@ -302,12 +304,15 @@ impl<'a> Fileio<'a> { tx.send(msg).expect(FILEIO_CHANNEL_SEND_FAILURE); }); - self.sender.send(SBP::from(MsgFileioReadDirReq { - sender_id: None, - sequence: seq, - offset: files.len() as u32, - dirname: path.clone().into(), - }))?; + self.sender.send( + MsgFileioReadDirReq { + sender_id: None, + sequence: seq, + offset: files.len() as u32, + dirname: path.clone().into(), + } + .into(), + )?; loop { select! { @@ -332,12 +337,12 @@ impl<'a> Fileio<'a> { files.push(String::from_utf8_lossy(f).into_owned()); } seq += 1; - self.sender.send(SBP::from(MsgFileioReadDirReq { + self.sender.send(MsgFileioReadDirReq { sender_id: None, sequence: seq, offset: files.len() as u32, dirname: path.clone().into(), - }))?; + }.into())?; }, recv(channel::tick(READDIR_TIMEOUT)) -> _ => { self.link.unregister(key); @@ -348,10 +353,13 @@ impl<'a> Fileio<'a> { } pub fn remove(&self, filename: String) -> Result<()> { - self.sender.send(SBP::from(MsgFileioRemove { - sender_id: None, - filename: filename.into(), - }))?; + self.sender.send( + MsgFileioRemove { + sender_id: None, + filename: filename.into(), + } + .into(), + )?; Ok(()) } @@ -379,10 +387,13 @@ impl<'a> Fileio<'a> { let config = scope(|s| { s.spawn(|_| { while stop_rx.try_recv().is_err() { - let _ = sender.send(SBP::from(MsgFileioConfigReq { - sender_id: None, - sequence, - })); + let _ = sender.send( + MsgFileioConfigReq { + sender_id: None, + sequence, + } + .into(), + ); std::thread::sleep(CONFIG_REQ_RETRY); } }); @@ -434,8 +445,8 @@ impl WriteState { } } - fn filename(&self) -> sbp::SbpString { - self.filename.clone().into() + fn filename(&self) -> String { + self.filename.to_string() } fn update(&mut self, chunk_len: usize) { diff --git a/console_backend/src/main_tab.rs b/console_backend/src/main_tab.rs index bd40be2d7..5aad44d3f 100644 --- a/console_backend/src/main_tab.rs +++ b/console_backend/src/main_tab.rs @@ -2,7 +2,7 @@ use std::{path::PathBuf, result::Result, thread::sleep, time::Instant}; use chrono::Local; use log::{debug, error}; -use sbp::{messages::SBP, time::GpsTime}; +use sbp::{time::GpsTime, Sbp}; use crate::common_constants::SbpLogging; use crate::constants::{ @@ -134,7 +134,7 @@ impl<'a, S: CapnProtoSender> MainTab { }; self.shared_state.set_sbp_logging(logging); } - pub fn serialize_sbp(&mut self, msg: &SBP) { + pub fn serialize_sbp(&mut self, msg: &Sbp) { let csv_logging; let sbp_logging; let directory; @@ -198,7 +198,7 @@ mod tests { use crate::types::{BaselineNED, MsgSender, PosLLH, TestSender, VelNED}; use crate::utils::{mm_to_m, ms_to_sec}; use glob::glob; - use sbp::messages::navigation::{MsgBaselineNED, MsgPosLLH, MsgVelNED}; + use sbp::messages::navigation::{MsgBaselineNed, MsgPosLlh, MsgVelNed}; use std::{ fs::File, io::{sink, BufRead, BufReader}, @@ -280,7 +280,7 @@ mod tests { let tow = 1337; let sender_id = Some(1337); - let msg = MsgPosLLH { + let msg = MsgPosLlh { sender_id, tow, lat, @@ -295,7 +295,7 @@ mod tests { let n = 1; let e = 2; let d = 3; - let msg_two = MsgVelNED { + let msg_two = MsgVelNed { sender_id, tow, n, @@ -311,7 +311,7 @@ mod tests { let e_m3 = 5; let d_m3 = 6; let flags = 0x2; - let msg_three = MsgBaselineNED { + let msg_three = MsgBaselineNed { sender_id, tow, n, @@ -324,15 +324,15 @@ mod tests { }; { - main.serialize_sbp(&SBP::MsgPosLLH(msg.clone())); - solution_tab.handle_pos_llh(PosLLH::MsgPosLLH(msg)); - main.serialize_sbp(&SBP::MsgVelNED(msg_two.clone())); - solution_tab.handle_vel_ned(VelNED::MsgVelNED(msg_two.clone())); - main.serialize_sbp(&SBP::MsgBaselineNED(msg_three.clone())); - baseline_tab.handle_baseline_ned(BaselineNED::MsgBaselineNED(msg_three)); + main.serialize_sbp(&Sbp::MsgPosLlh(msg.clone())); + solution_tab.handle_pos_llh(PosLLH::MsgPosLlh(msg)); + main.serialize_sbp(&Sbp::MsgVelNed(msg_two.clone())); + solution_tab.handle_vel_ned(VelNED::MsgVelNed(msg_two.clone())); + main.serialize_sbp(&Sbp::MsgBaselineNed(msg_three.clone())); + baseline_tab.handle_baseline_ned(BaselineNED::MsgBaselineNed(msg_three)); assert_eq!(main.last_csv_logging, CsvLogging::ON); main.end_csv_logging().unwrap(); - main.serialize_sbp(&SBP::MsgVelNED(msg_two)); + main.serialize_sbp(&Sbp::MsgVelNed(msg_two)); assert_eq!(main.last_csv_logging, CsvLogging::OFF); } @@ -410,7 +410,7 @@ mod tests { let tow = 1337; let sender_id = Some(1337); - let msg_one = MsgPosLLH { + let msg_one = MsgPosLlh { sender_id, tow, lat, @@ -425,7 +425,7 @@ mod tests { let n = 1; let e = 2; let d = 3; - let msg_two = MsgVelNED { + let msg_two = MsgVelNed { sender_id, tow, n, @@ -438,11 +438,11 @@ mod tests { }; { - main.serialize_sbp(&SBP::MsgPosLLH(msg_one.clone())); - main.serialize_sbp(&SBP::MsgVelNED(msg_two.clone())); + main.serialize_sbp(&Sbp::MsgPosLlh(msg_one.clone())); + main.serialize_sbp(&Sbp::MsgVelNed(msg_two.clone())); assert_eq!(main.last_sbp_logging, SbpLogging::SBP); main.close_sbp(); - main.serialize_sbp(&SBP::MsgVelNED(msg_two.clone())); + main.serialize_sbp(&Sbp::MsgVelNed(msg_two.clone())); assert_eq!(main.last_sbp_logging, SbpLogging::OFF); } @@ -456,7 +456,7 @@ mod tests { let mut messages = sbp::iter_messages(file_read); let msg = messages.next().unwrap().unwrap(); match msg { - SBP::MsgPosLLH(msg) => { + Sbp::MsgPosLlh(msg) => { assert_eq!(msg.sender_id, msg_one.sender_id); assert_eq!(msg.flags, msg_one.flags); assert_eq!(msg.tow, msg_one.tow); @@ -468,7 +468,7 @@ mod tests { } let msg = messages.next().unwrap().unwrap(); match msg { - SBP::MsgVelNED(msg) => { + Sbp::MsgVelNed(msg) => { assert_eq!(msg.sender_id, msg_two.sender_id); assert_eq!(msg.flags, msg_two.flags); assert_eq!(msg.n, msg_two.n); @@ -500,7 +500,7 @@ mod tests { let tow = 1337; let sender_id = Some(1337); - let msg_one = MsgPosLLH { + let msg_one = MsgPosLlh { sender_id, tow, lat, @@ -515,7 +515,7 @@ mod tests { let n = 1; let e = 2; let d = 3; - let msg_two = MsgVelNED { + let msg_two = MsgVelNed { sender_id, tow, n, @@ -528,11 +528,11 @@ mod tests { }; { - main.serialize_sbp(&SBP::MsgPosLLH(msg_one)); - main.serialize_sbp(&SBP::MsgVelNED(msg_two.clone())); + main.serialize_sbp(&Sbp::MsgPosLlh(msg_one)); + main.serialize_sbp(&Sbp::MsgVelNed(msg_two.clone())); assert_eq!(main.last_sbp_logging, SbpLogging::SBP_JSON); main.close_sbp(); - main.serialize_sbp(&SBP::MsgVelNED(msg_two)); + main.serialize_sbp(&Sbp::MsgVelNed(msg_two)); assert_eq!(main.last_sbp_logging, SbpLogging::OFF); } diff --git a/console_backend/src/output.rs b/console_backend/src/output.rs index 3f28c3724..03800bff0 100644 --- a/console_backend/src/output.rs +++ b/console_backend/src/output.rs @@ -1,11 +1,6 @@ -use sbp::{ - codec::{ - dencode::{FramedWrite, IterSinkExt}, - json::JsonEncoder, - sbp::SbpEncoder, - }, - messages::SBP, -}; +use sbp::json::JsonEncoder; +use sbp::Sbp; +use sbp::SbpEncoder; use serde::Serialize; use serde_json::ser::CompactFormatter; use std::{fs::File, path::Path}; @@ -32,20 +27,20 @@ impl CsvLogging { pub type SbpLogging = cc::SbpLogging; pub enum SbpLogger { - Sbp(FramedWrite), - Json(FramedWrite>), + Sbp(SbpEncoder), + Json(JsonEncoder), } impl SbpLogger { pub fn new_sbp>(filepath: P) -> Result { - Ok(SbpLogger::Sbp(SbpEncoder::framed(File::create(filepath)?))) + Ok(SbpLogger::Sbp(SbpEncoder::new(File::create(filepath)?))) } pub fn new_sbp_json>(filepath: P) -> Result { - Ok(SbpLogger::Json(JsonEncoder::framed( + Ok(SbpLogger::Json(JsonEncoder::new( File::create(filepath)?, CompactFormatter, ))) } - pub fn serialize(&mut self, msg: &SBP) -> Result<()> { + pub fn serialize(&mut self, msg: &Sbp) -> Result<()> { match self { SbpLogger::Sbp(logger) => { logger.send(msg)?; @@ -201,7 +196,7 @@ mod tests { age: 0xFFFF, tow: 0, }; - let msg_one_wrapped = SBP::MsgAgeCorrections(msg_one.clone()); + let msg_one_wrapped = Sbp::MsgAgeCorrections(msg_one.clone()); let msg_two = MsgInsUpdates { sender_id: Some(1337), gnsspos: 4, @@ -212,7 +207,7 @@ mod tests { zerovel: 0, tow: 0, }; - let msg_two_wrapped = SBP::MsgInsUpdates(msg_two.clone()); + let msg_two_wrapped = Sbp::MsgInsUpdates(msg_two.clone()); { let mut sbp_logger = SbpLogger::new_sbp(&filepath).unwrap(); sbp_logger.serialize(&msg_one_wrapped).unwrap(); @@ -224,7 +219,7 @@ mod tests { let mut messages = sbp::iter_messages(file_read); let msg = messages.next().unwrap().unwrap(); match msg { - SBP::MsgAgeCorrections(msg) => { + Sbp::MsgAgeCorrections(msg) => { assert_eq!(msg.sender_id, msg_one.sender_id); assert_eq!(msg.age, msg_one.age); assert_eq!(msg.tow, msg_one.tow); @@ -233,7 +228,7 @@ mod tests { } let msg = messages.next().unwrap().unwrap(); match msg { - SBP::MsgInsUpdates(msg) => { + Sbp::MsgInsUpdates(msg) => { assert_eq!(msg.sender_id, msg_two.sender_id); assert_eq!(msg.gnsspos, msg_two.gnsspos); assert_eq!(msg.gnssvel, msg_two.gnssvel); diff --git a/console_backend/src/process_messages.rs b/console_backend/src/process_messages.rs index cfe2ddb27..a67ae921e 100644 --- a/console_backend/src/process_messages.rs +++ b/console_backend/src/process_messages.rs @@ -8,7 +8,7 @@ use sbp::{ imu::{MsgImuAux, MsgImuRaw}, logging::MsgLog, mag::MsgMagRaw, - navigation::{MsgAgeCorrections, MsgPosLLHCov, MsgUtcTime, MsgVelNED}, + navigation::{MsgAgeCorrections, MsgPosLlhCov, MsgUtcTime, MsgVelNed}, observation::{MsgObsDepA, MsgSvAzEl}, orientation::{MsgAngularRate, MsgBaselineHeading, MsgOrientEuler}, piksi::{MsgCommandResp, MsgDeviceMonitor, MsgThreadState}, @@ -16,10 +16,9 @@ use sbp::{ MsgCsacTelemetry, MsgCsacTelemetryLabels, MsgHeartbeat, MsgInsStatus, MsgInsUpdates, }, tracking::{MsgMeasurementState, MsgTrackingState}, - SBPMessage, }, - sbp_tools::{ControlFlow, SBPTools}, - serialize::SbpSerialize, + sbp_iter_ext::{ControlFlow, SbpIterExt}, + SbpMessage, }; use crate::constants::PAUSE_LOOP_SLEEP_DURATION_MS; @@ -57,7 +56,7 @@ where .handle_errors(move |e| { debug!("{}", e); match e { - sbp::Error::IoError(err) => { + sbp::DeserializeError::IoError(err) => { if (*err).kind() == ErrorKind::TimedOut { state.set_running(false, client.clone()); } @@ -209,7 +208,7 @@ where tabs.status_bar.lock().unwrap().handle_pos_llh(msg); }); - link.register(|tabs: &Tabs, msg: MsgPosLLHCov| { + link.register(|tabs: &Tabs, msg: MsgPosLlhCov| { tabs.solution.lock().unwrap().handle_pos_llh_cov(msg); }); @@ -242,7 +241,7 @@ where tabs.solution.lock().unwrap().handle_vel_ned(msg); }); - link.register(|tabs: &Tabs, msg: MsgVelNED| { + link.register(|tabs: &Tabs, msg: MsgVelNed| { // why does this tab not take both VelNED messages? tabs.solution_velocity.lock().unwrap().handle_vel_ned(msg); }); @@ -318,14 +317,14 @@ where tabs.status_bar .lock() .unwrap() - .add_bytes(message.sbp_size()); + .add_bytes(message.encoded_len()); if let RealtimeDelay::On = realtime_delay { if sent { tabs.main.lock().unwrap().realtime_delay(gps_time); } else { debug!( "Message, {}, ignored for realtime delay.", - message.get_message_name() + message.message_name() ); } } diff --git a/console_backend/src/settings_tab.rs b/console_backend/src/settings_tab.rs index e89e60eb4..8d6461a2b 100644 --- a/console_backend/src/settings_tab.rs +++ b/console_backend/src/settings_tab.rs @@ -6,12 +6,12 @@ use std::path::Path; use anyhow::anyhow; use capnp::message::Builder; use ini::Ini; -use libsettings::{Client, SettingKind, SettingValue}; use log::{debug, error, warn}; use parking_lot::{MappedMutexGuard, Mutex, MutexGuard}; use sbp::link::Link; use sbp::messages::piksi::MsgReset; use sbp::messages::settings::MsgSettingsSave; +use sbp_settings::{Client, SettingKind, SettingValue}; use crate::shared_state::SharedState; use crate::types::{CapnProtoSender, Error, MsgSender, Result}; @@ -104,9 +104,10 @@ impl<'link, S: CapnProtoSender> SettingsTab<'link, S> { for (group, prop) in conf.iter() { for (name, value) in prop.iter() { if let Err(e) = self.write_setting(group.unwrap(), name, value) { - match e.downcast_ref::>() { - Some(libsettings::Error::Err(libsettings::WriteSettingError::ReadOnly)) => { - } + match e.downcast_ref::>() { + Some(sbp_settings::Error::Err( + sbp_settings::WriteSettingError::ReadOnly, + )) => {} _ => { self.import_err(&e); return Err(e); @@ -239,7 +240,7 @@ impl<'link, S: CapnProtoSender> SettingsTab<'link, S> { Some(possible_values.to_string()); } - current_setting.value = Some(libsettings::SettingValue::String(setting.value)); + current_setting.value = Some(sbp_settings::SettingValue::String(setting.value)); } } @@ -361,7 +362,7 @@ struct Settings { impl Settings { fn new() -> Self { - let mut settings: Vec<_> = libsettings::settings().iter().collect(); + let mut settings: Vec<_> = sbp_settings::settings().iter().collect(); settings.sort_by_key(|s| &s.group); Self { inner: settings @@ -374,7 +375,7 @@ impl Settings { } } - fn groups(&self) -> Vec> { + fn groups(&self) -> Vec> { self.inner.values().fold(Vec::new(), |mut groups, group| { let group: Vec<_> = group .values() @@ -431,12 +432,12 @@ impl std::ops::Deref for Settings { /// A reference to a particular setting and its value if it has been fetched #[derive(Debug)] struct Setting { - setting: Cow<'static, libsettings::Setting>, - value: Option, + setting: Cow<'static, sbp_settings::Setting>, + value: Option, } impl Setting { - fn new(setting: &'static libsettings::Setting) -> Self { + fn new(setting: &'static sbp_settings::Setting) -> Self { Self { setting: Cow::Borrowed(setting), value: None, diff --git a/console_backend/src/solution_tab.rs b/console_backend/src/solution_tab.rs index cd7677a10..d00fd7eb8 100644 --- a/console_backend/src/solution_tab.rs +++ b/console_backend/src/solution_tab.rs @@ -1,7 +1,7 @@ use capnp::message::Builder; use sbp::messages::{ - navigation::{MsgAgeCorrections, MsgPosLLHCov, MsgUtcTime}, + navigation::{MsgAgeCorrections, MsgPosLlhCov, MsgUtcTime}, orientation::{MsgAngularRate, MsgOrientEuler}, system::{MsgInsStatus, MsgInsUpdates}, }; @@ -231,8 +231,8 @@ impl SolutionTab { /// Handler for POS LLH COV covariance messages. /// /// # Parameters - /// - `msg`: MsgPosLLHCov to extract data from. - pub fn handle_pos_llh_cov(&mut self, msg: MsgPosLLHCov) { + /// - `msg`: MsgPosLlhCov to extract data from. + pub fn handle_pos_llh_cov(&mut self, msg: MsgPosLlhCov) { if msg.flags != 0 { self.table.insert(COV_N_N, format!("{}", msg.cov_n_n)); self.table.insert(COV_N_E, format!("{}", msg.cov_n_e)); @@ -253,7 +253,7 @@ impl SolutionTab { /// Handle Vel NED / NEDDepA messages. /// /// # Parameters - /// - `msg`: VelNED wrapper around a MsgVelNED or MsgVELNEDDepA. + /// - `msg`: VelNED wrapper around a MsgVelNed or MsgVELNEDDepA. pub fn handle_vel_ned(&mut self, msg: VelNED) { let vel_ned_fields = msg.fields(); let speed: f64 = mm_to_m(f64::sqrt( @@ -767,8 +767,8 @@ mod tests { use crate::types::TestSender; use chrono::{TimeZone, Utc}; use sbp::messages::navigation::{ - MsgAgeCorrections, MsgDops, MsgDopsDepA, MsgGPSTime, MsgPosLLH, MsgPosLLHDepA, MsgVelNED, - MsgVelNEDDepA, + MsgAgeCorrections, MsgDops, MsgDopsDepA, MsgGpsTime, MsgPosLlh, MsgPosLlhDepA, MsgVelNed, + MsgVelNedDepA, }; use std::{thread::sleep, time::Duration}; @@ -840,7 +840,7 @@ mod tests { let wn = 0_u16; let ns_residual = 1337_i32; let bad_flags = 0_u8; - let msg = MsgGPSTime { + let msg = MsgGpsTime { sender_id: Some(1337), wn, tow: 0, @@ -856,7 +856,7 @@ mod tests { assert_eq!(solution_table.nsec, Some(old_nsec)); let good_flags = 1_u8; - let msg = MsgGPSTime { + let msg = MsgGpsTime { sender_id: Some(1337), wn, tow: 0, @@ -879,7 +879,7 @@ mod tests { let e = 2; let d = 3; let n_sats = 13; - let msg = VelNED::MsgVelNED(MsgVelNED { + let msg = VelNED::MsgVelNed(MsgVelNed { sender_id: Some(1337), flags: bad_flags, n, @@ -902,7 +902,7 @@ mod tests { assert_eq!(solution_tab.table[VEL_N], String::from(EMPTY_STR)); assert_eq!(solution_tab.table[VEL_E], String::from(EMPTY_STR)); assert_eq!(solution_tab.table[VEL_D], String::from(EMPTY_STR)); - let msg = VelNED::MsgVelNED(MsgVelNED { + let msg = VelNED::MsgVelNed(MsgVelNed { sender_id: Some(1337), flags: good_flags, n, @@ -933,7 +933,7 @@ mod tests { let n = 3; let e = 2; let d = 1; - let msg = VelNED::MsgVelNEDDepA(MsgVelNEDDepA { + let msg = VelNED::MsgVelNedDepA(MsgVelNedDepA { sender_id: Some(1337), flags: good_flags, n, @@ -1155,7 +1155,7 @@ mod tests { let h_accuracy = 0; let v_accuracy = 0; let tow = 1337; - let msg = PosLLH::MsgPosLLH(MsgPosLLH { + let msg = PosLLH::MsgPosLlh(MsgPosLlh { sender_id: Some(1337), flags: bad_flags, lat, @@ -1194,7 +1194,7 @@ mod tests { assert_eq!(solution_tab.last_pos_mode, 0); let good_flags = 0x01; - let msg = PosLLH::MsgPosLLH(MsgPosLLH { + let msg = PosLLH::MsgPosLlh(MsgPosLlh { sender_id: Some(1337), flags: good_flags, lat, @@ -1232,7 +1232,7 @@ mod tests { assert_eq!(solution_tab.last_pos_mode, 1); - let msg = PosLLH::MsgPosLLHDepA(MsgPosLLHDepA { + let msg = PosLLH::MsgPosLlhDepA(MsgPosLlhDepA { sender_id: Some(1337), flags: good_flags, lat, diff --git a/console_backend/src/solution_velocity_tab.rs b/console_backend/src/solution_velocity_tab.rs index 49d57ca52..ff99da555 100644 --- a/console_backend/src/solution_velocity_tab.rs +++ b/console_backend/src/solution_velocity_tab.rs @@ -1,7 +1,7 @@ use ordered_float::OrderedFloat; use std::str::FromStr; -use sbp::messages::navigation::MsgVelNED; +use sbp::messages::navigation::MsgVelNed; use capnp::message::Builder; @@ -81,12 +81,12 @@ impl SolutionVelocityTab { self.unit = new_unit; } - /// Handle MsgVelNED message states. + /// Handle MsgVelNed message states. /// /// # Parameters: /// /// - `msg`: The message to update set of points with. - pub fn handle_vel_ned(&mut self, msg: MsgVelNED) { + pub fn handle_vel_ned(&mut self, msg: MsgVelNed) { let n = msg.n as f64; let e = msg.e as f64; let d = msg.d as f64; @@ -178,7 +178,7 @@ mod tests { let client_send = TestSender { inner: Vec::new() }; let mut solution_velocity_tab = SolutionVelocityTab::new(shared_state, client_send); - let msg: MsgVelNED = MsgVelNED { + let msg: MsgVelNed = MsgVelNed { sender_id: Some(5), n: 6, e: 66, @@ -198,7 +198,7 @@ mod tests { assert_eq!(vpoints.len(), 1); assert!((*hpoints[0].1 - 0.06627216610312357) <= f64::EPSILON); assert!((*vpoints[0].1 - (-0.666)) <= f64::EPSILON); - let msg = MsgVelNED { + let msg = MsgVelNed { sender_id: Some(5), n: 1, e: 133, @@ -216,7 +216,7 @@ mod tests { assert_eq!(vpoints.len(), 2); assert!(f64::abs(*hpoints[1].1 - 0.13300375934536587) <= f64::EPSILON); assert!(f64::abs(*vpoints[1].1 - (-1.337)) <= f64::EPSILON); - let msg = MsgVelNED { + let msg = MsgVelNed { sender_id: Some(5), n: 7, e: 67, @@ -242,7 +242,7 @@ mod tests { let client_send = TestSender { inner: Vec::new() }; let mut solution_velocity_tab = SolutionVelocityTab::new(shared_state, client_send); - let mut msg: MsgVelNED = MsgVelNED { + let mut msg: MsgVelNed = MsgVelNed { sender_id: Some(5), n: 6, e: 66, @@ -255,7 +255,7 @@ mod tests { }; solution_velocity_tab.handle_vel_ned(msg); - msg = MsgVelNED { + msg = MsgVelNed { sender_id: Some(5), n: 1, e: 133, diff --git a/console_backend/src/tracking_signals_tab.rs b/console_backend/src/tracking_signals_tab.rs index 1b8f10e80..c0e8c0d7e 100644 --- a/console_backend/src/tracking_signals_tab.rs +++ b/console_backend/src/tracking_signals_tab.rs @@ -439,7 +439,7 @@ mod tests { use super::*; use crate::types::TestSender; use sbp::messages::{ - gnss::{CarrierPhase, GPSTime, GnssSignal}, + gnss::{CarrierPhase, GnssSignal, GpsTime}, observation::{Doppler, MsgObs, ObservationHeader, PackedObsContent}, }; @@ -581,7 +581,7 @@ mod tests { sender_id: Some(5), obs: Vec::new(), header: ObservationHeader { - t: GPSTime { + t: GpsTime { tow: 0, ns_residual: 0, wn: 1, @@ -592,9 +592,9 @@ mod tests { let signal_code = 4; let sat = 25; obs_msg.obs.push(PackedObsContent { - P: 0_u32, - L: CarrierPhase { i: 0_i32, f: 0_u8 }, - D: Doppler { i: 0_i16, f: 0_u8 }, + p: 0_u32, + l: CarrierPhase { i: 0_i32, f: 0_u8 }, + d: Doppler { i: 0_i16, f: 0_u8 }, cn0: 5, lock: 0, flags: 1, diff --git a/console_backend/src/types.rs b/console_backend/src/types.rs index 6a63adfdd..cd287f50d 100644 --- a/console_backend/src/types.rs +++ b/console_backend/src/types.rs @@ -21,24 +21,20 @@ use anyhow::Context; use chrono::{DateTime, Utc}; use crossbeam::channel; use ordered_float::OrderedFloat; -use sbp::codec::dencode::{FramedWrite, IterSinkExt}; -use sbp::codec::sbp::SbpEncoder; use sbp::link::Event; -use sbp::messages::piksi::{ - Latency, MsgSpecan, MsgSpecanDep, MsgUartState, MsgUartStateDepa, Period, -}; use sbp::messages::{ navigation::{ - MsgBaselineNED, MsgBaselineNEDDepA, MsgDops, MsgDopsDepA, MsgGPSTime, MsgGPSTimeDepA, - MsgPosLLH, MsgPosLLHDepA, MsgVelNED, MsgVelNEDDepA, + MsgBaselineNed, MsgBaselineNedDepA, MsgDops, MsgDopsDepA, MsgGpsTime, MsgGpsTimeDepA, + MsgPosLlh, MsgPosLlhDepA, MsgVelNed, MsgVelNedDepA, }, observation::{ MsgObs, MsgObsDepB, MsgObsDepC, MsgOsr, PackedObsContent, PackedObsContentDepB, PackedObsContentDepC, PackedOsrContent, }, - SBP, + piksi::{Latency, MsgSpecan, MsgSpecanDep, MsgUartState, MsgUartStateDepa, Period}, + ConcreteMessage, }; -use sbp::messages::{ConcreteMessage, SBPMessage}; +use sbp::{Sbp, SbpEncoder, SbpMessage}; use serialport::FlowControl as SPFlowControl; use std::io; use std::{ @@ -58,9 +54,9 @@ pub type Error = anyhow::Error; pub type Result = anyhow::Result; pub type UtcDateTime = DateTime; -/// Sends SBP messages to the connected device +/// Sends Sbp messages to the connected device pub struct MsgSender { - inner: Arc, SbpEncoder>>>, + inner: Arc>>>, } impl MsgSender { @@ -73,19 +69,16 @@ impl MsgSender { W: io::Write + Send + 'static, { Self { - inner: Arc::new(Mutex::new(FramedWrite::new( - Box::new(wtr), - SbpEncoder::new(), - ))), + inner: Arc::new(Mutex::new(SbpEncoder::new(Box::new(wtr)))), } } - pub fn send(&self, mut msg: SBP) -> Result<()> { - if msg.get_sender_id().is_none() { + pub fn send(&self, mut msg: Sbp) -> Result<()> { + if msg.sender_id().is_none() { msg.set_sender_id(Self::SENDER_ID); } let mut framed = self.inner.lock().expect(Self::LOCK_FAILURE); - framed.send(msg).context("while sending a message")?; + framed.send(&msg).context("while sending a message")?; Ok(()) } } @@ -231,10 +224,10 @@ impl Event for UartState { const MESSAGE_TYPES: &'static [u16] = &[MsgUartState::MESSAGE_TYPE, MsgUartStateDepa::MESSAGE_TYPE]; - fn from_sbp(msg: SBP) -> Self { + fn from_sbp(msg: Sbp) -> Self { match msg { - SBP::MsgUartState(m) => UartState::MsgUartState(m), - SBP::MsgUartStateDepa(m) => UartState::MsgUartStateDepa(m), + Sbp::MsgUartState(m) => UartState::MsgUartState(m), + Sbp::MsgUartStateDepa(m) => UartState::MsgUartStateDepa(m), _ => unreachable!(), } } @@ -798,12 +791,12 @@ impl Event for ObservationMsg { MsgOsr::MESSAGE_TYPE, ]; - fn from_sbp(msg: SBP) -> Self { + fn from_sbp(msg: Sbp) -> Self { match msg { - SBP::MsgObs(m) => ObservationMsg::MsgObs(m), - SBP::MsgObsDepB(m) => ObservationMsg::MsgObsDepB(m), - SBP::MsgObsDepC(m) => ObservationMsg::MsgObsDepC(m), - SBP::MsgOsr(m) => ObservationMsg::MsgOsr(m), + Sbp::MsgObs(m) => ObservationMsg::MsgObs(m), + Sbp::MsgObsDepB(m) => ObservationMsg::MsgObsDepB(m), + Sbp::MsgObsDepC(m) => ObservationMsg::MsgObsDepC(m), + Sbp::MsgOsr(m) => ObservationMsg::MsgOsr(m), _ => unreachable!(), } } @@ -861,9 +854,9 @@ impl Observations { true, signal_code, sat_, - obs.P as f64 / divisor, - obs.L.i, - obs.L.f, + obs.p as f64 / divisor, + obs.l.i, + obs.l.f, obs.cn0 as f64, 0_f64, // obs.D obs.lock, @@ -880,9 +873,9 @@ impl Observations { true, signal_code, sat_, - obs.P as f64 / divisor, - obs.L.i, - obs.L.f, + obs.p as f64 / divisor, + obs.l.i, + obs.l.f, obs.cn0 as f64, 0_f64, // obs.D obs.lock, @@ -893,11 +886,11 @@ impl Observations { false, SignalCodes::from(obs.sid.code), obs.sid.sat as i16, - obs.P as f64 / divisor, - obs.L.i, - obs.L.f, + obs.p as f64 / divisor, + obs.l.i, + obs.l.f, obs.cn0 as f64, - obs.D.i as f64 + obs.D.f as f64 / ((1 << 8) as f64), + obs.d.i as f64 + obs.d.f as f64 / ((1 << 8) as f64), obs.lock as u16, obs.flags, ), @@ -905,9 +898,9 @@ impl Observations { false, SignalCodes::from(obs.sid.code), obs.sid.sat as i16, - obs.P as f64 / divisor, - obs.L.i, - obs.L.f, + obs.p as f64 / divisor, + obs.l.i, + obs.l.f, 0_f64, // cn0 0_f64, // obs.D obs.lock as u16, @@ -1033,14 +1026,14 @@ pub struct PosLLHFields { #[derive(Debug, Clone)] #[allow(clippy::upper_case_acronyms)] pub enum PosLLH { - MsgPosLLH(MsgPosLLH), - MsgPosLLHDepA(MsgPosLLHDepA), + MsgPosLlh(MsgPosLlh), + MsgPosLlhDepA(MsgPosLlhDepA), } impl PosLLH { pub fn fields(&self) -> PosLLHFields { match self { - PosLLH::MsgPosLLH(MsgPosLLH { + PosLLH::MsgPosLlh(MsgPosLlh { flags, h_accuracy, v_accuracy, @@ -1051,7 +1044,7 @@ impl PosLLH { n_sats, .. }) - | PosLLH::MsgPosLLHDepA(MsgPosLLHDepA { + | PosLLH::MsgPosLlhDepA(MsgPosLlhDepA { flags, h_accuracy, v_accuracy, @@ -1075,8 +1068,8 @@ impl PosLLH { } pub fn mode(&self) -> u8 { match self { - PosLLH::MsgPosLLH(msg) => msg.flags & 0x7, - PosLLH::MsgPosLLHDepA(msg) => { + PosLLH::MsgPosLlh(msg) => msg.flags & 0x7, + PosLLH::MsgPosLlhDepA(msg) => { let mode = msg.flags & 0x7; match mode { 0 => 1, @@ -1090,12 +1083,12 @@ impl PosLLH { } impl Event for PosLLH { - const MESSAGE_TYPES: &'static [u16] = &[MsgPosLLH::MESSAGE_TYPE, MsgPosLLHDepA::MESSAGE_TYPE]; + const MESSAGE_TYPES: &'static [u16] = &[MsgPosLlh::MESSAGE_TYPE, MsgPosLlhDepA::MESSAGE_TYPE]; - fn from_sbp(msg: SBP) -> Self { + fn from_sbp(msg: Sbp) -> Self { match msg { - SBP::MsgPosLLH(m) => PosLLH::MsgPosLLH(m), - SBP::MsgPosLLHDepA(m) => PosLLH::MsgPosLLHDepA(m), + Sbp::MsgPosLlh(m) => PosLLH::MsgPosLlh(m), + Sbp::MsgPosLlhDepA(m) => PosLLH::MsgPosLlhDepA(m), _ => unreachable!(), } } @@ -1141,10 +1134,10 @@ impl Dops { impl Event for Dops { const MESSAGE_TYPES: &'static [u16] = &[MsgDops::MESSAGE_TYPE, MsgDopsDepA::MESSAGE_TYPE]; - fn from_sbp(msg: SBP) -> Self { + fn from_sbp(msg: Sbp) -> Self { match msg { - SBP::MsgDops(m) => Dops::MsgDops(m), - SBP::MsgDopsDepA(m) => Dops::MsgDopsDepA(m), + Sbp::MsgDops(m) => Dops::MsgDops(m), + Sbp::MsgDopsDepA(m) => Dops::MsgDopsDepA(m), _ => unreachable!(), } } @@ -1159,8 +1152,8 @@ pub struct GpsTimeFields { // Enum wrapping around various GpsTime Message types. #[derive(Debug, Clone)] pub enum GpsTime { - MsgGpsTime(MsgGPSTime), - MsgGpsTimeDepA(MsgGPSTimeDepA), + MsgGpsTime(MsgGpsTime), + MsgGpsTimeDepA(MsgGpsTimeDepA), } impl GpsTime { @@ -1178,12 +1171,12 @@ impl GpsTime { } impl Event for GpsTime { - const MESSAGE_TYPES: &'static [u16] = &[MsgGPSTime::MESSAGE_TYPE, MsgGPSTimeDepA::MESSAGE_TYPE]; + const MESSAGE_TYPES: &'static [u16] = &[MsgGpsTime::MESSAGE_TYPE, MsgGpsTimeDepA::MESSAGE_TYPE]; - fn from_sbp(msg: SBP) -> Self { + fn from_sbp(msg: Sbp) -> Self { match msg { - SBP::MsgGPSTime(m) => GpsTime::MsgGpsTime(m), - SBP::MsgGPSTimeDepA(m) => GpsTime::MsgGpsTimeDepA(m), + Sbp::MsgGpsTime(m) => GpsTime::MsgGpsTime(m), + Sbp::MsgGpsTimeDepA(m) => GpsTime::MsgGpsTimeDepA(m), _ => unreachable!(), } } @@ -1262,10 +1255,10 @@ impl Specan { impl Event for Specan { const MESSAGE_TYPES: &'static [u16] = &[MsgSpecan::MESSAGE_TYPE, MsgSpecanDep::MESSAGE_TYPE]; - fn from_sbp(msg: SBP) -> Self { + fn from_sbp(msg: Sbp) -> Self { match msg { - SBP::MsgSpecan(m) => Specan::MsgSpecan(m), - SBP::MsgSpecanDep(m) => Specan::MsgSpecanDep(m), + Sbp::MsgSpecan(m) => Specan::MsgSpecan(m), + Sbp::MsgSpecanDep(m) => Specan::MsgSpecanDep(m), _ => unreachable!(), } } @@ -1286,15 +1279,15 @@ pub struct VelNEDFields { #[derive(Debug, Clone)] #[allow(clippy::upper_case_acronyms)] pub enum VelNED { - MsgVelNED(MsgVelNED), - MsgVelNEDDepA(MsgVelNEDDepA), + MsgVelNed(MsgVelNed), + MsgVelNedDepA(MsgVelNedDepA), } impl VelNED { pub fn fields(self) -> VelNEDFields { let (flags, tow, n, e, d, n_sats) = match self { - VelNED::MsgVelNED(msg) => (msg.flags, msg.tow as f64, msg.n, msg.e, msg.d, msg.n_sats), - VelNED::MsgVelNEDDepA(msg) => (1, msg.tow as f64, msg.n, msg.e, msg.d, msg.n_sats), + VelNED::MsgVelNed(msg) => (msg.flags, msg.tow as f64, msg.n, msg.e, msg.d, msg.n_sats), + VelNED::MsgVelNedDepA(msg) => (1, msg.tow as f64, msg.n, msg.e, msg.d, msg.n_sats), }; VelNEDFields { flags, @@ -1308,12 +1301,12 @@ impl VelNED { } impl Event for VelNED { - const MESSAGE_TYPES: &'static [u16] = &[MsgVelNED::MESSAGE_TYPE, MsgVelNEDDepA::MESSAGE_TYPE]; + const MESSAGE_TYPES: &'static [u16] = &[MsgVelNed::MESSAGE_TYPE, MsgVelNedDepA::MESSAGE_TYPE]; - fn from_sbp(msg: SBP) -> Self { + fn from_sbp(msg: Sbp) -> Self { match msg { - SBP::MsgVelNED(m) => VelNED::MsgVelNED(m), - SBP::MsgVelNEDDepA(m) => VelNED::MsgVelNEDDepA(m), + Sbp::MsgVelNed(m) => VelNED::MsgVelNed(m), + Sbp::MsgVelNedDepA(m) => VelNED::MsgVelNedDepA(m), _ => unreachable!(), } } @@ -1337,14 +1330,14 @@ pub struct BaselineNEDFields { #[derive(Debug, Clone)] #[allow(clippy::upper_case_acronyms)] pub enum BaselineNED { - MsgBaselineNED(MsgBaselineNED), - MsgBaselineNEDDepA(MsgBaselineNEDDepA), + MsgBaselineNed(MsgBaselineNed), + MsgBaselineNedDepA(MsgBaselineNedDepA), } impl BaselineNED { pub fn fields(&self) -> BaselineNEDFields { let (flags, tow, n, e, d, h_accuracy, v_accuracy, n_sats) = match self { - BaselineNED::MsgBaselineNED(msg) => ( + BaselineNED::MsgBaselineNed(msg) => ( msg.flags, msg.tow as f64, msg.n, @@ -1354,7 +1347,7 @@ impl BaselineNED { msg.v_accuracy, msg.n_sats, ), - BaselineNED::MsgBaselineNEDDepA(msg) => ( + BaselineNED::MsgBaselineNedDepA(msg) => ( 1, msg.tow as f64, msg.n, @@ -1378,22 +1371,22 @@ impl BaselineNED { } pub fn mode(&self) -> u8 { match self { - BaselineNED::MsgBaselineNED(MsgBaselineNED { flags, .. }) - | BaselineNED::MsgBaselineNEDDepA(MsgBaselineNEDDepA { flags, .. }) => *flags & 0x7, + BaselineNED::MsgBaselineNed(MsgBaselineNed { flags, .. }) + | BaselineNED::MsgBaselineNedDepA(MsgBaselineNedDepA { flags, .. }) => *flags & 0x7, } } } impl Event for BaselineNED { const MESSAGE_TYPES: &'static [u16] = &[ - MsgBaselineNED::MESSAGE_TYPE, - MsgBaselineNEDDepA::MESSAGE_TYPE, + MsgBaselineNed::MESSAGE_TYPE, + MsgBaselineNedDepA::MESSAGE_TYPE, ]; - fn from_sbp(msg: SBP) -> Self { + fn from_sbp(msg: Sbp) -> Self { match msg { - SBP::MsgBaselineNED(m) => BaselineNED::MsgBaselineNED(m), - SBP::MsgBaselineNEDDepA(m) => BaselineNED::MsgBaselineNEDDepA(m), + Sbp::MsgBaselineNed(m) => BaselineNED::MsgBaselineNed(m), + Sbp::MsgBaselineNedDepA(m) => BaselineNED::MsgBaselineNedDepA(m), _ => unreachable!(), } } diff --git a/console_backend/src/update_tab.rs b/console_backend/src/update_tab.rs index 0d419b88b..ff5a42370 100644 --- a/console_backend/src/update_tab.rs +++ b/console_backend/src/update_tab.rs @@ -524,8 +524,7 @@ fn firmware_upgrade( sender_id: None, flags: 0, }; - let msg = sbp::messages::SBP::from(msg); - msg_sender.send(msg)?; + msg_sender.send(msg.into())?; } else { update_tab_context.fw_log_append(String::from("Image transfer failed.")) } @@ -553,8 +552,7 @@ fn firmware_upgrade_commit_to_flash( UPGRADE_FIRMWARE_TOOL, UPGRADE_FIRMWARE_REMOTE_DESTINATION )), }; - let msg = sbp::messages::SBP::from(msg); - msg_sender.send(msg)?; + msg_sender.send(msg.into())?; let start_time = Instant::now(); let timeout = Duration::from_secs(UPGRADE_FIRMWARE_TIMEOUT_SEC); while update_tab_context.upgrading() && start_time.elapsed() < timeout {