From b5d3b47056ea02e849505d8ddd32b23f35978597 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 3 Jan 2023 16:35:23 +0100 Subject: [PATCH] maybe this will work for bare metal code as well --- satrs-core/src/pus/verification.rs | 10 ++++---- satrs-core/src/seq_count.rs | 36 ++++++++++++++++++++++++---- satrs-core/tests/pus_verification.rs | 4 ++-- satrs-example/src/main.rs | 4 ++-- 4 files changed, 40 insertions(+), 14 deletions(-) diff --git a/satrs-core/src/pus/verification.rs b/satrs-core/src/pus/verification.rs index 6ec92b8..461bb4b 100644 --- a/satrs-core/src/pus/verification.rs +++ b/satrs-core/src/pus/verification.rs @@ -17,7 +17,7 @@ //! use std::time::Duration; //! use satrs_core::pool::{LocalPool, PoolCfg, PoolProvider, SharedPool}; //! use satrs_core::pus::verification::{MpscVerifSender, VerificationReporterCfg, VerificationReporterWithSender}; -//! use satrs_core::seq_count::SimpleSeqCountProvider; +//! use satrs_core::seq_count::SeqCountProviderSimple; //! use spacepackets::ecss::PusPacket; //! use spacepackets::SpHeader; //! use spacepackets::tc::{PusTc, PusTcSecondaryHeader}; @@ -30,7 +30,7 @@ //! let shared_tm_pool: SharedPool = Arc::new(RwLock::new(Box::new(LocalPool::new(pool_cfg.clone())))); //! let (verif_tx, verif_rx) = mpsc::channel(); //! let sender = MpscVerifSender::new(shared_tm_pool.clone(), verif_tx); -//! let cfg = VerificationReporterCfg::new(TEST_APID, Box::new(SimpleSeqCountProvider::default()), 1, 2, 8).unwrap(); +//! let cfg = VerificationReporterCfg::new(TEST_APID, Box::new(SeqCountProviderSimple::default()), 1, 2, 8).unwrap(); //! let mut reporter = VerificationReporterWithSender::new(&cfg , Box::new(sender)); //! //! let mut sph = SpHeader::tc_unseg(TEST_APID, 0, 0).unwrap(); @@ -87,7 +87,7 @@ use spacepackets::tm::{PusTm, PusTmSecondaryHeader}; use spacepackets::{CcsdsPacket, PacketId, PacketSequenceCtrl}; use spacepackets::{SpHeader, MAX_APID}; -pub use crate::seq_count::SimpleSeqCountProvider; +pub use crate::seq_count::SeqCountProviderSimple; #[cfg(feature = "alloc")] pub use alloc_mod::{ @@ -1158,7 +1158,7 @@ mod tests { TcStateNone, VerificationReporter, VerificationReporterCfg, VerificationReporterWithSender, VerificationToken, }; - use crate::seq_count::SimpleSeqCountProvider; + use crate::seq_count::SeqCountProviderSimple; use alloc::boxed::Box; use alloc::format; use spacepackets::ecss::{EcssEnumU16, EcssEnumU32, EcssEnumU8, EcssEnumeration, PusPacket}; @@ -1252,7 +1252,7 @@ mod tests { fn base_reporter() -> VerificationReporter { let cfg = VerificationReporterCfg::new( TEST_APID, - Box::new(SimpleSeqCountProvider::default()), + Box::new(SeqCountProviderSimple::default()), 1, 2, 8, diff --git a/satrs-core/src/seq_count.rs b/satrs-core/src/seq_count.rs index 3236b71..aa0684e 100644 --- a/satrs-core/src/seq_count.rs +++ b/satrs-core/src/seq_count.rs @@ -24,11 +24,11 @@ dyn_clone::clone_trait_object!(SequenceCountProvider); impl SequenceCountProvider for T where T: SequenceCountProviderCore + Clone {} #[derive(Default, Clone)] -pub struct SimpleSeqCountProvider { +pub struct SeqCountProviderSimple { seq_count: u16, } -impl SequenceCountProviderCore for SimpleSeqCountProvider { +impl SequenceCountProviderCore for SeqCountProviderSimple { fn get(&self) -> u16 { self.seq_count } @@ -42,18 +42,44 @@ impl SequenceCountProviderCore for SimpleSeqCountProvider { } } +use core::sync::atomic::{AtomicU16, Ordering}; + +pub struct SeqCountProviderAtomicRef { + atomic: &'static AtomicU16, + ordering: Ordering, +} + +impl SeqCountProviderAtomicRef { + pub const fn new(atomic: &'static AtomicU16, ordering: Ordering) -> Self { + Self { atomic, ordering } + } +} + +impl SequenceCountProviderCore for SeqCountProviderAtomicRef { + fn get(&self) -> u16 { + self.atomic.load(self.ordering) + } + + fn increment(&mut self) { + self.atomic.fetch_add(1, self.ordering); + } + + fn get_and_increment(&mut self) -> u16 { + self.atomic.fetch_add(1, self.ordering) + } +} + #[cfg(feature = "std")] pub mod stdmod { use super::*; - use std::sync::atomic::{AtomicU16, Ordering}; use std::sync::Arc; #[derive(Clone, Default)] - pub struct SyncSeqCountProvider { + pub struct SeqCountProviderSync { seq_count: Arc, } - impl SequenceCountProviderCore for SyncSeqCountProvider { + impl SequenceCountProviderCore for SeqCountProviderSync { fn get(&self) -> u16 { self.seq_count.load(Ordering::SeqCst) } diff --git a/satrs-core/tests/pus_verification.rs b/satrs-core/tests/pus_verification.rs index 66f414e..57c43ad 100644 --- a/satrs-core/tests/pus_verification.rs +++ b/satrs-core/tests/pus_verification.rs @@ -7,7 +7,7 @@ pub mod crossbeam_test { CrossbeamVerifSender, FailParams, RequestId, VerificationReporterCfg, VerificationReporterWithSender, }; - use satrs_core::seq_count::SyncSeqCountProvider; + use satrs_core::seq_count::SeqCountProviderSync; use spacepackets::ecss::{EcssEnumU16, EcssEnumU8, PusPacket}; use spacepackets::tc::{PusTc, PusTcSecondaryHeader}; use spacepackets::tm::PusTm; @@ -34,7 +34,7 @@ pub mod crossbeam_test { // each reporter have an own sequence count provider. let cfg = VerificationReporterCfg::new( TEST_APID, - Box::new(SyncSeqCountProvider::default()), + Box::new(SeqCountProviderSync::default()), 1, 2, 8, diff --git a/satrs-example/src/main.rs b/satrs-example/src/main.rs index ffcbfdd..a384dd0 100644 --- a/satrs-example/src/main.rs +++ b/satrs-example/src/main.rs @@ -23,7 +23,7 @@ use satrs_core::pus::verification::{ MpscVerifSender, VerificationReporterCfg, VerificationReporterWithSender, }; use satrs_core::pus::{EcssTmError, EcssTmSenderCore}; -use satrs_core::seq_count::SimpleSeqCountProvider; +use satrs_core::seq_count::SeqCountProviderSimple; use satrs_example::{RequestTargetId, OBSW_SERVER_ADDR, SERVER_PORT}; use spacepackets::time::cds::TimeProvider; use spacepackets::time::TimeWriter; @@ -93,7 +93,7 @@ fn main() { let verif_cfg = VerificationReporterCfg::new( PUS_APID, #[allow(clippy::box_default)] - Box::new(SimpleSeqCountProvider::default()), + Box::new(SeqCountProviderSimple::default()), 1, 2, 8,