dash7/file/
mod.rs

1use deku::{
2    bitvec::{BitView, Msb0},
3    prelude::*,
4};
5
6mod access_profile;
7mod dll_config;
8mod dll_status;
9mod engineering_mode;
10mod factory_settings;
11mod firmware_version;
12mod interface_configuration;
13mod phy_status;
14mod security_key;
15
16pub use access_profile::AccessProfile;
17pub use dll_config::DllConfig;
18pub use dll_status::DllStatus;
19pub use engineering_mode::{EngineeringMode, EngineeringModeMethod};
20pub use factory_settings::FactorySettings;
21pub use firmware_version::FirmwareVersion;
22pub use interface_configuration::InterfaceConfiguration;
23pub use phy_status::PhyStatus;
24pub use security_key::SecurityKey;
25
26use crate::{
27    network::{Address, AddressType},
28    utils::pad_rest,
29};
30
31#[derive(DekuRead, DekuWrite, Debug, Clone, PartialEq)]
32#[deku(type = "u8", bits = "8")]
33pub enum FileId {
34    #[deku(id = "0x00")]
35    Uid,
36    #[deku(id = "0x01")]
37    FactorySettings,
38    #[deku(id = "0x02")]
39    FirmwareVersion,
40    #[deku(id = "0x03")]
41    DeviceCapacity,
42    #[deku(id = "0x04")]
43    DeviceStatus,
44    #[deku(id = "0x05")]
45    EngineeringMode,
46    #[deku(id = "0x06")]
47    Vid,
48    #[deku(id = "0x08")]
49    PhyConfig,
50    #[deku(id = "0x09")]
51    PhyStatus,
52    #[deku(id = "0x0A")]
53    DllConfig,
54    #[deku(id = "0x0B")]
55    DllStatus,
56    #[deku(id = "0x0C")]
57    NetworkRouting,
58    #[deku(id = "0x0D")]
59    NetworkSecurity,
60    #[deku(id = "0x0E")]
61    NetworkSecurityKey,
62    #[deku(id = "0x0F")]
63    NetworkSsr,
64    #[deku(id = "0x10")]
65    NetworkStatus,
66    #[deku(id = "0x11")]
67    TrlStatus,
68    #[deku(id = "0x12")]
69    SelConfig,
70    #[deku(id = "0x13")]
71    FofStatus,
72    #[deku(id_pat = "0x07 | 0x14..=0x16")]
73    Rfu,
74    #[deku(id = "0x17")]
75    LocationData,
76    #[deku(id = "0x18")]
77    RootKey,
78    #[deku(id = "0x19")]
79    UserKey,
80    #[deku(id = "0x1B")]
81    SensorDescription,
82    #[deku(id = "0x1C")]
83    Rtc,
84    #[deku(id_pat = "0x1D..=0x1F")]
85    D7AalpRfu,
86    #[deku(id = "0x20")]
87    AccessProfile00,
88    #[deku(id = "0x21")]
89    AccessProfile01,
90    #[deku(id = "0x22")]
91    AccessProfile02,
92    #[deku(id = "0x23")]
93    AccessProfile03,
94    #[deku(id = "0x24")]
95    AccessProfile04,
96    #[deku(id = "0x25")]
97    AccessProfile05,
98    #[deku(id = "0x26")]
99    AccessProfile06,
100    #[deku(id = "0x27")]
101    AccessProfile07,
102    #[deku(id = "0x28")]
103    AccessProfile08,
104    #[deku(id = "0x29")]
105    AccessProfile09,
106    #[deku(id = "0x2A")]
107    AccessProfile10,
108    #[deku(id = "0x2B")]
109    AccessProfile11,
110    #[deku(id = "0x2C")]
111    AccessProfile12,
112    #[deku(id = "0x2D")]
113    AccessProfile13,
114    #[deku(id = "0x2E")]
115    AccessProfile14,
116    #[deku(id_pat = "_")]
117    Other,
118}
119
120impl TryFrom<u8> for FileId {
121    type Error = DekuError;
122
123    fn try_from(value: u8) -> Result<Self, Self::Error> {
124        Ok(Self::read(value.view_bits(), ())?.1)
125    }
126}
127
128impl Into<u8> for FileId {
129    fn into(self) -> u8 {
130        self.deku_id().unwrap()
131    }
132}
133
134pub trait SystemFile {
135    const ID: u8;
136    const SIZE: u32;
137}
138
139/// File IDs 0x00-0x17 and 0x20-0x2F are reserved by the DASH7 spec.
140/// File IDs 0x18-0x1F Reserved for D7AALP.
141/// File IDs 0x20+I with I in [0, 14] are reserved for Access Profiles.
142#[derive(DekuRead, DekuWrite, Debug, Clone, PartialEq)]
143#[deku(
144    ctx = "file_id: FileId, length: u32",
145    id = "file_id",
146    ctx_default = "FileId::Other, 0"
147)]
148pub enum File {
149    #[deku(id = "FileId::AccessProfile00")]
150    AccessProfile00(AccessProfile<0>),
151    #[deku(id = "FileId::AccessProfile01")]
152    AccessProfile01(AccessProfile<1>),
153    #[deku(id = "FileId::AccessProfile02")]
154    AccessProfile02(AccessProfile<2>),
155    #[deku(id = "FileId::AccessProfile03")]
156    AccessProfile03(AccessProfile<3>),
157    #[deku(id = "FileId::AccessProfile04")]
158    AccessProfile04(AccessProfile<4>),
159    #[deku(id = "FileId::AccessProfile05")]
160    AccessProfile05(AccessProfile<5>),
161    #[deku(id = "FileId::AccessProfile06")]
162    AccessProfile06(AccessProfile<6>),
163    #[deku(id = "FileId::AccessProfile07")]
164    AccessProfile07(AccessProfile<7>),
165    #[deku(id = "FileId::AccessProfile08")]
166    AccessProfile08(AccessProfile<8>),
167    #[deku(id = "FileId::AccessProfile09")]
168    AccessProfile09(AccessProfile<9>),
169    #[deku(id = "FileId::AccessProfile10")]
170    AccessProfile10(AccessProfile<10>),
171    #[deku(id = "FileId::AccessProfile11")]
172    AccessProfile11(AccessProfile<11>),
173    #[deku(id = "FileId::AccessProfile12")]
174    AccessProfile12(AccessProfile<12>),
175    #[deku(id = "FileId::AccessProfile13")]
176    AccessProfile13(AccessProfile<13>),
177    #[deku(id = "FileId::AccessProfile14")]
178    AccessProfile14(AccessProfile<14>),
179
180    #[deku(id = "FileId::Uid")]
181    Uid(#[deku(ctx = "AddressType::Uid")] Address),
182
183    #[deku(id = "FileId::FactorySettings")]
184    FactorySettings(FactorySettings),
185
186    #[deku(id = "FileId::FirmwareVersion")]
187    FirmwareVersion(FirmwareVersion),
188
189    #[deku(id = "FileId::EngineeringMode")]
190    EngineeringMode(EngineeringMode),
191
192    #[deku(id = "FileId::Vid")]
193    Vid(#[deku(ctx = "AddressType::Vid")] Address),
194
195    #[deku(id = "FileId::PhyStatus")]
196    PhyStatus(PhyStatus),
197
198    #[deku(id = "FileId::DllConfig")]
199    DllConfig(DllConfig),
200
201    #[deku(id = "FileId::DllStatus")]
202    DllStatus(DllStatus),
203
204    #[deku(id = "FileId::NetworkSecurityKey")]
205    NwlSecurityKey(SecurityKey),
206
207    #[deku(id_pat = "_")]
208    Other(#[deku(count = "length")] Vec<u8>),
209}
210
211impl File {
212    pub fn from_bytes<'a>(
213        input: (&'a [u8], usize),
214        file_id: FileId,
215        length: u32,
216    ) -> Result<((&'a [u8], usize), Self), DekuError> {
217        let input_bits = input.0.view_bits::<Msb0>();
218        let (rest, value) = Self::read(&input_bits[input.1..], (file_id, length))?;
219
220        Ok((pad_rest(input_bits, rest), value))
221    }
222
223    // fn to_bytes(&self) -> Result<Vec<u8>, DekuError> {
224    //     let output = self.to_bits()?;
225    //     Ok(output.into_vec())
226    // }
227
228    // fn to_bits(&self) -> Result<BitVec<u8, Msb0>, DekuError> {
229    //     let mut output: BitVec<u8, Msb0> = BitVec::new();
230    //     self.write(&mut output, u32::MAX)?;
231    //     Ok(output)
232    // }
233}