satrs_core/cfdp/
user.rs

1use spacepackets::{
2    cfdp::{
3        pdu::{
4            file_data::SegmentMetadata,
5            finished::{DeliveryCode, FileStatus},
6        },
7        tlv::{msg_to_user::MsgToUserTlv, WritableTlv},
8        ConditionCode,
9    },
10    util::UnsignedByteField,
11};
12
13use super::TransactionId;
14
15#[derive(Debug, Copy, Clone)]
16pub struct TransactionFinishedParams {
17    pub id: TransactionId,
18    pub condition_code: ConditionCode,
19    pub delivery_code: DeliveryCode,
20    pub file_status: FileStatus,
21}
22
23#[derive(Debug)]
24pub struct MetadataReceivedParams<'src_file, 'dest_file, 'msgs_to_user> {
25    pub id: TransactionId,
26    pub source_id: UnsignedByteField,
27    pub file_size: u64,
28    pub src_file_name: &'src_file str,
29    pub dest_file_name: &'dest_file str,
30    pub msgs_to_user: &'msgs_to_user [MsgToUserTlv<'msgs_to_user>],
31}
32
33#[cfg(feature = "alloc")]
34#[derive(Debug)]
35pub struct OwnedMetadataRecvdParams {
36    pub id: TransactionId,
37    pub source_id: UnsignedByteField,
38    pub file_size: u64,
39    pub src_file_name: alloc::string::String,
40    pub dest_file_name: alloc::string::String,
41    pub msgs_to_user: alloc::vec::Vec<alloc::vec::Vec<u8>>,
42}
43
44#[cfg(feature = "alloc")]
45impl From<MetadataReceivedParams<'_, '_, '_>> for OwnedMetadataRecvdParams {
46    fn from(value: MetadataReceivedParams) -> Self {
47        Self::from(&value)
48    }
49}
50
51#[cfg(feature = "alloc")]
52impl From<&MetadataReceivedParams<'_, '_, '_>> for OwnedMetadataRecvdParams {
53    fn from(value: &MetadataReceivedParams) -> Self {
54        Self {
55            id: value.id,
56            source_id: value.source_id,
57            file_size: value.file_size,
58            src_file_name: value.src_file_name.into(),
59            dest_file_name: value.dest_file_name.into(),
60            msgs_to_user: value.msgs_to_user.iter().map(|tlv| tlv.to_vec()).collect(),
61        }
62    }
63}
64
65#[derive(Debug)]
66pub struct FileSegmentRecvdParams<'seg_meta> {
67    pub id: TransactionId,
68    pub offset: u64,
69    pub length: usize,
70    pub segment_metadata: Option<&'seg_meta SegmentMetadata<'seg_meta>>,
71}
72
73pub trait CfdpUser {
74    fn transaction_indication(&mut self, id: &TransactionId);
75    fn eof_sent_indication(&mut self, id: &TransactionId);
76    fn transaction_finished_indication(&mut self, finished_params: &TransactionFinishedParams);
77    fn metadata_recvd_indication(&mut self, md_recvd_params: &MetadataReceivedParams);
78    fn file_segment_recvd_indication(&mut self, segment_recvd_params: &FileSegmentRecvdParams);
79    // TODO: The standard does not strictly specify how the report information looks..
80    fn report_indication(&mut self, id: &TransactionId);
81    fn suspended_indication(&mut self, id: &TransactionId, condition_code: ConditionCode);
82    fn resumed_indication(&mut self, id: &TransactionId, progress: u64);
83    fn fault_indication(
84        &mut self,
85        id: &TransactionId,
86        condition_code: ConditionCode,
87        progress: u64,
88    );
89    fn abandoned_indication(
90        &mut self,
91        id: &TransactionId,
92        condition_code: ConditionCode,
93        progress: u64,
94    );
95    fn eof_recvd_indication(&mut self, id: &TransactionId);
96}