2 * This file is part of Cleanflight and Betaflight.
4 * Cleanflight and Betaflight are free software. You can redistribute
5 * this software and/or modify this software under the terms of the
6 * GNU General Public License as published by the Free Software
7 * Foundation, either version 3 of the License, or (at your option)
10 * Cleanflight and Betaflight are distributed in the hope that they
11 * will be useful, but WITHOUT ANY WARRANTY; without even the implied
12 * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13 * See the GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this software.
18 * If not, see <http://www.gnu.org/licenses/>.
26 #include "build/debug.h"
28 #include "blackbox/blackbox.h"
32 #include "common/utils.h"
33 #include "common/time.h"
35 #include "drivers/adc.h"
36 #include "drivers/bus_i2c.h"
37 #include "drivers/bus_spi.h"
38 #include "drivers/camera_control.h"
39 #include "drivers/light_led.h"
40 #include "drivers/pinio.h"
41 #include "drivers/vtx_common.h"
43 #include "fc/config.h"
44 #include "fc/controlrate_profile.h"
46 #include "fc/rc_adjustments.h"
47 #include "fc/rc_controls.h"
49 #include "flight/failsafe.h"
50 #include "flight/gps_rescue.h"
51 #include "flight/imu.h"
52 #include "flight/mixer.h"
53 #include "flight/pid.h"
54 #include "flight/position.h"
55 #include "flight/servos.h"
57 #include "interface/settings.h"
59 #include "io/beeper.h"
60 #include "io/dashboard.h"
61 #include "io/gimbal.h"
63 #include "io/ledstrip.h"
66 #include "io/vtx_control.h"
67 #include "io/vtx_rtc6705.h"
70 #include "pg/beeper.h"
71 #include "pg/beeper_dev.h"
72 #include "pg/bus_i2c.h"
73 #include "pg/dashboard.h"
75 #include "pg/gyrodev.h"
76 #include "pg/max7456.h"
79 #include "pg/pg_ids.h"
81 #include "pg/piniobox.h"
83 #include "pg/rx_spi.h"
84 #include "pg/rx_pwm.h"
85 #include "pg/sdcard.h"
89 #include "pg/rcdevice.h"
92 #include "rx/cc2500_frsky_common.h"
93 #include "rx/cc2500_sfhss.h"
94 #include "rx/spektrum.h"
95 #include "rx/cyrf6936_spektrum.h"
97 #include "sensors/acceleration.h"
98 #include "sensors/barometer.h"
99 #include "sensors/battery.h"
100 #include "sensors/boardalignment.h"
101 #include "sensors/compass.h"
102 #include "sensors/esc_sensor.h"
103 #include "sensors/gyro.h"
104 #include "sensors/rangefinder.h"
105 #include "sensors/rpm_filter.h"
107 #include "telemetry/frsky_hub.h"
108 #include "telemetry/ibus_shared.h"
109 #include "telemetry/telemetry.h"
111 // Sensor names (used in lookup tables for *_hardware settings and in status command output)
112 // sync with accelerationSensor_e
113 const char * const lookupTableAccHardware
[] = {
114 "AUTO", "NONE", "ADXL345", "MPU6050", "MMA8452", "BMA280", "LSM303DLHC",
115 "MPU6000", "MPU6500", "MPU9250", "ICM20601", "ICM20602", "ICM20608G", "ICM20649", "ICM20689",
119 // sync with gyroSensor_e
120 const char * const lookupTableGyroHardware
[] = {
121 "AUTO", "NONE", "MPU6050", "L3G4200D", "MPU3050", "L3GD20",
122 "MPU6000", "MPU6500", "MPU9250", "ICM20601", "ICM20602", "ICM20608G", "ICM20649", "ICM20689",
126 #if defined(USE_SENSOR_NAMES) || defined(USE_BARO)
127 // sync with baroSensor_e
128 const char * const lookupTableBaroHardware
[] = {
129 "AUTO", "NONE", "BMP085", "MS5611", "BMP280", "LPS", "QMP6988"
132 #if defined(USE_SENSOR_NAMES) || defined(USE_MAG)
133 // sync with magSensor_e
134 const char * const lookupTableMagHardware
[] = {
135 "AUTO", "NONE", "HMC5883", "AK8975", "AK8963", "QMC5883", "LIS3MDL"
138 #if defined(USE_SENSOR_NAMES) || defined(USE_RANGEFINDER)
139 const char * const lookupTableRangefinderHardware
[] = {
140 "NONE", "HCSR04", "TFMINI", "TF02"
144 static const char * const lookupTableOffOn
[] = {
148 static const char * const lookupTableCrashRecovery
[] = {
152 static const char * const lookupTableUnit
[] = {
156 static const char * const lookupTableAlignment
[] = {
168 #ifdef USE_MULTI_GYRO
169 static const char * const lookupTableGyro
[] = {
170 "FIRST", "SECOND", "BOTH"
175 static const char * const lookupTableGPSProvider
[] = {
176 "NMEA", "UBLOX", "MSP"
179 static const char * const lookupTableGPSSBASMode
[] = {
180 "AUTO", "EGNOS", "WAAS", "MSAS", "GAGAN"
185 static const char * const lookupTableGimbalMode
[] = {
191 static const char * const lookupTableBlackboxDevice
[] = {
192 "NONE", "SPIFLASH", "SDCARD", "SERIAL"
195 static const char * const lookupTableBlackboxMode
[] = {
196 "NORMAL", "MOTOR_TEST", "ALWAYS"
201 static const char * const lookupTableSerialRX
[] = {
219 // sync with rx_spi_protocol_e
220 static const char * const lookupTableRxSpi
[] = {
240 static const char * const lookupTableGyroHardwareLpf
[] = {
243 #ifdef USE_GYRO_DLPF_EXPERIMENTAL
248 #if defined(USE_32K_CAPABLE_GYRO) && defined(USE_GYRO_DLPF_EXPERIMENTAL)
249 static const char * const lookupTableGyro32khzHardwareLpf
[] = {
255 #ifdef USE_CAMERA_CONTROL
256 static const char * const lookupTableCameraControlMode
[] = {
263 static const char * const lookupTablePwmProtocol
[] = {
264 "OFF", "ONESHOT125", "ONESHOT42", "MULTISHOT", "BRUSHED",
266 "DSHOT150", "DSHOT300", "DSHOT600", "DSHOT1200", "PROSHOT1000"
270 static const char * const lookupTableRcInterpolation
[] = {
271 "OFF", "PRESET", "AUTO", "MANUAL"
274 static const char * const lookupTableRcInterpolationChannels
[] = {
275 "RP", "RPY", "RPYT", "T", "RPT",
278 static const char * const lookupTableLowpassType
[] = {
283 static const char * const lookupTableDtermLowpassType
[] = {
288 static const char * const lookupTableAntiGravityMode
[] = {
293 static const char * const lookupTableFailsafe
[] = {
294 "AUTO-LAND", "DROP", "GPS-RESCUE"
297 static const char * const lookupTableFailsafeSwitchMode
[] = {
298 "STAGE1", "KILL", "STAGE2"
301 static const char * const lookupTableBusType
[] = {
302 "NONE", "I2C", "SPI", "SLAVE",
303 #if defined(USE_SPI_GYRO) && defined(USE_I2C_GYRO)
309 static const char * const lookupTableMax7456Clock
[] = {
310 "HALF", "DEFAULT", "FULL"
314 #ifdef USE_GYRO_OVERFLOW_CHECK
315 static const char * const lookupTableGyroOverflowCheck
[] = {
320 static const char * const lookupTableRatesType
[] = {
321 "BETAFLIGHT", "RACEFLIGHT"
325 static const char * const lookupOverclock
[] = {
327 #if defined(STM32F40_41xxx)
328 "192MHZ", "216MHZ", "240MHZ"
329 #elif defined(STM32F411xE)
331 #elif defined(STM32F7)
338 static const char * const lookupLedStripFormatRGB
[] = {
343 static const char * const lookupTableThrottleLimitType
[] = {
344 "OFF", "SCALE", "CLIP"
348 #ifdef USE_GPS_RESCUE
349 static const char * const lookupTableRescueSanityType
[] = {
350 "RESCUE_SANITY_OFF", "RESCUE_SANITY_ON", "RESCUE_SANITY_FS_ONLY"
355 static const char * const lookupTableVideoSystem
[] = {
356 "AUTO", "PAL", "NTSC"
358 #endif // USE_MAX7456
360 #if defined(USE_ITERM_RELAX)
361 static const char * const lookupTableItermRelax
[] = {
362 "OFF", "RP", "RPY", "RP_INC", "RPY_INC"
364 static const char * const lookupTableItermRelaxType
[] = {
369 #ifdef USE_ACRO_TRAINER
370 static const char * const lookupTableAcroTrainerDebug
[] = {
373 #endif // USE_ACRO_TRAINER
375 #ifdef USE_RC_SMOOTHING_FILTER
376 static const char * const lookupTableRcSmoothingType
[] = {
377 "INTERPOLATION", "FILTER"
379 static const char * const lookupTableRcSmoothingDebug
[] = {
380 "ROLL", "PITCH", "YAW", "THROTTLE"
382 static const char * const lookupTableRcSmoothingInputType
[] = {
385 static const char * const lookupTableRcSmoothingDerivativeType
[] = {
386 "OFF", "PT1", "BIQUAD"
388 #endif // USE_RC_SMOOTHING_FILTER
390 #ifdef USE_GYRO_DATA_ANALYSE
391 static const char * const lookupTableDynamicFilterRange
[] = {
392 "HIGH", "MEDIUM", "LOW", "AUTO"
394 #endif // USE_GYRO_DATA_ANALYSE
396 #ifdef USE_VTX_COMMON
397 static const char * const lookupTableVtxLowPowerDisarm
[] = {
398 "OFF", "ON", "UNTIL_FIRST_ARM"
403 static const char * const lookupTableSdcardMode
[] = {
408 #ifdef USE_LAUNCH_CONTROL
409 static const char * const lookupTableLaunchControlMode
[] = {
410 "NORMAL", "PITCHONLY", "FULL"
415 static const char * const lookupTableTpaMode
[] = {
420 #define LOOKUP_TABLE_ENTRY(name) { name, ARRAYLEN(name) }
422 const lookupTableEntry_t lookupTables
[] = {
423 LOOKUP_TABLE_ENTRY(lookupTableOffOn
),
424 LOOKUP_TABLE_ENTRY(lookupTableUnit
),
425 LOOKUP_TABLE_ENTRY(lookupTableAlignment
),
427 LOOKUP_TABLE_ENTRY(lookupTableGPSProvider
),
428 LOOKUP_TABLE_ENTRY(lookupTableGPSSBASMode
),
429 #ifdef USE_GPS_RESCUE
430 LOOKUP_TABLE_ENTRY(lookupTableRescueSanityType
),
434 LOOKUP_TABLE_ENTRY(lookupTableBlackboxDevice
),
435 LOOKUP_TABLE_ENTRY(lookupTableBlackboxMode
),
437 LOOKUP_TABLE_ENTRY(currentMeterSourceNames
),
438 LOOKUP_TABLE_ENTRY(voltageMeterSourceNames
),
440 LOOKUP_TABLE_ENTRY(lookupTableGimbalMode
),
443 LOOKUP_TABLE_ENTRY(lookupTableSerialRX
),
446 LOOKUP_TABLE_ENTRY(lookupTableRxSpi
),
448 LOOKUP_TABLE_ENTRY(lookupTableGyroHardwareLpf
),
449 #if defined(USE_32K_CAPABLE_GYRO) && defined(USE_GYRO_DLPF_EXPERIMENTAL)
450 LOOKUP_TABLE_ENTRY(lookupTableGyro32khzHardwareLpf
),
452 LOOKUP_TABLE_ENTRY(lookupTableAccHardware
),
454 LOOKUP_TABLE_ENTRY(lookupTableBaroHardware
),
457 LOOKUP_TABLE_ENTRY(lookupTableMagHardware
),
459 LOOKUP_TABLE_ENTRY(debugModeNames
),
460 LOOKUP_TABLE_ENTRY(lookupTablePwmProtocol
),
461 LOOKUP_TABLE_ENTRY(lookupTableRcInterpolation
),
462 LOOKUP_TABLE_ENTRY(lookupTableRcInterpolationChannels
),
463 LOOKUP_TABLE_ENTRY(lookupTableLowpassType
),
464 LOOKUP_TABLE_ENTRY(lookupTableDtermLowpassType
),
465 LOOKUP_TABLE_ENTRY(lookupTableAntiGravityMode
),
466 LOOKUP_TABLE_ENTRY(lookupTableFailsafe
),
467 LOOKUP_TABLE_ENTRY(lookupTableFailsafeSwitchMode
),
468 LOOKUP_TABLE_ENTRY(lookupTableCrashRecovery
),
469 #ifdef USE_CAMERA_CONTROL
470 LOOKUP_TABLE_ENTRY(lookupTableCameraControlMode
),
472 LOOKUP_TABLE_ENTRY(lookupTableBusType
),
474 LOOKUP_TABLE_ENTRY(lookupTableMax7456Clock
),
476 #ifdef USE_RANGEFINDER
477 LOOKUP_TABLE_ENTRY(lookupTableRangefinderHardware
),
479 #ifdef USE_GYRO_OVERFLOW_CHECK
480 LOOKUP_TABLE_ENTRY(lookupTableGyroOverflowCheck
),
482 LOOKUP_TABLE_ENTRY(lookupTableRatesType
),
484 LOOKUP_TABLE_ENTRY(lookupOverclock
),
487 LOOKUP_TABLE_ENTRY(lookupLedStripFormatRGB
),
489 #ifdef USE_MULTI_GYRO
490 LOOKUP_TABLE_ENTRY(lookupTableGyro
),
492 LOOKUP_TABLE_ENTRY(lookupTableThrottleLimitType
),
494 LOOKUP_TABLE_ENTRY(lookupTableVideoSystem
),
495 #endif // USE_MAX7456
496 #if defined(USE_ITERM_RELAX)
497 LOOKUP_TABLE_ENTRY(lookupTableItermRelax
),
498 LOOKUP_TABLE_ENTRY(lookupTableItermRelaxType
),
500 #ifdef USE_ACRO_TRAINER
501 LOOKUP_TABLE_ENTRY(lookupTableAcroTrainerDebug
),
502 #endif // USE_ACRO_TRAINER
503 #ifdef USE_RC_SMOOTHING_FILTER
504 LOOKUP_TABLE_ENTRY(lookupTableRcSmoothingType
),
505 LOOKUP_TABLE_ENTRY(lookupTableRcSmoothingDebug
),
506 LOOKUP_TABLE_ENTRY(lookupTableRcSmoothingInputType
),
507 LOOKUP_TABLE_ENTRY(lookupTableRcSmoothingDerivativeType
),
508 #endif // USE_RC_SMOOTHING_FILTER
509 #ifdef USE_GYRO_DATA_ANALYSE
510 LOOKUP_TABLE_ENTRY(lookupTableDynamicFilterRange
),
511 #endif // USE_GYRO_DATA_ANALYSE
512 #ifdef USE_VTX_COMMON
513 LOOKUP_TABLE_ENTRY(lookupTableVtxLowPowerDisarm
),
515 LOOKUP_TABLE_ENTRY(lookupTableGyroHardware
),
517 LOOKUP_TABLE_ENTRY(lookupTableSdcardMode
),
519 #ifdef USE_LAUNCH_CONTROL
520 LOOKUP_TABLE_ENTRY(lookupTableLaunchControlMode
),
523 LOOKUP_TABLE_ENTRY(lookupTableTpaMode
),
527 #undef LOOKUP_TABLE_ENTRY
529 const clivalue_t valueTable
[] = {
531 { "align_gyro", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_ALIGNMENT
}, PG_GYRO_CONFIG
, offsetof(gyroConfig_t
, gyro_align
) },
532 { "gyro_hardware_lpf", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_GYRO_HARDWARE_LPF
}, PG_GYRO_CONFIG
, offsetof(gyroConfig_t
, gyro_hardware_lpf
) },
533 #if defined(USE_32K_CAPABLE_GYRO) && defined(USE_GYRO_DLPF_EXPERIMENTAL)
534 { "gyro_32khz_hardware_lpf", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_GYRO_32KHZ_HARDWARE_LPF
}, PG_GYRO_CONFIG
, offsetof(gyroConfig_t
, gyro_32khz_hardware_lpf
) },
536 #if defined(USE_GYRO_SPI_ICM20649)
537 { "gyro_high_range", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_GYRO_CONFIG
, offsetof(gyroConfig_t
, gyro_high_fsr
) },
539 { "gyro_sync_denom", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 1, 32 }, PG_GYRO_CONFIG
, offsetof(gyroConfig_t
, gyro_sync_denom
) },
541 { "gyro_lowpass_type", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_LOWPASS_TYPE
}, PG_GYRO_CONFIG
, offsetof(gyroConfig_t
, gyro_lowpass_type
) },
542 { "gyro_lowpass_hz", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, 16000 }, PG_GYRO_CONFIG
, offsetof(gyroConfig_t
, gyro_lowpass_hz
) },
544 { "gyro_lowpass2_type", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_LOWPASS_TYPE
}, PG_GYRO_CONFIG
, offsetof(gyroConfig_t
, gyro_lowpass2_type
) },
545 { "gyro_lowpass2_hz", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, 16000 }, PG_GYRO_CONFIG
, offsetof(gyroConfig_t
, gyro_lowpass2_hz
) },
547 { "gyro_notch1_hz", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, 16000 }, PG_GYRO_CONFIG
, offsetof(gyroConfig_t
, gyro_soft_notch_hz_1
) },
548 { "gyro_notch1_cutoff", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, 16000 }, PG_GYRO_CONFIG
, offsetof(gyroConfig_t
, gyro_soft_notch_cutoff_1
) },
549 { "gyro_notch2_hz", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, 16000 }, PG_GYRO_CONFIG
, offsetof(gyroConfig_t
, gyro_soft_notch_hz_2
) },
550 { "gyro_notch2_cutoff", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, 16000 }, PG_GYRO_CONFIG
, offsetof(gyroConfig_t
, gyro_soft_notch_cutoff_2
) },
552 { "gyro_calib_duration", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 50, 3000 }, PG_GYRO_CONFIG
, offsetof(gyroConfig_t
, gyroCalibrationDuration
) },
553 { "gyro_calib_noise_limit", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, 200 }, PG_GYRO_CONFIG
, offsetof(gyroConfig_t
, gyroMovementCalibrationThreshold
) },
554 { "gyro_offset_yaw", VAR_INT16
| MASTER_VALUE
, .config
.minmax
= { -1000, 1000 }, PG_GYRO_CONFIG
, offsetof(gyroConfig_t
, gyro_offset_yaw
) },
555 #ifdef USE_GYRO_OVERFLOW_CHECK
556 { "gyro_overflow_detect", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_GYRO_OVERFLOW_CHECK
}, PG_GYRO_CONFIG
, offsetof(gyroConfig_t
, checkOverflow
) },
558 #ifdef USE_YAW_SPIN_RECOVERY
559 { "yaw_spin_recovery", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_GYRO_CONFIG
, offsetof(gyroConfig_t
, yaw_spin_recovery
) },
560 { "yaw_spin_threshold", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 500, 1950 }, PG_GYRO_CONFIG
, offsetof(gyroConfig_t
, yaw_spin_threshold
) },
563 #if defined(GYRO_USES_SPI) && defined(USE_32K_CAPABLE_GYRO)
564 { "gyro_use_32khz", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_GYRO_CONFIG
, offsetof(gyroConfig_t
, gyro_use_32khz
) },
566 #ifdef USE_MULTI_GYRO
567 { "gyro_to_use", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_GYRO
}, PG_GYRO_CONFIG
, offsetof(gyroConfig_t
, gyro_to_use
) },
569 #if defined(USE_GYRO_DATA_ANALYSE)
570 { "dyn_notch_range", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_DYNAMIC_FILTER_RANGE
}, PG_GYRO_CONFIG
, offsetof(gyroConfig_t
, dyn_notch_range
) },
571 { "dyn_notch_width_percent", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, 20 }, PG_GYRO_CONFIG
, offsetof(gyroConfig_t
, dyn_notch_width_percent
) },
572 { "dyn_notch_q", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 1, 1000 }, PG_GYRO_CONFIG
, offsetof(gyroConfig_t
, dyn_notch_q
) },
573 { "dyn_notch_min_hz", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 1, 1000 }, PG_GYRO_CONFIG
, offsetof(gyroConfig_t
, dyn_notch_min_hz
) },
576 { "dyn_lpf_gyro_min_hz", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, 1000 }, PG_GYRO_CONFIG
, offsetof(gyroConfig_t
, dyn_lpf_gyro_min_hz
) },
577 { "dyn_lpf_gyro_max_hz", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, 1000 }, PG_GYRO_CONFIG
, offsetof(gyroConfig_t
, dyn_lpf_gyro_max_hz
) },
578 { "dyn_lpf_dterm_min_hz", VAR_UINT16
| PROFILE_VALUE
, .config
.minmax
= { 0, 1000 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, dyn_lpf_dterm_min_hz
) },
579 { "dyn_lpf_dterm_max_hz", VAR_UINT16
| PROFILE_VALUE
, .config
.minmax
= { 0, 1000 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, dyn_lpf_dterm_max_hz
) },
582 // PG_ACCELEROMETER_CONFIG
583 { "align_acc", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_ALIGNMENT
}, PG_ACCELEROMETER_CONFIG
, offsetof(accelerometerConfig_t
, acc_align
) },
584 { "acc_hardware", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_ACC_HARDWARE
}, PG_ACCELEROMETER_CONFIG
, offsetof(accelerometerConfig_t
, acc_hardware
) },
585 #if defined(USE_GYRO_SPI_ICM20649)
586 { "acc_high_range", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_ACCELEROMETER_CONFIG
, offsetof(accelerometerConfig_t
, acc_high_fsr
) },
588 { "acc_lpf_hz", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, 400 }, PG_ACCELEROMETER_CONFIG
, offsetof(accelerometerConfig_t
, acc_lpf_hz
) },
589 { "acc_trim_pitch", VAR_INT16
| MASTER_VALUE
, .config
.minmax
= { -300, 300 }, PG_ACCELEROMETER_CONFIG
, offsetof(accelerometerConfig_t
, accelerometerTrims
.values
.pitch
) },
590 { "acc_trim_roll", VAR_INT16
| MASTER_VALUE
, .config
.minmax
= { -300, 300 }, PG_ACCELEROMETER_CONFIG
, offsetof(accelerometerConfig_t
, accelerometerTrims
.values
.roll
) },
591 { "acc_calibration", VAR_INT16
| MASTER_VALUE
| MODE_ARRAY
, .config
.array
.length
= XYZ_AXIS_COUNT
, PG_ACCELEROMETER_CONFIG
, offsetof(accelerometerConfig_t
, accZero
.raw
) },
595 { "align_mag", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_ALIGNMENT
}, PG_COMPASS_CONFIG
, offsetof(compassConfig_t
, mag_align
) },
596 { "mag_bustype", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_BUS_TYPE
}, PG_COMPASS_CONFIG
, offsetof(compassConfig_t
, mag_bustype
) },
597 { "mag_i2c_device", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, I2CDEV_COUNT
}, PG_COMPASS_CONFIG
, offsetof(compassConfig_t
, mag_i2c_device
) },
598 { "mag_i2c_address", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, I2C_ADDR7_MAX
}, PG_COMPASS_CONFIG
, offsetof(compassConfig_t
, mag_i2c_address
) },
599 { "mag_spi_device", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, SPIDEV_COUNT
}, PG_COMPASS_CONFIG
, offsetof(compassConfig_t
, mag_spi_device
) },
600 { "mag_hardware", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_MAG_HARDWARE
}, PG_COMPASS_CONFIG
, offsetof(compassConfig_t
, mag_hardware
) },
601 { "mag_declination", VAR_INT16
| MASTER_VALUE
, .config
.minmax
= { -18000, 18000 }, PG_COMPASS_CONFIG
, offsetof(compassConfig_t
, mag_declination
) },
602 { "mag_calibration", VAR_INT16
| MASTER_VALUE
| MODE_ARRAY
, .config
.array
.length
= XYZ_AXIS_COUNT
, PG_COMPASS_CONFIG
, offsetof(compassConfig_t
, magZero
.raw
) },
605 // PG_BAROMETER_CONFIG
607 { "baro_bustype", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_BUS_TYPE
}, PG_BAROMETER_CONFIG
, offsetof(barometerConfig_t
, baro_bustype
) },
608 { "baro_spi_device", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, 5 }, PG_BAROMETER_CONFIG
, offsetof(barometerConfig_t
, baro_spi_device
) },
609 { "baro_i2c_device", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, 5 }, PG_BAROMETER_CONFIG
, offsetof(barometerConfig_t
, baro_i2c_device
) },
610 { "baro_i2c_address", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, I2C_ADDR7_MAX
}, PG_BAROMETER_CONFIG
, offsetof(barometerConfig_t
, baro_i2c_address
) },
611 { "baro_hardware", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_BARO_HARDWARE
}, PG_BAROMETER_CONFIG
, offsetof(barometerConfig_t
, baro_hardware
) },
612 { "baro_tab_size", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, BARO_SAMPLE_COUNT_MAX
}, PG_BAROMETER_CONFIG
, offsetof(barometerConfig_t
, baro_sample_count
) },
613 { "baro_noise_lpf", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, 1000 }, PG_BAROMETER_CONFIG
, offsetof(barometerConfig_t
, baro_noise_lpf
) },
614 { "baro_cf_vel", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, 1000 }, PG_BAROMETER_CONFIG
, offsetof(barometerConfig_t
, baro_cf_vel
) },
615 { "baro_cf_alt", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, 1000 }, PG_BAROMETER_CONFIG
, offsetof(barometerConfig_t
, baro_cf_alt
) },
619 { "mid_rc", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 1200, 1700 }, PG_RX_CONFIG
, offsetof(rxConfig_t
, midrc
) },
620 { "min_check", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { PWM_PULSE_MIN
, PWM_PULSE_MAX
}, PG_RX_CONFIG
, offsetof(rxConfig_t
, mincheck
) },
621 { "max_check", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { PWM_PULSE_MIN
, PWM_PULSE_MAX
}, PG_RX_CONFIG
, offsetof(rxConfig_t
, maxcheck
) },
622 { "rssi_channel", VAR_INT8
| MASTER_VALUE
, .config
.minmax
= { 0, MAX_SUPPORTED_RC_CHANNEL_COUNT
}, PG_RX_CONFIG
, offsetof(rxConfig_t
, rssi_channel
) },
623 { "rssi_src_frame_errors", VAR_INT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_RX_CONFIG
, offsetof(rxConfig_t
, rssi_src_frame_errors
) },
624 { "rssi_scale", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { RSSI_SCALE_MIN
, RSSI_SCALE_MAX
}, PG_RX_CONFIG
, offsetof(rxConfig_t
, rssi_scale
) },
625 { "rssi_offset", VAR_INT8
| MASTER_VALUE
, .config
.minmax
= { -100, 100 }, PG_RX_CONFIG
, offsetof(rxConfig_t
, rssi_offset
) },
626 { "rssi_invert", VAR_INT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_RX_CONFIG
, offsetof(rxConfig_t
, rssi_invert
) },
627 { "rc_interp", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_RC_INTERPOLATION
}, PG_RX_CONFIG
, offsetof(rxConfig_t
, rcInterpolation
) },
628 { "rc_interp_ch", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_RC_INTERPOLATION_CHANNELS
}, PG_RX_CONFIG
, offsetof(rxConfig_t
, rcInterpolationChannels
) },
629 { "rc_interp_int", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 1, 50 }, PG_RX_CONFIG
, offsetof(rxConfig_t
, rcInterpolationInterval
) },
631 #ifdef USE_RC_SMOOTHING_FILTER
632 { "rc_smoothing_type", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_RC_SMOOTHING_TYPE
}, PG_RX_CONFIG
, offsetof(rxConfig_t
, rc_smoothing_type
) },
633 { "rc_smoothing_input_hz", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, UINT8_MAX
}, PG_RX_CONFIG
, offsetof(rxConfig_t
, rc_smoothing_input_cutoff
) },
634 { "rc_smoothing_derivative_hz", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, UINT8_MAX
}, PG_RX_CONFIG
, offsetof(rxConfig_t
, rc_smoothing_derivative_cutoff
) },
635 { "rc_smoothing_debug_axis", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_RC_SMOOTHING_DEBUG
}, PG_RX_CONFIG
, offsetof(rxConfig_t
, rc_smoothing_debug_axis
) },
636 { "rc_smoothing_input_type", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_RC_SMOOTHING_INPUT_TYPE
}, PG_RX_CONFIG
, offsetof(rxConfig_t
, rc_smoothing_input_type
) },
637 { "rc_smoothing_derivative_type",VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_RC_SMOOTHING_DERIVATIVE_TYPE
}, PG_RX_CONFIG
, offsetof(rxConfig_t
, rc_smoothing_derivative_type
) },
638 { "rc_smoothing_auto_smoothness",VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, 50 }, PG_RX_CONFIG
, offsetof(rxConfig_t
, rc_smoothing_auto_factor
) },
639 #endif // USE_RC_SMOOTHING_FILTER
641 { "fpv_mix_degrees", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, 90 }, PG_RX_CONFIG
, offsetof(rxConfig_t
, fpvCamAngleDegrees
) },
642 { "max_aux_channels", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, MAX_AUX_CHANNEL_COUNT
}, PG_RX_CONFIG
, offsetof(rxConfig_t
, max_aux_channel
) },
644 { "serialrx_provider", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_SERIAL_RX
}, PG_RX_CONFIG
, offsetof(rxConfig_t
, serialrx_provider
) },
645 { "serialrx_inverted", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_RX_CONFIG
, offsetof(rxConfig_t
, serialrx_inverted
) },
647 #ifdef USE_SPEKTRUM_BIND
648 { "spektrum_sat_bind", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { SPEKTRUM_SAT_BIND_DISABLED
, SPEKTRUM_SAT_BIND_MAX
}, PG_RX_CONFIG
, offsetof(rxConfig_t
, spektrum_sat_bind
) },
649 { "spektrum_sat_bind_autoreset",VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_RX_CONFIG
, offsetof(rxConfig_t
, spektrum_sat_bind_autoreset
) },
651 { "airmode_start_throttle_percent", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, 100 }, PG_RX_CONFIG
, offsetof(rxConfig_t
, airModeActivateThreshold
) },
652 { "rx_min_usec", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { PWM_PULSE_MIN
, PWM_PULSE_MAX
}, PG_RX_CONFIG
, offsetof(rxConfig_t
, rx_min_usec
) },
653 { "rx_max_usec", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { PWM_PULSE_MIN
, PWM_PULSE_MAX
}, PG_RX_CONFIG
, offsetof(rxConfig_t
, rx_max_usec
) },
654 { "serialrx_halfduplex", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_RX_CONFIG
, offsetof(rxConfig_t
, halfDuplex
) },
656 { "rx_spi_protocol", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_RX_SPI
}, PG_RX_SPI_CONFIG
, offsetof(rxSpiConfig_t
, rx_spi_protocol
) },
657 { "rx_spi_bus", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, SPIDEV_COUNT
}, PG_RX_SPI_CONFIG
, offsetof(rxSpiConfig_t
, spibus
) },
658 { "rx_spi_led_inversion", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_RX_SPI_CONFIG
, offsetof(rxSpiConfig_t
, ledInversion
) },
663 { "adc_device", VAR_INT8
| MASTER_VALUE
, .config
.minmax
= { 0, ADCDEV_COUNT
}, PG_ADC_CONFIG
, offsetof(adcConfig_t
, device
) },
664 { "adc_vrefint_calibration", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, 2000 }, PG_ADC_CONFIG
, offsetof(adcConfig_t
, vrefIntCalibration
) },
665 { "adc_tempsensor_calibration30", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, 2000 }, PG_ADC_CONFIG
, offsetof(adcConfig_t
, tempSensorCalibration1
) },
666 { "adc_tempsensor_calibration110", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, 2000 }, PG_ADC_CONFIG
, offsetof(adcConfig_t
, tempSensorCalibration2
) },
671 { "input_filtering_mode", VAR_INT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_PWM_CONFIG
, offsetof(pwmConfig_t
, inputFilteringMode
) },
674 // PG_BLACKBOX_CONFIG
676 { "blackbox_p_ratio", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, INT16_MAX
}, PG_BLACKBOX_CONFIG
, offsetof(blackboxConfig_t
, p_ratio
) },
677 { "blackbox_device", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_BLACKBOX_DEVICE
}, PG_BLACKBOX_CONFIG
, offsetof(blackboxConfig_t
, device
) },
678 { "blackbox_record_acc", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_BLACKBOX_CONFIG
, offsetof(blackboxConfig_t
, record_acc
) },
679 { "blackbox_mode", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_BLACKBOX_MODE
}, PG_BLACKBOX_CONFIG
, offsetof(blackboxConfig_t
, mode
) },
683 { "min_throttle", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { PWM_PULSE_MIN
, PWM_PULSE_MAX
}, PG_MOTOR_CONFIG
, offsetof(motorConfig_t
, minthrottle
) },
684 { "max_throttle", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { PWM_PULSE_MIN
, PWM_PULSE_MAX
}, PG_MOTOR_CONFIG
, offsetof(motorConfig_t
, maxthrottle
) },
685 { "min_command", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { PWM_PULSE_MIN
, PWM_PULSE_MAX
}, PG_MOTOR_CONFIG
, offsetof(motorConfig_t
, mincommand
) },
687 { "dshot_idle_value", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, 2000 }, PG_MOTOR_CONFIG
, offsetof(motorConfig_t
, digitalIdleOffsetValue
) },
688 #ifdef USE_DSHOT_DMAR
689 { "dshot_burst", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_MOTOR_CONFIG
, offsetof(motorConfig_t
, dev
.useBurstDshot
) },
690 #ifdef USE_DSHOT_TELEMETRY
691 { "dshot_bidir", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_MOTOR_CONFIG
, offsetof(motorConfig_t
, dev
.useDshotTelemetry
) },
695 { "use_unsynced_pwm", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_MOTOR_CONFIG
, offsetof(motorConfig_t
, dev
.useUnsyncedPwm
) },
696 { "motor_pwm_protocol", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_MOTOR_PWM_PROTOCOL
}, PG_MOTOR_CONFIG
, offsetof(motorConfig_t
, dev
.motorPwmProtocol
) },
697 { "motor_pwm_rate", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 200, 32000 }, PG_MOTOR_CONFIG
, offsetof(motorConfig_t
, dev
.motorPwmRate
) },
698 { "motor_pwm_inversion", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_MOTOR_CONFIG
, offsetof(motorConfig_t
, dev
.motorPwmInversion
) },
699 { "motor_poles", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 4, UINT8_MAX
}, PG_MOTOR_CONFIG
, offsetof(motorConfig_t
, motorPoleCount
) },
701 // PG_THROTTLE_CORRECTION_CONFIG
702 { "thr_corr_value", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, 150 }, PG_THROTTLE_CORRECTION_CONFIG
, offsetof(throttleCorrectionConfig_t
, throttle_correction_value
) },
703 { "thr_corr_angle", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 1, 900 }, PG_THROTTLE_CORRECTION_CONFIG
, offsetof(throttleCorrectionConfig_t
, throttle_correction_angle
) },
705 // PG_FAILSAFE_CONFIG
706 { "failsafe_delay", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, 200 }, PG_FAILSAFE_CONFIG
, offsetof(failsafeConfig_t
, failsafe_delay
) },
707 { "failsafe_off_delay", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, 200 }, PG_FAILSAFE_CONFIG
, offsetof(failsafeConfig_t
, failsafe_off_delay
) },
708 { "failsafe_throttle", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { PWM_PULSE_MIN
, PWM_PULSE_MAX
}, PG_FAILSAFE_CONFIG
, offsetof(failsafeConfig_t
, failsafe_throttle
) },
709 { "failsafe_switch_mode", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_FAILSAFE_SWITCH_MODE
}, PG_FAILSAFE_CONFIG
, offsetof(failsafeConfig_t
, failsafe_switch_mode
) },
710 { "failsafe_throttle_low_delay",VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, 300 }, PG_FAILSAFE_CONFIG
, offsetof(failsafeConfig_t
, failsafe_throttle_low_delay
) },
711 { "failsafe_procedure", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_FAILSAFE
}, PG_FAILSAFE_CONFIG
, offsetof(failsafeConfig_t
, failsafe_procedure
) },
713 // PG_BOARDALIGNMENT_CONFIG
714 { "align_board_roll", VAR_INT16
| MASTER_VALUE
, .config
.minmax
= { -180, 360 }, PG_BOARD_ALIGNMENT
, offsetof(boardAlignment_t
, rollDegrees
) },
715 { "align_board_pitch", VAR_INT16
| MASTER_VALUE
, .config
.minmax
= { -180, 360 }, PG_BOARD_ALIGNMENT
, offsetof(boardAlignment_t
, pitchDegrees
) },
716 { "align_board_yaw", VAR_INT16
| MASTER_VALUE
, .config
.minmax
= { -180, 360 }, PG_BOARD_ALIGNMENT
, offsetof(boardAlignment_t
, yawDegrees
) },
720 { "gimbal_mode", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_GIMBAL_MODE
}, PG_GIMBAL_CONFIG
, offsetof(gimbalConfig_t
, mode
) },
724 { "bat_capacity", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, 20000 }, PG_BATTERY_CONFIG
, offsetof(batteryConfig_t
, batteryCapacity
) },
725 { "vbat_max_cell_voltage", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { VBAT_CELL_VOTAGE_RANGE_MIN
, VBAT_CELL_VOTAGE_RANGE_MAX
}, PG_BATTERY_CONFIG
, offsetof(batteryConfig_t
, vbatmaxcellvoltage
) },
726 { "vbat_full_cell_voltage", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { VBAT_CELL_VOTAGE_RANGE_MIN
, VBAT_CELL_VOTAGE_RANGE_MAX
}, PG_BATTERY_CONFIG
, offsetof(batteryConfig_t
, vbatfullcellvoltage
) },
727 { "vbat_min_cell_voltage", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { VBAT_CELL_VOTAGE_RANGE_MIN
, VBAT_CELL_VOTAGE_RANGE_MAX
}, PG_BATTERY_CONFIG
, offsetof(batteryConfig_t
, vbatmincellvoltage
) },
728 { "vbat_warning_cell_voltage", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { VBAT_CELL_VOTAGE_RANGE_MIN
, VBAT_CELL_VOTAGE_RANGE_MAX
}, PG_BATTERY_CONFIG
, offsetof(batteryConfig_t
, vbatwarningcellvoltage
) },
729 { "vbat_hysteresis", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, 250 }, PG_BATTERY_CONFIG
, offsetof(batteryConfig_t
, vbathysteresis
) },
730 { "current_meter", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_CURRENT_METER
}, PG_BATTERY_CONFIG
, offsetof(batteryConfig_t
, currentMeterSource
) },
731 { "battery_meter", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_VOLTAGE_METER
}, PG_BATTERY_CONFIG
, offsetof(batteryConfig_t
, voltageMeterSource
) },
732 { "vbat_detect_cell_voltage", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, 2000 }, PG_BATTERY_CONFIG
, offsetof(batteryConfig_t
, vbatnotpresentcellvoltage
) },
733 { "use_vbat_alerts", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_BATTERY_CONFIG
, offsetof(batteryConfig_t
, useVBatAlerts
) },
734 { "use_cbat_alerts", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_BATTERY_CONFIG
, offsetof(batteryConfig_t
, useConsumptionAlerts
) },
735 { "cbat_alert_percent", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, 100 }, PG_BATTERY_CONFIG
, offsetof(batteryConfig_t
, consumptionWarningPercentage
) },
736 { "vbat_cutoff_percent", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, 100 }, PG_BATTERY_CONFIG
, offsetof(batteryConfig_t
, lvcPercentage
) },
737 { "force_battery_cell_count", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, 24 }, PG_BATTERY_CONFIG
, offsetof(batteryConfig_t
, forceBatteryCellCount
) },
739 // PG_VOLTAGE_SENSOR_ADC_CONFIG
740 { "vbat_scale", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { VBAT_SCALE_MIN
, VBAT_SCALE_MAX
}, PG_VOLTAGE_SENSOR_ADC_CONFIG
, offsetof(voltageSensorADCConfig_t
, vbatscale
) },
741 { "vbat_divider", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { VBAT_DIVIDER_MIN
, VBAT_DIVIDER_MAX
}, PG_VOLTAGE_SENSOR_ADC_CONFIG
, offsetof(voltageSensorADCConfig_t
, vbatresdivval
) },
742 { "vbat_multiplier", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { VBAT_MULTIPLIER_MIN
, VBAT_MULTIPLIER_MAX
}, PG_VOLTAGE_SENSOR_ADC_CONFIG
, offsetof(voltageSensorADCConfig_t
, vbatresdivmultiplier
) },
744 // PG_CURRENT_SENSOR_ADC_CONFIG
745 { "ibata_scale", VAR_INT16
| MASTER_VALUE
, .config
.minmax
= { -16000, 16000 }, PG_CURRENT_SENSOR_ADC_CONFIG
, offsetof(currentSensorADCConfig_t
, scale
) },
746 { "ibata_offset", VAR_INT16
| MASTER_VALUE
, .config
.minmax
= { -32000, 32000 }, PG_CURRENT_SENSOR_ADC_CONFIG
, offsetof(currentSensorADCConfig_t
, offset
) },
747 // PG_CURRENT_SENSOR_ADC_CONFIG
748 #ifdef USE_VIRTUAL_CURRENT_METER
749 { "ibatv_scale", VAR_INT16
| MASTER_VALUE
, .config
.minmax
= { -16000, 16000 }, PG_CURRENT_SENSOR_VIRTUAL_CONFIG
, offsetof(currentSensorVirtualConfig_t
, scale
) },
750 { "ibatv_offset", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, 16000 }, PG_CURRENT_SENSOR_VIRTUAL_CONFIG
, offsetof(currentSensorVirtualConfig_t
, offset
) },
754 // PG_BEEPER_DEV_CONFIG
755 { "beeper_inversion", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_BEEPER_DEV_CONFIG
, offsetof(beeperDevConfig_t
, isInverted
) },
756 { "beeper_od", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_BEEPER_DEV_CONFIG
, offsetof(beeperDevConfig_t
, isOpenDrain
) },
757 { "beeper_frequency", VAR_INT16
| MASTER_VALUE
, .config
.minmax
= { 0, 16000 }, PG_BEEPER_DEV_CONFIG
, offsetof(beeperDevConfig_t
, frequency
) },
761 { "beeper_dshot_beacon_tone", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= {1, DSHOT_CMD_BEACON5
}, PG_BEEPER_CONFIG
, offsetof(beeperConfig_t
, dshotBeaconTone
) },
766 { "yaw_motors_reversed", VAR_INT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_MIXER_CONFIG
, offsetof(mixerConfig_t
, yaw_motors_reversed
) },
767 { "crashflip_motor_percent", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, 100 }, PG_MIXER_CONFIG
, offsetof(mixerConfig_t
, crashflip_motor_percent
) },
769 // PG_MOTOR_3D_CONFIG
770 { "3d_deadband_low", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { PWM_PULSE_MIN
, PWM_RANGE_MIDDLE
}, PG_MOTOR_3D_CONFIG
, offsetof(flight3DConfig_t
, deadband3d_low
) },
771 { "3d_deadband_high", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { PWM_RANGE_MIDDLE
, PWM_PULSE_MAX
}, PG_MOTOR_3D_CONFIG
, offsetof(flight3DConfig_t
, deadband3d_high
) },
772 { "3d_neutral", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { PWM_PULSE_MIN
, PWM_PULSE_MAX
}, PG_MOTOR_3D_CONFIG
, offsetof(flight3DConfig_t
, neutral3d
) },
773 { "3d_deadband_throttle", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 1, 100 }, PG_MOTOR_3D_CONFIG
, offsetof(flight3DConfig_t
, deadband3d_throttle
) },
774 { "3d_limit_low", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { PWM_PULSE_MIN
, PWM_RANGE_MIDDLE
}, PG_MOTOR_3D_CONFIG
, offsetof(flight3DConfig_t
, limit3d_low
) },
775 { "3d_limit_high", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { PWM_RANGE_MIDDLE
, PWM_PULSE_MAX
}, PG_MOTOR_3D_CONFIG
, offsetof(flight3DConfig_t
, limit3d_high
) },
776 { "3d_switched_mode", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_MOTOR_3D_CONFIG
, offsetof(flight3DConfig_t
, switched_mode3d
) },
780 { "servo_center_pulse", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { PWM_PULSE_MIN
, PWM_PULSE_MAX
}, PG_SERVO_CONFIG
, offsetof(servoConfig_t
, dev
.servoCenterPulse
) },
781 { "servo_pwm_rate", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 50, 498 }, PG_SERVO_CONFIG
, offsetof(servoConfig_t
, dev
.servoPwmRate
) },
782 { "servo_lowpass_hz", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, 400}, PG_SERVO_CONFIG
, offsetof(servoConfig_t
, servo_lowpass_freq
) },
783 { "tri_unarmed_servo", VAR_INT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_SERVO_CONFIG
, offsetof(servoConfig_t
, tri_unarmed_servo
) },
784 { "channel_forwarding_start", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { AUX1
, MAX_SUPPORTED_RC_CHANNEL_COUNT
}, PG_SERVO_CONFIG
, offsetof(servoConfig_t
, channelForwardingStartChannel
) },
787 // PG_CONTROLRATE_PROFILES
788 { "thr_mid", VAR_UINT8
| PROFILE_RATE_VALUE
, .config
.minmax
= { 0, 100 }, PG_CONTROL_RATE_PROFILES
, offsetof(controlRateConfig_t
, thrMid8
) },
789 { "thr_expo", VAR_UINT8
| PROFILE_RATE_VALUE
, .config
.minmax
= { 0, 100 }, PG_CONTROL_RATE_PROFILES
, offsetof(controlRateConfig_t
, thrExpo8
) },
790 { "rates_type", VAR_UINT8
| PROFILE_RATE_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_RATES_TYPE
}, PG_CONTROL_RATE_PROFILES
, offsetof(controlRateConfig_t
, rates_type
) },
791 { "roll_rc_rate", VAR_UINT8
| PROFILE_RATE_VALUE
, .config
.minmax
= { 1, CONTROL_RATE_CONFIG_RC_RATES_MAX
}, PG_CONTROL_RATE_PROFILES
, offsetof(controlRateConfig_t
, rcRates
[FD_ROLL
]) },
792 { "pitch_rc_rate", VAR_UINT8
| PROFILE_RATE_VALUE
, .config
.minmax
= { 1, CONTROL_RATE_CONFIG_RC_RATES_MAX
}, PG_CONTROL_RATE_PROFILES
, offsetof(controlRateConfig_t
, rcRates
[FD_PITCH
]) },
793 { "yaw_rc_rate", VAR_UINT8
| PROFILE_RATE_VALUE
, .config
.minmax
= { 1, CONTROL_RATE_CONFIG_RC_RATES_MAX
}, PG_CONTROL_RATE_PROFILES
, offsetof(controlRateConfig_t
, rcRates
[FD_YAW
]) },
794 { "roll_expo", VAR_UINT8
| PROFILE_RATE_VALUE
, .config
.minmax
= { 0, CONTROL_RATE_CONFIG_RC_EXPO_MAX
}, PG_CONTROL_RATE_PROFILES
, offsetof(controlRateConfig_t
, rcExpo
[FD_ROLL
]) },
795 { "pitch_expo", VAR_UINT8
| PROFILE_RATE_VALUE
, .config
.minmax
= { 0, CONTROL_RATE_CONFIG_RC_EXPO_MAX
}, PG_CONTROL_RATE_PROFILES
, offsetof(controlRateConfig_t
, rcExpo
[FD_PITCH
]) },
796 { "yaw_expo", VAR_UINT8
| PROFILE_RATE_VALUE
, .config
.minmax
= { 0, CONTROL_RATE_CONFIG_RC_EXPO_MAX
}, PG_CONTROL_RATE_PROFILES
, offsetof(controlRateConfig_t
, rcExpo
[FD_YAW
]) },
797 { "roll_srate", VAR_UINT8
| PROFILE_RATE_VALUE
, .config
.minmax
= { 0, CONTROL_RATE_CONFIG_RATE_MAX
}, PG_CONTROL_RATE_PROFILES
, offsetof(controlRateConfig_t
, rates
[FD_ROLL
]) },
798 { "pitch_srate", VAR_UINT8
| PROFILE_RATE_VALUE
, .config
.minmax
= { 0, CONTROL_RATE_CONFIG_RATE_MAX
}, PG_CONTROL_RATE_PROFILES
, offsetof(controlRateConfig_t
, rates
[FD_PITCH
]) },
799 { "yaw_srate", VAR_UINT8
| PROFILE_RATE_VALUE
, .config
.minmax
= { 0, CONTROL_RATE_CONFIG_RATE_MAX
}, PG_CONTROL_RATE_PROFILES
, offsetof(controlRateConfig_t
, rates
[FD_YAW
]) },
800 { "tpa_rate", VAR_UINT8
| PROFILE_RATE_VALUE
, .config
.minmax
= { 0, CONTROL_RATE_CONFIG_TPA_MAX
}, PG_CONTROL_RATE_PROFILES
, offsetof(controlRateConfig_t
, dynThrPID
) },
801 { "tpa_breakpoint", VAR_UINT16
| PROFILE_RATE_VALUE
, .config
.minmax
= { PWM_PULSE_MIN
, PWM_PULSE_MAX
}, PG_CONTROL_RATE_PROFILES
, offsetof(controlRateConfig_t
, tpa_breakpoint
) },
803 { "tpa_mode", VAR_UINT8
| PROFILE_RATE_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_TPA_MODE
}, PG_CONTROL_RATE_PROFILES
, offsetof(controlRateConfig_t
, tpaMode
) },
805 { "throttle_limit_type", VAR_UINT8
| PROFILE_RATE_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_THROTTLE_LIMIT_TYPE
}, PG_CONTROL_RATE_PROFILES
, offsetof(controlRateConfig_t
, throttle_limit_type
) },
806 { "throttle_limit_percent", VAR_UINT8
| PROFILE_RATE_VALUE
, .config
.minmax
= { 25, 100 }, PG_CONTROL_RATE_PROFILES
, offsetof(controlRateConfig_t
, throttle_limit_percent
) },
807 { "roll_rate_limit", VAR_UINT16
| PROFILE_RATE_VALUE
, .config
.minmax
= { CONTROL_RATE_CONFIG_RATE_LIMIT_MIN
, CONTROL_RATE_CONFIG_RATE_LIMIT_MAX
}, PG_CONTROL_RATE_PROFILES
, offsetof(controlRateConfig_t
, rate_limit
[FD_ROLL
]) },
808 { "pitch_rate_limit", VAR_UINT16
| PROFILE_RATE_VALUE
, .config
.minmax
= { CONTROL_RATE_CONFIG_RATE_LIMIT_MIN
, CONTROL_RATE_CONFIG_RATE_LIMIT_MAX
}, PG_CONTROL_RATE_PROFILES
, offsetof(controlRateConfig_t
, rate_limit
[FD_PITCH
]) },
809 { "yaw_rate_limit", VAR_UINT16
| PROFILE_RATE_VALUE
, .config
.minmax
= { CONTROL_RATE_CONFIG_RATE_LIMIT_MIN
, CONTROL_RATE_CONFIG_RATE_LIMIT_MAX
}, PG_CONTROL_RATE_PROFILES
, offsetof(controlRateConfig_t
, rate_limit
[FD_YAW
]) },
812 { "reboot_character", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 48, 126 }, PG_SERIAL_CONFIG
, offsetof(serialConfig_t
, reboot_character
) },
813 { "serial_update_rate_hz", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 100, 2000 }, PG_SERIAL_CONFIG
, offsetof(serialConfig_t
, serial_update_rate_hz
) },
816 { "imu_dcm_kp", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, 32000 }, PG_IMU_CONFIG
, offsetof(imuConfig_t
, dcm_kp
) },
817 { "imu_dcm_ki", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, 32000 }, PG_IMU_CONFIG
, offsetof(imuConfig_t
, dcm_ki
) },
818 { "small_angle", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, 180 }, PG_IMU_CONFIG
, offsetof(imuConfig_t
, small_angle
) },
821 { "auto_disarm_delay", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, 60 }, PG_ARMING_CONFIG
, offsetof(armingConfig_t
, auto_disarm_delay
) },
822 { "gyro_cal_on_first_arm", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_ARMING_CONFIG
, offsetof(armingConfig_t
, gyro_cal_on_first_arm
) },
827 { "gps_provider", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_GPS_PROVIDER
}, PG_GPS_CONFIG
, offsetof(gpsConfig_t
, provider
) },
828 { "gps_sbas_mode", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_GPS_SBAS_MODE
}, PG_GPS_CONFIG
, offsetof(gpsConfig_t
, sbasMode
) },
829 { "gps_auto_config", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_GPS_CONFIG
, offsetof(gpsConfig_t
, autoConfig
) },
830 { "gps_auto_baud", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_GPS_CONFIG
, offsetof(gpsConfig_t
, autoBaud
) },
831 { "gps_ublox_use_galileo", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_GPS_CONFIG
, offsetof(gpsConfig_t
, gps_ublox_use_galileo
) },
833 #ifdef USE_GPS_RESCUE
835 { "gps_rescue_angle", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, 200 }, PG_GPS_RESCUE
, offsetof(gpsRescueConfig_t
, angle
) },
836 { "gps_rescue_initial_alt", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 20, 100 }, PG_GPS_RESCUE
, offsetof(gpsRescueConfig_t
, initialAltitudeM
) },
837 { "gps_rescue_descent_dist", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 30, 500 }, PG_GPS_RESCUE
, offsetof(gpsRescueConfig_t
, descentDistanceM
) },
838 { "gps_rescue_ground_speed", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 30, 3000 }, PG_GPS_RESCUE
, offsetof(gpsRescueConfig_t
, rescueGroundspeed
) },
839 { "gps_rescue_throttle_p", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, 500 }, PG_GPS_RESCUE
, offsetof(gpsRescueConfig_t
, throttleP
) },
840 { "gps_rescue_throttle_i", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, 500 }, PG_GPS_RESCUE
, offsetof(gpsRescueConfig_t
, throttleI
) },
841 { "gps_rescue_throttle_d", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, 500 }, PG_GPS_RESCUE
, offsetof(gpsRescueConfig_t
, throttleD
) },
842 { "gps_rescue_velocity_p", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, 500 }, PG_GPS_RESCUE
, offsetof(gpsRescueConfig_t
, velP
) },
843 { "gps_rescue_velocity_i", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, 500 }, PG_GPS_RESCUE
, offsetof(gpsRescueConfig_t
, velI
) },
844 { "gps_rescue_velocity_d", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, 500 }, PG_GPS_RESCUE
, offsetof(gpsRescueConfig_t
, velD
) },
845 { "gps_rescue_yaw_p", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, 500 }, PG_GPS_RESCUE
, offsetof(gpsRescueConfig_t
, yawP
) },
847 { "gps_rescue_throttle_min", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 1000, 2000 }, PG_GPS_RESCUE
, offsetof(gpsRescueConfig_t
, throttleMin
) },
848 { "gps_rescue_throttle_max", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 1000, 2000 }, PG_GPS_RESCUE
, offsetof(gpsRescueConfig_t
, throttleMax
) },
849 { "gps_rescue_throttle_hover", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 1000, 2000 }, PG_GPS_RESCUE
, offsetof(gpsRescueConfig_t
, throttleHover
) },
850 { "gps_rescue_sanity_checks", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_GPS_RESCUE
}, PG_GPS_RESCUE
, offsetof(gpsRescueConfig_t
, sanityChecks
) },
851 { "gps_rescue_min_sats", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 5, 50 }, PG_GPS_RESCUE
, offsetof(gpsRescueConfig_t
, minSats
) },
852 { "gps_rescue_min_dth", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 50, 1000 }, PG_GPS_RESCUE
, offsetof(gpsRescueConfig_t
, minRescueDth
) },
853 { "gps_rescue_allow_arming_without_fix", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_GPS_RESCUE
, offsetof(gpsRescueConfig_t
, allowArmingWithoutFix
) },
857 { "deadband", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, 32 }, PG_RC_CONTROLS_CONFIG
, offsetof(rcControlsConfig_t
, deadband
) },
858 { "yaw_deadband", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, 100 }, PG_RC_CONTROLS_CONFIG
, offsetof(rcControlsConfig_t
, yaw_deadband
) },
859 { "yaw_control_reversed", VAR_INT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_RC_CONTROLS_CONFIG
, offsetof(rcControlsConfig_t
, yaw_control_reversed
) },
862 { "pid_process_denom", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 1, MAX_PID_PROCESS_DENOM
}, PG_PID_CONFIG
, offsetof(pidConfig_t
, pid_process_denom
) },
863 #ifdef USE_RUNAWAY_TAKEOFF
864 { "runaway_takeoff_prevention", VAR_UINT8
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_PID_CONFIG
, offsetof(pidConfig_t
, runaway_takeoff_prevention
) }, // enables/disables runaway takeoff prevention
865 { "runaway_takeoff_deactivate_delay", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 100, 1000 }, PG_PID_CONFIG
, offsetof(pidConfig_t
, runaway_takeoff_deactivate_delay
) }, // deactivate time in ms
866 { "runaway_takeoff_deactivate_throttle_percent", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, 100 }, PG_PID_CONFIG
, offsetof(pidConfig_t
, runaway_takeoff_deactivate_throttle
) }, // minimum throttle percentage during deactivation phase
870 { "dterm_lowpass_type", VAR_UINT8
| PROFILE_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_DTERM_LOWPASS_TYPE
}, PG_PID_PROFILE
, offsetof(pidProfile_t
, dterm_filter_type
) },
871 { "dterm_lowpass_hz", VAR_INT16
| PROFILE_VALUE
, .config
.minmax
= { 0, 16000 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, dterm_lowpass_hz
) },
872 { "dterm_lowpass2_type", VAR_UINT8
| PROFILE_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_DTERM_LOWPASS_TYPE
}, PG_PID_PROFILE
, offsetof(pidProfile_t
, dterm_filter2_type
) },
873 { "dterm_lowpass2_hz", VAR_INT16
| PROFILE_VALUE
, .config
.minmax
= { 0, 16000 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, dterm_lowpass2_hz
) },
874 { "dterm_notch_hz", VAR_UINT16
| PROFILE_VALUE
, .config
.minmax
= { 0, 16000 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, dterm_notch_hz
) },
875 { "dterm_notch_cutoff", VAR_UINT16
| PROFILE_VALUE
, .config
.minmax
= { 0, 16000 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, dterm_notch_cutoff
) },
876 { "vbat_pid_gain", VAR_UINT8
| PROFILE_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_PID_PROFILE
, offsetof(pidProfile_t
, vbatPidCompensation
) },
877 { "pid_at_min_throttle", VAR_UINT8
| PROFILE_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_PID_PROFILE
, offsetof(pidProfile_t
, pidAtMinThrottle
) },
878 { "anti_gravity_mode", VAR_UINT8
| PROFILE_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_ANTI_GRAVITY_MODE
}, PG_PID_PROFILE
, offsetof(pidProfile_t
, antiGravityMode
) },
879 { "anti_gravity_threshold", VAR_UINT16
| PROFILE_VALUE
, .config
.minmax
= { 20, 1000 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, itermThrottleThreshold
) },
880 { "anti_gravity_gain", VAR_UINT16
| PROFILE_VALUE
, .config
.minmax
= { 1000, 30000 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, itermAcceleratorGain
) },
881 { "feedforward_transition", VAR_UINT8
| PROFILE_VALUE
, .config
.minmax
= { 0, 100 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, feedForwardTransition
) },
882 { "acc_limit_yaw", VAR_UINT16
| PROFILE_VALUE
, .config
.minmax
= { 0, 500 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, yawRateAccelLimit
) },
883 { "acc_limit", VAR_UINT16
| PROFILE_VALUE
, .config
.minmax
= { 0, 500 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, rateAccelLimit
) },
884 { "crash_dthreshold", VAR_UINT16
| PROFILE_VALUE
, .config
.minmax
= { 0, 2000 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, crash_dthreshold
) },
885 { "crash_gthreshold", VAR_UINT16
| PROFILE_VALUE
, .config
.minmax
= { 0, 2000 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, crash_gthreshold
) },
886 { "crash_setpoint_threshold", VAR_UINT16
| PROFILE_VALUE
, .config
.minmax
= { 0, 2000 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, crash_setpoint_threshold
) },
887 { "crash_time", VAR_UINT16
| PROFILE_VALUE
, .config
.minmax
= { 0, 5000 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, crash_time
) },
888 { "crash_delay", VAR_UINT16
| PROFILE_VALUE
, .config
.minmax
= { 0, 500 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, crash_delay
) },
889 { "crash_recovery_angle", VAR_UINT8
| PROFILE_VALUE
, .config
.minmax
= { 0, 30 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, crash_recovery_angle
) },
890 { "crash_recovery_rate", VAR_UINT8
| PROFILE_VALUE
, .config
.minmax
= { 0, 255 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, crash_recovery_rate
) },
891 { "crash_limit_yaw", VAR_UINT16
| PROFILE_VALUE
, .config
.minmax
= { 0, 1000 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, crash_limit_yaw
) },
892 { "crash_recovery", VAR_UINT8
| PROFILE_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_CRASH_RECOVERY
}, PG_PID_PROFILE
, offsetof(pidProfile_t
, crash_recovery
) },
894 { "iterm_rotation", VAR_UINT8
| PROFILE_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_PID_PROFILE
, offsetof(pidProfile_t
, iterm_rotation
) },
895 #if defined(USE_SMART_FEEDFORWARD)
896 { "smart_feedforward", VAR_UINT8
| PROFILE_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_PID_PROFILE
, offsetof(pidProfile_t
, smart_feedforward
) },
898 #if defined(USE_ITERM_RELAX)
899 { "iterm_relax", VAR_UINT8
| PROFILE_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_ITERM_RELAX
}, PG_PID_PROFILE
, offsetof(pidProfile_t
, iterm_relax
) },
900 { "iterm_relax_type", VAR_UINT8
| PROFILE_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_ITERM_RELAX_TYPE
}, PG_PID_PROFILE
, offsetof(pidProfile_t
, iterm_relax_type
) },
901 { "iterm_relax_cutoff", VAR_UINT8
| PROFILE_VALUE
, .config
.minmax
= { 1, 100 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, iterm_relax_cutoff
) },
903 { "iterm_windup", VAR_UINT8
| PROFILE_VALUE
, .config
.minmax
= { 30, 100 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, itermWindupPointPercent
) },
904 { "iterm_limit", VAR_UINT16
| PROFILE_VALUE
, .config
.minmax
= { 0, 500 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, itermLimit
) },
905 { "pidsum_limit", VAR_UINT16
| PROFILE_VALUE
, .config
.minmax
= { PIDSUM_LIMIT_MIN
, PIDSUM_LIMIT_MAX
}, PG_PID_PROFILE
, offsetof(pidProfile_t
, pidSumLimit
) },
906 { "pidsum_limit_yaw", VAR_UINT16
| PROFILE_VALUE
, .config
.minmax
= { PIDSUM_LIMIT_MIN
, PIDSUM_LIMIT_MAX
}, PG_PID_PROFILE
, offsetof(pidProfile_t
, pidSumLimitYaw
) },
907 { "yaw_lowpass_hz", VAR_UINT16
| PROFILE_VALUE
, .config
.minmax
= { 0, 500 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, yaw_lowpass_hz
) },
909 #if defined(USE_THROTTLE_BOOST)
910 { "throttle_boost", VAR_UINT8
| PROFILE_VALUE
, .config
.minmax
= { 0, 100 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, throttle_boost
) },
911 { "throttle_boost_cutoff", VAR_UINT8
| PROFILE_VALUE
, .config
.minmax
= { 5, 50 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, throttle_boost_cutoff
) },
914 #ifdef USE_ACRO_TRAINER
915 { "acro_trainer_angle_limit", VAR_UINT8
| PROFILE_VALUE
, .config
.minmax
= { 10, 80 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, acro_trainer_angle_limit
) },
916 { "acro_trainer_lookahead_ms", VAR_UINT16
| PROFILE_VALUE
, .config
.minmax
= { 10, 200 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, acro_trainer_lookahead_ms
) },
917 { "acro_trainer_debug_axis", VAR_UINT8
| PROFILE_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_ACRO_TRAINER_DEBUG
}, PG_PID_PROFILE
, offsetof(pidProfile_t
, acro_trainer_debug_axis
) },
918 { "acro_trainer_gain", VAR_UINT8
| PROFILE_VALUE
, .config
.minmax
= { 25, 255 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, acro_trainer_gain
) },
919 #endif // USE_ACRO_TRAINER
921 { "p_pitch", VAR_UINT8
| PROFILE_VALUE
, .config
.minmax
= { 0, 200 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, pid
[PID_PITCH
].P
) },
922 { "i_pitch", VAR_UINT8
| PROFILE_VALUE
, .config
.minmax
= { 0, 200 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, pid
[PID_PITCH
].I
) },
923 { "d_pitch", VAR_UINT8
| PROFILE_VALUE
, .config
.minmax
= { 0, 200 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, pid
[PID_PITCH
].D
) },
924 { "f_pitch", VAR_UINT16
| PROFILE_VALUE
, .config
.minmax
= { 0, 2000 },PG_PID_PROFILE
, offsetof(pidProfile_t
, pid
[PID_PITCH
].F
) },
925 { "p_roll", VAR_UINT8
| PROFILE_VALUE
, .config
.minmax
= { 0, 200 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, pid
[PID_ROLL
].P
) },
926 { "i_roll", VAR_UINT8
| PROFILE_VALUE
, .config
.minmax
= { 0, 200 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, pid
[PID_ROLL
].I
) },
927 { "d_roll", VAR_UINT8
| PROFILE_VALUE
, .config
.minmax
= { 0, 200 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, pid
[PID_ROLL
].D
) },
928 { "f_roll", VAR_UINT16
| PROFILE_VALUE
, .config
.minmax
= { 0, 2000 },PG_PID_PROFILE
, offsetof(pidProfile_t
, pid
[PID_ROLL
].F
) },
929 { "p_yaw", VAR_UINT8
| PROFILE_VALUE
, .config
.minmax
= { 0, 200 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, pid
[PID_YAW
].P
) },
930 { "i_yaw", VAR_UINT8
| PROFILE_VALUE
, .config
.minmax
= { 0, 200 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, pid
[PID_YAW
].I
) },
931 { "d_yaw", VAR_UINT8
| PROFILE_VALUE
, .config
.minmax
= { 0, 200 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, pid
[PID_YAW
].D
) },
932 { "f_yaw", VAR_UINT16
| PROFILE_VALUE
, .config
.minmax
= { 0, 2000 },PG_PID_PROFILE
, offsetof(pidProfile_t
, pid
[PID_YAW
].F
) },
934 { "angle_level_strength", VAR_UINT8
| PROFILE_VALUE
, .config
.minmax
= { 0, 200 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, pid
[PID_LEVEL
].P
) },
935 { "horizon_level_strength", VAR_UINT8
| PROFILE_VALUE
, .config
.minmax
= { 0, 200 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, pid
[PID_LEVEL
].I
) },
936 { "horizon_transition", VAR_UINT8
| PROFILE_VALUE
, .config
.minmax
= { 0, 200 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, pid
[PID_LEVEL
].D
) },
938 { "level_limit", VAR_UINT8
| PROFILE_VALUE
, .config
.minmax
= { 10, 90 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, levelAngleLimit
) },
940 { "horizon_tilt_effect", VAR_UINT8
| PROFILE_VALUE
, .config
.minmax
= { 0, 250 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, horizon_tilt_effect
) },
941 { "horizon_tilt_expert_mode", VAR_UINT8
| PROFILE_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_PID_PROFILE
, offsetof(pidProfile_t
, horizon_tilt_expert_mode
) },
943 #if defined(USE_ABSOLUTE_CONTROL)
944 { "abs_control_gain", VAR_UINT8
| PROFILE_VALUE
, .config
.minmax
= { 0, 20 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, abs_control_gain
) },
945 { "abs_control_limit", VAR_UINT8
| PROFILE_VALUE
, .config
.minmax
= { 10, 255 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, abs_control_limit
) },
946 { "abs_control_error_limit", VAR_UINT8
| PROFILE_VALUE
, .config
.minmax
= { 1, 45 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, abs_control_error_limit
) },
947 { "abs_control_cutoff", VAR_UINT8
| PROFILE_VALUE
, .config
.minmax
= { 1, 45 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, abs_control_cutoff
) },
950 #ifdef USE_INTEGRATED_YAW_CONTROL
951 { "use_integrated_yaw", VAR_UINT8
| PROFILE_VALUE
| MODE_LOOKUP
, .config
.lookup
= {TABLE_OFF_ON
}, PG_PID_PROFILE
, offsetof(pidProfile_t
, use_integrated_yaw
) },
952 { "integrated_yaw_relax", VAR_UINT8
| PROFILE_VALUE
, .config
.minmax
= { 0, 255 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, integrated_yaw_relax
) },
955 #ifdef USE_LAUNCH_CONTROL
956 { "launch_control_mode", VAR_UINT8
| PROFILE_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_LAUNCH_CONTROL_MODE
}, PG_PID_PROFILE
, offsetof(pidProfile_t
, launchControlMode
) },
957 { "launch_trigger_allow_reset", VAR_UINT8
| PROFILE_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_PID_PROFILE
, offsetof(pidProfile_t
, launchControlAllowTriggerReset
) },
958 { "launch_trigger_throttle_percent", VAR_UINT8
| PROFILE_VALUE
, .config
.minmax
= { 0, LAUNCH_CONTROL_THROTTLE_TRIGGER_MAX
}, PG_PID_PROFILE
, offsetof(pidProfile_t
, launchControlThrottlePercent
) },
959 { "launch_angle_limit", VAR_UINT8
| PROFILE_VALUE
, .config
.minmax
= { 0, 80 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, launchControlAngleLimit
) },
960 { "launch_control_gain", VAR_UINT8
| PROFILE_VALUE
, .config
.minmax
= { 0, 200 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, launchControlGain
) },
963 #ifdef USE_THRUST_LINEARIZATION
964 { "thrust_linear", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, 100 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, thrustLinearization
) },
967 // PG_TELEMETRY_CONFIG
969 { "tlm_inverted", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_TELEMETRY_CONFIG
, offsetof(telemetryConfig_t
, telemetry_inverted
) },
970 { "tlm_halfduplex", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_TELEMETRY_CONFIG
, offsetof(telemetryConfig_t
, halfDuplex
) },
971 #if defined(USE_TELEMETRY_FRSKY_HUB)
973 { "frsky_default_lat", VAR_INT16
| MASTER_VALUE
, .config
.minmax
= { -9000, 9000 }, PG_TELEMETRY_CONFIG
, offsetof(telemetryConfig_t
, gpsNoFixLatitude
) },
974 { "frsky_default_long", VAR_INT16
| MASTER_VALUE
, .config
.minmax
= { -18000, 18000 }, PG_TELEMETRY_CONFIG
, offsetof(telemetryConfig_t
, gpsNoFixLongitude
) },
975 { "frsky_gps_format", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, FRSKY_FORMAT_NMEA
}, PG_TELEMETRY_CONFIG
, offsetof(telemetryConfig_t
, frsky_coordinate_format
) },
976 { "frsky_unit", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_UNIT
}, PG_TELEMETRY_CONFIG
, offsetof(telemetryConfig_t
, frsky_unit
) },
978 { "frsky_vfas_precision", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { FRSKY_VFAS_PRECISION_LOW
, FRSKY_VFAS_PRECISION_HIGH
}, PG_TELEMETRY_CONFIG
, offsetof(telemetryConfig_t
, frsky_vfas_precision
) },
979 #endif // USE_TELEMETRY_FRSKY_HUB
980 { "hott_alarm_int", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, 120 }, PG_TELEMETRY_CONFIG
, offsetof(telemetryConfig_t
, hottAlarmSoundInterval
) },
981 { "pid_in_tlm", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= {TABLE_OFF_ON
}, PG_TELEMETRY_CONFIG
, offsetof(telemetryConfig_t
, pidValuesAsTelemetry
) },
982 { "report_cell_voltage", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_TELEMETRY_CONFIG
, offsetof(telemetryConfig_t
, report_cell_voltage
) },
983 #if defined(USE_TELEMETRY_IBUS)
984 { "ibus_sensor", VAR_UINT8
| MASTER_VALUE
| MODE_ARRAY
, .config
.array
.length
= IBUS_SENSOR_COUNT
, PG_TELEMETRY_CONFIG
, offsetof(telemetryConfig_t
, flysky_sensors
)},
986 #ifdef USE_TELEMETRY_MAVLINK
987 // Support for misusing the heading field in MAVlink to indicate mAh drawn for Connex Prosight OSD
988 // Set to 10 to show a tenth of your capacity drawn.
989 // Set to $size_of_battery to get a percentage of battery used.
990 { "mavlink_mah_as_heading_divisor", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, 30000 }, PG_TELEMETRY_CONFIG
, offsetof(telemetryConfig_t
, mavlink_mah_as_heading_divisor
) },
992 { "telemetry_disabled_sensors", VAR_UINT32
| MASTER_VALUE
, .config
.u32_max
= SENSOR_ALL
, PG_TELEMETRY_CONFIG
, offsetof(telemetryConfig_t
, disabledSensors
)},
993 #endif // USE_TELEMETRY
995 // PG_LED_STRIP_CONFIG
997 { "ledstrip_visual_beeper", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_LED_STRIP_CONFIG
, offsetof(ledStripConfig_t
, ledstrip_visual_beeper
) },
998 { "ledstrip_grb_rgb", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_RGB_GRB
}, PG_LED_STRIP_CONFIG
, offsetof(ledStripConfig_t
, ledstrip_grb_rgb
) },
1003 { "sdcard_detect_inverted", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_SDCARD_CONFIG
, offsetof(sdcardConfig_t
, cardDetectInverted
) },
1004 { "sdcard_mode", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_SDCARD_MODE
}, PG_SDCARD_CONFIG
, offsetof(sdcardConfig_t
, mode
) },
1006 #ifdef USE_SDCARD_SPI
1007 { "sdcard_dma", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_SDCARD_CONFIG
, offsetof(sdcardConfig_t
, useDma
) },
1008 { "sdcard_spi_bus", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, SPIDEV_COUNT
}, PG_SDCARD_CONFIG
, offsetof(sdcardConfig_t
, device
) },
1010 #ifdef USE_SDCARD_SDIO
1011 { "sdio_clk_bypass", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_SDIO_CONFIG
, offsetof(sdioConfig_t
, clockBypass
) },
1012 { "sdio_use_cache", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_SDIO_CONFIG
, offsetof(sdioConfig_t
, useCache
) },
1013 { "sdio_use_4bit_width", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_SDIO_CONFIG
, offsetof(sdioConfig_t
, use4BitWidth
) },
1018 { "osd_units", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_UNIT
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, units
) },
1020 { "osd_warn_arming_disable", VAR_UINT16
| MASTER_VALUE
| MODE_BITSET
, .config
.bitpos
= OSD_WARNING_ARMING_DISABLE
, PG_OSD_CONFIG
, offsetof(osdConfig_t
, enabledWarnings
)},
1021 { "osd_warn_batt_not_full", VAR_UINT16
| MASTER_VALUE
| MODE_BITSET
, .config
.bitpos
= OSD_WARNING_BATTERY_NOT_FULL
, PG_OSD_CONFIG
, offsetof(osdConfig_t
, enabledWarnings
)},
1022 { "osd_warn_batt_warning", VAR_UINT16
| MASTER_VALUE
| MODE_BITSET
, .config
.bitpos
= OSD_WARNING_BATTERY_WARNING
, PG_OSD_CONFIG
, offsetof(osdConfig_t
, enabledWarnings
)},
1023 { "osd_warn_batt_critical", VAR_UINT16
| MASTER_VALUE
| MODE_BITSET
, .config
.bitpos
= OSD_WARNING_BATTERY_CRITICAL
, PG_OSD_CONFIG
, offsetof(osdConfig_t
, enabledWarnings
)},
1024 { "osd_warn_visual_beeper", VAR_UINT16
| MASTER_VALUE
| MODE_BITSET
, .config
.bitpos
= OSD_WARNING_VISUAL_BEEPER
, PG_OSD_CONFIG
, offsetof(osdConfig_t
, enabledWarnings
)},
1025 { "osd_warn_crash_flip", VAR_UINT16
| MASTER_VALUE
| MODE_BITSET
, .config
.bitpos
= OSD_WARNING_CRASH_FLIP
, PG_OSD_CONFIG
, offsetof(osdConfig_t
, enabledWarnings
)},
1026 { "osd_warn_esc_fail", VAR_UINT16
| MASTER_VALUE
| MODE_BITSET
, .config
.bitpos
= OSD_WARNING_ESC_FAIL
, PG_OSD_CONFIG
, offsetof(osdConfig_t
, enabledWarnings
)},
1027 { "osd_warn_no_gps_rescue", VAR_UINT16
| MASTER_VALUE
| MODE_BITSET
, .config
.bitpos
= OSD_WARNING_GPS_RESCUE_UNAVAILABLE
, PG_OSD_CONFIG
, offsetof(osdConfig_t
, enabledWarnings
)},
1028 #ifdef USE_ADC_INTERNAL
1029 { "osd_warn_core_temp", VAR_UINT16
| MASTER_VALUE
| MODE_BITSET
, .config
.bitpos
= OSD_WARNING_CORE_TEMPERATURE
, PG_OSD_CONFIG
, offsetof(osdConfig_t
, enabledWarnings
)},
1031 #ifdef USE_RC_SMOOTHING_FILTER
1032 { "osd_warn_rc_smoothing", VAR_UINT16
| MASTER_VALUE
| MODE_BITSET
, .config
.bitpos
= OSD_WARNING_RC_SMOOTHING
, PG_OSD_CONFIG
, offsetof(osdConfig_t
, enabledWarnings
)},
1034 { "osd_warn_fail_safe", VAR_UINT16
| MASTER_VALUE
| MODE_BITSET
, .config
.bitpos
= OSD_WARNING_FAIL_SAFE
, PG_OSD_CONFIG
, offsetof(osdConfig_t
, enabledWarnings
)},
1035 #ifdef USE_LAUNCH_CONTROL
1036 { "osd_warn_launch_control", VAR_UINT16
| MASTER_VALUE
| MODE_BITSET
, .config
.bitpos
= OSD_WARNING_LAUNCH_CONTROL
, PG_OSD_CONFIG
, offsetof(osdConfig_t
, enabledWarnings
)},
1038 { "osd_rssi_alarm", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, 100 }, PG_OSD_CONFIG
, offsetof(osdConfig_t
, rssi_alarm
) },
1039 { "osd_cap_alarm", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, 20000 }, PG_OSD_CONFIG
, offsetof(osdConfig_t
, cap_alarm
) },
1040 { "osd_alt_alarm", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, 10000 }, PG_OSD_CONFIG
, offsetof(osdConfig_t
, alt_alarm
) },
1041 { "osd_esc_temp_alarm", VAR_INT8
| MASTER_VALUE
, .config
.minmax
= { INT8_MIN
, INT8_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, esc_temp_alarm
) },
1042 { "osd_esc_rpm_alarm", VAR_INT16
| MASTER_VALUE
, .config
.minmax
= { ESC_RPM_ALARM_OFF
, INT16_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, esc_rpm_alarm
) },
1043 { "osd_esc_current_alarm", VAR_INT16
| MASTER_VALUE
, .config
.minmax
= { ESC_CURRENT_ALARM_OFF
, INT16_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, esc_current_alarm
) },
1044 #ifdef USE_ADC_INTERNAL
1045 { "osd_core_temp_alarm", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, UINT8_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, core_temp_alarm
) },
1048 { "osd_ah_max_pit", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, 90 }, PG_OSD_CONFIG
, offsetof(osdConfig_t
, ahMaxPitch
) },
1049 { "osd_ah_max_rol", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, 90 }, PG_OSD_CONFIG
, offsetof(osdConfig_t
, ahMaxRoll
) },
1050 { "osd_ah_invert", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, ahInvert
) },
1052 { "osd_tim1", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, INT16_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, timers
[OSD_TIMER_1
]) },
1053 { "osd_tim2", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, INT16_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, timers
[OSD_TIMER_2
]) },
1055 { "osd_vbat_pos", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, OSD_POSCFG_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, item_pos
[OSD_MAIN_BATT_VOLTAGE
]) },
1056 { "osd_rssi_pos", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, OSD_POSCFG_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, item_pos
[OSD_RSSI_VALUE
]) },
1057 #ifdef USE_RX_LINK_QUALITY_INFO
1058 { "osd_link_quality_pos", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, OSD_POSCFG_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, item_pos
[OSD_LINK_QUALITY
]) },
1060 { "osd_tim_1_pos", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, OSD_POSCFG_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, item_pos
[OSD_ITEM_TIMER_1
]) },
1061 { "osd_tim_2_pos", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, OSD_POSCFG_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, item_pos
[OSD_ITEM_TIMER_2
]) },
1062 { "osd_remaining_time_estimate_pos", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, OSD_POSCFG_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, item_pos
[OSD_REMAINING_TIME_ESTIMATE
]) },
1063 { "osd_flymode_pos", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, OSD_POSCFG_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, item_pos
[OSD_FLYMODE
]) },
1064 { "osd_anti_gravity_pos", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, OSD_POSCFG_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, item_pos
[OSD_ANTI_GRAVITY
]) },
1065 { "osd_g_force_pos", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, OSD_POSCFG_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, item_pos
[OSD_G_FORCE
]) },
1066 { "osd_throttle_pos", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, OSD_POSCFG_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, item_pos
[OSD_THROTTLE_POS
]) },
1067 { "osd_vtx_channel_pos", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, OSD_POSCFG_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, item_pos
[OSD_VTX_CHANNEL
]) },
1068 { "osd_crosshairs_pos", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, OSD_POSCFG_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, item_pos
[OSD_CROSSHAIRS
]) },
1069 { "osd_ah_sbar_pos", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, OSD_POSCFG_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, item_pos
[OSD_HORIZON_SIDEBARS
]) },
1070 { "osd_ah_pos", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, OSD_POSCFG_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, item_pos
[OSD_ARTIFICIAL_HORIZON
]) },
1071 { "osd_current_pos", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, OSD_POSCFG_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, item_pos
[OSD_CURRENT_DRAW
]) },
1072 { "osd_mah_drawn_pos", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, OSD_POSCFG_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, item_pos
[OSD_MAH_DRAWN
]) },
1073 { "osd_motor_diag_pos", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, OSD_POSCFG_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, item_pos
[OSD_MOTOR_DIAG
]) },
1074 { "osd_craft_name_pos", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, OSD_POSCFG_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, item_pos
[OSD_CRAFT_NAME
]) },
1075 { "osd_gps_speed_pos", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, OSD_POSCFG_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, item_pos
[OSD_GPS_SPEED
]) },
1076 { "osd_gps_lon_pos", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, OSD_POSCFG_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, item_pos
[OSD_GPS_LON
]) },
1077 { "osd_gps_lat_pos", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, OSD_POSCFG_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, item_pos
[OSD_GPS_LAT
]) },
1078 { "osd_gps_sats_pos", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, OSD_POSCFG_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, item_pos
[OSD_GPS_SATS
]) },
1079 { "osd_home_dir_pos", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, OSD_POSCFG_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, item_pos
[OSD_HOME_DIR
]) },
1080 { "osd_home_dist_pos", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, OSD_POSCFG_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, item_pos
[OSD_HOME_DIST
]) },
1081 { "osd_flight_dist_pos", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, OSD_POSCFG_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, item_pos
[OSD_FLIGHT_DIST
]) },
1082 { "osd_compass_bar_pos", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, OSD_POSCFG_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, item_pos
[OSD_COMPASS_BAR
]) },
1083 { "osd_altitude_pos", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, OSD_POSCFG_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, item_pos
[OSD_ALTITUDE
]) },
1084 { "osd_pid_roll_pos", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, OSD_POSCFG_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, item_pos
[OSD_ROLL_PIDS
]) },
1085 { "osd_pid_pitch_pos", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, OSD_POSCFG_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, item_pos
[OSD_PITCH_PIDS
]) },
1086 { "osd_pid_yaw_pos", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, OSD_POSCFG_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, item_pos
[OSD_YAW_PIDS
]) },
1087 { "osd_debug_pos", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, OSD_POSCFG_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, item_pos
[OSD_DEBUG
]) },
1088 { "osd_power_pos", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, OSD_POSCFG_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, item_pos
[OSD_POWER
]) },
1089 { "osd_pidrate_profile_pos", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, OSD_POSCFG_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, item_pos
[OSD_PIDRATE_PROFILE
]) },
1090 { "osd_warnings_pos", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, OSD_POSCFG_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, item_pos
[OSD_WARNINGS
]) },
1091 { "osd_avg_cell_voltage_pos", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, OSD_POSCFG_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, item_pos
[OSD_AVG_CELL_VOLTAGE
]) },
1092 { "osd_pit_ang_pos", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, OSD_POSCFG_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, item_pos
[OSD_PITCH_ANGLE
]) },
1093 { "osd_rol_ang_pos", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, OSD_POSCFG_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, item_pos
[OSD_ROLL_ANGLE
]) },
1094 { "osd_battery_usage_pos", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, OSD_POSCFG_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, item_pos
[OSD_MAIN_BATT_USAGE
]) },
1095 { "osd_disarmed_pos", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, OSD_POSCFG_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, item_pos
[OSD_DISARMED
]) },
1096 { "osd_nheading_pos", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, OSD_POSCFG_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, item_pos
[OSD_NUMERICAL_HEADING
]) },
1098 { "osd_nvario_pos", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, OSD_POSCFG_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, item_pos
[OSD_NUMERICAL_VARIO
]) },
1100 { "osd_esc_tmp_pos", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, OSD_POSCFG_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, item_pos
[OSD_ESC_TMP
]) },
1101 { "osd_esc_rpm_pos", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, OSD_POSCFG_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, item_pos
[OSD_ESC_RPM
]) },
1102 { "osd_rtc_date_time_pos", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, OSD_POSCFG_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, item_pos
[OSD_RTC_DATETIME
]) },
1103 { "osd_adjustment_range_pos", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, OSD_POSCFG_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, item_pos
[OSD_ADJUSTMENT_RANGE
]) },
1104 { "osd_flip_arrow_pos", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, OSD_POSCFG_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, item_pos
[OSD_FLIP_ARROW
]) },
1105 #ifdef USE_ADC_INTERNAL
1106 { "osd_core_temp_pos", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, OSD_POSCFG_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, item_pos
[OSD_CORE_TEMPERATURE
]) },
1109 { "osd_log_status_pos", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, OSD_POSCFG_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, item_pos
[OSD_LOG_STATUS
]) },
1112 #ifdef USE_OSD_STICK_OVERLAY
1113 { "osd_stick_overlay_left_pos", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, OSD_POSCFG_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, item_pos
[OSD_STICK_OVERLAY_LEFT
]) },
1114 { "osd_stick_overlay_right_pos", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, OSD_POSCFG_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, item_pos
[OSD_STICK_OVERLAY_RIGHT
]) },
1116 { "osd_stick_overlay_radio_mode", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 1, 4 }, PG_OSD_CONFIG
, offsetof(osdConfig_t
, overlay_radio_mode
) },
1119 // OSD stats enabled flags are stored as bitmapped values inside a 32bit parameter
1120 // It is recommended to keep the settings order the same as the enumeration. This way the settings are displayed in the cli in the same order making it easier on the users
1121 { "osd_stat_rtc_date_time", VAR_UINT32
| MASTER_VALUE
| MODE_BITSET
, .config
.bitpos
= OSD_STAT_RTC_DATE_TIME
, PG_OSD_CONFIG
, offsetof(osdConfig_t
, enabled_stats
)},
1122 { "osd_stat_tim_1", VAR_UINT32
| MASTER_VALUE
| MODE_BITSET
, .config
.bitpos
= OSD_STAT_TIMER_1
, PG_OSD_CONFIG
, offsetof(osdConfig_t
, enabled_stats
)},
1123 { "osd_stat_tim_2", VAR_UINT32
| MASTER_VALUE
| MODE_BITSET
, .config
.bitpos
= OSD_STAT_TIMER_2
, PG_OSD_CONFIG
, offsetof(osdConfig_t
, enabled_stats
)},
1124 { "osd_stat_max_spd", VAR_UINT32
| MASTER_VALUE
| MODE_BITSET
, .config
.bitpos
= OSD_STAT_MAX_SPEED
, PG_OSD_CONFIG
, offsetof(osdConfig_t
, enabled_stats
)},
1125 { "osd_stat_max_dist", VAR_UINT32
| MASTER_VALUE
| MODE_BITSET
, .config
.bitpos
= OSD_STAT_MAX_DISTANCE
, PG_OSD_CONFIG
, offsetof(osdConfig_t
, enabled_stats
)},
1126 { "osd_stat_min_batt", VAR_UINT32
| MASTER_VALUE
| MODE_BITSET
, .config
.bitpos
= OSD_STAT_MIN_BATTERY
, PG_OSD_CONFIG
, offsetof(osdConfig_t
, enabled_stats
)},
1127 { "osd_stat_endbatt", VAR_UINT32
| MASTER_VALUE
| MODE_BITSET
, .config
.bitpos
= OSD_STAT_END_BATTERY
, PG_OSD_CONFIG
, offsetof(osdConfig_t
, enabled_stats
)},
1128 { "osd_stat_battery", VAR_UINT32
| MASTER_VALUE
| MODE_BITSET
, .config
.bitpos
= OSD_STAT_BATTERY
, PG_OSD_CONFIG
, offsetof(osdConfig_t
, enabled_stats
)},
1129 { "osd_stat_min_rssi", VAR_UINT32
| MASTER_VALUE
| MODE_BITSET
, .config
.bitpos
= OSD_STAT_MIN_RSSI
, PG_OSD_CONFIG
, offsetof(osdConfig_t
, enabled_stats
)},
1130 { "osd_stat_max_curr", VAR_UINT32
| MASTER_VALUE
| MODE_BITSET
, .config
.bitpos
= OSD_STAT_MAX_CURRENT
, PG_OSD_CONFIG
, offsetof(osdConfig_t
, enabled_stats
)},
1131 { "osd_stat_used_mah", VAR_UINT32
| MASTER_VALUE
| MODE_BITSET
, .config
.bitpos
= OSD_STAT_USED_MAH
, PG_OSD_CONFIG
, offsetof(osdConfig_t
, enabled_stats
)},
1132 { "osd_stat_max_alt", VAR_UINT32
| MASTER_VALUE
| MODE_BITSET
, .config
.bitpos
= OSD_STAT_MAX_ALTITUDE
, PG_OSD_CONFIG
, offsetof(osdConfig_t
, enabled_stats
)},
1133 { "osd_stat_bbox", VAR_UINT32
| MASTER_VALUE
| MODE_BITSET
, .config
.bitpos
= OSD_STAT_BLACKBOX
, PG_OSD_CONFIG
, offsetof(osdConfig_t
, enabled_stats
)},
1134 { "osd_stat_bb_no", VAR_UINT32
| MASTER_VALUE
| MODE_BITSET
, .config
.bitpos
= OSD_STAT_BLACKBOX_NUMBER
, PG_OSD_CONFIG
, offsetof(osdConfig_t
, enabled_stats
)},
1135 { "osd_stat_max_g_force", VAR_UINT32
| MASTER_VALUE
| MODE_BITSET
, .config
.bitpos
= OSD_STAT_MAX_G_FORCE
, PG_OSD_CONFIG
, offsetof(osdConfig_t
, enabled_stats
)},
1136 { "osd_stat_max_esc_temp", VAR_UINT32
| MASTER_VALUE
| MODE_BITSET
, .config
.bitpos
= OSD_STAT_MAX_ESC_TEMP
, PG_OSD_CONFIG
, offsetof(osdConfig_t
, enabled_stats
)},
1137 { "osd_stat_max_esc_rpm", VAR_UINT32
| MASTER_VALUE
| MODE_BITSET
, .config
.bitpos
= OSD_STAT_MAX_ESC_RPM
, PG_OSD_CONFIG
, offsetof(osdConfig_t
, enabled_stats
)},
1138 { "osd_stat_min_link_quality", VAR_UINT32
| MASTER_VALUE
| MODE_BITSET
, .config
.bitpos
= OSD_STAT_MIN_LINK_QUALITY
,PG_OSD_CONFIG
, offsetof(osdConfig_t
, enabled_stats
)},
1139 { "osd_stat_flight_dist", VAR_UINT32
| MASTER_VALUE
| MODE_BITSET
, .config
.bitpos
= OSD_STAT_FLIGHT_DISTANCE
, PG_OSD_CONFIG
, offsetof(osdConfig_t
, enabled_stats
)},
1140 #ifdef USE_GYRO_DATA_ANALYSE
1141 { "osd_stat_max_fft", VAR_UINT32
| MASTER_VALUE
| MODE_BITSET
, .config
.bitpos
= OSD_STAT_MAX_FFT
, PG_OSD_CONFIG
, offsetof(osdConfig_t
, enabled_stats
)},
1144 #ifdef USE_OSD_PROFILES
1145 { "osd_profile", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 1, OSD_PROFILE_COUNT
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, osdProfileIndex
) },
1150 { "system_hse_mhz", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, 30 }, PG_SYSTEM_CONFIG
, offsetof(systemConfig_t
, hseMhz
) },
1151 #if defined(USE_TASK_STATISTICS)
1152 { "task_statistics", VAR_INT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_SYSTEM_CONFIG
, offsetof(systemConfig_t
, task_statistics
) },
1154 { "debug_mode", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_DEBUG
}, PG_SYSTEM_CONFIG
, offsetof(systemConfig_t
, debug_mode
) },
1155 { "rate_6pos_switch", VAR_INT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_SYSTEM_CONFIG
, offsetof(systemConfig_t
, rateProfile6PosSwitch
) },
1156 #ifdef USE_OVERCLOCK
1157 { "cpu_overclock", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OVERCLOCK
}, PG_SYSTEM_CONFIG
, offsetof(systemConfig_t
, cpu_overclock
) },
1159 { "pwr_on_arm_grace", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, 30 }, PG_SYSTEM_CONFIG
, offsetof(systemConfig_t
, powerOnArmingGraceTime
) },
1162 #ifdef USE_VTX_COMMON
1163 { "vtx_band", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { VTX_SETTINGS_NO_BAND
, VTX_SETTINGS_MAX_BAND
}, PG_VTX_SETTINGS_CONFIG
, offsetof(vtxSettingsConfig_t
, band
) },
1164 { "vtx_channel", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { VTX_SETTINGS_MIN_CHANNEL
, VTX_SETTINGS_MAX_CHANNEL
}, PG_VTX_SETTINGS_CONFIG
, offsetof(vtxSettingsConfig_t
, channel
) },
1165 { "vtx_power", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { VTX_SETTINGS_MIN_POWER
, VTX_SETTINGS_POWER_COUNT
-1 }, PG_VTX_SETTINGS_CONFIG
, offsetof(vtxSettingsConfig_t
, power
) },
1166 { "vtx_low_power_disarm", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_VTX_LOW_POWER_DISARM
}, PG_VTX_SETTINGS_CONFIG
, offsetof(vtxSettingsConfig_t
, lowPowerDisarm
) },
1167 #ifdef VTX_SETTINGS_FREQCMD
1168 { "vtx_freq", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, VTX_SETTINGS_MAX_FREQUENCY_MHZ
}, PG_VTX_SETTINGS_CONFIG
, offsetof(vtxSettingsConfig_t
, freq
) },
1169 { "vtx_pit_mode_freq", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, VTX_SETTINGS_MAX_FREQUENCY_MHZ
}, PG_VTX_SETTINGS_CONFIG
, offsetof(vtxSettingsConfig_t
, pitModeFreq
) },
1174 #if defined(USE_VTX_CONTROL) && defined(USE_VTX_COMMON)
1175 { "vtx_halfduplex", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_VTX_CONFIG
, offsetof(vtxConfig_t
, halfDuplex
) },
1180 { "vcd_video_system", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_VIDEO_SYSTEM
}, PG_VCD_CONFIG
, offsetof(vcdProfile_t
, video_system
) },
1181 { "vcd_h_offset", VAR_INT8
| MASTER_VALUE
, .config
.minmax
= { -32, 31 }, PG_VCD_CONFIG
, offsetof(vcdProfile_t
, h_offset
) },
1182 { "vcd_v_offset", VAR_INT8
| MASTER_VALUE
, .config
.minmax
= { -15, 16 }, PG_VCD_CONFIG
, offsetof(vcdProfile_t
, v_offset
) },
1185 // PG_MAX7456_CONFIG
1187 { "max7456_clock", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_MAX7456_CLOCK
}, PG_MAX7456_CONFIG
, offsetof(max7456Config_t
, clockConfig
) },
1188 { "max7456_spi_bus", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, SPIDEV_COUNT
}, PG_MAX7456_CONFIG
, offsetof(max7456Config_t
, spiDevice
) },
1189 { "max7456_preinit_opu", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_MAX7456_CONFIG
, offsetof(max7456Config_t
, preInitOPU
) },
1192 // PG_DISPLAY_PORT_MSP_CONFIG
1193 #ifdef USE_MSP_DISPLAYPORT
1194 { "displayport_msp_col_adjust", VAR_INT8
| MASTER_VALUE
, .config
.minmax
= { -6, 0 }, PG_DISPLAY_PORT_MSP_CONFIG
, offsetof(displayPortProfile_t
, colAdjust
) },
1195 { "displayport_msp_row_adjust", VAR_INT8
| MASTER_VALUE
, .config
.minmax
= { -3, 0 }, PG_DISPLAY_PORT_MSP_CONFIG
, offsetof(displayPortProfile_t
, rowAdjust
) },
1198 // PG_DISPLAY_PORT_MSP_CONFIG
1200 { "displayport_max7456_col_adjust", VAR_INT8
| MASTER_VALUE
, .config
.minmax
= { -6, 0 }, PG_DISPLAY_PORT_MAX7456_CONFIG
, offsetof(displayPortProfile_t
, colAdjust
) },
1201 { "displayport_max7456_row_adjust", VAR_INT8
| MASTER_VALUE
, .config
.minmax
= { -3, 0 }, PG_DISPLAY_PORT_MAX7456_CONFIG
, offsetof(displayPortProfile_t
, rowAdjust
) },
1202 { "displayport_max7456_inv", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_DISPLAY_PORT_MAX7456_CONFIG
, offsetof(displayPortProfile_t
, invert
) },
1203 { "displayport_max7456_blk", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, 3 }, PG_DISPLAY_PORT_MAX7456_CONFIG
, offsetof(displayPortProfile_t
, blackBrightness
) },
1204 { "displayport_max7456_wht", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, 3 }, PG_DISPLAY_PORT_MAX7456_CONFIG
, offsetof(displayPortProfile_t
, whiteBrightness
) },
1207 #ifdef USE_ESC_SENSOR
1208 { "esc_sensor_halfduplex", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_ESC_SENSOR_CONFIG
, offsetof(escSensorConfig_t
, halfDuplex
) },
1209 { "esc_sensor_current_offset", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, 16000 }, PG_ESC_SENSOR_CONFIG
, offsetof(escSensorConfig_t
, offset
) },
1212 #ifdef USE_RX_FRSKY_SPI
1213 { "frsky_spi_autobind", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_RX_FRSKY_SPI_CONFIG
, offsetof(rxFrSkySpiConfig_t
, autoBind
) },
1214 { "frsky_spi_tx_id", VAR_UINT8
| MASTER_VALUE
| MODE_ARRAY
, .config
.array
.length
= 2, PG_RX_FRSKY_SPI_CONFIG
, offsetof(rxFrSkySpiConfig_t
, bindTxId
) },
1215 { "frsky_spi_offset", VAR_INT8
| MASTER_VALUE
, .config
.minmax
= { -127, 127 }, PG_RX_FRSKY_SPI_CONFIG
, offsetof(rxFrSkySpiConfig_t
, bindOffset
) },
1216 { "frsky_spi_bind_hop_data", VAR_UINT8
| MASTER_VALUE
| MODE_ARRAY
, .config
.array
.length
= 50, PG_RX_FRSKY_SPI_CONFIG
, offsetof(rxFrSkySpiConfig_t
, bindHopData
) },
1217 { "frsky_x_rx_num", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, 255 }, PG_RX_FRSKY_SPI_CONFIG
, offsetof(rxFrSkySpiConfig_t
, rxNum
) },
1218 { "frsky_spi_use_external_adc", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_RX_FRSKY_SPI_CONFIG
, offsetof(rxFrSkySpiConfig_t
, useExternalAdc
) },
1220 { "led_inversion", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, ((1 << STATUS_LED_NUMBER
) - 1) }, PG_STATUS_LED_CONFIG
, offsetof(statusLedConfig_t
, inversion
) },
1221 #ifdef USE_DASHBOARD
1222 { "dashboard_i2c_bus", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, I2CDEV_COUNT
}, PG_DASHBOARD_CONFIG
, offsetof(dashboardConfig_t
, device
) },
1223 { "dashboard_i2c_addr", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { I2C_ADDR7_MIN
, I2C_ADDR7_MAX
}, PG_DASHBOARD_CONFIG
, offsetof(dashboardConfig_t
, address
) },
1226 // PG_CAMERA_CONTROL_CONFIG
1227 #ifdef USE_CAMERA_CONTROL
1228 { "camera_control_mode", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_CAMERA_CONTROL_MODE
}, PG_CAMERA_CONTROL_CONFIG
, offsetof(cameraControlConfig_t
, mode
) },
1229 { "camera_control_ref_voltage", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 200, 400 }, PG_CAMERA_CONTROL_CONFIG
, offsetof(cameraControlConfig_t
, refVoltage
) },
1230 { "camera_control_key_delay", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 100, 500 }, PG_CAMERA_CONTROL_CONFIG
, offsetof(cameraControlConfig_t
, keyDelayMs
) },
1231 { "camera_control_internal_resistance", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 10, 1000 }, PG_CAMERA_CONTROL_CONFIG
, offsetof(cameraControlConfig_t
, internalResistance
) },
1232 { "camera_control_inverted", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_CAMERA_CONTROL_CONFIG
, offsetof(cameraControlConfig_t
, inverted
) },
1235 // PG_RANGEFINDER_CONFIG
1236 #ifdef USE_RANGEFINDER
1237 { "rangefinder_hardware", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_RANGEFINDER_HARDWARE
}, PG_RANGEFINDER_CONFIG
, offsetof(rangefinderConfig_t
, rangefinder_hardware
) },
1242 { "pinio_config", VAR_UINT8
| MASTER_VALUE
| MODE_ARRAY
, .config
.array
.length
= PINIO_COUNT
, PG_PINIO_CONFIG
, offsetof(pinioConfig_t
, config
) },
1244 { "pinio_box", VAR_UINT8
| MASTER_VALUE
| MODE_ARRAY
, .config
.array
.length
= PINIO_COUNT
, PG_PINIOBOX_CONFIG
, offsetof(pinioBoxConfig_t
, permanentId
) },
1249 #ifdef USE_USB_CDC_HID
1250 { "usb_hid_cdc", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_USB_CONFIG
, offsetof(usbDev_t
, type
) },
1253 { "usb_msc_pin_pullup", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_USB_CONFIG
, offsetof(usbDev_t
, mscButtonUsePullup
) },
1256 #ifdef USE_FLASH_CHIP
1257 { "flash_spi_bus", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, SPIDEV_COUNT
}, PG_FLASH_CONFIG
, offsetof(flashConfig_t
, spiDevice
) },
1261 { "rcdevice_init_dev_attempts", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, 10 }, PG_RCDEVICE_CONFIG
, offsetof(rcdeviceConfig_t
, initDeviceAttempts
) },
1262 { "rcdevice_init_dev_attempt_interval", VAR_UINT32
| MASTER_VALUE
, .config
.minmax
= { 500, 5000 }, PG_RCDEVICE_CONFIG
, offsetof(rcdeviceConfig_t
, initDeviceAttemptInterval
) },
1265 // PG_GYRO_DEVICE_CONFIG
1266 { "gyro_1_bustype", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_BUS_TYPE
}, PG_GYRO_DEVICE_CONFIG
, PG_ARRAY_ELEMENT_OFFSET(gyroDeviceConfig_t
, 0, bustype
) },
1267 { "gyro_1_spibus", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, SPIDEV_COUNT
}, PG_GYRO_DEVICE_CONFIG
, PG_ARRAY_ELEMENT_OFFSET(gyroDeviceConfig_t
, 0, spiBus
) },
1268 { "gyro_1_i2cBus", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, I2CDEV_COUNT
}, PG_GYRO_DEVICE_CONFIG
, PG_ARRAY_ELEMENT_OFFSET(gyroDeviceConfig_t
, 0, i2cBus
) },
1269 { "gyro_1_i2c_address", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, I2C_ADDR7_MAX
}, PG_GYRO_DEVICE_CONFIG
, PG_ARRAY_ELEMENT_OFFSET(gyroDeviceConfig_t
, 0, i2cAddress
) },
1270 { "gyro_1_sensor_align", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_ALIGNMENT
}, PG_GYRO_DEVICE_CONFIG
, PG_ARRAY_ELEMENT_OFFSET(gyroDeviceConfig_t
, 0, align
) },
1271 #ifdef USE_MULTI_GYRO
1272 { "gyro_2_bustype", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_BUS_TYPE
}, PG_GYRO_DEVICE_CONFIG
, PG_ARRAY_ELEMENT_OFFSET(gyroDeviceConfig_t
, 1, bustype
) },
1273 { "gyro_2_spibus", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, SPIDEV_COUNT
}, PG_GYRO_DEVICE_CONFIG
, PG_ARRAY_ELEMENT_OFFSET(gyroDeviceConfig_t
, 1, spiBus
) },
1274 { "gyro_2_i2cBus", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, I2CDEV_COUNT
}, PG_GYRO_DEVICE_CONFIG
, PG_ARRAY_ELEMENT_OFFSET(gyroDeviceConfig_t
, 1, i2cBus
) },
1275 { "gyro_2_i2c_address", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, I2C_ADDR7_MAX
}, PG_GYRO_DEVICE_CONFIG
, PG_ARRAY_ELEMENT_OFFSET(gyroDeviceConfig_t
, 1, i2cAddress
) },
1276 { "gyro_2_sensor_align", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_ALIGNMENT
}, PG_GYRO_DEVICE_CONFIG
, PG_ARRAY_ELEMENT_OFFSET(gyroDeviceConfig_t
, 1, align
) },
1278 #ifdef I2C_FULL_RECONFIGURABILITY
1279 #ifdef USE_I2C_DEVICE_1
1280 { "i2c1_pullup", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_I2C_CONFIG
, PG_ARRAY_ELEMENT_OFFSET(i2cConfig_t
, 0, pullUp
) },
1281 { "i2c1_overclock", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_I2C_CONFIG
, PG_ARRAY_ELEMENT_OFFSET(i2cConfig_t
, 0, overClock
) },
1283 #ifdef USE_I2C_DEVICE_2
1284 { "i2c2_pullup", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_I2C_CONFIG
, PG_ARRAY_ELEMENT_OFFSET(i2cConfig_t
, 1, pullUp
) },
1285 { "i2c2_overclock", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_I2C_CONFIG
, PG_ARRAY_ELEMENT_OFFSET(i2cConfig_t
, 1, overClock
) },
1287 #ifdef USE_I2C_DEVICE_3
1288 { "i2c3_pullup", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_I2C_CONFIG
, PG_ARRAY_ELEMENT_OFFSET(i2cConfig_t
, 2, pullUp
) },
1289 { "i2c3_overclock", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_I2C_CONFIG
, PG_ARRAY_ELEMENT_OFFSET(i2cConfig_t
, 2, overClock
) },
1291 #ifdef USE_I2C_DEVICE_4
1292 { "i2c4_pullup", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_I2C_CONFIG
, PG_ARRAY_ELEMENT_OFFSET(i2cConfig_t
, 3, pullUp
) },
1293 { "i2c4_overclock", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_I2C_CONFIG
, PG_ARRAY_ELEMENT_OFFSET(i2cConfig_t
, 3, overClock
) },
1297 { "mco2_on_pc9", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_MCO_CONFIG
, offsetof(mcoConfig_t
, enabled
[1]) },
1299 #ifdef USE_RX_SPEKTRUM
1300 { "spektrum_spi_protocol", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, 255 }, PG_RX_SPEKTRUM_SPI_CONFIG
, offsetof(spektrumConfig_t
, protocol
) },
1301 { "spektrum_spi_mfg_id", VAR_UINT8
| MASTER_VALUE
| MODE_ARRAY
, .config
.array
.length
= 4, PG_RX_SPEKTRUM_SPI_CONFIG
, offsetof(spektrumConfig_t
, mfgId
) },
1302 { "spektrum_spi_num_channels", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, DSM_MAX_CHANNEL_COUNT
}, PG_RX_SPEKTRUM_SPI_CONFIG
, offsetof(spektrumConfig_t
, numChannels
) },
1307 { "timezone_offset_minutes", VAR_INT16
| MASTER_VALUE
, .config
.minmax
= { TIMEZONE_OFFSET_MINUTES_MIN
, TIMEZONE_OFFSET_MINUTES_MAX
}, PG_TIME_CONFIG
, offsetof(timeConfig_t
, tz_offsetMinutes
) },
1310 #ifdef USE_RPM_FILTER
1311 { "gyro_rpm_notch_harmonics", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, 3 }, PG_RPM_FILTER_CONFIG
, offsetof(rpmFilterConfig_t
, gyro_rpm_notch_harmonics
) },
1312 { "gyro_rpm_notch_q", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 1, 1000 }, PG_RPM_FILTER_CONFIG
, offsetof(rpmFilterConfig_t
, gyro_rpm_notch_q
) },
1313 { "gyro_rpm_notch_min", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 50, 200 }, PG_RPM_FILTER_CONFIG
, offsetof(rpmFilterConfig_t
, gyro_rpm_notch_min
) },
1314 { "dterm_rpm_notch_harmonics", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, 3 }, PG_RPM_FILTER_CONFIG
, offsetof(rpmFilterConfig_t
, dterm_rpm_notch_harmonics
) },
1315 { "dterm_rpm_notch_q", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 1, 1000 }, PG_RPM_FILTER_CONFIG
, offsetof(rpmFilterConfig_t
, dterm_rpm_notch_q
) },
1316 { "dterm_rpm_notch_min", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 50, 200 }, PG_RPM_FILTER_CONFIG
, offsetof(rpmFilterConfig_t
, dterm_rpm_notch_min
) },
1320 const uint16_t valueTableEntryCount
= ARRAYLEN(valueTable
);
1322 void settingsBuildCheck() {
1323 STATIC_ASSERT(LOOKUP_TABLE_COUNT
== ARRAYLEN(lookupTables
), LOOKUP_TABLE_COUNT_incorrect
);