start adding ACS subsystem
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
use anyhow::bail;
|
||||
use arbitrary_int::u11;
|
||||
use clap::Parser as _;
|
||||
use models::{Apid, MessageType, TcHeader, mgm::request::HkRequest};
|
||||
use models::{Apid, MessageType, TcHeader, acs::mgm::request::HkRequest};
|
||||
use satrs_example::config::{OBSW_SERVER_ADDR, SERVER_PORT};
|
||||
use spacepackets::{CcsdsPacketIdAndPsc, SpacePacketHeader};
|
||||
use std::{
|
||||
@@ -136,7 +136,7 @@ fn main() -> anyhow::Result<()> {
|
||||
let request = models::ccsds::CcsdsTcPacketOwned::new_with_request(
|
||||
SpacePacketHeader::new_from_apid(u11::new(Apid::Acs as u16)),
|
||||
TcHeader::new(cmd.target_id(), models::MessageType::Ping),
|
||||
models::mgm::request::Request::Ping,
|
||||
models::acs::mgm::request::Request::Ping,
|
||||
);
|
||||
let sent_tc_id = CcsdsPacketIdAndPsc::new_from_ccsds_packet(&request.sp_header);
|
||||
log::info!(
|
||||
@@ -151,8 +151,8 @@ fn main() -> anyhow::Result<()> {
|
||||
let request = models::ccsds::CcsdsTcPacketOwned::new_with_request(
|
||||
SpacePacketHeader::new_from_apid(u11::new(Apid::Acs as u16)),
|
||||
TcHeader::new(target_id, models::MessageType::Hk),
|
||||
models::mgm::request::Request::Hk(HkRequest {
|
||||
id: models::mgm::request::HkId::Sensor,
|
||||
models::acs::mgm::request::Request::Hk(HkRequest {
|
||||
id: models::acs::mgm::request::HkId::Sensor,
|
||||
req_type: models::HkRequestType::OneShot,
|
||||
}),
|
||||
);
|
||||
@@ -174,8 +174,8 @@ fn main() -> anyhow::Result<()> {
|
||||
let request = models::ccsds::CcsdsTcPacketOwned::new_with_request(
|
||||
SpacePacketHeader::new_from_apid(u11::new(Apid::Acs as u16)),
|
||||
TcHeader::new(target_id, models::MessageType::Mode),
|
||||
models::mgm::request::Request::Mode(
|
||||
models::mgm::request::ModeRequest::SetMode(dev_mode),
|
||||
models::acs::mgm::request::Request::Mode(
|
||||
models::acs::mgm::request::ModeRequest::SetMode(dev_mode),
|
||||
),
|
||||
);
|
||||
let sent_tc_id = CcsdsPacketIdAndPsc::new_from_ccsds_packet(&request.sp_header);
|
||||
@@ -193,7 +193,7 @@ fn main() -> anyhow::Result<()> {
|
||||
let request = models::ccsds::CcsdsTcPacketOwned::new_with_request(
|
||||
SpacePacketHeader::new_from_apid(u11::new(Apid::Acs as u16)),
|
||||
TcHeader::new(cmd.target_id(), models::MessageType::Ping),
|
||||
models::mgm::request::Request::Ping,
|
||||
models::acs::mgm::request::Request::Ping,
|
||||
);
|
||||
let sent_tc_id = CcsdsPacketIdAndPsc::new_from_ccsds_packet(&request.sp_header);
|
||||
log::info!(
|
||||
@@ -207,21 +207,23 @@ fn main() -> anyhow::Result<()> {
|
||||
if let Some(mode) = mgm_assembly_args.mode {
|
||||
let assembly_mode = match mode {
|
||||
AssemblyModeSelect::NoModeKeeping => {
|
||||
models::mgm_assembly::AssemblyMode::NoModeKeeping
|
||||
models::acs::mgm_assembly::AssemblyMode::NoModeKeeping
|
||||
}
|
||||
AssemblyModeSelect::Off => {
|
||||
models::mgm_assembly::AssemblyMode::Device(models::DeviceMode::Off)
|
||||
models::acs::mgm_assembly::AssemblyMode::Device(models::DeviceMode::Off)
|
||||
}
|
||||
AssemblyModeSelect::Normal => {
|
||||
models::mgm_assembly::AssemblyMode::Device(models::DeviceMode::Normal)
|
||||
models::acs::mgm_assembly::AssemblyMode::Device(
|
||||
models::DeviceMode::Normal,
|
||||
)
|
||||
}
|
||||
};
|
||||
|
||||
let request = models::ccsds::CcsdsTcPacketOwned::new_with_request(
|
||||
SpacePacketHeader::new_from_apid(u11::new(Apid::Acs as u16)),
|
||||
TcHeader::new(target_id, models::MessageType::Mode),
|
||||
models::mgm_assembly::request::Request::Mode(
|
||||
models::mgm_assembly::request::ModeRequest::SetMode(assembly_mode),
|
||||
models::acs::mgm_assembly::request::Request::Mode(
|
||||
models::acs::mgm_assembly::request::ModeRequest::SetMode(assembly_mode),
|
||||
),
|
||||
);
|
||||
let sent_tc_id = CcsdsPacketIdAndPsc::new_from_ccsds_packet(&request.sp_header);
|
||||
@@ -304,8 +306,9 @@ fn handle_raw_tm_packet(data: &[u8]) -> anyhow::Result<()> {
|
||||
}
|
||||
models::ComponentId::AcsSubsystem => todo!(),
|
||||
models::ComponentId::AcsMgmAssembly => {
|
||||
let response =
|
||||
postcard::from_bytes::<models::mgm_assembly::response::Response>(remainder);
|
||||
let response = postcard::from_bytes::<
|
||||
models::acs::mgm_assembly::response::Response,
|
||||
>(remainder);
|
||||
log::info!(
|
||||
"Received response from MGM Assembly: {:?}",
|
||||
response.unwrap()
|
||||
@@ -313,12 +316,12 @@ fn handle_raw_tm_packet(data: &[u8]) -> anyhow::Result<()> {
|
||||
}
|
||||
models::ComponentId::AcsMgm0 => {
|
||||
let response =
|
||||
postcard::from_bytes::<models::mgm::response::Response>(remainder);
|
||||
postcard::from_bytes::<models::acs::mgm::response::Response>(remainder);
|
||||
log::info!("Received response from MGM0: {:?}", response.unwrap());
|
||||
}
|
||||
models::ComponentId::AcsMgm1 => {
|
||||
let response =
|
||||
postcard::from_bytes::<models::mgm::response::Response>(remainder);
|
||||
postcard::from_bytes::<models::acs::mgm::response::Response>(remainder);
|
||||
log::info!("Received response from MGM1: {:?}", response.unwrap());
|
||||
}
|
||||
models::ComponentId::EpsSubsystem => todo!(),
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, Copy, PartialEq, Eq)]
|
||||
pub enum ControllerMode {
|
||||
Passive,
|
||||
Safe,
|
||||
Idle,
|
||||
}
|
||||
@@ -42,7 +42,7 @@ pub mod request {
|
||||
}
|
||||
|
||||
#[derive(Default, Debug, Copy, Clone, serde::Serialize, serde::Deserialize)]
|
||||
pub struct MgmData {
|
||||
pub struct SensorData {
|
||||
pub valid: bool,
|
||||
pub x: f32,
|
||||
pub y: f32,
|
||||
@@ -50,11 +50,11 @@ pub struct MgmData {
|
||||
}
|
||||
|
||||
pub mod response {
|
||||
use crate::{DeviceMode, Message, mgm::MgmData};
|
||||
use crate::{DeviceMode, Message, acs::mgm::SensorData};
|
||||
|
||||
#[derive(serde::Serialize, serde::Deserialize, Clone, Copy, Debug)]
|
||||
pub enum HkResponse {
|
||||
MgmData(MgmData),
|
||||
MgmData(SensorData),
|
||||
}
|
||||
|
||||
#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, Copy)]
|
||||
+1
-1
@@ -26,7 +26,7 @@ impl FromStr for AssemblyMode {
|
||||
}
|
||||
|
||||
pub mod request {
|
||||
use crate::{HkRequestType, Message, mgm_assembly::AssemblyMode};
|
||||
use crate::{HkRequestType, Message, acs::mgm_assembly::AssemblyMode};
|
||||
|
||||
#[derive(Debug, PartialEq, Eq, Clone, Copy, serde::Serialize, serde::Deserialize)]
|
||||
pub enum HkId {
|
||||
@@ -0,0 +1,5 @@
|
||||
#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, Copy, PartialEq, Eq)]
|
||||
pub enum MgtMode {
|
||||
Off,
|
||||
Normal,
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
pub mod ctrl;
|
||||
pub mod mgm;
|
||||
pub mod mgm_assembly;
|
||||
pub mod mgt;
|
||||
pub mod subsystem;
|
||||
@@ -0,0 +1,15 @@
|
||||
#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, Copy, PartialEq, Eq)]
|
||||
pub enum Mode {
|
||||
Off,
|
||||
Safe,
|
||||
}
|
||||
|
||||
impl Mode {
|
||||
/// Each subsystem mode has a fallback mode to allow clean transitions.
|
||||
pub const fn fallback_mode(&self) -> Self {
|
||||
match self {
|
||||
Mode::Off => Mode::Safe,
|
||||
Mode::Safe => Mode::Safe,
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -6,10 +6,9 @@ use spacepackets::{
|
||||
time::cds::{CdsTime, MIN_CDS_FIELD_LEN},
|
||||
};
|
||||
|
||||
pub mod acs;
|
||||
pub mod ccsds;
|
||||
pub mod control;
|
||||
pub mod mgm;
|
||||
pub mod mgm_assembly;
|
||||
pub mod pcdu;
|
||||
|
||||
#[derive(
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
use models::mgm::MgmData;
|
||||
use models::mgm::request::ModeRequest;
|
||||
use models::mgm::response::ModeResponse;
|
||||
use models::acs::mgm::SensorData;
|
||||
use models::acs::mgm::request::ModeRequest;
|
||||
use models::acs::mgm::response::ModeResponse;
|
||||
use models::pcdu::SwitchId;
|
||||
use models::{ComponentId, DeviceMode, HkRequestType, mgm};
|
||||
use models::{ComponentId, DeviceMode, HkRequestType, acs::mgm};
|
||||
use satrs::spacepackets::CcsdsPacketIdAndPsc;
|
||||
use satrs_example::{HkHelperSingleSet, ModeHelper, TimestampHelper, TmtcQueues};
|
||||
use satrs_minisim::acs::MgmRequestLis3Mdl;
|
||||
@@ -153,7 +153,7 @@ pub struct MgmHandlerLis3Mdl {
|
||||
switch_helper: PowerSwitchHelper,
|
||||
tmtc_queues: TmtcQueues,
|
||||
pub spi_com: SpiCommunication,
|
||||
shared_mgm_set: Arc<Mutex<MgmData>>,
|
||||
shared_mgm_set: Arc<Mutex<SensorData>>,
|
||||
buffers: BufWrapper,
|
||||
stamp_helper: TimestampHelper,
|
||||
hk_helper: HkHelperSingleSet,
|
||||
@@ -167,9 +167,9 @@ impl MgmHandlerLis3Mdl {
|
||||
tmtc_queues: TmtcQueues,
|
||||
switch_helper: PowerSwitchHelper,
|
||||
spi_com: SpiCommunication,
|
||||
shared_mgm_set: Arc<Mutex<MgmData>>,
|
||||
shared_mgm_set: Arc<Mutex<SensorData>>,
|
||||
mode_leaf_helper: ModeLeafHelper,
|
||||
mode_timeout: Duration
|
||||
mode_timeout: Duration,
|
||||
) -> Self {
|
||||
Self {
|
||||
id,
|
||||
@@ -308,7 +308,7 @@ impl MgmHandlerLis3Mdl {
|
||||
pub fn handle_hk_request(
|
||||
&mut self,
|
||||
tc_id: Option<CcsdsPacketIdAndPsc>,
|
||||
hk_request: &models::mgm::request::HkRequest,
|
||||
hk_request: &models::acs::mgm::request::HkRequest,
|
||||
) {
|
||||
match hk_request.req_type {
|
||||
HkRequestType::OneShot => {
|
||||
@@ -462,8 +462,8 @@ mod tests {
|
||||
use arbitrary_int::u11;
|
||||
use models::{
|
||||
Apid, ComponentId, TcHeader,
|
||||
acs::mgm::request::HkRequest,
|
||||
ccsds::{CcsdsTcPacketOwned, CcsdsTmPacketOwned},
|
||||
mgm::request::HkRequest,
|
||||
pcdu::{SwitchRequest, SwitchState, SwitchStateBinary},
|
||||
};
|
||||
use satrs::{request::GenericMessage, spacepackets::SpacePacketHeader};
|
||||
@@ -490,7 +490,7 @@ mod tests {
|
||||
|
||||
pub fn create_request_tc(
|
||||
select: MgmSelect,
|
||||
request: models::mgm::request::Request,
|
||||
request: models::acs::mgm::request::Request,
|
||||
) -> models::ccsds::CcsdsTcPacketOwned {
|
||||
models::ccsds::CcsdsTcPacketOwned::new_with_request(
|
||||
SpacePacketHeader::new_from_apid(u11::new(Apid::Acs as u16)),
|
||||
@@ -533,6 +533,7 @@ mod tests {
|
||||
SpiCommunication::Test(TestSpiInterface::default()),
|
||||
shared_mgm_set,
|
||||
mode_leaf_helper,
|
||||
Duration::from_millis(100),
|
||||
);
|
||||
Self {
|
||||
assembly_mode_request_tx,
|
||||
@@ -600,9 +601,10 @@ mod tests {
|
||||
|
||||
assert_eq!(tm_packet.tm_header.sender_id, ComponentId::AcsMgm0);
|
||||
|
||||
let response = postcard::from_bytes::<models::mgm::response::Response>(&tm_packet.payload)
|
||||
.expect("failed to deserialize mode reply");
|
||||
matches!(response, models::mgm::response::Response::Ok);
|
||||
let response =
|
||||
postcard::from_bytes::<models::acs::mgm::response::Response>(&tm_packet.payload)
|
||||
.expect("failed to deserialize mode reply");
|
||||
matches!(response, models::acs::mgm::response::Response::Ok);
|
||||
// The device should have been polled once.
|
||||
assert_eq!(testbench.test_spi_interface().call_count, 1);
|
||||
let mgm_set = *testbench.handler.shared_mgm_set.lock().unwrap();
|
||||
@@ -688,9 +690,10 @@ mod tests {
|
||||
|
||||
assert_eq!(tm_packet.tm_header.sender_id, ComponentId::AcsMgm0);
|
||||
|
||||
let response = postcard::from_bytes::<models::mgm::response::Response>(&tm_packet.payload)
|
||||
.expect("failed to deserialize mode reply");
|
||||
if let models::mgm::response::Response::Hk(mgm::response::HkResponse::MgmData(data)) =
|
||||
let response =
|
||||
postcard::from_bytes::<models::acs::mgm::response::Response>(&tm_packet.payload)
|
||||
.expect("failed to deserialize mode reply");
|
||||
if let models::acs::mgm::response::Response::Hk(mgm::response::HkResponse::MgmData(data)) =
|
||||
response
|
||||
{
|
||||
assert_eq!(data.valid, false);
|
||||
@@ -739,17 +742,18 @@ mod tests {
|
||||
|
||||
assert_eq!(mode_tm.tm_header.sender_id, ComponentId::AcsMgm0);
|
||||
|
||||
let response = postcard::from_bytes::<models::mgm::response::Response>(&mode_tm.payload)
|
||||
.expect("failed to deserialize mode reply");
|
||||
matches!(response, models::mgm::response::Response::Ok);
|
||||
let response =
|
||||
postcard::from_bytes::<models::acs::mgm::response::Response>(&mode_tm.payload)
|
||||
.expect("failed to deserialize mode reply");
|
||||
matches!(response, models::acs::mgm::response::Response::Ok);
|
||||
|
||||
let hk_tm = testbench.tm_rx.try_recv().expect("no hk reply generated");
|
||||
|
||||
assert_eq!(hk_tm.tm_header.sender_id, ComponentId::AcsMgm0);
|
||||
|
||||
let response = postcard::from_bytes::<models::mgm::response::Response>(&hk_tm.payload)
|
||||
let response = postcard::from_bytes::<models::acs::mgm::response::Response>(&hk_tm.payload)
|
||||
.expect("failed to deserialize mode reply");
|
||||
if let models::mgm::response::Response::Hk(mgm::response::HkResponse::MgmData(data)) =
|
||||
if let models::acs::mgm::response::Response::Hk(mgm::response::HkResponse::MgmData(data)) =
|
||||
response
|
||||
{
|
||||
// Set is now valid.
|
||||
|
||||
@@ -2,7 +2,7 @@ use std::{sync::mpsc, time::Duration};
|
||||
|
||||
use models::{
|
||||
ComponentId, DeviceMode,
|
||||
mgm_assembly::{AssemblyMode, request, response},
|
||||
acs::mgm_assembly::{AssemblyMode, request, response},
|
||||
};
|
||||
use satrs::spacepackets::CcsdsPacketIdAndPsc;
|
||||
use satrs_example::{ModeHelper, TmtcQueues};
|
||||
@@ -16,8 +16,8 @@ pub struct ParentQueueHelper {
|
||||
|
||||
/// Helper component for communication with a parent component, which is usually as assembly.
|
||||
pub struct ChildrenQueueHelper {
|
||||
pub request_tx_queues: [mpsc::SyncSender<models::mgm::request::ModeRequest>; 2],
|
||||
pub report_rx_queues: [mpsc::Receiver<models::mgm::response::ModeResponse>; 2],
|
||||
pub request_tx_queues: [mpsc::SyncSender<models::acs::mgm::request::ModeRequest>; 2],
|
||||
pub report_rx_queues: [mpsc::Receiver<models::acs::mgm::response::ModeResponse>; 2],
|
||||
}
|
||||
|
||||
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
|
||||
@@ -80,14 +80,14 @@ impl Assembly {
|
||||
match self.tmtc_queues.tc_rx.try_recv() {
|
||||
Ok(packet) => {
|
||||
let tc_id = CcsdsPacketIdAndPsc::new_from_ccsds_packet(&packet.sp_header);
|
||||
match postcard::from_bytes::<models::mgm_assembly::request::Request>(
|
||||
match postcard::from_bytes::<models::acs::mgm_assembly::request::Request>(
|
||||
&packet.payload,
|
||||
) {
|
||||
Ok(request) => match request {
|
||||
models::mgm_assembly::request::Request::Ping => {
|
||||
models::acs::mgm_assembly::request::Request::Ping => {
|
||||
self.send_telemetry(Some(tc_id), response::Response::Ok)
|
||||
}
|
||||
models::mgm_assembly::request::Request::Mode(request) => {
|
||||
models::acs::mgm_assembly::request::Request::Mode(request) => {
|
||||
match request {
|
||||
request::ModeRequest::SetMode(assembly_mode) => {
|
||||
self.start_transition(false, assembly_mode, Some(tc_id))
|
||||
@@ -117,7 +117,7 @@ impl Assembly {
|
||||
pub fn send_telemetry(
|
||||
&self,
|
||||
tc_id: Option<CcsdsPacketIdAndPsc>,
|
||||
response: models::mgm_assembly::response::Response,
|
||||
response: models::acs::mgm_assembly::response::Response,
|
||||
) {
|
||||
match pack_ccsds_tm_packet_for_now(Self::ID, tc_id, &response) {
|
||||
Ok(packet) => {
|
||||
@@ -165,12 +165,12 @@ impl Assembly {
|
||||
loop {
|
||||
match rx.try_recv() {
|
||||
Ok(report) => match report {
|
||||
models::mgm::response::ModeResponse::Mode(device_mode) => {
|
||||
models::acs::mgm::response::ModeResponse::Mode(device_mode) => {
|
||||
self.mgm_modes[idx].mode = Some(device_mode);
|
||||
self.mgm_modes[idx].reply_received = true;
|
||||
mode_report_received = true;
|
||||
}
|
||||
models::mgm::response::ModeResponse::SetModeTimeout => {
|
||||
models::acs::mgm::response::ModeResponse::SetModeTimeout => {
|
||||
// Ignore, handle this with our own timeout.
|
||||
log::warn!("MGM {} mode timeout", idx);
|
||||
}
|
||||
@@ -275,7 +275,7 @@ impl Assembly {
|
||||
|
||||
pub fn command_children(&self, mode: DeviceMode) {
|
||||
for tx in &self.children_queues.request_tx_queues {
|
||||
tx.send(models::mgm::request::ModeRequest::SetMode(mode))
|
||||
tx.send(models::acs::mgm::request::ModeRequest::SetMode(mode))
|
||||
.unwrap();
|
||||
}
|
||||
}
|
||||
@@ -322,8 +322,8 @@ mod tests {
|
||||
use arbitrary_int::u11;
|
||||
use models::{
|
||||
Apid, Message, MessageType, TcHeader,
|
||||
acs::mgm_assembly,
|
||||
ccsds::{CcsdsTcPacketOwned, CcsdsTmPacketOwned},
|
||||
mgm_assembly,
|
||||
};
|
||||
use satrs::spacepackets::SpacePacketHeader;
|
||||
|
||||
@@ -332,8 +332,8 @@ mod tests {
|
||||
pub struct Testbench {
|
||||
subsystem_req_tx: mpsc::SyncSender<request::ModeRequest>,
|
||||
subsystem_report_rx: mpsc::Receiver<response::ModeReport>,
|
||||
mgm_request_rx: [mpsc::Receiver<models::mgm::request::ModeRequest>; 2],
|
||||
mgm_report_tx: [mpsc::SyncSender<models::mgm::response::ModeResponse>; 2],
|
||||
mgm_request_rx: [mpsc::Receiver<models::acs::mgm::request::ModeRequest>; 2],
|
||||
mgm_report_tx: [mpsc::SyncSender<models::acs::mgm::response::ModeResponse>; 2],
|
||||
tc_tx: mpsc::SyncSender<CcsdsTcPacketOwned>,
|
||||
tm_rx: mpsc::Receiver<CcsdsTmPacketOwned>,
|
||||
assembly: Assembly,
|
||||
@@ -396,7 +396,7 @@ mod tests {
|
||||
}
|
||||
|
||||
pub fn create_request_tc(
|
||||
request: models::mgm_assembly::request::Request,
|
||||
request: models::acs::mgm_assembly::request::Request,
|
||||
) -> models::ccsds::CcsdsTcPacketOwned {
|
||||
models::ccsds::CcsdsTcPacketOwned::new_with_request(
|
||||
SpacePacketHeader::new_from_apid(u11::new(Apid::Acs as u16)),
|
||||
@@ -429,13 +429,13 @@ mod tests {
|
||||
let request = rx.try_recv().unwrap();
|
||||
assert_eq!(
|
||||
request,
|
||||
models::mgm::request::ModeRequest::SetMode(DeviceMode::Normal)
|
||||
models::acs::mgm::request::ModeRequest::SetMode(DeviceMode::Normal)
|
||||
);
|
||||
}
|
||||
|
||||
// Confirm the mode is set.
|
||||
for tx in tb.mgm_report_tx.iter() {
|
||||
tx.send(models::mgm::response::ModeResponse::Mode(
|
||||
tx.send(models::acs::mgm::response::ModeResponse::Mode(
|
||||
DeviceMode::Normal,
|
||||
))
|
||||
.unwrap();
|
||||
@@ -467,13 +467,13 @@ mod tests {
|
||||
let request = rx.try_recv().unwrap();
|
||||
assert_eq!(
|
||||
request,
|
||||
models::mgm::request::ModeRequest::SetMode(DeviceMode::Normal)
|
||||
models::acs::mgm::request::ModeRequest::SetMode(DeviceMode::Normal)
|
||||
);
|
||||
}
|
||||
|
||||
// Confirm the mode is set.
|
||||
for tx in tb.mgm_report_tx.iter() {
|
||||
tx.send(models::mgm::response::ModeResponse::Mode(
|
||||
tx.send(models::acs::mgm::response::ModeResponse::Mode(
|
||||
DeviceMode::Normal,
|
||||
))
|
||||
.unwrap();
|
||||
@@ -505,18 +505,20 @@ mod tests {
|
||||
let request = rx.try_recv().unwrap();
|
||||
assert_eq!(
|
||||
request,
|
||||
models::mgm::request::ModeRequest::SetMode(DeviceMode::Normal)
|
||||
models::acs::mgm::request::ModeRequest::SetMode(DeviceMode::Normal)
|
||||
);
|
||||
}
|
||||
|
||||
// One device is sufficient.
|
||||
tb.mgm_report_tx[0]
|
||||
.send(models::mgm::response::ModeResponse::Mode(
|
||||
.send(models::acs::mgm::response::ModeResponse::Mode(
|
||||
DeviceMode::Normal,
|
||||
))
|
||||
.unwrap();
|
||||
tb.mgm_report_tx[1]
|
||||
.send(models::mgm::response::ModeResponse::Mode(DeviceMode::Off))
|
||||
.send(models::acs::mgm::response::ModeResponse::Mode(
|
||||
DeviceMode::Off,
|
||||
))
|
||||
.unwrap();
|
||||
|
||||
tb.assembly.periodic_operation();
|
||||
@@ -545,14 +547,16 @@ mod tests {
|
||||
let request = rx.try_recv().unwrap();
|
||||
assert_eq!(
|
||||
request,
|
||||
models::mgm::request::ModeRequest::SetMode(DeviceMode::Normal)
|
||||
models::acs::mgm::request::ModeRequest::SetMode(DeviceMode::Normal)
|
||||
);
|
||||
}
|
||||
|
||||
// Confirm the mode is set.
|
||||
for tx in tb.mgm_report_tx.iter() {
|
||||
tx.send(models::mgm::response::ModeResponse::Mode(DeviceMode::Off))
|
||||
.unwrap();
|
||||
tx.send(models::acs::mgm::response::ModeResponse::Mode(
|
||||
DeviceMode::Off,
|
||||
))
|
||||
.unwrap();
|
||||
}
|
||||
|
||||
tb.assembly.periodic_operation();
|
||||
@@ -581,13 +585,13 @@ mod tests {
|
||||
let request = rx.try_recv().unwrap();
|
||||
assert_eq!(
|
||||
request,
|
||||
models::mgm::request::ModeRequest::SetMode(DeviceMode::Normal)
|
||||
models::acs::mgm::request::ModeRequest::SetMode(DeviceMode::Normal)
|
||||
);
|
||||
}
|
||||
|
||||
// Confirm the mode is set.
|
||||
for tx in tb.mgm_report_tx.iter() {
|
||||
tx.send(models::mgm::response::ModeResponse::Mode(
|
||||
tx.send(models::acs::mgm::response::ModeResponse::Mode(
|
||||
DeviceMode::Normal,
|
||||
))
|
||||
.unwrap();
|
||||
@@ -604,8 +608,10 @@ mod tests {
|
||||
);
|
||||
|
||||
for tx in tb.mgm_report_tx.iter() {
|
||||
tx.send(models::mgm::response::ModeResponse::Mode(DeviceMode::Off))
|
||||
.unwrap();
|
||||
tx.send(models::acs::mgm::response::ModeResponse::Mode(
|
||||
DeviceMode::Off,
|
||||
))
|
||||
.unwrap();
|
||||
}
|
||||
// This should start mode keeping.
|
||||
tb.assembly.periodic_operation();
|
||||
@@ -615,14 +621,16 @@ mod tests {
|
||||
let request = rx.try_recv().unwrap();
|
||||
assert_eq!(
|
||||
request,
|
||||
models::mgm::request::ModeRequest::SetMode(DeviceMode::Normal)
|
||||
models::acs::mgm::request::ModeRequest::SetMode(DeviceMode::Normal)
|
||||
);
|
||||
}
|
||||
|
||||
// Let the mode keeping fail.
|
||||
for tx in tb.mgm_report_tx.iter() {
|
||||
tx.send(models::mgm::response::ModeResponse::Mode(DeviceMode::Off))
|
||||
.unwrap();
|
||||
tx.send(models::acs::mgm::response::ModeResponse::Mode(
|
||||
DeviceMode::Off,
|
||||
))
|
||||
.unwrap();
|
||||
}
|
||||
tb.assembly.periodic_operation();
|
||||
let report = tb.subsystem_report_rx.try_recv().unwrap();
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
pub mod ctrl;
|
||||
|
||||
pub mod mgm;
|
||||
pub mod mgm_assembly;
|
||||
|
||||
pub mod mgt;
|
||||
pub mod subsystem;
|
||||
|
||||
@@ -1 +1,93 @@
|
||||
// TODO: Write subsystem
|
||||
use models::ComponentId;
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct TransitionInfo {
|
||||
check_mode_reached: bool,
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct ChildModes {
|
||||
mgm_assembly_mode: models::acs::mgm_assembly::AssemblyMode,
|
||||
mgt_mode: models::acs::mgt::MgtMode,
|
||||
controller_mode: models::acs::ctrl::ControllerMode,
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct TransitionCommands {
|
||||
mgm_assembly_mode: Option<(models::acs::mgm_assembly::AssemblyMode, TransitionInfo)>,
|
||||
mgt_mode: Option<(models::acs::mgt::MgtMode, TransitionInfo)>,
|
||||
controller_mode: Option<(models::acs::ctrl::ControllerMode, TransitionInfo)>,
|
||||
}
|
||||
|
||||
const OFF_SEQUENCE: [TransitionCommands; 2] = [
|
||||
TransitionCommands {
|
||||
mgm_assembly_mode: None,
|
||||
mgt_mode: None,
|
||||
controller_mode: Some((
|
||||
models::acs::ctrl::ControllerMode::Passive,
|
||||
TransitionInfo {
|
||||
check_mode_reached: true,
|
||||
},
|
||||
)),
|
||||
},
|
||||
TransitionCommands {
|
||||
mgm_assembly_mode: Some((
|
||||
models::acs::mgm_assembly::AssemblyMode::Device(models::DeviceMode::Off),
|
||||
TransitionInfo {
|
||||
check_mode_reached: false,
|
||||
},
|
||||
)),
|
||||
mgt_mode: Some((
|
||||
models::acs::mgt::MgtMode::Off,
|
||||
TransitionInfo {
|
||||
check_mode_reached: false,
|
||||
},
|
||||
)),
|
||||
controller_mode: None,
|
||||
},
|
||||
];
|
||||
|
||||
const SAFE_SEQUENCE: [TransitionCommands; 2] = [
|
||||
TransitionCommands {
|
||||
mgm_assembly_mode: Some((
|
||||
models::acs::mgm_assembly::AssemblyMode::Device(models::DeviceMode::Normal),
|
||||
TransitionInfo {
|
||||
check_mode_reached: false,
|
||||
},
|
||||
)),
|
||||
mgt_mode: Some((
|
||||
models::acs::mgt::MgtMode::Normal,
|
||||
TransitionInfo {
|
||||
check_mode_reached: false,
|
||||
},
|
||||
)),
|
||||
controller_mode: None,
|
||||
},
|
||||
TransitionCommands {
|
||||
mgm_assembly_mode: None,
|
||||
mgt_mode: None,
|
||||
controller_mode: Some((
|
||||
models::acs::ctrl::ControllerMode::Safe,
|
||||
TransitionInfo {
|
||||
check_mode_reached: false,
|
||||
},
|
||||
)),
|
||||
},
|
||||
];
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct Subsystem {
|
||||
current_mode: models::acs::subsystem::Mode,
|
||||
current_child_modes: Option<ChildModes>,
|
||||
}
|
||||
|
||||
impl Subsystem {
|
||||
pub const ID: ComponentId = ComponentId::AcsSubsystem;
|
||||
|
||||
pub fn new() -> Self {
|
||||
Self {
|
||||
current_mode: models::acs::subsystem::Mode::Off,
|
||||
current_child_modes: None,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -188,7 +188,7 @@ fn main() {
|
||||
request_rx: mgm_0_mode_request_rx,
|
||||
report_tx: mgm_0_mode_report_tx,
|
||||
},
|
||||
Duration::from_millis(1000)
|
||||
Duration::from_millis(1000),
|
||||
);
|
||||
let mut mgm_1_handler = mgm::MgmHandlerLis3Mdl::new(
|
||||
mgm::MgmId::_1,
|
||||
@@ -203,7 +203,7 @@ fn main() {
|
||||
request_rx: mgm_1_mode_request_rx,
|
||||
report_tx: mgm_1_mode_report_tx,
|
||||
},
|
||||
Duration::from_millis(1000)
|
||||
Duration::from_millis(1000),
|
||||
);
|
||||
let mut mgm_assembly = mgm_assembly::Assembly::new(
|
||||
mgm_assembly::ParentQueueHelper {
|
||||
|
||||
Reference in New Issue
Block a user