From babe93c3bff80d0104e0bff8662653519c8f806c Mon Sep 17 00:00:00 2001 From: Matthias Grob Date: Thu, 24 Nov 2022 09:30:47 +0100 Subject: [PATCH] rc_update: adapt throttle trim calibration for [-1,1] This is fully backwards compatible: If the throttle trim is set to the minimum then it's the legacy calibration and gets interpreted such that there is no trim and behavior remains as before. If the trim is set to a different value than the minimum then it gets used like with all other channels which was unsupported before. --- src/modules/rc_update/params.c | 36 ++++++++++++++--------------- src/modules/rc_update/rc_update.cpp | 15 ++++++++++++ 2 files changed, 33 insertions(+), 18 deletions(-) diff --git a/src/modules/rc_update/params.c b/src/modules/rc_update/params.c index 737d061be9..1c78fa38e5 100644 --- a/src/modules/rc_update/params.c +++ b/src/modules/rc_update/params.c @@ -53,7 +53,7 @@ PARAM_DEFINE_FLOAT(RC1_MIN, 1000.0f); /** * RC channel 1 trim * - * Mid point value (same as min for throttle) + * Mid point value * * @min 800.0 * @max 2200.0 @@ -114,7 +114,7 @@ PARAM_DEFINE_FLOAT(RC2_MIN, 1000.0f); /** * RC channel 2 trim * - * Mid point value (has to be set to the same as min for throttle channel). + * Mid point value * * @min 800.0 * @max 2200.0 @@ -175,7 +175,7 @@ PARAM_DEFINE_FLOAT(RC3_MIN, 1000); /** * RC channel 3 trim * - * Mid point value (has to be set to the same as min for throttle channel). + * Mid point value * * @min 800.0 * @max 2200.0 @@ -236,7 +236,7 @@ PARAM_DEFINE_FLOAT(RC4_MIN, 1000); /** * RC channel 4 trim * - * Mid point value (has to be set to the same as min for throttle channel). + * Mid point value * * @min 800.0 * @max 2200.0 @@ -297,7 +297,7 @@ PARAM_DEFINE_FLOAT(RC5_MIN, 1000); /** * RC channel 5 trim * - * Mid point value (has to be set to the same as min for throttle channel). + * Mid point value * * @min 800.0 * @max 2200.0 @@ -357,7 +357,7 @@ PARAM_DEFINE_FLOAT(RC6_MIN, 1000); /** * RC channel 6 trim * - * Mid point value (has to be set to the same as min for throttle channel). + * Mid point value * * @min 800.0 * @max 2200.0 @@ -417,7 +417,7 @@ PARAM_DEFINE_FLOAT(RC7_MIN, 1000); /** * RC channel 7 trim * - * Mid point value (has to be set to the same as min for throttle channel). + * Mid point value * * @min 800.0 * @max 2200.0 @@ -477,7 +477,7 @@ PARAM_DEFINE_FLOAT(RC8_MIN, 1000); /** * RC channel 8 trim * - * Mid point value (has to be set to the same as min for throttle channel). + * Mid point value * * @min 800.0 * @max 2200.0 @@ -537,7 +537,7 @@ PARAM_DEFINE_FLOAT(RC9_MIN, 1000); /** * RC channel 9 trim * - * Mid point value (has to be set to the same as min for throttle channel). + * Mid point value * * @min 800.0 * @max 2200.0 @@ -597,7 +597,7 @@ PARAM_DEFINE_FLOAT(RC10_MIN, 1000); /** * RC channel 10 trim * - * Mid point value (has to be set to the same as min for throttle channel). + * Mid point value * * @min 800.0 * @max 2200.0 @@ -657,7 +657,7 @@ PARAM_DEFINE_FLOAT(RC11_MIN, 1000); /** * RC channel 11 trim * - * Mid point value (has to be set to the same as min for throttle channel). + * Mid point value * * @min 800.0 * @max 2200.0 @@ -717,7 +717,7 @@ PARAM_DEFINE_FLOAT(RC12_MIN, 1000); /** * RC channel 12 trim * - * Mid point value (has to be set to the same as min for throttle channel). + * Mid point value * * @min 800.0 * @max 2200.0 @@ -777,7 +777,7 @@ PARAM_DEFINE_FLOAT(RC13_MIN, 1000); /** * RC channel 13 trim * - * Mid point value (has to be set to the same as min for throttle channel). + * Mid point value * * @min 800.0 * @max 2200.0 @@ -837,7 +837,7 @@ PARAM_DEFINE_FLOAT(RC14_MIN, 1000); /** * RC channel 14 trim * - * Mid point value (has to be set to the same as min for throttle channel). + * Mid point value * * @min 800.0 * @max 2200.0 @@ -897,7 +897,7 @@ PARAM_DEFINE_FLOAT(RC15_MIN, 1000); /** * RC channel 15 trim * - * Mid point value (has to be set to the same as min for throttle channel). + * Mid point value * * @min 800.0 * @max 2200.0 @@ -957,7 +957,7 @@ PARAM_DEFINE_FLOAT(RC16_MIN, 1000); /** * RC channel 16 trim * - * Mid point value (has to be set to the same as min for throttle channel). + * Mid point value * * @min 800.0 * @max 2200.0 @@ -1017,7 +1017,7 @@ PARAM_DEFINE_FLOAT(RC17_MIN, 1000); /** * RC channel 17 trim * - * Mid point value (has to be set to the same as min for throttle channel). + * Mid point value * * @min 800.0 * @max 2200.0 @@ -1077,7 +1077,7 @@ PARAM_DEFINE_FLOAT(RC18_MIN, 1000); /** * RC channel 18 trim * - * Mid point value (has to be set to the same as min for throttle channel). + * Mid point value * * @min 800.0 * @max 2200.0 diff --git a/src/modules/rc_update/rc_update.cpp b/src/modules/rc_update/rc_update.cpp index a81e4ac9f6..af4931c472 100644 --- a/src/modules/rc_update/rc_update.cpp +++ b/src/modules/rc_update/rc_update.cpp @@ -201,6 +201,21 @@ void RCUpdate::parameters_updated() } } } + + // Center throttle trim when it's set to the minimum to correct for hardcoded QGC RC calibration + // See https://github.com/mavlink/qgroundcontrol/commit/0577af2e944a0f53919aeb1367d580f744004b2c + const int8_t throttle_channel = _rc.function[rc_channels_s::FUNCTION_THROTTLE]; + + if (throttle_channel >= 0 && throttle_channel < RC_MAX_CHAN_COUNT) { + const uint16_t throttle_min = _parameters.min[throttle_channel]; + const uint16_t throttle_trim = _parameters.trim[throttle_channel]; + const uint16_t throttle_max = _parameters.max[throttle_channel]; + + if (throttle_min == throttle_trim) { + const uint16_t new_throttle_trim = (throttle_min + throttle_max) / 2; + _parameters.trim[throttle_channel] = new_throttle_trim; + } + } } void RCUpdate::update_rc_functions()