From ae3e85c50a87be6fedb2df0700a4299d407f8c44 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 6 Feb 2023 11:38:13 +0100 Subject: [PATCH 1/5] power abstraction --- satrs-core/src/power.rs | 46 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/satrs-core/src/power.rs b/satrs-core/src/power.rs index 0875b87..08f737a 100644 --- a/satrs-core/src/power.rs +++ b/satrs-core/src/power.rs @@ -59,3 +59,49 @@ pub trait PowerSwitcher { /// see the switch changed. fn switch_delay_ms(&self) -> u32; } + +#[cfg(test)] +mod tests { + use super::*; + use std::boxed::Box; + use crate::power::PowerSwitcher; + + + struct Pcdu { + switch_rx: std::sync::mpsc::Receiver<(SwitchId, u16)> + } + enum DeviceState { + OFF, + SwitchingPower, + ON, + SETUP, + IDLE + } + struct MyComplexDevice { + power_switcher: Box>, + switch_id: SwitchId, + some_state: u16, + dev_state: DeviceState, + mode: u32, + submode: u16, + } + + impl MyComplexDevice { + pub fn periodic_op(&mut self) { + // .. mode command coming in + let mode = 1; + if mode == 1 { + if self.dev_state == DeviceState::OFF { + self.power_switcher.send_switch_on_cmd(self.switch_id).expect("sending siwthc cmd failed"); + self.dev_state = DeviceState::SwitchingPower; + } + if self.dev_state == DeviceState::SwitchingPower { + if self.power_switcher.get_is_switch_on() { + self.dev_state = DeviceState::ON; + self.mode = 1; + } + } + } + } + } +} \ No newline at end of file From be1299e7d698ebc3c891fd8e28554d679a3fa455 Mon Sep 17 00:00:00 2001 From: lkoester Date: Tue, 7 Feb 2023 14:56:50 +0100 Subject: [PATCH 2/5] added result return to get_switch_state --- satrs-core/src/power.rs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/satrs-core/src/power.rs b/satrs-core/src/power.rs index 08f737a..fa8ee01 100644 --- a/satrs-core/src/power.rs +++ b/satrs-core/src/power.rs @@ -47,10 +47,13 @@ pub trait PowerSwitcher { } /// Retrieve the switch state - fn get_switch_state(&mut self, switch_id: SwitchId) -> SwitchState; + fn get_switch_state(&mut self, switch_id: SwitchId) -> Result; - fn get_is_switch_on(&mut self, switch_id: SwitchId) -> bool { - self.get_switch_state(switch_id) == SwitchState::On + fn get_is_switch_on(&mut self, switch_id: SwitchId) -> Result { + match self.get_switch_state(switch_id) { + Ok(switch_state) => { Ok(switch_state == SwitchState::On) } + Err(_) => { Err(()) } + } } /// The maximum delay it will take to change a switch. From ae8718ed6ade1b9cb72b9debd77b11b96e5f970f Mon Sep 17 00:00:00 2001 From: lkoester Date: Tue, 7 Feb 2023 16:01:25 +0100 Subject: [PATCH 3/5] simplified get is switch on --- satrs-core/src/power.rs | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/satrs-core/src/power.rs b/satrs-core/src/power.rs index fa8ee01..513b479 100644 --- a/satrs-core/src/power.rs +++ b/satrs-core/src/power.rs @@ -49,11 +49,8 @@ pub trait PowerSwitcher { /// Retrieve the switch state fn get_switch_state(&mut self, switch_id: SwitchId) -> Result; - fn get_is_switch_on(&mut self, switch_id: SwitchId) -> Result { - match self.get_switch_state(switch_id) { - Ok(switch_state) => { Ok(switch_state == SwitchState::On) } - Err(_) => { Err(()) } - } + fn get_is_switch_on(&mut self, switch_id: SwitchId) -> Result { + Ok(self.get_switch_state(switch_id)? == SwitchState::On) } /// The maximum delay it will take to change a switch. From 9a7f3962cfb4073aaedd8de05ca1fc79fa1f238a Mon Sep 17 00:00:00 2001 From: lkoester Date: Mon, 13 Feb 2023 09:20:00 +0100 Subject: [PATCH 4/5] modified power abstractions --- satrs-core/src/hk.rs | 11 +++++ satrs-core/src/lib.rs | 2 + satrs-core/src/mode.rs | 0 satrs-core/src/power.rs | 15 +++++-- satrs-core/src/request.rs | 0 satrs-example/src/hk.rs | 9 +---- satrs-example/src/lib.rs | 6 +++ satrs-example/src/main.rs | 4 +- satrs-example/src/pus.rs | 76 ++++++++++++++++++++++------------- satrs-example/src/requests.rs | 3 +- satrs-example/src/tmtc.rs | 1 + 11 files changed, 85 insertions(+), 42 deletions(-) create mode 100644 satrs-core/src/hk.rs create mode 100644 satrs-core/src/mode.rs create mode 100644 satrs-core/src/request.rs diff --git a/satrs-core/src/hk.rs b/satrs-core/src/hk.rs new file mode 100644 index 0000000..727e887 --- /dev/null +++ b/satrs-core/src/hk.rs @@ -0,0 +1,11 @@ +use crate::tmtc::AddressableId; + +pub type CollectionIntervalFactor = u32; + +#[derive(Debug, Copy, Clone, PartialEq, Eq)] +pub enum HkRequest { + OneShot(AddressableId), + Enable(AddressableId), + Disable(AddressableId), + ModifyCollectionInterval(AddressableId, CollectionIntervalFactor), +} diff --git a/satrs-core/src/lib.rs b/satrs-core/src/lib.rs index f8b3b31..f3c5ca2 100644 --- a/satrs-core/src/lib.rs +++ b/satrs-core/src/lib.rs @@ -35,5 +35,7 @@ pub mod pus; pub mod res_code; pub mod seq_count; pub mod tmtc; +pub mod request; +pub mod hk; pub use spacepackets; diff --git a/satrs-core/src/mode.rs b/satrs-core/src/mode.rs new file mode 100644 index 0000000..e69de29 diff --git a/satrs-core/src/power.rs b/satrs-core/src/power.rs index 513b479..9d0e7ad 100644 --- a/satrs-core/src/power.rs +++ b/satrs-core/src/power.rs @@ -27,7 +27,7 @@ pub enum SwitchState { pub type SwitchId = u16; /// Generic trait for a device capable of turning on and off switches. -pub trait PowerSwitcher { +pub trait PowerSwitcherCommandSender { type Error; fn send_switch_on_cmd(&mut self, switch_id: SwitchId) -> Result<(), Self::Error>; @@ -46,6 +46,11 @@ pub trait PowerSwitcher { switch.switch_off() } +} + +pub trait PowerSwitchInfo { + type Error; + /// Retrieve the switch state fn get_switch_state(&mut self, switch_id: SwitchId) -> Result; @@ -60,11 +65,15 @@ pub trait PowerSwitcher { fn switch_delay_ms(&self) -> u32; } +pub trait PowerSwitchProvider: PowerSwitcherCommandSender + PowerSwitchInfo { + type Error; +} + #[cfg(test)] mod tests { use super::*; use std::boxed::Box; - use crate::power::PowerSwitcher; + use crate::power::PowerSwitcherCommandSender; struct Pcdu { @@ -78,7 +87,7 @@ mod tests { IDLE } struct MyComplexDevice { - power_switcher: Box>, + power_switcher: Box>, switch_id: SwitchId, some_state: u16, dev_state: DeviceState, diff --git a/satrs-core/src/request.rs b/satrs-core/src/request.rs new file mode 100644 index 0000000..e69de29 diff --git a/satrs-example/src/hk.rs b/satrs-example/src/hk.rs index d27c0f0..0ee26cd 100644 --- a/satrs-example/src/hk.rs +++ b/satrs-example/src/hk.rs @@ -1,16 +1,9 @@ use satrs_core::tmtc::AddressableId; -pub type CollectionIntervalFactor = u32; + #[derive(Debug, Copy, Clone, PartialEq, Eq)] pub enum AcsHkIds { TestMgmSet = 1, } -#[derive(Debug, Copy, Clone, PartialEq, Eq)] -pub enum HkRequest { - OneShot(AddressableId), - Enable(AddressableId), - Disable(AddressableId), - ModifyCollectionInterval(AddressableId, CollectionIntervalFactor), -} diff --git a/satrs-example/src/lib.rs b/satrs-example/src/lib.rs index 83a095b..bdee90a 100644 --- a/satrs-example/src/lib.rs +++ b/satrs-example/src/lib.rs @@ -1,4 +1,5 @@ use std::net::Ipv4Addr; +use satrs_core::events::{EventU32, EventU32TypedSev, Severity, SeverityInfo}; use satrs_mib::res_code::{ResultU16, ResultU16Info}; use satrs_mib::resultcode; @@ -17,6 +18,9 @@ pub enum GroupId { pub const OBSW_SERVER_ADDR: Ipv4Addr = Ipv4Addr::UNSPECIFIED; pub const SERVER_PORT: u16 = 7301; +pub const TEST_EVENT: EventU32TypedSev = + EventU32TypedSev::::const_new(0, 0); + pub mod tmtc_err { use super::*; @@ -47,3 +51,5 @@ pub mod hk_err { #[resultcode] pub const COLLECTION_INTERVAL_MISSING: ResultU16 = ResultU16::const_new(GroupId::Hk as u8, 3); } + + diff --git a/satrs-example/src/main.rs b/satrs-example/src/main.rs index dfe78aa..9eb737c 100644 --- a/satrs-example/src/main.rs +++ b/satrs-example/src/main.rs @@ -4,7 +4,7 @@ mod pus; mod requests; mod tmtc; -use crate::hk::{AcsHkIds, HkRequest}; +use crate::hk::{AcsHkIds}; use crate::requests::{Request, RequestWithToken}; use crate::tmtc::{ core_tmtc_task, OtherArgs, PusTcSource, TcArgs, TcStore, TmArgs, TmFunnel, TmStore, PUS_APID, @@ -37,6 +37,7 @@ use std::sync::mpsc::{channel, TryRecvError}; use std::sync::{mpsc, Arc, RwLock}; use std::thread; use std::time::Duration; +use satrs_core::hk::HkRequest; #[derive(Clone)] struct EventTmSender { @@ -244,6 +245,7 @@ fn main() { HkRequest::Disable(_) => {} HkRequest::ModifyCollectionInterval(_, _) => {} }, + _ => {} } let started_token = reporter_aocs .start_success(request.1, Some(×tamp)) diff --git a/satrs-example/src/pus.rs b/satrs-example/src/pus.rs index 68774fa..caee377 100644 --- a/satrs-example/src/pus.rs +++ b/satrs-example/src/pus.rs @@ -1,4 +1,3 @@ -use crate::hk::{CollectionIntervalFactor, HkRequest}; use crate::requests::{Request, RequestWithToken}; use crate::tmtc::{PusTcSource, TmStore}; use satrs_core::events::EventU32; @@ -17,11 +16,13 @@ use satrs_core::{ spacepackets::ecss::PusPacket, spacepackets::tc::PusTc, spacepackets::time::cds::TimeProvider, spacepackets::time::TimeWriter, spacepackets::SpHeader, }; -use satrs_example::{hk_err, tmtc_err}; +use satrs_example::{hk_err, tmtc_err, TEST_EVENT}; use std::cell::RefCell; use std::collections::HashMap; use std::rc::Rc; use std::sync::mpsc::Sender; +use satrs_core::hk::{CollectionIntervalFactor, HkRequest}; +use satrs_core::params::Params; pub struct PusReceiver { pub tm_helper: PusTmWithCdsShortHelper, @@ -31,6 +32,7 @@ pub struct PusReceiver { #[allow(dead_code)] tc_source: PusTcSource, event_request_tx: Sender, + event_sender: Sender<(EventU32, Option)>, request_map: HashMap>, stamper: TimeProvider, time_stamp: [u8; 7], @@ -52,6 +54,7 @@ pub struct PusTcArgs { pub request_map: HashMap>, /// Required for scheduling of telecommands. pub tc_source: PusTcSource, + pub event_sender: Sender<(EventU32, Option)>, pub scheduler: Rc>, } @@ -64,6 +67,7 @@ impl PusReceiver { verif_reporter: tm_arguments.verif_reporter, tc_source: tc_arguments.tc_source, event_request_tx: tc_arguments.event_request_tx, + event_sender: tc_arguments.event_sender, request_map: tc_arguments.request_map, stamper: TimeProvider::new_with_u16_days(0, 0), time_stamp: [0; 7], @@ -110,33 +114,47 @@ impl PusServiceProvider for PusReceiver { impl PusReceiver { fn handle_test_service(&mut self, pus_tc: &PusTc, token: VerificationToken) { - if PusPacket::subservice(pus_tc) == 1 { - println!("Received PUS ping command TC[17,1]"); - println!("Sending ping reply PUS TM[17,2]"); - let ping_reply = self.tm_helper.create_pus_tm_timestamp_now(17, 2, None); - let addr = self.tm_store.add_pus_tm(&ping_reply); - let start_token = self - .verif_reporter - .start_success(token, Some(&self.time_stamp)) - .expect("Error sending start success"); - self.tm_tx - .send(addr) - .expect("Sending TM to TM funnel failed"); - self.verif_reporter - .completion_success(start_token, Some(&self.time_stamp)) - .expect("Error sending completion success"); - } else { - self.update_time_stamp(); - self.verif_reporter - .start_failure( - token, - FailParams::new( - Some(&self.time_stamp), - &tmtc_err::INVALID_PUS_SUBSERVICE, - None, - ), - ) - .expect("Sending start failure TM failed"); + match PusPacket::subservice(pus_tc) { + 1 => { + println!("Received PUS ping command TC[17,1]"); + println!("Sending ping reply PUS TM[17,2]"); + let start_token = self + .verif_reporter + .start_success(token, Some(&self.time_stamp)) + .expect("Error sending start success"); + let ping_reply = self.tm_helper.create_pus_tm_timestamp_now(17, 2, None); + let addr = self.tm_store.add_pus_tm(&ping_reply); + self.tm_tx + .send(addr) + .expect("Sending TM to TM funnel failed"); + self.verif_reporter + .completion_success(start_token, Some(&self.time_stamp)) + .expect("Error sending completion success"); + } + 128 => { + self.update_time_stamp(); + self.event_sender.send((TEST_EVENT.into(), None)).expect("Sending test event failed"); + let start_token = self + .verif_reporter + .start_success(token, Some(&self.time_stamp)) + .expect("Error sending start success"); + self.verif_reporter + .completion_success(start_token, Some(&self.time_stamp)) + .expect("Error sending completion success"); + } + _ => { + self.update_time_stamp(); + self.verif_reporter + .start_failure( + token, + FailParams::new( + Some(&self.time_stamp), + &tmtc_err::INVALID_PUS_SUBSERVICE, + None, + ), + ) + .expect("Sending start failure TM failed"); + } } } diff --git a/satrs-example/src/requests.rs b/satrs-example/src/requests.rs index cac2277..42ae51c 100644 --- a/satrs-example/src/requests.rs +++ b/satrs-example/src/requests.rs @@ -1,9 +1,10 @@ -use crate::hk::HkRequest; +use satrs_core::hk::HkRequest; use satrs_core::pus::verification::{TcStateAccepted, VerificationToken}; #[derive(Copy, Clone, Eq, PartialEq, Debug)] pub enum Request { HkRequest(HkRequest), + ModeRequest } #[derive(Copy, Clone, Eq, PartialEq, Debug)] diff --git a/satrs-example/src/tmtc.rs b/satrs-example/src/tmtc.rs index af3e750..90d4166 100644 --- a/satrs-example/src/tmtc.rs +++ b/satrs-example/src/tmtc.rs @@ -177,6 +177,7 @@ pub fn core_tmtc_task(args: OtherArgs, mut tc_args: TcArgs, tm_args: TmArgs) { event_request_tx: args.event_request_tx, request_map: args.request_map, tc_source: tc_args.tc_source.clone(), + event_sender: args.event_sender, scheduler: sched_clone, }; let mut pus_receiver = PusReceiver::new(PUS_APID, pus_tm_args, pus_tc_args); From ec46d94dc7cedbadabf8b52cc016d26e2034105f Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 14 Feb 2023 15:53:14 +0100 Subject: [PATCH 5/5] cargo fmt and clippy --- satrs-core/src/lib.rs | 4 ++-- satrs-core/src/power.rs | 16 ++++++++-------- satrs-core/src/request.rs | 1 + satrs-example/src/hk.rs | 5 ----- satrs-example/src/lib.rs | 4 +--- satrs-example/src/main.rs | 5 ++--- satrs-example/src/pus.rs | 8 +++++--- satrs-example/src/requests.rs | 1 - 8 files changed, 19 insertions(+), 25 deletions(-) diff --git a/satrs-core/src/lib.rs b/satrs-core/src/lib.rs index 87f07f4..d1b25d2 100644 --- a/satrs-core/src/lib.rs +++ b/satrs-core/src/lib.rs @@ -25,6 +25,7 @@ pub mod events; #[cfg_attr(doc_cfg, doc(cfg(feature = "std")))] pub mod executable; pub mod hal; +pub mod hk; pub mod objects; pub mod params; #[cfg(feature = "alloc")] @@ -32,10 +33,9 @@ pub mod params; pub mod pool; pub mod power; pub mod pus; +pub mod request; pub mod res_code; pub mod seq_count; pub mod tmtc; -pub mod request; -pub mod hk; pub use spacepackets; diff --git a/satrs-core/src/power.rs b/satrs-core/src/power.rs index 9d0e7ad..82063a3 100644 --- a/satrs-core/src/power.rs +++ b/satrs-core/src/power.rs @@ -45,7 +45,6 @@ pub trait PowerSwitcherCommandSender { ) -> Result<(), ::Error> { switch.switch_off() } - } pub trait PowerSwitchInfo { @@ -72,22 +71,21 @@ pub trait PowerSwitchProvider: PowerSwitcherCommandSender + PowerSwitchInfo { #[cfg(test)] mod tests { use super::*; - use std::boxed::Box; use crate::power::PowerSwitcherCommandSender; - + use std::boxed::Box; struct Pcdu { - switch_rx: std::sync::mpsc::Receiver<(SwitchId, u16)> + switch_rx: std::sync::mpsc::Receiver<(SwitchId, u16)>, } enum DeviceState { OFF, SwitchingPower, ON, SETUP, - IDLE + IDLE, } struct MyComplexDevice { - power_switcher: Box>, + power_switcher: Box>, switch_id: SwitchId, some_state: u16, dev_state: DeviceState, @@ -101,7 +99,9 @@ mod tests { let mode = 1; if mode == 1 { if self.dev_state == DeviceState::OFF { - self.power_switcher.send_switch_on_cmd(self.switch_id).expect("sending siwthc cmd failed"); + self.power_switcher + .send_switch_on_cmd(self.switch_id) + .expect("sending siwthc cmd failed"); self.dev_state = DeviceState::SwitchingPower; } if self.dev_state == DeviceState::SwitchingPower { @@ -113,4 +113,4 @@ mod tests { } } } -} \ No newline at end of file +} diff --git a/satrs-core/src/request.rs b/satrs-core/src/request.rs index e69de29..8b13789 100644 --- a/satrs-core/src/request.rs +++ b/satrs-core/src/request.rs @@ -0,0 +1 @@ + diff --git a/satrs-example/src/hk.rs b/satrs-example/src/hk.rs index 0ee26cd..2e4727a 100644 --- a/satrs-example/src/hk.rs +++ b/satrs-example/src/hk.rs @@ -1,9 +1,4 @@ -use satrs_core::tmtc::AddressableId; - - - #[derive(Debug, Copy, Clone, PartialEq, Eq)] pub enum AcsHkIds { TestMgmSet = 1, } - diff --git a/satrs-example/src/lib.rs b/satrs-example/src/lib.rs index bdee90a..e28ece5 100644 --- a/satrs-example/src/lib.rs +++ b/satrs-example/src/lib.rs @@ -1,5 +1,5 @@ +use satrs_core::events::{EventU32TypedSev, SeverityInfo}; use std::net::Ipv4Addr; -use satrs_core::events::{EventU32, EventU32TypedSev, Severity, SeverityInfo}; use satrs_mib::res_code::{ResultU16, ResultU16Info}; use satrs_mib::resultcode; @@ -51,5 +51,3 @@ pub mod hk_err { #[resultcode] pub const COLLECTION_INTERVAL_MISSING: ResultU16 = ResultU16::const_new(GroupId::Hk as u8, 3); } - - diff --git a/satrs-example/src/main.rs b/satrs-example/src/main.rs index 9eb737c..a070109 100644 --- a/satrs-example/src/main.rs +++ b/satrs-example/src/main.rs @@ -4,7 +4,7 @@ mod pus; mod requests; mod tmtc; -use crate::hk::{AcsHkIds}; +use crate::hk::AcsHkIds; use crate::requests::{Request, RequestWithToken}; use crate::tmtc::{ core_tmtc_task, OtherArgs, PusTcSource, TcArgs, TcStore, TmArgs, TmFunnel, TmStore, PUS_APID, @@ -13,6 +13,7 @@ use satrs_core::event_man::{ EventManagerWithMpscQueue, MpscEventReceiver, MpscEventU32SendProvider, SendEventProvider, }; use satrs_core::events::EventU32; +use satrs_core::hk::HkRequest; use satrs_core::pool::{LocalPool, PoolCfg, StoreAddr}; use satrs_core::pus::event_man::{ DefaultPusMgmtBackendProvider, EventReporter, EventRequest, EventRequestWithToken, @@ -37,7 +38,6 @@ use std::sync::mpsc::{channel, TryRecvError}; use std::sync::{mpsc, Arc, RwLock}; use std::thread; use std::time::Duration; -use satrs_core::hk::HkRequest; #[derive(Clone)] struct EventTmSender { @@ -245,7 +245,6 @@ fn main() { HkRequest::Disable(_) => {} HkRequest::ModifyCollectionInterval(_, _) => {} }, - _ => {} } let started_token = reporter_aocs .start_success(request.1, Some(×tamp)) diff --git a/satrs-example/src/pus.rs b/satrs-example/src/pus.rs index caee377..fb228bb 100644 --- a/satrs-example/src/pus.rs +++ b/satrs-example/src/pus.rs @@ -1,6 +1,8 @@ use crate::requests::{Request, RequestWithToken}; use crate::tmtc::{PusTcSource, TmStore}; use satrs_core::events::EventU32; +use satrs_core::hk::{CollectionIntervalFactor, HkRequest}; +use satrs_core::params::Params; use satrs_core::pool::StoreAddr; use satrs_core::pus::event; use satrs_core::pus::event_man::{EventRequest, EventRequestWithToken}; @@ -21,8 +23,6 @@ use std::cell::RefCell; use std::collections::HashMap; use std::rc::Rc; use std::sync::mpsc::Sender; -use satrs_core::hk::{CollectionIntervalFactor, HkRequest}; -use satrs_core::params::Params; pub struct PusReceiver { pub tm_helper: PusTmWithCdsShortHelper, @@ -133,7 +133,9 @@ impl PusReceiver { } 128 => { self.update_time_stamp(); - self.event_sender.send((TEST_EVENT.into(), None)).expect("Sending test event failed"); + self.event_sender + .send((TEST_EVENT.into(), None)) + .expect("Sending test event failed"); let start_token = self .verif_reporter .start_success(token, Some(&self.time_stamp)) diff --git a/satrs-example/src/requests.rs b/satrs-example/src/requests.rs index 42ae51c..efb5732 100644 --- a/satrs-example/src/requests.rs +++ b/satrs-example/src/requests.rs @@ -4,7 +4,6 @@ use satrs_core::pus::verification::{TcStateAccepted, VerificationToken}; #[derive(Copy, Clone, Eq, PartialEq, Debug)] pub enum Request { HkRequest(HkRequest), - ModeRequest } #[derive(Copy, Clone, Eq, PartialEq, Debug)]