2 * This file is part of Cleanflight.
4 * Cleanflight is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation, either version 3 of the License, or
7 * (at your option) any later version.
9 * Cleanflight is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with Cleanflight. If not, see <http://www.gnu.org/licenses/>.
23 #include "build/debug.h"
25 #include "blackbox/blackbox.h"
29 #include "common/utils.h"
31 #include "drivers/adc.h"
32 #include "drivers/bus_i2c.h"
33 #include "drivers/bus_spi.h"
34 #include "drivers/camera_control.h"
35 #include "drivers/light_led.h"
36 #include "drivers/pinio.h"
37 #include "drivers/vtx_common.h"
39 #include "fc/config.h"
40 #include "fc/controlrate_profile.h"
41 #include "fc/fc_core.h"
42 #include "fc/rc_adjustments.h"
43 #include "fc/rc_controls.h"
45 #include "flight/altitude.h"
46 #include "flight/failsafe.h"
47 #include "flight/imu.h"
48 #include "flight/mixer.h"
49 #include "flight/navigation.h"
50 #include "flight/pid.h"
51 #include "flight/servos.h"
53 #include "interface/settings.h"
55 #include "io/beeper.h"
56 #include "io/dashboard.h"
57 #include "io/gimbal.h"
59 #include "io/ledstrip.h"
62 #include "io/vtx_control.h"
63 #include "io/vtx_rtc6705.h"
66 #include "pg/beeper.h"
67 #include "pg/beeper_dev.h"
68 #include "pg/dashboard.h"
69 #include "pg/max7456.h"
71 #include "pg/pg_ids.h"
73 #include "pg/piniobox.h"
74 #include "pg/rx_pwm.h"
75 #include "pg/sdcard.h"
79 #include "rx/cc2500_frsky_common.h"
80 #include "rx/spektrum.h"
82 #include "sensors/acceleration.h"
83 #include "sensors/barometer.h"
84 #include "sensors/battery.h"
85 #include "sensors/boardalignment.h"
86 #include "sensors/compass.h"
87 #include "sensors/esc_sensor.h"
88 #include "sensors/gyro.h"
89 #include "sensors/rangefinder.h"
91 #include "telemetry/frsky_hub.h"
92 #include "telemetry/ibus_shared.h"
93 #include "telemetry/telemetry.h"
95 // Sensor names (used in lookup tables for *_hardware settings and in status command output)
96 // sync with accelerationSensor_e
97 const char * const lookupTableAccHardware
[] = {
98 "AUTO", "NONE", "ADXL345", "MPU6050", "MMA8452", "BMA280", "LSM303DLHC",
99 "MPU6000", "MPU6500", "MPU9250", "ICM20601", "ICM20602", "ICM20608G", "ICM20649", "ICM20689",
103 // sync with gyroSensor_e
104 const char * const lookupTableGyroHardware
[] = {
105 "AUTO", "NONE", "MPU6050", "L3G4200D", "MPU3050", "L3GD20",
106 "MPU6000", "MPU6500", "MPU9250", "ICM20601", "ICM20602", "ICM20608G", "ICM20649", "ICM20689",
110 #if defined(USE_SENSOR_NAMES) || defined(USE_BARO)
111 // sync with baroSensor_e
112 const char * const lookupTableBaroHardware
[] = {
113 "AUTO", "NONE", "BMP085", "MS5611", "BMP280", "LPS"
116 #if defined(USE_SENSOR_NAMES) || defined(USE_MAG)
117 // sync with magSensor_e
118 const char * const lookupTableMagHardware
[] = {
119 "AUTO", "NONE", "HMC5883", "AK8975", "AK8963"
122 #if defined(USE_SENSOR_NAMES) || defined(USE_RANGEFINDER)
123 const char * const lookupTableRangefinderHardware
[] = {
124 "NONE", "HCSR04", "TFMINI", "TF02"
128 static const char * const lookupTableOffOn
[] = {
132 static const char * const lookupTableCrashRecovery
[] = {
136 static const char * const lookupTableUnit
[] = {
140 static const char * const lookupTableAlignment
[] = {
153 static const char * const lookupTableGPSProvider
[] = {
157 static const char * const lookupTableGPSSBASMode
[] = {
158 "AUTO", "EGNOS", "WAAS", "MSAS", "GAGAN"
163 static const char * const lookupTableGimbalMode
[] = {
169 static const char * const lookupTableBlackboxDevice
[] = {
170 "NONE", "SPIFLASH", "SDCARD", "SERIAL"
173 static const char * const lookupTableBlackboxMode
[] = {
174 "NORMAL", "MOTOR_TEST", "ALWAYS"
179 static const char * const lookupTableSerialRX
[] = {
197 // sync with rx_spi_protocol_e
198 static const char * const lookupTableRxSpi
[] = {
215 static const char * const lookupTableGyroLpf
[] = {
226 #ifdef USE_CAMERA_CONTROL
227 static const char * const lookupTableCameraControlMode
[] = {
234 static const char * const lookupTablePwmProtocol
[] = {
235 "OFF", "ONESHOT125", "ONESHOT42", "MULTISHOT", "BRUSHED",
237 "DSHOT150", "DSHOT300", "DSHOT600", "DSHOT1200", "PROSHOT1000"
241 static const char * const lookupTableRcInterpolation
[] = {
242 "OFF", "PRESET", "AUTO", "MANUAL"
245 static const char * const lookupTableRcInterpolationChannels
[] = {
249 static const char * const lookupTableLowpassType
[] = {
250 "PT1", "BIQUAD", "FIR"
253 static const char * const lookupTableFailsafe
[] = {
257 static const char * const lookupTableBusType
[] = {
258 "NONE", "I2C", "SPI", "SLAVE"
262 static const char * const lookupTableMax7456Clock
[] = {
263 "HALF", "DEFAULT", "FULL"
267 #ifdef USE_GYRO_OVERFLOW_CHECK
268 static const char * const lookupTableGyroOverflowCheck
[] = {
273 static const char * const lookupTableRatesType
[] = {
274 "BETAFLIGHT", "RACEFLIGHT"
278 static const char * const lookupOverclock
[] = {
280 #if defined(STM32F40_41xxx)
281 "192MHZ", "216MHZ", "240MHZ"
282 #elif defined(STM32F411xE)
288 const lookupTableEntry_t lookupTables
[] = {
289 { lookupTableOffOn
, sizeof(lookupTableOffOn
) / sizeof(char *) },
290 { lookupTableUnit
, sizeof(lookupTableUnit
) / sizeof(char *) },
291 { lookupTableAlignment
, sizeof(lookupTableAlignment
) / sizeof(char *) },
293 { lookupTableGPSProvider
, sizeof(lookupTableGPSProvider
) / sizeof(char *) },
294 { lookupTableGPSSBASMode
, sizeof(lookupTableGPSSBASMode
) / sizeof(char *) },
297 { lookupTableBlackboxDevice
, sizeof(lookupTableBlackboxDevice
) / sizeof(char *) },
298 { lookupTableBlackboxMode
, sizeof(lookupTableBlackboxMode
) / sizeof(char *) },
300 { currentMeterSourceNames
, sizeof(currentMeterSourceNames
) / sizeof(char *) },
301 { voltageMeterSourceNames
, sizeof(voltageMeterSourceNames
) / sizeof(char *) },
303 { lookupTableGimbalMode
, sizeof(lookupTableGimbalMode
) / sizeof(char *) },
306 { lookupTableSerialRX
, sizeof(lookupTableSerialRX
) / sizeof(char *) },
309 { lookupTableRxSpi
, sizeof(lookupTableRxSpi
) / sizeof(char *) },
311 { lookupTableGyroLpf
, sizeof(lookupTableGyroLpf
) / sizeof(char *) },
312 { lookupTableAccHardware
, sizeof(lookupTableAccHardware
) / sizeof(char *) },
314 { lookupTableBaroHardware
, sizeof(lookupTableBaroHardware
) / sizeof(char *) },
317 { lookupTableMagHardware
, sizeof(lookupTableMagHardware
) / sizeof(char *) },
319 { debugModeNames
, sizeof(debugModeNames
) / sizeof(char *) },
320 { lookupTablePwmProtocol
, sizeof(lookupTablePwmProtocol
) / sizeof(char *) },
321 { lookupTableRcInterpolation
, sizeof(lookupTableRcInterpolation
) / sizeof(char *) },
322 { lookupTableRcInterpolationChannels
, sizeof(lookupTableRcInterpolationChannels
) / sizeof(char *) },
323 { lookupTableLowpassType
, sizeof(lookupTableLowpassType
) / sizeof(char *) },
324 { lookupTableFailsafe
, sizeof(lookupTableFailsafe
) / sizeof(char *) },
325 { lookupTableCrashRecovery
, sizeof(lookupTableCrashRecovery
) / sizeof(char *) },
326 #ifdef USE_CAMERA_CONTROL
327 { lookupTableCameraControlMode
, sizeof(lookupTableCameraControlMode
) / sizeof(char *) },
329 { lookupTableBusType
, sizeof(lookupTableBusType
) / sizeof(char *) },
331 { lookupTableMax7456Clock
, sizeof(lookupTableMax7456Clock
) / sizeof(char *) },
333 #ifdef USE_RANGEFINDER
334 { lookupTableRangefinderHardware
, sizeof(lookupTableRangefinderHardware
) / sizeof(char *) },
336 #ifdef USE_GYRO_OVERFLOW_CHECK
337 { lookupTableGyroOverflowCheck
, sizeof(lookupTableGyroOverflowCheck
) / sizeof(char *) },
339 { lookupTableRatesType
, sizeof(lookupTableRatesType
) / sizeof(char *) },
341 { lookupOverclock
, sizeof(lookupOverclock
) / sizeof(char *) },
345 const clivalue_t valueTable
[] = {
347 { "align_gyro", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_ALIGNMENT
}, PG_GYRO_CONFIG
, offsetof(gyroConfig_t
, gyro_align
) },
348 { "gyro_lpf", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_GYRO_LPF
}, PG_GYRO_CONFIG
, offsetof(gyroConfig_t
, gyro_lpf
) },
349 #if defined(USE_GYRO_SPI_ICM20649)
350 { "gyro_high_range", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_GYRO_CONFIG
, offsetof(gyroConfig_t
, gyro_high_fsr
) },
352 { "gyro_sync_denom", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 1, 32 }, PG_GYRO_CONFIG
, offsetof(gyroConfig_t
, gyro_sync_denom
) },
353 { "gyro_lowpass_type", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_LOWPASS_TYPE
}, PG_GYRO_CONFIG
, offsetof(gyroConfig_t
, gyro_soft_lpf_type
) },
354 { "gyro_lowpass_hz", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, 255 }, PG_GYRO_CONFIG
, offsetof(gyroConfig_t
, gyro_soft_lpf_hz
) },
355 { "gyro_notch1_hz", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, 16000 }, PG_GYRO_CONFIG
, offsetof(gyroConfig_t
, gyro_soft_notch_hz_1
) },
356 { "gyro_notch1_cutoff", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, 16000 }, PG_GYRO_CONFIG
, offsetof(gyroConfig_t
, gyro_soft_notch_cutoff_1
) },
357 { "gyro_notch2_hz", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, 16000 }, PG_GYRO_CONFIG
, offsetof(gyroConfig_t
, gyro_soft_notch_hz_2
) },
358 { "gyro_notch2_cutoff", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, 16000 }, PG_GYRO_CONFIG
, offsetof(gyroConfig_t
, gyro_soft_notch_cutoff_2
) },
359 #if defined(USE_GYRO_FAST_KALMAN)
360 { "gyro_filter_q", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, 16000 }, PG_GYRO_CONFIG
, offsetof(gyroConfig_t
, gyro_filter_q
) },
361 { "gyro_filter_r", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, 16000 }, PG_GYRO_CONFIG
, offsetof(gyroConfig_t
, gyro_filter_r
) },
362 { "gyro_filter_p", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, 16000 }, PG_GYRO_CONFIG
, offsetof(gyroConfig_t
, gyro_filter_p
) },
363 #elif defined(USE_GYRO_BIQUAD_RC_FIR2)
364 { "gyro_stage2_lowpass_hz", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, 16000 }, PG_GYRO_CONFIG
, offsetof(gyroConfig_t
, gyro_soft_lpf_hz_2
) },
366 { "moron_threshold", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, 200 }, PG_GYRO_CONFIG
, offsetof(gyroConfig_t
, gyroMovementCalibrationThreshold
) },
367 { "gyro_offset_yaw", VAR_INT16
| MASTER_VALUE
, .config
.minmax
= { -1000, 1000 }, PG_GYRO_CONFIG
, offsetof(gyroConfig_t
, gyro_offset_yaw
) },
368 #ifdef USE_GYRO_OVERFLOW_CHECK
369 { "gyro_overflow_detect", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_GYRO_OVERFLOW_CHECK
}, PG_GYRO_CONFIG
, offsetof(gyroConfig_t
, checkOverflow
) },
371 #if defined(GYRO_USES_SPI)
372 #if defined(USE_GYRO_SPI_MPU6500) || defined(USE_GYRO_SPI_MPU9250) || defined(USE_GYRO_SPI_ICM20689)
373 { "gyro_use_32khz", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_GYRO_CONFIG
, offsetof(gyroConfig_t
, gyro_use_32khz
) },
377 { "gyro_to_use", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, 1 }, PG_GYRO_CONFIG
, offsetof(gyroConfig_t
, gyro_to_use
) },
380 // PG_ACCELEROMETER_CONFIG
381 { "align_acc", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_ALIGNMENT
}, PG_ACCELEROMETER_CONFIG
, offsetof(accelerometerConfig_t
, acc_align
) },
382 { "acc_hardware", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_ACC_HARDWARE
}, PG_ACCELEROMETER_CONFIG
, offsetof(accelerometerConfig_t
, acc_hardware
) },
383 #if defined(USE_GYRO_SPI_ICM20649)
384 { "acc_high_range", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_ACCELEROMETER_CONFIG
, offsetof(accelerometerConfig_t
, acc_high_fsr
) },
386 { "acc_lpf_hz", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, 400 }, PG_ACCELEROMETER_CONFIG
, offsetof(accelerometerConfig_t
, acc_lpf_hz
) },
387 { "acc_trim_pitch", VAR_INT16
| MASTER_VALUE
, .config
.minmax
= { -300, 300 }, PG_ACCELEROMETER_CONFIG
, offsetof(accelerometerConfig_t
, accelerometerTrims
.values
.pitch
) },
388 { "acc_trim_roll", VAR_INT16
| MASTER_VALUE
, .config
.minmax
= { -300, 300 }, PG_ACCELEROMETER_CONFIG
, offsetof(accelerometerConfig_t
, accelerometerTrims
.values
.roll
) },
392 { "align_mag", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_ALIGNMENT
}, PG_COMPASS_CONFIG
, offsetof(compassConfig_t
, mag_align
) },
393 { "mag_bustype", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_BUS_TYPE
}, PG_COMPASS_CONFIG
, offsetof(compassConfig_t
, mag_bustype
) },
394 { "mag_i2c_device", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, I2CDEV_COUNT
}, PG_COMPASS_CONFIG
, offsetof(compassConfig_t
, mag_i2c_device
) },
395 { "mag_i2c_address", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, I2C_ADDR7_MAX
}, PG_COMPASS_CONFIG
, offsetof(compassConfig_t
, mag_i2c_address
) },
396 { "mag_spi_device", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, SPIDEV_COUNT
}, PG_COMPASS_CONFIG
, offsetof(compassConfig_t
, mag_spi_device
) },
397 { "mag_hardware", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_MAG_HARDWARE
}, PG_COMPASS_CONFIG
, offsetof(compassConfig_t
, mag_hardware
) },
398 { "mag_declination", VAR_INT16
| MASTER_VALUE
, .config
.minmax
= { -18000, 18000 }, PG_COMPASS_CONFIG
, offsetof(compassConfig_t
, mag_declination
) },
399 { "magzero_x", VAR_INT16
| MASTER_VALUE
, .config
.minmax
= { INT16_MIN
, INT16_MAX
}, PG_COMPASS_CONFIG
, offsetof(compassConfig_t
, magZero
.raw
[X
]) },
400 { "magzero_y", VAR_INT16
| MASTER_VALUE
, .config
.minmax
= { INT16_MIN
, INT16_MAX
}, PG_COMPASS_CONFIG
, offsetof(compassConfig_t
, magZero
.raw
[Y
]) },
401 { "magzero_z", VAR_INT16
| MASTER_VALUE
, .config
.minmax
= { INT16_MIN
, INT16_MAX
}, PG_COMPASS_CONFIG
, offsetof(compassConfig_t
, magZero
.raw
[Z
]) },
404 // PG_BAROMETER_CONFIG
406 { "baro_bustype", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_BUS_TYPE
}, PG_BAROMETER_CONFIG
, offsetof(barometerConfig_t
, baro_bustype
) },
407 { "baro_spi_device", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, 5 }, PG_BAROMETER_CONFIG
, offsetof(barometerConfig_t
, baro_spi_device
) },
408 { "baro_i2c_device", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, 5 }, PG_BAROMETER_CONFIG
, offsetof(barometerConfig_t
, baro_i2c_device
) },
409 { "baro_i2c_address", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, I2C_ADDR7_MAX
}, PG_BAROMETER_CONFIG
, offsetof(barometerConfig_t
, baro_i2c_address
) },
410 { "baro_hardware", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_BARO_HARDWARE
}, PG_BAROMETER_CONFIG
, offsetof(barometerConfig_t
, baro_hardware
) },
411 { "baro_tab_size", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, BARO_SAMPLE_COUNT_MAX
}, PG_BAROMETER_CONFIG
, offsetof(barometerConfig_t
, baro_sample_count
) },
412 { "baro_noise_lpf", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, 1000 }, PG_BAROMETER_CONFIG
, offsetof(barometerConfig_t
, baro_noise_lpf
) },
413 { "baro_cf_vel", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, 1000 }, PG_BAROMETER_CONFIG
, offsetof(barometerConfig_t
, baro_cf_vel
) },
414 { "baro_cf_alt", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, 1000 }, PG_BAROMETER_CONFIG
, offsetof(barometerConfig_t
, baro_cf_alt
) },
418 { "mid_rc", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 1200, 1700 }, PG_RX_CONFIG
, offsetof(rxConfig_t
, midrc
) },
419 { "min_check", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { PWM_PULSE_MIN
, PWM_PULSE_MAX
}, PG_RX_CONFIG
, offsetof(rxConfig_t
, mincheck
) },
420 { "max_check", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { PWM_PULSE_MIN
, PWM_PULSE_MAX
}, PG_RX_CONFIG
, offsetof(rxConfig_t
, maxcheck
) },
421 { "rssi_channel", VAR_INT8
| MASTER_VALUE
, .config
.minmax
= { 0, MAX_SUPPORTED_RC_CHANNEL_COUNT
}, PG_RX_CONFIG
, offsetof(rxConfig_t
, rssi_channel
) },
422 { "rssi_scale", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { RSSI_SCALE_MIN
, RSSI_SCALE_MAX
}, PG_RX_CONFIG
, offsetof(rxConfig_t
, rssi_scale
) },
423 { "rssi_invert", VAR_INT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_RX_CONFIG
, offsetof(rxConfig_t
, rssi_invert
) },
424 { "rc_interp", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_RC_INTERPOLATION
}, PG_RX_CONFIG
, offsetof(rxConfig_t
, rcInterpolation
) },
425 { "rc_interp_ch", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_RC_INTERPOLATION_CHANNELS
}, PG_RX_CONFIG
, offsetof(rxConfig_t
, rcInterpolationChannels
) },
426 { "rc_interp_int", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 1, 50 }, PG_RX_CONFIG
, offsetof(rxConfig_t
, rcInterpolationInterval
) },
427 { "fpv_mix_degrees", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, 50 }, PG_RX_CONFIG
, offsetof(rxConfig_t
, fpvCamAngleDegrees
) },
428 { "max_aux_channels", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, MAX_AUX_CHANNEL_COUNT
}, PG_RX_CONFIG
, offsetof(rxConfig_t
, max_aux_channel
) },
430 { "serialrx_provider", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_SERIAL_RX
}, PG_RX_CONFIG
, offsetof(rxConfig_t
, serialrx_provider
) },
431 { "serialrx_inverted", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_RX_CONFIG
, offsetof(rxConfig_t
, serialrx_inverted
) },
433 #ifdef USE_SPEKTRUM_BIND
434 { "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
) },
435 { "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
) },
437 { "airmode_start_throttle_percent", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, 100 }, PG_RX_CONFIG
, offsetof(rxConfig_t
, airModeActivateThreshold
) },
438 { "rx_min_usec", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { PWM_PULSE_MIN
, PWM_PULSE_MAX
}, PG_RX_CONFIG
, offsetof(rxConfig_t
, rx_min_usec
) },
439 { "rx_max_usec", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { PWM_PULSE_MIN
, PWM_PULSE_MAX
}, PG_RX_CONFIG
, offsetof(rxConfig_t
, rx_max_usec
) },
440 { "serialrx_halfduplex", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_RX_CONFIG
, offsetof(rxConfig_t
, halfDuplex
) },
442 { "rx_spi_protocol", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_RX_SPI
}, PG_RX_CONFIG
, offsetof(rxConfig_t
, rx_spi_protocol
) },
447 { "adc_device", VAR_INT8
| MASTER_VALUE
, .config
.minmax
= { 0, ADCDEV_COUNT
}, PG_ADC_CONFIG
, offsetof(adcConfig_t
, device
) },
452 { "input_filtering_mode", VAR_INT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_PWM_CONFIG
, offsetof(pwmConfig_t
, inputFilteringMode
) },
455 // PG_BLACKBOX_CONFIG
457 { "blackbox_p_ratio", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, INT16_MAX
}, PG_BLACKBOX_CONFIG
, offsetof(blackboxConfig_t
, p_denom
) },
458 { "blackbox_device", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_BLACKBOX_DEVICE
}, PG_BLACKBOX_CONFIG
, offsetof(blackboxConfig_t
, device
) },
459 { "blackbox_record_acc", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_BLACKBOX_CONFIG
, offsetof(blackboxConfig_t
, record_acc
) },
460 { "blackbox_mode", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_BLACKBOX_MODE
}, PG_BLACKBOX_CONFIG
, offsetof(blackboxConfig_t
, mode
) },
464 { "min_throttle", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { PWM_PULSE_MIN
, PWM_PULSE_MAX
}, PG_MOTOR_CONFIG
, offsetof(motorConfig_t
, minthrottle
) },
465 { "max_throttle", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { PWM_PULSE_MIN
, PWM_PULSE_MAX
}, PG_MOTOR_CONFIG
, offsetof(motorConfig_t
, maxthrottle
) },
466 { "min_command", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { PWM_PULSE_MIN
, PWM_PULSE_MAX
}, PG_MOTOR_CONFIG
, offsetof(motorConfig_t
, mincommand
) },
468 { "dshot_idle_value", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, 2000 }, PG_MOTOR_CONFIG
, offsetof(motorConfig_t
, digitalIdleOffsetValue
) },
469 #ifdef USE_DSHOT_DMAR
470 { "dshot_burst", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_MOTOR_CONFIG
, offsetof(motorConfig_t
, dev
.useBurstDshot
) },
473 { "use_unsynced_pwm", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_MOTOR_CONFIG
, offsetof(motorConfig_t
, dev
.useUnsyncedPwm
) },
474 { "motor_pwm_protocol", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_MOTOR_PWM_PROTOCOL
}, PG_MOTOR_CONFIG
, offsetof(motorConfig_t
, dev
.motorPwmProtocol
) },
475 { "motor_pwm_rate", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 200, 32000 }, PG_MOTOR_CONFIG
, offsetof(motorConfig_t
, dev
.motorPwmRate
) },
476 { "motor_pwm_inversion", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_MOTOR_CONFIG
, offsetof(motorConfig_t
, dev
.motorPwmInversion
) },
478 // PG_THROTTLE_CORRECTION_CONFIG
479 { "thr_corr_value", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, 150 }, PG_THROTTLE_CORRECTION_CONFIG
, offsetof(throttleCorrectionConfig_t
, throttle_correction_value
) },
480 { "thr_corr_angle", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 1, 900 }, PG_THROTTLE_CORRECTION_CONFIG
, offsetof(throttleCorrectionConfig_t
, throttle_correction_angle
) },
482 // PG_FAILSAFE_CONFIG
483 { "failsafe_delay", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, 200 }, PG_FAILSAFE_CONFIG
, offsetof(failsafeConfig_t
, failsafe_delay
) },
484 { "failsafe_off_delay", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, 200 }, PG_FAILSAFE_CONFIG
, offsetof(failsafeConfig_t
, failsafe_off_delay
) },
485 { "failsafe_throttle", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { PWM_PULSE_MIN
, PWM_PULSE_MAX
}, PG_FAILSAFE_CONFIG
, offsetof(failsafeConfig_t
, failsafe_throttle
) },
486 { "failsafe_kill_switch", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_FAILSAFE_CONFIG
, offsetof(failsafeConfig_t
, failsafe_kill_switch
) },
487 { "failsafe_throttle_low_delay",VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, 300 }, PG_FAILSAFE_CONFIG
, offsetof(failsafeConfig_t
, failsafe_throttle_low_delay
) },
488 { "failsafe_procedure", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_FAILSAFE
}, PG_FAILSAFE_CONFIG
, offsetof(failsafeConfig_t
, failsafe_procedure
) },
490 // PG_BOARDALIGNMENT_CONFIG
491 { "align_board_roll", VAR_INT16
| MASTER_VALUE
, .config
.minmax
= { -180, 360 }, PG_BOARD_ALIGNMENT
, offsetof(boardAlignment_t
, rollDegrees
) },
492 { "align_board_pitch", VAR_INT16
| MASTER_VALUE
, .config
.minmax
= { -180, 360 }, PG_BOARD_ALIGNMENT
, offsetof(boardAlignment_t
, pitchDegrees
) },
493 { "align_board_yaw", VAR_INT16
| MASTER_VALUE
, .config
.minmax
= { -180, 360 }, PG_BOARD_ALIGNMENT
, offsetof(boardAlignment_t
, yawDegrees
) },
497 { "gimbal_mode", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_GIMBAL_MODE
}, PG_GIMBAL_CONFIG
, offsetof(gimbalConfig_t
, mode
) },
501 { "bat_capacity", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, 20000 }, PG_BATTERY_CONFIG
, offsetof(batteryConfig_t
, batteryCapacity
) },
502 { "vbat_max_cell_voltage", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 10, 50 }, PG_BATTERY_CONFIG
, offsetof(batteryConfig_t
, vbatmaxcellvoltage
) },
503 { "vbat_full_cell_voltage", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 10, 50 }, PG_BATTERY_CONFIG
, offsetof(batteryConfig_t
, vbatfullcellvoltage
) },
504 { "vbat_min_cell_voltage", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 10, 50 }, PG_BATTERY_CONFIG
, offsetof(batteryConfig_t
, vbatmincellvoltage
) },
505 { "vbat_warning_cell_voltage", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 10, 50 }, PG_BATTERY_CONFIG
, offsetof(batteryConfig_t
, vbatwarningcellvoltage
) },
506 { "vbat_hysteresis", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, 250 }, PG_BATTERY_CONFIG
, offsetof(batteryConfig_t
, vbathysteresis
) },
507 { "current_meter", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_CURRENT_METER
}, PG_BATTERY_CONFIG
, offsetof(batteryConfig_t
, currentMeterSource
) },
508 { "battery_meter", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_VOLTAGE_METER
}, PG_BATTERY_CONFIG
, offsetof(batteryConfig_t
, voltageMeterSource
) },
509 { "vbat_detect_cell_voltage", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, 200 }, PG_BATTERY_CONFIG
, offsetof(batteryConfig_t
, vbatnotpresentcellvoltage
) },
510 { "use_vbat_alerts", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_BATTERY_CONFIG
, offsetof(batteryConfig_t
, useVBatAlerts
) },
511 { "use_cbat_alerts", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_BATTERY_CONFIG
, offsetof(batteryConfig_t
, useConsumptionAlerts
) },
512 { "cbat_alert_percent", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, 100 }, PG_BATTERY_CONFIG
, offsetof(batteryConfig_t
, consumptionWarningPercentage
) },
513 { "vbat_cutoff_percent", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, 100 }, PG_BATTERY_CONFIG
, offsetof(batteryConfig_t
, lvcPercentage
) },
515 // PG_VOLTAGE_SENSOR_ADC_CONFIG
516 { "vbat_scale", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { VBAT_SCALE_MIN
, VBAT_SCALE_MAX
}, PG_VOLTAGE_SENSOR_ADC_CONFIG
, offsetof(voltageSensorADCConfig_t
, vbatscale
) },
518 // PG_CURRENT_SENSOR_ADC_CONFIG
519 { "ibata_scale", VAR_INT16
| MASTER_VALUE
, .config
.minmax
= { -16000, 16000 }, PG_CURRENT_SENSOR_ADC_CONFIG
, offsetof(currentSensorADCConfig_t
, scale
) },
520 { "ibata_offset", VAR_INT16
| MASTER_VALUE
, .config
.minmax
= { -16000, 16000 }, PG_CURRENT_SENSOR_ADC_CONFIG
, offsetof(currentSensorADCConfig_t
, offset
) },
521 // PG_CURRENT_SENSOR_ADC_CONFIG
522 #ifdef USE_VIRTUAL_CURRENT_METER
523 { "ibatv_scale", VAR_INT16
| MASTER_VALUE
, .config
.minmax
= { -16000, 16000 }, PG_CURRENT_SENSOR_VIRTUAL_CONFIG
, offsetof(currentSensorVirtualConfig_t
, scale
) },
524 { "ibatv_offset", VAR_INT16
| MASTER_VALUE
, .config
.minmax
= { -16000, 16000 }, PG_CURRENT_SENSOR_VIRTUAL_CONFIG
, offsetof(currentSensorVirtualConfig_t
, offset
) },
528 // PG_BEEPER_DEV_CONFIG
529 { "beeper_inversion", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_BEEPER_DEV_CONFIG
, offsetof(beeperDevConfig_t
, isInverted
) },
530 { "beeper_od", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_BEEPER_DEV_CONFIG
, offsetof(beeperDevConfig_t
, isOpenDrain
) },
531 { "beeper_frequency", VAR_INT16
| MASTER_VALUE
, .config
.minmax
= { 0, 16000 }, PG_BEEPER_DEV_CONFIG
, offsetof(beeperDevConfig_t
, frequency
) },
535 { "beeper_dshot_beacon_tone", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= {0, DSHOT_CMD_BEACON5
}, PG_BEEPER_CONFIG
, offsetof(beeperConfig_t
, dshotBeaconTone
) },
540 { "yaw_motors_reversed", VAR_INT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_MIXER_CONFIG
, offsetof(mixerConfig_t
, yaw_motors_reversed
) },
542 // PG_MOTOR_3D_CONFIG
543 { "3d_deadband_low", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { PWM_PULSE_MIN
, PWM_RANGE_MIDDLE
}, PG_MOTOR_3D_CONFIG
, offsetof(flight3DConfig_t
, deadband3d_low
) },
544 { "3d_deadband_high", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { PWM_RANGE_MIDDLE
, PWM_PULSE_MAX
}, PG_MOTOR_3D_CONFIG
, offsetof(flight3DConfig_t
, deadband3d_high
) },
545 { "3d_neutral", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { PWM_PULSE_MIN
, PWM_PULSE_MAX
}, PG_MOTOR_3D_CONFIG
, offsetof(flight3DConfig_t
, neutral3d
) },
546 { "3d_deadband_throttle", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { PWM_PULSE_MIN
, PWM_PULSE_MAX
}, PG_MOTOR_3D_CONFIG
, offsetof(flight3DConfig_t
, deadband3d_throttle
) },
547 { "3d_switched_mode", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_MOTOR_3D_CONFIG
, offsetof(flight3DConfig_t
, switched_mode3d
) },
551 { "servo_center_pulse", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { PWM_PULSE_MIN
, PWM_PULSE_MAX
}, PG_SERVO_CONFIG
, offsetof(servoConfig_t
, dev
.servoCenterPulse
) },
552 { "servo_pwm_rate", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 50, 498 }, PG_SERVO_CONFIG
, offsetof(servoConfig_t
, dev
.servoPwmRate
) },
553 { "servo_lowpass_hz", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, 400}, PG_SERVO_CONFIG
, offsetof(servoConfig_t
, servo_lowpass_freq
) },
554 { "tri_unarmed_servo", VAR_INT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_SERVO_CONFIG
, offsetof(servoConfig_t
, tri_unarmed_servo
) },
555 { "channel_forwarding_start", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { AUX1
, MAX_SUPPORTED_RC_CHANNEL_COUNT
}, PG_SERVO_CONFIG
, offsetof(servoConfig_t
, channelForwardingStartChannel
) },
558 // PG_CONTROLRATE_PROFILES
559 { "thr_mid", VAR_UINT8
| PROFILE_RATE_VALUE
, .config
.minmax
= { 0, 100 }, PG_CONTROL_RATE_PROFILES
, offsetof(controlRateConfig_t
, thrMid8
) },
560 { "thr_expo", VAR_UINT8
| PROFILE_RATE_VALUE
, .config
.minmax
= { 0, 100 }, PG_CONTROL_RATE_PROFILES
, offsetof(controlRateConfig_t
, thrExpo8
) },
561 { "rates_type", VAR_UINT8
| PROFILE_RATE_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_RATES_TYPE
}, PG_CONTROL_RATE_PROFILES
, offsetof(controlRateConfig_t
, rates_type
) },
562 { "roll_rc_rate", VAR_UINT8
| PROFILE_RATE_VALUE
, .config
.minmax
= { 0, CONTROL_RATE_CONFIG_RC_RATES_MAX
}, PG_CONTROL_RATE_PROFILES
, offsetof(controlRateConfig_t
, rcRates
[FD_ROLL
]) },
563 { "pitch_rc_rate", VAR_UINT8
| PROFILE_RATE_VALUE
, .config
.minmax
= { 0, CONTROL_RATE_CONFIG_RC_RATES_MAX
}, PG_CONTROL_RATE_PROFILES
, offsetof(controlRateConfig_t
, rcRates
[FD_PITCH
]) },
564 { "yaw_rc_rate", VAR_UINT8
| PROFILE_RATE_VALUE
, .config
.minmax
= { 0, CONTROL_RATE_CONFIG_RC_RATES_MAX
}, PG_CONTROL_RATE_PROFILES
, offsetof(controlRateConfig_t
, rcRates
[FD_YAW
]) },
565 { "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
]) },
566 { "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
]) },
567 { "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
]) },
568 { "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
]) },
569 { "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
]) },
570 { "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
]) },
571 { "tpa_rate", VAR_UINT8
| PROFILE_RATE_VALUE
, .config
.minmax
= { 0, CONTROL_RATE_CONFIG_TPA_MAX
}, PG_CONTROL_RATE_PROFILES
, offsetof(controlRateConfig_t
, dynThrPID
) },
572 { "tpa_breakpoint", VAR_UINT16
| PROFILE_RATE_VALUE
, .config
.minmax
= { PWM_PULSE_MIN
, PWM_PULSE_MAX
}, PG_CONTROL_RATE_PROFILES
, offsetof(controlRateConfig_t
, tpa_breakpoint
) },
575 { "reboot_character", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 48, 126 }, PG_SERIAL_CONFIG
, offsetof(serialConfig_t
, reboot_character
) },
576 { "serial_update_rate_hz", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 100, 2000 }, PG_SERIAL_CONFIG
, offsetof(serialConfig_t
, serial_update_rate_hz
) },
579 { "accxy_deadband", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, 100 }, PG_IMU_CONFIG
, offsetof(imuConfig_t
, accDeadband
.xy
) },
580 { "accz_deadband", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, 100 }, PG_IMU_CONFIG
, offsetof(imuConfig_t
, accDeadband
.z
) },
581 { "acc_unarmedcal", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_IMU_CONFIG
, offsetof(imuConfig_t
, acc_unarmedcal
) },
582 { "imu_dcm_kp", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, 32000 }, PG_IMU_CONFIG
, offsetof(imuConfig_t
, dcm_kp
) },
583 { "imu_dcm_ki", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, 32000 }, PG_IMU_CONFIG
, offsetof(imuConfig_t
, dcm_ki
) },
584 { "small_angle", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, 180 }, PG_IMU_CONFIG
, offsetof(imuConfig_t
, small_angle
) },
587 { "auto_disarm_delay", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, 60 }, PG_ARMING_CONFIG
, offsetof(armingConfig_t
, auto_disarm_delay
) },
588 { "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
) },
593 { "gps_provider", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_GPS_PROVIDER
}, PG_GPS_CONFIG
, offsetof(gpsConfig_t
, provider
) },
594 { "gps_sbas_mode", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_GPS_SBAS_MODE
}, PG_GPS_CONFIG
, offsetof(gpsConfig_t
, sbasMode
) },
595 { "gps_auto_config", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_GPS_CONFIG
, offsetof(gpsConfig_t
, autoConfig
) },
596 { "gps_auto_baud", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_GPS_CONFIG
, offsetof(gpsConfig_t
, autoBaud
) },
599 // PG_NAVIGATION_CONFIG
601 { "gps_wp_radius", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, 2000 }, PG_NAVIGATION_CONFIG
, offsetof(navigationConfig_t
, gps_wp_radius
) },
602 { "nav_controls_heading", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_NAVIGATION_CONFIG
, offsetof(navigationConfig_t
, nav_controls_heading
) },
603 { "nav_speed_min", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 10, 2000 }, PG_NAVIGATION_CONFIG
, offsetof(navigationConfig_t
, nav_speed_min
) },
604 { "nav_speed_max", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 10, 2000 }, PG_NAVIGATION_CONFIG
, offsetof(navigationConfig_t
, nav_speed_max
) },
605 { "nav_slew_rate", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, 100 }, PG_NAVIGATION_CONFIG
, offsetof(navigationConfig_t
, nav_slew_rate
) },
608 // PG_AIRPLANE_CONFIG
609 #if defined(USE_ALT_HOLD)
610 { "fixedwing_althold_reversed", VAR_INT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_AIRPLANE_CONFIG
, offsetof(airplaneConfig_t
, fixedwing_althold_reversed
) },
613 // PG_RC_CONTROLS_CONFIG
614 #if defined(USE_ALT_HOLD)
615 { "alt_hold_deadband", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 1, 250 }, PG_RC_CONTROLS_CONFIG
, offsetof(rcControlsConfig_t
, alt_hold_deadband
) },
616 { "alt_hold_fast_change", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_RC_CONTROLS_CONFIG
, offsetof(rcControlsConfig_t
, alt_hold_fast_change
) },
618 { "deadband", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, 32 }, PG_RC_CONTROLS_CONFIG
, offsetof(rcControlsConfig_t
, deadband
) },
619 { "yaw_deadband", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, 100 }, PG_RC_CONTROLS_CONFIG
, offsetof(rcControlsConfig_t
, yaw_deadband
) },
620 { "yaw_control_reversed", VAR_INT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_RC_CONTROLS_CONFIG
, offsetof(rcControlsConfig_t
, yaw_control_reversed
) },
623 { "pid_process_denom", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 1, MAX_PID_PROCESS_DENOM
}, PG_PID_CONFIG
, offsetof(pidConfig_t
, pid_process_denom
) },
624 #ifdef USE_RUNAWAY_TAKEOFF
625 { "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
626 { "runaway_takeoff_threshold", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 30, 100 }, PG_PID_CONFIG
, offsetof(pidConfig_t
, runaway_takeoff_threshold
) }, // pidSum limit to trigger prevention
627 { "runaway_takeoff_activate_delay", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, 255 }, PG_PID_CONFIG
, offsetof(pidConfig_t
, runaway_takeoff_activate_delay
) }, // time in ms where pidSum is above threshold to trigger prevention
628 { "runaway_takeoff_deactivate_delay", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 100, 5000 }, PG_PID_CONFIG
, offsetof(pidConfig_t
, runaway_takeoff_deactivate_delay
) }, // deactivate time in ms
629 { "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
633 { "dterm_lowpass_type", VAR_UINT8
| PROFILE_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_LOWPASS_TYPE
}, PG_PID_PROFILE
, offsetof(pidProfile_t
, dterm_filter_type
) },
634 { "dterm_lowpass", VAR_INT16
| PROFILE_VALUE
, .config
.minmax
= { 0, 16000 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, dterm_lpf_hz
) },
635 { "dterm_notch_hz", VAR_UINT16
| PROFILE_VALUE
, .config
.minmax
= { 0, 16000 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, dterm_notch_hz
) },
636 { "dterm_notch_cutoff", VAR_UINT16
| PROFILE_VALUE
, .config
.minmax
= { 0, 16000 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, dterm_notch_cutoff
) },
637 { "vbat_pid_gain", VAR_UINT8
| PROFILE_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_PID_PROFILE
, offsetof(pidProfile_t
, vbatPidCompensation
) },
638 { "pid_at_min_throttle", VAR_UINT8
| PROFILE_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_PID_PROFILE
, offsetof(pidProfile_t
, pidAtMinThrottle
) },
639 { "anti_gravity_threshold", VAR_UINT16
| PROFILE_VALUE
, .config
.minmax
= { 20, 1000 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, itermThrottleThreshold
) },
640 { "anti_gravity_gain", VAR_UINT16
| PROFILE_VALUE
, .config
.minmax
= { 1000, 30000 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, itermAcceleratorGain
) },
641 { "setpoint_relax_ratio", VAR_UINT8
| PROFILE_VALUE
, .config
.minmax
= { 1, 100 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, setpointRelaxRatio
) },
642 { "dterm_setpoint_weight", VAR_UINT8
| PROFILE_VALUE
, .config
.minmax
= { 0, 254 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, dtermSetpointWeight
) },
643 { "acc_limit_yaw", VAR_UINT16
| PROFILE_VALUE
, .config
.minmax
= { 1, 500 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, yawRateAccelLimit
) },
644 { "acc_limit", VAR_UINT16
| PROFILE_VALUE
, .config
.minmax
= { 1, 500 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, rateAccelLimit
) },
645 { "crash_dthreshold", VAR_UINT16
| PROFILE_VALUE
, .config
.minmax
= { 0, 2000 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, crash_dthreshold
) },
646 { "crash_gthreshold", VAR_UINT16
| PROFILE_VALUE
, .config
.minmax
= { 0, 2000 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, crash_gthreshold
) },
647 { "crash_setpoint_threshold", VAR_UINT16
| PROFILE_VALUE
, .config
.minmax
= { 0, 2000 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, crash_setpoint_threshold
) },
648 { "crash_time", VAR_UINT16
| PROFILE_VALUE
, .config
.minmax
= { 0, 5000 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, crash_time
) },
649 { "crash_delay", VAR_UINT16
| PROFILE_VALUE
, .config
.minmax
= { 0, 500 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, crash_delay
) },
650 { "crash_recovery_angle", VAR_UINT8
| PROFILE_VALUE
, .config
.minmax
= { 0, 30 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, crash_recovery_angle
) },
651 { "crash_recovery_rate", VAR_UINT8
| PROFILE_VALUE
, .config
.minmax
= { 0, 255 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, crash_recovery_rate
) },
652 { "crash_limit_yaw", VAR_UINT16
| PROFILE_VALUE
, .config
.minmax
= { 0, 1000 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, crash_limit_yaw
) },
653 { "crash_recovery", VAR_UINT8
| PROFILE_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_CRASH_RECOVERY
}, PG_PID_PROFILE
, offsetof(pidProfile_t
, crash_recovery
) },
655 { "iterm_windup", VAR_UINT8
| PROFILE_VALUE
, .config
.minmax
= { 30, 100 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, itermWindupPointPercent
) },
656 { "iterm_limit", VAR_UINT16
| PROFILE_VALUE
, .config
.minmax
= { 0, 500 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, itermLimit
) },
657 { "pidsum_limit", VAR_UINT16
| PROFILE_VALUE
, .config
.minmax
= { 100, 1000 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, pidSumLimit
) },
658 { "pidsum_limit_yaw", VAR_UINT16
| PROFILE_VALUE
, .config
.minmax
= { 100, 1000 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, pidSumLimitYaw
) },
659 { "yaw_lowpass", VAR_UINT16
| PROFILE_VALUE
, .config
.minmax
= { 0, 500 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, yaw_lpf_hz
) },
661 { "p_pitch", VAR_UINT8
| PROFILE_VALUE
, .config
.minmax
= { 0, 200 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, pid
[PID_PITCH
].P
) },
662 { "i_pitch", VAR_UINT8
| PROFILE_VALUE
, .config
.minmax
= { 0, 200 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, pid
[PID_PITCH
].I
) },
663 { "d_pitch", VAR_UINT8
| PROFILE_VALUE
, .config
.minmax
= { 0, 200 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, pid
[PID_PITCH
].D
) },
664 { "p_roll", VAR_UINT8
| PROFILE_VALUE
, .config
.minmax
= { 0, 200 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, pid
[PID_ROLL
].P
) },
665 { "i_roll", VAR_UINT8
| PROFILE_VALUE
, .config
.minmax
= { 0, 200 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, pid
[PID_ROLL
].I
) },
666 { "d_roll", VAR_UINT8
| PROFILE_VALUE
, .config
.minmax
= { 0, 200 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, pid
[PID_ROLL
].D
) },
667 { "p_yaw", VAR_UINT8
| PROFILE_VALUE
, .config
.minmax
= { 0, 200 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, pid
[PID_YAW
].P
) },
668 { "i_yaw", VAR_UINT8
| PROFILE_VALUE
, .config
.minmax
= { 0, 200 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, pid
[PID_YAW
].I
) },
669 { "d_yaw", VAR_UINT8
| PROFILE_VALUE
, .config
.minmax
= { 0, 200 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, pid
[PID_YAW
].D
) },
672 { "p_alt", VAR_UINT8
| PROFILE_VALUE
, .config
.minmax
= { 0, 200 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, pid
[PID_ALT
].P
) },
673 { "i_alt", VAR_UINT8
| PROFILE_VALUE
, .config
.minmax
= { 0, 200 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, pid
[PID_ALT
].I
) },
674 { "d_alt", VAR_UINT8
| PROFILE_VALUE
, .config
.minmax
= { 0, 200 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, pid
[PID_ALT
].D
) },
675 { "p_vel", VAR_UINT8
| PROFILE_VALUE
, .config
.minmax
= { 0, 200 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, pid
[PID_VEL
].P
) },
676 { "i_vel", VAR_UINT8
| PROFILE_VALUE
, .config
.minmax
= { 0, 200 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, pid
[PID_VEL
].I
) },
677 { "d_vel", VAR_UINT8
| PROFILE_VALUE
, .config
.minmax
= { 0, 200 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, pid
[PID_VEL
].D
) },
680 { "p_level", VAR_UINT8
| PROFILE_VALUE
, .config
.minmax
= { 0, 200 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, pid
[PID_LEVEL
].P
) },
681 { "i_level", VAR_UINT8
| PROFILE_VALUE
, .config
.minmax
= { 0, 200 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, pid
[PID_LEVEL
].I
) },
682 { "d_level", VAR_UINT8
| PROFILE_VALUE
, .config
.minmax
= { 0, 200 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, pid
[PID_LEVEL
].D
) },
684 { "level_limit", VAR_UINT8
| PROFILE_VALUE
, .config
.minmax
= { 10, 90 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, levelAngleLimit
) },
686 { "horizon_tilt_effect", VAR_UINT8
| PROFILE_VALUE
, .config
.minmax
= { 0, 250 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, horizon_tilt_effect
) },
687 { "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
) },
689 { "gps_pos_p", VAR_UINT8
| PROFILE_VALUE
, .config
.minmax
= { 0, 200 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, pid
[PID_POS
].P
) },
690 { "gps_pos_i", VAR_UINT8
| PROFILE_VALUE
, .config
.minmax
= { 0, 200 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, pid
[PID_POS
].I
) },
691 { "gps_pos_d", VAR_UINT8
| PROFILE_VALUE
, .config
.minmax
= { 0, 200 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, pid
[PID_POS
].D
) },
692 { "gps_posr_p", VAR_UINT8
| PROFILE_VALUE
, .config
.minmax
= { 0, 200 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, pid
[PID_POSR
].P
) },
693 { "gps_posr_i", VAR_UINT8
| PROFILE_VALUE
, .config
.minmax
= { 0, 200 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, pid
[PID_POSR
].I
) },
694 { "gps_posr_d", VAR_UINT8
| PROFILE_VALUE
, .config
.minmax
= { 0, 200 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, pid
[PID_POSR
].D
) },
695 { "gps_nav_p", VAR_UINT8
| PROFILE_VALUE
, .config
.minmax
= { 0, 200 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, pid
[PID_NAVR
].P
) },
696 { "gps_nav_i", VAR_UINT8
| PROFILE_VALUE
, .config
.minmax
= { 0, 200 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, pid
[PID_NAVR
].I
) },
697 { "gps_nav_d", VAR_UINT8
| PROFILE_VALUE
, .config
.minmax
= { 0, 200 }, PG_PID_PROFILE
, offsetof(pidProfile_t
, pid
[PID_NAVR
].D
) },
700 // PG_TELEMETRY_CONFIG
702 { "tlm_switch", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_TELEMETRY_CONFIG
, offsetof(telemetryConfig_t
, telemetry_switch
) },
703 { "tlm_inverted", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_TELEMETRY_CONFIG
, offsetof(telemetryConfig_t
, telemetry_inverted
) },
704 { "tlm_halfduplex", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_TELEMETRY_CONFIG
, offsetof(telemetryConfig_t
, halfDuplex
) },
705 #if defined(USE_TELEMETRY_FRSKY_HUB)
707 { "frsky_default_lat", VAR_INT16
| MASTER_VALUE
, .config
.minmax
= { -9000, 9000 }, PG_TELEMETRY_CONFIG
, offsetof(telemetryConfig_t
, gpsNoFixLatitude
) },
708 { "frsky_default_long", VAR_INT16
| MASTER_VALUE
, .config
.minmax
= { -18000, 18000 }, PG_TELEMETRY_CONFIG
, offsetof(telemetryConfig_t
, gpsNoFixLongitude
) },
709 { "frsky_gps_format", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, FRSKY_FORMAT_NMEA
}, PG_TELEMETRY_CONFIG
, offsetof(telemetryConfig_t
, frsky_coordinate_format
) },
710 { "frsky_unit", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_UNIT
}, PG_TELEMETRY_CONFIG
, offsetof(telemetryConfig_t
, frsky_unit
) },
712 { "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
) },
713 #endif // USE_TELEMETRY_FRSKY_HUB
714 { "hott_alarm_int", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, 120 }, PG_TELEMETRY_CONFIG
, offsetof(telemetryConfig_t
, hottAlarmSoundInterval
) },
715 { "pid_in_tlm", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= {TABLE_OFF_ON
}, PG_TELEMETRY_CONFIG
, offsetof(telemetryConfig_t
, pidValuesAsTelemetry
) },
716 #if defined(USE_TELEMETRY_IBUS)
717 { "report_cell_voltage", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_TELEMETRY_CONFIG
, offsetof(telemetryConfig_t
, report_cell_voltage
) },
718 { "ibus_sensor", VAR_UINT8
| MASTER_VALUE
| MODE_ARRAY
, .config
.array
.length
= IBUS_SENSOR_COUNT
, PG_TELEMETRY_CONFIG
, offsetof(telemetryConfig_t
, flysky_sensors
)},
720 #endif // USE_TELEMETRY
722 // PG_LED_STRIP_CONFIG
724 { "ledstrip_visual_beeper", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_LED_STRIP_CONFIG
, offsetof(ledStripConfig_t
, ledstrip_visual_beeper
) },
729 { "sdcard_dma", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_SDCARD_CONFIG
, offsetof(sdcardConfig_t
, useDma
) },
734 { "osd_units", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_UNIT
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, units
) },
735 { "osd_warnings", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, INT16_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, enabledWarnings
) },
737 { "osd_rssi_alarm", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, 100 }, PG_OSD_CONFIG
, offsetof(osdConfig_t
, rssi_alarm
) },
738 { "osd_cap_alarm", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, 20000 }, PG_OSD_CONFIG
, offsetof(osdConfig_t
, cap_alarm
) },
739 { "osd_alt_alarm", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, 10000 }, PG_OSD_CONFIG
, offsetof(osdConfig_t
, alt_alarm
) },
741 { "osd_ah_max_pit", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, 90 }, PG_OSD_CONFIG
, offsetof(osdConfig_t
, ahMaxPitch
) },
742 { "osd_ah_max_rol", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, 90 }, PG_OSD_CONFIG
, offsetof(osdConfig_t
, ahMaxRoll
) },
744 { "osd_tim1", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, INT16_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, timers
[OSD_TIMER_1
]) },
745 { "osd_tim2", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, INT16_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, timers
[OSD_TIMER_2
]) },
747 { "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
]) },
748 { "osd_rssi_pos", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, OSD_POSCFG_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, item_pos
[OSD_RSSI_VALUE
]) },
749 { "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
]) },
750 { "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
]) },
751 { "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
]) },
752 { "osd_flymode_pos", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, OSD_POSCFG_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, item_pos
[OSD_FLYMODE
]) },
753 { "osd_throttle_pos", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, OSD_POSCFG_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, item_pos
[OSD_THROTTLE_POS
]) },
754 { "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
]) },
755 { "osd_crosshairs", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, OSD_POSCFG_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, item_pos
[OSD_CROSSHAIRS
]) },
756 { "osd_ah_sbar", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, OSD_POSCFG_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, item_pos
[OSD_HORIZON_SIDEBARS
]) },
757 { "osd_ah_pos", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, OSD_POSCFG_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, item_pos
[OSD_ARTIFICIAL_HORIZON
]) },
758 { "osd_current_pos", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, OSD_POSCFG_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, item_pos
[OSD_CURRENT_DRAW
]) },
759 { "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
]) },
760 { "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
]) },
761 { "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
]) },
762 { "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
]) },
763 { "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
]) },
764 { "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
]) },
765 { "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
]) },
766 { "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
]) },
767 { "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
]) },
768 { "osd_altitude_pos", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, OSD_POSCFG_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, item_pos
[OSD_ALTITUDE
]) },
769 { "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
]) },
770 { "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
]) },
771 { "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
]) },
772 { "osd_debug_pos", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, OSD_POSCFG_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, item_pos
[OSD_DEBUG
]) },
773 { "osd_power_pos", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, OSD_POSCFG_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, item_pos
[OSD_POWER
]) },
774 { "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
]) },
775 { "osd_warnings_pos", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, OSD_POSCFG_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, item_pos
[OSD_WARNINGS
]) },
776 { "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
]) },
777 { "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
]) },
778 { "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
]) },
779 { "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
]) },
780 { "osd_disarmed_pos", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, OSD_POSCFG_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, item_pos
[OSD_DISARMED
]) },
781 { "osd_nheading_pos", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, OSD_POSCFG_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, item_pos
[OSD_NUMERICAL_HEADING
]) },
782 { "osd_nvario_pos", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, OSD_POSCFG_MAX
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, item_pos
[OSD_NUMERICAL_VARIO
]) },
783 { "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
]) },
784 { "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
]) },
785 { "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
]) },
786 { "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
]) },
787 { "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
]) },
789 { "osd_stat_max_spd", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, enabled_stats
[OSD_STAT_MAX_SPEED
])},
790 { "osd_stat_max_dist", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, enabled_stats
[OSD_STAT_MAX_DISTANCE
])},
791 { "osd_stat_min_batt", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, enabled_stats
[OSD_STAT_MIN_BATTERY
])},
792 { "osd_stat_min_rssi", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, enabled_stats
[OSD_STAT_MIN_RSSI
])},
793 { "osd_stat_max_curr", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, enabled_stats
[OSD_STAT_MAX_CURRENT
])},
794 { "osd_stat_used_mah", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, enabled_stats
[OSD_STAT_USED_MAH
])},
795 { "osd_stat_max_alt", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, enabled_stats
[OSD_STAT_MAX_ALTITUDE
])},
796 { "osd_stat_bbox", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, enabled_stats
[OSD_STAT_BLACKBOX
])},
797 { "osd_stat_endbatt", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, enabled_stats
[OSD_STAT_END_BATTERY
])},
798 { "osd_stat_bb_no", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, enabled_stats
[OSD_STAT_BLACKBOX_NUMBER
])},
799 { "osd_stat_rtc_date_time", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, enabled_stats
[OSD_STAT_RTC_DATE_TIME
])},
800 { "osd_stat_tim_1", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, enabled_stats
[OSD_STAT_TIMER_1
])},
801 { "osd_stat_tim_2", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_OSD_CONFIG
, offsetof(osdConfig_t
, enabled_stats
[OSD_STAT_TIMER_2
])},
805 #ifndef SKIP_TASK_STATISTICS
806 { "task_statistics", VAR_INT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_SYSTEM_CONFIG
, offsetof(systemConfig_t
, task_statistics
) },
808 { "debug_mode", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_DEBUG
}, PG_SYSTEM_CONFIG
, offsetof(systemConfig_t
, debug_mode
) },
809 { "rate_6pos_switch", VAR_INT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_SYSTEM_CONFIG
, offsetof(systemConfig_t
, rateProfile6PosSwitch
) },
811 { "cpu_overclock", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OVERCLOCK
}, PG_SYSTEM_CONFIG
, offsetof(systemConfig_t
, cpu_overclock
) },
813 { "pwr_on_arm_grace", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, 30 }, PG_SYSTEM_CONFIG
, offsetof(systemConfig_t
, powerOnArmingGraceTime
) },
816 #ifdef USE_VTX_COMMON
817 { "vtx_band", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { VTX_SETTINGS_MIN_BAND
, VTX_SETTINGS_MAX_BAND
}, PG_VTX_SETTINGS_CONFIG
, offsetof(vtxSettingsConfig_t
, band
) },
818 { "vtx_channel", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { VTX_SETTINGS_MIN_CHANNEL
, VTX_SETTINGS_MAX_CHANNEL
}, PG_VTX_SETTINGS_CONFIG
, offsetof(vtxSettingsConfig_t
, channel
) },
819 { "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
) },
820 { "vtx_low_power_disarm", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_VTX_SETTINGS_CONFIG
, offsetof(vtxSettingsConfig_t
, lowPowerDisarm
) },
821 #ifdef VTX_SETTINGS_FREQCMD
822 { "vtx_freq", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, VTX_SETTINGS_MAX_FREQUENCY_MHZ
}, PG_VTX_SETTINGS_CONFIG
, offsetof(vtxSettingsConfig_t
, freq
) },
823 { "vtx_pit_mode_freq", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 0, VTX_SETTINGS_MAX_FREQUENCY_MHZ
}, PG_VTX_SETTINGS_CONFIG
, offsetof(vtxSettingsConfig_t
, pitModeFreq
) },
828 #if defined(USE_VTX_CONTROL) && defined(USE_VTX_COMMON)
829 { "vtx_halfduplex", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_VTX_CONFIG
, offsetof(vtxConfig_t
, halfDuplex
) },
834 { "vcd_video_system", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, 2 }, PG_VCD_CONFIG
, offsetof(vcdProfile_t
, video_system
) },
835 { "vcd_h_offset", VAR_INT8
| MASTER_VALUE
, .config
.minmax
= { -32, 31 }, PG_VCD_CONFIG
, offsetof(vcdProfile_t
, h_offset
) },
836 { "vcd_v_offset", VAR_INT8
| MASTER_VALUE
, .config
.minmax
= { -15, 16 }, PG_VCD_CONFIG
, offsetof(vcdProfile_t
, v_offset
) },
841 { "max7456_clock", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_MAX7456_CLOCK
}, PG_MAX7456_CONFIG
, offsetof(max7456Config_t
, clockConfig
) },
844 // PG_DISPLAY_PORT_MSP_CONFIG
845 #ifdef USE_MSP_DISPLAYPORT
846 { "displayport_msp_col_adjust", VAR_INT8
| MASTER_VALUE
, .config
.minmax
= { -6, 0 }, PG_DISPLAY_PORT_MSP_CONFIG
, offsetof(displayPortProfile_t
, colAdjust
) },
847 { "displayport_msp_row_adjust", VAR_INT8
| MASTER_VALUE
, .config
.minmax
= { -3, 0 }, PG_DISPLAY_PORT_MSP_CONFIG
, offsetof(displayPortProfile_t
, rowAdjust
) },
850 // PG_DISPLAY_PORT_MSP_CONFIG
852 { "displayport_max7456_col_adjust", VAR_INT8
| MASTER_VALUE
, .config
.minmax
= { -6, 0 }, PG_DISPLAY_PORT_MAX7456_CONFIG
, offsetof(displayPortProfile_t
, colAdjust
) },
853 { "displayport_max7456_row_adjust", VAR_INT8
| MASTER_VALUE
, .config
.minmax
= { -3, 0 }, PG_DISPLAY_PORT_MAX7456_CONFIG
, offsetof(displayPortProfile_t
, rowAdjust
) },
854 { "displayport_max7456_inv", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_DISPLAY_PORT_MAX7456_CONFIG
, offsetof(displayPortProfile_t
, invert
) },
855 { "displayport_max7456_blk", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, 3 }, PG_DISPLAY_PORT_MAX7456_CONFIG
, offsetof(displayPortProfile_t
, blackBrightness
) },
856 { "displayport_max7456_wht", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, 3 }, PG_DISPLAY_PORT_MAX7456_CONFIG
, offsetof(displayPortProfile_t
, whiteBrightness
) },
859 #ifdef USE_ESC_SENSOR
860 { "esc_sensor_halfduplex", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_ESC_SENSOR_CONFIG
, offsetof(escSensorConfig_t
, halfDuplex
) },
863 #ifdef USE_RX_FRSKY_SPI
864 { "frsky_spi_autobind", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_OFF_ON
}, PG_RX_FRSKY_SPI_CONFIG
, offsetof(rxFrSkySpiConfig_t
, autoBind
) },
865 { "frsky_spi_tx_id", VAR_UINT8
| MASTER_VALUE
| MODE_ARRAY
, .config
.array
.length
= 2, PG_RX_FRSKY_SPI_CONFIG
, offsetof(rxFrSkySpiConfig_t
, bindTxId
) },
866 { "frsky_spi_offset", VAR_INT8
| MASTER_VALUE
, .config
.minmax
= { -127, 127 }, PG_RX_FRSKY_SPI_CONFIG
, offsetof(rxFrSkySpiConfig_t
, bindOffset
) },
867 { "frsky_spi_bind_hop_data", VAR_UINT8
| MASTER_VALUE
| MODE_ARRAY
, .config
.array
.length
= 50, PG_RX_FRSKY_SPI_CONFIG
, offsetof(rxFrSkySpiConfig_t
, bindHopData
) },
868 { "frsky_x_rx_num", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, 255 }, PG_RX_FRSKY_SPI_CONFIG
, offsetof(rxFrSkySpiConfig_t
, rxNum
) },
870 { "led_inversion", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, ((1 << STATUS_LED_NUMBER
) - 1) }, PG_STATUS_LED_CONFIG
, offsetof(statusLedConfig_t
, inversion
) },
872 { "dashboard_i2c_bus", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { 0, I2CDEV_COUNT
}, PG_DASHBOARD_CONFIG
, offsetof(dashboardConfig_t
, device
) },
873 { "dashboard_i2c_addr", VAR_UINT8
| MASTER_VALUE
, .config
.minmax
= { I2C_ADDR7_MIN
, I2C_ADDR7_MAX
}, PG_DASHBOARD_CONFIG
, offsetof(dashboardConfig_t
, address
) },
876 // PG_CAMERA_CONTROL_CONFIG
877 #ifdef USE_CAMERA_CONTROL
878 { "camera_control_mode", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_CAMERA_CONTROL_MODE
}, PG_CAMERA_CONTROL_CONFIG
, offsetof(cameraControlConfig_t
, mode
) },
879 { "camera_control_ref_voltage", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 200, 400 }, PG_CAMERA_CONTROL_CONFIG
, offsetof(cameraControlConfig_t
, refVoltage
) },
880 { "camera_control_key_delay", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 100, 500 }, PG_CAMERA_CONTROL_CONFIG
, offsetof(cameraControlConfig_t
, keyDelayMs
) },
881 { "camera_control_internal_resistance", VAR_UINT16
| MASTER_VALUE
, .config
.minmax
= { 10, 1000 }, PG_CAMERA_CONTROL_CONFIG
, offsetof(cameraControlConfig_t
, internalResistance
) },
884 // PG_RANGEFINDER_CONFIG
885 #ifdef USE_RANGEFINDER
886 { "rangefinder_hardware", VAR_UINT8
| MASTER_VALUE
| MODE_LOOKUP
, .config
.lookup
= { TABLE_RANGEFINDER_HARDWARE
}, PG_RANGEFINDER_CONFIG
, offsetof(rangefinderConfig_t
, rangefinder_hardware
) },
891 { "pinio_config", VAR_UINT8
| MASTER_VALUE
| MODE_ARRAY
, .config
.array
.length
= PINIO_COUNT
, PG_PINIO_CONFIG
, offsetof(pinioConfig_t
, config
) },
893 { "pinio_box", VAR_UINT8
| MASTER_VALUE
| MODE_ARRAY
, .config
.array
.length
= PINIO_COUNT
, PG_PINIOBOX_CONFIG
, offsetof(pinioBoxConfig_t
, permanentId
) },
898 const uint16_t valueTableEntryCount
= ARRAYLEN(valueTable
);
900 void settingsBuildCheck() {
901 BUILD_BUG_ON(LOOKUP_TABLE_COUNT
!= ARRAYLEN(lookupTables
));