next helper class

This commit is contained in:
2023-07-04 18:51:54 +02:00
parent 3a1c5832a9
commit 82b7717b49
5 changed files with 327 additions and 69 deletions

@@ -1,5 +1,8 @@
use crate::pus::AcceptedTc;
use crate::pus::{AcceptedTc, PusServiceBase};
use delegate::delegate;
use log::info;
use satrs_core::events::EventU32;
use satrs_core::params::Params;
use satrs_core::pool::{SharedPool, StoreAddr};
use satrs_core::pus::verification::{
StdVerifReporterWithSender, TcStateAccepted, VerificationToken,
@@ -11,45 +14,49 @@ use satrs_core::spacepackets::time::cds::TimeProvider;
use satrs_core::spacepackets::time::TimeWriter;
use satrs_core::spacepackets::tm::PusTm;
use satrs_core::tmtc::tm_helper::{PusTmWithCdsShortHelper, SharedTmStore};
use satrs_example::TEST_EVENT;
use std::sync::mpsc::{Receiver, Sender, TryRecvError};
pub struct PusService17Handler {
tc_rx: Receiver<AcceptedTc>,
tc_store: SharedPool,
tm_helper: PusTmWithCdsShortHelper,
tm_tx: Sender<StoreAddr>,
tm_store: SharedTmStore,
verification_handler: StdVerifReporterWithSender,
stamp_buf: [u8; 7],
pus_buf: [u8; 2048],
handled_tcs: u32,
pub struct SatrsTestServiceCustomHandler {
pub event_sender: Sender<(EventU32, Option<Params>)>,
}
impl PusService17Handler {
pub fn new(receiver: Receiver<AcceptedTc>, tc_pool: SharedPool, tm_helper: PusTmWithCdsShortHelper, tm_tx: Sender<StoreAddr>, tm_store: SharedTmStore, verification_handler: StdVerifReporterWithSender) -> Self {
pub struct PusService17TestHandler {
psb: PusServiceBase,
}
impl PusService17TestHandler {
pub fn new(
receiver: Receiver<AcceptedTc>,
tc_pool: SharedPool,
tm_helper: PusTmWithCdsShortHelper,
tm_tx: Sender<StoreAddr>,
tm_store: SharedTmStore,
verification_handler: StdVerifReporterWithSender,
) -> Self {
Self {
tc_rx: receiver,
tc_store: tc_pool,
tm_helper,
tm_tx,
tm_store,
verification_handler,
stamp_buf: [0; 7],
pus_buf: [0; 2048],
handled_tcs: 0
psb: PusServiceBase::new(
receiver,
tc_pool,
tm_helper,
tm_tx,
tm_store,
verification_handler,
),
}
}
// TODO: Return errors which occured
pub fn periodic_operation(&mut self) -> Result<u32, ()> {
self.handled_tcs = 0;
self.psb.handled_tcs = 0;
loop {
match self.tc_rx.try_recv() {
match self.psb.tc_rx.try_recv() {
Ok((addr, token)) => {
self.handle_one_tc(addr, token);
}
Err(e) => {
match e {
TryRecvError::Empty => return Ok(self.handled_tcs),
TryRecvError::Empty => return Ok(self.psb.handled_tcs),
TryRecvError::Disconnected => {
// TODO: Replace panic by something cleaner
panic!("PusService17Handler: Sender disconnected");
@@ -62,34 +69,56 @@ impl PusService17Handler {
pub fn handle_one_tc(&mut self, addr: StoreAddr, token: VerificationToken<TcStateAccepted>) {
let time_provider = TimeProvider::from_now_with_u16_days().unwrap();
// TODO: Better error handling
let (addr, token) = self.tc_rx.try_recv().unwrap();
{
// Keep locked section as short as possible.
let mut tc_pool = self.tc_store.write().unwrap();
let mut tc_pool = self.psb.tc_store.write().unwrap();
let tc_guard = tc_pool.read_with_guard(addr);
let tc_raw = tc_guard.read().unwrap();
self.pus_buf[0..tc_raw.len()].copy_from_slice(tc_raw);
self.psb.pus_buf[0..tc_raw.len()].copy_from_slice(tc_raw);
}
let tc = PusTc::from_bytes(&self.pus_buf).unwrap();
let (tc, tc_size) = PusTc::from_bytes(&self.psb.pus_buf).unwrap();
// TODO: Robustness: Check that service is 17
if tc.0.subservice() == 1 {
if tc.subservice() == 1 {
info!("Received PUS ping command TC[17,1]");
info!("Sending ping reply PUS TM[17,2]");
time_provider.write_to_bytes(&mut self.stamp_buf).unwrap();
time_provider
.write_to_bytes(&mut self.psb.stamp_buf)
.unwrap();
let start_token = self
.psb
.verification_handler
.start_success(token, Some(&self.stamp_buf))
.start_success(token, Some(&self.psb.stamp_buf))
.expect("Error sending start success");
// Sequence count will be handled centrally in TM funnel.
let ping_reply = self.tm_helper.create_pus_tm_with_stamp(17, 2, None, &time_provider, 0);
let addr = self.tm_store.add_pus_tm(&ping_reply);
self.tm_tx
let ping_reply =
self.psb
.tm_helper
.create_pus_tm_with_stamp(17, 2, None, &time_provider, 0);
let addr = self.psb.tm_store.add_pus_tm(&ping_reply);
self.psb
.tm_tx
.send(addr)
.expect("Sending TM to TM funnel failed");
self.verification_handler
.completion_success(start_token, Some(&self.stamp_buf))
self.psb
.verification_handler
.completion_success(start_token, Some(&self.psb.stamp_buf))
.expect("Error sending completion success");
self.handled_tcs += 1;
self.psb.handled_tcs += 1;
}
// TODO: How to handle invalid subservice?
// TODO: How do we handle custom code like this? Custom subservice handler via trait?
// if tc.subservice() == 128 {
// info!("Generating test event");
// self.event_sender
// .send((TEST_EVENT.into(), None))
// .expect("Sending test event failed");
// let start_token =
// verification_handler
// .start_success(token, Some(&stamp_buf))
// .expect("Error sending start success");
// verification_handler
// .completion_success(start_token, Some(&stamp_buf))
// .expect("Error sending completion success");
//
}
}