diff --git a/embedded-examples/models/Cargo.toml b/embedded-examples/models/Cargo.toml index fe66b8d..b291e30 100644 --- a/embedded-examples/models/Cargo.toml +++ b/embedded-examples/models/Cargo.toml @@ -4,5 +4,7 @@ version = "0.1.0" edition = "2024" [dependencies] -serde = "1" +serde = { version = "1", default-features = false } defmt = { version = "1", optional = true } +spacepackets = { version = "0.17", default-features = false, features = ["defmt", "serde"] } +postcard = { version = "1", features = ["defmt"] } diff --git a/embedded-examples/models/src/lib.rs b/embedded-examples/models/src/lib.rs index 6df8c68..0703ce8 100644 --- a/embedded-examples/models/src/lib.rs +++ b/embedded-examples/models/src/lib.rs @@ -2,6 +2,11 @@ use core::time::Duration; +use spacepackets::{ + CcsdsPacketCreationError, CcsdsPacketCreatorWithReservedData, CcsdsPacketIdAndPsc, + SpacePacketHeader, ccsds_packet_len_for_user_data_len_with_checksum, +}; + #[derive(Copy, Clone, Debug, serde::Serialize, serde::Deserialize)] #[cfg_attr(feature = "defmt", derive(defmt::Format))] pub enum Request { @@ -15,5 +20,37 @@ pub enum Response { CommandDone, } +#[derive(Debug, serde::Serialize, serde::Deserialize)] +#[cfg_attr(feature = "defmt", derive(defmt::Format))] +pub struct TmHeader { + pub tc_packet_id: Option, + pub uptime_millis: u32, +} + +pub fn tm_size(tm_header: &TmHeader, response: &Response) -> usize { + ccsds_packet_len_for_user_data_len_with_checksum( + postcard::experimental::serialized_size(tm_header).unwrap() + + postcard::experimental::serialized_size(response).unwrap(), + ) + .unwrap() +} + +pub fn create_tm_packet( + buf: &mut [u8], + sp_header: SpacePacketHeader, + tm_header: TmHeader, + response: Response, +) -> Result { + let packet_data_size = postcard::experimental::serialized_size(&tm_header).unwrap() + + postcard::experimental::serialized_size(&response).unwrap(); + let mut creator = + CcsdsPacketCreatorWithReservedData::new_tm_with_checksum(sp_header, packet_data_size, buf)?; + + let current_index = postcard::to_slice(&tm_header, creator.packet_data_mut()) + .unwrap() + .len(); + postcard::to_slice(&response, &mut creator.packet_data_mut()[current_index..]).unwrap(); + Ok(creator.finish()) +} #[cfg(test)] mod tests {} diff --git a/embedded-examples/stm32f3-disco-rtic/Cargo.lock b/embedded-examples/stm32f3-disco-rtic/Cargo.lock index 9acc7f9..5bce602 100644 --- a/embedded-examples/stm32f3-disco-rtic/Cargo.lock +++ b/embedded-examples/stm32f3-disco-rtic/Cargo.lock @@ -596,7 +596,10 @@ dependencies = [ name = "embedded-models" version = "0.1.0" dependencies = [ + "defmt 1.0.1", + "postcard", "serde", + "spacepackets", ] [[package]] @@ -949,6 +952,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6764c3b5dd454e283a30e6dfe78e9b31096d9e32036b5d1eaac7a6119ccb9a24" dependencies = [ "cobs 0.3.0", + "defmt 1.0.1", "heapless 0.7.17", "serde", ] diff --git a/embedded-examples/stm32f3-disco-rtic/Cargo.toml b/embedded-examples/stm32f3-disco-rtic/Cargo.toml index 6eddccf..79b6563 100644 --- a/embedded-examples/stm32f3-disco-rtic/Cargo.toml +++ b/embedded-examples/stm32f3-disco-rtic/Cargo.toml @@ -7,7 +7,7 @@ default-run = "satrs-stm32f3-disco-rtic" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -embedded-models = { path = "../models" } +embedded-models = { path = "../models", features = ["defmt"] } cortex-m = { version = "0.7", features = ["critical-section-single-core"] } cortex-m-rt = "0.7" defmt = "1" diff --git a/embedded-examples/stm32f3-disco-rtic/src/lib.rs b/embedded-examples/stm32f3-disco-rtic/src/lib.rs index 70ba20d..1fb2b19 100644 --- a/embedded-examples/stm32f3-disco-rtic/src/lib.rs +++ b/embedded-examples/stm32f3-disco-rtic/src/lib.rs @@ -1,13 +1,10 @@ #![no_main] #![no_std] +use defmt_rtt as _; + use arbitrary_int::u11; use embassy_stm32::gpio::Output; -use embedded_models::Response; -use spacepackets::{ - ccsds_packet_len_for_user_data_len_with_checksum, CcsdsPacketCreationError, - CcsdsPacketCreatorWithReservedData, CcsdsPacketIdAndPsc, SpacePacketHeader, -}; pub const APID: u11 = u11::new(0x02); @@ -40,38 +37,6 @@ impl Direction { } } -#[derive(Debug, defmt::Format, serde::Serialize, serde::Deserialize)] -pub struct TmHeader { - pub tc_packet_id: Option, - pub uptime_millis: u32, -} - -pub fn tm_size(tm_header: &TmHeader, response: &Response) -> usize { - ccsds_packet_len_for_user_data_len_with_checksum( - postcard::experimental::serialized_size(tm_header).unwrap() - + postcard::experimental::serialized_size(response).unwrap(), - ) - .unwrap() -} - -pub fn create_tm_packet( - buf: &mut [u8], - sp_header: SpacePacketHeader, - tm_header: TmHeader, - response: Response, -) -> Result { - let packet_data_size = postcard::experimental::serialized_size(&tm_header).unwrap() - + postcard::experimental::serialized_size(&response).unwrap(); - let mut creator = - CcsdsPacketCreatorWithReservedData::new_tm_with_checksum(sp_header, packet_data_size, buf)?; - - let current_index = postcard::to_slice(&tm_header, creator.packet_data_mut()) - .unwrap() - .len(); - postcard::to_slice(&response, &mut creator.packet_data_mut()[current_index..]).unwrap(); - Ok(creator.finish()) -} - pub struct Leds { pub north: Output<'static>, pub north_east: Output<'static>, diff --git a/embedded-examples/stm32f3-disco-rtic/src/main.rs b/embedded-examples/stm32f3-disco-rtic/src/main.rs index 01c2054..186b72c 100644 --- a/embedded-examples/stm32f3-disco-rtic/src/main.rs +++ b/embedded-examples/stm32f3-disco-rtic/src/main.rs @@ -2,8 +2,8 @@ #![no_main] use arbitrary_int::{u11, u14}; use cortex_m_semihosting::debug::{self, EXIT_FAILURE, EXIT_SUCCESS}; -use satrs_stm32f3_disco_rtic::{create_tm_packet, tm_size, CcsdsPacketId, Request, Response}; -use spacepackets::{CcsdsPacketCreationError, SpHeader}; +use embedded_models::{create_tm_packet, tm_size, Response, TmHeader}; +use spacepackets::{CcsdsPacketCreationError, CcsdsPacketIdAndPsc, SpHeader}; use defmt_rtt as _; // global logger @@ -47,8 +47,8 @@ pub enum TmSendError { #[derive(Debug, defmt::Format)] pub struct RequestWithTcId { - pub request: Request, - pub tc_id: CcsdsPacketId, + pub request: embedded_models::Request, + pub tc_id: CcsdsPacketIdAndPsc, } #[app(device = embassy_stm32)] @@ -57,12 +57,13 @@ mod app { use super::*; use arbitrary_int::u14; + use embedded_models::{Request, Response}; use rtic::Mutex; use rtic_sync::{ channel::{Receiver, Sender}, make_channel, }; - use satrs_stm32f3_disco_rtic::{CcsdsPacketId, LedPinSet, Request, Response}; + use satrs_stm32f3_disco_rtic::LedPinSet; use spacepackets::CcsdsPacketReader; systick_monotonic!(Mono, 1000); @@ -200,7 +201,7 @@ mod app { Ok(packet) => { let packet_id = packet.packet_id(); let psc = packet.psc(); - let tc_packet_id = CcsdsPacketId { packet_id, psc }; + let tc_packet_id = CcsdsPacketIdAndPsc { packet_id, psc }; if let Ok(request) = postcard::from_bytes::(packet.packet_data()) { @@ -260,7 +261,7 @@ mod app { fn handle_ping_request( cx: &mut req_handler::Context, - tc_packet_id: CcsdsPacketId, + tc_packet_id: CcsdsPacketIdAndPsc, ) -> Result<(), TmSendError> { defmt::info!("Received PUS ping telecommand, sending ping reply"); send_tm(tc_packet_id, Response::CommandDone, *cx.local.seq_count)?; @@ -270,7 +271,7 @@ mod app { fn handle_change_blink_frequency_request( cx: &mut req_handler::Context, - tc_packet_id: CcsdsPacketId, + tc_packet_id: CcsdsPacketIdAndPsc, duration: Duration, ) -> Result<(), TmSendError> { defmt::info!( @@ -287,12 +288,12 @@ mod app { } fn send_tm( - tc_packet_id: CcsdsPacketId, + tc_packet_id: CcsdsPacketIdAndPsc, response: Response, current_seq_count: u14, ) -> Result<(), TmSendError> { let sp_header = SpHeader::new_for_unseg_tc(PUS_APID, current_seq_count, 0); - let tm_header = satrs_stm32f3_disco_rtic::TmHeader { + let tm_header = TmHeader { tc_packet_id: Some(tc_packet_id), uptime_millis: Mono::now().duration_since_epoch().to_millis(), }; diff --git a/embedded-examples/stm32h7-nucleo-rtic/tests/integration.rs b/embedded-examples/stm32h7-nucleo-rtic/tests/integration.rs index ff113fc..f03848d 100644 --- a/embedded-examples/stm32h7-nucleo-rtic/tests/integration.rs +++ b/embedded-examples/stm32h7-nucleo-rtic/tests/integration.rs @@ -1,7 +1,7 @@ #![no_std] #![no_main] -use stm32h7_testapp as _; // memory layout + panic handler +use satrs_stm32h7_nucleo_rtic as _; // memory layout + panic handler // See https://crates.io/crates/defmt-test/0.3.0 for more documentation (e.g. about the 'state' // feature) diff --git a/justfile b/justfile index f61f920..375d9eb 100644 --- a/justfile +++ b/justfile @@ -11,9 +11,17 @@ test: cargo nextest run --all-features cargo test --doc --all-features -embedded: +embedded: embedded-stm32h7 embedded-stm32f3 cargo check -p satrs --target=thumbv7em-none-eabihf --no-default-features +[working-directory:"embedded-examples/stm32h7-nucleo-rtic"] +embedded-stm32h7: + cargo build --target=thumbv7em-none-eabihf --release + +[working-directory:"embedded-examples/stm32f3-disco-rtic"] +embedded-stm32f3: + cargo build --target=thumbv7em-none-eabihf --release + check-fmt: cargo fmt --all -- --check