From 1fafe149c184047efaa44866b5a3ee054b44be4a Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 13 May 2026 10:33:00 +0200 Subject: [PATCH] need to add UDP to tmtc-utils --- .../src/{main.rs => bin/stm32f3-client.rs} | 48 ++------------ .../embedded-client/src/bin/stm32h7-client.rs | 64 +++++++++++++++++++ embedded-examples/embedded-client/src/lib.rs | 42 ++++++++++++ 3 files changed, 110 insertions(+), 44 deletions(-) rename embedded-examples/embedded-client/src/{main.rs => bin/stm32f3-client.rs} (61%) create mode 100644 embedded-examples/embedded-client/src/bin/stm32h7-client.rs create mode 100644 embedded-examples/embedded-client/src/lib.rs diff --git a/embedded-examples/embedded-client/src/main.rs b/embedded-examples/embedded-client/src/bin/stm32f3-client.rs similarity index 61% rename from embedded-examples/embedded-client/src/main.rs rename to embedded-examples/embedded-client/src/bin/stm32f3-client.rs index c05ae34..1e675bc 100644 --- a/embedded-examples/embedded-client/src/main.rs +++ b/embedded-examples/embedded-client/src/bin/stm32f3-client.rs @@ -1,12 +1,8 @@ -use std::{ - fs::File, - io::Read, - path::Path, - time::{Duration, SystemTime}, -}; +use std::time::Duration; use clap::Parser; use cobs::CobsDecoderOwned; +use embedded_client::setup_logger; use embedded_models::stm32f3; use spacepackets::{CcsdsPacketCreatorOwned, CcsdsPacketReader, SpHeader}; use tmtc_utils::transport::serial::PacketTransportSerialCobs; @@ -21,47 +17,11 @@ struct Cli { set_led_frequency: Option, } -#[derive(Debug, serde::Deserialize)] -struct Config { - interface: Interface, -} - -#[derive(Debug, serde::Deserialize)] -struct Interface { - serial_port: String, -} - -fn setup_logger() -> Result<(), fern::InitError> { - fern::Dispatch::new() - .format(|out, message, record| { - out.finish(format_args!( - "[{} {} {}] {}", - humantime::format_rfc3339_seconds(SystemTime::now()), - record.level(), - record.target(), - message - )) - }) - .level(log::LevelFilter::Debug) - .chain(std::io::stdout()) - .chain(fern::log_file("output.log")?) - .apply()?; - Ok(()) -} - fn main() { setup_logger().expect("failed to initialize logger"); - println!("sat-rs embedded examples TMTC client"); - + println!("-- STM32F3 TMTC client --"); let cli = Cli::parse(); - let mut config_file = - File::open(Path::new("config.toml")).expect("opening config.toml file failed"); - let mut toml_str = String::new(); - config_file - .read_to_string(&mut toml_str) - .expect("reading config.toml file failed"); - let config: Config = toml::from_str(&toml_str).expect("parsing config.toml file failed"); - println!("Connecting to serial port {}", config.interface.serial_port); + let config = embedded_client::Config::new_from_file(); let serial = serialport::new(config.interface.serial_port, 115200) .open() diff --git a/embedded-examples/embedded-client/src/bin/stm32h7-client.rs b/embedded-examples/embedded-client/src/bin/stm32h7-client.rs new file mode 100644 index 0000000..225abdc --- /dev/null +++ b/embedded-examples/embedded-client/src/bin/stm32h7-client.rs @@ -0,0 +1,64 @@ +use std::{fs::File, io::Read, path::Path, time::Duration}; + +use clap::Parser; +use cobs::CobsDecoderOwned; +use embedded_client::setup_logger; +use embedded_models::{stm32f3, stm32h7}; +use spacepackets::{CcsdsPacketCreatorOwned, CcsdsPacketReader, SpHeader}; +use tmtc_utils::transport::serial::PacketTransportSerialCobs; + +#[derive(Parser, Debug)] +struct Cli { + #[arg(short, long)] + ping: bool, + + /// Set frequency in milliseconds. + #[arg(short, long)] + set_led_frequency: Option, +} + +fn main() { + setup_logger().expect("failed to initialize logger"); + println!("-- STM32H7 TMTC client --"); + let cli = Cli::parse(); + let config = embedded_client::Config::new_from_file(); + + + /* + if cli.ping { + let tc = create_stm32f3_tc(&embedded_models::stm32f3::Request::Ping); + log::info!( + "Sending ping request with TC ID: {:#010x}", + tc.ccsds_packet_id_and_psc().raw() + ); + transport.send(&tc.to_vec()).unwrap(); + } + + if let Some(freq_ms) = cli.set_led_frequency { + let request = stm32f3::Request::ChangeBlinkFrequency(Duration::from_millis(freq_ms as u64)); + let tc = create_stm32f3_tc(&request); + log::info!( + "Sending change blink frequency request {:?} with TC ID: {:#010x}", + request, + tc.ccsds_packet_id_and_psc().raw() + ); + transport.send(&tc.to_vec()).unwrap(); + } + + log::info!("Waiting for response..."); + loop { + transport + .receive(|packet: &[u8]| { + let reader = CcsdsPacketReader::new_with_checksum(packet); + log::info!("Received packet: {:?}", reader); + }) + .unwrap(); + } + */ +} + +fn create_stm32h7_tc(request: &stm32h7::Request) -> CcsdsPacketCreatorOwned { + let req_raw = postcard::to_allocvec(&request).unwrap(); + let sp_header = SpHeader::new_from_apid(satrs_stm32f3_disco_rtic::APID); + CcsdsPacketCreatorOwned::new_tc_with_checksum(sp_header, &req_raw).unwrap() +} diff --git a/embedded-examples/embedded-client/src/lib.rs b/embedded-examples/embedded-client/src/lib.rs new file mode 100644 index 0000000..f8f852c --- /dev/null +++ b/embedded-examples/embedded-client/src/lib.rs @@ -0,0 +1,42 @@ +use std::{fs::File, io::Read as _, path::Path, time::SystemTime}; + +#[derive(Debug, serde::Deserialize)] +pub struct Config { + pub interface: Interface, +} + +#[derive(Debug, serde::Deserialize)] +pub struct Interface { + pub serial_port: String, +} + +impl Config { + pub fn new_from_file() -> Self { + let mut config_file = + File::open(Path::new("config.toml")).expect("opening config.toml file failed"); + let mut toml_str = String::new(); + config_file + .read_to_string(&mut toml_str) + .expect("reading config.toml file failed"); + let config: Config = toml::from_str(&toml_str).expect("parsing config.toml file failed"); + println!("Connecting to serial port {}", config.interface.serial_port); + config + } +} +pub fn setup_logger() -> Result<(), fern::InitError> { + fern::Dispatch::new() + .format(|out, message, record| { + out.finish(format_args!( + "[{} {} {}] {}", + humantime::format_rfc3339_seconds(SystemTime::now()), + record.level(), + record.target(), + message + )) + }) + .level(log::LevelFilter::Debug) + .chain(std::io::stdout()) + .chain(fern::log_file("output.log")?) + .apply()?; + Ok(()) +}