diff --git a/satrs-example/pytmtc/pytmtc/common.py b/satrs-example/pytmtc/pytmtc/common.py index a37967e..e5a7380 100644 --- a/satrs-example/pytmtc/pytmtc/common.py +++ b/satrs-example/pytmtc/pytmtc/common.py @@ -39,7 +39,10 @@ class EventU32: class AcsId(enum.IntEnum): - MGM_0 = 0 + SUBSYSTEM = 1 + MGM_ASSEMBLY = 2 + MGM_0 = 3 + MGM_1 = 4 class AcsHkIds(enum.IntEnum): diff --git a/satrs-example/src/acs/mgm.rs b/satrs-example/src/acs/mgm.rs index 8b5c711..4bfad7e 100644 --- a/satrs-example/src/acs/mgm.rs +++ b/satrs-example/src/acs/mgm.rs @@ -2,6 +2,7 @@ use derive_new::new; use satrs::hk::{HkRequest, HkRequestVariant}; use satrs::mode_tree::{ModeChild, ModeNode}; use satrs::power::{PowerSwitchInfo, PowerSwitcherCommandSender}; +use satrs_example::config::pus::PUS_MODE_SERVICE; use satrs_example::{DeviceMode, TimestampHelper}; use satrs_minisim::acs::lis3mdl::{ MgmLis3MdlReply, MgmLis3RawValues, FIELD_LSB_PER_GAUSS_4_SENS, GAUSS_TO_MICROTESLA_FACTOR, @@ -20,7 +21,7 @@ use satrs::mode::{ }; use satrs::pus::{EcssTmSender, PusTmVariant}; use satrs::request::{GenericMessage, MessageMetadata, UniqueApidTargetId}; -use satrs_example::config::components::{NO_SENDER, PUS_MODE_SERVICE}; +use satrs_example::config::components::NO_SENDER; use crate::hk::PusHkHelper; use crate::pus::hk::{HkReply, HkReplyVariant}; @@ -491,7 +492,7 @@ mod tests { tmtc::PacketAsVec, ComponentId, }; - use satrs_example::config::components::{Apid, MGM_ASSEMBLY}; + use satrs_example::config::{acs::MGM_ASSEMBLY, components::Apid}; use satrs_minisim::acs::lis3mdl::MgmLis3RawValues; use crate::{eps::TestSwitchHelper, pus::hk::HkReply, requests::CompositeRequest}; diff --git a/satrs-example/src/config.rs b/satrs-example/src/config.rs index 5b4a8dd..790748c 100644 --- a/satrs-example/src/config.rs +++ b/satrs-example/src/config.rs @@ -135,23 +135,6 @@ pub mod components { Eps = 6, } - // Component IDs for components with the PUS APID. - #[derive(Copy, Clone, PartialEq, Eq)] - pub enum PusId { - PusEventManagement = 0, - PusRouting = 1, - PusTest = 2, - PusAction = 3, - PusMode = 4, - PusHk = 5, - } - - #[derive(Copy, Clone, PartialEq, Eq)] - pub enum AcsId { - Mgm0 = 0, - Assembly = 1, - } - #[derive(Copy, Clone, PartialEq, Eq)] pub enum EpsId { Pcdu = 0, @@ -164,6 +147,31 @@ pub mod components { TcpServer = 1, } + pub const EPS_SUBSYSTEM: UniqueApidTargetId = + UniqueApidTargetId::new(Apid::Eps as u16, EpsId::Subsystem as u32); + pub const PCDU_HANDLER: UniqueApidTargetId = + UniqueApidTargetId::new(Apid::Eps as u16, EpsId::Pcdu as u32); + pub const UDP_SERVER: UniqueApidTargetId = + UniqueApidTargetId::new(Apid::Tmtc as u16, TmtcId::UdpServer as u32); + pub const TCP_SERVER: UniqueApidTargetId = + UniqueApidTargetId::new(Apid::Tmtc as u16, TmtcId::TcpServer as u32); + pub const NO_SENDER: ComponentId = ComponentId::MAX; +} + +pub mod pus { + use super::components::Apid; + use satrs::request::UniqueApidTargetId; + + // Component IDs for components with the PUS APID. + #[derive(Copy, Clone, PartialEq, Eq)] + pub enum PusId { + PusEventManagement = 0, + PusRouting = 1, + PusTest = 2, + PusAction = 3, + PusMode = 4, + PusHk = 5, + } pub const PUS_ACTION_SERVICE: UniqueApidTargetId = UniqueApidTargetId::new(Apid::GenericPus as u16, PusId::PusAction as u32); pub const PUS_EVENT_MANAGEMENT: UniqueApidTargetId = @@ -178,19 +186,26 @@ pub mod components { UniqueApidTargetId::new(Apid::GenericPus as u16, PusId::PusHk as u32); pub const PUS_SCHED_SERVICE: UniqueApidTargetId = UniqueApidTargetId::new(Apid::Sched as u16, 0); +} + +pub mod acs { + use super::components::Apid; + use satrs::request::UniqueApidTargetId; + + #[derive(Copy, Clone, PartialEq, Eq)] + pub enum AcsId { + Subsystem = 1, + Assembly = 2, + Mgm0 = 3, + Mgm1 = 4, + } + pub const MGM_ASSEMBLY: UniqueApidTargetId = UniqueApidTargetId::new(Apid::Acs as u16, AcsId::Assembly as u32); pub const MGM_HANDLER_0: UniqueApidTargetId = UniqueApidTargetId::new(Apid::Acs as u16, AcsId::Mgm0 as u32); - pub const EPS_SUBSYSTEM: UniqueApidTargetId = - UniqueApidTargetId::new(Apid::Eps as u16, EpsId::Subsystem as u32); - pub const PCDU_HANDLER: UniqueApidTargetId = - UniqueApidTargetId::new(Apid::Eps as u16, EpsId::Pcdu as u32); - pub const UDP_SERVER: UniqueApidTargetId = - UniqueApidTargetId::new(Apid::Tmtc as u16, TmtcId::UdpServer as u32); - pub const TCP_SERVER: UniqueApidTargetId = - UniqueApidTargetId::new(Apid::Tmtc as u16, TmtcId::TcpServer as u32); - pub const NO_SENDER: ComponentId = ComponentId::MAX; + pub const MGM_HANDLER_1: UniqueApidTargetId = + UniqueApidTargetId::new(Apid::Acs as u16, AcsId::Mgm0 as u32); } pub mod pool { diff --git a/satrs-example/src/eps/pcdu.rs b/satrs-example/src/eps/pcdu.rs index 67e6230..391470e 100644 --- a/satrs-example/src/eps/pcdu.rs +++ b/satrs-example/src/eps/pcdu.rs @@ -20,7 +20,10 @@ use satrs::{ spacepackets::ByteConversionError, }; use satrs_example::{ - config::components::{NO_SENDER, PCDU_HANDLER, PUS_MODE_SERVICE}, + config::{ + components::{NO_SENDER, PCDU_HANDLER}, + pus::PUS_MODE_SERVICE, + }, DeviceMode, TimestampHelper, }; use satrs_minisim::{ @@ -508,7 +511,10 @@ mod tests { use satrs::{ mode::ModeRequest, power::SwitchStateBinary, request::GenericMessage, tmtc::PacketAsVec, }; - use satrs_example::config::components::{Apid, EPS_SUBSYSTEM, MGM_HANDLER_0, PCDU_HANDLER}; + use satrs_example::config::{ + acs::MGM_HANDLER_0, + components::{Apid, EPS_SUBSYSTEM, PCDU_HANDLER}, + }; use satrs_minisim::eps::SwitchMapBinary; use super::*; diff --git a/satrs-example/src/events.rs b/satrs-example/src/events.rs index 8f4bd08..f51b080 100644 --- a/satrs-example/src/events.rs +++ b/satrs-example/src/events.rs @@ -16,7 +16,7 @@ use satrs::{ }, spacepackets::time::cds::CdsTime, }; -use satrs_example::config::components::PUS_EVENT_MANAGEMENT; +use satrs_example::config::pus::PUS_EVENT_MANAGEMENT; use crate::update_time; diff --git a/satrs-example/src/main.rs b/satrs-example/src/main.rs index 0e5be95..2f6ff91 100644 --- a/satrs-example/src/main.rs +++ b/satrs-example/src/main.rs @@ -39,7 +39,8 @@ use satrs::{ }; use satrs_example::{ config::{ - components::{MGM_HANDLER_0, NO_SENDER, PCDU_HANDLER, TCP_SERVER, UDP_SERVER}, + acs::{MGM_HANDLER_0, MGM_HANDLER_1}, + components::{NO_SENDER, PCDU_HANDLER, TCP_SERVER, UDP_SERVER}, pool::create_sched_tc_pool, tasks::{FREQ_MS_AOCS, FREQ_MS_PUS_STACK, FREQ_MS_UDP_TMTC, SIM_CLIENT_IDLE_DELAY_MS}, OBSW_SERVER_ADDR, PACKET_ID_VALIDATOR, SERVER_PORT, @@ -107,20 +108,26 @@ fn main() { } let (sim_request_tx, sim_request_rx) = mpsc::channel(); - let (mgm_sim_reply_tx, mgm_sim_reply_rx) = mpsc::channel(); + let (mgm_0_sim_reply_tx, mgm_0_sim_reply_rx) = mpsc::channel(); + let (mgm_1_sim_reply_tx, mgm_1_sim_reply_rx) = mpsc::channel(); let (pcdu_sim_reply_tx, pcdu_sim_reply_rx) = mpsc::channel(); let mut opt_sim_client = create_sim_client(sim_request_rx); - let (mgm_handler_composite_tx, mgm_handler_composite_rx) = mpsc::sync_channel(10); + let (mgm_0_handler_composite_tx, mgm_0_handler_composite_rx) = mpsc::sync_channel(10); + let (mgm_1_handler_composite_tx, mgm_1_handler_composite_rx) = mpsc::sync_channel(10); let (pcdu_handler_composite_tx, pcdu_handler_composite_rx) = mpsc::sync_channel(30); - let (mgm_handler_mode_tx, mgm_handler_mode_rx) = mpsc::sync_channel(5); + let (mgm_0_handler_mode_tx, mgm_0_handler_mode_rx) = mpsc::sync_channel(5); + let (mgm_1_handler_mode_tx, mgm_1_handler_mode_rx) = mpsc::sync_channel(5); let (pcdu_handler_mode_tx, pcdu_handler_mode_rx) = mpsc::sync_channel(5); // Some request are targetable. This map is used to retrieve sender handles based on a target ID. let mut request_map = GenericRequestRouter::default(); request_map .composite_router_map - .insert(MGM_HANDLER_0.id(), mgm_handler_composite_tx); + .insert(MGM_HANDLER_0.id(), mgm_0_handler_composite_tx); + request_map + .composite_router_map + .insert(MGM_HANDLER_0.id(), mgm_1_handler_composite_tx); request_map .composite_router_map .insert(PCDU_HANDLER.id(), pcdu_handler_composite_tx); @@ -292,34 +299,67 @@ fn main() { let (switch_request_tx, switch_request_rx) = mpsc::sync_channel(20); let switch_helper = PowerSwitchHelper::new(switch_request_tx, shared_switch_set.clone()); - let shared_mgm_set = Arc::default(); - let mgm_mode_node = - ModeRequestHandlerMpscBounded::new(MGM_HANDLER_0.into(), mgm_handler_mode_rx); - let mgm_spi_interface = if let Some(sim_client) = opt_sim_client.as_mut() { - sim_client.add_reply_recipient(satrs_minisim::SimComponent::MgmLis3Mdl, mgm_sim_reply_tx); - SpiSimInterfaceWrapper::Sim(SpiSimInterface { - sim_request_tx: sim_request_tx.clone(), - sim_reply_rx: mgm_sim_reply_rx, - }) - } else { - SpiSimInterfaceWrapper::Dummy(SpiDummyInterface::default()) - }; - let mut mgm_handler = MgmHandlerLis3Mdl::new( + let shared_mgm_0_set = Arc::default(); + let shared_mgm_1_set = Arc::default(); + let mgm_0_mode_node = + ModeRequestHandlerMpscBounded::new(MGM_HANDLER_0.into(), mgm_0_handler_mode_rx); + let mgm_1_mode_node = + ModeRequestHandlerMpscBounded::new(MGM_HANDLER_1.into(), mgm_1_handler_mode_rx); + let (mgm_0_spi_interface, mgm_1_spi_interface) = + if let Some(sim_client) = opt_sim_client.as_mut() { + sim_client + .add_reply_recipient(satrs_minisim::SimComponent::Mgm0Lis3Mdl, mgm_0_sim_reply_tx); + sim_client + .add_reply_recipient(satrs_minisim::SimComponent::Mgm1Lis3Mdl, mgm_1_sim_reply_tx); + ( + SpiSimInterfaceWrapper::Sim(SpiSimInterface { + sim_request_tx: sim_request_tx.clone(), + sim_reply_rx: mgm_0_sim_reply_rx, + }), + SpiSimInterfaceWrapper::Sim(SpiSimInterface { + sim_request_tx: sim_request_tx.clone(), + sim_reply_rx: mgm_1_sim_reply_rx, + }), + ) + } else { + ( + SpiSimInterfaceWrapper::Dummy(SpiDummyInterface::default()), + SpiSimInterfaceWrapper::Dummy(SpiDummyInterface::default()), + ) + }; + let mut mgm_0_handler = MgmHandlerLis3Mdl::new( MGM_HANDLER_0, "MGM_0", - mgm_mode_node, - mgm_handler_composite_rx, + mgm_0_mode_node, + mgm_0_handler_composite_rx, pus_hk_reply_tx.clone(), switch_helper.clone(), tm_sender.clone(), - mgm_spi_interface, - shared_mgm_set, + mgm_0_spi_interface, + shared_mgm_0_set, ); - // Connect PUS service to device handler. + let mut mgm_1_handler = MgmHandlerLis3Mdl::new( + MGM_HANDLER_1, + "MGM_1", + mgm_1_mode_node, + mgm_1_handler_composite_rx, + pus_hk_reply_tx.clone(), + switch_helper.clone(), + tm_sender.clone(), + mgm_1_spi_interface, + shared_mgm_1_set, + ); + // Connect PUS service to device handlers. connect_mode_nodes( &mut pus_stack.mode_srv, - mgm_handler_mode_tx, - &mut mgm_handler, + mgm_0_handler_mode_tx, + &mut mgm_0_handler, + pus_mode_reply_tx.clone(), + ); + connect_mode_nodes( + &mut pus_stack.mode_srv, + mgm_1_handler_mode_tx, + &mut mgm_1_handler, pus_mode_reply_tx.clone(), ); @@ -414,7 +454,8 @@ fn main() { let jh_aocs = thread::Builder::new() .name("sat-rs aocs".to_string()) .spawn(move || loop { - mgm_handler.periodic_operation(); + mgm_0_handler.periodic_operation(); + mgm_1_handler.periodic_operation(); thread::sleep(Duration::from_millis(FREQ_MS_AOCS)); }) .unwrap(); diff --git a/satrs-example/src/pus/action.rs b/satrs-example/src/pus/action.rs index 585c278..17a7655 100644 --- a/satrs-example/src/pus/action.rs +++ b/satrs-example/src/pus/action.rs @@ -16,7 +16,7 @@ use satrs::pus::{ use satrs::request::{GenericMessage, UniqueApidTargetId}; use satrs::spacepackets::ecss::tc::PusTcReader; use satrs::spacepackets::ecss::{EcssEnumU16, PusPacket, PusServiceId}; -use satrs_example::config::components::PUS_ACTION_SERVICE; +use satrs_example::config::pus::PUS_ACTION_SERVICE; use satrs_example::config::tmtc_err; use std::sync::mpsc; use std::time::Duration; diff --git a/satrs-example/src/pus/event.rs b/satrs-example/src/pus/event.rs index e21c81e..73d1886 100644 --- a/satrs-example/src/pus/event.rs +++ b/satrs-example/src/pus/event.rs @@ -10,7 +10,7 @@ use satrs::pus::{ PartialPusHandlingError, PusServiceHelper, }; use satrs::spacepackets::ecss::PusServiceId; -use satrs_example::config::components::PUS_EVENT_MANAGEMENT; +use satrs_example::config::pus::PUS_EVENT_MANAGEMENT; use super::{DirectPusService, HandlingStatus}; diff --git a/satrs-example/src/pus/hk.rs b/satrs-example/src/pus/hk.rs index b5e9eed..20a9b0e 100644 --- a/satrs-example/src/pus/hk.rs +++ b/satrs-example/src/pus/hk.rs @@ -13,7 +13,7 @@ use satrs::request::{GenericMessage, UniqueApidTargetId}; use satrs::res_code::ResultU16; use satrs::spacepackets::ecss::tc::PusTcReader; use satrs::spacepackets::ecss::{hk, PusPacket, PusServiceId}; -use satrs_example::config::components::PUS_HK_SERVICE; +use satrs_example::config::pus::PUS_HK_SERVICE; use satrs_example::config::{hk_err, tmtc_err}; use std::sync::mpsc; use std::time::Duration; diff --git a/satrs-example/src/pus/mod.rs b/satrs-example/src/pus/mod.rs index 8e68431..d76aa24 100644 --- a/satrs-example/src/pus/mod.rs +++ b/satrs-example/src/pus/mod.rs @@ -18,7 +18,7 @@ use satrs::spacepackets::ecss::tc::PusTcReader; use satrs::spacepackets::ecss::{PusPacket, PusServiceId}; use satrs::tmtc::{PacketAsVec, PacketInPool}; use satrs::ComponentId; -use satrs_example::config::components::PUS_ROUTING_SERVICE; +use satrs_example::config::pus::PUS_ROUTING_SERVICE; use satrs_example::config::{tmtc_err, CustomPusServiceId}; use satrs_example::TimestampHelper; use std::fmt::Debug; diff --git a/satrs-example/src/pus/mode.rs b/satrs-example/src/pus/mode.rs index 4f0aa0a..af7aba5 100644 --- a/satrs-example/src/pus/mode.rs +++ b/satrs-example/src/pus/mode.rs @@ -1,5 +1,6 @@ use derive_new::new; use satrs::mode_tree::{ModeNode, ModeParent}; +use satrs_example::config::pus::PUS_MODE_SERVICE; use std::sync::mpsc; use std::time::Duration; @@ -33,7 +34,6 @@ use satrs::{ }, ComponentId, }; -use satrs_example::config::components::PUS_MODE_SERVICE; use satrs_example::config::{mode_err, tmtc_err, CustomPusServiceId}; use super::{ diff --git a/satrs-example/src/pus/scheduler.rs b/satrs-example/src/pus/scheduler.rs index 1526326..a8acf1f 100644 --- a/satrs-example/src/pus/scheduler.rs +++ b/satrs-example/src/pus/scheduler.rs @@ -15,7 +15,7 @@ use satrs::pus::{ use satrs::spacepackets::ecss::PusServiceId; use satrs::tmtc::{PacketAsVec, PacketInPool, PacketSenderWithSharedPool}; use satrs::ComponentId; -use satrs_example::config::components::PUS_SCHED_SERVICE; +use satrs_example::config::pus::PUS_SCHED_SERVICE; use super::{DirectPusService, HandlingStatus}; diff --git a/satrs-example/src/pus/test.rs b/satrs-example/src/pus/test.rs index cf72938..b80fcd4 100644 --- a/satrs-example/src/pus/test.rs +++ b/satrs-example/src/pus/test.rs @@ -11,7 +11,7 @@ use satrs::pus::{ }; use satrs::spacepackets::ecss::tc::PusTcReader; use satrs::spacepackets::ecss::{PusPacket, PusServiceId}; -use satrs_example::config::components::PUS_TEST_SERVICE; +use satrs_example::config::pus::PUS_TEST_SERVICE; use satrs_example::config::{tmtc_err, TEST_EVENT}; use std::sync::mpsc; diff --git a/satrs-example/src/requests.rs b/satrs-example/src/requests.rs index 1db6ac1..1e1d478 100644 --- a/satrs-example/src/requests.rs +++ b/satrs-example/src/requests.rs @@ -14,7 +14,7 @@ use satrs::request::{GenericMessage, MessageMetadata, UniqueApidTargetId}; use satrs::spacepackets::ecss::tc::PusTcReader; use satrs::spacepackets::ecss::PusPacket; use satrs::ComponentId; -use satrs_example::config::components::PUS_ROUTING_SERVICE; +use satrs_example::config::pus::PUS_ROUTING_SERVICE; use satrs_example::config::tmtc_err; #[derive(Clone, Debug)] diff --git a/satrs-minisim/src/acs.rs b/satrs-minisim/src/acs.rs index 46a5753..c4c5692 100644 --- a/satrs-minisim/src/acs.rs +++ b/satrs-minisim/src/acs.rs @@ -203,7 +203,7 @@ pub mod tests { let sim_reply = sim_testbench.try_receive_next_reply(); assert!(sim_reply.is_some()); let sim_reply = sim_reply.unwrap(); - assert_eq!(sim_reply.component(), SimComponent::MgmLis3Mdl); + assert_eq!(sim_reply.component(), SimComponent::Mgm0Lis3Mdl); let reply = MgmLis3MdlReply::from_sim_message(&sim_reply) .expect("failed to deserialize MGM sensor values"); assert_eq!(reply.common.switch_state, SwitchStateBinary::Off); @@ -226,7 +226,7 @@ pub mod tests { let mut sim_reply_res = sim_testbench.try_receive_next_reply(); assert!(sim_reply_res.is_some()); let mut sim_reply = sim_reply_res.unwrap(); - assert_eq!(sim_reply.component(), SimComponent::MgmLis3Mdl); + assert_eq!(sim_reply.component(), SimComponent::Mgm0Lis3Mdl); let first_reply = MgmLis3MdlReply::from_sim_message(&sim_reply) .expect("failed to deserialize MGM sensor values"); sim_testbench.step_until(Duration::from_millis(50)).unwrap(); diff --git a/satrs-minisim/src/controller.rs b/satrs-minisim/src/controller.rs index a04b239..3446135 100644 --- a/satrs-minisim/src/controller.rs +++ b/satrs-minisim/src/controller.rs @@ -24,7 +24,8 @@ const PCDU_REQ_WIRETAPPING: bool = false; const MGT_REQ_WIRETAPPING: bool = false; pub struct ModelAddrWrapper { - mgm_addr: Address>, + mgm_0_addr: Address>, + mgm_1_addr: Address>, pcdu_addr: Address, mgt_addr: Address, } @@ -42,12 +43,14 @@ pub struct SimController { impl ModelAddrWrapper { pub fn new( - mgm_addr: Address>, + mgm_0_addr: Address>, + mgm_1_addr: Address>, pcdu_addr: Address, mgt_addr: Address, ) -> Self { Self { - mgm_addr, + mgm_0_addr, + mgm_1_addr, pcdu_addr, mgt_addr, } @@ -96,7 +99,8 @@ impl SimController { } if let Err(e) = match request.component() { SimComponent::SimCtrl => self.handle_ctrl_request(&request), - SimComponent::MgmLis3Mdl => self.handle_mgm_request(&request), + SimComponent::Mgm0Lis3Mdl => self.handle_mgm_request(0, &request), + SimComponent::Mgm1Lis3Mdl => self.handle_mgm_request(1, &request), SimComponent::Mgt => self.handle_mgt_request(&request), SimComponent::Pcdu => self.handle_pcdu_request(&request), } { @@ -128,19 +132,25 @@ impl SimController { Ok(()) } - fn handle_mgm_request(&mut self, request: &SimRequest) -> Result<(), SimRequestError> { + fn handle_mgm_request( + &mut self, + mgm_idx: usize, + request: &SimRequest, + ) -> Result<(), SimRequestError> { let mgm_request = MgmRequestLis3Mdl::from_sim_message(request)?; if MGM_REQ_WIRETAPPING { log::info!("received MGM request: {:?}", mgm_request); } match mgm_request { MgmRequestLis3Mdl::RequestSensorData => { + let addr = match mgm_idx { + 0 => &self.addr_wrapper.mgm_0_addr, + 1 => &self.addr_wrapper.mgm_1_addr, + + _ => panic!("invalid mgm index"), + }; self.simulation - .process_event( - MagnetometerModel::send_sensor_values, - (), - &self.addr_wrapper.mgm_addr, - ) + .process_event(MagnetometerModel::send_sensor_values, (), addr) .expect("event execution error for mgm"); } } diff --git a/satrs-minisim/src/eps.rs b/satrs-minisim/src/eps.rs index e68e5c1..466a1cd 100644 --- a/satrs-minisim/src/eps.rs +++ b/satrs-minisim/src/eps.rs @@ -14,7 +14,8 @@ pub const SWITCH_INFO_DELAY_MS: u64 = 10; pub struct PcduModel { pub switcher_map: SwitchMapBinaryWrapper, - pub mgm_switch: Output, + pub mgm_0_switch: Output, + pub mgm_1_switch: Output, pub mgt_switch: Output, pub reply_sender: mpsc::Sender, } @@ -23,7 +24,8 @@ impl PcduModel { pub fn new(reply_sender: mpsc::Sender) -> Self { Self { switcher_map: Default::default(), - mgm_switch: Output::new(), + mgm_0_switch: Output::new(), + mgm_1_switch: Output::new(), mgt_switch: Output::new(), reply_sender, } @@ -55,7 +57,7 @@ impl PcduModel { *val = switch_and_target_state.1; match switch_and_target_state.0 { PcduSwitch::Mgm => { - self.mgm_switch.send(switch_and_target_state.1).await; + self.mgm_0_switch.send(switch_and_target_state.1).await; } PcduSwitch::Mgt => { self.mgt_switch.send(switch_and_target_state.1).await; diff --git a/satrs-minisim/src/lib.rs b/satrs-minisim/src/lib.rs index b97cd5b..508f358 100644 --- a/satrs-minisim/src/lib.rs +++ b/satrs-minisim/src/lib.rs @@ -5,7 +5,8 @@ use serde::{de::DeserializeOwned, Deserialize, Serialize}; #[derive(Debug, Copy, Clone, PartialEq, Eq, Serialize, Deserialize, Hash)] pub enum SimComponent { SimCtrl, - MgmLis3Mdl, + Mgm0Lis3Mdl, + Mgm1Lis3Mdl, Mgt, Pcdu, } @@ -277,7 +278,7 @@ pub mod acs { } impl SerializableSimMsgPayload for MgmRequestLis3Mdl { - const TARGET: SimComponent = SimComponent::MgmLis3Mdl; + const TARGET: SimComponent = SimComponent::Mgm0Lis3Mdl; } // Normally, small magnetometers generate their output as a signed 16 bit raw format or something @@ -368,7 +369,7 @@ pub mod acs { } impl SerializableSimMsgPayload for MgmLis3MdlReply { - const TARGET: SimComponent = SimComponent::MgmLis3Mdl; + const TARGET: SimComponent = SimComponent::Mgm0Lis3Mdl; } impl MgmReplyProvider for MgmLis3MdlReply { @@ -418,7 +419,7 @@ pub mod acs { } impl SerializableSimMsgPayload for MgtReply { - const TARGET: SimComponent = SimComponent::MgmLis3Mdl; + const TARGET: SimComponent = SimComponent::Mgm0Lis3Mdl; } } diff --git a/satrs-minisim/src/main.rs b/satrs-minisim/src/main.rs index 73f3462..3dee29f 100644 --- a/satrs-minisim/src/main.rs +++ b/satrs-minisim/src/main.rs @@ -31,11 +31,15 @@ fn create_sim_controller( request_receiver: mpsc::Receiver, ) -> SimController { // Instantiate models and their mailboxes. - let mgm_model = + let mgm_0_model = + MagnetometerModel::new_for_lis3mdl(Duration::from_millis(50), reply_sender.clone()); + let mgm_1_model = MagnetometerModel::new_for_lis3mdl(Duration::from_millis(50), reply_sender.clone()); - let mgm_mailbox = Mailbox::new(); - let mgm_addr = mgm_mailbox.address(); + let mgm_0_mailbox = Mailbox::new(); + let mgm_0_addr = mgm_0_mailbox.address(); + let mgm_1_mailbox = Mailbox::new(); + let mgm_1_addr = mgm_1_mailbox.address(); let pcdu_mailbox = Mailbox::new(); let pcdu_addr = pcdu_mailbox.address(); let mgt_mailbox = Mailbox::new(); @@ -43,8 +47,11 @@ fn create_sim_controller( let mut pcdu_model = PcduModel::new(reply_sender.clone()); pcdu_model - .mgm_switch - .connect(MagnetometerModel::switch_device, &mgm_addr); + .mgm_0_switch + .connect(MagnetometerModel::switch_device, &mgm_0_addr); + pcdu_model + .mgm_1_switch + .connect(MagnetometerModel::switch_device, &mgm_1_addr); let mut mgt_model = MagnetorquerModel::new(reply_sender.clone()); // Input connections. @@ -54,7 +61,10 @@ fn create_sim_controller( // Output connections. mgt_model .gen_magnetic_field - .connect(MagnetometerModel::apply_external_magnetic_field, &mgm_addr); + .connect(MagnetometerModel::apply_external_magnetic_field, &mgm_0_addr); + mgt_model + .gen_magnetic_field + .connect(MagnetometerModel::apply_external_magnetic_field, &mgm_1_addr); // Instantiate the simulator let sys_clock = SystemClock::from_system_time(start_time, SystemTime::now()); @@ -63,9 +73,10 @@ fn create_sim_controller( } else { SimInit::new() }; - let addrs = ModelAddrWrapper::new(mgm_addr, pcdu_addr, mgt_addr); + let addrs = ModelAddrWrapper::new(mgm_0_addr, mgm_1_addr, pcdu_addr, mgt_addr); let (simulation, scheduler) = sim_init - .add_model(mgm_model, mgm_mailbox, "MGM model") + .add_model(mgm_0_model, mgm_0_mailbox, "MGM 0 model") + .add_model(mgm_1_model, mgm_1_mailbox, "MGM 1 model") .add_model(pcdu_model, pcdu_mailbox, "PCDU model") .add_model(mgt_model, mgt_mailbox, "MGT model") .init(start_time)