82 lines
3.0 KiB
Rust
82 lines
3.0 KiB
Rust
use crate::pus::test::TestCustomServiceWrapper;
|
|
use crate::pus::HandlingStatus;
|
|
use derive_new::new;
|
|
use satrs::spacepackets::time::{cds, TimeWriter};
|
|
|
|
use super::{
|
|
action::ActionServiceWrapper, event::EventServiceWrapper, hk::HkServiceWrapper,
|
|
mode::ModeServiceWrapper, scheduler::SchedulingService, TargetedPusService,
|
|
};
|
|
|
|
#[derive(new)]
|
|
pub struct PusStack {
|
|
test_srv: TestCustomServiceWrapper,
|
|
hk_srv_wrapper: HkServiceWrapper,
|
|
event_srv: EventServiceWrapper,
|
|
action_srv_wrapper: ActionServiceWrapper,
|
|
schedule_srv: SchedulingService,
|
|
mode_srv: ModeServiceWrapper,
|
|
}
|
|
|
|
impl PusStack {
|
|
pub fn periodic_operation(&mut self) {
|
|
// Release all telecommands which reached their release time before calling the service
|
|
// handlers.
|
|
self.schedule_srv.release_tcs();
|
|
let time_stamp = cds::CdsTime::now_with_u16_days()
|
|
.expect("time stamp generation error")
|
|
.to_vec()
|
|
.unwrap();
|
|
loop {
|
|
let mut nothing_to_do = true;
|
|
let mut is_srv_finished =
|
|
|_srv_id: u8,
|
|
tc_handling_status: HandlingStatus,
|
|
reply_handling_status: Option<HandlingStatus>| {
|
|
if tc_handling_status == HandlingStatus::HandledOne
|
|
|| (reply_handling_status.is_some()
|
|
&& reply_handling_status.unwrap() == HandlingStatus::HandledOne)
|
|
{
|
|
nothing_to_do = false;
|
|
}
|
|
};
|
|
is_srv_finished(
|
|
17,
|
|
self.test_srv.poll_and_handle_next_packet(&time_stamp),
|
|
None,
|
|
);
|
|
is_srv_finished(
|
|
11,
|
|
self.schedule_srv.poll_and_handle_next_tc(&time_stamp),
|
|
None,
|
|
);
|
|
is_srv_finished(5, self.event_srv.poll_and_handle_next_tc(&time_stamp), None);
|
|
is_srv_finished(
|
|
8,
|
|
self.action_srv_wrapper.poll_and_handle_next_tc(&time_stamp),
|
|
Some(
|
|
self.action_srv_wrapper
|
|
.poll_and_handle_next_reply(&time_stamp),
|
|
),
|
|
);
|
|
is_srv_finished(
|
|
3,
|
|
self.hk_srv_wrapper.poll_and_handle_next_tc(&time_stamp),
|
|
Some(self.hk_srv_wrapper.poll_and_handle_next_reply(&time_stamp)),
|
|
);
|
|
is_srv_finished(
|
|
200,
|
|
self.mode_srv.poll_and_handle_next_tc(&time_stamp),
|
|
Some(self.mode_srv.poll_and_handle_next_reply(&time_stamp)),
|
|
);
|
|
if nothing_to_do {
|
|
// Timeout checking is only done once.
|
|
self.action_srv_wrapper.check_for_request_timeouts();
|
|
self.hk_srv_wrapper.check_for_request_timeouts();
|
|
self.mode_srv.check_for_request_timeouts();
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|