PCDU switch set TM handling
All checks were successful
Rust/sat-rs/pipeline/pr-main This commit looks good

This commit is contained in:
Robin Müller 2024-05-22 18:48:46 +02:00
parent 2507469e68
commit 2a2a3a3eab
Signed by: muellerr
GPG Key ID: A649FB78196E3849
3 changed files with 68 additions and 6 deletions

View File

@ -519,7 +519,7 @@ mod tests {
pub fn new() -> Self { pub fn new() -> Self {
let (request_tx, request_rx) = mpsc::channel(); let (request_tx, request_rx) = mpsc::channel();
let (reply_tx_to_pus, reply_rx_to_pus) = mpsc::channel(); let (reply_tx_to_pus, reply_rx_to_pus) = mpsc::channel();
let (reply_tx_to_parent, reply_rx_to_parent) = mpsc::channel(); let (reply_tx_to_parent, reply_rx_to_parent) = mpsc::sync_channel(5);
let mode_interface = MpscModeLeafInterface { let mode_interface = MpscModeLeafInterface {
request_rx, request_rx,
reply_to_pus_tx: reply_tx_to_pus, reply_to_pus_tx: reply_tx_to_pus,

View File

@ -5,21 +5,34 @@ use std::{
}; };
use derive_new::new; use derive_new::new;
use num_enum::{IntoPrimitive, TryFromPrimitive};
use satrs::{ use satrs::{
hk::{HkRequest, HkRequestVariant}, hk::{HkRequest, HkRequestVariant},
mode::{ModeAndSubmode, ModeError, ModeProvider, ModeReply, ModeRequestHandler}, mode::{ModeAndSubmode, ModeError, ModeProvider, ModeReply, ModeRequestHandler},
power::SwitchRequest, power::SwitchRequest,
pus::EcssTmSender, pus::{EcssTmSender, PusTmVariant},
queue::{GenericSendError, GenericTargetedMessagingError}, queue::{GenericSendError, GenericTargetedMessagingError},
request::{GenericMessage, MessageMetadata, UniqueApidTargetId}, request::{GenericMessage, MessageMetadata, UniqueApidTargetId},
spacepackets::{
ecss::{
hk,
tm::{PusTmCreator, PusTmSecondaryHeader},
},
SpHeader,
},
}; };
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, PcduSwitch, SwitchMap, SwitchMapBinaryWrapper}, eps::{PcduReply, PcduRequest, PcduSwitch, SwitchMap, SwitchMapBinaryWrapper},
SerializableSimMsgPayload, SimReply, SimRequest, SerializableSimMsgPayload, SimReply, SimRequest,
}; };
use serde::{Deserialize, Serialize};
use crate::{acs::mgm::MpscModeLeafInterface, pus::hk::HkReply, requests::CompositeRequest}; use crate::{
acs::mgm::MpscModeLeafInterface,
pus::hk::{HkReply, HkReplyVariant},
requests::CompositeRequest,
};
pub trait SerialInterface { pub trait SerialInterface {
type Error: core::fmt::Debug; type Error: core::fmt::Debug;
@ -40,6 +53,12 @@ pub struct SerialInterfaceToSim {
pub sim_reply_rx: mpsc::Receiver<SimReply>, pub sim_reply_rx: mpsc::Receiver<SimReply>,
} }
#[derive(Debug, Copy, Clone, PartialEq, Eq, TryFromPrimitive, IntoPrimitive)]
#[repr(u32)]
pub enum SetId {
SwitcherSet = 0,
}
impl SerialInterface for SerialInterfaceToSim { impl SerialInterface for SerialInterfaceToSim {
type Error = (); type Error = ();
@ -162,7 +181,7 @@ pub enum OpCode {
PollAndRecvReplies = 1, PollAndRecvReplies = 1,
} }
#[derive(Clone, PartialEq, Eq, Default)] #[derive(Clone, PartialEq, Eq, Default, Serialize, Deserialize)]
pub struct SwitchSet { pub struct SwitchSet {
pub valid: bool, pub valid: bool,
pub switch_map: SwitchMap, pub switch_map: SwitchMap,
@ -187,6 +206,8 @@ pub struct PcduHandler<ComInterface: SerialInterface, TmSender: EcssTmSender> {
mode_and_submode: ModeAndSubmode, mode_and_submode: ModeAndSubmode,
#[new(default)] #[new(default)]
stamp_helper: TimestampHelper, stamp_helper: TimestampHelper,
#[new(value = "[0; 256]")]
tm_buf: [u8; 256],
} }
impl<ComInterface: SerialInterface, TmSender: EcssTmSender> PcduHandler<ComInterface, TmSender> { impl<ComInterface: SerialInterface, TmSender: EcssTmSender> PcduHandler<ComInterface, TmSender> {
@ -239,7 +260,48 @@ impl<ComInterface: SerialInterface, TmSender: EcssTmSender> PcduHandler<ComInter
pub fn handle_hk_request(&mut self, requestor_info: &MessageMetadata, hk_request: &HkRequest) { pub fn handle_hk_request(&mut self, requestor_info: &MessageMetadata, hk_request: &HkRequest) {
match hk_request.variant { match hk_request.variant {
HkRequestVariant::OneShot => todo!(), HkRequestVariant::OneShot => {
if hk_request.unique_id == SetId::SwitcherSet as u32 {
self.hk_reply_tx
.send(GenericMessage::new(
*requestor_info,
HkReply::new(hk_request.unique_id, HkReplyVariant::Ack),
))
.expect("failed to send HK reply");
let sec_header = PusTmSecondaryHeader::new(
3,
hk::Subservice::TmHkPacket as u8,
0,
0,
self.stamp_helper.stamp(),
);
// Send TM down as JSON.
let switch_map_snapshot = self
.shared_switch_map
.lock()
.expect("failed to lock switch map")
.clone();
let switch_map_json = serde_json::to_string(&switch_map_snapshot)
.expect("failed to serialize switch map");
if switch_map_json.len() > self.tm_buf.len() {
log::error!("switch map JSON too large for telemetry buffer");
return;
}
self.tm_buf[0..4].copy_from_slice(&self.id.unique_id.to_be_bytes());
self.tm_buf[4..8].copy_from_slice(&(SetId::SwitcherSet as u32).to_be_bytes());
self.tm_buf[8..8 + switch_map_json.len()]
.copy_from_slice(switch_map_json.as_bytes());
let hk_tm = PusTmCreator::new(
SpHeader::new_from_apid(self.id.apid),
sec_header,
&self.tm_buf[0..8 + switch_map_json.len()],
true,
);
self.tm_sender
.send_tm(self.id.id(), PusTmVariant::Direct(hk_tm))
.expect("failed to send HK TM");
}
}
HkRequestVariant::EnablePeriodic => todo!(), HkRequestVariant::EnablePeriodic => todo!(),
HkRequestVariant::DisablePeriodic => todo!(), HkRequestVariant::DisablePeriodic => todo!(),
HkRequestVariant::ModifyCollectionInterval(_) => todo!(), HkRequestVariant::ModifyCollectionInterval(_) => todo!(),

View File

@ -341,7 +341,7 @@ mod tests {
let (tm_funnel_tx, tm_funnel_rx) = mpsc::channel(); let (tm_funnel_tx, tm_funnel_rx) = mpsc::channel();
let (pus_action_tx, pus_action_rx) = mpsc::channel(); let (pus_action_tx, pus_action_rx) = mpsc::channel();
let (action_reply_tx, action_reply_rx) = mpsc::channel(); let (action_reply_tx, action_reply_rx) = mpsc::channel();
let (action_req_tx, action_req_rx) = mpsc::channel(); let (action_req_tx, action_req_rx) = mpsc::sync_channel(10);
let verif_reporter = TestVerificationReporter::new(owner_id); let verif_reporter = TestVerificationReporter::new(owner_id);
let mut generic_req_router = GenericRequestRouter::default(); let mut generic_req_router = GenericRequestRouter::default();
generic_req_router generic_req_router