Compare commits

..

1 Commits

Author SHA1 Message Date
6a4417c954 added and scheduled MGM assembly 2025-05-19 16:18:31 +02:00
54 changed files with 758 additions and 628 deletions

View File

@@ -4,7 +4,6 @@
[![sat-rs book](https://img.shields.io/badge/sat--rs-book-darkgreen?style=flat)](https://robamu.github.io/sat-rs/book/) [![sat-rs book](https://img.shields.io/badge/sat--rs-book-darkgreen?style=flat)](https://robamu.github.io/sat-rs/book/)
[![Crates.io](https://img.shields.io/crates/v/satrs)](https://crates.io/crates/satrs) [![Crates.io](https://img.shields.io/crates/v/satrs)](https://crates.io/crates/satrs)
[![docs.rs](https://img.shields.io/docsrs/satrs)](https://docs.rs/satrs) [![docs.rs](https://img.shields.io/docsrs/satrs)](https://docs.rs/satrs)
[![matrix chat](https://img.shields.io/matrix/sat-rs%3Amatrix.org)](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

View File

@@ -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"] }

View File

@@ -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(())
}
}

View File

@@ -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,

View File

@@ -401,7 +401,7 @@ impl<ComInterface: SerialInterface> PcduHandler<ComInterface> {
} }
} }
}) { }) {
log::warn!("receiving PCDU replies failed: {e:?}"); log::warn!("receiving PCDU replies failed: {:?}", e);
} }
} }
} }

View File

@@ -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 =

View File

@@ -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;
} }
} }

View File

@@ -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

View File

@@ -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,

View File

@@ -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));

View File

@@ -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);
} }

View File

@@ -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

View File

@@ -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"]

View File

@@ -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]

View File

@@ -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"] }

View File

@@ -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

View File

@@ -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();

View File

@@ -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

View File

@@ -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"

View File

@@ -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

View File

@@ -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"

View File

@@ -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,
}; };

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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);
} }
@@ -198,13 +198,13 @@ pub enum EventRoutingError {
} }
impl< impl<
EventReceiver: EventReceiveProvider<Event, ParamProvider>, EventReceiver: EventReceiveProvider<Event, ParamProvider>,
SenderMap: SenderMapProvider<EventSender, Event, ParamProvider>, SenderMap: SenderMapProvider<EventSender, Event, ParamProvider>,
ListenerMap: ListenerMapProvider, ListenerMap: ListenerMapProvider,
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)
@@ -229,13 +229,13 @@ impl<
} }
} }
impl< impl<
EventReceiver: EventReceiveProvider<Event, ParamProvider>, EventReceiver: EventReceiveProvider<Event, ParamProvider>,
SenderMap: SenderMapProvider<EventSenderMap, Event, ParamProvider>, SenderMap: SenderMapProvider<EventSenderMap, Event, ParamProvider>,
ListenerMap: ListenerMapProvider, ListenerMap: ListenerMapProvider,
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,
@@ -267,13 +267,13 @@ impl<
} }
impl< impl<
EventReceiver: EventReceiveProvider<Event, ParamProvider>, EventReceiver: EventReceiveProvider<Event, ParamProvider>,
SenderMap: SenderMapProvider<EventSenderMap, Event, ParamProvider>, SenderMap: SenderMapProvider<EventSenderMap, Event, ParamProvider>,
ListenerMap: ListenerMapProvider, ListenerMap: ListenerMapProvider,
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.
@@ -355,11 +355,11 @@ pub mod alloc_mod {
>; >;
impl< impl<
EventReceiver: EventReceiveProvider<Event, ParamProvider>, EventReceiver: EventReceiveProvider<Event, ParamProvider>,
EventSender: EventSendProvider<Event, ParamProvider>, EventSender: EventSendProvider<Event, ParamProvider>,
Event: GenericEvent + Copy, Event: GenericEvent + Copy,
ParamProvider: 'static + Debug, ParamProvider: 'static + Debug,
> >
EventManager< EventManager<
EventReceiver, EventReceiver,
DefaultSenderMap<EventSender, Event, ParamProvider>, DefaultSenderMap<EventSender, Event, ParamProvider>,
@@ -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())
} }
@@ -437,10 +437,10 @@ pub mod alloc_mod {
} }
impl< impl<
EventSender: EventSendProvider<Event, ParamProvider>, EventSender: EventSendProvider<Event, ParamProvider>,
Event: GenericEvent, Event: GenericEvent,
ParamProvider: Debug, ParamProvider: Debug,
> Default for DefaultSenderMap<EventSender, Event, ParamProvider> > Default for DefaultSenderMap<EventSender, Event, ParamProvider>
{ {
fn default() -> Self { fn default() -> Self {
Self { Self {
@@ -451,10 +451,10 @@ pub mod alloc_mod {
} }
impl< impl<
EventSender: EventSendProvider<Event, ParamProvider>, EventSender: EventSendProvider<Event, ParamProvider>,
Event: GenericEvent, Event: GenericEvent,
ParamProvider: Debug, ParamProvider: Debug,
> SenderMapProvider<EventSender, Event, ParamProvider> > SenderMapProvider<EventSender, Event, ParamProvider>
for DefaultSenderMap<EventSender, Event, ParamProvider> for DefaultSenderMap<EventSender, Event, ParamProvider>
{ {
fn contains_send_event_provider(&self, id: &ComponentId) -> bool { fn contains_send_event_provider(&self, id: &ComponentId) -> bool {

View File

@@ -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;

View File

@@ -55,35 +55,33 @@ 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) => {
return Ok(OpResult::Ok);
}
Err(TryRecvError::Empty) => (),
}
}
match executable.exec_type() {
ExecutionType::OneShot => {
executable.periodic_op(op_code)?;
return Ok(OpResult::Ok); return Ok(OpResult::Ok);
} }
ExecutionType::Infinite => { Err(TryRecvError::Empty) => (),
executable.periodic_op(op_code)?; }
} }
ExecutionType::Cycles(cycles) => { match executable.exec_type() {
executable.periodic_op(op_code)?; ExecutionType::OneShot => {
cycle_count += 1; executable.periodic_op(op_code)?;
if cycle_count == cycles { return Ok(OpResult::Ok);
return Ok(OpResult::Ok); }
} ExecutionType::Infinite => {
executable.periodic_op(op_code)?;
}
ExecutionType::Cycles(cycles) => {
executable.periodic_op(op_code)?;
cycle_count += 1;
if cycle_count == cycles {
return Ok(OpResult::Ok);
} }
} }
if let Some(freq) = task_freq { }
thread::sleep(freq); if let Some(freq) = task_freq {
} thread::sleep(freq);
} }
}) })
} }
@@ -112,53 +110,51 @@ 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) => { removal_flags.iter_mut().for_each(|x| *x = true);
removal_flags.iter_mut().for_each(|x| *x = true);
}
Err(TryRecvError::Empty) => (),
} }
Err(TryRecvError::Empty) => (),
} }
for (idx, executable) in executable_vec.iter_mut().enumerate() { }
match executable.exec_type() { for (idx, executable) in executable_vec.iter_mut().enumerate() {
ExecutionType::OneShot => { match executable.exec_type() {
executable.periodic_op(op_code)?; ExecutionType::OneShot => {
executable.periodic_op(op_code)?;
removal_flags[idx] = true;
}
ExecutionType::Infinite => {
executable.periodic_op(op_code)?;
}
ExecutionType::Cycles(cycles) => {
executable.periodic_op(op_code)?;
cycle_counts[idx] += 1;
if cycle_counts[idx] == cycles {
removal_flags[idx] = true; removal_flags[idx] = true;
} }
ExecutionType::Infinite => {
executable.periodic_op(op_code)?;
}
ExecutionType::Cycles(cycles) => {
executable.periodic_op(op_code)?;
cycle_counts[idx] += 1;
if cycle_counts[idx] == cycles {
removal_flags[idx] = true;
}
}
} }
} }
let mut removal_iter = removal_flags.iter();
executable_vec.retain(|_| !*removal_iter.next().unwrap());
removal_iter = removal_flags.iter();
cycle_counts.retain(|_| !*removal_iter.next().unwrap());
removal_flags.retain(|&i| !i);
if executable_vec.is_empty() {
return Ok(OpResult::Ok);
}
let freq = task_freq.unwrap_or_else(|| panic!("No task frequency specified"));
thread::sleep(freq);
} }
let mut removal_iter = removal_flags.iter();
executable_vec.retain(|_| !*removal_iter.next().unwrap());
removal_iter = removal_flags.iter();
cycle_counts.retain(|_| !*removal_iter.next().unwrap());
removal_flags.retain(|&i| !i);
if executable_vec.is_empty() {
return Ok(OpResult::Ok);
}
let freq = task_freq.unwrap_or_else(|| panic!("No task frequency specified"));
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;

View File

@@ -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;
@@ -136,12 +136,12 @@ pub struct TcpTmtcInCobsServer<
} }
impl< impl<
TmSource: PacketSource<Error = TmError>, TmSource: PacketSource<Error = TmError>,
TcReceiver: PacketSenderRaw<Error = TcError>, TcReceiver: PacketSenderRaw<Error = TcError>,
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,19 +435,17 @@ 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()); }
} let result = result.unwrap();
let result = result.unwrap(); if result == ConnectionResult::AcceptTimeout {
if result == ConnectionResult::AcceptTimeout { break;
break; }
} 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,22 +469,20 @@ 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()); }
} let result = result.unwrap();
let result = result.unwrap(); if result == ConnectionResult::AcceptTimeout {
if result == ConnectionResult::AcceptTimeout { panic!("unexpected accept timeout");
panic!("unexpected accept timeout"); }
} if stop_signal_copy.load(Ordering::Relaxed) {
if stop_signal_copy.load(Ordering::Relaxed) { break;
break; }
} 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.

View File

@@ -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.
@@ -187,14 +187,14 @@ pub struct TcpTmtcGenericServer<
} }
impl< impl<
TmSource: PacketSource<Error = TmError>, TmSource: PacketSource<Error = TmError>,
TcSender: PacketSenderRaw<Error = TcSendError>, TcSender: PacketSenderRaw<Error = TcSendError>,
TmSender: TcpTmSender<TmError, TcSendError>, TmSender: TcpTmSender<TmError, TcSendError>,
TcParser: TcpTcParser<TmError, TcSendError>, TcParser: TcpTcParser<TmError, TcSendError>,
HandledConnection: HandledConnectionHandler, HandledConnection: HandledConnectionHandler,
TmError: 'static, TmError: 'static,
TcSendError: 'static, TcSendError: 'static,
> >
TcpTmtcGenericServer< TcpTmtcGenericServer<
TmSource, TmSource,
TcSender, TcSender,

View File

@@ -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::{
@@ -107,13 +107,13 @@ pub struct TcpSpacepacketsServer<
} }
impl< impl<
TmSource: PacketSource<Error = TmError>, TmSource: PacketSource<Error = TmError>,
TcSender: PacketSenderRaw<Error = TcError>, TcSender: PacketSenderRaw<Error = TcError>,
Validator: SpacePacketValidator, Validator: SpacePacketValidator,
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;

View File

@@ -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;

View File

@@ -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;
@@ -257,7 +257,7 @@ pub trait ModeRequestHandler: ModeProvider {
pub trait ModeReplyReceiver { pub trait ModeReplyReceiver {
fn try_recv_mode_reply(&self) fn try_recv_mode_reply(&self)
-> Result<Option<GenericMessage<ModeReply>>, GenericReceiveError>; -> Result<Option<GenericMessage<ModeReply>>, GenericReceiveError>;
} }
impl<R: MessageReceiverProvider<ModeReply>> ModeReplyReceiver impl<R: MessageReceiverProvider<ModeReply>> ModeReplyReceiver
@@ -309,11 +309,12 @@ pub mod alloc_mod {
} }
impl< impl<
From, From,
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()
@@ -333,11 +334,12 @@ pub mod alloc_mod {
} }
impl< impl<
To, To,
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,
@@ -347,15 +349,15 @@ pub mod alloc_mod {
} }
impl< impl<
Request, Request,
ReqSender: MessageSenderProvider<Request>, ReqSender: MessageSenderProvider<Request>,
ReqReceiver: MessageReceiverProvider<Request>, ReqReceiver: MessageReceiverProvider<Request>,
ReqSenderStore: MessageSenderStoreProvider<Request, ReqSender>, ReqSenderStore: MessageSenderStoreProvider<Request, ReqSender>,
Reply, Reply,
ReplySender: MessageSenderProvider<Reply>, ReplySender: MessageSenderProvider<Reply>,
ReplyReceiver: MessageReceiverProvider<Reply>, ReplyReceiver: MessageReceiverProvider<Reply>,
ReplySenderStore: MessageSenderStoreProvider<Reply, ReplySender>, ReplySenderStore: MessageSenderStoreProvider<Reply, ReplySender>,
> >
RequestAndReplySenderAndReceiver< RequestAndReplySenderAndReceiver<
Request, Request,
ReqSender, ReqSender,
@@ -374,14 +376,14 @@ pub mod alloc_mod {
} }
impl< impl<
Request, Request,
ReqSender: MessageSenderProvider<Request>, ReqSender: MessageSenderProvider<Request>,
ReqReceiver: MessageReceiverProvider<Request>, ReqReceiver: MessageReceiverProvider<Request>,
ReqSenderStore: MessageSenderStoreProvider<Request, ReqSender>, ReqSenderStore: MessageSenderStoreProvider<Request, ReqSender>,
ReplySender: MessageSenderProvider<ModeReply>, ReplySender: MessageSenderProvider<ModeReply>,
ReplyReceiver: MessageReceiverProvider<ModeReply>, ReplyReceiver: MessageReceiverProvider<ModeReply>,
ReplySenderStore: MessageSenderStoreProvider<ModeReply, ReplySender>, ReplySenderStore: MessageSenderStoreProvider<ModeReply, ReplySender>,
> ModeReplySender > ModeReplySender
for RequestAndReplySenderAndReceiver< for RequestAndReplySenderAndReceiver<
Request, Request,
ReqSender, ReqSender,
@@ -411,14 +413,14 @@ pub mod alloc_mod {
} }
impl< impl<
Request, Request,
ReqSender: MessageSenderProvider<Request>, ReqSender: MessageSenderProvider<Request>,
ReqReceiver: MessageReceiverProvider<Request>, ReqReceiver: MessageReceiverProvider<Request>,
ReqSenderStore: MessageSenderStoreProvider<Request, ReqSender>, ReqSenderStore: MessageSenderStoreProvider<Request, ReqSender>,
ReplySender: MessageSenderProvider<ModeReply>, ReplySender: MessageSenderProvider<ModeReply>,
ReplyReceiver: MessageReceiverProvider<ModeReply>, ReplyReceiver: MessageReceiverProvider<ModeReply>,
ReplySenderStore: MessageSenderStoreProvider<ModeReply, ReplySender>, ReplySenderStore: MessageSenderStoreProvider<ModeReply, ReplySender>,
> ModeReplyReceiver > ModeReplyReceiver
for RequestAndReplySenderAndReceiver< for RequestAndReplySenderAndReceiver<
Request, Request,
ReqSender, ReqSender,
@@ -442,10 +444,10 @@ pub mod alloc_mod {
MessageSenderAndReceiver<ModeReply, ModeRequest, Sender, Receiver, ReplySenderStore>; MessageSenderAndReceiver<ModeReply, ModeRequest, Sender, Receiver, ReplySenderStore>;
impl< impl<
Sender: MessageSenderProvider<ModeReply>, Sender: MessageSenderProvider<ModeReply>,
Receiver: MessageReceiverProvider<ModeRequest>, Receiver: MessageReceiverProvider<ModeRequest>,
ReplySenderStore: MessageSenderStoreProvider<ModeReply, Sender>, ReplySenderStore: MessageSenderStoreProvider<ModeReply, Sender>,
> ModeRequestHandlerInterface<Sender, Receiver, ReplySenderStore> > ModeRequestHandlerInterface<Sender, Receiver, ReplySenderStore>
{ {
pub fn try_recv_mode_request( pub fn try_recv_mode_request(
&self, &self,
@@ -472,10 +474,10 @@ pub mod alloc_mod {
MessageSenderAndReceiver<ModeRequest, ModeReply, Sender, Receiver, RequestSenderStore>; MessageSenderAndReceiver<ModeRequest, ModeReply, Sender, Receiver, RequestSenderStore>;
impl< impl<
Sender: MessageSenderProvider<ModeRequest>, Sender: MessageSenderProvider<ModeRequest>,
Receiver: MessageReceiverProvider<ModeReply>, Receiver: MessageReceiverProvider<ModeReply>,
RequestSenderStore: MessageSenderStoreProvider<ModeRequest, Sender>, RequestSenderStore: MessageSenderStoreProvider<ModeRequest, Sender>,
> ModeRequestorInterface<Sender, Receiver, RequestSenderStore> > ModeRequestorInterface<Sender, Receiver, RequestSenderStore>
{ {
pub fn try_recv_mode_reply( pub fn try_recv_mode_reply(
&self, &self,
@@ -529,11 +531,11 @@ pub mod alloc_mod {
} }
impl< impl<
To, To,
Sender: MessageSenderProvider<To>, Sender: MessageSenderProvider<To>,
Receiver: MessageReceiverProvider<ModeRequest>, Receiver: MessageReceiverProvider<ModeRequest>,
SenderStore: MessageSenderStoreProvider<To, Sender>, SenderStore: MessageSenderStoreProvider<To, Sender>,
> ModeRequestReceiver > ModeRequestReceiver
for MessageSenderAndReceiver<To, ModeRequest, Sender, Receiver, SenderStore> for MessageSenderAndReceiver<To, ModeRequest, Sender, Receiver, SenderStore>
{ {
fn try_recv_mode_request( fn try_recv_mode_request(
@@ -544,11 +546,11 @@ pub mod alloc_mod {
} }
impl< impl<
From, From,
Sender: MessageSenderProvider<ModeRequest>, Sender: MessageSenderProvider<ModeRequest>,
Receiver: MessageReceiverProvider<From>, Receiver: MessageReceiverProvider<From>,
SenderStore: MessageSenderStoreProvider<ModeRequest, Sender>, SenderStore: MessageSenderStoreProvider<ModeRequest, Sender>,
> ModeRequestSender > ModeRequestSender
for MessageSenderAndReceiver<ModeRequest, From, Sender, Receiver, SenderStore> for MessageSenderAndReceiver<ModeRequest, From, Sender, Receiver, SenderStore>
{ {
fn local_channel_id(&self) -> ComponentId { fn local_channel_id(&self) -> ComponentId {
@@ -570,14 +572,14 @@ pub mod alloc_mod {
} }
impl< impl<
ReqSender: MessageSenderProvider<ModeRequest>, ReqSender: MessageSenderProvider<ModeRequest>,
ReqReceiver: MessageReceiverProvider<ModeRequest>, ReqReceiver: MessageReceiverProvider<ModeRequest>,
ReqSenderStore: MessageSenderStoreProvider<ModeRequest, ReqSender>, ReqSenderStore: MessageSenderStoreProvider<ModeRequest, ReqSender>,
Reply, Reply,
ReplySender: MessageSenderProvider<Reply>, ReplySender: MessageSenderProvider<Reply>,
ReplyReceiver: MessageReceiverProvider<Reply>, ReplyReceiver: MessageReceiverProvider<Reply>,
ReplySenderStore: MessageSenderStoreProvider<Reply, ReplySender>, ReplySenderStore: MessageSenderStoreProvider<Reply, ReplySender>,
> >
RequestAndReplySenderAndReceiver< RequestAndReplySenderAndReceiver<
ModeRequest, ModeRequest,
ReqSender, ReqSender,
@@ -596,14 +598,14 @@ pub mod alloc_mod {
} }
impl< impl<
ReqSender: MessageSenderProvider<ModeRequest>, ReqSender: MessageSenderProvider<ModeRequest>,
ReqReceiver: MessageReceiverProvider<ModeRequest>, ReqReceiver: MessageReceiverProvider<ModeRequest>,
ReqSenderStore: MessageSenderStoreProvider<ModeRequest, ReqSender>, ReqSenderStore: MessageSenderStoreProvider<ModeRequest, ReqSender>,
Reply, Reply,
ReplySender: MessageSenderProvider<Reply>, ReplySender: MessageSenderProvider<Reply>,
ReplyReceiver: MessageReceiverProvider<Reply>, ReplyReceiver: MessageReceiverProvider<Reply>,
ReplySenderStore: MessageSenderStoreProvider<Reply, ReplySender>, ReplySenderStore: MessageSenderStoreProvider<Reply, ReplySender>,
> ModeRequestSender > ModeRequestSender
for RequestAndReplySenderAndReceiver< for RequestAndReplySenderAndReceiver<
ModeRequest, ModeRequest,
ReqSender, ReqSender,
@@ -634,14 +636,14 @@ pub mod alloc_mod {
} }
impl< impl<
ReqSender: MessageSenderProvider<ModeRequest>, ReqSender: MessageSenderProvider<ModeRequest>,
ReqReceiver: MessageReceiverProvider<ModeRequest>, ReqReceiver: MessageReceiverProvider<ModeRequest>,
ReqSenderStore: MessageSenderStoreProvider<ModeRequest, ReqSender>, ReqSenderStore: MessageSenderStoreProvider<ModeRequest, ReqSender>,
Reply, Reply,
ReplySender: MessageSenderProvider<Reply>, ReplySender: MessageSenderProvider<Reply>,
ReplyReceiver: MessageReceiverProvider<Reply>, ReplyReceiver: MessageReceiverProvider<Reply>,
ReplySenderStore: MessageSenderStoreProvider<Reply, ReplySender>, ReplySenderStore: MessageSenderStoreProvider<Reply, ReplySender>,
> ModeRequestReceiver > ModeRequestReceiver
for RequestAndReplySenderAndReceiver< for RequestAndReplySenderAndReceiver<
ModeRequest, ModeRequest,
ReqSender, ReqSender,
@@ -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::*;

View File

@@ -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")]

View File

@@ -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};

View File

@@ -250,7 +250,7 @@ pub trait PoolProvider {
/// call the user-provided closure and pass a mutable reference to the memory block /// call the user-provided closure and pass a mutable reference to the memory block
/// to the closure. This allows the user to modify the memory block. /// to the closure. This allows the user to modify the memory block.
fn modify<U: FnMut(&mut [u8])>(&mut self, addr: &PoolAddr, updater: U) fn modify<U: FnMut(&mut [u8])>(&mut self, addr: &PoolAddr, updater: U)
-> Result<(), PoolError>; -> Result<(), PoolError>;
/// The provider should copy the data from the memory block to the user-provided buffer if /// The provider should copy the data from the memory block to the user-provided buffer if
/// it exists. /// it exists.
@@ -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> {
@@ -510,11 +510,11 @@ pub mod heapless_mod {
/// ///
/// * `subpool_memory` - Static memory for a particular subpool to store the actual data. /// * `subpool_memory` - Static memory for a particular subpool to store the actual data.
/// * `sizes_list` - Static sizes list structure to store the size of the data which is /// * `sizes_list` - Static sizes list structure to store the size of the data which is
/// actually stored. /// actually stored.
/// * `num_blocks ` - The number of memory blocks inside the subpool. /// * `num_blocks ` - The number of memory blocks inside the subpool.
/// * `set_sizes_list_to_all_free` - If this is set to true, the method will take care /// * `set_sizes_list_to_all_free` - If this is set to true, the method will take care
/// of setting all values in the sizes list to [super::STORE_FREE]. This does not have /// of setting all values in the sizes list to [super::STORE_FREE]. This does not have
/// to be done if the user initializes the sizes list to that value themselves. /// to be done if the user initializes the sizes list to that value themselves.
pub fn grow( pub fn grow(
&mut self, &mut self,
subpool_memory: &'static mut [u8], subpool_memory: &'static mut [u8],
@@ -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
); .grow(
assert!( SUBPOOL_2.take(),
heapless_pool SUBPOOL_2_SIZES.take(),
.grow( SUBPOOL_2_NUM_ELEMENTS,
SUBPOOL_2.take(), true
SUBPOOL_2_SIZES.take(), )
SUBPOOL_2_NUM_ELEMENTS, .is_ok());
true assert!(heapless_pool
) .grow(
.is_ok() SUBPOOL_3.take(),
); SUBPOOL_3_SIZES.take(),
assert!( SUBPOOL_3_NUM_ELEMENTS,
heapless_pool true
.grow( )
SUBPOOL_3.take(), .is_ok());
SUBPOOL_3_SIZES.take(),
SUBPOOL_3_NUM_ELEMENTS,
true
)
.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
); .grow(
assert!( SUBPOOL_4.take(),
heapless_pool SUBPOOL_4_SIZES.take(),
.grow( SUBPOOL_4_NUM_ELEMENTS,
SUBPOOL_4.take(), true
SUBPOOL_4_SIZES.take(), )
SUBPOOL_4_NUM_ELEMENTS, .is_ok());
true
)
.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
); .grow(
assert!( SUBPOOL_3.take(),
heapless_pool SUBPOOL_3_SIZES.take(),
.grow( SUBPOOL_3_NUM_ELEMENTS,
SUBPOOL_3.take(), true
SUBPOOL_3_SIZES.take(), )
SUBPOOL_3_NUM_ELEMENTS, .is_ok());
true
)
.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
); .grow(
assert!( SUBPOOL_6.take(),
heapless_pool SUBPOOL_6_SIZES.take(),
.grow( SUBPOOL_6_NUM_ELEMENTS,
SUBPOOL_6.take(), true
SUBPOOL_6_SIZES.take(), )
SUBPOOL_6_NUM_ELEMENTS, .is_ok());
true assert!(heapless_pool
) .grow(
.is_ok() SUBPOOL_3.take(),
); SUBPOOL_3_SIZES.take(),
assert!( SUBPOOL_3_NUM_ELEMENTS,
heapless_pool true
.grow( )
SUBPOOL_3.take(), .is_ok());
SUBPOOL_3_SIZES.take(),
SUBPOOL_3_NUM_ELEMENTS,
true
)
.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
); .grow(
assert!( SUBPOOL_6.take(),
heapless_pool SUBPOOL_6_SIZES.take(),
.grow( SUBPOOL_6_NUM_ELEMENTS,
SUBPOOL_6.take(), true
SUBPOOL_6_SIZES.take(), )
SUBPOOL_6_NUM_ELEMENTS, .is_ok());
true assert!(heapless_pool
) .grow(
.is_ok() SUBPOOL_3.take(),
); SUBPOOL_3_SIZES.take(),
assert!( SUBPOOL_3_NUM_ELEMENTS,
heapless_pool true
.grow( )
SUBPOOL_3.take(), .is_ok());
SUBPOOL_3_SIZES.take(),
SUBPOOL_3_NUM_ELEMENTS,
true
)
.is_ok()
);
generic_test_spillage_fails_across_multiple_subpools(&mut heapless_pool); generic_test_spillage_fails_across_multiple_subpools(&mut heapless_pool);
} }
} }

View File

@@ -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::*;

View File

@@ -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;
@@ -81,10 +81,10 @@ pub mod alloc_mod {
MessageSenderAndReceiver<ActionReplyPus, ActionRequest, Sender, Receiver, ReplySenderStore>; MessageSenderAndReceiver<ActionReplyPus, ActionRequest, Sender, Receiver, ReplySenderStore>;
impl< impl<
Sender: MessageSenderProvider<ActionReplyPus>, Sender: MessageSenderProvider<ActionReplyPus>,
Receiver: MessageReceiverProvider<ActionRequest>, Receiver: MessageReceiverProvider<ActionRequest>,
ReplySender: MessageSenderStoreProvider<ActionReplyPus, Sender>, ReplySender: MessageSenderStoreProvider<ActionReplyPus, Sender>,
> ActionRequestHandlerInterface<Sender, Receiver, ReplySender> > ActionRequestHandlerInterface<Sender, Receiver, ReplySender>
{ {
pub fn try_recv_action_request( pub fn try_recv_action_request(
&self, &self,
@@ -114,10 +114,10 @@ pub mod alloc_mod {
>; >;
impl< impl<
Sender: MessageSenderProvider<ActionRequest>, Sender: MessageSenderProvider<ActionRequest>,
Receiver: MessageReceiverProvider<ActionReplyPus>, Receiver: MessageReceiverProvider<ActionReplyPus>,
RequestSenderStore: MessageSenderStoreProvider<ActionRequest, Sender>, RequestSenderStore: MessageSenderStoreProvider<ActionRequest, Sender>,
> ActionRequestorInterface<Sender, Receiver, RequestSenderStore> > ActionRequestorInterface<Sender, Receiver, RequestSenderStore>
{ {
pub fn try_recv_action_reply( pub fn try_recv_action_reply(
&self, &self,
@@ -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::*;

View File

@@ -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;

View File

@@ -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::*;
@@ -159,10 +159,10 @@ pub mod alloc_mod {
} }
impl< impl<
ReportingMap: PusEventReportingMapProvider<Event>, ReportingMap: PusEventReportingMapProvider<Event>,
Event: GenericEvent, Event: GenericEvent,
EventTmHook: EventTmHookProvider, EventTmHook: EventTmHookProvider,
> PusEventTmCreatorWithMap<ReportingMap, Event, EventTmHook> > PusEventTmCreatorWithMap<ReportingMap, Event, EventTmHook>
{ {
pub fn new(reporter: EventReporter<EventTmHook>, backend: ReportingMap) -> Self { pub fn new(reporter: EventReporter<EventTmHook>, backend: ReportingMap) -> Self {
Self { Self {
@@ -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;

View File

@@ -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;
@@ -25,11 +25,11 @@ pub struct PusEventServiceHandler<
} }
impl< impl<
TcReceiver: EcssTcReceiver, TcReceiver: EcssTcReceiver,
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,
}, },
}; };

View File

@@ -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;
@@ -1137,11 +1137,11 @@ pub mod std_mod {
} }
impl< impl<
TcReceiver: EcssTcReceiver, TcReceiver: EcssTcReceiver,
TmSender: EcssTmSender, TmSender: EcssTmSender,
TcInMemConverter: EcssTcInMemConversionProvider, TcInMemConverter: EcssTcInMemConversionProvider,
VerificationReporter: VerificationReportingProvider, VerificationReporter: VerificationReportingProvider,
> PusServiceHelper<TcReceiver, TmSender, TcInMemConverter, VerificationReporter> > PusServiceHelper<TcReceiver, TmSender, TcInMemConverter, VerificationReporter>
{ {
pub fn new( pub fn new(
id: ComponentId, id: ComponentId,
@@ -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;
@@ -1288,7 +1288,7 @@ pub mod test_util {
pub trait SimplePusPacketHandler { pub trait SimplePusPacketHandler {
fn handle_one_tc(&mut self) fn handle_one_tc(&mut self)
-> Result<DirectPusPacketHandlerResult, PusPacketHandlingError>; -> Result<DirectPusPacketHandlerResult, PusPacketHandlingError>;
} }
} }
@@ -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::{

View File

@@ -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;

View File

@@ -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;
@@ -34,12 +34,13 @@ pub struct PusSchedServiceHandler<
} }
impl< impl<
TcReceiver: EcssTcReceiver, TcReceiver: EcssTcReceiver,
TmSender: EcssTmSender, TmSender: EcssTmSender,
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,

View File

@@ -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};
@@ -27,11 +27,11 @@ pub struct PusService17TestHandler<
} }
impl< impl<
TcReceiver: EcssTcReceiver, TcReceiver: EcssTcReceiver,
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;

View File

@@ -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) {}

View File

@@ -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)
} }
@@ -335,12 +335,12 @@ pub mod alloc_mod {
} }
impl< impl<
To, To,
From, From,
Sender: MessageSenderProvider<To>, Sender: MessageSenderProvider<To>,
Receiver: MessageReceiverProvider<From>, Receiver: MessageReceiverProvider<From>,
SenderStore: MessageSenderStoreProvider<To, Sender>, SenderStore: MessageSenderStoreProvider<To, Sender>,
> MessageSenderAndReceiver<To, From, Sender, Receiver, SenderStore> > MessageSenderAndReceiver<To, From, Sender, Receiver, SenderStore>
{ {
pub fn new(local_channel_id: ComponentId, message_receiver: Receiver) -> Self { pub fn new(local_channel_id: ComponentId, message_receiver: Receiver) -> Self {
Self { Self {
@@ -403,15 +403,15 @@ pub mod alloc_mod {
} }
impl< impl<
Request, Request,
ReqSender: MessageSenderProvider<Request>, ReqSender: MessageSenderProvider<Request>,
ReqReceiver: MessageReceiverProvider<Request>, ReqReceiver: MessageReceiverProvider<Request>,
ReqSenderStore: MessageSenderStoreProvider<Request, ReqSender>, ReqSenderStore: MessageSenderStoreProvider<Request, ReqSender>,
Reply, Reply,
ReplySender: MessageSenderProvider<Reply>, ReplySender: MessageSenderProvider<Reply>,
ReplyReceiver: MessageReceiverProvider<Reply>, ReplyReceiver: MessageReceiverProvider<Reply>,
ReplySenderStore: MessageSenderStoreProvider<Reply, ReplySender>, ReplySenderStore: MessageSenderStoreProvider<Reply, ReplySender>,
> >
RequestAndReplySenderAndReceiver< RequestAndReplySenderAndReceiver<
Request, Request,
ReqSender, ReqSender,
@@ -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::{

View File

@@ -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,
}; };

View File

@@ -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)]

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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};