diff --git a/satrs-example/Cargo.toml b/satrs-example/Cargo.toml index 936903c..f8355a0 100644 --- a/satrs-example/Cargo.toml +++ b/satrs-example/Cargo.toml @@ -28,6 +28,7 @@ serde = { version = "1", features = ["derive"] } serde_json = "1" satrs = { path = "../satrs", features = ["test_util"] } +models = { path = "./models" } satrs-minisim = { path = "../satrs-minisim" } satrs-mib = { path = "../satrs-mib" } diff --git a/satrs-example/models/Cargo.toml b/satrs-example/models/Cargo.toml index c96a438..70e6c71 100644 --- a/satrs-example/models/Cargo.toml +++ b/satrs-example/models/Cargo.toml @@ -5,4 +5,7 @@ edition = "2024" [dependencies] serde = { version = "1", features = ["derive"] } -spacepackets = { version = "0.17" } +spacepackets = { version = "0.17", git = "https://egit.irs.uni-stuttgart.de/rust/spacepackets.git", default-features = false } +num_enum = { version = "0.7" } +postcard = { version = "1" } +thiserror = { version = "2" } diff --git a/satrs-example/models/src/ccsds.rs b/satrs-example/models/src/ccsds.rs new file mode 100644 index 0000000..0ad2070 --- /dev/null +++ b/satrs-example/models/src/ccsds.rs @@ -0,0 +1,63 @@ +use spacepackets::{ + CcsdsPacketCreationError, CcsdsPacketCreatorWithReservedData, SpacePacketHeader, + ccsds_packet_len_for_user_data_len_with_checksum, +}; + +use crate::{TcHeader, TmHeader}; + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct CcsdsTcPacketOwned { + pub sp_header: SpacePacketHeader, + pub tc_header: TcHeader, + pub payload: alloc::vec::Vec, +} + +#[derive(Debug, thiserror::Error)] +pub enum CcsdsCreationError { + #[error("CCSDS packet creation error: {0}")] + CcsdsPacketCreation(#[from] CcsdsPacketCreationError), + #[error("postcard error: {0}")] + Postcard(#[from] postcard::Error), + #[error("timestamp generation error")] + Time, +} + +/// Unserialized owned TM packet which can be cloned and sent around. +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct CcsdsTmPacketOwned { + pub sp_header: SpacePacketHeader, + pub tm_header: TmHeader, + pub payload: alloc::vec::Vec, +} + +impl CcsdsTmPacketOwned { + pub fn write_to_bytes(&self, buf: &mut [u8]) -> Result { + let response_len = + postcard::experimental::serialized_size(&self.tm_header)? + self.payload.len(); + let mut ccsds_tm = CcsdsPacketCreatorWithReservedData::new_tm_with_checksum( + self.sp_header, + response_len, + buf, + )?; + let user_data = ccsds_tm.packet_data_mut(); + let ser_len = postcard::to_slice(&self.tm_header, user_data)?.len(); + user_data[ser_len..ser_len + self.payload.len()].copy_from_slice(&self.payload); + let ccsds_packet_len = ccsds_tm.finish(); + Ok(ccsds_packet_len) + } + + pub fn len_written(&self) -> usize { + ccsds_packet_len_for_user_data_len_with_checksum( + postcard::experimental::serialized_size(&self.tm_header).unwrap() as usize + + postcard::experimental::serialized_size(&self.payload).unwrap() as usize, + ) + .unwrap() + } + + pub fn to_vec(&self) -> alloc::vec::Vec { + let mut buf = alloc::vec![0u8; self.len_written()]; + let len = self.write_to_bytes(&mut buf).unwrap(); + buf.truncate(len); + buf + } +} diff --git a/satrs-example/models/src/lib.rs b/satrs-example/models/src/lib.rs index 3efd4d8..e95aadb 100644 --- a/satrs-example/models/src/lib.rs +++ b/satrs-example/models/src/lib.rs @@ -1,21 +1,58 @@ -use spacepackets::{CcsdsPacketIdAndPsc, time::cds::CdsTime}; +extern crate alloc; +use spacepackets::CcsdsPacketIdAndPsc; -#[derive(serde::Serialize, serde::Deserialize, Clone, Copy, Debug)] +pub mod ccsds; + +#[derive( + Debug, + Copy, + Clone, + PartialEq, + Eq, + Hash, + serde::Serialize, + serde::Deserialize, + num_enum::TryFromPrimitive, + num_enum::IntoPrimitive, +)] +#[repr(u64)] pub enum ComponentId { - Controller, - Scheduler, Pcdu, } -#[derive(serde::Serialize, serde::Deserialize, Clone, Copy, Debug)] -pub struct TcHeader { - pub target: ComponentId, +#[derive(Debug, Copy, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)] +#[non_exhaustive] +pub struct TmHeader { + pub sender_id: ComponentId, + pub target_id: ComponentId, + pub message_type: MessageType, + /// Telemetry can either be sent unsolicited, or as a response to telecommands. + pub tc_id: Option, + /// Raw CDS short timestamp. + pub timestamp: Option<[u8; 7]>, } -#[derive(serde::Serialize, serde::Deserialize, Clone, Copy, Debug)] -pub struct TmHeader { - pub tc_id: Option, - pub timestamp: CdsTime, +#[derive(Debug, Copy, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)] +#[non_exhaustive] +pub struct TcHeader { + pub target_id: ComponentId, + pub request_type: MessageType, +} + +#[derive(Debug, Copy, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)] +pub enum MessageType { + Ping, + Mode, + Hk, + Action, + Verification, +} + +#[derive(Debug, PartialEq, Eq, Copy, Clone)] +pub enum DeviceMode { + Off = 0, + On = 1, + Normal = 2, } pub mod request { diff --git a/satrs-example/src/eps/pcdu.rs b/satrs-example/src/eps/pcdu.rs index aa827c4..50285d0 100644 --- a/satrs-example/src/eps/pcdu.rs +++ b/satrs-example/src/eps/pcdu.rs @@ -5,6 +5,7 @@ use std::{ }; use derive_new::new; +use models::ccsds::CcsdsTmPacketOwned; use num_enum::{IntoPrimitive, TryFromPrimitive}; use satrs::{ hk::{HkRequest, HkRequestVariant}, @@ -21,7 +22,7 @@ use satrs::{ use satrs_example::{ config::components::NO_SENDER, ids::{eps::PCDU, generic_pus::PUS_MODE}, - CcsdsTmPacketOwned, DeviceMode, TimestampHelper, + DeviceMode, TimestampHelper, }; use satrs_minisim::{ eps::{ @@ -272,7 +273,7 @@ impl PcduHandler { match hk_request.variant { HkRequestVariant::OneShot => { if hk_request.unique_id == SetId::SwitcherSet as u32 { - if let Ok(hk_tm) = self.hk_helper.generate_hk_report_packet( + if let Ok(_hk_tm) = self.hk_helper.generate_hk_report_packet( self.stamp_helper.stamp(), SetId::SwitcherSet as u32, &mut |hk_buf| { diff --git a/satrs-example/src/interface/udp.rs b/satrs-example/src/interface/udp.rs index 63668c3..ce55623 100644 --- a/satrs-example/src/interface/udp.rs +++ b/satrs-example/src/interface/udp.rs @@ -4,12 +4,11 @@ use std::net::{SocketAddr, UdpSocket}; use std::sync::{mpsc, Arc, Mutex}; use log::{info, warn}; +use models::ccsds::CcsdsTmPacketOwned; use satrs::hal::std::udp_server::{ReceiveResult, UdpTcServer}; use satrs::pus::HandlingStatus; use satrs::queue::GenericSendError; -use satrs_example::CcsdsTmPacketOwned; - use crate::tmtc::sender::TmTcSender; pub trait UdpTmHandlerProvider { diff --git a/satrs-example/src/lib.rs b/satrs-example/src/lib.rs index 98b041c..bdb8261 100644 --- a/satrs-example/src/lib.rs +++ b/satrs-example/src/lib.rs @@ -1,47 +1,11 @@ extern crate alloc; -use satrs::spacepackets::{ - ccsds_packet_len_for_user_data_len_with_checksum, time::cds::CdsTime, CcsdsPacketCreationError, - CcsdsPacketCreatorWithReservedData, CcsdsPacketIdAndPsc, SpacePacketHeader, -}; +pub use models::ComponentId; +use satrs::spacepackets::time::cds::CdsTime; pub mod config; pub mod ids; -#[derive( - Debug, - Copy, - Clone, - PartialEq, - Eq, - Hash, - serde::Serialize, - serde::Deserialize, - num_enum::TryFromPrimitive, - num_enum::IntoPrimitive, -)] -#[repr(u64)] -pub enum ComponentId { - Pcdu, -} - -#[derive(Debug, Copy, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)] -pub enum MessageType { - Ping, - Mode, - Hk, - Action, - Verification, -} - -/// Unserialized owned TM packet which can be cloned and sent around. -#[derive(Debug, Clone, PartialEq, Eq)] -pub struct CcsdsTmPacketOwned { - pub sp_header: SpacePacketHeader, - pub tm_header: TmHeader, - pub payload: alloc::vec::Vec, -} - /// Simple type modelling packet stored in the heap. This structure is intended to /// be used when sending a packet via a message queue, so it also contains the sender ID. #[derive(Debug, PartialEq, Eq, Clone)] @@ -56,74 +20,6 @@ impl PacketAsVec { } } -#[derive(Debug, thiserror::Error)] -pub enum CcsdsCreationError { - #[error("CCSDS packet creation error: {0}")] - CcsdsPacketCreation(#[from] CcsdsPacketCreationError), - #[error("postcard error: {0}")] - Postcard(#[from] postcard::Error), - #[error("timestamp generation error")] - Time, -} - -impl CcsdsTmPacketOwned { - pub fn write_to_bytes(&self, buf: &mut [u8]) -> Result { - let response_len = - postcard::experimental::serialized_size(&self.tm_header)? + self.payload.len(); - let mut ccsds_tm = CcsdsPacketCreatorWithReservedData::new_tm_with_checksum( - self.sp_header, - response_len, - buf, - )?; - let user_data = ccsds_tm.packet_data_mut(); - let ser_len = postcard::to_slice(&self.tm_header, user_data)?.len(); - user_data[ser_len..ser_len + self.payload.len()].copy_from_slice(&self.payload); - let ccsds_packet_len = ccsds_tm.finish(); - Ok(ccsds_packet_len) - } - - pub fn len_written(&self) -> usize { - ccsds_packet_len_for_user_data_len_with_checksum( - postcard::experimental::serialized_size(&self.tm_header).unwrap() as usize - + postcard::experimental::serialized_size(&self.payload).unwrap() as usize, - ) - .unwrap() - } - - pub fn to_vec(&self) -> alloc::vec::Vec { - let mut buf = alloc::vec![0u8; self.len_written()]; - let len = self.write_to_bytes(&mut buf).unwrap(); - buf.truncate(len); - buf - } -} - -#[derive(Debug, Copy, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)] -#[non_exhaustive] -pub struct TmHeader { - pub sender_id: ComponentId, - pub target_id: ComponentId, - pub message_type: MessageType, - /// Telemetry can either be sent unsolicited, or as a response to telecommands. - pub tc_id: Option, - /// Raw CDS short timestamp. - pub timestamp: Option<[u8; 7]>, -} - -#[derive(Debug, Copy, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)] -#[non_exhaustive] -pub struct TcHeader { - pub target_id: ComponentId, - pub request_type: MessageType, -} - -#[derive(Debug, Clone, PartialEq, Eq)] -pub struct CcsdsTcPacketOwned { - pub sp_header: SpacePacketHeader, - pub tc_header: TcHeader, - pub payload: alloc::vec::Vec, -} - #[derive(Debug, PartialEq, Eq, Copy, Clone)] pub enum DeviceMode { Off = 0, diff --git a/satrs-example/src/tmtc/tc_source.rs b/satrs-example/src/tmtc/tc_source.rs index 1de2aa6..4203f33 100644 --- a/satrs-example/src/tmtc/tc_source.rs +++ b/satrs-example/src/tmtc/tc_source.rs @@ -1,9 +1,9 @@ +use models::{ccsds::CcsdsTcPacketOwned, ComponentId, TcHeader}; use satrs::{ pus::HandlingStatus, spacepackets::{CcsdsPacketReader, ChecksumType}, tmtc::PacketAsVec, }; -use satrs_example::{CcsdsTcPacketOwned, ComponentId, TcHeader}; use std::{ collections::HashMap, sync::mpsc::{self, TryRecvError}, diff --git a/satrs-example/src/tmtc/tm_sink.rs b/satrs-example/src/tmtc/tm_sink.rs index fe0aba7..2dd020e 100644 --- a/satrs-example/src/tmtc/tm_sink.rs +++ b/satrs-example/src/tmtc/tm_sink.rs @@ -5,12 +5,12 @@ use std::{ use arbitrary_int::{u11, u14}; use log::info; +use models::ccsds::CcsdsTmPacketOwned; use satrs::spacepackets::{ ecss::{tm::PusTmZeroCopyWriter, PusPacket}, seq_count::{SequenceCounter, SequenceCounterCcsdsSimple}, CcsdsPacket, }; -use satrs_example::CcsdsTmPacketOwned; use crate::interface::tcp::SyncTcpTmSource;