spp_rust/
data.rs

1use bitvec::prelude::*;
2
3#[derive(Debug, Default, Clone)]
4pub struct UserData<'a> {
5    data: &'a BitSlice<u8>,
6}
7
8impl<'a> UserData<'a> {
9    pub fn new(data: &'a BitSlice<u8>) -> Self {
10        Self { data }
11    }
12
13    fn len(&self) -> usize {
14        self.data.len()
15    }
16    fn to_bits(&self, _aux: &mut (&mut usize, &'a mut BitSlice<u8>)) {
17        _aux.1[*_aux.0..*_aux.0 + self.len()].copy_from_bitslice(self.data);
18        *_aux.0 += self.len();
19    }
20}
21
22
23#[derive(Debug, Default)]
24pub struct DataField<'a> {
25    sec_header: Option<&'a SecondaryHeader<'a>>, // WARN: 4.1.4.2.1.3 | See Notes 2
26    user_data: Option<&'a UserData<'a>>, // WARN: shall contain at least one octet.
27}
28
29impl<'a> DataField<'a> {
30    pub fn new() -> Self {
31        Self { sec_header: None, user_data: None, ..Default::default() }
32    }
33
34    pub fn len(&self) -> usize {
35        let ud_size = if let Some(s) = &self.user_data {
36            s.len()
37        } else {
38            0
39        };
40
41        let sh_size = if let Some(s) = &self.sec_header {
42            s.len()
43        } else {
44            0
45        };
46
47        sh_size + ud_size
48    }
49
50    pub fn user_data(&mut self, data: Option<&'a UserData>) {
51        self.user_data = data;
52    }
53
54    pub fn sec_header(&mut self, data: Option<&'a SecondaryHeader>) {
55        self.sec_header = data;
56    }
57
58    pub fn to_bits(&self, _aux: &mut (&mut usize, &'a mut BitSlice<u8>)) {
59        if let Some(sh) = self.sec_header {
60            sh.to_bits(_aux);
61        }
62        if let Some(ud) = self.user_data {
63            ud.to_bits(_aux);
64        }
65    }
66}
67
68// https://sanaregistry.org/r/space_packet_protocol_secondary_header_format_document : Still a canditate
69#[derive(Debug, Default)]
70pub struct SecondaryHeader<'a> {
71    time_code: Option<&'a BitSlice<u8>>, // TODO: Implement timecode formats See Note 4.1.4.2.2.2
72    ancillary: Option<&'a BitSlice<u8>>, // WARN: 4.1.4.3.2
73}
74
75impl<'a> SecondaryHeader<'a> {
76    pub fn new(time_code: Option<&'a BitSlice<u8>>, ancillary: Option<&'a BitSlice<u8>>) -> Self {
77        Self { time_code, ancillary, ..Default::default() }
78    }
79    pub fn len(&self) -> usize {
80        let tc_size = if let Some(s) = &self.time_code {
81            s.len()
82        } else {
83            0
84        };
85
86        let anc_size = if let Some(s) = &self.ancillary {
87            s.len()
88        } else {
89            0
90        };
91
92        tc_size + anc_size
93    }
94
95    fn to_bits(&self, _aux: &mut (&mut usize, &'a mut BitSlice<u8>)) {
96        let tc = self.time_code.unwrap_or_default();
97        let ac = self.ancillary.unwrap_or_default();
98
99
100        _aux.1[*_aux.0..tc.len()].copy_from_bitslice(tc);
101        _aux.1[*_aux.0 + tc.len()..].copy_from_bitslice(ac);
102        *_aux.0 += self.len();
103    }
104}
105