blackbox-log 0.4.3

Ergonomic parser for BetaFlight blackbox logs
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "_serde", derive(serde::Serialize))]
/// The configured debugging info for a log.
#[non_exhaustive]
pub enum DebugMode {
    /// `AC_CORRECTION`
    AcCorrection,
    /// `AC_ERROR`
    AcError,
    /// `ACC`
    Acc,
    /// `ACCELEROMETER`
    Accelerometer,
    /// `ACRO_TRAINER`
    AcroTrainer,
    /// `ADAPTIVE_FILTER`
    AdaptiveFilter,
    /// `ADC_INTERNAL`
    AdcInternal,
    /// `AGL`
    Agl,
    /// `ALTITUDE`
    Altitude,
    /// `ALWAYS`
    Always,
    /// `ANGLE_MODE`
    AngleMode,
    /// `ANGLE_TARGET`
    AngleTarget,
    /// `ANGLERATE`
    Anglerate,
    /// `ANTI_GRAVITY`
    AntiGravity,
    /// `ATTITUDE`
    Attitude,
    /// `AUTOLEVEL`
    AutoLevel,
    /// `AUTOTRIM`
    AutoTrim,
    /// `AUTOTUNE`
    AutoTune,
    /// `BARO`
    Baro,
    /// `BATTERY`
    Battery,
    /// `BLACKBOX_OUTPUT`
    BlackboxOutput,
    /// `CRSF_LINK_STATISTICS_DOWN`
    CrsfLinkStatisticsDown,
    /// `CRSF_LINK_STATISTICS_PWR`
    CrsfLinkStatisticsPwr,
    /// `CRSF_LINK_STATISTICS_UPLINK`
    CrsfLinkStatisticsUplink,
    /// `CRUISE`
    Cruise,
    /// `CURRENT_ANGLE`
    CurrentAngle,
    /// `CURRENT_SENSOR`
    CurrentSensor,
    /// `CYCLETIME`
    Cycletime,
    /// `D_LPF`
    DLpf,
    /// `D_MIN`
    DMin,
    /// `DSHOT_RPM_ERRORS`
    DshotRpmErrors,
    /// `DSHOT_RPM_TELEMETRY`
    DshotRpmTelemetry,
    /// `DSHOT_TELEMETRY_COUNTS`
    DshotTelemetryCounts,
    /// `DUAL_GYRO_DIFF`
    DualGyroDiff,
    /// `DUAL_GYRO_RAW`
    DualGyroRaw,
    /// `DUAL_GYRO_SCALED`
    DualGyroScaled,
    /// `DYN_IDLE`
    DynIdle,
    /// `DYN_LPF`
    DynLpf,
    /// `DYNAMIC_FILTER`
    DynamicFilter,
    /// `DYNAMIC_FILTER_FREQUENCY`
    DynamicFilterFrequency,
    /// `DYNAMIC_GYRO_LPF`
    DynamicGyroLpf,
    /// `ERPM`
    Erpm,
    /// `ESC_SENSOR`
    EscSensor,
    /// `ESC_SENSOR_RPM`
    EscSensorRpm,
    /// `ESC_SENSOR_TMP`
    EscSensorTmp,
    /// `EZLANDING`
    Ezlanding,
    /// `FAILSAFE`
    Failsafe,
    /// `FEEDFORWARD`
    Feedforward,
    /// `FEEDFORWARD_LIMIT`
    FeedforwardLimit,
    /// `FF_INTERPOLATED`
    FfInterpolated,
    /// `FF_LIMIT`
    FfLimit,
    /// `FFT`
    Fft,
    /// `FFT_FREQ`
    FftFreq,
    /// `FFT_TIME`
    FftTime,
    /// `FLOW`
    Flow,
    /// `FLOW_RAW`
    FlowRaw,
    /// `FPORT`
    Fport,
    /// `GHST`
    Ghst,
    /// `GHST_MSP`
    GhstMsp,
    /// `GPS`
    Gps,
    /// `GPS_CONNECTION`
    GpsConnection,
    /// `GPS_DOP`
    GpsDop,
    /// `GPS_RESCUE_HEADING`
    GpsRescueHeading,
    /// `GPS_RESCUE_THROTTLE_PID`
    GpsRescueThrottlePid,
    /// `GPS_RESCUE_TRACKING`
    GpsRescueTracking,
    /// `GPS_RESCUE_VELOCITY`
    GpsRescueVelocity,
    /// `GYRO`
    Gyro,
    /// `GYRO_CALIBRATION`
    GyroCalibration,
    /// `GYRO_FILTERED`
    GyroFiltered,
    /// `GYRO_RAW`
    GyroRaw,
    /// `GYRO_SAMPLE`
    GyroSample,
    /// `GYRO_SCALED`
    GyroScaled,
    /// `HEADTRACKING`
    Headtracking,
    /// `IMU2`
    Imu2,
    /// `IRLOCK`
    Irlock,
    /// `ITERM_RELAX`
    ItermRelax,
    /// `KALMAN_GAIN`
    KalmanGain,
    /// `LANDING`
    Landing,
    /// `LIDAR_TF`
    LidarTf,
    /// `LULU`
    Lulu,
    /// `MAG_CALIB`
    MagCalib,
    /// `MAG_TASK_RATE`
    MagTaskRate,
    /// `MAX7456_SIGNAL`
    Max7456Signal,
    /// `MAX7456_SPICLOCK`
    Max7456Spiclock,
    /// `NAV_YAW`
    NavYaw,
    /// `NONE`
    None,
    /// `PCF8574`
    Pcf8574,
    /// `PID_MEASUREMENT`
    PidMeasurement,
    /// `PIDLOOP`
    Pidloop,
    /// `POS_EST`
    PosEst,
    /// `RANGEFINDER`
    Rangefinder,
    /// `RANGEFINDER_QUALITY`
    RangefinderQuality,
    /// `RATE_DYNAMICS`
    RateDynamics,
    /// `RC_INTERPOLATION`
    RcInterpolation,
    /// `RC_SMOOTHING`
    RcSmoothing,
    /// `RC_SMOOTHING_RATE`
    RcSmoothingRate,
    /// `RC_STATS`
    RcStats,
    /// `REM_FLIGHT_TIME`
    RemFlightTime,
    /// `RPM_FILTER`
    RpmFilter,
    /// `RPM_FREQ`
    RpmFreq,
    /// `RPM_LIMIT`
    RpmLimit,
    /// `RTH`
    Rth,
    /// `RUNAWAY_TAKEOFF`
    RunawayTakeoff,
    /// `RX_EXPRESSLRS_PHASELOCK`
    RxExpresslrsPhaselock,
    /// `RX_EXPRESSLRS_SPI`
    RxExpresslrsSpi,
    /// `RX_FRSKY_SPI`
    RxFrskySpi,
    /// `RX_SFHSS_SPI`
    RxSfhssSpi,
    /// `RX_SIGNAL_LOSS`
    RxSignalLoss,
    /// `RX_SPEKTRUM_SPI`
    RxSpektrumSpi,
    /// `RX_STATE_TIME`
    RxStateTime,
    /// `RX_TIMING`
    RxTiming,
    /// `SAG_COMP_VOLTAGE`
    SagCompVoltage,
    /// `SBUS`
    Sbus,
    /// `SBUS2`
    Sbus2,
    /// `SCHEDULER`
    Scheduler,
    /// `SCHEDULER_DETERMINISM`
    SchedulerDeterminism,
    /// `SDIO`
    Sdio,
    /// `SMARTAUDIO`
    Smartaudio,
    /// `SMITH_PREDICTOR`
    SmithPredictor,
    /// `SPM_CELLS`
    SpmCells,
    /// `SPM_VARIO`
    SpmVario,
    /// `SPM_VS600`
    SpmVs600,
    /// `STACK`
    Stack,
    /// `TIMING_ACCURACY`
    TimingAccuracy,
    /// `USB`
    Usb,
    /// `VIBE`
    Vibe,
    /// `VTX_MSP`
    VtxMsp,
    /// `VTX_TRAMP`
    VtxTramp,
}
#[allow(unused_qualifications)]
impl crate::units::Flag for DebugMode {
    fn as_name(&self) -> &'static str {
        match self {
            Self::AcCorrection => "AC_CORRECTION",
            Self::AcError => "AC_ERROR",
            Self::Acc => "ACC",
            Self::Accelerometer => "ACCELEROMETER",
            Self::AcroTrainer => "ACRO_TRAINER",
            Self::AdaptiveFilter => "ADAPTIVE_FILTER",
            Self::AdcInternal => "ADC_INTERNAL",
            Self::Agl => "AGL",
            Self::Altitude => "ALTITUDE",
            Self::Always => "ALWAYS",
            Self::AngleMode => "ANGLE_MODE",
            Self::AngleTarget => "ANGLE_TARGET",
            Self::Anglerate => "ANGLERATE",
            Self::AntiGravity => "ANTI_GRAVITY",
            Self::Attitude => "ATTITUDE",
            Self::AutoLevel => "AUTOLEVEL",
            Self::AutoTrim => "AUTOTRIM",
            Self::AutoTune => "AUTOTUNE",
            Self::Baro => "BARO",
            Self::Battery => "BATTERY",
            Self::BlackboxOutput => "BLACKBOX_OUTPUT",
            Self::CrsfLinkStatisticsDown => "CRSF_LINK_STATISTICS_DOWN",
            Self::CrsfLinkStatisticsPwr => "CRSF_LINK_STATISTICS_PWR",
            Self::CrsfLinkStatisticsUplink => "CRSF_LINK_STATISTICS_UPLINK",
            Self::Cruise => "CRUISE",
            Self::CurrentAngle => "CURRENT_ANGLE",
            Self::CurrentSensor => "CURRENT_SENSOR",
            Self::Cycletime => "CYCLETIME",
            Self::DLpf => "D_LPF",
            Self::DMin => "D_MIN",
            Self::DshotRpmErrors => "DSHOT_RPM_ERRORS",
            Self::DshotRpmTelemetry => "DSHOT_RPM_TELEMETRY",
            Self::DshotTelemetryCounts => "DSHOT_TELEMETRY_COUNTS",
            Self::DualGyroDiff => "DUAL_GYRO_DIFF",
            Self::DualGyroRaw => "DUAL_GYRO_RAW",
            Self::DualGyroScaled => "DUAL_GYRO_SCALED",
            Self::DynIdle => "DYN_IDLE",
            Self::DynLpf => "DYN_LPF",
            Self::DynamicFilter => "DYNAMIC_FILTER",
            Self::DynamicFilterFrequency => "DYNAMIC_FILTER_FREQUENCY",
            Self::DynamicGyroLpf => "DYNAMIC_GYRO_LPF",
            Self::Erpm => "ERPM",
            Self::EscSensor => "ESC_SENSOR",
            Self::EscSensorRpm => "ESC_SENSOR_RPM",
            Self::EscSensorTmp => "ESC_SENSOR_TMP",
            Self::Ezlanding => "EZLANDING",
            Self::Failsafe => "FAILSAFE",
            Self::Feedforward => "FEEDFORWARD",
            Self::FeedforwardLimit => "FEEDFORWARD_LIMIT",
            Self::FfInterpolated => "FF_INTERPOLATED",
            Self::FfLimit => "FF_LIMIT",
            Self::Fft => "FFT",
            Self::FftFreq => "FFT_FREQ",
            Self::FftTime => "FFT_TIME",
            Self::Flow => "FLOW",
            Self::FlowRaw => "FLOW_RAW",
            Self::Fport => "FPORT",
            Self::Ghst => "GHST",
            Self::GhstMsp => "GHST_MSP",
            Self::Gps => "GPS",
            Self::GpsConnection => "GPS_CONNECTION",
            Self::GpsDop => "GPS_DOP",
            Self::GpsRescueHeading => "GPS_RESCUE_HEADING",
            Self::GpsRescueThrottlePid => "GPS_RESCUE_THROTTLE_PID",
            Self::GpsRescueTracking => "GPS_RESCUE_TRACKING",
            Self::GpsRescueVelocity => "GPS_RESCUE_VELOCITY",
            Self::Gyro => "GYRO",
            Self::GyroCalibration => "GYRO_CALIBRATION",
            Self::GyroFiltered => "GYRO_FILTERED",
            Self::GyroRaw => "GYRO_RAW",
            Self::GyroSample => "GYRO_SAMPLE",
            Self::GyroScaled => "GYRO_SCALED",
            Self::Headtracking => "HEADTRACKING",
            Self::Imu2 => "IMU2",
            Self::Irlock => "IRLOCK",
            Self::ItermRelax => "ITERM_RELAX",
            Self::KalmanGain => "KALMAN_GAIN",
            Self::Landing => "LANDING",
            Self::LidarTf => "LIDAR_TF",
            Self::Lulu => "LULU",
            Self::MagCalib => "MAG_CALIB",
            Self::MagTaskRate => "MAG_TASK_RATE",
            Self::Max7456Signal => "MAX7456_SIGNAL",
            Self::Max7456Spiclock => "MAX7456_SPICLOCK",
            Self::NavYaw => "NAV_YAW",
            Self::None => "NONE",
            Self::Pcf8574 => "PCF8574",
            Self::PidMeasurement => "PID_MEASUREMENT",
            Self::Pidloop => "PIDLOOP",
            Self::PosEst => "POS_EST",
            Self::Rangefinder => "RANGEFINDER",
            Self::RangefinderQuality => "RANGEFINDER_QUALITY",
            Self::RateDynamics => "RATE_DYNAMICS",
            Self::RcInterpolation => "RC_INTERPOLATION",
            Self::RcSmoothing => "RC_SMOOTHING",
            Self::RcSmoothingRate => "RC_SMOOTHING_RATE",
            Self::RcStats => "RC_STATS",
            Self::RemFlightTime => "REM_FLIGHT_TIME",
            Self::RpmFilter => "RPM_FILTER",
            Self::RpmFreq => "RPM_FREQ",
            Self::RpmLimit => "RPM_LIMIT",
            Self::Rth => "RTH",
            Self::RunawayTakeoff => "RUNAWAY_TAKEOFF",
            Self::RxExpresslrsPhaselock => "RX_EXPRESSLRS_PHASELOCK",
            Self::RxExpresslrsSpi => "RX_EXPRESSLRS_SPI",
            Self::RxFrskySpi => "RX_FRSKY_SPI",
            Self::RxSfhssSpi => "RX_SFHSS_SPI",
            Self::RxSignalLoss => "RX_SIGNAL_LOSS",
            Self::RxSpektrumSpi => "RX_SPEKTRUM_SPI",
            Self::RxStateTime => "RX_STATE_TIME",
            Self::RxTiming => "RX_TIMING",
            Self::SagCompVoltage => "SAG_COMP_VOLTAGE",
            Self::Sbus => "SBUS",
            Self::Sbus2 => "SBUS2",
            Self::Scheduler => "SCHEDULER",
            Self::SchedulerDeterminism => "SCHEDULER_DETERMINISM",
            Self::Sdio => "SDIO",
            Self::Smartaudio => "SMARTAUDIO",
            Self::SmithPredictor => "SMITH_PREDICTOR",
            Self::SpmCells => "SPM_CELLS",
            Self::SpmVario => "SPM_VARIO",
            Self::SpmVs600 => "SPM_VS600",
            Self::Stack => "STACK",
            Self::TimingAccuracy => "TIMING_ACCURACY",
            Self::Usb => "USB",
            Self::Vibe => "VIBE",
            Self::VtxMsp => "VTX_MSP",
            Self::VtxTramp => "VTX_TRAMP",
        }
    }
}
#[allow(unused_qualifications)]
impl ::core::fmt::Display for DebugMode {
    fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {
        let s = <Self as crate::units::Flag>::as_name(self);
        f.write_str(s)
    }
}
#[allow(
    unused_qualifications,
    clippy::enum_glob_use,
    clippy::match_same_arms,
    clippy::unseparated_literal_suffix
)]
impl DebugMode {
    pub(crate) fn new(raw: u32, fw: crate::headers::InternalFirmware) -> Option<Self> {
        use crate::headers::InternalFirmware::*;
        match (raw, fw) {
            (
                0u32,
                Betaflight4_2 | Betaflight4_3 | Betaflight4_4 | Betaflight4_5 | Inav5 | Inav6
                | Inav7 | Inav8,
            ) => Some(Self::None),
            (1u32, Betaflight4_2 | Betaflight4_3 | Betaflight4_4 | Betaflight4_5) => {
                Some(Self::Cycletime)
            }
            (1u32, Inav5) => Some(Self::Gyro),
            (1u32, Inav6 | Inav7 | Inav8) => Some(Self::Agl),
            (2u32, Betaflight4_2 | Betaflight4_3 | Betaflight4_4 | Betaflight4_5) => {
                Some(Self::Battery)
            }
            (2u32, Inav5) => Some(Self::Agl),
            (2u32, Inav6 | Inav7 | Inav8) => Some(Self::FlowRaw),
            (3u32, Betaflight4_2 | Betaflight4_3 | Betaflight4_4 | Betaflight4_5) => {
                Some(Self::GyroFiltered)
            }
            (3u32, Inav5) => Some(Self::FlowRaw),
            (3u32, Inav6 | Inav7 | Inav8) => Some(Self::Flow),
            (4u32, Betaflight4_2 | Betaflight4_3 | Betaflight4_4 | Betaflight4_5) => {
                Some(Self::Accelerometer)
            }
            (4u32, Inav5) => Some(Self::Flow),
            (4u32, Inav6 | Inav7 | Inav8) => Some(Self::Always),
            (5u32, Betaflight4_2 | Betaflight4_3 | Betaflight4_4 | Betaflight4_5) => {
                Some(Self::Pidloop)
            }
            (5u32, Inav5) => Some(Self::Sbus),
            (5u32, Inav6 | Inav7 | Inav8) => Some(Self::SagCompVoltage),
            (6u32, Betaflight4_2 | Betaflight4_3 | Betaflight4_4 | Betaflight4_5) => {
                Some(Self::GyroScaled)
            }
            (6u32, Inav5) => Some(Self::Fport),
            (6u32, Inav6 | Inav7 | Inav8) => Some(Self::Vibe),
            (7u32, Betaflight4_2 | Betaflight4_3 | Betaflight4_4 | Betaflight4_5) => {
                Some(Self::RcInterpolation)
            }
            (7u32, Inav5) => Some(Self::Always),
            (7u32, Inav6 | Inav7 | Inav8) => Some(Self::Cruise),
            (8u32, Betaflight4_2 | Betaflight4_3 | Betaflight4_4 | Betaflight4_5) => {
                Some(Self::Anglerate)
            }
            (8u32, Inav5) => Some(Self::SagCompVoltage),
            (8u32, Inav6 | Inav7 | Inav8) => Some(Self::RemFlightTime),
            (9u32, Betaflight4_2 | Betaflight4_3 | Betaflight4_4 | Betaflight4_5) => {
                Some(Self::EscSensor)
            }
            (9u32, Inav5) => Some(Self::Vibe),
            (9u32, Inav6 | Inav7 | Inav8) => Some(Self::Smartaudio),
            (10u32, Betaflight4_2 | Betaflight4_3 | Betaflight4_4 | Betaflight4_5) => {
                Some(Self::Scheduler)
            }
            (10u32, Inav5) => Some(Self::Cruise),
            (10u32, Inav6 | Inav7 | Inav8) => Some(Self::Acc),
            (11u32, Betaflight4_2 | Betaflight4_3 | Betaflight4_4 | Betaflight4_5) => {
                Some(Self::Stack)
            }
            (11u32, Inav5) => Some(Self::RemFlightTime),
            (11u32, Inav6 | Inav7 | Inav8) => Some(Self::NavYaw),
            (12u32, Betaflight4_2 | Betaflight4_3 | Betaflight4_4 | Betaflight4_5) => {
                Some(Self::EscSensorRpm)
            }
            (12u32, Inav5) => Some(Self::Smartaudio),
            (12u32, Inav6 | Inav7 | Inav8) => Some(Self::Pcf8574),
            (13u32, Betaflight4_2 | Betaflight4_3 | Betaflight4_4 | Betaflight4_5) => {
                Some(Self::EscSensorTmp)
            }
            (13u32, Inav5) => Some(Self::Acc),
            (13u32, Inav6 | Inav7 | Inav8) => Some(Self::DynamicGyroLpf),
            (14u32, Betaflight4_2 | Betaflight4_3 | Betaflight4_4 | Betaflight4_5) => {
                Some(Self::Altitude)
            }
            (14u32, Inav5) => Some(Self::Erpm),
            (14u32, Inav6 | Inav7 | Inav8) => Some(Self::AutoLevel),
            (15u32, Betaflight4_2 | Betaflight4_3 | Betaflight4_4 | Betaflight4_5) => {
                Some(Self::Fft)
            }
            (15u32, Inav5) => Some(Self::RpmFilter),
            (15u32, Inav6 | Inav7 | Inav8) => Some(Self::Altitude),
            (16u32, Betaflight4_2 | Betaflight4_3 | Betaflight4_4 | Betaflight4_5) => {
                Some(Self::FftTime)
            }
            (16u32, Inav5) => Some(Self::RpmFreq),
            (16u32, Inav6 | Inav7 | Inav8) => Some(Self::AutoTrim),
            (17u32, Betaflight4_2 | Betaflight4_3 | Betaflight4_4 | Betaflight4_5) => {
                Some(Self::FftFreq)
            }
            (17u32, Inav5) => Some(Self::NavYaw),
            (17u32, Inav6 | Inav7 | Inav8) => Some(Self::AutoTune),
            (18u32, Betaflight4_2 | Betaflight4_3 | Betaflight4_4 | Betaflight4_5) => {
                Some(Self::RxFrskySpi)
            }
            (18u32, Inav5) => Some(Self::DynamicFilter),
            (18u32, Inav6 | Inav7 | Inav8) => Some(Self::RateDynamics),
            (19u32, Betaflight4_2 | Betaflight4_3 | Betaflight4_4 | Betaflight4_5) => {
                Some(Self::RxSfhssSpi)
            }
            (19u32, Inav5) => Some(Self::DynamicFilterFrequency),
            (19u32, Inav6 | Inav7 | Inav8) => Some(Self::Landing),
            (20u32, Betaflight4_2 | Betaflight4_3 | Betaflight4_4 | Betaflight4_5) => {
                Some(Self::GyroRaw)
            }
            (20u32, Inav5) => Some(Self::Irlock),
            (20u32, Inav6 | Inav7 | Inav8) => Some(Self::PosEst),
            (21u32, Betaflight4_2 | Betaflight4_3 | Betaflight4_4 | Betaflight4_5) => {
                Some(Self::DualGyroRaw)
            }
            (21u32, Inav5) => Some(Self::KalmanGain),
            (21u32, Inav8) => Some(Self::AdaptiveFilter),
            (22u32, Betaflight4_2 | Betaflight4_3 | Betaflight4_4 | Betaflight4_5) => {
                Some(Self::DualGyroDiff)
            }
            (22u32, Inav5) => Some(Self::PidMeasurement),
            (22u32, Inav8) => Some(Self::Headtracking),
            (23u32, Betaflight4_2 | Betaflight4_3 | Betaflight4_4 | Betaflight4_5) => {
                Some(Self::Max7456Signal)
            }
            (23u32, Inav5) => Some(Self::SpmCells),
            (23u32, Inav8) => Some(Self::Gps),
            (24u32, Betaflight4_2 | Betaflight4_3 | Betaflight4_4 | Betaflight4_5) => {
                Some(Self::Max7456Spiclock)
            }
            (24u32, Inav5) => Some(Self::SpmVs600),
            (24u32, Inav8) => Some(Self::Lulu),
            (25u32, Betaflight4_2 | Betaflight4_3 | Betaflight4_4 | Betaflight4_5) => {
                Some(Self::Sbus)
            }
            (25u32, Inav5) => Some(Self::SpmVario),
            (25u32, Inav8) => Some(Self::Sbus2),
            (26u32, Betaflight4_2 | Betaflight4_3 | Betaflight4_4 | Betaflight4_5) => {
                Some(Self::Fport)
            }
            (26u32, Inav5) => Some(Self::Pcf8574),
            (27u32, Betaflight4_2 | Betaflight4_3 | Betaflight4_4 | Betaflight4_5) => {
                Some(Self::Rangefinder)
            }
            (27u32, Inav5) => Some(Self::DynamicGyroLpf),
            (28u32, Betaflight4_2 | Betaflight4_3 | Betaflight4_4 | Betaflight4_5) => {
                Some(Self::RangefinderQuality)
            }
            (28u32, Inav5) => Some(Self::AutoLevel),
            (29u32, Betaflight4_2 | Betaflight4_3 | Betaflight4_4 | Betaflight4_5) => {
                Some(Self::LidarTf)
            }
            (29u32, Inav5) => Some(Self::Imu2),
            (30u32, Betaflight4_2 | Betaflight4_3 | Betaflight4_4 | Betaflight4_5) => {
                Some(Self::AdcInternal)
            }
            (30u32, Inav5) => Some(Self::Altitude),
            (31u32, Betaflight4_2 | Betaflight4_3 | Betaflight4_4 | Betaflight4_5) => {
                Some(Self::RunawayTakeoff)
            }
            (31u32, Inav5) => Some(Self::SmithPredictor),
            (32u32, Betaflight4_2 | Betaflight4_3 | Betaflight4_4 | Betaflight4_5) => {
                Some(Self::Sdio)
            }
            (32u32, Inav5) => Some(Self::AutoTrim),
            (33u32, Betaflight4_2 | Betaflight4_3 | Betaflight4_4 | Betaflight4_5) => {
                Some(Self::CurrentSensor)
            }
            (33u32, Inav5) => Some(Self::AutoTune),
            (34u32, Betaflight4_2 | Betaflight4_3 | Betaflight4_4 | Betaflight4_5) => {
                Some(Self::Usb)
            }
            (34u32, Inav5) => Some(Self::RateDynamics),
            (35u32, Betaflight4_2 | Betaflight4_3 | Betaflight4_4 | Betaflight4_5) => {
                Some(Self::Smartaudio)
            }
            (35u32, Inav5) => Some(Self::Landing),
            (36u32, Betaflight4_2 | Betaflight4_3 | Betaflight4_4 | Betaflight4_5) => {
                Some(Self::Rth)
            }
            (37u32, Betaflight4_2 | Betaflight4_3 | Betaflight4_4 | Betaflight4_5) => {
                Some(Self::ItermRelax)
            }
            (38u32, Betaflight4_2 | Betaflight4_3 | Betaflight4_4 | Betaflight4_5) => {
                Some(Self::AcroTrainer)
            }
            (39u32, Betaflight4_2 | Betaflight4_3 | Betaflight4_4 | Betaflight4_5) => {
                Some(Self::RcSmoothing)
            }
            (40u32, Betaflight4_2 | Betaflight4_3 | Betaflight4_4 | Betaflight4_5) => {
                Some(Self::RxSignalLoss)
            }
            (41u32, Betaflight4_2 | Betaflight4_3 | Betaflight4_4 | Betaflight4_5) => {
                Some(Self::RcSmoothingRate)
            }
            (42u32, Betaflight4_2 | Betaflight4_3 | Betaflight4_4 | Betaflight4_5) => {
                Some(Self::AntiGravity)
            }
            (43u32, Betaflight4_2 | Betaflight4_3 | Betaflight4_4 | Betaflight4_5) => {
                Some(Self::DynLpf)
            }
            (44u32, Betaflight4_2 | Betaflight4_3 | Betaflight4_4 | Betaflight4_5) => {
                Some(Self::RxSpektrumSpi)
            }
            (45u32, Betaflight4_2 | Betaflight4_3 | Betaflight4_4 | Betaflight4_5) => {
                Some(Self::DshotRpmTelemetry)
            }
            (46u32, Betaflight4_2 | Betaflight4_3 | Betaflight4_4 | Betaflight4_5) => {
                Some(Self::RpmFilter)
            }
            (47u32, Betaflight4_2 | Betaflight4_3 | Betaflight4_4 | Betaflight4_5) => {
                Some(Self::DMin)
            }
            (48u32, Betaflight4_2 | Betaflight4_3 | Betaflight4_4 | Betaflight4_5) => {
                Some(Self::AcCorrection)
            }
            (49u32, Betaflight4_2 | Betaflight4_3 | Betaflight4_4 | Betaflight4_5) => {
                Some(Self::AcError)
            }
            (50u32, Betaflight4_2 | Betaflight4_3 | Betaflight4_4 | Betaflight4_5) => {
                Some(Self::DualGyroScaled)
            }
            (51u32, Betaflight4_2 | Betaflight4_3 | Betaflight4_4 | Betaflight4_5) => {
                Some(Self::DshotRpmErrors)
            }
            (52u32, Betaflight4_2 | Betaflight4_3 | Betaflight4_4 | Betaflight4_5) => {
                Some(Self::CrsfLinkStatisticsUplink)
            }
            (53u32, Betaflight4_2 | Betaflight4_3 | Betaflight4_4 | Betaflight4_5) => {
                Some(Self::CrsfLinkStatisticsPwr)
            }
            (54u32, Betaflight4_2 | Betaflight4_3 | Betaflight4_4 | Betaflight4_5) => {
                Some(Self::CrsfLinkStatisticsDown)
            }
            (55u32, Betaflight4_2 | Betaflight4_3 | Betaflight4_4 | Betaflight4_5) => {
                Some(Self::Baro)
            }
            (56u32, Betaflight4_2 | Betaflight4_3 | Betaflight4_4 | Betaflight4_5) => {
                Some(Self::GpsRescueThrottlePid)
            }
            (57u32, Betaflight4_2 | Betaflight4_3 | Betaflight4_4 | Betaflight4_5) => {
                Some(Self::DynIdle)
            }
            (58u32, Betaflight4_2) => Some(Self::FfLimit),
            (58u32, Betaflight4_3 | Betaflight4_4 | Betaflight4_5) => Some(Self::FeedforwardLimit),
            (59u32, Betaflight4_2) => Some(Self::FfInterpolated),
            (59u32, Betaflight4_3 | Betaflight4_4 | Betaflight4_5) => Some(Self::Feedforward),
            (60u32, Betaflight4_2 | Betaflight4_3 | Betaflight4_4 | Betaflight4_5) => {
                Some(Self::BlackboxOutput)
            }
            (61u32, Betaflight4_2 | Betaflight4_3 | Betaflight4_4 | Betaflight4_5) => {
                Some(Self::GyroSample)
            }
            (62u32, Betaflight4_2 | Betaflight4_3 | Betaflight4_4 | Betaflight4_5) => {
                Some(Self::RxTiming)
            }
            (63u32, Betaflight4_3 | Betaflight4_4 | Betaflight4_5) => Some(Self::DLpf),
            (64u32, Betaflight4_3 | Betaflight4_4 | Betaflight4_5) => Some(Self::VtxTramp),
            (65u32, Betaflight4_3 | Betaflight4_4 | Betaflight4_5) => Some(Self::Ghst),
            (66u32, Betaflight4_3) => Some(Self::SchedulerDeterminism),
            (66u32, Betaflight4_4 | Betaflight4_5) => Some(Self::GhstMsp),
            (67u32, Betaflight4_3) => Some(Self::TimingAccuracy),
            (67u32, Betaflight4_4 | Betaflight4_5) => Some(Self::SchedulerDeterminism),
            (68u32, Betaflight4_3) => Some(Self::RxExpresslrsSpi),
            (68u32, Betaflight4_4 | Betaflight4_5) => Some(Self::TimingAccuracy),
            (69u32, Betaflight4_3) => Some(Self::RxExpresslrsPhaselock),
            (69u32, Betaflight4_4 | Betaflight4_5) => Some(Self::RxExpresslrsSpi),
            (70u32, Betaflight4_3) => Some(Self::RxStateTime),
            (70u32, Betaflight4_4 | Betaflight4_5) => Some(Self::RxExpresslrsPhaselock),
            (71u32, Betaflight4_4 | Betaflight4_5) => Some(Self::RxStateTime),
            (72u32, Betaflight4_4 | Betaflight4_5) => Some(Self::GpsRescueVelocity),
            (73u32, Betaflight4_4 | Betaflight4_5) => Some(Self::GpsRescueHeading),
            (74u32, Betaflight4_4 | Betaflight4_5) => Some(Self::GpsRescueTracking),
            (75u32, Betaflight4_4) => Some(Self::Attitude),
            (75u32, Betaflight4_5) => Some(Self::GpsConnection),
            (76u32, Betaflight4_4) => Some(Self::VtxMsp),
            (76u32, Betaflight4_5) => Some(Self::Attitude),
            (77u32, Betaflight4_4) => Some(Self::GpsDop),
            (77u32, Betaflight4_5) => Some(Self::VtxMsp),
            (78u32, Betaflight4_4) => Some(Self::Failsafe),
            (78u32, Betaflight4_5) => Some(Self::GpsDop),
            (79u32, Betaflight4_5) => Some(Self::Failsafe),
            (80u32, Betaflight4_5) => Some(Self::GyroCalibration),
            (81u32, Betaflight4_5) => Some(Self::AngleMode),
            (82u32, Betaflight4_5) => Some(Self::AngleTarget),
            (83u32, Betaflight4_5) => Some(Self::CurrentAngle),
            (84u32, Betaflight4_5) => Some(Self::DshotTelemetryCounts),
            (85u32, Betaflight4_5) => Some(Self::RpmLimit),
            (86u32, Betaflight4_5) => Some(Self::RcStats),
            (87u32, Betaflight4_5) => Some(Self::MagCalib),
            (88u32, Betaflight4_5) => Some(Self::MagTaskRate),
            (89u32, Betaflight4_5) => Some(Self::Ezlanding),
            _ => {
                #[allow(clippy::redundant_closure_call)]
                (|raw| tracing::error!("invalid debug mode: {raw}"))(raw);
                None
            }
        }
    }
}