add additional MGM dev. We need those auto-generators..
This commit is contained in:
parent
a4bebbbb98
commit
e12d328b80
@ -39,7 +39,10 @@ class EventU32:
|
|||||||
|
|
||||||
|
|
||||||
class AcsId(enum.IntEnum):
|
class AcsId(enum.IntEnum):
|
||||||
MGM_0 = 0
|
SUBSYSTEM = 1
|
||||||
|
MGM_ASSEMBLY = 2
|
||||||
|
MGM_0 = 3
|
||||||
|
MGM_1 = 4
|
||||||
|
|
||||||
|
|
||||||
class AcsHkIds(enum.IntEnum):
|
class AcsHkIds(enum.IntEnum):
|
||||||
|
@ -2,6 +2,7 @@ use derive_new::new;
|
|||||||
use satrs::hk::{HkRequest, HkRequestVariant};
|
use satrs::hk::{HkRequest, HkRequestVariant};
|
||||||
use satrs::mode_tree::{ModeChild, ModeNode};
|
use satrs::mode_tree::{ModeChild, ModeNode};
|
||||||
use satrs::power::{PowerSwitchInfo, PowerSwitcherCommandSender};
|
use satrs::power::{PowerSwitchInfo, PowerSwitcherCommandSender};
|
||||||
|
use satrs_example::config::pus::PUS_MODE_SERVICE;
|
||||||
use satrs_example::{DeviceMode, TimestampHelper};
|
use satrs_example::{DeviceMode, TimestampHelper};
|
||||||
use satrs_minisim::acs::lis3mdl::{
|
use satrs_minisim::acs::lis3mdl::{
|
||||||
MgmLis3MdlReply, MgmLis3RawValues, FIELD_LSB_PER_GAUSS_4_SENS, GAUSS_TO_MICROTESLA_FACTOR,
|
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::pus::{EcssTmSender, PusTmVariant};
|
||||||
use satrs::request::{GenericMessage, MessageMetadata, UniqueApidTargetId};
|
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::hk::PusHkHelper;
|
||||||
use crate::pus::hk::{HkReply, HkReplyVariant};
|
use crate::pus::hk::{HkReply, HkReplyVariant};
|
||||||
@ -491,7 +492,7 @@ mod tests {
|
|||||||
tmtc::PacketAsVec,
|
tmtc::PacketAsVec,
|
||||||
ComponentId,
|
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 satrs_minisim::acs::lis3mdl::MgmLis3RawValues;
|
||||||
|
|
||||||
use crate::{eps::TestSwitchHelper, pus::hk::HkReply, requests::CompositeRequest};
|
use crate::{eps::TestSwitchHelper, pus::hk::HkReply, requests::CompositeRequest};
|
||||||
|
@ -135,23 +135,6 @@ pub mod components {
|
|||||||
Eps = 6,
|
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)]
|
#[derive(Copy, Clone, PartialEq, Eq)]
|
||||||
pub enum EpsId {
|
pub enum EpsId {
|
||||||
Pcdu = 0,
|
Pcdu = 0,
|
||||||
@ -164,6 +147,31 @@ pub mod components {
|
|||||||
TcpServer = 1,
|
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 =
|
pub const PUS_ACTION_SERVICE: UniqueApidTargetId =
|
||||||
UniqueApidTargetId::new(Apid::GenericPus as u16, PusId::PusAction as u32);
|
UniqueApidTargetId::new(Apid::GenericPus as u16, PusId::PusAction as u32);
|
||||||
pub const PUS_EVENT_MANAGEMENT: UniqueApidTargetId =
|
pub const PUS_EVENT_MANAGEMENT: UniqueApidTargetId =
|
||||||
@ -178,19 +186,26 @@ pub mod components {
|
|||||||
UniqueApidTargetId::new(Apid::GenericPus as u16, PusId::PusHk as u32);
|
UniqueApidTargetId::new(Apid::GenericPus as u16, PusId::PusHk as u32);
|
||||||
pub const PUS_SCHED_SERVICE: UniqueApidTargetId =
|
pub const PUS_SCHED_SERVICE: UniqueApidTargetId =
|
||||||
UniqueApidTargetId::new(Apid::Sched as u16, 0);
|
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 =
|
pub const MGM_ASSEMBLY: UniqueApidTargetId =
|
||||||
UniqueApidTargetId::new(Apid::Acs as u16, AcsId::Assembly as u32);
|
UniqueApidTargetId::new(Apid::Acs as u16, AcsId::Assembly as u32);
|
||||||
pub const MGM_HANDLER_0: UniqueApidTargetId =
|
pub const MGM_HANDLER_0: UniqueApidTargetId =
|
||||||
UniqueApidTargetId::new(Apid::Acs as u16, AcsId::Mgm0 as u32);
|
UniqueApidTargetId::new(Apid::Acs as u16, AcsId::Mgm0 as u32);
|
||||||
pub const EPS_SUBSYSTEM: UniqueApidTargetId =
|
pub const MGM_HANDLER_1: UniqueApidTargetId =
|
||||||
UniqueApidTargetId::new(Apid::Eps as u16, EpsId::Subsystem as u32);
|
UniqueApidTargetId::new(Apid::Acs as u16, AcsId::Mgm0 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 pool {
|
pub mod pool {
|
||||||
|
@ -20,7 +20,10 @@ use satrs::{
|
|||||||
spacepackets::ByteConversionError,
|
spacepackets::ByteConversionError,
|
||||||
};
|
};
|
||||||
use satrs_example::{
|
use satrs_example::{
|
||||||
config::components::{NO_SENDER, PCDU_HANDLER, PUS_MODE_SERVICE},
|
config::{
|
||||||
|
components::{NO_SENDER, PCDU_HANDLER},
|
||||||
|
pus::PUS_MODE_SERVICE,
|
||||||
|
},
|
||||||
DeviceMode, TimestampHelper,
|
DeviceMode, TimestampHelper,
|
||||||
};
|
};
|
||||||
use satrs_minisim::{
|
use satrs_minisim::{
|
||||||
@ -508,7 +511,10 @@ mod tests {
|
|||||||
use satrs::{
|
use satrs::{
|
||||||
mode::ModeRequest, power::SwitchStateBinary, request::GenericMessage, tmtc::PacketAsVec,
|
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 satrs_minisim::eps::SwitchMapBinary;
|
||||||
|
|
||||||
use super::*;
|
use super::*;
|
||||||
|
@ -16,7 +16,7 @@ use satrs::{
|
|||||||
},
|
},
|
||||||
spacepackets::time::cds::CdsTime,
|
spacepackets::time::cds::CdsTime,
|
||||||
};
|
};
|
||||||
use satrs_example::config::components::PUS_EVENT_MANAGEMENT;
|
use satrs_example::config::pus::PUS_EVENT_MANAGEMENT;
|
||||||
|
|
||||||
use crate::update_time;
|
use crate::update_time;
|
||||||
|
|
||||||
|
@ -39,7 +39,8 @@ use satrs::{
|
|||||||
};
|
};
|
||||||
use satrs_example::{
|
use satrs_example::{
|
||||||
config::{
|
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,
|
pool::create_sched_tc_pool,
|
||||||
tasks::{FREQ_MS_AOCS, FREQ_MS_PUS_STACK, FREQ_MS_UDP_TMTC, SIM_CLIENT_IDLE_DELAY_MS},
|
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,
|
OBSW_SERVER_ADDR, PACKET_ID_VALIDATOR, SERVER_PORT,
|
||||||
@ -107,20 +108,26 @@ fn main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let (sim_request_tx, sim_request_rx) = mpsc::channel();
|
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 (pcdu_sim_reply_tx, pcdu_sim_reply_rx) = mpsc::channel();
|
||||||
let mut opt_sim_client = create_sim_client(sim_request_rx);
|
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 (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);
|
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.
|
// Some request are targetable. This map is used to retrieve sender handles based on a target ID.
|
||||||
let mut request_map = GenericRequestRouter::default();
|
let mut request_map = GenericRequestRouter::default();
|
||||||
request_map
|
request_map
|
||||||
.composite_router_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
|
request_map
|
||||||
.composite_router_map
|
.composite_router_map
|
||||||
.insert(PCDU_HANDLER.id(), pcdu_handler_composite_tx);
|
.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_request_tx, switch_request_rx) = mpsc::sync_channel(20);
|
||||||
let switch_helper = PowerSwitchHelper::new(switch_request_tx, shared_switch_set.clone());
|
let switch_helper = PowerSwitchHelper::new(switch_request_tx, shared_switch_set.clone());
|
||||||
|
|
||||||
let shared_mgm_set = Arc::default();
|
let shared_mgm_0_set = Arc::default();
|
||||||
let mgm_mode_node =
|
let shared_mgm_1_set = Arc::default();
|
||||||
ModeRequestHandlerMpscBounded::new(MGM_HANDLER_0.into(), mgm_handler_mode_rx);
|
let mgm_0_mode_node =
|
||||||
let mgm_spi_interface = if let Some(sim_client) = opt_sim_client.as_mut() {
|
ModeRequestHandlerMpscBounded::new(MGM_HANDLER_0.into(), mgm_0_handler_mode_rx);
|
||||||
sim_client.add_reply_recipient(satrs_minisim::SimComponent::MgmLis3Mdl, mgm_sim_reply_tx);
|
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 {
|
SpiSimInterfaceWrapper::Sim(SpiSimInterface {
|
||||||
sim_request_tx: sim_request_tx.clone(),
|
sim_request_tx: sim_request_tx.clone(),
|
||||||
sim_reply_rx: mgm_sim_reply_rx,
|
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 {
|
} else {
|
||||||
SpiSimInterfaceWrapper::Dummy(SpiDummyInterface::default())
|
(
|
||||||
|
SpiSimInterfaceWrapper::Dummy(SpiDummyInterface::default()),
|
||||||
|
SpiSimInterfaceWrapper::Dummy(SpiDummyInterface::default()),
|
||||||
|
)
|
||||||
};
|
};
|
||||||
let mut mgm_handler = MgmHandlerLis3Mdl::new(
|
let mut mgm_0_handler = MgmHandlerLis3Mdl::new(
|
||||||
MGM_HANDLER_0,
|
MGM_HANDLER_0,
|
||||||
"MGM_0",
|
"MGM_0",
|
||||||
mgm_mode_node,
|
mgm_0_mode_node,
|
||||||
mgm_handler_composite_rx,
|
mgm_0_handler_composite_rx,
|
||||||
pus_hk_reply_tx.clone(),
|
pus_hk_reply_tx.clone(),
|
||||||
switch_helper.clone(),
|
switch_helper.clone(),
|
||||||
tm_sender.clone(),
|
tm_sender.clone(),
|
||||||
mgm_spi_interface,
|
mgm_0_spi_interface,
|
||||||
shared_mgm_set,
|
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(
|
connect_mode_nodes(
|
||||||
&mut pus_stack.mode_srv,
|
&mut pus_stack.mode_srv,
|
||||||
mgm_handler_mode_tx,
|
mgm_0_handler_mode_tx,
|
||||||
&mut mgm_handler,
|
&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(),
|
pus_mode_reply_tx.clone(),
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -414,7 +454,8 @@ fn main() {
|
|||||||
let jh_aocs = thread::Builder::new()
|
let jh_aocs = thread::Builder::new()
|
||||||
.name("sat-rs aocs".to_string())
|
.name("sat-rs aocs".to_string())
|
||||||
.spawn(move || loop {
|
.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));
|
thread::sleep(Duration::from_millis(FREQ_MS_AOCS));
|
||||||
})
|
})
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
@ -16,7 +16,7 @@ use satrs::pus::{
|
|||||||
use satrs::request::{GenericMessage, UniqueApidTargetId};
|
use satrs::request::{GenericMessage, UniqueApidTargetId};
|
||||||
use satrs::spacepackets::ecss::tc::PusTcReader;
|
use satrs::spacepackets::ecss::tc::PusTcReader;
|
||||||
use satrs::spacepackets::ecss::{EcssEnumU16, PusPacket, PusServiceId};
|
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 satrs_example::config::tmtc_err;
|
||||||
use std::sync::mpsc;
|
use std::sync::mpsc;
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
@ -10,7 +10,7 @@ use satrs::pus::{
|
|||||||
PartialPusHandlingError, PusServiceHelper,
|
PartialPusHandlingError, PusServiceHelper,
|
||||||
};
|
};
|
||||||
use satrs::spacepackets::ecss::PusServiceId;
|
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};
|
use super::{DirectPusService, HandlingStatus};
|
||||||
|
|
||||||
|
@ -13,7 +13,7 @@ use satrs::request::{GenericMessage, UniqueApidTargetId};
|
|||||||
use satrs::res_code::ResultU16;
|
use satrs::res_code::ResultU16;
|
||||||
use satrs::spacepackets::ecss::tc::PusTcReader;
|
use satrs::spacepackets::ecss::tc::PusTcReader;
|
||||||
use satrs::spacepackets::ecss::{hk, PusPacket, PusServiceId};
|
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 satrs_example::config::{hk_err, tmtc_err};
|
||||||
use std::sync::mpsc;
|
use std::sync::mpsc;
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
@ -18,7 +18,7 @@ use satrs::spacepackets::ecss::tc::PusTcReader;
|
|||||||
use satrs::spacepackets::ecss::{PusPacket, PusServiceId};
|
use satrs::spacepackets::ecss::{PusPacket, PusServiceId};
|
||||||
use satrs::tmtc::{PacketAsVec, PacketInPool};
|
use satrs::tmtc::{PacketAsVec, PacketInPool};
|
||||||
use satrs::ComponentId;
|
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::config::{tmtc_err, CustomPusServiceId};
|
||||||
use satrs_example::TimestampHelper;
|
use satrs_example::TimestampHelper;
|
||||||
use std::fmt::Debug;
|
use std::fmt::Debug;
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
use derive_new::new;
|
use derive_new::new;
|
||||||
use satrs::mode_tree::{ModeNode, ModeParent};
|
use satrs::mode_tree::{ModeNode, ModeParent};
|
||||||
|
use satrs_example::config::pus::PUS_MODE_SERVICE;
|
||||||
use std::sync::mpsc;
|
use std::sync::mpsc;
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
|
||||||
@ -33,7 +34,6 @@ use satrs::{
|
|||||||
},
|
},
|
||||||
ComponentId,
|
ComponentId,
|
||||||
};
|
};
|
||||||
use satrs_example::config::components::PUS_MODE_SERVICE;
|
|
||||||
use satrs_example::config::{mode_err, tmtc_err, CustomPusServiceId};
|
use satrs_example::config::{mode_err, tmtc_err, CustomPusServiceId};
|
||||||
|
|
||||||
use super::{
|
use super::{
|
||||||
|
@ -15,7 +15,7 @@ use satrs::pus::{
|
|||||||
use satrs::spacepackets::ecss::PusServiceId;
|
use satrs::spacepackets::ecss::PusServiceId;
|
||||||
use satrs::tmtc::{PacketAsVec, PacketInPool, PacketSenderWithSharedPool};
|
use satrs::tmtc::{PacketAsVec, PacketInPool, PacketSenderWithSharedPool};
|
||||||
use satrs::ComponentId;
|
use satrs::ComponentId;
|
||||||
use satrs_example::config::components::PUS_SCHED_SERVICE;
|
use satrs_example::config::pus::PUS_SCHED_SERVICE;
|
||||||
|
|
||||||
use super::{DirectPusService, HandlingStatus};
|
use super::{DirectPusService, HandlingStatus};
|
||||||
|
|
||||||
|
@ -11,7 +11,7 @@ use satrs::pus::{
|
|||||||
};
|
};
|
||||||
use satrs::spacepackets::ecss::tc::PusTcReader;
|
use satrs::spacepackets::ecss::tc::PusTcReader;
|
||||||
use satrs::spacepackets::ecss::{PusPacket, PusServiceId};
|
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 satrs_example::config::{tmtc_err, TEST_EVENT};
|
||||||
use std::sync::mpsc;
|
use std::sync::mpsc;
|
||||||
|
|
||||||
|
@ -14,7 +14,7 @@ use satrs::request::{GenericMessage, MessageMetadata, UniqueApidTargetId};
|
|||||||
use satrs::spacepackets::ecss::tc::PusTcReader;
|
use satrs::spacepackets::ecss::tc::PusTcReader;
|
||||||
use satrs::spacepackets::ecss::PusPacket;
|
use satrs::spacepackets::ecss::PusPacket;
|
||||||
use satrs::ComponentId;
|
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;
|
use satrs_example::config::tmtc_err;
|
||||||
|
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
|
@ -203,7 +203,7 @@ pub mod tests {
|
|||||||
let sim_reply = sim_testbench.try_receive_next_reply();
|
let sim_reply = sim_testbench.try_receive_next_reply();
|
||||||
assert!(sim_reply.is_some());
|
assert!(sim_reply.is_some());
|
||||||
let sim_reply = sim_reply.unwrap();
|
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)
|
let reply = MgmLis3MdlReply::from_sim_message(&sim_reply)
|
||||||
.expect("failed to deserialize MGM sensor values");
|
.expect("failed to deserialize MGM sensor values");
|
||||||
assert_eq!(reply.common.switch_state, SwitchStateBinary::Off);
|
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();
|
let mut sim_reply_res = sim_testbench.try_receive_next_reply();
|
||||||
assert!(sim_reply_res.is_some());
|
assert!(sim_reply_res.is_some());
|
||||||
let mut sim_reply = sim_reply_res.unwrap();
|
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)
|
let first_reply = MgmLis3MdlReply::from_sim_message(&sim_reply)
|
||||||
.expect("failed to deserialize MGM sensor values");
|
.expect("failed to deserialize MGM sensor values");
|
||||||
sim_testbench.step_until(Duration::from_millis(50)).unwrap();
|
sim_testbench.step_until(Duration::from_millis(50)).unwrap();
|
||||||
|
@ -24,7 +24,8 @@ const PCDU_REQ_WIRETAPPING: bool = false;
|
|||||||
const MGT_REQ_WIRETAPPING: bool = false;
|
const MGT_REQ_WIRETAPPING: bool = false;
|
||||||
|
|
||||||
pub struct ModelAddrWrapper {
|
pub struct ModelAddrWrapper {
|
||||||
mgm_addr: Address<MagnetometerModel<MgmLis3MdlReply>>,
|
mgm_0_addr: Address<MagnetometerModel<MgmLis3MdlReply>>,
|
||||||
|
mgm_1_addr: Address<MagnetometerModel<MgmLis3MdlReply>>,
|
||||||
pcdu_addr: Address<PcduModel>,
|
pcdu_addr: Address<PcduModel>,
|
||||||
mgt_addr: Address<MagnetorquerModel>,
|
mgt_addr: Address<MagnetorquerModel>,
|
||||||
}
|
}
|
||||||
@ -42,12 +43,14 @@ pub struct SimController {
|
|||||||
|
|
||||||
impl ModelAddrWrapper {
|
impl ModelAddrWrapper {
|
||||||
pub fn new(
|
pub fn new(
|
||||||
mgm_addr: Address<MagnetometerModel<MgmLis3MdlReply>>,
|
mgm_0_addr: Address<MagnetometerModel<MgmLis3MdlReply>>,
|
||||||
|
mgm_1_addr: Address<MagnetometerModel<MgmLis3MdlReply>>,
|
||||||
pcdu_addr: Address<PcduModel>,
|
pcdu_addr: Address<PcduModel>,
|
||||||
mgt_addr: Address<MagnetorquerModel>,
|
mgt_addr: Address<MagnetorquerModel>,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
Self {
|
Self {
|
||||||
mgm_addr,
|
mgm_0_addr,
|
||||||
|
mgm_1_addr,
|
||||||
pcdu_addr,
|
pcdu_addr,
|
||||||
mgt_addr,
|
mgt_addr,
|
||||||
}
|
}
|
||||||
@ -96,7 +99,8 @@ impl SimController {
|
|||||||
}
|
}
|
||||||
if let Err(e) = match request.component() {
|
if let Err(e) = match request.component() {
|
||||||
SimComponent::SimCtrl => self.handle_ctrl_request(&request),
|
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::Mgt => self.handle_mgt_request(&request),
|
||||||
SimComponent::Pcdu => self.handle_pcdu_request(&request),
|
SimComponent::Pcdu => self.handle_pcdu_request(&request),
|
||||||
} {
|
} {
|
||||||
@ -128,19 +132,25 @@ impl SimController {
|
|||||||
Ok(())
|
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)?;
|
let mgm_request = MgmRequestLis3Mdl::from_sim_message(request)?;
|
||||||
if MGM_REQ_WIRETAPPING {
|
if MGM_REQ_WIRETAPPING {
|
||||||
log::info!("received MGM request: {:?}", mgm_request);
|
log::info!("received MGM request: {:?}", mgm_request);
|
||||||
}
|
}
|
||||||
match mgm_request {
|
match mgm_request {
|
||||||
MgmRequestLis3Mdl::RequestSensorData => {
|
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
|
self.simulation
|
||||||
.process_event(
|
.process_event(MagnetometerModel::send_sensor_values, (), addr)
|
||||||
MagnetometerModel::send_sensor_values,
|
|
||||||
(),
|
|
||||||
&self.addr_wrapper.mgm_addr,
|
|
||||||
)
|
|
||||||
.expect("event execution error for mgm");
|
.expect("event execution error for mgm");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -14,7 +14,8 @@ pub const SWITCH_INFO_DELAY_MS: u64 = 10;
|
|||||||
|
|
||||||
pub struct PcduModel {
|
pub struct PcduModel {
|
||||||
pub switcher_map: SwitchMapBinaryWrapper,
|
pub switcher_map: SwitchMapBinaryWrapper,
|
||||||
pub mgm_switch: Output<SwitchStateBinary>,
|
pub mgm_0_switch: Output<SwitchStateBinary>,
|
||||||
|
pub mgm_1_switch: Output<SwitchStateBinary>,
|
||||||
pub mgt_switch: Output<SwitchStateBinary>,
|
pub mgt_switch: Output<SwitchStateBinary>,
|
||||||
pub reply_sender: mpsc::Sender<SimReply>,
|
pub reply_sender: mpsc::Sender<SimReply>,
|
||||||
}
|
}
|
||||||
@ -23,7 +24,8 @@ impl PcduModel {
|
|||||||
pub fn new(reply_sender: mpsc::Sender<SimReply>) -> Self {
|
pub fn new(reply_sender: mpsc::Sender<SimReply>) -> Self {
|
||||||
Self {
|
Self {
|
||||||
switcher_map: Default::default(),
|
switcher_map: Default::default(),
|
||||||
mgm_switch: Output::new(),
|
mgm_0_switch: Output::new(),
|
||||||
|
mgm_1_switch: Output::new(),
|
||||||
mgt_switch: Output::new(),
|
mgt_switch: Output::new(),
|
||||||
reply_sender,
|
reply_sender,
|
||||||
}
|
}
|
||||||
@ -55,7 +57,7 @@ impl PcduModel {
|
|||||||
*val = switch_and_target_state.1;
|
*val = switch_and_target_state.1;
|
||||||
match switch_and_target_state.0 {
|
match switch_and_target_state.0 {
|
||||||
PcduSwitch::Mgm => {
|
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 => {
|
PcduSwitch::Mgt => {
|
||||||
self.mgt_switch.send(switch_and_target_state.1).await;
|
self.mgt_switch.send(switch_and_target_state.1).await;
|
||||||
|
@ -5,7 +5,8 @@ use serde::{de::DeserializeOwned, Deserialize, Serialize};
|
|||||||
#[derive(Debug, Copy, Clone, PartialEq, Eq, Serialize, Deserialize, Hash)]
|
#[derive(Debug, Copy, Clone, PartialEq, Eq, Serialize, Deserialize, Hash)]
|
||||||
pub enum SimComponent {
|
pub enum SimComponent {
|
||||||
SimCtrl,
|
SimCtrl,
|
||||||
MgmLis3Mdl,
|
Mgm0Lis3Mdl,
|
||||||
|
Mgm1Lis3Mdl,
|
||||||
Mgt,
|
Mgt,
|
||||||
Pcdu,
|
Pcdu,
|
||||||
}
|
}
|
||||||
@ -277,7 +278,7 @@ pub mod acs {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl SerializableSimMsgPayload<SimRequest> for MgmRequestLis3Mdl {
|
impl SerializableSimMsgPayload<SimRequest> 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
|
// Normally, small magnetometers generate their output as a signed 16 bit raw format or something
|
||||||
@ -368,7 +369,7 @@ pub mod acs {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl SerializableSimMsgPayload<SimReply> for MgmLis3MdlReply {
|
impl SerializableSimMsgPayload<SimReply> for MgmLis3MdlReply {
|
||||||
const TARGET: SimComponent = SimComponent::MgmLis3Mdl;
|
const TARGET: SimComponent = SimComponent::Mgm0Lis3Mdl;
|
||||||
}
|
}
|
||||||
|
|
||||||
impl MgmReplyProvider for MgmLis3MdlReply {
|
impl MgmReplyProvider for MgmLis3MdlReply {
|
||||||
@ -418,7 +419,7 @@ pub mod acs {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl SerializableSimMsgPayload<SimReply> for MgtReply {
|
impl SerializableSimMsgPayload<SimReply> for MgtReply {
|
||||||
const TARGET: SimComponent = SimComponent::MgmLis3Mdl;
|
const TARGET: SimComponent = SimComponent::Mgm0Lis3Mdl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -31,11 +31,15 @@ fn create_sim_controller(
|
|||||||
request_receiver: mpsc::Receiver<SimRequest>,
|
request_receiver: mpsc::Receiver<SimRequest>,
|
||||||
) -> SimController {
|
) -> SimController {
|
||||||
// Instantiate models and their mailboxes.
|
// 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());
|
MagnetometerModel::new_for_lis3mdl(Duration::from_millis(50), reply_sender.clone());
|
||||||
|
|
||||||
let mgm_mailbox = Mailbox::new();
|
let mgm_0_mailbox = Mailbox::new();
|
||||||
let mgm_addr = mgm_mailbox.address();
|
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_mailbox = Mailbox::new();
|
||||||
let pcdu_addr = pcdu_mailbox.address();
|
let pcdu_addr = pcdu_mailbox.address();
|
||||||
let mgt_mailbox = Mailbox::new();
|
let mgt_mailbox = Mailbox::new();
|
||||||
@ -43,8 +47,11 @@ fn create_sim_controller(
|
|||||||
|
|
||||||
let mut pcdu_model = PcduModel::new(reply_sender.clone());
|
let mut pcdu_model = PcduModel::new(reply_sender.clone());
|
||||||
pcdu_model
|
pcdu_model
|
||||||
.mgm_switch
|
.mgm_0_switch
|
||||||
.connect(MagnetometerModel::switch_device, &mgm_addr);
|
.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());
|
let mut mgt_model = MagnetorquerModel::new(reply_sender.clone());
|
||||||
// Input connections.
|
// Input connections.
|
||||||
@ -54,7 +61,10 @@ fn create_sim_controller(
|
|||||||
// Output connections.
|
// Output connections.
|
||||||
mgt_model
|
mgt_model
|
||||||
.gen_magnetic_field
|
.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
|
// Instantiate the simulator
|
||||||
let sys_clock = SystemClock::from_system_time(start_time, SystemTime::now());
|
let sys_clock = SystemClock::from_system_time(start_time, SystemTime::now());
|
||||||
@ -63,9 +73,10 @@ fn create_sim_controller(
|
|||||||
} else {
|
} else {
|
||||||
SimInit::new()
|
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
|
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(pcdu_model, pcdu_mailbox, "PCDU model")
|
||||||
.add_model(mgt_model, mgt_mailbox, "MGT model")
|
.add_model(mgt_model, mgt_mailbox, "MGT model")
|
||||||
.init(start_time)
|
.init(start_time)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user