continue PCDU handler
Some checks failed
Rust/sat-rs/pipeline/pr-main There was a failure building this commit
Some checks failed
Rust/sat-rs/pipeline/pr-main There was a failure building this commit
This commit is contained in:
parent
8e89c8dd66
commit
295fed9a72
@ -8,13 +8,14 @@ use derive_new::new;
|
|||||||
use satrs::{
|
use satrs::{
|
||||||
hk::{HkRequest, HkRequestVariant},
|
hk::{HkRequest, HkRequestVariant},
|
||||||
mode::{ModeAndSubmode, ModeError, ModeProvider, ModeReply, ModeRequestHandler},
|
mode::{ModeAndSubmode, ModeError, ModeProvider, ModeReply, ModeRequestHandler},
|
||||||
|
power::{SwitchRequest, SwitchStateBinary},
|
||||||
pus::EcssTmSender,
|
pus::EcssTmSender,
|
||||||
queue::{GenericSendError, GenericTargetedMessagingError},
|
queue::{GenericSendError, GenericTargetedMessagingError},
|
||||||
request::{GenericMessage, MessageMetadata, UniqueApidTargetId},
|
request::{GenericMessage, MessageMetadata, UniqueApidTargetId},
|
||||||
};
|
};
|
||||||
use satrs_example::{config::components::PUS_MODE_SERVICE, DeviceMode, TimestampHelper};
|
use satrs_example::{config::components::PUS_MODE_SERVICE, DeviceMode, TimestampHelper};
|
||||||
use satrs_minisim::{
|
use satrs_minisim::{
|
||||||
eps::{PcduReply, PcduRequest, SwitchMap, SwitchMapBinaryWrapper},
|
eps::{PcduReply, PcduRequest, PcduSwitch, SwitchMap, SwitchMapBinary, SwitchMapBinaryWrapper},
|
||||||
SerializableSimMsgPayload, SimReply, SimRequest,
|
SerializableSimMsgPayload, SimReply, SimRequest,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -177,6 +178,7 @@ pub struct PcduHandler<ComInterface: SerialInterface, TmSender: EcssTmSender> {
|
|||||||
mode_interface: MpscModeLeafInterface,
|
mode_interface: MpscModeLeafInterface,
|
||||||
composite_request_rx: mpsc::Receiver<GenericMessage<CompositeRequest>>,
|
composite_request_rx: mpsc::Receiver<GenericMessage<CompositeRequest>>,
|
||||||
hk_reply_tx: mpsc::Sender<GenericMessage<HkReply>>,
|
hk_reply_tx: mpsc::Sender<GenericMessage<HkReply>>,
|
||||||
|
switch_request_rx: mpsc::Receiver<GenericMessage<SwitchRequest>>,
|
||||||
tm_sender: TmSender,
|
tm_sender: TmSender,
|
||||||
pub com_interface: ComInterface,
|
pub com_interface: ComInterface,
|
||||||
shared_switch_map: Arc<Mutex<SwitchSet>>,
|
shared_switch_map: Arc<Mutex<SwitchSet>>,
|
||||||
@ -194,8 +196,12 @@ impl<ComInterface: SerialInterface, TmSender: EcssTmSender> PcduHandler<ComInter
|
|||||||
// Handle requests.
|
// Handle requests.
|
||||||
self.handle_composite_requests();
|
self.handle_composite_requests();
|
||||||
self.handle_mode_requests();
|
self.handle_mode_requests();
|
||||||
// Poll the switch states and telemetry regularly here.
|
self.handle_switch_requests();
|
||||||
if self.mode() == DeviceMode::Normal as u32 {}
|
// Poll the switch states and/or telemetry regularly here.
|
||||||
|
if self.mode() == DeviceMode::Normal as u32 || self.mode() == DeviceMode::On as u32
|
||||||
|
{
|
||||||
|
self.handle_periodic_commands();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
OpCode::PollAndRecvReplies => {
|
OpCode::PollAndRecvReplies => {
|
||||||
self.poll_and_handle_replies();
|
self.poll_and_handle_replies();
|
||||||
@ -239,6 +245,14 @@ impl<ComInterface: SerialInterface, TmSender: EcssTmSender> PcduHandler<ComInter
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn handle_periodic_commands(&self) {
|
||||||
|
let pcdu_req = PcduRequest::RequestSwitchInfo;
|
||||||
|
let pcdu_req_ser = serde_json::to_string(&pcdu_req).unwrap();
|
||||||
|
if let Err(_e) = self.com_interface.send(pcdu_req_ser.as_bytes()) {
|
||||||
|
log::warn!("polling PCDU switch info failed");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn handle_mode_requests(&mut self) {
|
pub fn handle_mode_requests(&mut self) {
|
||||||
loop {
|
loop {
|
||||||
// TODO: Only allow one set mode request per cycle?
|
// TODO: Only allow one set mode request per cycle?
|
||||||
@ -265,6 +279,28 @@ impl<ComInterface: SerialInterface, TmSender: EcssTmSender> PcduHandler<ComInter
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn handle_switch_requests(&mut self) {
|
||||||
|
loop {
|
||||||
|
match self.switch_request_rx.try_recv() {
|
||||||
|
Ok(switch_req) => match PcduSwitch::try_from(switch_req.message.switch_id()) {
|
||||||
|
Ok(pcdu_switch) => {
|
||||||
|
let pcdu_req = PcduRequest::SwitchDevice {
|
||||||
|
switch: pcdu_switch,
|
||||||
|
state: switch_req.message.target_state(),
|
||||||
|
};
|
||||||
|
let pcdu_req_ser = serde_json::to_string(&pcdu_req).unwrap();
|
||||||
|
self.com_interface.send(pcdu_req_ser.as_bytes())
|
||||||
|
}
|
||||||
|
Err(e) => todo!("failed to convert switch ID {:?} to typed PCDU switch", e),
|
||||||
|
},
|
||||||
|
Err(e) => match e {
|
||||||
|
mpsc::TryRecvError::Empty => todo!(),
|
||||||
|
mpsc::TryRecvError::Disconnected => todo!(),
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn poll_and_handle_replies(&mut self) {}
|
pub fn poll_and_handle_replies(&mut self) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -223,6 +223,8 @@ fn static_tmtc_pool_main() {
|
|||||||
mpsc::channel();
|
mpsc::channel();
|
||||||
|
|
||||||
let shared_switch_set = Arc::default();
|
let shared_switch_set = Arc::default();
|
||||||
|
let (switch_request_tx, switch_request_rx) = mpsc::sync_channel(20);
|
||||||
|
|
||||||
let shared_mgm_set = Arc::default();
|
let shared_mgm_set = Arc::default();
|
||||||
let mgm_mode_leaf_interface = MpscModeLeafInterface {
|
let mgm_mode_leaf_interface = MpscModeLeafInterface {
|
||||||
request_rx: mgm_handler_mode_rx,
|
request_rx: mgm_handler_mode_rx,
|
||||||
@ -272,6 +274,7 @@ fn static_tmtc_pool_main() {
|
|||||||
pcdu_mode_leaf_interface,
|
pcdu_mode_leaf_interface,
|
||||||
pcdu_handler_composite_rx,
|
pcdu_handler_composite_rx,
|
||||||
pus_hk_reply_tx,
|
pus_hk_reply_tx,
|
||||||
|
switch_request_rx,
|
||||||
tm_sink_tx,
|
tm_sink_tx,
|
||||||
pcdu_serial_interface,
|
pcdu_serial_interface,
|
||||||
shared_switch_set,
|
shared_switch_set,
|
||||||
|
@ -12,6 +12,7 @@ log = "0.4"
|
|||||||
thiserror = "1"
|
thiserror = "1"
|
||||||
fern = "0.5"
|
fern = "0.5"
|
||||||
strum = { version = "0.26", features = ["derive"] }
|
strum = { version = "0.26", features = ["derive"] }
|
||||||
|
num_enum = "0.7"
|
||||||
humantime = "2"
|
humantime = "2"
|
||||||
|
|
||||||
[dependencies.asynchronix]
|
[dependencies.asynchronix]
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
use asynchronix::time::MonotonicTime;
|
use asynchronix::time::MonotonicTime;
|
||||||
|
use num_enum::{IntoPrimitive, TryFromPrimitive};
|
||||||
use serde::{de::DeserializeOwned, Deserialize, Serialize};
|
use serde::{de::DeserializeOwned, Deserialize, Serialize};
|
||||||
|
|
||||||
#[derive(Debug, Copy, Clone, PartialEq, Eq, Serialize, Deserialize, Hash)]
|
#[derive(Debug, Copy, Clone, PartialEq, Eq, Serialize, Deserialize, Hash)]
|
||||||
@ -170,7 +171,20 @@ pub mod eps {
|
|||||||
pub struct SwitchMapWrapper(pub SwitchMap);
|
pub struct SwitchMapWrapper(pub SwitchMap);
|
||||||
pub struct SwitchMapBinaryWrapper(pub SwitchMapBinary);
|
pub struct SwitchMapBinaryWrapper(pub SwitchMapBinary);
|
||||||
|
|
||||||
#[derive(Debug, Copy, Clone, PartialEq, Eq, Serialize, Deserialize, Hash, EnumIter)]
|
#[derive(
|
||||||
|
Debug,
|
||||||
|
Copy,
|
||||||
|
Clone,
|
||||||
|
PartialEq,
|
||||||
|
Eq,
|
||||||
|
Serialize,
|
||||||
|
Deserialize,
|
||||||
|
Hash,
|
||||||
|
EnumIter,
|
||||||
|
IntoPrimitive,
|
||||||
|
TryFromPrimitive,
|
||||||
|
)]
|
||||||
|
#[repr(u16)]
|
||||||
pub enum PcduSwitch {
|
pub enum PcduSwitch {
|
||||||
Mgm = 0,
|
Mgm = 0,
|
||||||
Mgt = 1,
|
Mgt = 1,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user