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#[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 }