1#![allow(non_camel_case_types)]
2
3pub mod reactions;
4pub mod service;
5pub mod storage;
6
7#[derive(Copy, Clone, PartialEq, PartialOrd, Debug)]
13pub enum ParamValue {
14 Float(f32),
15 Int(i32),
16 Uint(u32),
17 Bool(bool),
18}
19
20pub struct ParamDefinition {
22 pub id: ParamId,
23 pub name: &'static str,
24 pub default: ParamValue,
25}
26
27macro_rules! declare_params {
31 (
32 $( $rust_id:ident, $name:literal, $type:ident($default:expr); )+
34 ) => {
35 #[derive(Copy, Clone, Eq, PartialEq, Debug)]
39 #[repr(u16)]
40 pub enum ParamId {
41 $( $rust_id, )+
42 }
43
44 impl ParamId {
48 pub fn as_str(&self) -> &'static str {
50 PARAM_DEFINITIONS[*self as usize].name
53 }
54
55 pub fn from_index(index: usize) -> Option<Self> {
57 PARAM_DEFINITIONS.get(index).map(|definition| definition.id)
58 }
59 }
60
61 pub const PARAMS_COUNT: usize = $( {let _ = stringify!($rust_id); 1} + )+ 0;
65
66 pub static PARAM_DEFINITIONS: [ParamDefinition; PARAMS_COUNT] = [
70 $(
71 ParamDefinition {
72 id: ParamId::$rust_id,
73 name: $name,
74 default: ParamValue::$type($default),
75 },
76 )+
77 ];
78
79 #[derive(Copy, Clone)]
83 pub struct Params {
84 values: [ParamValue; PARAMS_COUNT],
85 }
86
87 impl Params {
88 pub fn new() -> Self {
90 let mut params = Self {
91 values: [ParamValue::Int(0); PARAMS_COUNT],
92 };
93 params.set_defaults();
94 params
95 }
96
97 pub fn set_defaults(&mut self) {
99 for def in PARAM_DEFINITIONS.iter() {
100 self.values[def.id as usize] = def.default;
101 }
102 }
103
104 pub fn get_by_id(&self, id: ParamId) -> ParamValue {
106 self.values[id as usize]
107 }
108
109 pub fn set_by_id(&mut self, id: ParamId, value: ParamValue) {
111 self.values[id as usize] = value;
112 }
113
114 pub fn get_by_name(&self, name: &str) -> Option<ParamValue> {
116 PARAM_DEFINITIONS.iter().find(|d| d.name == name).map(|def| self.get_by_id(def.id))
117 }
118
119 pub fn set_by_name(&mut self, name: &str, value: ParamValue) -> bool {
121 if let Some(def) = PARAM_DEFINITIONS.iter().find(|d| d.name == name) {
122 self.set_by_id(def.id, value);
123 true
124 } else {
125 false
126 }
127 }
128 }
129
130 impl Default for Params {
131 fn default() -> Self {
132 Self::new()
133 }
134 }
135 };
136}
137
138declare_params! {
142 PARAM_BAUD_RATE, "BAUD_RATE", Int(921600);
144 PARAM_SERIAL_DEVICE, "SERIAL_DEVICE", Int(0);
145 PARAM_NUM_MOTORS, "NUM_MOTORS", Int(4);
146 PARAM_MOTOR_RESISTANCE, "MOTOR_RESISTANCE", Float(0.042);
147 PARAM_MOTOR_KV, "MOTOR_KV", Float(0.01706);
148 PARAM_NO_LOAD_CURRENT, "NO_LOAD_CURRENT", Float(1.5);
149 PARAM_PROP_DIAMETER, "PROP_DIAMETER", Float(0.381);
150 PARAM_PROP_CT, "PROP_CT", Float(0.075);
151 PARAM_PROP_CQ, "PROP_CQ", Float(0.0045);
152 PARAM_VOLT_MAX, "BATT_VOLT_MAX", Float(25.0);
153 PARAM_USE_MOTOR_PARAMETERS, "USE_MOTOR_PARAM", Int(0);
154 PARAM_PRIMARY_MIXER_OUTPUT_0, "PRI_MIXER_OUT_0", Int(0);
155 PARAM_PRIMARY_MIXER_OUTPUT_1, "PRI_MIXER_OUT_1", Int(0);
156 PARAM_PRIMARY_MIXER_OUTPUT_2, "PRI_MIXER_OUT_2", Int(0);
157 PARAM_PRIMARY_MIXER_OUTPUT_3, "PRI_MIXER_OUT_3", Int(0);
158 PARAM_PRIMARY_MIXER_OUTPUT_4, "PRI_MIXER_OUT_4", Int(0);
159 PARAM_PRIMARY_MIXER_OUTPUT_5, "PRI_MIXER_OUT_5", Int(0);
160 PARAM_PRIMARY_MIXER_OUTPUT_6, "PRI_MIXER_OUT_6", Int(0);
161 PARAM_PRIMARY_MIXER_OUTPUT_7, "PRI_MIXER_OUT_7", Int(0);
162 PARAM_PRIMARY_MIXER_OUTPUT_8, "PRI_MIXER_OUT_8", Int(0);
163 PARAM_PRIMARY_MIXER_OUTPUT_9, "PRI_MIXER_OUT_9", Int(0);
164 PARAM_PRIMARY_MIXER_PWM_RATE_0, "PRI_MIXER_PWM_0", Float(0.0);
165 PARAM_PRIMARY_MIXER_PWM_RATE_1, "PRI_MIXER_PWM_1", Float(0.0);
166 PARAM_PRIMARY_MIXER_PWM_RATE_2, "PRI_MIXER_PWM_2", Float(0.0);
167 PARAM_PRIMARY_MIXER_PWM_RATE_3, "PRI_MIXER_PWM_3", Float(0.0);
168 PARAM_PRIMARY_MIXER_PWM_RATE_4, "PRI_MIXER_PWM_4", Float(0.0);
169 PARAM_PRIMARY_MIXER_PWM_RATE_5, "PRI_MIXER_PWM_5", Float(0.0);
170 PARAM_PRIMARY_MIXER_PWM_RATE_6, "PRI_MIXER_PWM_6", Float(0.0);
171 PARAM_PRIMARY_MIXER_PWM_RATE_7, "PRI_MIXER_PWM_7", Float(0.0);
172 PARAM_PRIMARY_MIXER_PWM_RATE_8, "PRI_MIXER_PWM_8", Float(0.0);
173 PARAM_PRIMARY_MIXER_PWM_RATE_9, "PRI_MIXER_PWM_9", Float(0.0);
174 PARAM_PRIMARY_MIXER_0_0, "PRI_MIXER_0_0", Float(0.0);
175 PARAM_PRIMARY_MIXER_1_0, "PRI_MIXER_1_0", Float(0.0);
176 PARAM_PRIMARY_MIXER_2_0, "PRI_MIXER_2_0", Float(0.0);
177 PARAM_PRIMARY_MIXER_3_0, "PRI_MIXER_3_0", Float(0.0);
178 PARAM_PRIMARY_MIXER_4_0, "PRI_MIXER_4_0", Float(0.0);
179 PARAM_PRIMARY_MIXER_5_0, "PRI_MIXER_5_0", Float(0.0);
180 PARAM_PRIMARY_MIXER_6_0, "PRI_MIXER_6_0", Float(0.0);
181 PARAM_PRIMARY_MIXER_7_0, "PRI_MIXER_7_0", Float(0.0);
182 PARAM_PRIMARY_MIXER_8_0, "PRI_MIXER_8_0", Float(0.0);
183 PARAM_PRIMARY_MIXER_9_0, "PRI_MIXER_9_0", Float(0.0);
184 PARAM_PRIMARY_MIXER_0_1, "PRI_MIXER_0_1", Float(0.0);
185 PARAM_PRIMARY_MIXER_1_1, "PRI_MIXER_1_1", Float(0.0);
186 PARAM_PRIMARY_MIXER_2_1, "PRI_MIXER_2_1", Float(0.0);
187 PARAM_PRIMARY_MIXER_3_1, "PRI_MIXER_3_1", Float(0.0);
188 PARAM_PRIMARY_MIXER_4_1, "PRI_MIXER_4_1", Float(0.0);
189 PARAM_PRIMARY_MIXER_5_1, "PRI_MIXER_5_1", Float(0.0);
190 PARAM_PRIMARY_MIXER_6_1, "PRI_MIXER_6_1", Float(0.0);
191 PARAM_PRIMARY_MIXER_7_1, "PRI_MIXER_7_1", Float(0.0);
192 PARAM_PRIMARY_MIXER_8_1, "PRI_MIXER_8_1", Float(0.0);
193 PARAM_PRIMARY_MIXER_9_1, "PRI_MIXER_9_1", Float(0.0);
194 PARAM_PRIMARY_MIXER_0_2, "PRI_MIXER_0_2", Float(0.0);
195 PARAM_PRIMARY_MIXER_1_2, "PRI_MIXER_1_2", Float(0.0);
196 PARAM_PRIMARY_MIXER_2_2, "PRI_MIXER_2_2", Float(0.0);
197 PARAM_PRIMARY_MIXER_3_2, "PRI_MIXER_3_2", Float(0.0);
198 PARAM_PRIMARY_MIXER_4_2, "PRI_MIXER_4_2", Float(0.0);
199 PARAM_PRIMARY_MIXER_5_2, "PRI_MIXER_5_2", Float(0.0);
200 PARAM_PRIMARY_MIXER_6_2, "PRI_MIXER_6_2", Float(0.0);
201 PARAM_PRIMARY_MIXER_7_2, "PRI_MIXER_7_2", Float(0.0);
202 PARAM_PRIMARY_MIXER_8_2, "PRI_MIXER_8_2", Float(0.0);
203 PARAM_PRIMARY_MIXER_9_2, "PRI_MIXER_9_2", Float(0.0);
204 PARAM_PRIMARY_MIXER_0_3, "PRI_MIXER_0_3", Float(0.0);
205 PARAM_PRIMARY_MIXER_1_3, "PRI_MIXER_1_3", Float(0.0);
206 PARAM_PRIMARY_MIXER_2_3, "PRI_MIXER_2_3", Float(0.0);
207 PARAM_PRIMARY_MIXER_3_3, "PRI_MIXER_3_3", Float(0.0);
208 PARAM_PRIMARY_MIXER_4_3, "PRI_MIXER_4_3", Float(0.0);
209 PARAM_PRIMARY_MIXER_5_3, "PRI_MIXER_5_3", Float(0.0);
210 PARAM_PRIMARY_MIXER_6_3, "PRI_MIXER_6_3", Float(0.0);
211 PARAM_PRIMARY_MIXER_7_3, "PRI_MIXER_7_3", Float(0.0);
212 PARAM_PRIMARY_MIXER_8_3, "PRI_MIXER_8_3", Float(0.0);
213 PARAM_PRIMARY_MIXER_9_3, "PRI_MIXER_9_3", Float(0.0);
214 PARAM_PRIMARY_MIXER_0_4, "PRI_MIXER_0_4", Float(0.0);
215 PARAM_PRIMARY_MIXER_1_4, "PRI_MIXER_1_4", Float(0.0);
216 PARAM_PRIMARY_MIXER_2_4, "PRI_MIXER_2_4", Float(0.0);
217 PARAM_PRIMARY_MIXER_3_4, "PRI_MIXER_3_4", Float(0.0);
218 PARAM_PRIMARY_MIXER_4_4, "PRI_MIXER_4_4", Float(0.0);
219 PARAM_PRIMARY_MIXER_5_4, "PRI_MIXER_5_4", Float(0.0);
220 PARAM_PRIMARY_MIXER_6_4, "PRI_MIXER_6_4", Float(0.0);
221 PARAM_PRIMARY_MIXER_7_4, "PRI_MIXER_7_4", Float(0.0);
222 PARAM_PRIMARY_MIXER_8_4, "PRI_MIXER_8_4", Float(0.0);
223 PARAM_PRIMARY_MIXER_9_4, "PRI_MIXER_9_4", Float(0.0);
224 PARAM_PRIMARY_MIXER_0_5, "PRI_MIXER_0_5", Float(0.0);
225 PARAM_PRIMARY_MIXER_1_5, "PRI_MIXER_1_5", Float(0.0);
226 PARAM_PRIMARY_MIXER_2_5, "PRI_MIXER_2_5", Float(0.0);
227 PARAM_PRIMARY_MIXER_3_5, "PRI_MIXER_3_5", Float(0.0);
228 PARAM_PRIMARY_MIXER_4_5, "PRI_MIXER_4_5", Float(0.0);
229 PARAM_PRIMARY_MIXER_5_5, "PRI_MIXER_5_5", Float(0.0);
230 PARAM_PRIMARY_MIXER_6_5, "PRI_MIXER_6_5", Float(0.0);
231 PARAM_PRIMARY_MIXER_7_5, "PRI_MIXER_7_5", Float(0.0);
232 PARAM_PRIMARY_MIXER_8_5, "PRI_MIXER_8_5", Float(0.0);
233 PARAM_PRIMARY_MIXER_9_5, "PRI_MIXER_9_5", Float(0.0);
234 PARAM_PRIMARY_MIXER_0_6, "PRI_MIXER_0_6", Float(0.0);
235 PARAM_PRIMARY_MIXER_1_6, "PRI_MIXER_1_6", Float(0.0);
236 PARAM_PRIMARY_MIXER_2_6, "PRI_MIXER_2_6", Float(0.0);
237 PARAM_PRIMARY_MIXER_3_6, "PRI_MIXER_3_6", Float(0.0);
238 PARAM_PRIMARY_MIXER_4_6, "PRI_MIXER_4_6", Float(0.0);
239 PARAM_PRIMARY_MIXER_5_6, "PRI_MIXER_5_6", Float(0.0);
240 PARAM_PRIMARY_MIXER_6_6, "PRI_MIXER_6_6", Float(0.0);
241 PARAM_PRIMARY_MIXER_7_6, "PRI_MIXER_7_6", Float(0.0);
242 PARAM_PRIMARY_MIXER_8_6, "PRI_MIXER_8_6", Float(0.0);
243 PARAM_PRIMARY_MIXER_9_6, "PRI_MIXER_9_6", Float(0.0);
244 PARAM_PRIMARY_MIXER_0_7, "PRI_MIXER_0_7", Float(0.0);
245 PARAM_PRIMARY_MIXER_1_7, "PRI_MIXER_1_7", Float(0.0);
246 PARAM_PRIMARY_MIXER_2_7, "PRI_MIXER_2_7", Float(0.0);
247 PARAM_PRIMARY_MIXER_3_7, "PRI_MIXER_3_7", Float(0.0);
248 PARAM_PRIMARY_MIXER_4_7, "PRI_MIXER_4_7", Float(0.0);
249 PARAM_PRIMARY_MIXER_5_7, "PRI_MIXER_5_7", Float(0.0);
250 PARAM_PRIMARY_MIXER_6_7, "PRI_MIXER_6_7", Float(0.0);
251 PARAM_PRIMARY_MIXER_7_7, "PRI_MIXER_7_7", Float(0.0);
252 PARAM_PRIMARY_MIXER_8_7, "PRI_MIXER_8_7", Float(0.0);
253 PARAM_PRIMARY_MIXER_9_7, "PRI_MIXER_9_7", Float(0.0);
254 PARAM_PRIMARY_MIXER_0_8, "PRI_MIXER_0_8", Float(0.0);
255 PARAM_PRIMARY_MIXER_1_8, "PRI_MIXER_1_8", Float(0.0);
256 PARAM_PRIMARY_MIXER_2_8, "PRI_MIXER_2_8", Float(0.0);
257 PARAM_PRIMARY_MIXER_3_8, "PRI_MIXER_3_8", Float(0.0);
258 PARAM_PRIMARY_MIXER_4_8, "PRI_MIXER_4_8", Float(0.0);
259 PARAM_PRIMARY_MIXER_5_8, "PRI_MIXER_5_8", Float(0.0);
260 PARAM_PRIMARY_MIXER_6_8, "PRI_MIXER_6_8", Float(0.0);
261 PARAM_PRIMARY_MIXER_7_8, "PRI_MIXER_7_8", Float(0.0);
262 PARAM_PRIMARY_MIXER_8_8, "PRI_MIXER_8_8", Float(0.0);
263 PARAM_PRIMARY_MIXER_9_8, "PRI_MIXER_9_8", Float(0.0);
264 PARAM_PRIMARY_MIXER_0_9, "PRI_MIXER_0_9", Float(0.0);
265 PARAM_PRIMARY_MIXER_1_9, "PRI_MIXER_1_9", Float(0.0);
266 PARAM_PRIMARY_MIXER_2_9, "PRI_MIXER_2_9", Float(0.0);
267 PARAM_PRIMARY_MIXER_3_9, "PRI_MIXER_3_9", Float(0.0);
268 PARAM_PRIMARY_MIXER_4_9, "PRI_MIXER_4_9", Float(0.0);
269 PARAM_PRIMARY_MIXER_5_9, "PRI_MIXER_5_9", Float(0.0);
270 PARAM_PRIMARY_MIXER_6_9, "PRI_MIXER_6_9", Float(0.0);
271 PARAM_PRIMARY_MIXER_7_9, "PRI_MIXER_7_9", Float(0.0);
272 PARAM_PRIMARY_MIXER_8_9, "PRI_MIXER_8_9", Float(0.0);
273 PARAM_PRIMARY_MIXER_9_9, "PRI_MIXER_9_9", Float(0.0);
274 PARAM_SECONDARY_MIXER_0_0, "SEC_MIXER_0_0", Float(0.0);
275 PARAM_SECONDARY_MIXER_1_0, "SEC_MIXER_1_0", Float(0.0);
276 PARAM_SECONDARY_MIXER_2_0, "SEC_MIXER_2_0", Float(0.0);
277 PARAM_SECONDARY_MIXER_3_0, "SEC_MIXER_3_0", Float(0.0);
278 PARAM_SECONDARY_MIXER_4_0, "SEC_MIXER_4_0", Float(0.0);
279 PARAM_SECONDARY_MIXER_5_0, "SEC_MIXER_5_0", Float(0.0);
280 PARAM_SECONDARY_MIXER_6_0, "SEC_MIXER_6_0", Float(0.0);
281 PARAM_SECONDARY_MIXER_7_0, "SEC_MIXER_7_0", Float(0.0);
282 PARAM_SECONDARY_MIXER_8_0, "SEC_MIXER_8_0", Float(0.0);
283 PARAM_SECONDARY_MIXER_9_0, "SEC_MIXER_9_0", Float(0.0);
284 PARAM_SECONDARY_MIXER_0_1, "SEC_MIXER_0_1", Float(0.0);
285 PARAM_SECONDARY_MIXER_1_1, "SEC_MIXER_1_1", Float(0.0);
286 PARAM_SECONDARY_MIXER_2_1, "SEC_MIXER_2_1", Float(0.0);
287 PARAM_SECONDARY_MIXER_3_1, "SEC_MIXER_3_1", Float(0.0);
288 PARAM_SECONDARY_MIXER_4_1, "SEC_MIXER_4_1", Float(0.0);
289 PARAM_SECONDARY_MIXER_5_1, "SEC_MIXER_5_1", Float(0.0);
290 PARAM_SECONDARY_MIXER_6_1, "SEC_MIXER_6_1", Float(0.0);
291 PARAM_SECONDARY_MIXER_7_1, "SEC_MIXER_7_1", Float(0.0);
292 PARAM_SECONDARY_MIXER_8_1, "SEC_MIXER_8_1", Float(0.0);
293 PARAM_SECONDARY_MIXER_9_1, "SEC_MIXER_9_1", Float(0.0);
294 PARAM_SECONDARY_MIXER_0_2, "SEC_MIXER_0_2", Float(0.0);
295 PARAM_SECONDARY_MIXER_1_2, "SEC_MIXER_1_2", Float(0.0);
296 PARAM_SECONDARY_MIXER_2_2, "SEC_MIXER_2_2", Float(0.0);
297 PARAM_SECONDARY_MIXER_3_2, "SEC_MIXER_3_2", Float(0.0);
298 PARAM_SECONDARY_MIXER_4_2, "SEC_MIXER_4_2", Float(0.0);
299 PARAM_SECONDARY_MIXER_5_2, "SEC_MIXER_5_2", Float(0.0);
300 PARAM_SECONDARY_MIXER_6_2, "SEC_MIXER_6_2", Float(0.0);
301 PARAM_SECONDARY_MIXER_7_2, "SEC_MIXER_7_2", Float(0.0);
302 PARAM_SECONDARY_MIXER_8_2, "SEC_MIXER_8_2", Float(0.0);
303 PARAM_SECONDARY_MIXER_9_2, "SEC_MIXER_9_2", Float(0.0);
304 PARAM_SECONDARY_MIXER_0_3, "SEC_MIXER_0_3", Float(0.0);
305 PARAM_SECONDARY_MIXER_1_3, "SEC_MIXER_1_3", Float(0.0);
306 PARAM_SECONDARY_MIXER_2_3, "SEC_MIXER_2_3", Float(0.0);
307 PARAM_SECONDARY_MIXER_3_3, "SEC_MIXER_3_3", Float(0.0);
308 PARAM_SECONDARY_MIXER_4_3, "SEC_MIXER_4_3", Float(0.0);
309 PARAM_SECONDARY_MIXER_5_3, "SEC_MIXER_5_3", Float(0.0);
310 PARAM_SECONDARY_MIXER_6_3, "SEC_MIXER_6_3", Float(0.0);
311 PARAM_SECONDARY_MIXER_7_3, "SEC_MIXER_7_3", Float(0.0);
312 PARAM_SECONDARY_MIXER_8_3, "SEC_MIXER_8_3", Float(0.0);
313 PARAM_SECONDARY_MIXER_9_3, "SEC_MIXER_9_3", Float(0.0);
314 PARAM_SECONDARY_MIXER_0_4, "SEC_MIXER_0_4", Float(0.0);
315 PARAM_SECONDARY_MIXER_1_4, "SEC_MIXER_1_4", Float(0.0);
316 PARAM_SECONDARY_MIXER_2_4, "SEC_MIXER_2_4", Float(0.0);
317 PARAM_SECONDARY_MIXER_3_4, "SEC_MIXER_3_4", Float(0.0);
318 PARAM_SECONDARY_MIXER_4_4, "SEC_MIXER_4_4", Float(0.0);
319 PARAM_SECONDARY_MIXER_5_4, "SEC_MIXER_5_4", Float(0.0);
320 PARAM_SECONDARY_MIXER_6_4, "SEC_MIXER_6_4", Float(0.0);
321 PARAM_SECONDARY_MIXER_7_4, "SEC_MIXER_7_4", Float(0.0);
322 PARAM_SECONDARY_MIXER_8_4, "SEC_MIXER_8_4", Float(0.0);
323 PARAM_SECONDARY_MIXER_9_4, "SEC_MIXER_9_4", Float(0.0);
324 PARAM_SECONDARY_MIXER_0_5, "SEC_MIXER_0_5", Float(0.0);
325 PARAM_SECONDARY_MIXER_1_5, "SEC_MIXER_1_5", Float(0.0);
326 PARAM_SECONDARY_MIXER_2_5, "SEC_MIXER_2_5", Float(0.0);
327 PARAM_SECONDARY_MIXER_3_5, "SEC_MIXER_3_5", Float(0.0);
328 PARAM_SECONDARY_MIXER_4_5, "SEC_MIXER_4_5", Float(0.0);
329 PARAM_SECONDARY_MIXER_5_5, "SEC_MIXER_5_5", Float(0.0);
330 PARAM_SECONDARY_MIXER_6_5, "SEC_MIXER_6_5", Float(0.0);
331 PARAM_SECONDARY_MIXER_7_5, "SEC_MIXER_7_5", Float(0.0);
332 PARAM_SECONDARY_MIXER_8_5, "SEC_MIXER_8_5", Float(0.0);
333 PARAM_SECONDARY_MIXER_9_5, "SEC_MIXER_9_5", Float(0.0);
334 PARAM_SECONDARY_MIXER_0_6, "SEC_MIXER_0_6", Float(0.0);
335 PARAM_SECONDARY_MIXER_1_6, "SEC_MIXER_1_6", Float(0.0);
336 PARAM_SECONDARY_MIXER_2_6, "SEC_MIXER_2_6", Float(0.0);
337 PARAM_SECONDARY_MIXER_3_6, "SEC_MIXER_3_6", Float(0.0);
338 PARAM_SECONDARY_MIXER_4_6, "SEC_MIXER_4_6", Float(0.0);
339 PARAM_SECONDARY_MIXER_5_6, "SEC_MIXER_5_6", Float(0.0);
340 PARAM_SECONDARY_MIXER_6_6, "SEC_MIXER_6_6", Float(0.0);
341 PARAM_SECONDARY_MIXER_7_6, "SEC_MIXER_7_6", Float(0.0);
342 PARAM_SECONDARY_MIXER_8_6, "SEC_MIXER_8_6", Float(0.0);
343 PARAM_SECONDARY_MIXER_9_6, "SEC_MIXER_9_6", Float(0.0);
344 PARAM_SECONDARY_MIXER_0_7, "SEC_MIXER_0_7", Float(0.0);
345 PARAM_SECONDARY_MIXER_1_7, "SEC_MIXER_1_7", Float(0.0);
346 PARAM_SECONDARY_MIXER_2_7, "SEC_MIXER_2_7", Float(0.0);
347 PARAM_SECONDARY_MIXER_3_7, "SEC_MIXER_3_7", Float(0.0);
348 PARAM_SECONDARY_MIXER_4_7, "SEC_MIXER_4_7", Float(0.0);
349 PARAM_SECONDARY_MIXER_5_7, "SEC_MIXER_5_7", Float(0.0);
350 PARAM_SECONDARY_MIXER_6_7, "SEC_MIXER_6_7", Float(0.0);
351 PARAM_SECONDARY_MIXER_7_7, "SEC_MIXER_7_7", Float(0.0);
352 PARAM_SECONDARY_MIXER_8_7, "SEC_MIXER_8_7", Float(0.0);
353 PARAM_SECONDARY_MIXER_9_7, "SEC_MIXER_9_7", Float(0.0);
354 PARAM_SECONDARY_MIXER_0_8, "SEC_MIXER_0_8", Float(0.0);
355 PARAM_SECONDARY_MIXER_1_8, "SEC_MIXER_1_8", Float(0.0);
356 PARAM_SECONDARY_MIXER_2_8, "SEC_MIXER_2_8", Float(0.0);
357 PARAM_SECONDARY_MIXER_3_8, "SEC_MIXER_3_8", Float(0.0);
358 PARAM_SECONDARY_MIXER_4_8, "SEC_MIXER_4_8", Float(0.0);
359 PARAM_SECONDARY_MIXER_5_8, "SEC_MIXER_5_8", Float(0.0);
360 PARAM_SECONDARY_MIXER_6_8, "SEC_MIXER_6_8", Float(0.0);
361 PARAM_SECONDARY_MIXER_7_8, "SEC_MIXER_7_8", Float(0.0);
362 PARAM_SECONDARY_MIXER_8_8, "SEC_MIXER_8_8", Float(0.0);
363 PARAM_SECONDARY_MIXER_9_8, "SEC_MIXER_9_8", Float(0.0);
364 PARAM_SECONDARY_MIXER_0_9, "SEC_MIXER_0_9", Float(0.0);
365 PARAM_SECONDARY_MIXER_1_9, "SEC_MIXER_1_9", Float(0.0);
366 PARAM_SECONDARY_MIXER_2_9, "SEC_MIXER_2_9", Float(0.0);
367 PARAM_SECONDARY_MIXER_3_9, "SEC_MIXER_3_9", Float(0.0);
368 PARAM_SECONDARY_MIXER_4_9, "SEC_MIXER_4_9", Float(0.0);
369 PARAM_SECONDARY_MIXER_5_9, "SEC_MIXER_5_9", Float(0.0);
370 PARAM_SECONDARY_MIXER_6_9, "SEC_MIXER_6_9", Float(0.0);
371 PARAM_SECONDARY_MIXER_7_9, "SEC_MIXER_7_9", Float(0.0);
372 PARAM_SECONDARY_MIXER_8_9, "SEC_MIXER_8_9", Float(0.0);
373 PARAM_SECONDARY_MIXER_9_9, "SEC_MIXER_9_9", Float(0.0);
374 PARAM_SYSTEM_ID, "SYS_ID", Int(1);
375 PARAM_PID_ROLL_RATE_P, "PID_ROLL_RATE_P", Float(0.070);
376 PARAM_PID_ROLL_RATE_I, "PID_ROLL_RATE_I", Float(0.0);
377 PARAM_PID_ROLL_RATE_D, "PID_ROLL_RATE_D", Float(0.0);
378 PARAM_PID_PITCH_RATE_P, "PID_PITCH_RATE_P", Float(0.070);
379 PARAM_PID_PITCH_RATE_I, "PID_PITCH_RATE_I", Float(0.0);
380 PARAM_PID_PITCH_RATE_D, "PID_PITCH_RATE_D", Float(0.0);
381 PARAM_PID_YAW_RATE_P, "PID_YAW_RATE_P", Float(0.25);
382 PARAM_PID_YAW_RATE_I, "PID_YAW_RATE_I", Float(0.0);
383 PARAM_PID_YAW_RATE_D, "PID_YAW_RATE_D", Float(0.0);
384 PARAM_PID_ROLL_ANGLE_P, "PID_ROLL_ANG_P", Float(0.15);
385 PARAM_PID_ROLL_ANGLE_I, "PID_ROLL_ANG_I", Float(0.0);
386 PARAM_PID_ROLL_ANGLE_D, "PID_ROLL_ANG_D", Float(0.05);
387 PARAM_PID_PITCH_ANGLE_P, "PID_PITCH_ANG_P", Float(0.15);
388 PARAM_PID_PITCH_ANGLE_I, "PID_PITCH_ANG_I", Float(0.0);
389 PARAM_PID_PITCH_ANGLE_D, "PID_PITCH_ANG_D", Float(0.05);
390 PARAM_X_EQ_TORQUE, "X_EQ_TORQUE", Float(0.0);
391 PARAM_Y_EQ_TORQUE, "Y_EQ_TORQUE", Float(0.0);
392 PARAM_Z_EQ_TORQUE, "Z_EQ_TORQUE", Float(0.0);
393 PARAM_PID_TAU, "PID_TAU", Float(0.05);
394 PARAM_MOTOR_IDLE_THROTTLE, "MOTOR_IDLE_THR", Float(0.1);
395 PARAM_FAILSAFE_THROTTLE, "FAILSAFE_THR", Float(-1.0);
396 PARAM_SPIN_MOTORS_WHEN_ARMED, "ARM_SPIN_MOTORS", Int(1);
397 PARAM_CHANNEL_OUTPUT_MASK, "CHN_OUTPUT_MASK", Int(0x0f);
401 PARAM_INIT_TIME, "FILT_INIT_T", Int(3000);
402 PARAM_FILTER_KP_ACC, "FILT_ACC_KP", Float(0.5);
403 PARAM_FILTER_KI, "FILT_KI", Float(0.01);
404 PARAM_FILTER_KP_EXT, "FILT_EXT_KP", Float(1.5);
405 PARAM_FILTER_ACCEL_MARGIN, "FILT_ACC_MARGIN", Float(0.1);
406 PARAM_FILTER_USE_QUAD_INT, "FILT_QUAD_INT", Int(1);
407 PARAM_FILTER_USE_MAT_EXP, "FILT_MAT_EXP", Int(1);
408 PARAM_FILTER_USE_ACC, "FILT_USE_ACC", Int(1);
409 PARAM_CALIBRATE_GYRO_ON_ARM, "ARM_CAL_GYRO", Int(0);
410 PARAM_GYRO_XY_ALPHA, "GYRO_XY_LPF", Float(0.3);
411 PARAM_GYRO_Z_ALPHA, "GYRO_Z_LPF", Float(0.3);
412 PARAM_ACC_ALPHA, "ACC_LPF", Float(0.5);
413 PARAM_GYRO_X_BIAS, "GYRO_X_BIAS", Float(0.0);
414 PARAM_GYRO_Y_BIAS, "GYRO_Y_BIAS", Float(0.0);
415 PARAM_GYRO_Z_BIAS, "GYRO_Z_BIAS", Float(0.0);
416 PARAM_ACC_X_BIAS, "ACC_X_BIAS", Float(0.0);
417 PARAM_ACC_Y_BIAS, "ACC_Y_BIAS", Float(0.0);
418 PARAM_ACC_Z_BIAS, "ACC_Z_BIAS", Float(0.0);
419 PARAM_ACC_X_TEMP_COMP, "ACC_X_TEMP_COMP", Float(0.0);
420 PARAM_ACC_Y_TEMP_COMP, "ACC_Y_TEMP_COMP", Float(0.0);
421 PARAM_ACC_Z_TEMP_COMP, "ACC_Z_TEMP_COMP", Float(0.0);
422 PARAM_MAG_A00_COMP, "MAG_CAL_A00", Float(1.0);
423 PARAM_MAG_A01_COMP, "MAG_CAL_A01", Float(0.0);
424 PARAM_MAG_A02_COMP, "MAG_CAL_A02", Float(0.0);
425 PARAM_MAG_A10_COMP, "MAG_CAL_A10", Float(0.0);
426 PARAM_MAG_A11_COMP, "MAG_CAL_A11", Float(1.0);
427 PARAM_MAG_A12_COMP, "MAG_CAL_A12", Float(0.0);
428 PARAM_MAG_A20_COMP, "MAG_CAL_A20", Float(0.0);
429 PARAM_MAG_A21_COMP, "MAG_CAL_A21", Float(0.0);
430 PARAM_MAG_A22_COMP, "MAG_CAL_A22", Float(1.0);
431 PARAM_MAG_X_BIAS, "MAG_X_BIAS", Float(0.0);
432 PARAM_MAG_Y_BIAS, "MAG_Y_BIAS", Float(0.0);
433 PARAM_MAG_Z_BIAS, "MAG_Z_BIAS", Float(0.0);
434 PARAM_BARO_BIAS, "BARO_BIAS", Float(0.0);
435 PARAM_GROUND_LEVEL, "GROUND_LEVEL", Float(1387.0);
436 PARAM_DIFF_PRESS_BIAS, "DIFF_PRESS_BIAS", Float(0.0);
437 PARAM_RC_TYPE, "RC_TYPE", Int(0);
438 PARAM_RC_X_CHANNEL, "RC_X_CHN", Int(0);
439 PARAM_RC_Y_CHANNEL, "RC_Y_CHN", Int(1);
440 PARAM_RC_Z_CHANNEL, "RC_Z_CHN", Int(3);
441 PARAM_RC_F_CHANNEL, "RC_F_CHN", Int(2);
442 PARAM_RC_F_AXIS, "RC_F_AXIS", Int(2);
443 PARAM_RC_ATTITUDE_OVERRIDE_CHANNEL, "RC_ATT_OVRD_CHN", Int(4);
444 PARAM_RC_THROTTLE_OVERRIDE_CHANNEL, "RC_THR_OVRD_CHN", Int(4);
445 PARAM_RC_ATT_CONTROL_TYPE_CHANNEL, "RC_ATT_CTRL_CHN", Int(-1);
446 PARAM_RC_ARM_CHANNEL, "RC_ARM_CHN", Int(-1);
447 PARAM_RC_NUM_CHANNELS, "RC_NUM_CHN", Int(6);
448 PARAM_RC_SWITCH_5_DIRECTION, "SWITCH_5_DIR", Int(1);
449 PARAM_RC_SWITCH_6_DIRECTION, "SWITCH_6_DIR", Int(1);
450 PARAM_RC_SWITCH_7_DIRECTION, "SWITCH_7_DIR", Int(1);
451 PARAM_RC_SWITCH_8_DIRECTION, "SWITCH_8_DIR", Int(1);
452 PARAM_RC_OVERRIDE_DEVIATION, "RC_OVRD_DEV", Float(0.1);
453 PARAM_OVERRIDE_LAG_TIME, "RC_OVRD_LAG_T", Int(1000);
454 PARAM_RC_OVERRIDE_TAKE_MIN_THROTTLE, "TAKE_MIN_THR", Int(1);
455 PARAM_RC_MAX_THROTTLE, "RC_MAX_THR", Float(0.7);
456 PARAM_RC_ATTITUDE_MODE, "RC_ATT_MODE", Int(1);
457 PARAM_ALLOW_UNHEALTHY_ESTIMATOR, "BYPASS_UNH_EST", Int(1);
458 PARAM_EST_ANGLE_LOCKOUT, "EST_ANG_LOCKOUT", Int(0);
459 PARAM_RC_MAX_ROLL, "RC_MAX_ROLL", Float(0.786);
460 PARAM_RC_MAX_PITCH, "RC_MAX_PITCH", Float(0.786);
461 PARAM_RC_MAX_ROLLRATE, "RC_MAX_ROLLRATE", Float(3.14159);
462 PARAM_RC_MAX_PITCHRATE, "RC_MAX_PITCHRATE", Float(3.14159);
463 PARAM_RC_MAX_YAWRATE, "RC_MAX_YAWRATE", Float(1.507);
464 PARAM_PRIMARY_MIXER, "PRIMARY_MIXER", Int(-1);
465 PARAM_SECONDARY_MIXER, "SECONDARY_MIXER", Int(-1);
466 PARAM_FIXED_WING, "FIXED_WING", Int(0);
467 PARAM_ELEVATOR_REVERSE, "REV_ELEVATOR", Int(0);
468 PARAM_AILERON_REVERSE, "REV_AILERON", Int(0);
469 PARAM_RUDDER_REVERSE, "REV_RUDDER", Int(0);
470 PARAM_IMU_ROLL, "IMU_ROLL", Float(0.0);
471 PARAM_IMU_PITCH, "IMU_PITCH", Float(0.0);
472 PARAM_IMU_YAW, "IMU_YAW", Float(0.0);
473 PARAM_MAG_ROLL, "MAG_ROLL", Float(0.0);
474 PARAM_MAG_PITCH, "MAG_PITCH", Float(0.0);
475 PARAM_MAG_YAW, "MAG_YAW", Float(0.0);
476 PARAM_ARM_THRESHOLD, "RC_ARM_THRESHOLD", Float(0.15);
477 PARAM_BATTERY_VOLTAGE_MULTIPLIER, "BATT_VOLT_MULT", Float(1.0);
478 PARAM_BATTERY_CURRENT_MULTIPLIER, "BATT_CURR_MULT", Float(1.0);
479 PARAM_BATTERY_VOLTAGE_ALPHA, "BATT_VOLT_LPF", Float(0.995);
480 PARAM_BATTERY_CURRENT_ALPHA, "BATT_CURR_LPF", Float(0.995);
481 PARAM_OFFBOARD_TIMEOUT, "OFFBOARD_TIMEOUT", Int(100);
482 PARAM_RC_OUTPUT_KILL_CHANNEL, "RC_KILL_CHN", Int(-1);
483
484 PARAM_TELEM_HEARTBEAT_HZ, "TEL_HB_HZ", Int(1);
487 PARAM_TELEM_STATUS_HZ, "TEL_STATUS_HZ", Int(10);
488 PARAM_TELEM_IMU_HZ, "TEL_IMU_HZ", Int(0);
489 PARAM_TELEM_ATTITUDE_HZ, "TEL_ATT_HZ", Int(0);
490 PARAM_TELEM_OUTPUT_RAW_HZ, "TEL_OUT_HZ", Int(50);
491 PARAM_TELEM_DIFF_PRESSURE_HZ, "TEL_DIFF_HZ", Int(0);
492 PARAM_TELEM_BARO_HZ, "TEL_BARO_HZ", Int(0);
493 PARAM_TELEM_MAG_HZ, "TEL_MAG_HZ", Int(0);
494 PARAM_TELEM_RANGE_HZ, "TEL_RANGE_HZ", Int(0);
495 PARAM_TELEM_BATTERY_HZ, "TEL_BATT_HZ", Int(0);
496 PARAM_TELEM_GNSS_HZ, "TEL_GNSS_HZ", Int(0);
497 PARAM_TELEM_RC_HZ, "TEL_RC_HZ", Int(0);
498}
499
500#[cfg(test)]
505mod tests {
506 use super::*;
507
508 #[test]
509 fn test_param_count() {
510 assert_eq!(PARAMS_COUNT, PARAM_DEFINITIONS.len());
511 assert_eq!(PARAMS_COUNT, 349);
512 }
513
514 #[test]
515 fn rosflight_2_0_param_surface_keeps_known_compatibility_names() {
516 assert_eq!(ParamId::PARAM_VOLT_MAX.as_str(), "BATT_VOLT_MAX");
517 assert_eq!(ParamId::PARAM_PRIMARY_MIXER_9_9.as_str(), "PRI_MIXER_9_9");
518 assert_eq!(ParamId::PARAM_SECONDARY_MIXER_9_9.as_str(), "SEC_MIXER_9_9");
519 assert_eq!(ParamId::PARAM_INIT_TIME.as_str(), "FILT_INIT_T");
520 assert_eq!(ParamId::PARAM_FILTER_KP_ACC.as_str(), "FILT_ACC_KP");
521 assert_eq!(ParamId::PARAM_MAG_A00_COMP.as_str(), "MAG_CAL_A00");
522 assert_eq!(ParamId::PARAM_RC_ARM_CHANNEL.as_str(), "RC_ARM_CHN");
523 assert_eq!(ParamId::PARAM_OVERRIDE_LAG_TIME.as_str(), "RC_OVRD_LAG_T");
524 assert_eq!(
525 ParamId::PARAM_RC_OVERRIDE_TAKE_MIN_THROTTLE.as_str(),
526 "TAKE_MIN_THR"
527 );
528 assert_eq!(
529 ParamId::PARAM_ALLOW_UNHEALTHY_ESTIMATOR.as_str(),
530 "BYPASS_UNH_EST"
531 );
532 assert_eq!(ParamId::PARAM_EST_ANGLE_LOCKOUT.as_str(), "EST_ANG_LOCKOUT");
533 assert_eq!(ParamId::PARAM_ELEVATOR_REVERSE.as_str(), "REV_ELEVATOR");
534 assert_eq!(ParamId::PARAM_IMU_ROLL.as_str(), "IMU_ROLL");
535 assert_eq!(ParamId::PARAM_MAG_YAW.as_str(), "MAG_YAW");
536 assert_eq!(ParamId::PARAM_ARM_THRESHOLD.as_str(), "RC_ARM_THRESHOLD");
537 assert_eq!(
538 ParamId::PARAM_BATTERY_VOLTAGE_ALPHA.as_str(),
539 "BATT_VOLT_LPF"
540 );
541 assert_eq!(
542 ParamId::PARAM_CHANNEL_OUTPUT_MASK.as_str(),
543 "CHN_OUTPUT_MASK"
544 );
545 assert_eq!(
546 ParamId::PARAM_RC_OUTPUT_KILL_CHANNEL.as_str(),
547 "RC_KILL_CHN"
548 );
549 }
550
551 #[test]
552 fn test_new_and_defaults() {
553 let p = Params::new();
554 assert_eq!(
555 p.get_by_id(ParamId::PARAM_BAUD_RATE),
556 ParamValue::Int(921600)
557 );
558 assert_eq!(
559 p.get_by_id(ParamId::PARAM_PID_ROLL_RATE_P),
560 ParamValue::Float(0.070)
561 );
562 assert_eq!(
563 p.get_by_id(ParamId::PARAM_SPIN_MOTORS_WHEN_ARMED),
564 ParamValue::Int(1)
565 );
566 assert_eq!(
567 p.get_by_id(ParamId::PARAM_CHANNEL_OUTPUT_MASK),
568 ParamValue::Int(0x0f)
569 );
570 assert_eq!(
571 p.get_by_id(ParamId::PARAM_RC_OUTPUT_KILL_CHANNEL),
572 ParamValue::Int(-1)
573 );
574 assert_eq!(
575 p.get_by_id(ParamId::PARAM_CALIBRATE_GYRO_ON_ARM),
576 ParamValue::Int(0)
577 );
578 assert_eq!(
579 p.get_by_id(ParamId::PARAM_BATTERY_VOLTAGE_MULTIPLIER),
580 ParamValue::Float(1.0)
581 );
582 assert_eq!(
583 p.get_by_id(ParamId::PARAM_TELEM_HEARTBEAT_HZ),
584 ParamValue::Int(1)
585 );
586 assert_eq!(
587 p.get_by_id(ParamId::PARAM_TELEM_STATUS_HZ),
588 ParamValue::Int(10)
589 );
590 assert_eq!(
591 p.get_by_id(ParamId::PARAM_TELEM_OUTPUT_RAW_HZ),
592 ParamValue::Int(50)
593 );
594 for id in [
595 ParamId::PARAM_TELEM_IMU_HZ,
596 ParamId::PARAM_TELEM_ATTITUDE_HZ,
597 ParamId::PARAM_TELEM_DIFF_PRESSURE_HZ,
598 ParamId::PARAM_TELEM_BARO_HZ,
599 ParamId::PARAM_TELEM_MAG_HZ,
600 ParamId::PARAM_TELEM_RANGE_HZ,
601 ParamId::PARAM_TELEM_BATTERY_HZ,
602 ParamId::PARAM_TELEM_GNSS_HZ,
603 ParamId::PARAM_TELEM_RC_HZ,
604 ] {
605 assert_eq!(p.get_by_id(id), ParamValue::Int(0));
606 }
607 }
608
609 #[test]
610 fn test_get_set_by_id() {
611 let mut p = Params::new();
612 p.set_by_id(ParamId::PARAM_SYSTEM_ID, ParamValue::Int(42));
613 assert_eq!(p.get_by_id(ParamId::PARAM_SYSTEM_ID), ParamValue::Int(42));
614 p.set_by_id(ParamId::PARAM_FIXED_WING, ParamValue::Int(1));
615 assert_eq!(p.get_by_id(ParamId::PARAM_FIXED_WING), ParamValue::Int(1));
616 }
617
618 #[test]
619 fn test_get_set_by_name() {
620 let mut p = Params::new();
621 let success = p.set_by_name("SYS_ID", ParamValue::Int(99));
622 assert!(success);
623 assert_eq!(p.get_by_id(ParamId::PARAM_SYSTEM_ID), ParamValue::Int(99));
624 assert_eq!(p.get_by_name("SYS_ID"), Some(ParamValue::Int(99)));
625
626 let failure = p.set_by_name("NON_EXISTENT", ParamValue::Int(1));
627 assert!(!failure);
628 assert_eq!(p.get_by_name("NON_EXISTENT"), None);
629 }
630}