lr2021/cmd/
cmd_ranging.rs1use crate::status::Status;
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq)]
7#[cfg_attr(feature = "defmt", derive(defmt::Format))]
8pub enum CheckLength {
9 Addr8b = 1,
10 Addr16b = 2,
11 Addr24b = 3,
12 Addr32b = 4,
13}
14
15#[derive(Debug, Clone, Copy, PartialEq, Eq)]
17#[cfg_attr(feature = "defmt", derive(defmt::Format))]
18pub enum RangingResKind {
19 LatestRaw = 0,
20 ExtendedRaw = 1,
21 GainSteps = 2,
22}
23
24pub fn set_ranging_addr_cmd(addr: u32, check_length: CheckLength) -> [u8; 7] {
26 let mut cmd = [0u8; 7];
27 cmd[0] = 0x02;
28 cmd[1] = 0x78;
29
30 cmd[2] |= ((addr >> 24) & 0xFF) as u8;
31 cmd[3] |= ((addr >> 16) & 0xFF) as u8;
32 cmd[4] |= ((addr >> 8) & 0xFF) as u8;
33 cmd[5] |= (addr & 0xFF) as u8;
34 cmd[6] |= (check_length as u8) & 0x7;
35 cmd
36}
37
38pub fn set_ranging_req_addr_cmd(req_addr: u32) -> [u8; 6] {
40 let mut cmd = [0u8; 6];
41 cmd[0] = 0x02;
42 cmd[1] = 0x79;
43
44 cmd[2] |= ((req_addr >> 24) & 0xFF) as u8;
45 cmd[3] |= ((req_addr >> 16) & 0xFF) as u8;
46 cmd[4] |= ((req_addr >> 8) & 0xFF) as u8;
47 cmd[5] |= (req_addr & 0xFF) as u8;
48 cmd
49}
50
51pub fn get_ranging_result_req(ranging_res_kind: RangingResKind) -> [u8; 3] {
53 let mut cmd = [0u8; 3];
54 cmd[0] = 0x02;
55 cmd[1] = 0x7A;
56
57 cmd[2] |= ranging_res_kind as u8;
58 cmd
59}
60
61
62
63
64
65pub fn set_ranging_tx_rx_delay_cmd(delay: u32) -> [u8; 6] {
67 let mut cmd = [0u8; 6];
68 cmd[0] = 0x02;
69 cmd[1] = 0x7B;
70
71 cmd[2] |= ((delay >> 24) & 0xFF) as u8;
72 cmd[3] |= ((delay >> 16) & 0xFF) as u8;
73 cmd[4] |= ((delay >> 8) & 0xFF) as u8;
74 cmd[5] |= (delay & 0xFF) as u8;
75 cmd
76}
77
78pub fn set_ranging_params_cmd(extended: bool, spy_mode: bool, nb_symbols: u8) -> [u8; 3] {
80 let mut cmd = [0u8; 3];
81 cmd[0] = 0x02;
82 cmd[1] = 0x7C;
83
84 if extended { cmd[2] |= 128; }
85 if spy_mode { cmd[2] |= 64; }
86 cmd[2] |= nb_symbols & 0x3F;
87 cmd
88}
89
90pub fn get_ranging_stats_req() -> [u8; 2] {
92 [0x02, 0x7D]
93}
94
95#[derive(Default)]
99pub struct RangingResultRsp([u8; 6]);
100
101impl RangingResultRsp {
102 pub fn new() -> Self {
104 Self::default()
105 }
106
107 pub fn status(&mut self) -> Status {
109 Status::from_slice(&self.0[..2])
110 }
111
112 pub fn rng(&self) -> i32 {
114 let raw = (self.0[4] as u32) |
115 ((self.0[3] as u32) << 8) |
116 ((self.0[2] as u32) << 16);
117 raw as i32 - if (self.0[2] & 0x80) != 0 {1<<24} else {0}
118 }
119
120 pub fn rssi(&self) -> u8 {
122 self.0[5]
123 }
124}
125
126impl AsMut<[u8]> for RangingResultRsp {
127 fn as_mut(&mut self) -> &mut [u8] {
128 &mut self.0
129 }
130}
131
132#[derive(Default)]
134pub struct RangingExtResultRsp([u8; 9]);
135
136impl RangingExtResultRsp {
137 pub fn new() -> Self {
139 Self::default()
140 }
141
142 pub fn status(&mut self) -> Status {
144 Status::from_slice(&self.0[..2])
145 }
146
147 pub fn rng1(&self) -> i32 {
149 let raw = (self.0[4] as u32) |
150 ((self.0[3] as u32) << 8) |
151 ((self.0[2] as u32) << 16);
152 raw as i32 - if (self.0[2] & 0x80) != 0 {1<<24} else {0}
153 }
154
155 pub fn rssi1(&self) -> u8 {
157 self.0[5]
158 }
159
160 pub fn rng2(&self) -> i32 {
162 let raw = (self.0[8] as u32) |
163 ((self.0[7] as u32) << 8) |
164 ((self.0[6] as u32) << 16);
165 raw as i32 - if (self.0[6] & 0x80) != 0 {1<<24} else {0}
166 }
167}
168
169impl AsMut<[u8]> for RangingExtResultRsp {
170 fn as_mut(&mut self) -> &mut [u8] {
171 &mut self.0
172 }
173}
174
175#[derive(Default)]
177pub struct RangingGainStepRsp([u8; 4]);
178
179impl RangingGainStepRsp {
180 pub fn new() -> Self {
182 Self::default()
183 }
184
185 pub fn status(&mut self) -> Status {
187 Status::from_slice(&self.0[..2])
188 }
189
190 pub fn gain1(&self) -> u8 {
192 self.0[2]
193 }
194
195 pub fn gain2(&self) -> u8 {
197 self.0[3]
198 }
199}
200
201impl AsMut<[u8]> for RangingGainStepRsp {
202 fn as_mut(&mut self) -> &mut [u8] {
203 &mut self.0
204 }
205}
206
207#[derive(Default)]
209pub struct RangingStatsRsp([u8; 12]);
210
211impl RangingStatsRsp {
212 pub fn new() -> Self {
214 Self::default()
215 }
216
217 pub fn status(&mut self) -> Status {
219 Status::from_slice(&self.0[..2])
220 }
221
222 pub fn exchange_valid(&self) -> u16 {
224 (self.0[3] as u16) |
225 ((self.0[2] as u16) << 8)
226 }
227
228 pub fn request_valid(&self) -> u16 {
230 (self.0[5] as u16) |
231 ((self.0[4] as u16) << 8)
232 }
233
234 pub fn response_done(&self) -> u16 {
236 (self.0[7] as u16) |
237 ((self.0[6] as u16) << 8)
238 }
239
240 pub fn timeout(&self) -> u16 {
242 (self.0[9] as u16) |
243 ((self.0[8] as u16) << 8)
244 }
245
246 pub fn request_discarded(&self) -> u16 {
248 (self.0[11] as u16) |
249 ((self.0[10] as u16) << 8)
250 }
251}
252
253impl AsMut<[u8]> for RangingStatsRsp {
254 fn as_mut(&mut self) -> &mut [u8] {
255 &mut self.0
256 }
257}