Compare commits
1 Commits
satrs-mib-
...
mode-tree-
| Author | SHA1 | Date | |
|---|---|---|---|
|
6a4417c954
|
@@ -4,7 +4,6 @@
|
|||||||
[](https://robamu.github.io/sat-rs/book/)
|
[](https://robamu.github.io/sat-rs/book/)
|
||||||
[](https://crates.io/crates/satrs)
|
[](https://crates.io/crates/satrs)
|
||||||
[](https://docs.rs/satrs)
|
[](https://docs.rs/satrs)
|
||||||
[](https://matrix.to/#/#sat-rs:matrix.org)
|
|
||||||
|
|
||||||
sat-rs
|
sat-rs
|
||||||
=========
|
=========
|
||||||
@@ -62,8 +61,6 @@ Each project has its own `CHANGELOG.md`.
|
|||||||
packet protocol implementations. This repository is re-exported in the
|
packet protocol implementations. This repository is re-exported in the
|
||||||
[`satrs`](https://egit.irs.uni-stuttgart.de/rust/satrs/src/branch/main/satrs)
|
[`satrs`](https://egit.irs.uni-stuttgart.de/rust/satrs/src/branch/main/satrs)
|
||||||
crate.
|
crate.
|
||||||
* [`cfdp`](https://egit.irs.uni-stuttgart.de/rust/cfdp): CCSDS File Delivery Protocol
|
|
||||||
(CFDP) high-level library components.
|
|
||||||
|
|
||||||
# Flight Heritage
|
# Flight Heritage
|
||||||
|
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ csv = "1"
|
|||||||
num_enum = "0.7"
|
num_enum = "0.7"
|
||||||
thiserror = "2"
|
thiserror = "2"
|
||||||
lazy_static = "1"
|
lazy_static = "1"
|
||||||
strum = { version = "0.27", features = ["derive"] }
|
strum = { version = "0.26", features = ["derive"] }
|
||||||
derive-new = "0.7"
|
derive-new = "0.7"
|
||||||
cfg-if = "1"
|
cfg-if = "1"
|
||||||
serde = { version = "1", features = ["derive"] }
|
serde = { version = "1", features = ["derive"] }
|
||||||
|
|||||||
@@ -1 +1,175 @@
|
|||||||
// TODO: Write the assembly
|
// TODO: Write the assembly
|
||||||
|
//
|
||||||
|
|
||||||
|
use std::sync::mpsc;
|
||||||
|
|
||||||
|
use satrs::{
|
||||||
|
dev_mgmt::{DevManagerCommandingHelper, DevManagerHelperResult, TransparentDevManagerHook},
|
||||||
|
mode::{
|
||||||
|
ModeAndSubmode, ModeError, ModeProvider, ModeReply, ModeReplyReceiver as _,
|
||||||
|
ModeReplySender as _, ModeRequest, ModeRequestHandler, ModeRequestReceiver as _,
|
||||||
|
ModeRequestorAndHandlerMpscBounded, UNKNOWN_MODE,
|
||||||
|
},
|
||||||
|
mode_tree::{ModeChild, ModeNode, ModeParent},
|
||||||
|
queue::GenericTargetedMessagingError,
|
||||||
|
request::{GenericMessage, MessageMetadata},
|
||||||
|
ComponentId,
|
||||||
|
};
|
||||||
|
use satrs_example::{ids, DeviceMode};
|
||||||
|
|
||||||
|
pub type RequestSenderType = mpsc::SyncSender<GenericMessage<ModeRequest>>;
|
||||||
|
pub type ReplySenderType = mpsc::SyncSender<GenericMessage<ModeReply>>;
|
||||||
|
|
||||||
|
// TODO: Needs to perform same functions as the integration test assembly, but also needs
|
||||||
|
// to track mode changes and health changes of children.
|
||||||
|
pub struct MgmAssembly {
|
||||||
|
pub mode_node: ModeRequestorAndHandlerMpscBounded,
|
||||||
|
pub mode_requestor_info: Option<MessageMetadata>,
|
||||||
|
pub mode_and_submode: ModeAndSubmode,
|
||||||
|
pub commanding_helper: DevManagerCommandingHelper<TransparentDevManagerHook>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl MgmAssembly {
|
||||||
|
pub fn new(mode_node: ModeRequestorAndHandlerMpscBounded) -> Self {
|
||||||
|
Self {
|
||||||
|
mode_node,
|
||||||
|
mode_requestor_info: None,
|
||||||
|
mode_and_submode: UNKNOWN_MODE,
|
||||||
|
commanding_helper: DevManagerCommandingHelper::new(TransparentDevManagerHook::default()),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub const fn id() -> ComponentId {
|
||||||
|
ids::acs::MGM_ASSEMBLY.raw()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn periodic_operation(&mut self) {
|
||||||
|
self.check_mode_requests().expect("mode messaging error");
|
||||||
|
self.check_mode_replies().expect("mode messaging error");
|
||||||
|
// TODO: perform target keeping, check whether children are in correct mode.
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn check_mode_requests(&mut self) -> Result<(), GenericTargetedMessagingError> {
|
||||||
|
while let Some(request) = self.mode_node.try_recv_mode_request()? {
|
||||||
|
self.handle_mode_request(request).unwrap();
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn check_mode_replies(&mut self) -> Result<(), ModeError> {
|
||||||
|
while let Some(reply_and_id) = self.mode_node.try_recv_mode_reply()? {
|
||||||
|
match self.commanding_helper.handle_mode_reply(&reply_and_id) {
|
||||||
|
Ok(result) => {
|
||||||
|
if let DevManagerHelperResult::ModeCommandingDone(context) = result {
|
||||||
|
// Complete the mode command.
|
||||||
|
self.mode_and_submode = context.target_mode;
|
||||||
|
self.handle_mode_reached(self.mode_requestor_info)?;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Err(err) => match err {
|
||||||
|
satrs::dev_mgmt::DevManagerHelperError::ChildNotInStore => todo!(),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ModeNode for MgmAssembly {
|
||||||
|
fn id(&self) -> ComponentId {
|
||||||
|
Self::id()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
impl ModeParent for MgmAssembly {
|
||||||
|
type Sender = RequestSenderType;
|
||||||
|
|
||||||
|
fn add_mode_child(&mut self, id: ComponentId, request_sender: RequestSenderType) {
|
||||||
|
self.mode_node.add_request_target(id, request_sender);
|
||||||
|
self.commanding_helper.add_mode_child(id, UNKNOWN_MODE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ModeChild for MgmAssembly {
|
||||||
|
type Sender = ReplySenderType;
|
||||||
|
|
||||||
|
fn add_mode_parent(&mut self, id: ComponentId, reply_sender: ReplySenderType) {
|
||||||
|
self.mode_node.add_reply_target(id, reply_sender);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ModeProvider for MgmAssembly {
|
||||||
|
fn mode_and_submode(&self) -> ModeAndSubmode {
|
||||||
|
self.mode_and_submode
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ModeRequestHandler for MgmAssembly {
|
||||||
|
type Error = ModeError;
|
||||||
|
fn start_transition(
|
||||||
|
&mut self,
|
||||||
|
requestor: MessageMetadata,
|
||||||
|
mode_and_submode: ModeAndSubmode,
|
||||||
|
forced: bool,
|
||||||
|
) -> Result<(), Self::Error> {
|
||||||
|
// Always accept forced commands and commands to mode OFF.
|
||||||
|
if self.commanding_helper.target_mode().is_some()
|
||||||
|
&& !forced
|
||||||
|
&& mode_and_submode.mode() != DeviceMode::Off as u32
|
||||||
|
{
|
||||||
|
return Err(ModeError::Busy);
|
||||||
|
}
|
||||||
|
self.mode_requestor_info = Some(requestor);
|
||||||
|
self.commanding_helper.send_mode_cmd_to_all_children(
|
||||||
|
requestor.request_id(),
|
||||||
|
mode_and_submode,
|
||||||
|
forced,
|
||||||
|
&self.mode_node,
|
||||||
|
)?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn announce_mode(&self, requestor_info: Option<MessageMetadata>, recursive: bool) {
|
||||||
|
println!(
|
||||||
|
"TestAssembly: Announcing mode (recursively: {}): {:?}",
|
||||||
|
recursive, self.mode_and_submode
|
||||||
|
);
|
||||||
|
let request_id = requestor_info.map_or(0, |info| info.request_id());
|
||||||
|
self.commanding_helper
|
||||||
|
.send_announce_mode_cmd_to_children(request_id, &self.mode_node, recursive)
|
||||||
|
.expect("sending mode request failed");
|
||||||
|
// TODO: Send announce event.
|
||||||
|
log::info!(
|
||||||
|
"MGM assembly announcing mode: {:?}",
|
||||||
|
self.mode_and_submode()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn handle_mode_reached(
|
||||||
|
&mut self,
|
||||||
|
mode_requestor: Option<MessageMetadata>,
|
||||||
|
) -> Result<(), Self::Error> {
|
||||||
|
if let Some(requestor) = mode_requestor {
|
||||||
|
self.send_mode_reply(requestor, ModeReply::ModeReply(self.mode_and_submode))?;
|
||||||
|
}
|
||||||
|
self.announce_mode(mode_requestor, false);
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn handle_mode_info(
|
||||||
|
&mut self,
|
||||||
|
requestor_info: MessageMetadata,
|
||||||
|
info: ModeAndSubmode,
|
||||||
|
) -> Result<(), Self::Error> {
|
||||||
|
// TODO: Perform mode keeping.
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn send_mode_reply(
|
||||||
|
&self,
|
||||||
|
requestor: MessageMetadata,
|
||||||
|
reply: ModeReply,
|
||||||
|
) -> Result<(), Self::Error> {
|
||||||
|
self.mode_node.send_mode_reply(requestor, reply)?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -83,7 +83,7 @@ impl SpiInterface for SpiSimInterface {
|
|||||||
.sim_request_tx
|
.sim_request_tx
|
||||||
.send(SimRequest::new_with_epoch_time(mgm_sensor_request))
|
.send(SimRequest::new_with_epoch_time(mgm_sensor_request))
|
||||||
{
|
{
|
||||||
log::error!("failed to send MGM LIS3 request: {e}");
|
log::error!("failed to send MGM LIS3 request: {}", e);
|
||||||
}
|
}
|
||||||
match self.sim_reply_rx.recv_timeout(Duration::from_millis(50)) {
|
match self.sim_reply_rx.recv_timeout(Duration::from_millis(50)) {
|
||||||
Ok(sim_reply) => {
|
Ok(sim_reply) => {
|
||||||
@@ -97,7 +97,7 @@ impl SpiInterface for SpiSimInterface {
|
|||||||
.copy_from_slice(&sim_reply_lis3.raw.z.to_le_bytes());
|
.copy_from_slice(&sim_reply_lis3.raw.z.to_le_bytes());
|
||||||
}
|
}
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
log::warn!("MGM LIS3 SIM reply timeout: {e}");
|
log::warn!("MGM LIS3 SIM reply timeout: {}", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
@@ -400,6 +400,7 @@ impl<
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn announce_mode(&self, _requestor_info: Option<MessageMetadata>, _recursive: bool) {
|
fn announce_mode(&self, _requestor_info: Option<MessageMetadata>, _recursive: bool) {
|
||||||
|
// TODO: Event
|
||||||
log::info!(
|
log::info!(
|
||||||
"{} announcing mode: {:?}",
|
"{} announcing mode: {:?}",
|
||||||
self.dev_str,
|
self.dev_str,
|
||||||
@@ -492,7 +493,7 @@ mod tests {
|
|||||||
tmtc::PacketAsVec,
|
tmtc::PacketAsVec,
|
||||||
ComponentId,
|
ComponentId,
|
||||||
};
|
};
|
||||||
use satrs_example::ids::{acs::ASSEMBLY, Apid};
|
use satrs_example::ids::{acs::MGM_ASSEMBLY, Apid};
|
||||||
use satrs_minisim::acs::lis3mdl::MgmLis3RawValues;
|
use satrs_minisim::acs::lis3mdl::MgmLis3RawValues;
|
||||||
|
|
||||||
use crate::{eps::TestSwitchHelper, pus::hk::HkReply, requests::CompositeRequest};
|
use crate::{eps::TestSwitchHelper, pus::hk::HkReply, requests::CompositeRequest};
|
||||||
@@ -593,7 +594,7 @@ mod tests {
|
|||||||
shared_mgm_set,
|
shared_mgm_set,
|
||||||
);
|
);
|
||||||
handler.add_mode_parent(PUS_MODE.into(), reply_tx_to_pus);
|
handler.add_mode_parent(PUS_MODE.into(), reply_tx_to_pus);
|
||||||
handler.add_mode_parent(ASSEMBLY.into(), reply_tx_to_parent);
|
handler.add_mode_parent(MGM_ASSEMBLY.into(), reply_tx_to_parent);
|
||||||
Self {
|
Self {
|
||||||
mode_request_tx: request_tx,
|
mode_request_tx: request_tx,
|
||||||
mode_reply_rx_to_pus: reply_rx_to_pus,
|
mode_reply_rx_to_pus: reply_rx_to_pus,
|
||||||
|
|||||||
@@ -401,7 +401,7 @@ impl<ComInterface: SerialInterface> PcduHandler<ComInterface> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}) {
|
}) {
|
||||||
log::warn!("receiving PCDU replies failed: {e:?}");
|
log::warn!("receiving PCDU replies failed: {:?}", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,15 +15,15 @@ pub mod acs {
|
|||||||
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
|
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
|
||||||
pub enum Id {
|
pub enum Id {
|
||||||
Subsystem = 1,
|
Subsystem = 1,
|
||||||
Assembly = 2,
|
MgmAssembly = 2,
|
||||||
Mgm0 = 3,
|
Mgm0 = 3,
|
||||||
Mgm1 = 4,
|
Mgm1 = 4,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub const SUBSYSTEM: super::UniqueApidTargetId =
|
pub const SUBSYSTEM: super::UniqueApidTargetId =
|
||||||
super::UniqueApidTargetId::new(super::Apid::Acs as u16, Id::Subsystem as u32);
|
super::UniqueApidTargetId::new(super::Apid::Acs as u16, Id::Subsystem as u32);
|
||||||
pub const ASSEMBLY: super::UniqueApidTargetId =
|
pub const MGM_ASSEMBLY: super::UniqueApidTargetId =
|
||||||
super::UniqueApidTargetId::new(super::Apid::Acs as u16, Id::Assembly as u32);
|
super::UniqueApidTargetId::new(super::Apid::Acs as u16, Id::MgmAssembly as u32);
|
||||||
pub const MGM0: super::UniqueApidTargetId =
|
pub const MGM0: super::UniqueApidTargetId =
|
||||||
super::UniqueApidTargetId::new(super::Apid::Acs as u16, Id::Mgm0 as u32);
|
super::UniqueApidTargetId::new(super::Apid::Acs as u16, Id::Mgm0 as u32);
|
||||||
pub const MGM1: super::UniqueApidTargetId =
|
pub const MGM1: super::UniqueApidTargetId =
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ pub fn create_sim_client(sim_request_rx: mpsc::Receiver<SimRequest>) -> Option<S
|
|||||||
return Some(sim_client);
|
return Some(sim_client);
|
||||||
}
|
}
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
log::warn!("sim client creation error: {e}");
|
log::warn!("sim client creation error: {}", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
None
|
None
|
||||||
@@ -116,7 +116,7 @@ impl SimClientUdp {
|
|||||||
.udp_client
|
.udp_client
|
||||||
.send_to(request_json.as_bytes(), self.simulator_addr)
|
.send_to(request_json.as_bytes(), self.simulator_addr)
|
||||||
{
|
{
|
||||||
log::error!("error sending data to UDP SIM server: {e}");
|
log::error!("error sending data to UDP SIM server: {}", e);
|
||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
no_sim_requests_handled = false;
|
no_sim_requests_handled = false;
|
||||||
@@ -151,7 +151,7 @@ impl SimClientUdp {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
log::warn!("failed to deserialize SIM reply: {e}");
|
log::warn!("failed to deserialize SIM reply: {}", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -161,7 +161,7 @@ impl SimClientUdp {
|
|||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
log::error!("error receiving data from UDP SIM server: {e}");
|
log::error!("error receiving data from UDP SIM server: {}", e);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ impl SpacePacketValidator for SimplePacketValidator {
|
|||||||
if self.valid_ids.contains(&sp_header.packet_id()) {
|
if self.valid_ids.contains(&sp_header.packet_id()) {
|
||||||
return SpValidity::Valid;
|
return SpValidity::Valid;
|
||||||
}
|
}
|
||||||
log::warn!("ignoring space packet with header {sp_header:?}");
|
log::warn!("ignoring space packet with header {:?}", sp_header);
|
||||||
// We could perform a CRC check.. but lets keep this simple and assume that TCP ensures
|
// We could perform a CRC check.. but lets keep this simple and assume that TCP ensures
|
||||||
// data integrity.
|
// data integrity.
|
||||||
SpValidity::Skip
|
SpValidity::Skip
|
||||||
|
|||||||
@@ -15,7 +15,6 @@ pub trait UdpTmHandler {
|
|||||||
fn send_tm_to_udp_client(&mut self, socket: &UdpSocket, recv_addr: &SocketAddr);
|
fn send_tm_to_udp_client(&mut self, socket: &UdpSocket, recv_addr: &SocketAddr);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(dead_code)]
|
|
||||||
pub struct StaticUdpTmHandler {
|
pub struct StaticUdpTmHandler {
|
||||||
pub tm_rx: mpsc::Receiver<PacketInPool>,
|
pub tm_rx: mpsc::Receiver<PacketInPool>,
|
||||||
pub tm_store: SharedStaticMemoryPool,
|
pub tm_store: SharedStaticMemoryPool,
|
||||||
|
|||||||
@@ -5,7 +5,10 @@ use std::{
|
|||||||
time::Duration,
|
time::Duration,
|
||||||
};
|
};
|
||||||
|
|
||||||
use acs::mgm::{MgmHandlerLis3Mdl, SpiDummyInterface, SpiSimInterface, SpiSimInterfaceWrapper};
|
use acs::{
|
||||||
|
assembly::MgmAssembly,
|
||||||
|
mgm::{MgmHandlerLis3Mdl, SpiDummyInterface, SpiSimInterface, SpiSimInterfaceWrapper},
|
||||||
|
};
|
||||||
use eps::{
|
use eps::{
|
||||||
pcdu::{PcduHandler, SerialInterfaceDummy, SerialInterfaceToSim, SerialSimInterfaceWrapper},
|
pcdu::{PcduHandler, SerialInterfaceDummy, SerialInterfaceToSim, SerialSimInterfaceWrapper},
|
||||||
PowerSwitchHelper,
|
PowerSwitchHelper,
|
||||||
@@ -31,7 +34,10 @@ use pus::{
|
|||||||
use requests::GenericRequestRouter;
|
use requests::GenericRequestRouter;
|
||||||
use satrs::{
|
use satrs::{
|
||||||
hal::std::{tcp_server::ServerConfig, udp_server::UdpTcServer},
|
hal::std::{tcp_server::ServerConfig, udp_server::UdpTcServer},
|
||||||
mode::{Mode, ModeAndSubmode, ModeRequest, ModeRequestHandlerMpscBounded},
|
mode::{
|
||||||
|
Mode, ModeAndSubmode, ModeRequest, ModeRequestHandlerMpscBounded,
|
||||||
|
ModeRequestorAndHandlerMpscBounded,
|
||||||
|
},
|
||||||
mode_tree::connect_mode_nodes,
|
mode_tree::connect_mode_nodes,
|
||||||
pus::{event_man::EventRequestWithToken, EcssTcInMemConverter, HandlingStatus},
|
pus::{event_man::EventRequestWithToken, EcssTcInMemConverter, HandlingStatus},
|
||||||
request::{GenericMessage, MessageMetadata},
|
request::{GenericMessage, MessageMetadata},
|
||||||
@@ -303,6 +309,15 @@ fn main() {
|
|||||||
let (switch_request_tx, switch_request_rx) = mpsc::sync_channel(20);
|
let (switch_request_tx, switch_request_rx) = mpsc::sync_channel(20);
|
||||||
let switch_helper = PowerSwitchHelper::new(switch_request_tx, shared_switch_set.clone());
|
let switch_helper = PowerSwitchHelper::new(switch_request_tx, shared_switch_set.clone());
|
||||||
|
|
||||||
|
let (mgm_assy_mode_req_tx, mgm_assy_mode_req_rx) = mpsc::sync_channel(20);
|
||||||
|
let (mgm_assy_mode_reply_tx, mgm_assy_mode_reply_rx) = mpsc::sync_channel(20);
|
||||||
|
let mgm_assembly_mode_node = ModeRequestorAndHandlerMpscBounded::new(
|
||||||
|
MgmAssembly::id(),
|
||||||
|
mgm_assy_mode_req_rx,
|
||||||
|
mgm_assy_mode_reply_rx,
|
||||||
|
);
|
||||||
|
let mut mgm_assembly = MgmAssembly::new(mgm_assembly_mode_node);
|
||||||
|
|
||||||
let shared_mgm_0_set = Arc::default();
|
let shared_mgm_0_set = Arc::default();
|
||||||
let shared_mgm_1_set = Arc::default();
|
let shared_mgm_1_set = Arc::default();
|
||||||
let mgm_0_mode_node = ModeRequestHandlerMpscBounded::new(MGM0.into(), mgm_0_handler_mode_rx);
|
let mgm_0_mode_node = ModeRequestHandlerMpscBounded::new(MGM0.into(), mgm_0_handler_mode_rx);
|
||||||
@@ -364,6 +379,19 @@ fn main() {
|
|||||||
&mut mgm_1_handler,
|
&mut mgm_1_handler,
|
||||||
pus_mode_reply_tx.clone(),
|
pus_mode_reply_tx.clone(),
|
||||||
);
|
);
|
||||||
|
// Connect assembly to device handlers.
|
||||||
|
connect_mode_nodes(
|
||||||
|
&mut mgm_assembly,
|
||||||
|
mgm_assy_mode_req_tx.clone(),
|
||||||
|
&mut mgm_1_handler,
|
||||||
|
mgm_assy_mode_reply_tx.clone(),
|
||||||
|
);
|
||||||
|
connect_mode_nodes(
|
||||||
|
&mut mgm_assembly,
|
||||||
|
mgm_assy_mode_req_tx,
|
||||||
|
&mut mgm_1_handler,
|
||||||
|
mgm_assy_mode_reply_tx,
|
||||||
|
);
|
||||||
|
|
||||||
let pcdu_serial_interface = if let Some(sim_client) = opt_sim_client.as_mut() {
|
let pcdu_serial_interface = if let Some(sim_client) = opt_sim_client.as_mut() {
|
||||||
sim_client.add_reply_recipient(satrs_minisim::SimComponent::Pcdu, pcdu_sim_reply_tx);
|
sim_client.add_reply_recipient(satrs_minisim::SimComponent::Pcdu, pcdu_sim_reply_tx);
|
||||||
@@ -455,6 +483,7 @@ fn main() {
|
|||||||
let jh_aocs = thread::Builder::new()
|
let jh_aocs = thread::Builder::new()
|
||||||
.name("sat-rs aocs".to_string())
|
.name("sat-rs aocs".to_string())
|
||||||
.spawn(move || loop {
|
.spawn(move || loop {
|
||||||
|
mgm_assembly.periodic_operation();
|
||||||
mgm_0_handler.periodic_operation();
|
mgm_0_handler.periodic_operation();
|
||||||
mgm_1_handler.periodic_operation();
|
mgm_1_handler.periodic_operation();
|
||||||
thread::sleep(Duration::from_millis(FREQ_MS_AOCS));
|
thread::sleep(Duration::from_millis(FREQ_MS_AOCS));
|
||||||
|
|||||||
@@ -102,7 +102,7 @@ impl PusTcDistributor {
|
|||||||
sender_id,
|
sender_id,
|
||||||
pus_tc_result.unwrap_err()
|
pus_tc_result.unwrap_err()
|
||||||
);
|
);
|
||||||
log::warn!("raw data: {raw_tc:x?}");
|
log::warn!("raw data: {:x?}", raw_tc);
|
||||||
// TODO: Shouldn't this be an error?
|
// TODO: Shouldn't this be an error?
|
||||||
return Ok(HandlingStatus::HandledOne);
|
return Ok(HandlingStatus::HandledOne);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,10 +8,6 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
|
|||||||
|
|
||||||
# [unreleased]
|
# [unreleased]
|
||||||
|
|
||||||
# [v0.1.3] 2024-08-26
|
|
||||||
|
|
||||||
Bump `satrs-shared`.
|
|
||||||
|
|
||||||
# [v0.1.2] 2024-04-17
|
# [v0.1.2] 2024-04-17
|
||||||
|
|
||||||
Allow `satrs-shared` from `v0.1.3` to `<v0.2`.
|
Allow `satrs-shared` from `v0.1.3` to `<v0.2`.
|
||||||
@@ -23,6 +19,3 @@ Allow `satrs-shared` from `v0.1.3` to `<v0.2`.
|
|||||||
# [v0.1.0] 2024-02-12
|
# [v0.1.0] 2024-02-12
|
||||||
|
|
||||||
Initial release containing the `resultcode` macro.
|
Initial release containing the `resultcode` macro.
|
||||||
|
|
||||||
[unreleased]: https://egit.irs.uni-stuttgart.de/rust/sat-rs/compare/satrs-mib-v0.1.3...HEAD
|
|
||||||
[v0.1.3]: https://egit.irs.uni-stuttgart.de/rust/sat-rs/compare/satrs-mib-v0.1.2...satrs-mib-v0.1.3
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "satrs-mib"
|
name = "satrs-mib"
|
||||||
version = "0.1.3"
|
version = "0.1.2"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
rust-version = "1.61"
|
rust-version = "1.61"
|
||||||
authors = ["Robin Mueller <muellerr@irs.uni-stuttgart.de>"]
|
authors = ["Robin Mueller <muellerr@irs.uni-stuttgart.de>"]
|
||||||
@@ -23,7 +23,7 @@ version = "1"
|
|||||||
optional = true
|
optional = true
|
||||||
|
|
||||||
[dependencies.satrs-shared]
|
[dependencies.satrs-shared]
|
||||||
version = "0.2"
|
version = "0.2.2"
|
||||||
path = "../satrs-shared"
|
path = "../satrs-shared"
|
||||||
features = ["serde"]
|
features = ["serde"]
|
||||||
|
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ features = ["full"]
|
|||||||
trybuild = { version = "1", features = ["diff"] }
|
trybuild = { version = "1", features = ["diff"] }
|
||||||
|
|
||||||
[dev-dependencies.satrs-shared]
|
[dev-dependencies.satrs-shared]
|
||||||
version = "0.2"
|
version = "0.2.2"
|
||||||
path = "../../satrs-shared"
|
path = "../../satrs-shared"
|
||||||
|
|
||||||
[dev-dependencies.satrs-mib]
|
[dev-dependencies.satrs-mib]
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ serde_json = "1"
|
|||||||
log = "0.4"
|
log = "0.4"
|
||||||
thiserror = "2"
|
thiserror = "2"
|
||||||
fern = "0.7"
|
fern = "0.7"
|
||||||
strum = { version = "0.27", features = ["derive"] }
|
strum = { version = "0.26", features = ["derive"] }
|
||||||
num_enum = "0.7"
|
num_enum = "0.7"
|
||||||
humantime = "2"
|
humantime = "2"
|
||||||
tai-time = { version = "0.3", features = ["serde"] }
|
tai-time = { version = "0.3", features = ["serde"] }
|
||||||
|
|||||||
@@ -120,7 +120,7 @@ impl SimController {
|
|||||||
fn handle_ctrl_request(&mut self, request: &SimRequest) -> Result<(), SimRequestError> {
|
fn handle_ctrl_request(&mut self, request: &SimRequest) -> Result<(), SimRequestError> {
|
||||||
let sim_ctrl_request = SimCtrlRequest::from_sim_message(request)?;
|
let sim_ctrl_request = SimCtrlRequest::from_sim_message(request)?;
|
||||||
if SIM_CTRL_REQ_WIRETAPPING {
|
if SIM_CTRL_REQ_WIRETAPPING {
|
||||||
log::info!("received sim ctrl request: {sim_ctrl_request:?}");
|
log::info!("received sim ctrl request: {:?}", sim_ctrl_request);
|
||||||
}
|
}
|
||||||
match sim_ctrl_request {
|
match sim_ctrl_request {
|
||||||
SimCtrlRequest::Ping => {
|
SimCtrlRequest::Ping => {
|
||||||
@@ -139,7 +139,7 @@ impl SimController {
|
|||||||
) -> Result<(), SimRequestError> {
|
) -> Result<(), SimRequestError> {
|
||||||
let mgm_request = MgmRequestLis3Mdl::from_sim_message(request)?;
|
let mgm_request = MgmRequestLis3Mdl::from_sim_message(request)?;
|
||||||
if MGM_REQ_WIRETAPPING {
|
if MGM_REQ_WIRETAPPING {
|
||||||
log::info!("received MGM request: {mgm_request:?}");
|
log::info!("received MGM request: {:?}", mgm_request);
|
||||||
}
|
}
|
||||||
match mgm_request {
|
match mgm_request {
|
||||||
MgmRequestLis3Mdl::RequestSensorData => {
|
MgmRequestLis3Mdl::RequestSensorData => {
|
||||||
@@ -160,7 +160,7 @@ impl SimController {
|
|||||||
fn handle_pcdu_request(&mut self, request: &SimRequest) -> Result<(), SimRequestError> {
|
fn handle_pcdu_request(&mut self, request: &SimRequest) -> Result<(), SimRequestError> {
|
||||||
let pcdu_request = PcduRequest::from_sim_message(request)?;
|
let pcdu_request = PcduRequest::from_sim_message(request)?;
|
||||||
if PCDU_REQ_WIRETAPPING {
|
if PCDU_REQ_WIRETAPPING {
|
||||||
log::info!("received PCDU request: {pcdu_request:?}");
|
log::info!("received PCDU request: {:?}", pcdu_request);
|
||||||
}
|
}
|
||||||
match pcdu_request {
|
match pcdu_request {
|
||||||
PcduRequest::RequestSwitchInfo => {
|
PcduRequest::RequestSwitchInfo => {
|
||||||
@@ -188,7 +188,7 @@ impl SimController {
|
|||||||
fn handle_mgt_request(&mut self, request: &SimRequest) -> Result<(), SimRequestError> {
|
fn handle_mgt_request(&mut self, request: &SimRequest) -> Result<(), SimRequestError> {
|
||||||
let mgt_request = MgtRequest::from_sim_message(request)?;
|
let mgt_request = MgtRequest::from_sim_message(request)?;
|
||||||
if MGT_REQ_WIRETAPPING {
|
if MGT_REQ_WIRETAPPING {
|
||||||
log::info!("received MGT request: {mgt_request:?}");
|
log::info!("received MGT request: {:?}", mgt_request);
|
||||||
}
|
}
|
||||||
match mgt_request {
|
match mgt_request {
|
||||||
MgtRequest::ApplyTorque { duration, dipole } => self
|
MgtRequest::ApplyTorque { duration, dipole } => self
|
||||||
|
|||||||
@@ -130,7 +130,7 @@ fn main() {
|
|||||||
let mut udp_server =
|
let mut udp_server =
|
||||||
SimUdpServer::new(SIM_CTRL_PORT, request_sender, reply_receiver, 200, None)
|
SimUdpServer::new(SIM_CTRL_PORT, request_sender, reply_receiver, 200, None)
|
||||||
.expect("could not create UDP request server");
|
.expect("could not create UDP request server");
|
||||||
log::info!("starting UDP server on port {SIM_CTRL_PORT}");
|
log::info!("starting UDP server on port {}", SIM_CTRL_PORT);
|
||||||
// This thread manages the simulator UDP server.
|
// This thread manages the simulator UDP server.
|
||||||
let udp_tc_thread = thread::spawn(move || {
|
let udp_tc_thread = thread::spawn(move || {
|
||||||
udp_server.run();
|
udp_server.run();
|
||||||
|
|||||||
@@ -8,10 +8,6 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
|
|||||||
|
|
||||||
# [unreleased]
|
# [unreleased]
|
||||||
|
|
||||||
# [v0.2.3] 2025-07-22
|
|
||||||
|
|
||||||
`spacepackets` range v0.14 to v0.15
|
|
||||||
|
|
||||||
# [v0.2.2] 2025-05-10
|
# [v0.2.2] 2025-05-10
|
||||||
|
|
||||||
- Bump to `spacepackests` v0.14
|
- Bump to `spacepackests` v0.14
|
||||||
@@ -50,6 +46,5 @@ Allow `spacepackets` range starting with v0.10 and v0.11.
|
|||||||
|
|
||||||
Initial release.
|
Initial release.
|
||||||
|
|
||||||
[unreleased]: https://egit.irs.uni-stuttgart.de/rust/sat-rs/compare/satrs-shared-v0.2.3...HEAD
|
[unreleased]: https://egit.irs.uni-stuttgart.de/rust/sat-rs/compare/satrs-shared-v0.2.2...HEAD
|
||||||
[v0.2.3]: https://egit.irs.uni-stuttgart.de/rust/sat-rs/compare/satrs-shared-v0.2.1...satrs-shared-v0.2.3
|
|
||||||
[v0.2.2]: https://egit.irs.uni-stuttgart.de/rust/sat-rs/compare/satrs-shared-v0.2.1...satrs-shared-v0.2.2
|
[v0.2.2]: https://egit.irs.uni-stuttgart.de/rust/sat-rs/compare/satrs-shared-v0.2.1...satrs-shared-v0.2.2
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "satrs-shared"
|
name = "satrs-shared"
|
||||||
description = "Components shared by multiple sat-rs crates"
|
description = "Components shared by multiple sat-rs crates"
|
||||||
version = "0.2.3"
|
version = "0.2.2"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
authors = ["Robin Mueller <muellerr@irs.uni-stuttgart.de>"]
|
authors = ["Robin Mueller <muellerr@irs.uni-stuttgart.de>"]
|
||||||
homepage = "https://absatsw.irs.uni-stuttgart.de/projects/sat-rs/"
|
homepage = "https://absatsw.irs.uni-stuttgart.de/projects/sat-rs/"
|
||||||
@@ -11,7 +11,7 @@ license = "Apache-2.0"
|
|||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
spacepackets = { version = ">=0.14, <=0.15", default-features = false }
|
spacepackets = { version = ">=0.14, <=0.15", git = "https://egit.irs.uni-stuttgart.de/rust/spacepackets.git", default-features = false }
|
||||||
|
|
||||||
[dependencies.serde]
|
[dependencies.serde]
|
||||||
version = "1"
|
version = "1"
|
||||||
|
|||||||
@@ -8,16 +8,6 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
|
|||||||
|
|
||||||
# [unreleased]
|
# [unreleased]
|
||||||
|
|
||||||
- Bump `sat-rs` edition to 2024.
|
|
||||||
|
|
||||||
# [v0.3.0-alpha.2] 2025-07-22
|
|
||||||
|
|
||||||
`satrs-shared` update
|
|
||||||
|
|
||||||
# [v0.3.0-alpha.1] 2025-07-22
|
|
||||||
|
|
||||||
`spacepackets` range v0.14 to v0.15
|
|
||||||
|
|
||||||
# [v0.3.0-alpha.0] 2025-02-18
|
# [v0.3.0-alpha.0] 2025-02-18
|
||||||
|
|
||||||
`spacepackets` v0.13
|
`spacepackets` v0.13
|
||||||
@@ -208,8 +198,3 @@ docs-rs hotfix
|
|||||||
# [v0.1.0] 2024-02-12
|
# [v0.1.0] 2024-02-12
|
||||||
|
|
||||||
Initial release.
|
Initial release.
|
||||||
|
|
||||||
[unreleased]: https://egit.irs.uni-stuttgart.de/rust/sat-rs/compare/satrs-v0.3.0-alpha.2...HEAD
|
|
||||||
[v0.3.0-alpha.2]: https://egit.irs.uni-stuttgart.de/rust/sat-rs/compare/satrs-v0.3.0-alpha.1...satrs-v0.3.0-alpha.2
|
|
||||||
[v0.3.0-alpha.1]: https://egit.irs.uni-stuttgart.de/rust/sat-rs/compare/satrs-v0.3.0-alpha.0...satrs-v0.3.0-alpha.1
|
|
||||||
[v0.3.0-alpha.0]: https://egit.irs.uni-stuttgart.de/rust/sat-rs/compare/satrs-v0.2.1...satrs-v0.3.0-alpha.0
|
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "satrs"
|
name = "satrs"
|
||||||
version = "0.3.0-alpha.2"
|
version = "0.3.0-alpha.0"
|
||||||
edition = "2024"
|
edition = "2021"
|
||||||
rust-version = "1.85.0"
|
rust-version = "1.82.0"
|
||||||
authors = ["Robin Mueller <muellerr@irs.uni-stuttgart.de>"]
|
authors = ["Robin Mueller <muellerr@irs.uni-stuttgart.de>"]
|
||||||
description = "A library collection to build software for remote systems"
|
description = "A library collection to build software for remote systems"
|
||||||
homepage = "https://github.com/us-irs/sat-rs"
|
homepage = "https://github.com/us-irs/sat-rs"
|
||||||
@@ -13,14 +13,14 @@ keywords = ["no-std", "space", "aerospace"]
|
|||||||
categories = ["aerospace", "aerospace::space-protocols", "no-std", "hardware-support", "embedded"]
|
categories = ["aerospace", "aerospace::space-protocols", "no-std", "hardware-support", "embedded"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
satrs-shared = { version = "0.2", path = "../satrs-shared" }
|
satrs-shared = { version = "0.2.2", path = "../satrs-shared" }
|
||||||
spacepackets = { version = ">=0.14, <=0.15", default-features = false }
|
spacepackets = { version = ">=0.14, <=0.15", git = "https://egit.irs.uni-stuttgart.de/rust/spacepackets.git", default-features = false }
|
||||||
|
|
||||||
delegate = ">0.7, <=0.13"
|
delegate = ">0.7, <=0.13"
|
||||||
paste = "1"
|
paste = "1"
|
||||||
derive-new = ">=0.6, <=0.7"
|
derive-new = ">=0.6, <=0.7"
|
||||||
num_enum = { version = ">0.5, <=0.7", default-features = false }
|
num_enum = { version = ">0.5, <=0.7", default-features = false }
|
||||||
cobs = { version = "0.4", default-features = false }
|
cobs = { version = "0.4", default-features = false, git = "https://github.com/jamesmunns/cobs.rs.git", branch = "main" }
|
||||||
thiserror = { version = "2", default-features = false }
|
thiserror = { version = "2", default-features = false }
|
||||||
|
|
||||||
hashbrown = { version = ">=0.14, <=0.15", optional = true }
|
hashbrown = { version = ">=0.14, <=0.15", optional = true }
|
||||||
@@ -31,9 +31,9 @@ downcast-rs = { version = "2", default-features = false, optional = true }
|
|||||||
bus = { version = "2.2", optional = true }
|
bus = { version = "2.2", optional = true }
|
||||||
crossbeam-channel = { version = "0.5", default-features = false, optional = true }
|
crossbeam-channel = { version = "0.5", default-features = false, optional = true }
|
||||||
serde = { version = "1", default-features = false, optional = true }
|
serde = { version = "1", default-features = false, optional = true }
|
||||||
socket2 = { version = "0.6", features = ["all"], optional = true }
|
socket2 = { version = "0.5", features = ["all"], optional = true }
|
||||||
mio = { version = "1", features = ["os-poll", "net"], optional = true }
|
mio = { version = "1", features = ["os-poll", "net"], optional = true }
|
||||||
defmt = { version = "1", optional = true }
|
defmt = { version = "0.3", optional = true }
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
serde = "1"
|
serde = "1"
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
ComponentId,
|
|
||||||
mode::{ModeAndSubmode, ModeReply, ModeRequest, ModeRequestSender},
|
mode::{ModeAndSubmode, ModeReply, ModeRequest, ModeRequestSender},
|
||||||
mode_tree::{ModeStoreProvider, ModeStoreVec},
|
mode_tree::{ModeStoreProvider, ModeStoreVec},
|
||||||
queue::{GenericSendError, GenericTargetedMessagingError},
|
queue::{GenericSendError, GenericTargetedMessagingError},
|
||||||
request::{GenericMessage, RequestId},
|
request::{GenericMessage, RequestId},
|
||||||
|
ComponentId,
|
||||||
};
|
};
|
||||||
use core::fmt::Debug;
|
use core::fmt::Debug;
|
||||||
|
|
||||||
@@ -270,7 +270,7 @@ impl<UserHook: DevManagerUserHook> DevManagerCommandingHelper<UserHook> {
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use crate::{
|
use crate::{
|
||||||
mode::{UNKNOWN_MODE, tests::ModeReqSenderMock},
|
mode::{tests::ModeReqSenderMock, UNKNOWN_MODE},
|
||||||
request::MessageMetadata,
|
request::MessageMetadata,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
use spacepackets::{CcsdsPacket, SpHeader};
|
use spacepackets::{CcsdsPacket, SpHeader};
|
||||||
|
|
||||||
use crate::{ComponentId, tmtc::PacketSenderRaw};
|
use crate::{tmtc::PacketSenderRaw, ComponentId};
|
||||||
|
|
||||||
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
|
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
|
||||||
pub enum SpValidity {
|
pub enum SpValidity {
|
||||||
@@ -90,13 +90,13 @@ pub fn parse_buffer_for_ccsds_space_packets<SendError>(
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use spacepackets::{
|
use spacepackets::{
|
||||||
|
ecss::{tc::PusTcCreator, WritablePusPacket},
|
||||||
CcsdsPacket, PacketId, PacketSequenceCtrl, PacketType, SequenceFlags, SpHeader,
|
CcsdsPacket, PacketId, PacketSequenceCtrl, PacketType, SequenceFlags, SpHeader,
|
||||||
ecss::tc::PusTcCreator,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
use crate::{ComponentId, encoding::tests::TcCacher};
|
use crate::{encoding::tests::TcCacher, ComponentId};
|
||||||
|
|
||||||
use super::{SpValidity, SpacePacketValidator, parse_buffer_for_ccsds_space_packets};
|
use super::{parse_buffer_for_ccsds_space_packets, SpValidity, SpacePacketValidator};
|
||||||
|
|
||||||
const PARSER_ID: ComponentId = 0x05;
|
const PARSER_ID: ComponentId = 0x05;
|
||||||
const TEST_APID_0: u16 = 0x02;
|
const TEST_APID_0: u16 = 0x02;
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
use crate::{ComponentId, tmtc::PacketSenderRaw};
|
use crate::{tmtc::PacketSenderRaw, ComponentId};
|
||||||
use cobs::{decode_in_place, encode, max_encoding_length};
|
use cobs::{decode_in_place, encode, max_encoding_length};
|
||||||
|
|
||||||
/// This function encodes the given packet with COBS and also wraps the encoded packet with
|
/// This function encodes the given packet with COBS and also wraps the encoded packet with
|
||||||
@@ -104,8 +104,8 @@ pub(crate) mod tests {
|
|||||||
use cobs::encode;
|
use cobs::encode;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
|
encoding::tests::{encode_simple_packet, TcCacher, INVERTED_PACKET, SIMPLE_PACKET},
|
||||||
ComponentId,
|
ComponentId,
|
||||||
encoding::tests::{INVERTED_PACKET, SIMPLE_PACKET, TcCacher, encode_simple_packet},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
use super::parse_buffer_for_cobs_encoded_packets;
|
use super::parse_buffer_for_cobs_encoded_packets;
|
||||||
|
|||||||
@@ -11,8 +11,8 @@ pub(crate) mod tests {
|
|||||||
use alloc::collections::VecDeque;
|
use alloc::collections::VecDeque;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
ComponentId,
|
|
||||||
tmtc::{PacketAsVec, PacketSenderRaw},
|
tmtc::{PacketAsVec, PacketSenderRaw},
|
||||||
|
ComponentId,
|
||||||
};
|
};
|
||||||
|
|
||||||
use super::cobs::encode_packet_with_cobs;
|
use super::cobs::encode_packet_with_cobs;
|
||||||
|
|||||||
@@ -136,7 +136,7 @@ pub trait ListenerMapProvider {
|
|||||||
#[cfg(feature = "alloc")]
|
#[cfg(feature = "alloc")]
|
||||||
fn get_listeners(&self) -> alloc::vec::Vec<ListenerKey>;
|
fn get_listeners(&self) -> alloc::vec::Vec<ListenerKey>;
|
||||||
fn contains_listener(&self, key: &ListenerKey) -> bool;
|
fn contains_listener(&self, key: &ListenerKey) -> bool;
|
||||||
fn get_listener_ids(&self, key: &ListenerKey) -> Option<Iter<'_, ComponentId>>;
|
fn get_listener_ids(&self, key: &ListenerKey) -> Option<Iter<ComponentId>>;
|
||||||
fn add_listener(&mut self, key: ListenerKey, listener_id: ComponentId) -> bool;
|
fn add_listener(&mut self, key: ListenerKey, listener_id: ComponentId) -> bool;
|
||||||
fn remove_duplicates(&mut self, key: &ListenerKey);
|
fn remove_duplicates(&mut self, key: &ListenerKey);
|
||||||
}
|
}
|
||||||
@@ -204,7 +204,7 @@ impl<
|
|||||||
EventSender: EventSendProvider<Event, ParamProvider>,
|
EventSender: EventSendProvider<Event, ParamProvider>,
|
||||||
Event: GenericEvent + Copy,
|
Event: GenericEvent + Copy,
|
||||||
ParamProvider: Debug,
|
ParamProvider: Debug,
|
||||||
> EventManager<EventReceiver, SenderMap, ListenerMap, EventSender, Event, ParamProvider>
|
> EventManager<EventReceiver, SenderMap, ListenerMap, EventSender, Event, ParamProvider>
|
||||||
{
|
{
|
||||||
pub fn remove_duplicates(&mut self, key: &ListenerKey) {
|
pub fn remove_duplicates(&mut self, key: &ListenerKey) {
|
||||||
self.listener_map.remove_duplicates(key)
|
self.listener_map.remove_duplicates(key)
|
||||||
@@ -235,7 +235,7 @@ impl<
|
|||||||
EventSenderMap: EventSendProvider<Event, ParamProvider>,
|
EventSenderMap: EventSendProvider<Event, ParamProvider>,
|
||||||
Event: GenericEvent + Copy,
|
Event: GenericEvent + Copy,
|
||||||
ParamProvider: Debug,
|
ParamProvider: Debug,
|
||||||
> EventManager<EventReceiver, SenderMap, ListenerMap, EventSenderMap, Event, ParamProvider>
|
> EventManager<EventReceiver, SenderMap, ListenerMap, EventSenderMap, Event, ParamProvider>
|
||||||
{
|
{
|
||||||
pub fn new_with_custom_maps(
|
pub fn new_with_custom_maps(
|
||||||
event_receiver: EventReceiver,
|
event_receiver: EventReceiver,
|
||||||
@@ -273,7 +273,7 @@ impl<
|
|||||||
EventSenderMap: EventSendProvider<Event, ParamProvider, Error = GenericSendError>,
|
EventSenderMap: EventSendProvider<Event, ParamProvider, Error = GenericSendError>,
|
||||||
Event: GenericEvent + Copy,
|
Event: GenericEvent + Copy,
|
||||||
ParamProvider: Clone + Debug,
|
ParamProvider: Clone + Debug,
|
||||||
> EventManager<EventReceiver, SenderMap, ListenerMap, EventSenderMap, Event, ParamProvider>
|
> EventManager<EventReceiver, SenderMap, ListenerMap, EventSenderMap, Event, ParamProvider>
|
||||||
{
|
{
|
||||||
/// This function will use the cached event receiver and try to receive one event.
|
/// This function will use the cached event receiver and try to receive one event.
|
||||||
/// If an event was received, it will try to route that event to all subscribed event listeners.
|
/// If an event was received, it will try to route that event to all subscribed event listeners.
|
||||||
@@ -402,7 +402,7 @@ pub mod alloc_mod {
|
|||||||
self.listeners.contains_key(key)
|
self.listeners.contains_key(key)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_listener_ids(&self, key: &ListenerKey) -> Option<Iter<'_, ComponentId>> {
|
fn get_listener_ids(&self, key: &ListenerKey) -> Option<Iter<ComponentId>> {
|
||||||
self.listeners.get(key).map(|vec| vec.iter())
|
self.listeners.get(key).map(|vec| vec.iter())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -31,9 +31,9 @@ use core::fmt::Debug;
|
|||||||
use core::hash::Hash;
|
use core::hash::Hash;
|
||||||
use core::marker::PhantomData;
|
use core::marker::PhantomData;
|
||||||
use delegate::delegate;
|
use delegate::delegate;
|
||||||
use spacepackets::ByteConversionError;
|
|
||||||
use spacepackets::ecss::EcssEnumeration;
|
use spacepackets::ecss::EcssEnumeration;
|
||||||
use spacepackets::util::{ToBeBytes, UnsignedEnum};
|
use spacepackets::util::{ToBeBytes, UnsignedEnum};
|
||||||
|
use spacepackets::ByteConversionError;
|
||||||
|
|
||||||
/// Using a type definition allows to change this to u64 in the future more easily
|
/// Using a type definition allows to change this to u64 in the future more easily
|
||||||
pub type LargestEventRaw = u32;
|
pub type LargestEventRaw = u32;
|
||||||
|
|||||||
@@ -55,8 +55,7 @@ pub fn exec_sched_single<
|
|||||||
let mut cycle_count = 0;
|
let mut cycle_count = 0;
|
||||||
thread::Builder::new()
|
thread::Builder::new()
|
||||||
.name(String::from(executable.task_name()))
|
.name(String::from(executable.task_name()))
|
||||||
.spawn(move || {
|
.spawn(move || loop {
|
||||||
loop {
|
|
||||||
if let Some(ref mut terminator) = termination {
|
if let Some(ref mut terminator) = termination {
|
||||||
match terminator.try_recv() {
|
match terminator.try_recv() {
|
||||||
Ok(_) | Err(TryRecvError::Disconnected) => {
|
Ok(_) | Err(TryRecvError::Disconnected) => {
|
||||||
@@ -84,7 +83,6 @@ pub fn exec_sched_single<
|
|||||||
if let Some(freq) = task_freq {
|
if let Some(freq) = task_freq {
|
||||||
thread::sleep(freq);
|
thread::sleep(freq);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -112,8 +110,7 @@ pub fn exec_sched_multi<
|
|||||||
|
|
||||||
thread::Builder::new()
|
thread::Builder::new()
|
||||||
.name(String::from(task_name))
|
.name(String::from(task_name))
|
||||||
.spawn(move || {
|
.spawn(move || loop {
|
||||||
loop {
|
|
||||||
if let Some(ref mut terminator) = termination {
|
if let Some(ref mut terminator) = termination {
|
||||||
match terminator.try_recv() {
|
match terminator.try_recv() {
|
||||||
Ok(_) | Err(TryRecvError::Disconnected) => {
|
Ok(_) | Err(TryRecvError::Disconnected) => {
|
||||||
@@ -150,15 +147,14 @@ pub fn exec_sched_multi<
|
|||||||
}
|
}
|
||||||
let freq = task_freq.unwrap_or_else(|| panic!("No task frequency specified"));
|
let freq = task_freq.unwrap_or_else(|| panic!("No task frequency specified"));
|
||||||
thread::sleep(freq);
|
thread::sleep(freq);
|
||||||
}
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::{
|
use super::{
|
||||||
Executable, ExecutableWithType, ExecutionType, OpResult, exec_sched_multi,
|
exec_sched_multi, exec_sched_single, Executable, ExecutableWithType, ExecutionType,
|
||||||
exec_sched_single,
|
OpResult,
|
||||||
};
|
};
|
||||||
use bus::Bus;
|
use bus::Bus;
|
||||||
use std::boxed::Box;
|
use std::boxed::Box;
|
||||||
|
|||||||
@@ -13,10 +13,10 @@ use crate::encoding::parse_buffer_for_cobs_encoded_packets;
|
|||||||
use crate::tmtc::PacketSenderRaw;
|
use crate::tmtc::PacketSenderRaw;
|
||||||
use crate::tmtc::PacketSource;
|
use crate::tmtc::PacketSource;
|
||||||
|
|
||||||
use crate::ComponentId;
|
|
||||||
use crate::hal::std::tcp_server::{
|
use crate::hal::std::tcp_server::{
|
||||||
ConnectionResult, ServerConfig, TcpTcParser, TcpTmSender, TcpTmtcError, TcpTmtcGenericServer,
|
ConnectionResult, ServerConfig, TcpTcParser, TcpTmSender, TcpTmtcError, TcpTmtcGenericServer,
|
||||||
};
|
};
|
||||||
|
use crate::ComponentId;
|
||||||
|
|
||||||
use super::tcp_server::HandledConnectionHandler;
|
use super::tcp_server::HandledConnectionHandler;
|
||||||
use super::tcp_server::HandledConnectionInfo;
|
use super::tcp_server::HandledConnectionInfo;
|
||||||
@@ -141,7 +141,7 @@ impl<
|
|||||||
HandledConnection: HandledConnectionHandler,
|
HandledConnection: HandledConnectionHandler,
|
||||||
TmError: 'static,
|
TmError: 'static,
|
||||||
TcError: 'static,
|
TcError: 'static,
|
||||||
> TcpTmtcInCobsServer<TmSource, TcReceiver, HandledConnection, TmError, TcError>
|
> TcpTmtcInCobsServer<TmSource, TcReceiver, HandledConnection, TmError, TcError>
|
||||||
{
|
{
|
||||||
/// Create a new TCP TMTC server which exchanges TMTC packets encoded with
|
/// Create a new TCP TMTC server which exchanges TMTC packets encoded with
|
||||||
/// [COBS protocol](https://en.wikipedia.org/wiki/Consistent_Overhead_Byte_Stuffing).
|
/// [COBS protocol](https://en.wikipedia.org/wiki/Consistent_Overhead_Byte_Stuffing).
|
||||||
@@ -206,14 +206,14 @@ mod tests {
|
|||||||
};
|
};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
ComponentId,
|
|
||||||
encoding::tests::{INVERTED_PACKET, SIMPLE_PACKET},
|
encoding::tests::{INVERTED_PACKET, SIMPLE_PACKET},
|
||||||
hal::std::tcp_server::{
|
hal::std::tcp_server::{
|
||||||
ConnectionResult, ServerConfig,
|
|
||||||
tests::{ConnectionFinishedHandler, SyncTmSource},
|
tests::{ConnectionFinishedHandler, SyncTmSource},
|
||||||
|
ConnectionResult, ServerConfig,
|
||||||
},
|
},
|
||||||
queue::GenericSendError,
|
queue::GenericSendError,
|
||||||
tmtc::PacketAsVec,
|
tmtc::PacketAsVec,
|
||||||
|
ComponentId,
|
||||||
};
|
};
|
||||||
use alloc::sync::Arc;
|
use alloc::sync::Arc;
|
||||||
use cobs::encode;
|
use cobs::encode;
|
||||||
@@ -435,8 +435,7 @@ mod tests {
|
|||||||
generic_tmtc_server(&auto_port_addr, tc_sender.clone(), tm_source, None);
|
generic_tmtc_server(&auto_port_addr, tc_sender.clone(), tm_source, None);
|
||||||
let start = Instant::now();
|
let start = Instant::now();
|
||||||
// Call the connection handler in separate thread, does block.
|
// Call the connection handler in separate thread, does block.
|
||||||
let thread_jh = thread::spawn(move || {
|
let thread_jh = thread::spawn(move || loop {
|
||||||
loop {
|
|
||||||
let result = tcp_server.handle_all_connections(Some(Duration::from_millis(20)));
|
let result = tcp_server.handle_all_connections(Some(Duration::from_millis(20)));
|
||||||
if result.is_err() {
|
if result.is_err() {
|
||||||
panic!("handling connection failed: {:?}", result.unwrap_err());
|
panic!("handling connection failed: {:?}", result.unwrap_err());
|
||||||
@@ -448,7 +447,6 @@ mod tests {
|
|||||||
if Instant::now() - start > Duration::from_millis(100) {
|
if Instant::now() - start > Duration::from_millis(100) {
|
||||||
panic!("regular stop signal handling failed");
|
panic!("regular stop signal handling failed");
|
||||||
}
|
}
|
||||||
}
|
|
||||||
});
|
});
|
||||||
thread_jh.join().expect("thread join failed");
|
thread_jh.join().expect("thread join failed");
|
||||||
}
|
}
|
||||||
@@ -471,8 +469,7 @@ mod tests {
|
|||||||
let stop_signal_copy = stop_signal.clone();
|
let stop_signal_copy = stop_signal.clone();
|
||||||
let start = Instant::now();
|
let start = Instant::now();
|
||||||
// Call the connection handler in separate thread, does block.
|
// Call the connection handler in separate thread, does block.
|
||||||
let thread_jh = thread::spawn(move || {
|
let thread_jh = thread::spawn(move || loop {
|
||||||
loop {
|
|
||||||
let result = tcp_server.handle_all_connections(Some(Duration::from_millis(20)));
|
let result = tcp_server.handle_all_connections(Some(Duration::from_millis(20)));
|
||||||
if result.is_err() {
|
if result.is_err() {
|
||||||
panic!("handling connection failed: {:?}", result.unwrap_err());
|
panic!("handling connection failed: {:?}", result.unwrap_err());
|
||||||
@@ -487,7 +484,6 @@ mod tests {
|
|||||||
if Instant::now() - start > Duration::from_millis(100) {
|
if Instant::now() - start > Duration::from_millis(100) {
|
||||||
panic!("regular stop signal handling failed");
|
panic!("regular stop signal handling failed");
|
||||||
}
|
}
|
||||||
}
|
|
||||||
});
|
});
|
||||||
// We connect but do not do anything.
|
// We connect but do not do anything.
|
||||||
let _stream = TcpStream::connect(dest_addr).expect("connecting to TCP server failed");
|
let _stream = TcpStream::connect(dest_addr).expect("connecting to TCP server failed");
|
||||||
|
|||||||
@@ -11,8 +11,8 @@ use std::io::{self, Read};
|
|||||||
use std::net::SocketAddr;
|
use std::net::SocketAddr;
|
||||||
use std::thread;
|
use std::thread;
|
||||||
|
|
||||||
use crate::ComponentId;
|
|
||||||
use crate::tmtc::{PacketSenderRaw, PacketSource};
|
use crate::tmtc::{PacketSenderRaw, PacketSource};
|
||||||
|
use crate::ComponentId;
|
||||||
use thiserror::Error;
|
use thiserror::Error;
|
||||||
|
|
||||||
// Re-export the TMTC in COBS server.
|
// Re-export the TMTC in COBS server.
|
||||||
@@ -194,7 +194,7 @@ impl<
|
|||||||
HandledConnection: HandledConnectionHandler,
|
HandledConnection: HandledConnectionHandler,
|
||||||
TmError: 'static,
|
TmError: 'static,
|
||||||
TcSendError: 'static,
|
TcSendError: 'static,
|
||||||
>
|
>
|
||||||
TcpTmtcGenericServer<
|
TcpTmtcGenericServer<
|
||||||
TmSource,
|
TmSource,
|
||||||
TcSender,
|
TcSender,
|
||||||
|
|||||||
@@ -5,9 +5,9 @@ use mio::net::{TcpListener, TcpStream};
|
|||||||
use std::{io::Write, net::SocketAddr};
|
use std::{io::Write, net::SocketAddr};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
ComponentId,
|
|
||||||
encoding::{ccsds::SpacePacketValidator, parse_buffer_for_ccsds_space_packets},
|
encoding::{ccsds::SpacePacketValidator, parse_buffer_for_ccsds_space_packets},
|
||||||
tmtc::{PacketSenderRaw, PacketSource},
|
tmtc::{PacketSenderRaw, PacketSource},
|
||||||
|
ComponentId,
|
||||||
};
|
};
|
||||||
|
|
||||||
use super::tcp_server::{
|
use super::tcp_server::{
|
||||||
@@ -113,7 +113,7 @@ impl<
|
|||||||
HandledConnection: HandledConnectionHandler,
|
HandledConnection: HandledConnectionHandler,
|
||||||
TmError: 'static,
|
TmError: 'static,
|
||||||
TcError: 'static,
|
TcError: 'static,
|
||||||
> TcpSpacepacketsServer<TmSource, TcSender, Validator, HandledConnection, TmError, TcError>
|
> TcpSpacepacketsServer<TmSource, TcSender, Validator, HandledConnection, TmError, TcError>
|
||||||
{
|
{
|
||||||
///
|
///
|
||||||
/// ## Parameter
|
/// ## Parameter
|
||||||
@@ -185,19 +185,19 @@ mod tests {
|
|||||||
use alloc::sync::Arc;
|
use alloc::sync::Arc;
|
||||||
use hashbrown::HashSet;
|
use hashbrown::HashSet;
|
||||||
use spacepackets::{
|
use spacepackets::{
|
||||||
|
ecss::{tc::PusTcCreator, WritablePusPacket},
|
||||||
CcsdsPacket, PacketId, SpHeader,
|
CcsdsPacket, PacketId, SpHeader,
|
||||||
ecss::{WritablePusPacket, tc::PusTcCreator},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
ComponentId,
|
|
||||||
encoding::ccsds::{SpValidity, SpacePacketValidator},
|
encoding::ccsds::{SpValidity, SpacePacketValidator},
|
||||||
hal::std::tcp_server::{
|
hal::std::tcp_server::{
|
||||||
ConnectionResult, ServerConfig,
|
|
||||||
tests::{ConnectionFinishedHandler, SyncTmSource},
|
tests::{ConnectionFinishedHandler, SyncTmSource},
|
||||||
|
ConnectionResult, ServerConfig,
|
||||||
},
|
},
|
||||||
queue::GenericSendError,
|
queue::GenericSendError,
|
||||||
tmtc::PacketAsVec,
|
tmtc::PacketAsVec,
|
||||||
|
ComponentId,
|
||||||
};
|
};
|
||||||
|
|
||||||
use super::TcpSpacepacketsServer;
|
use super::TcpSpacepacketsServer;
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
//! Generic UDP TC server.
|
//! Generic UDP TC server.
|
||||||
use crate::ComponentId;
|
|
||||||
use crate::tmtc::PacketSenderRaw;
|
use crate::tmtc::PacketSenderRaw;
|
||||||
|
use crate::ComponentId;
|
||||||
use core::fmt::Debug;
|
use core::fmt::Debug;
|
||||||
use std::io::{self, ErrorKind};
|
use std::io::{self, ErrorKind};
|
||||||
use std::net::{SocketAddr, ToSocketAddrs, UdpSocket};
|
use std::net::{SocketAddr, ToSocketAddrs, UdpSocket};
|
||||||
@@ -105,7 +105,7 @@ impl<TcSender: PacketSenderRaw<Error = SendError>, SendError: Debug + 'static>
|
|||||||
Err(ReceiveResult::NothingReceived)
|
Err(ReceiveResult::NothingReceived)
|
||||||
} else {
|
} else {
|
||||||
Err(e.into())
|
Err(e.into())
|
||||||
};
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
let (num_bytes, from) = res;
|
let (num_bytes, from) = res;
|
||||||
@@ -123,13 +123,14 @@ impl<TcSender: PacketSenderRaw<Error = SendError>, SendError: Debug + 'static>
|
|||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use crate::ComponentId;
|
|
||||||
use crate::hal::std::udp_server::{ReceiveResult, UdpTcServer};
|
use crate::hal::std::udp_server::{ReceiveResult, UdpTcServer};
|
||||||
use crate::queue::GenericSendError;
|
use crate::queue::GenericSendError;
|
||||||
use crate::tmtc::PacketSenderRaw;
|
use crate::tmtc::PacketSenderRaw;
|
||||||
|
use crate::ComponentId;
|
||||||
use core::cell::RefCell;
|
use core::cell::RefCell;
|
||||||
use spacepackets::SpHeader;
|
|
||||||
use spacepackets::ecss::tc::PusTcCreator;
|
use spacepackets::ecss::tc::PusTcCreator;
|
||||||
|
use spacepackets::ecss::WritablePusPacket;
|
||||||
|
use spacepackets::SpHeader;
|
||||||
use std::collections::VecDeque;
|
use std::collections::VecDeque;
|
||||||
use std::net::{IpAddr, Ipv4Addr, SocketAddr, UdpSocket};
|
use std::net::{IpAddr, Ipv4Addr, SocketAddr, UdpSocket};
|
||||||
use std::vec::Vec;
|
use std::vec::Vec;
|
||||||
|
|||||||
@@ -11,11 +11,11 @@ pub use alloc_mod::*;
|
|||||||
pub use std_mod::*;
|
pub use std_mod::*;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
ComponentId,
|
|
||||||
queue::{GenericReceiveError, GenericSendError},
|
queue::{GenericReceiveError, GenericSendError},
|
||||||
request::{
|
request::{
|
||||||
GenericMessage, MessageMetadata, MessageReceiverProvider, MessageReceiverWithId, RequestId,
|
GenericMessage, MessageMetadata, MessageReceiverProvider, MessageReceiverWithId, RequestId,
|
||||||
},
|
},
|
||||||
|
ComponentId,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub type Mode = u32;
|
pub type Mode = u32;
|
||||||
@@ -313,7 +313,8 @@ pub mod alloc_mod {
|
|||||||
Sender: MessageSenderProvider<ModeReply>,
|
Sender: MessageSenderProvider<ModeReply>,
|
||||||
Receiver: MessageReceiverProvider<From>,
|
Receiver: MessageReceiverProvider<From>,
|
||||||
SenderStore: MessageSenderStoreProvider<ModeReply, Sender>,
|
SenderStore: MessageSenderStoreProvider<ModeReply, Sender>,
|
||||||
> ModeReplySender for MessageSenderAndReceiver<ModeReply, From, Sender, Receiver, SenderStore>
|
> ModeReplySender
|
||||||
|
for MessageSenderAndReceiver<ModeReply, From, Sender, Receiver, SenderStore>
|
||||||
{
|
{
|
||||||
fn local_channel_id(&self) -> ComponentId {
|
fn local_channel_id(&self) -> ComponentId {
|
||||||
self.local_channel_id_generic()
|
self.local_channel_id_generic()
|
||||||
@@ -337,7 +338,8 @@ pub mod alloc_mod {
|
|||||||
Sender: MessageSenderProvider<To>,
|
Sender: MessageSenderProvider<To>,
|
||||||
Receiver: MessageReceiverProvider<ModeReply>,
|
Receiver: MessageReceiverProvider<ModeReply>,
|
||||||
SenderStore: MessageSenderStoreProvider<To, Sender>,
|
SenderStore: MessageSenderStoreProvider<To, Sender>,
|
||||||
> ModeReplyReceiver for MessageSenderAndReceiver<To, ModeReply, Sender, Receiver, SenderStore>
|
> ModeReplyReceiver
|
||||||
|
for MessageSenderAndReceiver<To, ModeReply, Sender, Receiver, SenderStore>
|
||||||
{
|
{
|
||||||
fn try_recv_mode_reply(
|
fn try_recv_mode_reply(
|
||||||
&self,
|
&self,
|
||||||
@@ -724,7 +726,7 @@ pub(crate) mod tests {
|
|||||||
use core::cell::RefCell;
|
use core::cell::RefCell;
|
||||||
use std::collections::VecDeque;
|
use std::collections::VecDeque;
|
||||||
|
|
||||||
use crate::{ComponentId, request::RequestId};
|
use crate::{request::RequestId, ComponentId};
|
||||||
|
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
|
|||||||
@@ -2,9 +2,9 @@ use alloc::vec::Vec;
|
|||||||
use hashbrown::HashMap;
|
use hashbrown::HashMap;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
ComponentId,
|
|
||||||
mode::{Mode, ModeAndSubmode, ModeReply, ModeRequest, Submode},
|
mode::{Mode, ModeAndSubmode, ModeReply, ModeRequest, Submode},
|
||||||
request::MessageSenderProvider,
|
request::MessageSenderProvider,
|
||||||
|
ComponentId,
|
||||||
};
|
};
|
||||||
|
|
||||||
#[cfg(feature = "alloc")]
|
#[cfg(feature = "alloc")]
|
||||||
|
|||||||
@@ -47,10 +47,10 @@ use crate::pool::PoolAddr;
|
|||||||
use core::fmt::Debug;
|
use core::fmt::Debug;
|
||||||
use core::mem::size_of;
|
use core::mem::size_of;
|
||||||
use paste::paste;
|
use paste::paste;
|
||||||
use spacepackets::ByteConversionError;
|
use spacepackets::ecss::{EcssEnumU16, EcssEnumU32, EcssEnumU64, EcssEnumU8};
|
||||||
use spacepackets::ecss::{EcssEnumU8, EcssEnumU16, EcssEnumU32, EcssEnumU64};
|
|
||||||
pub use spacepackets::util::ToBeBytes;
|
pub use spacepackets::util::ToBeBytes;
|
||||||
use spacepackets::util::UnsignedEnum;
|
use spacepackets::util::UnsignedEnum;
|
||||||
|
use spacepackets::ByteConversionError;
|
||||||
|
|
||||||
#[cfg(feature = "alloc")]
|
#[cfg(feature = "alloc")]
|
||||||
use alloc::string::{String, ToString};
|
use alloc::string::{String, ToString};
|
||||||
|
|||||||
@@ -281,7 +281,7 @@ pub trait PoolProviderWithGuards: PoolProvider {
|
|||||||
/// This can prevent memory leaks. Users can read the data and release the guard
|
/// This can prevent memory leaks. Users can read the data and release the guard
|
||||||
/// if the data in the store is valid for further processing. If the data is faulty, no
|
/// if the data in the store is valid for further processing. If the data is faulty, no
|
||||||
/// manual deletion is necessary when returning from a processing function prematurely.
|
/// manual deletion is necessary when returning from a processing function prematurely.
|
||||||
fn read_with_guard(&mut self, addr: PoolAddr) -> PoolGuard<'_, Self>;
|
fn read_with_guard(&mut self, addr: PoolAddr) -> PoolGuard<Self>;
|
||||||
|
|
||||||
/// This function behaves like [PoolProvider::modify], but consumes the provided
|
/// This function behaves like [PoolProvider::modify], but consumes the provided
|
||||||
/// address and returns a RAII conformant guard object.
|
/// address and returns a RAII conformant guard object.
|
||||||
@@ -291,7 +291,7 @@ pub trait PoolProviderWithGuards: PoolProvider {
|
|||||||
/// This can prevent memory leaks. Users can read (and modify) the data and release the guard
|
/// This can prevent memory leaks. Users can read (and modify) the data and release the guard
|
||||||
/// if the data in the store is valid for further processing. If the data is faulty, no
|
/// if the data in the store is valid for further processing. If the data is faulty, no
|
||||||
/// manual deletion is necessary when returning from a processing function prematurely.
|
/// manual deletion is necessary when returning from a processing function prematurely.
|
||||||
fn modify_with_guard(&mut self, addr: PoolAddr) -> PoolRwGuard<'_, Self>;
|
fn modify_with_guard(&mut self, addr: PoolAddr) -> PoolRwGuard<Self>;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct PoolGuard<'a, MemProvider: PoolProvider + ?Sized> {
|
pub struct PoolGuard<'a, MemProvider: PoolProvider + ?Sized> {
|
||||||
@@ -602,7 +602,7 @@ pub mod heapless_mod {
|
|||||||
if i < start_at_subpool as usize {
|
if i < start_at_subpool as usize {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if pool_cfg.block_size >= req_size {
|
if pool_cfg.block_size as usize >= req_size {
|
||||||
return Ok(i as u16);
|
return Ok(i as u16);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -638,7 +638,7 @@ pub mod heapless_mod {
|
|||||||
|
|
||||||
fn raw_pos(&self, addr: &StaticPoolAddr) -> Option<usize> {
|
fn raw_pos(&self, addr: &StaticPoolAddr) -> Option<usize> {
|
||||||
let (pool_cfg, _) = self.pool.get(addr.pool_idx as usize)?;
|
let (pool_cfg, _) = self.pool.get(addr.pool_idx as usize)?;
|
||||||
Some(addr.packet_idx as usize * pool_cfg.block_size)
|
Some(addr.packet_idx as usize * pool_cfg.block_size as usize)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -707,7 +707,7 @@ pub mod heapless_mod {
|
|||||||
let subpool_cfg = self.pool.get(addr.pool_idx as usize).unwrap().0;
|
let subpool_cfg = self.pool.get(addr.pool_idx as usize).unwrap().0;
|
||||||
let raw_pos = self.raw_pos(&addr).unwrap();
|
let raw_pos = self.raw_pos(&addr).unwrap();
|
||||||
let block = &mut self.pool.get_mut(addr.pool_idx as usize).unwrap().1
|
let block = &mut self.pool.get_mut(addr.pool_idx as usize).unwrap().1
|
||||||
[raw_pos..raw_pos + subpool_cfg.block_size];
|
[raw_pos..raw_pos + subpool_cfg.block_size as usize];
|
||||||
let size_list = self.sizes_lists.get_mut(addr.pool_idx as usize).unwrap();
|
let size_list = self.sizes_lists.get_mut(addr.pool_idx as usize).unwrap();
|
||||||
size_list[addr.packet_idx as usize] = STORE_FREE;
|
size_list[addr.packet_idx as usize] = STORE_FREE;
|
||||||
block.fill(0);
|
block.fill(0);
|
||||||
@@ -742,11 +742,11 @@ pub mod heapless_mod {
|
|||||||
impl<const MAX_NUM_SUBPOOLS: usize> PoolProviderWithGuards
|
impl<const MAX_NUM_SUBPOOLS: usize> PoolProviderWithGuards
|
||||||
for StaticHeaplessMemoryPool<MAX_NUM_SUBPOOLS>
|
for StaticHeaplessMemoryPool<MAX_NUM_SUBPOOLS>
|
||||||
{
|
{
|
||||||
fn modify_with_guard(&mut self, addr: PoolAddr) -> PoolRwGuard<'_, Self> {
|
fn modify_with_guard(&mut self, addr: PoolAddr) -> PoolRwGuard<Self> {
|
||||||
PoolRwGuard::new(self, addr)
|
PoolRwGuard::new(self, addr)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn read_with_guard(&mut self, addr: PoolAddr) -> PoolGuard<'_, Self> {
|
fn read_with_guard(&mut self, addr: PoolAddr) -> PoolGuard<Self> {
|
||||||
PoolGuard::new(self, addr)
|
PoolGuard::new(self, addr)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1058,11 +1058,11 @@ mod alloc_mod {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl PoolProviderWithGuards for StaticMemoryPool {
|
impl PoolProviderWithGuards for StaticMemoryPool {
|
||||||
fn modify_with_guard(&mut self, addr: PoolAddr) -> PoolRwGuard<'_, Self> {
|
fn modify_with_guard(&mut self, addr: PoolAddr) -> PoolRwGuard<Self> {
|
||||||
PoolRwGuard::new(self, addr)
|
PoolRwGuard::new(self, addr)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn read_with_guard(&mut self, addr: PoolAddr) -> PoolGuard<'_, Self> {
|
fn read_with_guard(&mut self, addr: PoolAddr) -> PoolGuard<Self> {
|
||||||
PoolGuard::new(self, addr)
|
PoolGuard::new(self, addr)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1307,11 +1307,9 @@ mod tests {
|
|||||||
let addr = pool_provider.add(&test_buf).expect("Adding data failed");
|
let addr = pool_provider.add(&test_buf).expect("Adding data failed");
|
||||||
let read_guard = PoolGuard::new(pool_provider, addr);
|
let read_guard = PoolGuard::new(pool_provider, addr);
|
||||||
drop(read_guard);
|
drop(read_guard);
|
||||||
assert!(
|
assert!(!pool_provider
|
||||||
!pool_provider
|
|
||||||
.has_element_at(&addr)
|
.has_element_at(&addr)
|
||||||
.expect("Invalid address")
|
.expect("Invalid address"));
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn generic_test_pool_guard_deletion(pool_provider: &mut impl PoolProviderWithGuards) {
|
fn generic_test_pool_guard_deletion(pool_provider: &mut impl PoolProviderWithGuards) {
|
||||||
@@ -1319,11 +1317,9 @@ mod tests {
|
|||||||
let addr = pool_provider.add(&test_buf).expect("Adding data failed");
|
let addr = pool_provider.add(&test_buf).expect("Adding data failed");
|
||||||
let read_guard = pool_provider.read_with_guard(addr);
|
let read_guard = pool_provider.read_with_guard(addr);
|
||||||
drop(read_guard);
|
drop(read_guard);
|
||||||
assert!(
|
assert!(!pool_provider
|
||||||
!pool_provider
|
|
||||||
.has_element_at(&addr)
|
.has_element_at(&addr)
|
||||||
.expect("Invalid address")
|
.expect("Invalid address"));
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn generic_test_pool_guard_with_release(pool_provider: &mut impl PoolProviderWithGuards) {
|
fn generic_test_pool_guard_with_release(pool_provider: &mut impl PoolProviderWithGuards) {
|
||||||
@@ -1332,11 +1328,9 @@ mod tests {
|
|||||||
let mut read_guard = PoolGuard::new(pool_provider, addr);
|
let mut read_guard = PoolGuard::new(pool_provider, addr);
|
||||||
read_guard.release();
|
read_guard.release();
|
||||||
drop(read_guard);
|
drop(read_guard);
|
||||||
assert!(
|
assert!(pool_provider
|
||||||
pool_provider
|
|
||||||
.has_element_at(&addr)
|
.has_element_at(&addr)
|
||||||
.expect("Invalid address")
|
.expect("Invalid address"));
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn generic_test_pool_modify_guard_man_creation(
|
fn generic_test_pool_modify_guard_man_creation(
|
||||||
@@ -1347,11 +1341,9 @@ mod tests {
|
|||||||
let mut rw_guard = PoolRwGuard::new(pool_provider, addr);
|
let mut rw_guard = PoolRwGuard::new(pool_provider, addr);
|
||||||
rw_guard.update(&mut |_| {}).expect("modify failed");
|
rw_guard.update(&mut |_| {}).expect("modify failed");
|
||||||
drop(rw_guard);
|
drop(rw_guard);
|
||||||
assert!(
|
assert!(!pool_provider
|
||||||
!pool_provider
|
|
||||||
.has_element_at(&addr)
|
.has_element_at(&addr)
|
||||||
.expect("Invalid address")
|
.expect("Invalid address"));
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn generic_test_pool_modify_guard(pool_provider: &mut impl PoolProviderWithGuards) {
|
fn generic_test_pool_modify_guard(pool_provider: &mut impl PoolProviderWithGuards) {
|
||||||
@@ -1360,11 +1352,9 @@ mod tests {
|
|||||||
let mut rw_guard = pool_provider.modify_with_guard(addr);
|
let mut rw_guard = pool_provider.modify_with_guard(addr);
|
||||||
rw_guard.update(&mut |_| {}).expect("modify failed");
|
rw_guard.update(&mut |_| {}).expect("modify failed");
|
||||||
drop(rw_guard);
|
drop(rw_guard);
|
||||||
assert!(
|
assert!(!pool_provider
|
||||||
!pool_provider
|
|
||||||
.has_element_at(&addr)
|
.has_element_at(&addr)
|
||||||
.expect("Invalid address")
|
.expect("Invalid address"));
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn generic_modify_pool_index_above_0(pool_provider: &mut impl PoolProvider) {
|
fn generic_modify_pool_index_above_0(pool_provider: &mut impl PoolProvider) {
|
||||||
@@ -1664,36 +1654,30 @@ mod tests {
|
|||||||
fn small_heapless_pool() -> StaticHeaplessMemoryPool<3> {
|
fn small_heapless_pool() -> StaticHeaplessMemoryPool<3> {
|
||||||
let mut heapless_pool: StaticHeaplessMemoryPool<3> =
|
let mut heapless_pool: StaticHeaplessMemoryPool<3> =
|
||||||
StaticHeaplessMemoryPool::new(false);
|
StaticHeaplessMemoryPool::new(false);
|
||||||
assert!(
|
assert!(heapless_pool
|
||||||
heapless_pool
|
|
||||||
.grow(
|
.grow(
|
||||||
SUBPOOL_1.take(),
|
SUBPOOL_1.take(),
|
||||||
unsafe { &mut *SUBPOOL_1_SIZES.lock().unwrap().get() },
|
unsafe { &mut *SUBPOOL_1_SIZES.lock().unwrap().get() },
|
||||||
SUBPOOL_1_NUM_ELEMENTS,
|
SUBPOOL_1_NUM_ELEMENTS,
|
||||||
true
|
true
|
||||||
)
|
)
|
||||||
.is_ok()
|
.is_ok());
|
||||||
);
|
assert!(heapless_pool
|
||||||
assert!(
|
|
||||||
heapless_pool
|
|
||||||
.grow(
|
.grow(
|
||||||
SUBPOOL_2.take(),
|
SUBPOOL_2.take(),
|
||||||
SUBPOOL_2_SIZES.take(),
|
SUBPOOL_2_SIZES.take(),
|
||||||
SUBPOOL_2_NUM_ELEMENTS,
|
SUBPOOL_2_NUM_ELEMENTS,
|
||||||
true
|
true
|
||||||
)
|
)
|
||||||
.is_ok()
|
.is_ok());
|
||||||
);
|
assert!(heapless_pool
|
||||||
assert!(
|
|
||||||
heapless_pool
|
|
||||||
.grow(
|
.grow(
|
||||||
SUBPOOL_3.take(),
|
SUBPOOL_3.take(),
|
||||||
SUBPOOL_3_SIZES.take(),
|
SUBPOOL_3_SIZES.take(),
|
||||||
SUBPOOL_3_NUM_ELEMENTS,
|
SUBPOOL_3_NUM_ELEMENTS,
|
||||||
true
|
true
|
||||||
)
|
)
|
||||||
.is_ok()
|
.is_ok());
|
||||||
);
|
|
||||||
heapless_pool
|
heapless_pool
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1809,26 +1793,22 @@ mod tests {
|
|||||||
fn test_spills_to_higher_subpools() {
|
fn test_spills_to_higher_subpools() {
|
||||||
let mut heapless_pool: StaticHeaplessMemoryPool<2> =
|
let mut heapless_pool: StaticHeaplessMemoryPool<2> =
|
||||||
StaticHeaplessMemoryPool::new(true);
|
StaticHeaplessMemoryPool::new(true);
|
||||||
assert!(
|
assert!(heapless_pool
|
||||||
heapless_pool
|
|
||||||
.grow(
|
.grow(
|
||||||
SUBPOOL_2.take(),
|
SUBPOOL_2.take(),
|
||||||
SUBPOOL_2_SIZES.take(),
|
SUBPOOL_2_SIZES.take(),
|
||||||
SUBPOOL_2_NUM_ELEMENTS,
|
SUBPOOL_2_NUM_ELEMENTS,
|
||||||
true
|
true
|
||||||
)
|
)
|
||||||
.is_ok()
|
.is_ok());
|
||||||
);
|
assert!(heapless_pool
|
||||||
assert!(
|
|
||||||
heapless_pool
|
|
||||||
.grow(
|
.grow(
|
||||||
SUBPOOL_4.take(),
|
SUBPOOL_4.take(),
|
||||||
SUBPOOL_4_SIZES.take(),
|
SUBPOOL_4_SIZES.take(),
|
||||||
SUBPOOL_4_NUM_ELEMENTS,
|
SUBPOOL_4_NUM_ELEMENTS,
|
||||||
true
|
true
|
||||||
)
|
)
|
||||||
.is_ok()
|
.is_ok());
|
||||||
);
|
|
||||||
generic_test_spills_to_higher_subpools(&mut heapless_pool);
|
generic_test_spills_to_higher_subpools(&mut heapless_pool);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1836,26 +1816,22 @@ mod tests {
|
|||||||
fn test_spillage_fails_as_well() {
|
fn test_spillage_fails_as_well() {
|
||||||
let mut heapless_pool: StaticHeaplessMemoryPool<2> =
|
let mut heapless_pool: StaticHeaplessMemoryPool<2> =
|
||||||
StaticHeaplessMemoryPool::new(true);
|
StaticHeaplessMemoryPool::new(true);
|
||||||
assert!(
|
assert!(heapless_pool
|
||||||
heapless_pool
|
|
||||||
.grow(
|
.grow(
|
||||||
SUBPOOL_5.take(),
|
SUBPOOL_5.take(),
|
||||||
SUBPOOL_5_SIZES.take(),
|
SUBPOOL_5_SIZES.take(),
|
||||||
SUBPOOL_5_NUM_ELEMENTS,
|
SUBPOOL_5_NUM_ELEMENTS,
|
||||||
true
|
true
|
||||||
)
|
)
|
||||||
.is_ok()
|
.is_ok());
|
||||||
);
|
assert!(heapless_pool
|
||||||
assert!(
|
|
||||||
heapless_pool
|
|
||||||
.grow(
|
.grow(
|
||||||
SUBPOOL_3.take(),
|
SUBPOOL_3.take(),
|
||||||
SUBPOOL_3_SIZES.take(),
|
SUBPOOL_3_SIZES.take(),
|
||||||
SUBPOOL_3_NUM_ELEMENTS,
|
SUBPOOL_3_NUM_ELEMENTS,
|
||||||
true
|
true
|
||||||
)
|
)
|
||||||
.is_ok()
|
.is_ok());
|
||||||
);
|
|
||||||
generic_test_spillage_fails_as_well(&mut heapless_pool);
|
generic_test_spillage_fails_as_well(&mut heapless_pool);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1863,36 +1839,30 @@ mod tests {
|
|||||||
fn test_spillage_works_across_multiple_subpools() {
|
fn test_spillage_works_across_multiple_subpools() {
|
||||||
let mut heapless_pool: StaticHeaplessMemoryPool<3> =
|
let mut heapless_pool: StaticHeaplessMemoryPool<3> =
|
||||||
StaticHeaplessMemoryPool::new(true);
|
StaticHeaplessMemoryPool::new(true);
|
||||||
assert!(
|
assert!(heapless_pool
|
||||||
heapless_pool
|
|
||||||
.grow(
|
.grow(
|
||||||
SUBPOOL_5.take(),
|
SUBPOOL_5.take(),
|
||||||
SUBPOOL_5_SIZES.take(),
|
SUBPOOL_5_SIZES.take(),
|
||||||
SUBPOOL_5_NUM_ELEMENTS,
|
SUBPOOL_5_NUM_ELEMENTS,
|
||||||
true
|
true
|
||||||
)
|
)
|
||||||
.is_ok()
|
.is_ok());
|
||||||
);
|
assert!(heapless_pool
|
||||||
assert!(
|
|
||||||
heapless_pool
|
|
||||||
.grow(
|
.grow(
|
||||||
SUBPOOL_6.take(),
|
SUBPOOL_6.take(),
|
||||||
SUBPOOL_6_SIZES.take(),
|
SUBPOOL_6_SIZES.take(),
|
||||||
SUBPOOL_6_NUM_ELEMENTS,
|
SUBPOOL_6_NUM_ELEMENTS,
|
||||||
true
|
true
|
||||||
)
|
)
|
||||||
.is_ok()
|
.is_ok());
|
||||||
);
|
assert!(heapless_pool
|
||||||
assert!(
|
|
||||||
heapless_pool
|
|
||||||
.grow(
|
.grow(
|
||||||
SUBPOOL_3.take(),
|
SUBPOOL_3.take(),
|
||||||
SUBPOOL_3_SIZES.take(),
|
SUBPOOL_3_SIZES.take(),
|
||||||
SUBPOOL_3_NUM_ELEMENTS,
|
SUBPOOL_3_NUM_ELEMENTS,
|
||||||
true
|
true
|
||||||
)
|
)
|
||||||
.is_ok()
|
.is_ok());
|
||||||
);
|
|
||||||
generic_test_spillage_works_across_multiple_subpools(&mut heapless_pool);
|
generic_test_spillage_works_across_multiple_subpools(&mut heapless_pool);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1900,36 +1870,30 @@ mod tests {
|
|||||||
fn test_spillage_fails_across_multiple_subpools() {
|
fn test_spillage_fails_across_multiple_subpools() {
|
||||||
let mut heapless_pool: StaticHeaplessMemoryPool<3> =
|
let mut heapless_pool: StaticHeaplessMemoryPool<3> =
|
||||||
StaticHeaplessMemoryPool::new(true);
|
StaticHeaplessMemoryPool::new(true);
|
||||||
assert!(
|
assert!(heapless_pool
|
||||||
heapless_pool
|
|
||||||
.grow(
|
.grow(
|
||||||
SUBPOOL_5.take(),
|
SUBPOOL_5.take(),
|
||||||
SUBPOOL_5_SIZES.take(),
|
SUBPOOL_5_SIZES.take(),
|
||||||
SUBPOOL_5_NUM_ELEMENTS,
|
SUBPOOL_5_NUM_ELEMENTS,
|
||||||
true
|
true
|
||||||
)
|
)
|
||||||
.is_ok()
|
.is_ok());
|
||||||
);
|
assert!(heapless_pool
|
||||||
assert!(
|
|
||||||
heapless_pool
|
|
||||||
.grow(
|
.grow(
|
||||||
SUBPOOL_6.take(),
|
SUBPOOL_6.take(),
|
||||||
SUBPOOL_6_SIZES.take(),
|
SUBPOOL_6_SIZES.take(),
|
||||||
SUBPOOL_6_NUM_ELEMENTS,
|
SUBPOOL_6_NUM_ELEMENTS,
|
||||||
true
|
true
|
||||||
)
|
)
|
||||||
.is_ok()
|
.is_ok());
|
||||||
);
|
assert!(heapless_pool
|
||||||
assert!(
|
|
||||||
heapless_pool
|
|
||||||
.grow(
|
.grow(
|
||||||
SUBPOOL_3.take(),
|
SUBPOOL_3.take(),
|
||||||
SUBPOOL_3_SIZES.take(),
|
SUBPOOL_3_SIZES.take(),
|
||||||
SUBPOOL_3_NUM_ELEMENTS,
|
SUBPOOL_3_NUM_ELEMENTS,
|
||||||
true
|
true
|
||||||
)
|
)
|
||||||
.is_ok()
|
.is_ok());
|
||||||
);
|
|
||||||
generic_test_spillage_fails_across_multiple_subpools(&mut heapless_pool);
|
generic_test_spillage_fails_across_multiple_subpools(&mut heapless_pool);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -190,7 +190,7 @@ mod tests {
|
|||||||
|
|
||||||
use std::sync::mpsc::{self, TryRecvError};
|
use std::sync::mpsc::{self, TryRecvError};
|
||||||
|
|
||||||
use crate::{ComponentId, queue::GenericSendError, request::GenericMessage};
|
use crate::{queue::GenericSendError, request::GenericMessage, ComponentId};
|
||||||
|
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
|
|||||||
@@ -65,13 +65,13 @@ impl GenericActionReplyPus {
|
|||||||
#[cfg(feature = "alloc")]
|
#[cfg(feature = "alloc")]
|
||||||
pub mod alloc_mod {
|
pub mod alloc_mod {
|
||||||
use crate::{
|
use crate::{
|
||||||
ComponentId,
|
|
||||||
action::ActionRequest,
|
action::ActionRequest,
|
||||||
queue::{GenericReceiveError, GenericSendError},
|
queue::{GenericReceiveError, GenericSendError},
|
||||||
request::{
|
request::{
|
||||||
GenericMessage, MessageReceiverProvider, MessageSenderAndReceiver,
|
GenericMessage, MessageReceiverProvider, MessageSenderAndReceiver,
|
||||||
MessageSenderProvider, MessageSenderStoreProvider, RequestId,
|
MessageSenderProvider, MessageSenderStoreProvider, RequestId,
|
||||||
},
|
},
|
||||||
|
ComponentId,
|
||||||
};
|
};
|
||||||
|
|
||||||
use super::ActionReplyPus;
|
use super::ActionReplyPus;
|
||||||
@@ -141,12 +141,12 @@ pub mod std_mod {
|
|||||||
use std::sync::mpsc;
|
use std::sync::mpsc;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
ComponentId,
|
|
||||||
pus::{
|
pus::{
|
||||||
ActivePusRequestStd, ActiveRequestProvider, DefaultActiveRequestMap,
|
|
||||||
verification::{self, TcStateToken},
|
verification::{self, TcStateToken},
|
||||||
|
ActivePusRequestStd, ActiveRequestProvider, DefaultActiveRequestMap,
|
||||||
},
|
},
|
||||||
request::{MessageSenderMap, OneMessageSender},
|
request::{MessageSenderMap, OneMessageSender},
|
||||||
|
ComponentId,
|
||||||
};
|
};
|
||||||
|
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
use crate::pus::source_buffer_large_enough;
|
use crate::pus::source_buffer_large_enough;
|
||||||
use spacepackets::ByteConversionError;
|
|
||||||
use spacepackets::ecss::EcssEnumeration;
|
|
||||||
use spacepackets::ecss::tm::PusTmCreator;
|
use spacepackets::ecss::tm::PusTmCreator;
|
||||||
use spacepackets::ecss::tm::PusTmSecondaryHeader;
|
use spacepackets::ecss::tm::PusTmSecondaryHeader;
|
||||||
use spacepackets::{MAX_APID, SpHeader};
|
use spacepackets::ecss::EcssEnumeration;
|
||||||
|
use spacepackets::ByteConversionError;
|
||||||
|
use spacepackets::{SpHeader, MAX_APID};
|
||||||
|
|
||||||
#[cfg(feature = "alloc")]
|
#[cfg(feature = "alloc")]
|
||||||
pub use alloc_mod::*;
|
pub use alloc_mod::*;
|
||||||
@@ -132,8 +132,8 @@ impl EventReportCreator {
|
|||||||
#[cfg(feature = "alloc")]
|
#[cfg(feature = "alloc")]
|
||||||
mod alloc_mod {
|
mod alloc_mod {
|
||||||
use super::*;
|
use super::*;
|
||||||
use crate::ComponentId;
|
|
||||||
use crate::pus::{EcssTmSender, EcssTmtcError};
|
use crate::pus::{EcssTmSender, EcssTmtcError};
|
||||||
|
use crate::ComponentId;
|
||||||
use alloc::vec;
|
use alloc::vec;
|
||||||
use alloc::vec::Vec;
|
use alloc::vec::Vec;
|
||||||
use core::cell::RefCell;
|
use core::cell::RefCell;
|
||||||
@@ -265,13 +265,13 @@ mod alloc_mod {
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
use crate::ComponentId;
|
|
||||||
use crate::events::{EventU32, Severity};
|
use crate::events::{EventU32, Severity};
|
||||||
use crate::pus::test_util::TEST_COMPONENT_ID_0;
|
use crate::pus::test_util::TEST_COMPONENT_ID_0;
|
||||||
use crate::pus::tests::CommonTmInfo;
|
use crate::pus::tests::CommonTmInfo;
|
||||||
use crate::pus::{ChannelWithId, EcssTmSender, EcssTmtcError, PusTmVariant};
|
use crate::pus::{ChannelWithId, EcssTmSender, EcssTmtcError, PusTmVariant};
|
||||||
use spacepackets::ByteConversionError;
|
use crate::ComponentId;
|
||||||
use spacepackets::ecss::PusError;
|
use spacepackets::ecss::PusError;
|
||||||
|
use spacepackets::ByteConversionError;
|
||||||
use std::cell::RefCell;
|
use std::cell::RefCell;
|
||||||
use std::collections::VecDeque;
|
use std::collections::VecDeque;
|
||||||
use std::vec::Vec;
|
use std::vec::Vec;
|
||||||
|
|||||||
@@ -6,13 +6,13 @@ use core::hash::Hash;
|
|||||||
#[cfg(feature = "alloc")]
|
#[cfg(feature = "alloc")]
|
||||||
use hashbrown::HashSet;
|
use hashbrown::HashSet;
|
||||||
|
|
||||||
#[cfg(feature = "alloc")]
|
|
||||||
use crate::pus::EcssTmSender;
|
|
||||||
use crate::pus::EcssTmtcError;
|
|
||||||
#[cfg(feature = "alloc")]
|
#[cfg(feature = "alloc")]
|
||||||
pub use crate::pus::event::EventReporter;
|
pub use crate::pus::event::EventReporter;
|
||||||
use crate::pus::verification::TcStateToken;
|
use crate::pus::verification::TcStateToken;
|
||||||
#[cfg(feature = "alloc")]
|
#[cfg(feature = "alloc")]
|
||||||
|
use crate::pus::EcssTmSender;
|
||||||
|
use crate::pus::EcssTmtcError;
|
||||||
|
#[cfg(feature = "alloc")]
|
||||||
pub use alloc_mod::*;
|
pub use alloc_mod::*;
|
||||||
#[cfg(feature = "heapless")]
|
#[cfg(feature = "heapless")]
|
||||||
pub use heapless_mod::*;
|
pub use heapless_mod::*;
|
||||||
@@ -311,9 +311,9 @@ pub mod alloc_mod {
|
|||||||
mod tests {
|
mod tests {
|
||||||
use alloc::string::{String, ToString};
|
use alloc::string::{String, ToString};
|
||||||
use alloc::vec;
|
use alloc::vec;
|
||||||
use spacepackets::ecss::PusPacket;
|
|
||||||
use spacepackets::ecss::event::Subservice;
|
use spacepackets::ecss::event::Subservice;
|
||||||
use spacepackets::ecss::tm::PusTmReader;
|
use spacepackets::ecss::tm::PusTmReader;
|
||||||
|
use spacepackets::ecss::PusPacket;
|
||||||
|
|
||||||
use super::*;
|
use super::*;
|
||||||
use crate::request::UniqueApidTargetId;
|
use crate::request::UniqueApidTargetId;
|
||||||
|
|||||||
@@ -3,8 +3,8 @@ use crate::pus::event_man::{EventRequest, EventRequestWithToken};
|
|||||||
use crate::pus::verification::TcStateToken;
|
use crate::pus::verification::TcStateToken;
|
||||||
use crate::pus::{DirectPusPacketHandlerResult, PartialPusHandlingError, PusPacketHandlingError};
|
use crate::pus::{DirectPusPacketHandlerResult, PartialPusHandlingError, PusPacketHandlingError};
|
||||||
use crate::queue::GenericSendError;
|
use crate::queue::GenericSendError;
|
||||||
use spacepackets::ecss::PusPacket;
|
|
||||||
use spacepackets::ecss::event::Subservice;
|
use spacepackets::ecss::event::Subservice;
|
||||||
|
use spacepackets::ecss::PusPacket;
|
||||||
use std::sync::mpsc::Sender;
|
use std::sync::mpsc::Sender;
|
||||||
|
|
||||||
use super::verification::VerificationReportingProvider;
|
use super::verification::VerificationReportingProvider;
|
||||||
@@ -29,7 +29,7 @@ impl<
|
|||||||
TmSender: EcssTmSender,
|
TmSender: EcssTmSender,
|
||||||
TcInMemConverter: EcssTcInMemConversionProvider,
|
TcInMemConverter: EcssTcInMemConversionProvider,
|
||||||
VerificationReporter: VerificationReportingProvider,
|
VerificationReporter: VerificationReportingProvider,
|
||||||
> PusEventServiceHandler<TcReceiver, TmSender, TcInMemConverter, VerificationReporter>
|
> PusEventServiceHandler<TcReceiver, TmSender, TcInMemConverter, VerificationReporter>
|
||||||
{
|
{
|
||||||
pub fn new(
|
pub fn new(
|
||||||
service_helper: PusServiceHelper<
|
service_helper: PusServiceHelper<
|
||||||
@@ -122,7 +122,7 @@ impl<
|
|||||||
| Subservice::TmHighSeverityReport => {
|
| Subservice::TmHighSeverityReport => {
|
||||||
return Err(PusPacketHandlingError::RequestConversion(
|
return Err(PusPacketHandlingError::RequestConversion(
|
||||||
GenericConversionError::WrongService(tc.subservice()),
|
GenericConversionError::WrongService(tc.subservice()),
|
||||||
));
|
))
|
||||||
}
|
}
|
||||||
Subservice::TcEnableEventGeneration => {
|
Subservice::TcEnableEventGeneration => {
|
||||||
handle_enable_disable_request(true)?;
|
handle_enable_disable_request(true)?;
|
||||||
@@ -146,14 +146,14 @@ impl<
|
|||||||
mod tests {
|
mod tests {
|
||||||
use delegate::delegate;
|
use delegate::delegate;
|
||||||
use spacepackets::ecss::event::Subservice;
|
use spacepackets::ecss::event::Subservice;
|
||||||
use spacepackets::time::{TimeWriter, cds};
|
use spacepackets::time::{cds, TimeWriter};
|
||||||
use spacepackets::util::UnsignedEnum;
|
use spacepackets::util::UnsignedEnum;
|
||||||
use spacepackets::{
|
use spacepackets::{
|
||||||
SpHeader,
|
|
||||||
ecss::{
|
ecss::{
|
||||||
tc::{PusTcCreator, PusTcSecondaryHeader},
|
tc::{PusTcCreator, PusTcSecondaryHeader},
|
||||||
tm::PusTmReader,
|
tm::PusTmReader,
|
||||||
},
|
},
|
||||||
|
SpHeader,
|
||||||
};
|
};
|
||||||
use std::sync::mpsc::{self, Sender};
|
use std::sync::mpsc::{self, Sender};
|
||||||
|
|
||||||
@@ -167,10 +167,10 @@ mod tests {
|
|||||||
use crate::{
|
use crate::{
|
||||||
events::EventU32,
|
events::EventU32,
|
||||||
pus::{
|
pus::{
|
||||||
DirectPusPacketHandlerResult, EcssTcInSharedPoolConverter, PusPacketHandlingError,
|
|
||||||
event_man::EventRequestWithToken,
|
event_man::EventRequestWithToken,
|
||||||
tests::PusServiceHandlerWithSharedStoreCommon,
|
tests::PusServiceHandlerWithSharedStoreCommon,
|
||||||
verification::{TcStateAccepted, VerificationToken},
|
verification::{TcStateAccepted, VerificationToken},
|
||||||
|
DirectPusPacketHandlerResult, EcssTcInSharedPoolConverter, PusPacketHandlingError,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
//!
|
//!
|
||||||
//! This module contains structures to make working with the PUS C standard easier.
|
//! This module contains structures to make working with the PUS C standard easier.
|
||||||
//! The satrs-example application contains various usage examples of these components.
|
//! The satrs-example application contains various usage examples of these components.
|
||||||
use crate::ComponentId;
|
|
||||||
use crate::pool::{PoolAddr, PoolError};
|
use crate::pool::{PoolAddr, PoolError};
|
||||||
use crate::pus::verification::{TcStateAccepted, TcStateToken, VerificationToken};
|
use crate::pus::verification::{TcStateAccepted, TcStateToken, VerificationToken};
|
||||||
use crate::queue::{GenericReceiveError, GenericSendError};
|
use crate::queue::{GenericReceiveError, GenericSendError};
|
||||||
@@ -10,18 +9,19 @@ use crate::request::{GenericMessage, MessageMetadata, RequestId};
|
|||||||
#[cfg(feature = "alloc")]
|
#[cfg(feature = "alloc")]
|
||||||
use crate::tmtc::PacketAsVec;
|
use crate::tmtc::PacketAsVec;
|
||||||
use crate::tmtc::PacketInPool;
|
use crate::tmtc::PacketInPool;
|
||||||
|
use crate::ComponentId;
|
||||||
use core::fmt::{Display, Formatter};
|
use core::fmt::{Display, Formatter};
|
||||||
use core::time::Duration;
|
use core::time::Duration;
|
||||||
#[cfg(feature = "alloc")]
|
#[cfg(feature = "alloc")]
|
||||||
use downcast_rs::{Downcast, impl_downcast};
|
use downcast_rs::{impl_downcast, Downcast};
|
||||||
#[cfg(feature = "alloc")]
|
#[cfg(feature = "alloc")]
|
||||||
use dyn_clone::DynClone;
|
use dyn_clone::DynClone;
|
||||||
#[cfg(feature = "std")]
|
#[cfg(feature = "std")]
|
||||||
use std::error::Error;
|
use std::error::Error;
|
||||||
|
|
||||||
use spacepackets::ecss::PusError;
|
|
||||||
use spacepackets::ecss::tc::{PusTcCreator, PusTcReader};
|
use spacepackets::ecss::tc::{PusTcCreator, PusTcReader};
|
||||||
use spacepackets::ecss::tm::PusTmCreator;
|
use spacepackets::ecss::tm::PusTmCreator;
|
||||||
|
use spacepackets::ecss::PusError;
|
||||||
use spacepackets::{ByteConversionError, SpHeader};
|
use spacepackets::{ByteConversionError, SpHeader};
|
||||||
|
|
||||||
pub mod action;
|
pub mod action;
|
||||||
@@ -659,18 +659,18 @@ pub mod alloc_mod {
|
|||||||
#[cfg(feature = "std")]
|
#[cfg(feature = "std")]
|
||||||
pub mod std_mod {
|
pub mod std_mod {
|
||||||
use super::*;
|
use super::*;
|
||||||
use crate::ComponentId;
|
|
||||||
use crate::pool::{
|
use crate::pool::{
|
||||||
PoolAddr, PoolError, PoolProvider, PoolProviderWithGuards, SharedStaticMemoryPool,
|
PoolAddr, PoolError, PoolProvider, PoolProviderWithGuards, SharedStaticMemoryPool,
|
||||||
};
|
};
|
||||||
use crate::pus::verification::{TcStateAccepted, VerificationToken};
|
use crate::pus::verification::{TcStateAccepted, VerificationToken};
|
||||||
use crate::tmtc::{PacketAsVec, PacketSenderWithSharedPool};
|
use crate::tmtc::{PacketAsVec, PacketSenderWithSharedPool};
|
||||||
|
use crate::ComponentId;
|
||||||
use alloc::vec::Vec;
|
use alloc::vec::Vec;
|
||||||
use core::time::Duration;
|
use core::time::Duration;
|
||||||
use spacepackets::ByteConversionError;
|
|
||||||
use spacepackets::ecss::WritablePusPacket;
|
|
||||||
use spacepackets::ecss::tc::PusTcReader;
|
use spacepackets::ecss::tc::PusTcReader;
|
||||||
|
use spacepackets::ecss::WritablePusPacket;
|
||||||
use spacepackets::time::StdTimestampError;
|
use spacepackets::time::StdTimestampError;
|
||||||
|
use spacepackets::ByteConversionError;
|
||||||
use std::string::String;
|
use std::string::String;
|
||||||
use std::sync::mpsc;
|
use std::sync::mpsc;
|
||||||
use std::sync::mpsc::TryRecvError;
|
use std::sync::mpsc::TryRecvError;
|
||||||
@@ -1261,8 +1261,8 @@ pub mod test_util {
|
|||||||
use crate::request::UniqueApidTargetId;
|
use crate::request::UniqueApidTargetId;
|
||||||
|
|
||||||
use super::{
|
use super::{
|
||||||
DirectPusPacketHandlerResult, PusPacketHandlingError,
|
|
||||||
verification::{self, TcStateAccepted, VerificationToken},
|
verification::{self, TcStateAccepted, VerificationToken},
|
||||||
|
DirectPusPacketHandlerResult, PusPacketHandlingError,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub const TEST_APID: u16 = 0x101;
|
pub const TEST_APID: u16 = 0x101;
|
||||||
@@ -1296,21 +1296,21 @@ pub mod test_util {
|
|||||||
pub mod tests {
|
pub mod tests {
|
||||||
use core::cell::RefCell;
|
use core::cell::RefCell;
|
||||||
use std::sync::mpsc::TryRecvError;
|
use std::sync::mpsc::TryRecvError;
|
||||||
use std::sync::{RwLock, mpsc};
|
use std::sync::{mpsc, RwLock};
|
||||||
|
|
||||||
use alloc::collections::VecDeque;
|
use alloc::collections::VecDeque;
|
||||||
use alloc::vec::Vec;
|
use alloc::vec::Vec;
|
||||||
use satrs_shared::res_code::ResultU16;
|
use satrs_shared::res_code::ResultU16;
|
||||||
use spacepackets::CcsdsPacket;
|
|
||||||
use spacepackets::ecss::tc::{PusTcCreator, PusTcReader};
|
use spacepackets::ecss::tc::{PusTcCreator, PusTcReader};
|
||||||
use spacepackets::ecss::tm::{GenericPusTmSecondaryHeader, PusTmCreator, PusTmReader};
|
use spacepackets::ecss::tm::{GenericPusTmSecondaryHeader, PusTmCreator, PusTmReader};
|
||||||
use spacepackets::ecss::{PusPacket, WritablePusPacket};
|
use spacepackets::ecss::{PusPacket, WritablePusPacket};
|
||||||
|
use spacepackets::CcsdsPacket;
|
||||||
use test_util::{TEST_APID, TEST_COMPONENT_ID_0};
|
use test_util::{TEST_APID, TEST_COMPONENT_ID_0};
|
||||||
|
|
||||||
use crate::ComponentId;
|
|
||||||
use crate::pool::{PoolProvider, SharedStaticMemoryPool, StaticMemoryPool, StaticPoolConfig};
|
use crate::pool::{PoolProvider, SharedStaticMemoryPool, StaticMemoryPool, StaticPoolConfig};
|
||||||
use crate::pus::verification::{RequestId, VerificationReporter};
|
use crate::pus::verification::{RequestId, VerificationReporter};
|
||||||
use crate::tmtc::{PacketAsVec, PacketInPool, PacketSenderWithSharedPool, SharedPacketPool};
|
use crate::tmtc::{PacketAsVec, PacketInPool, PacketSenderWithSharedPool, SharedPacketPool};
|
||||||
|
use crate::ComponentId;
|
||||||
|
|
||||||
use super::verification::test_util::TestVerificationReporter;
|
use super::verification::test_util::TestVerificationReporter;
|
||||||
use super::verification::{
|
use super::verification::{
|
||||||
|
|||||||
@@ -340,8 +340,8 @@ pub fn generate_insert_telecommand_app_data(
|
|||||||
pub mod alloc_mod {
|
pub mod alloc_mod {
|
||||||
use alloc::{
|
use alloc::{
|
||||||
collections::{
|
collections::{
|
||||||
BTreeMap,
|
|
||||||
btree_map::{Entry, Range},
|
btree_map::{Entry, Range},
|
||||||
|
BTreeMap,
|
||||||
},
|
},
|
||||||
vec::Vec,
|
vec::Vec,
|
||||||
};
|
};
|
||||||
@@ -855,9 +855,9 @@ mod tests {
|
|||||||
PoolAddr, PoolError, PoolProvider, StaticMemoryPool, StaticPoolAddr, StaticPoolConfig,
|
PoolAddr, PoolError, PoolProvider, StaticMemoryPool, StaticPoolAddr, StaticPoolConfig,
|
||||||
};
|
};
|
||||||
use alloc::collections::btree_map::Range;
|
use alloc::collections::btree_map::Range;
|
||||||
use spacepackets::ecss::WritablePusPacket;
|
|
||||||
use spacepackets::ecss::tc::{PusTcCreator, PusTcReader, PusTcSecondaryHeader};
|
use spacepackets::ecss::tc::{PusTcCreator, PusTcReader, PusTcSecondaryHeader};
|
||||||
use spacepackets::time::{TimeWriter, UnixTime, cds};
|
use spacepackets::ecss::WritablePusPacket;
|
||||||
|
use spacepackets::time::{cds, TimeWriter, UnixTime};
|
||||||
use spacepackets::{PacketId, PacketSequenceCtrl, PacketType, SequenceFlags, SpHeader};
|
use spacepackets::{PacketId, PacketSequenceCtrl, PacketType, SequenceFlags, SpHeader};
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
use std::vec::Vec;
|
use std::vec::Vec;
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ use crate::pool::PoolProvider;
|
|||||||
use crate::pus::PusPacketHandlingError;
|
use crate::pus::PusPacketHandlingError;
|
||||||
use crate::tmtc::{PacketAsVec, PacketSenderWithSharedPool};
|
use crate::tmtc::{PacketAsVec, PacketSenderWithSharedPool};
|
||||||
use alloc::string::ToString;
|
use alloc::string::ToString;
|
||||||
use spacepackets::ecss::{PusPacket, scheduling};
|
use spacepackets::ecss::{scheduling, PusPacket};
|
||||||
use spacepackets::time::cds::CdsTime;
|
use spacepackets::time::cds::CdsTime;
|
||||||
use std::sync::mpsc;
|
use std::sync::mpsc;
|
||||||
|
|
||||||
@@ -39,7 +39,8 @@ impl<
|
|||||||
TcInMemConverter: EcssTcInMemConversionProvider,
|
TcInMemConverter: EcssTcInMemConversionProvider,
|
||||||
VerificationReporter: VerificationReportingProvider,
|
VerificationReporter: VerificationReportingProvider,
|
||||||
Scheduler: PusSchedulerProvider,
|
Scheduler: PusSchedulerProvider,
|
||||||
> PusSchedServiceHandler<TcReceiver, TmSender, TcInMemConverter, VerificationReporter, Scheduler>
|
>
|
||||||
|
PusSchedServiceHandler<TcReceiver, TmSender, TcInMemConverter, VerificationReporter, Scheduler>
|
||||||
{
|
{
|
||||||
pub fn new(
|
pub fn new(
|
||||||
service_helper: PusServiceHelper<
|
service_helper: PusServiceHelper<
|
||||||
@@ -101,12 +102,11 @@ impl<
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
self.scheduler.enable();
|
self.scheduler.enable();
|
||||||
if self.scheduler.is_enabled()
|
|
||||||
&& let Some(started_token) = opt_started_token
|
if self.scheduler.is_enabled() && opt_started_token.is_some() {
|
||||||
{
|
|
||||||
if let Err(e) = self.service_helper.verif_reporter().completion_success(
|
if let Err(e) = self.service_helper.verif_reporter().completion_success(
|
||||||
&self.service_helper.common.tm_sender,
|
&self.service_helper.common.tm_sender,
|
||||||
started_token,
|
opt_started_token.unwrap(),
|
||||||
time_stamp,
|
time_stamp,
|
||||||
) {
|
) {
|
||||||
error_callback(&PartialPusHandlingError::Verification(e));
|
error_callback(&PartialPusHandlingError::Verification(e));
|
||||||
@@ -131,12 +131,10 @@ impl<
|
|||||||
};
|
};
|
||||||
|
|
||||||
self.scheduler.disable();
|
self.scheduler.disable();
|
||||||
if !self.scheduler.is_enabled()
|
if !self.scheduler.is_enabled() && opt_started_token.is_some() {
|
||||||
&& let Some(started_token) = opt_started_token
|
|
||||||
{
|
|
||||||
if let Err(e) = self.service_helper.verif_reporter().completion_success(
|
if let Err(e) = self.service_helper.verif_reporter().completion_success(
|
||||||
&self.service_helper.common.tm_sender,
|
&self.service_helper.common.tm_sender,
|
||||||
started_token,
|
opt_started_token.unwrap(),
|
||||||
time_stamp,
|
time_stamp,
|
||||||
) {
|
) {
|
||||||
error_callback(&PartialPusHandlingError::Verification(e));
|
error_callback(&PartialPusHandlingError::Verification(e));
|
||||||
@@ -251,21 +249,21 @@ mod tests {
|
|||||||
use crate::pus::test_util::{PusTestHarness, TEST_APID};
|
use crate::pus::test_util::{PusTestHarness, TEST_APID};
|
||||||
use crate::pus::verification::{VerificationReporter, VerificationReportingProvider};
|
use crate::pus::verification::{VerificationReporter, VerificationReportingProvider};
|
||||||
|
|
||||||
use crate::pus::{DirectPusPacketHandlerResult, MpscTcReceiver, PusPacketHandlingError};
|
|
||||||
use crate::pus::{
|
use crate::pus::{
|
||||||
EcssTcInSharedPoolConverter,
|
|
||||||
scheduler::{self, PusSchedulerProvider, TcInfo},
|
scheduler::{self, PusSchedulerProvider, TcInfo},
|
||||||
tests::PusServiceHandlerWithSharedStoreCommon,
|
tests::PusServiceHandlerWithSharedStoreCommon,
|
||||||
verification::{RequestId, TcStateAccepted, VerificationToken},
|
verification::{RequestId, TcStateAccepted, VerificationToken},
|
||||||
|
EcssTcInSharedPoolConverter,
|
||||||
};
|
};
|
||||||
|
use crate::pus::{DirectPusPacketHandlerResult, MpscTcReceiver, PusPacketHandlingError};
|
||||||
use crate::tmtc::PacketSenderWithSharedPool;
|
use crate::tmtc::PacketSenderWithSharedPool;
|
||||||
use alloc::collections::VecDeque;
|
use alloc::collections::VecDeque;
|
||||||
use delegate::delegate;
|
use delegate::delegate;
|
||||||
use spacepackets::SpHeader;
|
|
||||||
use spacepackets::ecss::WritablePusPacket;
|
|
||||||
use spacepackets::ecss::scheduling::Subservice;
|
use spacepackets::ecss::scheduling::Subservice;
|
||||||
use spacepackets::ecss::tc::PusTcSecondaryHeader;
|
use spacepackets::ecss::tc::PusTcSecondaryHeader;
|
||||||
|
use spacepackets::ecss::WritablePusPacket;
|
||||||
use spacepackets::time::TimeWriter;
|
use spacepackets::time::TimeWriter;
|
||||||
|
use spacepackets::SpHeader;
|
||||||
use spacepackets::{
|
use spacepackets::{
|
||||||
ecss::{tc::PusTcCreator, tm::PusTmReader},
|
ecss::{tc::PusTcCreator, tm::PusTmReader},
|
||||||
time::cds,
|
time::cds,
|
||||||
|
|||||||
@@ -2,9 +2,9 @@ use crate::pus::{
|
|||||||
DirectPusPacketHandlerResult, PartialPusHandlingError, PusPacketHandlingError, PusTmVariant,
|
DirectPusPacketHandlerResult, PartialPusHandlingError, PusPacketHandlingError, PusTmVariant,
|
||||||
};
|
};
|
||||||
use crate::tmtc::{PacketAsVec, PacketSenderWithSharedPool};
|
use crate::tmtc::{PacketAsVec, PacketSenderWithSharedPool};
|
||||||
use spacepackets::SpHeader;
|
|
||||||
use spacepackets::ecss::PusPacket;
|
|
||||||
use spacepackets::ecss::tm::{PusTmCreator, PusTmSecondaryHeader};
|
use spacepackets::ecss::tm::{PusTmCreator, PusTmSecondaryHeader};
|
||||||
|
use spacepackets::ecss::PusPacket;
|
||||||
|
use spacepackets::SpHeader;
|
||||||
use std::sync::mpsc;
|
use std::sync::mpsc;
|
||||||
|
|
||||||
use super::verification::{VerificationReporter, VerificationReportingProvider};
|
use super::verification::{VerificationReporter, VerificationReportingProvider};
|
||||||
@@ -31,7 +31,7 @@ impl<
|
|||||||
TmSender: EcssTmSender,
|
TmSender: EcssTmSender,
|
||||||
TcInMemConverter: EcssTcInMemConversionProvider,
|
TcInMemConverter: EcssTcInMemConversionProvider,
|
||||||
VerificationReporter: VerificationReportingProvider,
|
VerificationReporter: VerificationReportingProvider,
|
||||||
> PusService17TestHandler<TcReceiver, TmSender, TcInMemConverter, VerificationReporter>
|
> PusService17TestHandler<TcReceiver, TmSender, TcInMemConverter, VerificationReporter>
|
||||||
{
|
{
|
||||||
pub fn new(
|
pub fn new(
|
||||||
service_helper: PusServiceHelper<
|
service_helper: PusServiceHelper<
|
||||||
@@ -134,7 +134,6 @@ pub type PusService17TestHandlerStaticWithBoundedMpsc = PusService17TestHandler<
|
|||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use crate::ComponentId;
|
|
||||||
use crate::pus::test_util::{PusTestHarness, SimplePusPacketHandler, TEST_APID};
|
use crate::pus::test_util::{PusTestHarness, SimplePusPacketHandler, TEST_APID};
|
||||||
use crate::pus::tests::{
|
use crate::pus::tests::{
|
||||||
PusServiceHandlerWithSharedStoreCommon, PusServiceHandlerWithVecCommon,
|
PusServiceHandlerWithSharedStoreCommon, PusServiceHandlerWithVecCommon,
|
||||||
@@ -149,12 +148,13 @@ mod tests {
|
|||||||
PartialPusHandlingError, PusPacketHandlingError,
|
PartialPusHandlingError, PusPacketHandlingError,
|
||||||
};
|
};
|
||||||
use crate::tmtc::PacketSenderWithSharedPool;
|
use crate::tmtc::PacketSenderWithSharedPool;
|
||||||
|
use crate::ComponentId;
|
||||||
use delegate::delegate;
|
use delegate::delegate;
|
||||||
use spacepackets::SpHeader;
|
|
||||||
use spacepackets::ecss::PusPacket;
|
|
||||||
use spacepackets::ecss::tc::{PusTcCreator, PusTcSecondaryHeader};
|
use spacepackets::ecss::tc::{PusTcCreator, PusTcSecondaryHeader};
|
||||||
use spacepackets::ecss::tm::PusTmReader;
|
use spacepackets::ecss::tm::PusTmReader;
|
||||||
use spacepackets::time::{TimeWriter, cds};
|
use spacepackets::ecss::PusPacket;
|
||||||
|
use spacepackets::time::{cds, TimeWriter};
|
||||||
|
use spacepackets::SpHeader;
|
||||||
|
|
||||||
use super::PusService17TestHandler;
|
use super::PusService17TestHandler;
|
||||||
|
|
||||||
|
|||||||
@@ -81,7 +81,7 @@
|
|||||||
//! for the verification module contains examples how this module could be used in a more complex
|
//! for the verification module contains examples how this module could be used in a more complex
|
||||||
//! context involving multiple threads
|
//! context involving multiple threads
|
||||||
use crate::params::{Params, WritableToBeBytes};
|
use crate::params::{Params, WritableToBeBytes};
|
||||||
use crate::pus::{EcssTmSender, EcssTmtcError, source_buffer_large_enough};
|
use crate::pus::{source_buffer_large_enough, EcssTmSender, EcssTmtcError};
|
||||||
use core::fmt::{Debug, Display, Formatter};
|
use core::fmt::{Debug, Display, Formatter};
|
||||||
use core::hash::{Hash, Hasher};
|
use core::hash::{Hash, Hasher};
|
||||||
use core::marker::PhantomData;
|
use core::marker::PhantomData;
|
||||||
@@ -90,11 +90,11 @@ use core::mem::size_of;
|
|||||||
use delegate::delegate;
|
use delegate::delegate;
|
||||||
#[cfg(feature = "serde")]
|
#[cfg(feature = "serde")]
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use spacepackets::ecss::EcssEnumeration;
|
|
||||||
use spacepackets::ecss::tc::IsPusTelecommand;
|
use spacepackets::ecss::tc::IsPusTelecommand;
|
||||||
use spacepackets::ecss::tm::{PusTmCreator, PusTmSecondaryHeader};
|
use spacepackets::ecss::tm::{PusTmCreator, PusTmSecondaryHeader};
|
||||||
|
use spacepackets::ecss::EcssEnumeration;
|
||||||
use spacepackets::{ByteConversionError, CcsdsPacket, PacketId, PacketSequenceCtrl};
|
use spacepackets::{ByteConversionError, CcsdsPacket, PacketId, PacketSequenceCtrl};
|
||||||
use spacepackets::{MAX_APID, SpHeader};
|
use spacepackets::{SpHeader, MAX_APID};
|
||||||
|
|
||||||
pub use spacepackets::ecss::verification::*;
|
pub use spacepackets::ecss::verification::*;
|
||||||
pub use spacepackets::seq_count::SeqCountProviderSimple;
|
pub use spacepackets::seq_count::SeqCountProviderSimple;
|
||||||
@@ -102,8 +102,8 @@ pub use spacepackets::seq_count::SeqCountProviderSimple;
|
|||||||
#[cfg(feature = "alloc")]
|
#[cfg(feature = "alloc")]
|
||||||
pub use alloc_mod::*;
|
pub use alloc_mod::*;
|
||||||
|
|
||||||
use crate::ComponentId;
|
|
||||||
use crate::request::Apid;
|
use crate::request::Apid;
|
||||||
|
use crate::ComponentId;
|
||||||
|
|
||||||
/// This is a request identifier as specified in 5.4.11.2 c. of the PUS standard.
|
/// This is a request identifier as specified in 5.4.11.2 c. of the PUS standard.
|
||||||
///
|
///
|
||||||
@@ -1686,39 +1686,39 @@ pub mod test_util {
|
|||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
pub mod tests {
|
pub mod tests {
|
||||||
use crate::ComponentId;
|
|
||||||
use crate::params::Params;
|
use crate::params::Params;
|
||||||
use crate::pool::{SharedStaticMemoryPool, StaticMemoryPool, StaticPoolConfig};
|
use crate::pool::{SharedStaticMemoryPool, StaticMemoryPool, StaticPoolConfig};
|
||||||
use crate::pus::test_util::{TEST_APID, TEST_COMPONENT_ID_0};
|
use crate::pus::test_util::{TEST_APID, TEST_COMPONENT_ID_0};
|
||||||
use crate::pus::tests::CommonTmInfo;
|
use crate::pus::tests::CommonTmInfo;
|
||||||
use crate::pus::verification::{
|
use crate::pus::verification::{
|
||||||
EcssTmSender, EcssTmtcError, FailParams, FailParamsWithStep, RequestId, TcStateNone,
|
handle_step_failure_with_generic_params, EcssTmSender, EcssTmtcError, FailParams,
|
||||||
VerificationReporter, VerificationReporterCfg, VerificationToken,
|
FailParamsWithStep, RequestId, TcStateNone, VerificationReporter, VerificationReporterCfg,
|
||||||
handle_step_failure_with_generic_params,
|
VerificationToken,
|
||||||
};
|
};
|
||||||
use crate::pus::{ChannelWithId, PusTmVariant};
|
use crate::pus::{ChannelWithId, PusTmVariant};
|
||||||
use crate::request::MessageMetadata;
|
use crate::request::MessageMetadata;
|
||||||
use crate::spacepackets::seq_count::{CcsdsSimpleSeqCountProvider, SequenceCountProvider};
|
use crate::spacepackets::seq_count::{CcsdsSimpleSeqCountProvider, SequenceCountProvider};
|
||||||
use crate::tmtc::{PacketSenderWithSharedPool, SharedPacketPool};
|
use crate::tmtc::{PacketSenderWithSharedPool, SharedPacketPool};
|
||||||
|
use crate::ComponentId;
|
||||||
use alloc::format;
|
use alloc::format;
|
||||||
use alloc::string::ToString;
|
use alloc::string::ToString;
|
||||||
use spacepackets::ecss::tc::{PusTcCreator, PusTcReader, PusTcSecondaryHeader};
|
use spacepackets::ecss::tc::{PusTcCreator, PusTcReader, PusTcSecondaryHeader};
|
||||||
use spacepackets::ecss::{
|
use spacepackets::ecss::{
|
||||||
EcssEnumU8, EcssEnumU16, EcssEnumU32, EcssEnumeration, PusError, PusPacket,
|
EcssEnumU16, EcssEnumU32, EcssEnumU8, EcssEnumeration, PusError, PusPacket,
|
||||||
WritablePusPacket,
|
WritablePusPacket,
|
||||||
};
|
};
|
||||||
use spacepackets::util::UnsignedEnum;
|
use spacepackets::util::UnsignedEnum;
|
||||||
use spacepackets::{ByteConversionError, SpHeader};
|
use spacepackets::{ByteConversionError, SpHeader};
|
||||||
use std::cell::RefCell;
|
use std::cell::RefCell;
|
||||||
use std::collections::VecDeque;
|
use std::collections::VecDeque;
|
||||||
use std::sync::{RwLock, mpsc};
|
use std::sync::{mpsc, RwLock};
|
||||||
use std::vec;
|
use std::vec;
|
||||||
use std::vec::Vec;
|
use std::vec::Vec;
|
||||||
|
|
||||||
use super::{
|
use super::{
|
||||||
DummyVerificationHook, FailParamHelper, SeqCountProviderSimple, TcStateAccepted,
|
handle_completion_failure_with_generic_params, DummyVerificationHook, FailParamHelper,
|
||||||
TcStateStarted, VerificationHookProvider, VerificationReportingProvider,
|
SeqCountProviderSimple, TcStateAccepted, TcStateStarted, VerificationHookProvider,
|
||||||
WasAtLeastAccepted, handle_completion_failure_with_generic_params,
|
VerificationReportingProvider, WasAtLeastAccepted,
|
||||||
};
|
};
|
||||||
|
|
||||||
fn is_send<T: Send>(_: &T) {}
|
fn is_send<T: Send>(_: &T) {}
|
||||||
|
|||||||
@@ -9,13 +9,13 @@ pub use alloc_mod::*;
|
|||||||
pub use std_mod::*;
|
pub use std_mod::*;
|
||||||
|
|
||||||
use spacepackets::{
|
use spacepackets::{
|
||||||
|
ecss::{tc::IsPusTelecommand, PusPacket},
|
||||||
ByteConversionError,
|
ByteConversionError,
|
||||||
ecss::{PusPacket, tc::IsPusTelecommand},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
ComponentId,
|
|
||||||
queue::{GenericReceiveError, GenericSendError},
|
queue::{GenericReceiveError, GenericSendError},
|
||||||
|
ComponentId,
|
||||||
};
|
};
|
||||||
|
|
||||||
/// Generic request ID type. Requests can be associated with an ID to have a unique identifier
|
/// Generic request ID type. Requests can be associated with an ID to have a unique identifier
|
||||||
@@ -39,7 +39,7 @@ impl UniqueApidTargetId {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn raw(&self) -> ComponentId {
|
pub const fn raw(&self) -> ComponentId {
|
||||||
((self.apid as u64) << 32) | (self.unique_id as u64)
|
((self.apid as u64) << 32) | (self.unique_id as u64)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -497,8 +497,8 @@ mod tests {
|
|||||||
|
|
||||||
use alloc::string::ToString;
|
use alloc::string::ToString;
|
||||||
use spacepackets::{
|
use spacepackets::{
|
||||||
ByteConversionError, SpHeader,
|
|
||||||
ecss::tc::{PusTcCreator, PusTcSecondaryHeader},
|
ecss::tc::{PusTcCreator, PusTcSecondaryHeader},
|
||||||
|
ByteConversionError, SpHeader,
|
||||||
};
|
};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
|
|||||||
@@ -211,8 +211,8 @@ mod tests {
|
|||||||
println,
|
println,
|
||||||
rc::Rc,
|
rc::Rc,
|
||||||
sync::{
|
sync::{
|
||||||
Arc, Mutex,
|
|
||||||
mpsc::{self, TryRecvError},
|
mpsc::{self, TryRecvError},
|
||||||
|
Arc, Mutex,
|
||||||
},
|
},
|
||||||
time::Instant,
|
time::Instant,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
ComponentId,
|
|
||||||
health::{HealthState, HealthTableProvider},
|
health::{HealthState, HealthTableProvider},
|
||||||
mode::{Mode, ModeAndSubmode, ModeReply, ModeRequest, ModeRequestSender, UNKNOWN_MODE_VAL},
|
mode::{Mode, ModeAndSubmode, ModeReply, ModeRequest, ModeRequestSender, UNKNOWN_MODE_VAL},
|
||||||
mode_tree::{
|
mode_tree::{
|
||||||
@@ -8,6 +7,7 @@ use crate::{
|
|||||||
},
|
},
|
||||||
queue::GenericTargetedMessagingError,
|
queue::GenericTargetedMessagingError,
|
||||||
request::{GenericMessage, RequestId},
|
request::{GenericMessage, RequestId},
|
||||||
|
ComponentId,
|
||||||
};
|
};
|
||||||
|
|
||||||
#[derive(Debug, PartialEq, Eq, Copy, Clone)]
|
#[derive(Debug, PartialEq, Eq, Copy, Clone)]
|
||||||
@@ -252,10 +252,10 @@ impl SequenceExecutionHelper {
|
|||||||
Ok(ModeCommandingResult::AwaitingSuccessCheck)
|
Ok(ModeCommandingResult::AwaitingSuccessCheck)
|
||||||
} else if seq_table_value.entries.len() - 1 == sequence_idx {
|
} else if seq_table_value.entries.len() - 1 == sequence_idx {
|
||||||
self.state = SequenceExecutionHelperState::Idle;
|
self.state = SequenceExecutionHelperState::Idle;
|
||||||
Ok(ModeCommandingResult::Done)
|
return Ok(ModeCommandingResult::Done);
|
||||||
} else {
|
} else {
|
||||||
self.current_sequence_index = Some(sequence_idx + 1);
|
self.current_sequence_index = Some(sequence_idx + 1);
|
||||||
Ok(ModeCommandingResult::StepDone)
|
return Ok(ModeCommandingResult::StepDone);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -682,10 +682,9 @@ mod tests {
|
|||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
ComponentId,
|
|
||||||
mode::{
|
mode::{
|
||||||
Mode, ModeAndSubmode, ModeReply, ModeRequest, UNKNOWN_MODE,
|
|
||||||
tests::{ModeReqSenderMock, ModeReqWrapper},
|
tests::{ModeReqSenderMock, ModeReqWrapper},
|
||||||
|
Mode, ModeAndSubmode, ModeReply, ModeRequest, UNKNOWN_MODE,
|
||||||
},
|
},
|
||||||
mode_tree::{
|
mode_tree::{
|
||||||
ModeStoreProvider, ModeStoreVec, SequenceModeTables, SequenceTableEntry,
|
ModeStoreProvider, ModeStoreVec, SequenceModeTables, SequenceTableEntry,
|
||||||
@@ -694,6 +693,7 @@ mod tests {
|
|||||||
queue::GenericTargetedMessagingError,
|
queue::GenericTargetedMessagingError,
|
||||||
request::{GenericMessage, MessageMetadata, RequestId},
|
request::{GenericMessage, MessageMetadata, RequestId},
|
||||||
subsystem::{ModeCommandingResult, ModeTreeHelperState, SequenceExecutionHelperState},
|
subsystem::{ModeCommandingResult, ModeTreeHelperState, SequenceExecutionHelperState},
|
||||||
|
ComponentId,
|
||||||
};
|
};
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
|
|||||||
@@ -9,20 +9,20 @@
|
|||||||
//! They only need to send the received and generated data to these objects.
|
//! They only need to send the received and generated data to these objects.
|
||||||
use crate::queue::GenericSendError;
|
use crate::queue::GenericSendError;
|
||||||
use crate::{
|
use crate::{
|
||||||
ComponentId,
|
|
||||||
pool::{PoolAddr, PoolError},
|
pool::{PoolAddr, PoolError},
|
||||||
|
ComponentId,
|
||||||
};
|
};
|
||||||
#[cfg(feature = "std")]
|
#[cfg(feature = "std")]
|
||||||
pub use alloc_mod::*;
|
pub use alloc_mod::*;
|
||||||
use core::fmt::Debug;
|
use core::fmt::Debug;
|
||||||
#[cfg(feature = "alloc")]
|
#[cfg(feature = "alloc")]
|
||||||
use downcast_rs::{Downcast, impl_downcast};
|
use downcast_rs::{impl_downcast, Downcast};
|
||||||
use spacepackets::{
|
use spacepackets::{
|
||||||
SpHeader,
|
|
||||||
ecss::{
|
ecss::{
|
||||||
tc::PusTcReader,
|
tc::PusTcReader,
|
||||||
tm::{PusTmCreator, PusTmReader},
|
tm::{PusTmCreator, PusTmReader},
|
||||||
},
|
},
|
||||||
|
SpHeader,
|
||||||
};
|
};
|
||||||
#[cfg(feature = "std")]
|
#[cfg(feature = "std")]
|
||||||
use std::sync::mpsc;
|
use std::sync::mpsc;
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
use spacepackets::SpHeader;
|
|
||||||
use spacepackets::ecss::tm::{PusTmCreator, PusTmSecondaryHeader};
|
use spacepackets::ecss::tm::{PusTmCreator, PusTmSecondaryHeader};
|
||||||
use spacepackets::time::TimeWriter;
|
|
||||||
use spacepackets::time::cds::CdsTime;
|
use spacepackets::time::cds::CdsTime;
|
||||||
|
use spacepackets::time::TimeWriter;
|
||||||
|
use spacepackets::SpHeader;
|
||||||
|
|
||||||
pub struct PusTmWithCdsShortHelper {
|
pub struct PusTmWithCdsShortHelper {
|
||||||
apid: u16,
|
apid: u16,
|
||||||
@@ -56,7 +56,7 @@ impl PusTmWithCdsShortHelper {
|
|||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use spacepackets::{CcsdsPacket, ecss::PusPacket, time::cds::CdsTime};
|
use spacepackets::{ecss::PusPacket, time::cds::CdsTime, CcsdsPacket};
|
||||||
|
|
||||||
use super::PusTmWithCdsShortHelper;
|
use super::PusTmWithCdsShortHelper;
|
||||||
|
|
||||||
|
|||||||
@@ -4,13 +4,13 @@ use satrs::dev_mgmt::{
|
|||||||
DevManagerCommandingHelper, DevManagerHelperResult, TransparentDevManagerHook,
|
DevManagerCommandingHelper, DevManagerHelperResult, TransparentDevManagerHook,
|
||||||
};
|
};
|
||||||
use satrs::mode::{
|
use satrs::mode::{
|
||||||
INVALID_MODE, Mode, ModeError, ModeProvider, ModeReplyReceiver, ModeReplySender,
|
Mode, ModeError, ModeProvider, ModeReplyReceiver, ModeReplySender, ModeRequestHandler,
|
||||||
ModeRequestHandler, ModeRequestHandlerMpscBounded, ModeRequestReceiver,
|
ModeRequestHandlerMpscBounded, ModeRequestReceiver, ModeRequestorAndHandlerMpscBounded,
|
||||||
ModeRequestorAndHandlerMpscBounded, ModeRequestorOneChildBoundedMpsc, UNKNOWN_MODE,
|
ModeRequestorOneChildBoundedMpsc, INVALID_MODE, UNKNOWN_MODE,
|
||||||
};
|
};
|
||||||
use satrs::mode_tree::{
|
use satrs::mode_tree::{
|
||||||
ModeChild, ModeNode, ModeParent, ModeStoreProvider, SequenceTableEntry, SequenceTableMapTable,
|
connect_mode_nodes, ModeChild, ModeNode, ModeParent, ModeStoreProvider, SequenceTableEntry,
|
||||||
TargetTableEntry, connect_mode_nodes,
|
SequenceTableMapTable, TargetTableEntry,
|
||||||
};
|
};
|
||||||
use satrs::mode_tree::{SequenceTablesMapValue, TargetTablesMapValue};
|
use satrs::mode_tree::{SequenceTablesMapValue, TargetTablesMapValue};
|
||||||
use satrs::request::{MessageMetadata, RequestId};
|
use satrs::request::{MessageMetadata, RequestId};
|
||||||
@@ -20,10 +20,10 @@ use satrs::subsystem::{
|
|||||||
StartSequenceError, SubsystemCommandingHelper, SubsystemHelperResult,
|
StartSequenceError, SubsystemCommandingHelper, SubsystemHelperResult,
|
||||||
};
|
};
|
||||||
use satrs::{
|
use satrs::{
|
||||||
ComponentId,
|
|
||||||
mode::{ModeAndSubmode, ModeReply, ModeRequest},
|
mode::{ModeAndSubmode, ModeReply, ModeRequest},
|
||||||
queue::GenericTargetedMessagingError,
|
queue::GenericTargetedMessagingError,
|
||||||
request::GenericMessage,
|
request::GenericMessage,
|
||||||
|
ComponentId,
|
||||||
};
|
};
|
||||||
use std::borrow::{Borrow, BorrowMut};
|
use std::borrow::{Borrow, BorrowMut};
|
||||||
use std::cell::RefCell;
|
use std::cell::RefCell;
|
||||||
|
|||||||
@@ -8,10 +8,10 @@ pub mod crossbeam_test {
|
|||||||
VerificationReportingProvider,
|
VerificationReportingProvider,
|
||||||
};
|
};
|
||||||
use satrs::tmtc::{PacketSenderWithSharedPool, SharedStaticMemoryPool};
|
use satrs::tmtc::{PacketSenderWithSharedPool, SharedStaticMemoryPool};
|
||||||
use spacepackets::SpHeader;
|
|
||||||
use spacepackets::ecss::tc::{PusTcCreator, PusTcReader, PusTcSecondaryHeader};
|
use spacepackets::ecss::tc::{PusTcCreator, PusTcReader, PusTcSecondaryHeader};
|
||||||
use spacepackets::ecss::tm::PusTmReader;
|
use spacepackets::ecss::tm::PusTmReader;
|
||||||
use spacepackets::ecss::{EcssEnumU8, EcssEnumU16, PusPacket, WritablePusPacket};
|
use spacepackets::ecss::{EcssEnumU16, EcssEnumU8, PusPacket, WritablePusPacket};
|
||||||
|
use spacepackets::SpHeader;
|
||||||
use std::sync::RwLock;
|
use std::sync::RwLock;
|
||||||
use std::thread;
|
use std::thread;
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
@@ -46,8 +46,8 @@ pub mod crossbeam_test {
|
|||||||
let sender =
|
let sender =
|
||||||
PacketSenderWithSharedPool::new_with_shared_packet_pool(tx.clone(), &shared_tm_pool);
|
PacketSenderWithSharedPool::new_with_shared_packet_pool(tx.clone(), &shared_tm_pool);
|
||||||
let sender_1 = sender.clone();
|
let sender_1 = sender.clone();
|
||||||
let reporter_with_sender_0 = VerificationReporter::new(TEST_COMPONENT_ID_0.id(), &cfg);
|
let mut reporter_with_sender_0 = VerificationReporter::new(TEST_COMPONENT_ID_0.id(), &cfg);
|
||||||
let reporter_with_sender_1 = reporter_with_sender_0.clone();
|
let mut reporter_with_sender_1 = reporter_with_sender_0.clone();
|
||||||
// For test purposes, we retrieve the request ID from the TCs and pass them to the receiver
|
// For test purposes, we retrieve the request ID from the TCs and pass them to the receiver
|
||||||
// tread.
|
// tread.
|
||||||
let req_id_0;
|
let req_id_0;
|
||||||
|
|||||||
@@ -17,13 +17,12 @@ use core::{
|
|||||||
use std::{
|
use std::{
|
||||||
io::{Read, Write},
|
io::{Read, Write},
|
||||||
net::{IpAddr, Ipv4Addr, SocketAddr, TcpStream},
|
net::{IpAddr, Ipv4Addr, SocketAddr, TcpStream},
|
||||||
sync::{Mutex, mpsc},
|
sync::{mpsc, Mutex},
|
||||||
thread,
|
thread,
|
||||||
};
|
};
|
||||||
|
|
||||||
use hashbrown::HashSet;
|
use hashbrown::HashSet;
|
||||||
use satrs::{
|
use satrs::{
|
||||||
ComponentId,
|
|
||||||
encoding::{
|
encoding::{
|
||||||
ccsds::{SpValidity, SpacePacketValidator},
|
ccsds::{SpValidity, SpacePacketValidator},
|
||||||
cobs::encode_packet_with_cobs,
|
cobs::encode_packet_with_cobs,
|
||||||
@@ -33,10 +32,11 @@ use satrs::{
|
|||||||
TcpSpacepacketsServer, TcpTmtcInCobsServer,
|
TcpSpacepacketsServer, TcpTmtcInCobsServer,
|
||||||
},
|
},
|
||||||
tmtc::PacketSource,
|
tmtc::PacketSource,
|
||||||
|
ComponentId,
|
||||||
};
|
};
|
||||||
use spacepackets::{
|
use spacepackets::{
|
||||||
|
ecss::{tc::PusTcCreator, WritablePusPacket},
|
||||||
CcsdsPacket, PacketId, SpHeader,
|
CcsdsPacket, PacketId, SpHeader,
|
||||||
ecss::{WritablePusPacket, tc::PusTcCreator},
|
|
||||||
};
|
};
|
||||||
use std::{collections::VecDeque, sync::Arc, vec::Vec};
|
use std::{collections::VecDeque, sync::Arc, vec::Vec};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user