From 9bbd2cdad1ef756f23f1e0cc3d0afef91dcc2a1c Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 26 Jul 2023 22:27:02 +0200 Subject: [PATCH] continue dest handler --- satrs-core/Cargo.toml | 2 +- satrs-core/src/cfdp/dest.rs | 64 +++++++++++++++++++++++++++++++++---- satrs-core/src/cfdp/mod.rs | 4 +-- 3 files changed, 60 insertions(+), 10 deletions(-) diff --git a/satrs-core/Cargo.toml b/satrs-core/Cargo.toml index 29d4122..f342f95 100644 --- a/satrs-core/Cargo.toml +++ b/satrs-core/Cargo.toml @@ -64,7 +64,7 @@ optional = true # version = "0.6" # path = "../spacepackets" git = "https://egit.irs.uni-stuttgart.de/rust/spacepackets.git" -rev = "62df510147b" +rev = "041959e546e6e72b24eb50986c425a924015e3f4" default-features = false [dev-dependencies] diff --git a/satrs-core/src/cfdp/dest.rs b/satrs-core/src/cfdp/dest.rs index a58a2e3..d8848b6 100644 --- a/satrs-core/src/cfdp/dest.rs +++ b/satrs-core/src/cfdp/dest.rs @@ -1,13 +1,29 @@ use super::{State, TransactionStep}; use spacepackets::cfdp::{ - pdu::{CommonPduConfig, FileDirectiveType}, + pdu::{metadata::MetadataPdu, CommonPduConfig, FileDirectiveType, PduError}, PduType, }; pub struct DestinationHandler { step: TransactionStep, state: State, - //pdu_conf: CommonPduConfig, + pdu_conf: CommonPduConfig, +} + +#[derive(Debug, PartialEq, Eq, Clone, Copy)] +pub enum DestError { + /// File directive expected, but none specified + DirectiveExpected, + CantProcessPacketType(FileDirectiveType), + // Received new metadata PDU while being already being busy with a file transfer. + RecvdMetadataButIsBusy, + Pdu(PduError), +} + +impl From for DestError { + fn from(value: PduError) -> Self { + Self::Pdu(value) + } } impl DestinationHandler { @@ -15,7 +31,7 @@ impl DestinationHandler { Self { step: TransactionStep::Idle, state: State::Idle, - //pdu_conf: CommonPduConfig::new_with_defaults(), + pdu_conf: CommonPduConfig::new_with_defaults(), } } @@ -24,11 +40,11 @@ impl DestinationHandler { pdu_type: PduType, pdu_directive: Option, raw_packet: &[u8], - ) -> Result<(), ()> { + ) -> Result<(), DestError> { match pdu_type { PduType::FileDirective => { if pdu_directive.is_none() { - return Err(()); + return Err(DestError::DirectiveExpected); } self.handle_file_directive(pdu_directive.unwrap(), raw_packet) } @@ -36,7 +52,7 @@ impl DestinationHandler { } } - pub fn handle_file_data(&mut self, raw_packet: &[u8]) -> Result<(), ()> { + pub fn handle_file_data(&mut self, raw_packet: &[u8]) -> Result<(), DestError> { Ok(()) } @@ -44,7 +60,16 @@ impl DestinationHandler { &mut self, pdu_directive: FileDirectiveType, raw_packet: &[u8], - ) -> Result<(), ()> { + ) -> Result<(), DestError> { + match pdu_directive { + FileDirectiveType::EofPdu => todo!(), + FileDirectiveType::FinishedPdu => todo!(), + FileDirectiveType::AckPdu => todo!(), + FileDirectiveType::MetadataPdu => self.handle_metadata_pdu(raw_packet), + FileDirectiveType::NakPdu => todo!(), + FileDirectiveType::PromptPdu => todo!(), + FileDirectiveType::KeepAlivePdu => todo!(), + }; Ok(()) } @@ -56,6 +81,19 @@ impl DestinationHandler { } } + pub fn handle_metadata_pdu(&mut self, raw_packet: &[u8]) -> Result<(), DestError> { + if self.state != State::Idle { + return Err(DestError::RecvdMetadataButIsBusy); + } + let metadata_pdu = MetadataPdu::from_bytes(raw_packet)?; + + Ok(()) + } + + pub fn handle_eof_pdu(&mut self, raw_packet: &[u8]) -> Result<(), DestError> { + Ok(()) + } + fn fsm_nacked(&self) { match self.step { TransactionStep::Idle => { @@ -80,3 +118,15 @@ impl DestinationHandler { self.state } } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_basic() { + let dest_handler = DestinationHandler::new(); + assert_eq!(dest_handler.state(), State::Idle); + assert_eq!(dest_handler.step(), TransactionStep::Idle); + } +} diff --git a/satrs-core/src/cfdp/mod.rs b/satrs-core/src/cfdp/mod.rs index 811c820..1cad510 100644 --- a/satrs-core/src/cfdp/mod.rs +++ b/satrs-core/src/cfdp/mod.rs @@ -1,6 +1,6 @@ pub mod dest; -#[derive(Copy, Clone, PartialEq, Eq)] +#[derive(Debug, Copy, Clone, PartialEq, Eq)] pub enum TransactionStep { Idle = 0, TransactionStart = 1, @@ -10,7 +10,7 @@ pub enum TransactionStep { SendingFinishedPdu = 5, } -#[derive(Copy, Clone, PartialEq, Eq)] +#[derive(Debug, Copy, Clone, PartialEq, Eq)] pub enum State { Idle = 0, BusyClass1Nacked = 2,