a lot of bugfixes
This commit is contained in:
@ -1,4 +1,4 @@
|
||||
use log::{debug, error, warn};
|
||||
use log::{error, warn};
|
||||
use ops_sat_rs::config::components::PUS_ACTION_SERVICE;
|
||||
use ops_sat_rs::config::tmtc_err;
|
||||
use ops_sat_rs::TimeStampHelper;
|
||||
@ -35,13 +35,13 @@ use super::{
|
||||
pub const DATA_REPLY: u8 = 130;
|
||||
|
||||
pub struct ActionReplyHandler {
|
||||
fail_data_buf: [u8; 128],
|
||||
fail_data_buf: [u8; 2048],
|
||||
}
|
||||
|
||||
impl Default for ActionReplyHandler {
|
||||
fn default() -> Self {
|
||||
Self {
|
||||
fail_data_buf: [0; 128],
|
||||
fail_data_buf: [0; 2048],
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -74,8 +74,57 @@ impl PusReplyHandler<ActivePusActionRequestStd, ActionReplyPus> for ActionReplyH
|
||||
ActionReplyVariant::CompletionFailed { error_code, params } => {
|
||||
let mut fail_data_len = 0;
|
||||
if let Some(params) = params {
|
||||
fail_data_len = params.write_to_be_bytes(&mut self.fail_data_buf)?;
|
||||
match params {
|
||||
satrs::params::Params::Heapless(heapless_param) => {
|
||||
// TODO: This should be part of the framework.
|
||||
match heapless_param {
|
||||
satrs::params::ParamsHeapless::Raw(raw) => {
|
||||
// TODO: size check.
|
||||
let _ = raw.write_to_be_bytes(
|
||||
&mut self.fail_data_buf[0..raw.written_len()],
|
||||
);
|
||||
}
|
||||
satrs::params::ParamsHeapless::EcssEnum(ecss_enum) => {
|
||||
// TODO: size check.
|
||||
let _ = ecss_enum.write_to_be_bytes(
|
||||
&mut self.fail_data_buf[0..ecss_enum.written_len()],
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
satrs::params::Params::Store(_) => {
|
||||
log::warn!("can not process store parameters")
|
||||
}
|
||||
satrs::params::Params::Vec(vec) => {
|
||||
// Truncate the string for now.
|
||||
fail_data_len = vec.len();
|
||||
if vec.len() > self.fail_data_buf.len() {
|
||||
log::warn!(
|
||||
"action reply vec too large, truncating to {} bytes",
|
||||
self.fail_data_buf.len()
|
||||
);
|
||||
}
|
||||
self.fail_data_buf[0..fail_data_len]
|
||||
.copy_from_slice(&vec[0..fail_data_len]);
|
||||
}
|
||||
satrs::params::Params::String(str) => {
|
||||
fail_data_len = str.len();
|
||||
// Truncate the string for now.
|
||||
if str.len() > self.fail_data_buf.len() {
|
||||
fail_data_len = self.fail_data_buf.len();
|
||||
log::warn!(
|
||||
"action reply string too large, truncating to {} bytes",
|
||||
self.fail_data_buf.len()
|
||||
);
|
||||
}
|
||||
self.fail_data_buf[0..fail_data_len]
|
||||
.copy_from_slice(&str.as_bytes()[0..fail_data_len]);
|
||||
log::warn!("received string param with len {}", str.len());
|
||||
}
|
||||
_ => todo!(),
|
||||
}
|
||||
}
|
||||
log::warn!("completion failure with fail data len: {}", fail_data_len);
|
||||
verification_handler.completion_failure(
|
||||
tm_sender,
|
||||
verif_token,
|
||||
@ -209,7 +258,7 @@ pub fn create_action_service(
|
||||
PUS_ACTION_SERVICE.id(),
|
||||
pus_action_rx,
|
||||
tm_funnel_tx,
|
||||
create_verification_reporter(PUS_ACTION_SERVICE.id(), PUS_ACTION_SERVICE.apid),
|
||||
create_verification_reporter(PUS_ACTION_SERVICE.id(), PUS_ACTION_SERVICE.apid, 2048),
|
||||
EcssTcInVecConverter::default(),
|
||||
),
|
||||
ActionRequestConverter::default(),
|
||||
@ -277,7 +326,7 @@ impl TargetedPusService for ActionServiceWrapper {
|
||||
|
||||
pub fn send_data_reply<TmSender: EcssTmSender>(
|
||||
apid_target: UniqueApidTargetId,
|
||||
reply_data: Vec<u8>,
|
||||
reply_data: &Vec<u8>,
|
||||
stamp_helper: &TimeStampHelper,
|
||||
tm_sender: &TmSender,
|
||||
) -> Result<(), EcssTmtcError> {
|
||||
@ -287,8 +336,8 @@ pub fn send_data_reply<TmSender: EcssTmSender>(
|
||||
data.extend(apid_target.apid.to_be_bytes());
|
||||
data.extend(apid_target.unique_id.to_be_bytes());
|
||||
data.extend(reply_data);
|
||||
debug!(
|
||||
"{}",
|
||||
log::trace!(
|
||||
"PUS action reply: {}",
|
||||
String::from_utf8(data.clone()[6..].to_vec()).expect("Error decoding data reply.")
|
||||
);
|
||||
let data_reply_tm = PusTmCreator::new(sp_header, sec_header, &data, true);
|
||||
|
@ -22,7 +22,7 @@ pub fn create_event_service(
|
||||
PUS_EVENT_MANAGEMENT.id(),
|
||||
pus_event_rx,
|
||||
tm_funnel_tx,
|
||||
create_verification_reporter(PUS_EVENT_MANAGEMENT.id(), PUS_EVENT_MANAGEMENT.apid),
|
||||
create_verification_reporter(PUS_EVENT_MANAGEMENT.id(), PUS_EVENT_MANAGEMENT.apid, 16),
|
||||
EcssTcInVecConverter::default(),
|
||||
),
|
||||
event_request_tx,
|
||||
|
@ -241,7 +241,7 @@ pub fn create_hk_service(
|
||||
PUS_HK_SERVICE.id(),
|
||||
pus_hk_rx,
|
||||
tm_funnel_tx,
|
||||
create_verification_reporter(PUS_HK_SERVICE.id(), PUS_HK_SERVICE.apid),
|
||||
create_verification_reporter(PUS_HK_SERVICE.id(), PUS_HK_SERVICE.apid, 16),
|
||||
EcssTcInVecConverter::default(),
|
||||
),
|
||||
HkRequestConverter::default(),
|
||||
|
@ -37,8 +37,12 @@ pub enum HandlingStatus {
|
||||
HandledOne,
|
||||
}
|
||||
|
||||
pub fn create_verification_reporter(owner_id: ComponentId, apid: Apid) -> VerificationReporter {
|
||||
let verif_cfg = VerificationReporterCfg::new(apid, 1, 2, 8).unwrap();
|
||||
pub fn create_verification_reporter(
|
||||
owner_id: ComponentId,
|
||||
apid: Apid,
|
||||
max_fail_data_len: usize,
|
||||
) -> VerificationReporter {
|
||||
let verif_cfg = VerificationReporterCfg::new(apid, 1, 2, max_fail_data_len).unwrap();
|
||||
// Every software component which needs to generate verification telemetry, gets a cloned
|
||||
// verification reporter.
|
||||
VerificationReporter::new(owner_id, &verif_cfg)
|
||||
@ -70,6 +74,7 @@ impl<TmSender: EcssTmSender> PusTcDistributor<TmSender> {
|
||||
verif_reporter: create_verification_reporter(
|
||||
PUS_ROUTING_SERVICE.id(),
|
||||
PUS_ROUTING_SERVICE.apid,
|
||||
16,
|
||||
),
|
||||
pus_router,
|
||||
stamp_helper: TimeStampHelper::default(),
|
||||
@ -406,20 +411,24 @@ where
|
||||
return Ok(());
|
||||
}
|
||||
let active_request = active_req_opt.unwrap();
|
||||
let request_finished = self
|
||||
.reply_handler
|
||||
.handle_reply(
|
||||
reply,
|
||||
active_request,
|
||||
&self.service_helper.common.tm_sender,
|
||||
&self.service_helper.common.verif_reporter,
|
||||
time_stamp,
|
||||
)
|
||||
.unwrap_or(false);
|
||||
if request_finished {
|
||||
self.active_request_map.remove(reply.request_id());
|
||||
match self.reply_handler.handle_reply(
|
||||
reply,
|
||||
active_request,
|
||||
&self.service_helper.common.tm_sender,
|
||||
&self.service_helper.common.verif_reporter,
|
||||
time_stamp,
|
||||
) {
|
||||
Ok(finished) => {
|
||||
if finished {
|
||||
self.active_request_map.remove(reply.request_id());
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
Err(e) => {
|
||||
self.active_request_map.remove(reply.request_id());
|
||||
Err(e)
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn check_for_request_timeouts(&mut self) {
|
||||
|
@ -212,7 +212,7 @@ pub fn create_mode_service(
|
||||
PUS_MODE_SERVICE.id(),
|
||||
pus_action_rx,
|
||||
tm_funnel_tx,
|
||||
create_verification_reporter(PUS_MODE_SERVICE.id(), PUS_MODE_SERVICE.apid),
|
||||
create_verification_reporter(PUS_MODE_SERVICE.id(), PUS_MODE_SERVICE.apid, 16),
|
||||
EcssTcInVecConverter::default(),
|
||||
),
|
||||
ModeRequestConverter::default(),
|
||||
|
@ -139,7 +139,11 @@ pub fn create_scheduler_service(
|
||||
PUS_SCHEDULER_SERVICE.id(),
|
||||
pus_sched_rx,
|
||||
tm_funnel_tx,
|
||||
create_verification_reporter(PUS_SCHEDULER_SERVICE.id(), PUS_SCHEDULER_SERVICE.apid),
|
||||
create_verification_reporter(
|
||||
PUS_SCHEDULER_SERVICE.id(),
|
||||
PUS_SCHEDULER_SERVICE.apid,
|
||||
16,
|
||||
),
|
||||
EcssTcInVecConverter::default(),
|
||||
),
|
||||
scheduler,
|
||||
|
@ -27,7 +27,7 @@ pub fn create_test_service(
|
||||
PUS_TEST_SERVICE.id(),
|
||||
pus_test_rx,
|
||||
tm_funnel_tx,
|
||||
create_verification_reporter(PUS_TEST_SERVICE.id(), PUS_TEST_SERVICE.apid),
|
||||
create_verification_reporter(PUS_TEST_SERVICE.id(), PUS_TEST_SERVICE.apid, 16),
|
||||
EcssTcInVecConverter::default(),
|
||||
));
|
||||
TestCustomServiceWrapper {
|
||||
|
Reference in New Issue
Block a user