fix: Throttle idle trim handling for surface, enable MT12 tests (#4520)

Co-authored-by: 3djc <3djc@gh.com>
Co-authored-by: raphaelcoeffic <1050031+raphaelcoeffic@users.noreply.github.com>
This commit is contained in:
3djc
2024-01-21 13:53:25 +10:00
committed by GitHub
co-authored by 3djc raphaelcoeffic
parent 4c2ea7a60a
commit dfaad73070
36 changed files with 596 additions and 1328 deletions
+304 -202
View File
@@ -65,16 +65,38 @@ class MixerTest : public OpenTxTest {};
} \
} while (0)
#define MIXSRC_Ele (MIXSRC_FIRST_STICK + 1)
#define MIXSRC_Ail (MIXSRC_FIRST_STICK + 3)
#define MIXSRC_TrimEle (MIXSRC_FIRST_TRIM + 1)
#define MIXSRC_TrimThr (MIXSRC_FIRST_TRIM + 2)
#define MIXSRC_CYC1 (MIXSRC_FIRST_HELI)
#define MIXSRC_CYC2 (MIXSRC_FIRST_HELI + 1)
#define MIXSRC_CYC3 (MIXSRC_FIRST_HELI + 2)
#if defined(SURFACE_RADIO)
#define ELE_CHAN 0
#define ELE_THRTRIMSW 1
#define THR_STICK_MIN_THR_POS 0
#define TRIM_SCALE(x) (x / 2)
#else
#define ELE_CHAN 1
#define ELE_THRTRIMSW 1
#define THR_STICK_MIN_THR_POS -1024
#define TRIM_SCALE(x) (x)
#endif
#define THR_CHAN inputMappingGetThrottle()
#define THR_STICK THR_CHAN
#define ELE_STICK ELE_CHAN
#define AIL_STICK 3
#define MIXSRC_ELE (MIXSRC_FIRST_STICK + ELE_CHAN)
#define MIXSRC_THR (MIXSRC_FIRST_STICK + THR_CHAN)
#define MIXSRC_AIL (MIXSRC_FIRST_STICK + AIL_STICK)
#define MIXSRC_TRIMELE (MIXSRC_FIRST_TRIM + ELE_CHAN)
#define MIXSRC_TRIMTHR (MIXSRC_FIRST_TRIM + THR_CHAN)
#define ELE_TRIM_SOURCE (-1 -ELE_CHAN)
#define THR_TRIM_SOURCE (-1 -THR_CHAN)
TEST_F(MixerTest, throttleInvert)
{
// Mode 1 / reversed
@@ -82,21 +104,21 @@ TEST_F(MixerTest, throttleInvert)
g_model.throttleReversed = 1;
anaSetFiltered(inputMappingConvertMode(THR_STICK), -1024);
evalMixes(1);
EXPECT_EQ(channelOutputs[2], +1024);
EXPECT_EQ(channelOutputs[THR_CHAN], +1024);
// Mode 2 / reversed
g_eeGeneral.stickMode = 1;
g_model.throttleReversed = 1;
anaSetFiltered(inputMappingConvertMode(THR_STICK), -1024);
evalMixes(1);
EXPECT_EQ(channelOutputs[2], +1024);
EXPECT_EQ(channelOutputs[THR_CHAN], +1024);
// Mode 2 / normal
g_eeGeneral.stickMode = 1;
g_model.throttleReversed = 0;
anaSetFiltered(inputMappingConvertMode(THR_STICK), -1024);
evalMixes(1);
EXPECT_EQ(channelOutputs[2], -1024);
EXPECT_EQ(channelOutputs[THR_CHAN], -1024);
}
TEST_F(TrimsTest, throttleTrim)
@@ -106,56 +128,61 @@ TEST_F(TrimsTest, throttleTrim)
anaSetFiltered(THR_STICK, +1024);
setTrimValue(0, THR_STICK, TRIM_MAX);
evalMixes(1);
EXPECT_EQ(channelOutputs[2], 1024);
EXPECT_EQ(channelOutputs[THR_CHAN], 1024);
// stick max + trim min
anaSetFiltered(THR_STICK, +1024);
setTrimValue(0, THR_STICK, TRIM_MIN);
evalMixes(1);
EXPECT_EQ(channelOutputs[2], 1024);
EXPECT_EQ(channelOutputs[THR_CHAN], 1024);
// stick min + trim max
anaSetFiltered(THR_STICK, -1024);
anaSetFiltered(THR_STICK, THR_STICK_MIN_THR_POS);
setTrimValue(0, THR_STICK, TRIM_MAX);
evalMixes(1);
EXPECT_EQ(channelOutputs[2], -1024+512);
EXPECT_EQ(channelOutputs[THR_CHAN], THR_STICK_MIN_THR_POS + TRIM_SCALE(512));
// stick min + trim mid
anaSetFiltered(THR_STICK, -1024);
anaSetFiltered(THR_STICK, THR_STICK_MIN_THR_POS);
setTrimValue(0, THR_STICK, 0);
evalMixes(1);
EXPECT_EQ(channelOutputs[2], -1024+256);
EXPECT_EQ(channelOutputs[THR_CHAN], THR_STICK_MIN_THR_POS + TRIM_SCALE(256));
// stick min + trim min
anaSetFiltered(THR_STICK, -1024);
anaSetFiltered(THR_STICK, THR_STICK_MIN_THR_POS);
setTrimValue(0, THR_STICK, TRIM_MIN);
evalMixes(1);
EXPECT_EQ(channelOutputs[2], -1024);
EXPECT_EQ(channelOutputs[THR_CHAN], THR_STICK_MIN_THR_POS);
#if defined(SURFACE_RADIO)
// stick bellow 0 + trim max :no trim in reverse
anaSetFiltered(THR_STICK, -512);
setTrimValue(0, THR_STICK, TRIM_MAX);
evalMixes(1);
EXPECT_EQ(channelOutputs[THR_CHAN], -512);
#endif
// now the same tests with extended Trims
g_model.extendedTrims = 1;
// stick max + trim max
anaSetFiltered(THR_STICK, +1024);
setTrimValue(0, THR_STICK, TRIM_EXTENDED_MAX);
evalMixes(1);
EXPECT_EQ(channelOutputs[2], 1024);
EXPECT_EQ(channelOutputs[THR_CHAN], 1024);
// stick max + trim min
anaSetFiltered(THR_STICK, +1024);
setTrimValue(0, THR_STICK, TRIM_EXTENDED_MIN);
evalMixes(1);
EXPECT_EQ(channelOutputs[2], 1024);
EXPECT_EQ(channelOutputs[THR_CHAN], 1024);
// stick min + trim max
anaSetFiltered(THR_STICK, -1024);
anaSetFiltered(THR_STICK, THR_STICK_MIN_THR_POS);
setTrimValue(0, THR_STICK, TRIM_EXTENDED_MAX);
evalMixes(1);
EXPECT_EQ(channelOutputs[2], -1024+2048);
EXPECT_EQ(channelOutputs[THR_CHAN], THR_STICK_MIN_THR_POS + TRIM_SCALE(2048));
// stick min + trim mid
anaSetFiltered(THR_STICK, -1024);
anaSetFiltered(THR_STICK, THR_STICK_MIN_THR_POS);
setTrimValue(0, THR_STICK, 0);
evalMixes(1);
EXPECT_EQ(channelOutputs[2], -1024+1024);
EXPECT_EQ(channelOutputs[THR_CHAN], THR_STICK_MIN_THR_POS + TRIM_SCALE(1024));
// stick min + trim min
anaSetFiltered(THR_STICK, -1024);
anaSetFiltered(THR_STICK, THR_STICK_MIN_THR_POS);
setTrimValue(0, THR_STICK, TRIM_EXTENDED_MIN);
evalMixes(1);
EXPECT_EQ(channelOutputs[2], -1024);
EXPECT_EQ(channelOutputs[THR_CHAN], THR_STICK_MIN_THR_POS);
}
TEST_F(TrimsTest, invertedThrottlePlusThrottleTrim)
@@ -166,55 +193,85 @@ TEST_F(TrimsTest, invertedThrottlePlusThrottleTrim)
anaSetFiltered(THR_STICK, +1024);
setTrimValue(0, THR_STICK, TRIM_MAX);
evalMixes(1);
EXPECT_EQ(channelOutputs[2], -1024);
EXPECT_EQ(channelOutputs[THR_CHAN], -1024);
// stick max + trim mid
anaSetFiltered(THR_STICK, +1024);
setTrimValue(0, THR_STICK, 0);
evalMixes(1);
#if defined(SURFACE_RADIO)
EXPECT_EQ(channelOutputs[THR_CHAN], -1024); // no effect since we are in reverse mode
#else
EXPECT_EQ(channelOutputs[2], -1024+256);
#endif
// stick max + trim min
anaSetFiltered(THR_STICK, +1024);
setTrimValue(0, THR_STICK, TRIM_MIN);
evalMixes(1);
EXPECT_EQ(channelOutputs[2], -1024+512);
#if defined(SURFACE_RADIO)
EXPECT_EQ(channelOutputs[THR_CHAN], -1024); // no effect since we are in reverse mode
#else
EXPECT_EQ(channelOutputs[THR_CHAN], -1024+512);
#endif
// stick max + trim min
anaSetFiltered(THR_STICK, +1024);
setTrimValue(0, THR_STICK, TRIM_MIN);
evalMixes(1);
#if defined(SURFACE_RADIO)
EXPECT_EQ(channelOutputs[THR_CHAN], -1024); // no effect since we are in reverse mode
#else
EXPECT_EQ(channelOutputs[THR_CHAN], -1024+512);
#endif
// stick min + trim max
anaSetFiltered(THR_STICK, -1024);
setTrimValue(0, THR_STICK, TRIM_MAX);
evalMixes(1);
EXPECT_EQ(channelOutputs[2], +1024);
EXPECT_EQ(channelOutputs[THR_CHAN], +1024);
// stick min + trim min
anaSetFiltered(THR_STICK, -1024);
setTrimValue(0, THR_STICK, TRIM_MIN);
evalMixes(1);
EXPECT_EQ(channelOutputs[2], +1024);
EXPECT_EQ(channelOutputs[THR_CHAN], +1024);
// now the same tests with extended Trims
g_model.extendedTrims = 1;
// stick max + trim max
// stick max + trim max : no effect since we are in reverse mode
anaSetFiltered(THR_STICK, +1024);
setTrimValue(0, THR_STICK, TRIM_EXTENDED_MAX);
evalMixes(1);
EXPECT_EQ(channelOutputs[2], -1024);
EXPECT_EQ(channelOutputs[THR_CHAN], -1024);
#if defined(SURFACE_RADIO)
// stick max + trim mid: no effect since we are in reverse mode
anaSetFiltered(THR_STICK, +1024);
setTrimValue(0, THR_STICK, 0);
evalMixes(1);
EXPECT_EQ(channelOutputs[THR_CHAN], -1024);
#else
// stick max + trim mid
anaSetFiltered(THR_STICK, +1024);
setTrimValue(0, THR_STICK, 0);
evalMixes(1);
EXPECT_EQ(channelOutputs[2], -1024+1024);
EXPECT_EQ(channelOutputs[THR_CHAN], -1024+1024);
// stick max + trim min
anaSetFiltered(THR_STICK, +1024);
setTrimValue(0, THR_STICK, TRIM_EXTENDED_MIN);
evalMixes(1);
EXPECT_EQ(channelOutputs[2], -1024+2048);
EXPECT_EQ(channelOutputs[THR_CHAN], -1024+2048);
#endif
// stick min + trim max
anaSetFiltered(THR_STICK, -1024);
setTrimValue(0, THR_STICK, TRIM_EXTENDED_MAX);
evalMixes(1);
EXPECT_EQ(channelOutputs[2], +1024);
EXPECT_EQ(channelOutputs[THR_CHAN], +1024);
// stick min + trim mid
anaSetFiltered(THR_STICK, -1024);
setTrimValue(0, THR_STICK, 0);
evalMixes(1);
EXPECT_EQ(channelOutputs[THR_CHAN], +1024);
// stick min + trim min
anaSetFiltered(THR_STICK, -1024);
setTrimValue(0, THR_STICK, TRIM_EXTENDED_MIN);
evalMixes(1);
EXPECT_EQ(channelOutputs[2], +1024);
EXPECT_EQ(channelOutputs[THR_CHAN], +1024);
}
TEST_F(TrimsTest, throttleTrimWithZeroWeightOnThrottle)
@@ -227,32 +284,32 @@ TEST_F(TrimsTest, throttleTrimWithZeroWeightOnThrottle)
anaSetFiltered(THR_STICK, +1024);
setTrimValue(0, THR_STICK, TRIM_MAX);
evalMixes(1);
EXPECT_EQ(channelOutputs[2], 256);
EXPECT_EQ(channelOutputs[THR_CHAN], 256);
// stick max + trim mid
anaSetFiltered(THR_STICK, +1024);
setTrimValue(0, THR_STICK, 0);
evalMixes(1);
EXPECT_LE(abs(channelOutputs[2] - 128), 1); //can't use precise comparison here because of lower precision math on 9X
EXPECT_LE(abs(channelOutputs[THR_CHAN] - 128), 1); //can't use precise comparison here because of lower precision math on 9X
// stick max + trim min
anaSetFiltered(THR_STICK, +1024);
setTrimValue(0, THR_STICK, TRIM_MIN);
evalMixes(1);
EXPECT_EQ(channelOutputs[2], 0);
EXPECT_EQ(channelOutputs[THR_CHAN], 0);
// stick min + trim max
anaSetFiltered(THR_STICK, -1024);
setTrimValue(0, THR_STICK, TRIM_MAX);
evalMixes(1);
EXPECT_EQ(channelOutputs[2], 256);
EXPECT_EQ(channelOutputs[THR_CHAN], 256);
// stick min + trim mid
anaSetFiltered(THR_STICK, -1024);
setTrimValue(0, THR_STICK, 0);
evalMixes(1);
EXPECT_LE(abs(channelOutputs[2] - 128), 1);
EXPECT_LE(abs(channelOutputs[THR_CHAN] - 128), 1);
// stick min + trim min
anaSetFiltered(THR_STICK, -1024);
setTrimValue(0, THR_STICK, TRIM_MIN);
evalMixes(1);
EXPECT_EQ(channelOutputs[2], 0);
EXPECT_EQ(channelOutputs[THR_CHAN], 0);
// now some tests with extended Trims
g_model.extendedTrims = 1;
@@ -260,31 +317,31 @@ TEST_F(TrimsTest, throttleTrimWithZeroWeightOnThrottle)
setTrimValue(0, THR_STICK, TRIM_EXTENDED_MIN);
anaSetFiltered(THR_STICK, -1024);
evalMixes(1);
EXPECT_EQ(channelOutputs[2], 0);
EXPECT_EQ(channelOutputs[THR_CHAN], 0);
anaSetFiltered(THR_STICK, -300);
evalMixes(1);
EXPECT_EQ(channelOutputs[2], 0);
EXPECT_EQ(channelOutputs[THR_CHAN], 0);
anaSetFiltered(THR_STICK, +300);
evalMixes(1);
EXPECT_EQ(channelOutputs[2], 0);
EXPECT_EQ(channelOutputs[THR_CHAN], 0);
anaSetFiltered(THR_STICK, +1024);
evalMixes(1);
EXPECT_EQ(channelOutputs[2], 0);
EXPECT_EQ(channelOutputs[THR_CHAN], 0);
// trim max + various stick positions = should always be same value
setTrimValue(0, THR_STICK, TRIM_EXTENDED_MAX);
anaSetFiltered(THR_STICK, -1024);
evalMixes(1);
EXPECT_EQ(channelOutputs[2], 1024);
EXPECT_EQ(channelOutputs[THR_CHAN], 1024);
anaSetFiltered(THR_STICK, -300);
evalMixes(1);
EXPECT_EQ(channelOutputs[2], 1024);
EXPECT_EQ(channelOutputs[THR_CHAN], 1024);
anaSetFiltered(THR_STICK, +300);
evalMixes(1);
EXPECT_EQ(channelOutputs[2], 1024);
EXPECT_EQ(channelOutputs[THR_CHAN], 1024);
anaSetFiltered(THR_STICK, +1024);
evalMixes(1);
EXPECT_EQ(channelOutputs[2], 1024);
EXPECT_EQ(channelOutputs[THR_CHAN], 1024);
}
TEST_F(TrimsTest, invertedThrottlePlusthrottleTrimWithZeroWeightOnThrottle)
@@ -298,32 +355,32 @@ TEST_F(TrimsTest, invertedThrottlePlusthrottleTrimWithZeroWeightOnThrottle)
anaSetFiltered(THR_STICK, +1024);
setTrimValue(0, THR_STICK, TRIM_MAX);
evalMixes(1);
EXPECT_EQ(channelOutputs[2], 0);
EXPECT_EQ(channelOutputs[THR_CHAN], 0);
// stick max + trim mid
anaSetFiltered(THR_STICK, +1024);
setTrimValue(0, THR_STICK, 0);
evalMixes(1);
EXPECT_LE(abs(channelOutputs[2] - 128), 1);
EXPECT_LE(abs(channelOutputs[THR_CHAN] - 128), 1);
// stick max + trim min
anaSetFiltered(THR_STICK, +1024);
setTrimValue(0, THR_STICK, TRIM_MIN);
evalMixes(1);
EXPECT_EQ(channelOutputs[2], 256);
EXPECT_EQ(channelOutputs[THR_CHAN], 256);
// stick min + trim max
anaSetFiltered(THR_STICK, -1024);
setTrimValue(0, THR_STICK, TRIM_MAX);
evalMixes(1);
EXPECT_EQ(channelOutputs[2], 0);
EXPECT_EQ(channelOutputs[THR_CHAN], 0);
// stick min + trim mid
anaSetFiltered(THR_STICK, -1024);
setTrimValue(0, THR_STICK, 0);
evalMixes(1);
EXPECT_LE(abs(channelOutputs[2] - 128), 1);
EXPECT_LE(abs(channelOutputs[THR_CHAN] - 128), 1);
// stick min + trim min
anaSetFiltered(THR_STICK, -1024);
setTrimValue(0, THR_STICK, TRIM_MIN);
evalMixes(1);
EXPECT_EQ(channelOutputs[2], 256);
EXPECT_EQ(channelOutputs[THR_CHAN], 256);
// now some tests with extended Trims
g_model.extendedTrims = 1;
@@ -331,51 +388,51 @@ TEST_F(TrimsTest, invertedThrottlePlusthrottleTrimWithZeroWeightOnThrottle)
setTrimValue(0, THR_STICK, TRIM_EXTENDED_MIN);
anaSetFiltered(THR_STICK, -1024);
evalMixes(1);
EXPECT_EQ(channelOutputs[2], 1024);
EXPECT_EQ(channelOutputs[THR_CHAN], 1024);
anaSetFiltered(THR_STICK, -300);
evalMixes(1);
EXPECT_EQ(channelOutputs[2], 1024);
EXPECT_EQ(channelOutputs[THR_CHAN], 1024);
anaSetFiltered(THR_STICK, +300);
evalMixes(1);
EXPECT_EQ(channelOutputs[2], 1024);
EXPECT_EQ(channelOutputs[THR_CHAN], 1024);
anaSetFiltered(THR_STICK, +1024);
evalMixes(1);
EXPECT_EQ(channelOutputs[2], 1024);
EXPECT_EQ(channelOutputs[THR_CHAN], 1024);
// trim max + various stick positions = should always be same value
setTrimValue(0, THR_STICK, TRIM_EXTENDED_MAX);
anaSetFiltered(THR_STICK, -1024);
evalMixes(1);
EXPECT_EQ(channelOutputs[2], 0);
EXPECT_EQ(channelOutputs[THR_CHAN], 0);
anaSetFiltered(THR_STICK, -300);
evalMixes(1);
EXPECT_EQ(channelOutputs[2], 0);
EXPECT_EQ(channelOutputs[THR_CHAN], 0);
anaSetFiltered(THR_STICK, +300);
evalMixes(1);
EXPECT_EQ(channelOutputs[2], 0);
EXPECT_EQ(channelOutputs[THR_CHAN], 0);
anaSetFiltered(THR_STICK, +1024);
evalMixes(1);
EXPECT_EQ(channelOutputs[2], 0);
EXPECT_EQ(channelOutputs[THR_CHAN], 0);
}
TEST_F(TrimsTest, CopyTrimsToOffset)
{
setTrimValue(0, ELE_STICK, -100); // -100 on elevator
setTrimValue(0, ELE_STICK, -100); // -100 on elevator/steering
evalFunctions(g_model.customFn, modelFunctionsContext); // it disables all safety channels
copyTrimsToOffset(1);
copyTrimsToOffset(ELE_CHAN);
EXPECT_EQ(getTrimValue(0, ELE_STICK), -100); // unchanged
EXPECT_EQ(g_model.limitData[1].offset, -195);
EXPECT_EQ(g_model.limitData[ELE_CHAN].offset, -195);
}
TEST_F(TrimsTest, CopySticksToOffset)
{
anaSetFiltered(ELE_STICK, -100);
evalMixes(1);
copySticksToOffset(1);
copySticksToOffset(ELE_CHAN);
#if defined(STICK_DEAD_ZONE)
EXPECT_EQ(g_model.limitData[1].offset, -93);
EXPECT_EQ(g_model.limitData[ELE_CHAN].offset, -93);
#else
EXPECT_EQ(g_model.limitData[1].offset, -97);
EXPECT_EQ(g_model.limitData[ELE_CHAN].offset, -97);
#endif
}
@@ -384,41 +441,55 @@ TEST_F(TrimsTest, MoveTrimsToOffsets)
// No trim idle only
g_model.thrTrim = 0;
anaSetFiltered(THR_STICK, 0);
setTrimValue(0, MIXSRC_TrimThr - MIXSRC_FIRST_TRIM, 100);
setTrimValue(0, MIXSRC_TrimEle - MIXSRC_FIRST_TRIM, -100);
setTrimValue(0, MIXSRC_TRIMTHR - MIXSRC_FIRST_TRIM, 100);
setTrimValue(0, MIXSRC_TRIMELE - MIXSRC_FIRST_TRIM, -100);
evalMixes(1);
EXPECT_EQ(channelOutputs[2], 200); // THR output value is reflecting 100 trim
EXPECT_EQ(channelOutputs[THR_CHAN], TRIM_SCALE(200)); // THR output value is reflecting 100 trim
moveTrimsToOffsets();
EXPECT_EQ(getTrimValue(0, MIXSRC_TrimThr - MIXSRC_FIRST_TRIM), 0); // back to neutral
EXPECT_EQ(g_model.limitData[2].offset, 195); // value transferred
EXPECT_EQ(getTrimValue(0, MIXSRC_TrimEle - MIXSRC_FIRST_TRIM), 0); // back to neutral
EXPECT_EQ(g_model.limitData[1].offset, -195); // value transferred
EXPECT_EQ(getTrimValue(0, MIXSRC_TRIMTHR - MIXSRC_FIRST_TRIM), 0); // back to neutral
EXPECT_EQ(g_model.limitData[THR_CHAN].offset, TRIM_SCALE(195)); // value transferred
EXPECT_EQ(getTrimValue(0, MIXSRC_TRIMELE - MIXSRC_FIRST_TRIM), 0); // back to neutral
EXPECT_EQ(g_model.limitData[ELE_CHAN].offset, -195); // value transferred
evalMixes(1);
EXPECT_EQ(channelOutputs[2], 200); // THR output value is still reflecting 100 trim
#if defined(SURFACE_RADIO)
EXPECT_EQ(channelOutputs[THR_CHAN], 99); // THR output value is still reflecting 100 trim
#else
EXPECT_EQ(channelOutputs[THR_CHAN], 200); // THR output value is still reflecting 100 trim
#endif
}
TEST_F(TrimsTest, MoveTrimsToOffsetsWithTrimIdle)
{
// Trim idle only
g_model.thrTrim = 1;
anaSetFiltered(THR_STICK, -1024); // Min stick
g_model.limitData[2].offset = 0;
g_model.limitData[1].offset = 0;
setTrimValue(0, MIXSRC_TrimThr - MIXSRC_FIRST_TRIM, 100);
setTrimValue(0, MIXSRC_TrimEle - MIXSRC_FIRST_TRIM, -100);
anaSetFiltered(THR_STICK, THR_STICK_MIN_THR_POS); // Min stick
g_model.limitData[THR_CHAN].offset = 0;
g_model.limitData[ELE_CHAN].offset = 0;
setTrimValue(0, MIXSRC_TRIMTHR - MIXSRC_FIRST_TRIM, 100);
setTrimValue(0, MIXSRC_TRIMELE - MIXSRC_FIRST_TRIM, -100);
evalMixes(1);
EXPECT_EQ(channelOutputs[2], -568); // THR output value is reflecting 100 trim idle
#if defined(SURFACE_RADIO)
EXPECT_EQ(channelOutputs[THR_CHAN], 228); // THR output value is reflecting 100 trim idle
#else
EXPECT_EQ(channelOutputs[THR_CHAN], -568); // THR output value is reflecting 100 trim idle
#endif
moveTrimsToOffsets();
// Trim affecting Throttle should not be affected
EXPECT_EQ(getTrimValue(0, MIXSRC_TrimThr - MIXSRC_FIRST_TRIM), 100); // unchanged
EXPECT_EQ(getTrimValue(0, MIXSRC_TRIMTHR - MIXSRC_FIRST_TRIM), 100); // unchanged
EXPECT_EQ(g_model.limitData[2].offset, 0); // unchanged
// Other trims should
EXPECT_EQ(getTrimValue(0, MIXSRC_TrimEle - MIXSRC_FIRST_TRIM), 0); // back to neutral
EXPECT_EQ(g_model.limitData[1].offset, -195); // value transferred
EXPECT_EQ(getTrimValue(0, MIXSRC_TRIMELE - MIXSRC_FIRST_TRIM), 0); // back to neutral
#if defined(SURFACE_RADIO)
EXPECT_EQ(g_model.limitData[ELE_CHAN].offset, -195); // value transferred
evalMixes(1);
EXPECT_EQ(channelOutputs[2], -568); // THR output value is still reflecting 100 trim idle
EXPECT_EQ(channelOutputs[THR_CHAN], 228); // THR output value is reflecting 100 trim idle
#else
EXPECT_EQ(g_model.limitData[ELE_CHAN].offset, -195); // value transferred
evalMixes(1);
EXPECT_EQ(channelOutputs[THR_CHAN], -568); // THR output value is reflecting 100 trim idle
#endif
}
TEST_F(TrimsTest, MoveTrimsToOffsetsWithCrossTrims)
@@ -426,59 +497,73 @@ TEST_F(TrimsTest, MoveTrimsToOffsetsWithCrossTrims)
// No trim idle only
// Cross trims
g_model.thrTrim = 0;
g_model.limitData[2].offset = 0;
g_model.limitData[1].offset = 0;
g_model.thrTrimSw = MIXSRC_TrimEle - MIXSRC_FIRST_TRIM;
ExpoData *expo = expoAddress(THR_STICK);
expo->trimSource = TRIM_ELE;
expo = expoAddress(ELE_STICK);
expo->trimSource = TRIM_THR;
g_model.limitData[THR_CHAN].offset = 0;
g_model.limitData[ELE_CHAN].offset = 0;
g_model.setThrottleStickTrimSource(MIXSRC_TRIMELE);
ExpoData *expo = expoAddress(THR_CHAN);
expo->trimSource = ELE_TRIM_SOURCE;
expo = expoAddress(ELE_CHAN);
expo->trimSource = THR_TRIM_SOURCE;
anaSetFiltered(THR_STICK, 0);
setTrimValue(0, MIXSRC_TrimEle - MIXSRC_FIRST_TRIM, 100);
setTrimValue(0, MIXSRC_TrimThr - MIXSRC_FIRST_TRIM, -100);
anaSetFiltered(ELE_STICK, 0);
setTrimValue(0, MIXSRC_TRIMELE - MIXSRC_FIRST_TRIM, 100);
setTrimValue(0, MIXSRC_TRIMTHR - MIXSRC_FIRST_TRIM, -100);
evalMixes(1);
EXPECT_EQ(channelOutputs[2], 200); // THR output value is reflecting 100 Ele trim
EXPECT_EQ(channelOutputs[THR_CHAN], TRIM_SCALE(200)); // THR output value is reflecting 100 Ele trim
EXPECT_EQ(channelOutputs[ELE_CHAN], -200); // ELE output value is reflecting -100 Thr trim
moveTrimsToOffsets();
evalMixes(1);
EXPECT_EQ(channelOutputs[2], 200); // THR output value remains unchanged
EXPECT_EQ(getTrimValue(0, MIXSRC_TrimThr - MIXSRC_FIRST_TRIM), 0); // back to neutral
EXPECT_EQ(g_model.limitData[2].offset, 195); // value transferred
EXPECT_EQ(getTrimValue(0, MIXSRC_TrimEle - MIXSRC_FIRST_TRIM), 0); // back to neutral
EXPECT_EQ(g_model.limitData[1].offset, -195); // value transferred
#if defined(SURFACE_RADIO)
EXPECT_EQ(channelOutputs[THR_CHAN], 99); // THR output value remains unchanged
#else
EXPECT_EQ(channelOutputs[THR_CHAN], 200); // THR output value remains unchanged
#endif
EXPECT_EQ(getTrimValue(0, MIXSRC_TRIMTHR - MIXSRC_FIRST_TRIM), 0); // back to neutral
EXPECT_EQ(g_model.limitData[THR_CHAN].offset, TRIM_SCALE(195)); // value transferred
EXPECT_EQ(getTrimValue(0, MIXSRC_TRIMELE - MIXSRC_FIRST_TRIM), 0); // back to neutral
EXPECT_EQ(g_model.limitData[ELE_CHAN].offset, -195); // value transferred
}
TEST_F(TrimsTest, MoveTrimsToOffsetsWithCrosstrimsAndTrimIdle)
{
// Trim idle only
// Cross trims
g_model.limitData[2].offset = 0;
g_model.limitData[1].offset = 0;
g_model.limitData[THR_CHAN].offset = 0;
g_model.limitData[ELE_CHAN].offset = 0;
g_model.thrTrim = 1;
g_model.thrTrimSw = MIXSRC_TrimEle - MIXSRC_FIRST_TRIM;
ExpoData *expo = expoAddress(THR_STICK);
expo->trimSource = TRIM_ELE;
expo = expoAddress(ELE_STICK);
expo->trimSource = TRIM_THR;
anaSetFiltered(THR_STICK, -1024); // Min stick
setTrimValue(0, MIXSRC_TrimEle - MIXSRC_FIRST_TRIM, 100);
setTrimValue(0, MIXSRC_TrimThr - MIXSRC_FIRST_TRIM, -100);
g_model.thrTrimSw = ELE_THRTRIMSW;
ExpoData *expo = expoAddress(THR_CHAN);
expo->trimSource = ELE_TRIM_SOURCE;
expo = expoAddress(ELE_CHAN);
expo->trimSource = THR_TRIM_SOURCE;
anaSetFiltered(THR_STICK, THR_STICK_MIN_THR_POS); // Min throttle
setTrimValue(0, MIXSRC_TRIMELE - MIXSRC_FIRST_TRIM, 100);
setTrimValue(0, MIXSRC_TRIMTHR - MIXSRC_FIRST_TRIM, -100);
evalMixes(1);
EXPECT_EQ(channelOutputs[2], -568); // THR output value is reflecting 100 ele trim idle
#if defined(SURFACE_RADIO)
EXPECT_EQ(channelOutputs[THR_CHAN], 228); // THR output value is reflecting 100 ele trim idle
#else
EXPECT_EQ(channelOutputs[THR_CHAN], -568); // THR output value is reflecting 100 ele trim idle
#endif
moveTrimsToOffsets();
// Trim affecting Throttle (now Ele because of crosstrims) should not be affected
EXPECT_EQ(getTrimValue(0, MIXSRC_TrimEle - MIXSRC_FIRST_TRIM), 100); // unchanged
EXPECT_EQ(getTrimValue(0, MIXSRC_TRIMELE - MIXSRC_FIRST_TRIM), 100); // unchanged
EXPECT_EQ(g_model.limitData[2].offset, 0); // THR chan offset unchanged
// Other trims should
EXPECT_EQ(getTrimValue(0, MIXSRC_TrimThr - MIXSRC_FIRST_TRIM), 0); // back to neutral
EXPECT_EQ(g_model.limitData[1].offset, -195); // Ele chan offset transfered
EXPECT_EQ(getTrimValue(0, MIXSRC_TRIMTHR - MIXSRC_FIRST_TRIM), 0); // back to neutral
EXPECT_EQ(g_model.limitData[ELE_CHAN].offset, -195); // Ele chan offset transferred
evalMixes(1);
EXPECT_EQ(channelOutputs[2], -568); // THR output value is still reflecting 100 trim idle
#if defined(SURFACE_RADIO)
EXPECT_EQ(channelOutputs[THR_CHAN], 228); // THR output value is still reflecting 100 trim idle
#else
EXPECT_EQ(channelOutputs[THR_CHAN], -568); // THR output value is still reflecting 100 trim idle
#endif
}
#if !defined(SURFACE_RADIO)
TEST_F(TrimsTest, InstantTrim)
{
anaSetFiltered(AIL_STICK, 50);
@@ -508,6 +593,7 @@ TEST_F(TrimsTest, InstantTrimNegativeCurve)
EXPECT_EQ(128, getTrimValue(0, AIL_STICK));
#endif
}
#endif
TEST(Curves, LinearIntpol)
{
@@ -746,15 +832,15 @@ TEST_F(TrimsTest, throttleTrimEle) {
MODEL_RESET();
MIXER_RESET();
setModelDefaults();
g_eeGeneral.templateSetup = 17;
g_eeGeneral.templateSetup = 17; // WARNING: NOT RETA (TAER or TH/ST)
applyDefaultTemplate();
g_model.thrTrim = 1;
// checks ELE sticks are not affected by throttleTrim
// stick max + trim min
// checks ELE sticks are not affected by throttleTrim
// stick max + trim min
anaSetFiltered(ELE_STICK, +1024);
setTrimValue(0, ELE_STICK, TRIM_MIN);
evalMixes(1);
EXPECT_EQ(channelOutputs[2], 1024 - 256);
EXPECT_EQ(channelOutputs[THR_CHAN], 1024 - 256);
SYSTEM_RESET();
MODEL_RESET();
MIXER_RESET();
@@ -770,9 +856,9 @@ TEST(Heli, BasicTest)
MODEL_RESET();
MIXER_RESET();
setModelDefaults();
g_model.swashR.collectiveSource = MIXSRC_Thr;
g_model.swashR.elevatorSource = MIXSRC_Ele;
g_model.swashR.aileronSource = MIXSRC_Ail;
g_model.swashR.collectiveSource = MIXSRC_THR;
g_model.swashR.elevatorSource = MIXSRC_ELE;
g_model.swashR.aileronSource = MIXSRC_AIL;
g_model.swashR.collectiveWeight = 100;
g_model.swashR.elevatorWeight = 100;
g_model.swashR.aileronWeight = 100;
@@ -806,9 +892,9 @@ TEST(Heli, Mode2Test)
setModelDefaults();
g_eeGeneral.templateSetup = 2;
applyDefaultTemplate();
g_model.swashR.collectiveSource = MIXSRC_Thr;
g_model.swashR.elevatorSource = MIXSRC_Ele;
g_model.swashR.aileronSource = MIXSRC_Ail;
g_model.swashR.collectiveSource = MIXSRC_THR;
g_model.swashR.elevatorSource = MIXSRC_ELE;
g_model.swashR.aileronSource = MIXSRC_AIL;
g_model.swashR.collectiveWeight = 100;
g_model.swashR.elevatorWeight = 100;
g_model.swashR.aileronWeight = 100;
@@ -901,152 +987,168 @@ TEST_F(MixerTest, flightModeOverflow)
TEST_F(TrimsTest, throttleTrimWithCrossTrims)
{
g_model.thrTrim = 1;
g_model.thrTrimSw = MIXSRC_TrimEle - MIXSRC_FIRST_TRIM;
g_model.thrTrimSw = ELE_THRTRIMSW;
ExpoData *expo = expoAddress(THR_STICK);
expo->trimSource = TRIM_ELE;
expo->trimSource = ELE_TRIM_SOURCE;
expo = expoAddress(ELE_STICK);
expo->trimSource = TRIM_THR;
expo->trimSource = THR_TRIM_SOURCE;
// stick max + trim max
anaSetFiltered(THR_STICK, +1024);
anaSetFiltered(ELE_STICK, 0);
setTrimValue(0, MIXSRC_TrimEle - MIXSRC_FIRST_TRIM, TRIM_MAX);
setTrimValue(0, MIXSRC_TRIMELE - MIXSRC_FIRST_TRIM, TRIM_MAX);
evalMixes(1);
EXPECT_EQ(channelOutputs[2], 1024);
EXPECT_EQ(channelOutputs[1], 0);
EXPECT_EQ(channelOutputs[THR_CHAN], 1024);
EXPECT_EQ(channelOutputs[ELE_CHAN], 0);
// stick max + trim min
anaSetFiltered(THR_STICK, +1024);
setTrimValue(0, MIXSRC_TrimEle - MIXSRC_FIRST_TRIM, TRIM_MIN);
setTrimValue(0, MIXSRC_TRIMELE - MIXSRC_FIRST_TRIM, TRIM_MIN);
evalMixes(1);
EXPECT_EQ(channelOutputs[2], 1024);
EXPECT_EQ(channelOutputs[1], 0);
EXPECT_EQ(channelOutputs[THR_CHAN], 1024);
EXPECT_EQ(channelOutputs[ELE_CHAN], 0);
// stick min + trim max
anaSetFiltered(THR_STICK, -1024);
setTrimValue(0, MIXSRC_TrimEle - MIXSRC_FIRST_TRIM, TRIM_MAX);
anaSetFiltered(THR_STICK, THR_STICK_MIN_THR_POS);
setTrimValue(0, MIXSRC_TRIMELE - MIXSRC_FIRST_TRIM, TRIM_MAX);
evalMixes(1);
EXPECT_EQ(channelOutputs[2], -1024 + 512);
EXPECT_EQ(channelOutputs[1], 0);
EXPECT_EQ(channelOutputs[THR_CHAN], THR_STICK_MIN_THR_POS + TRIM_SCALE(512));
EXPECT_EQ(channelOutputs[ELE_CHAN], 0);
// stick min + trim mid
anaSetFiltered(THR_STICK, -1024);
setTrimValue(0, MIXSRC_TrimEle - MIXSRC_FIRST_TRIM, 0);
anaSetFiltered(THR_STICK, THR_STICK_MIN_THR_POS);
setTrimValue(0, MIXSRC_TRIMELE - MIXSRC_FIRST_TRIM, 0);
evalMixes(1);
EXPECT_EQ(channelOutputs[2], -1024 + 256);
EXPECT_EQ(channelOutputs[1], 0);
EXPECT_EQ(channelOutputs[THR_CHAN], THR_STICK_MIN_THR_POS + TRIM_SCALE(256));
EXPECT_EQ(channelOutputs[ELE_CHAN], 0);
// stick min + trim min
anaSetFiltered(THR_STICK, -1024);
setTrimValue(0, MIXSRC_TrimEle - MIXSRC_FIRST_TRIM, TRIM_MIN);
anaSetFiltered(THR_STICK, THR_STICK_MIN_THR_POS);
setTrimValue(0, MIXSRC_TRIMELE - MIXSRC_FIRST_TRIM, TRIM_MIN);
evalMixes(1);
EXPECT_EQ(channelOutputs[2], -1024);
EXPECT_EQ(channelOutputs[1], 0);
EXPECT_EQ(channelOutputs[THR_CHAN], THR_STICK_MIN_THR_POS);
EXPECT_EQ(channelOutputs[ELE_CHAN], 0);
// now the same tests with extended Trims
g_model.extendedTrims = 1;
// stick max + trim max
anaSetFiltered(THR_STICK, +1024);
setTrimValue(0, MIXSRC_TrimEle - MIXSRC_FIRST_TRIM, TRIM_EXTENDED_MAX);
setTrimValue(0, MIXSRC_TRIMELE - MIXSRC_FIRST_TRIM, TRIM_EXTENDED_MAX);
evalMixes(1);
EXPECT_EQ(channelOutputs[2], 1024);
EXPECT_EQ(channelOutputs[1], 0);
EXPECT_EQ(channelOutputs[THR_CHAN], 1024);
EXPECT_EQ(channelOutputs[ELE_CHAN], 0);
// stick max + trim min
anaSetFiltered(THR_STICK, +1024);
setTrimValue(0, MIXSRC_TrimEle - MIXSRC_FIRST_TRIM, TRIM_EXTENDED_MIN);
setTrimValue(0, MIXSRC_TRIMELE - MIXSRC_FIRST_TRIM, TRIM_EXTENDED_MIN);
evalMixes(1);
EXPECT_EQ(channelOutputs[2], 1024);
EXPECT_EQ(channelOutputs[1], 0);
EXPECT_EQ(channelOutputs[THR_CHAN], 1024);
EXPECT_EQ(channelOutputs[ELE_CHAN], 0);
// stick min + trim max
anaSetFiltered(THR_STICK, -1024);
setTrimValue(0, MIXSRC_TrimEle - MIXSRC_FIRST_TRIM, TRIM_EXTENDED_MAX);
anaSetFiltered(THR_STICK, THR_STICK_MIN_THR_POS);
setTrimValue(0, MIXSRC_TRIMELE - MIXSRC_FIRST_TRIM, TRIM_EXTENDED_MAX);
evalMixes(1);
EXPECT_EQ(channelOutputs[2], -1024+2048);
EXPECT_EQ(channelOutputs[1], 0);
EXPECT_EQ(channelOutputs[THR_CHAN], -1024+2048);
EXPECT_EQ(channelOutputs[ELE_CHAN], 0);
// stick min + trim mid
anaSetFiltered(THR_STICK, -1024);
setTrimValue(0, MIXSRC_TrimEle - MIXSRC_FIRST_TRIM, 0);
anaSetFiltered(THR_STICK, THR_STICK_MIN_THR_POS);
setTrimValue(0, MIXSRC_TRIMELE - MIXSRC_FIRST_TRIM, 0);
evalMixes(1);
EXPECT_EQ(channelOutputs[2], -1024+1024);
EXPECT_EQ(channelOutputs[1], 0);
EXPECT_EQ(channelOutputs[THR_CHAN], THR_STICK_MIN_THR_POS + TRIM_SCALE(1024));
EXPECT_EQ(channelOutputs[ELE_CHAN], 0);
// stick min + trim min
anaSetFiltered(THR_STICK, -1024);
setTrimValue(0, MIXSRC_TrimEle - MIXSRC_FIRST_TRIM, TRIM_EXTENDED_MIN);
anaSetFiltered(THR_STICK, THR_STICK_MIN_THR_POS);
setTrimValue(0, MIXSRC_TRIMELE - MIXSRC_FIRST_TRIM, TRIM_EXTENDED_MIN);
evalMixes(1);
EXPECT_EQ(channelOutputs[2], -1024);
EXPECT_EQ(channelOutputs[1], 0);
EXPECT_EQ(channelOutputs[THR_CHAN], THR_STICK_MIN_THR_POS);
EXPECT_EQ(channelOutputs[ELE_CHAN], 0);
}
TEST_F(TrimsTest, invertedThrottlePlusThrottleTrimWithCrossTrims)
{
g_model.throttleReversed = 1;
g_model.thrTrim = 1;
g_model.thrTrimSw = MIXSRC_TrimEle - MIXSRC_FIRST_TRIM;
g_model.thrTrimSw = ELE_THRTRIMSW;
ExpoData *expo = expoAddress(THR_STICK);
expo->trimSource = TRIM_ELE;
expo->trimSource = ELE_TRIM_SOURCE;
expo = expoAddress(ELE_STICK);
expo->trimSource = TRIM_THR;
expo->trimSource = THR_TRIM_SOURCE;
// stick max + trim max
anaSetFiltered(THR_STICK, +1024);
anaSetFiltered(ELE_STICK, 0);
setTrimValue(0, MIXSRC_TrimEle - MIXSRC_FIRST_TRIM, TRIM_MAX);
setTrimValue(0, MIXSRC_TRIMELE - MIXSRC_FIRST_TRIM, TRIM_MAX);
evalMixes(1);
EXPECT_EQ(channelOutputs[2], -1024);
EXPECT_EQ(channelOutputs[1], 0);
EXPECT_EQ(channelOutputs[THR_CHAN], -1024);
EXPECT_EQ(channelOutputs[ELE_CHAN], 0);
// stick max + trim mid
anaSetFiltered(THR_STICK, +1024);
setTrimValue(0, MIXSRC_TrimEle - MIXSRC_FIRST_TRIM, 0);
setTrimValue(0, MIXSRC_TRIMELE - MIXSRC_FIRST_TRIM, 0);
evalMixes(1);
EXPECT_EQ(channelOutputs[2], -1024+256);
EXPECT_EQ(channelOutputs[1], 0);
#if defined(SURFACE_RADIO)
EXPECT_EQ(channelOutputs[THR_CHAN], -1024); // no effect since we are in reverse mode
#else
EXPECT_EQ(channelOutputs[THR_CHAN], -1024+256);
#endif
EXPECT_EQ(channelOutputs[ELE_CHAN], 0);
// stick max + trim min
anaSetFiltered(THR_STICK, +1024);
setTrimValue(0, MIXSRC_TrimEle - MIXSRC_FIRST_TRIM, TRIM_MIN);
setTrimValue(0, MIXSRC_TRIMELE - MIXSRC_FIRST_TRIM, TRIM_MIN);
evalMixes(1);
EXPECT_EQ(channelOutputs[2], -1024+512);
EXPECT_EQ(channelOutputs[1], 0);
#if defined(SURFACE_RADIO)
EXPECT_EQ(channelOutputs[THR_CHAN], -1024); // no effect since we are in reverse mode
#else
EXPECT_EQ(channelOutputs[THR_CHAN], -1024+512);
#endif
EXPECT_EQ(channelOutputs[ELE_CHAN], 0);
// stick min + trim max
anaSetFiltered(THR_STICK, -1024);
setTrimValue(0, MIXSRC_TrimEle - MIXSRC_FIRST_TRIM, TRIM_MAX);
setTrimValue(0, MIXSRC_TRIMELE - MIXSRC_FIRST_TRIM, TRIM_MAX);
evalMixes(1);
EXPECT_EQ(channelOutputs[2], +1024);
EXPECT_EQ(channelOutputs[1], 0);
EXPECT_EQ(channelOutputs[THR_CHAN], +1024);
EXPECT_EQ(channelOutputs[ELE_CHAN], 0);
// stick min + trim min
anaSetFiltered(THR_STICK, -1024);
setTrimValue(0, MIXSRC_TrimEle - MIXSRC_FIRST_TRIM, TRIM_MIN);
setTrimValue(0, MIXSRC_TRIMELE - MIXSRC_FIRST_TRIM, TRIM_MIN);
evalMixes(1);
EXPECT_EQ(channelOutputs[2], +1024);
EXPECT_EQ(channelOutputs[1], 0);
EXPECT_EQ(channelOutputs[THR_CHAN], +1024);
EXPECT_EQ(channelOutputs[ELE_CHAN], 0);
// now the same tests with extended Trims
g_model.extendedTrims = 1;
// stick max + trim max
anaSetFiltered(THR_STICK, +1024);
setTrimValue(0, MIXSRC_TrimEle - MIXSRC_FIRST_TRIM, TRIM_EXTENDED_MAX);
setTrimValue(0, MIXSRC_TRIMELE - MIXSRC_FIRST_TRIM, TRIM_EXTENDED_MAX);
evalMixes(1);
EXPECT_EQ(channelOutputs[2], -1024);
EXPECT_EQ(channelOutputs[1], 0);
EXPECT_EQ(channelOutputs[THR_CHAN], -1024);
EXPECT_EQ(channelOutputs[ELE_CHAN], 0);
// stick max + trim mid
anaSetFiltered(THR_STICK, +1024);
setTrimValue(0, MIXSRC_TrimEle - MIXSRC_FIRST_TRIM, 0);
setTrimValue(0, MIXSRC_TRIMELE - MIXSRC_FIRST_TRIM, 0);
evalMixes(1);
EXPECT_EQ(channelOutputs[2], -1024+1024);
EXPECT_EQ(channelOutputs[1], 0);
#if defined(SURFACE_RADIO)
EXPECT_EQ(channelOutputs[THR_CHAN], -1024); // no effect since we are in reverse mode
#else
EXPECT_EQ(channelOutputs[THR_CHAN], -1024+1024);
#endif
EXPECT_EQ(channelOutputs[ELE_CHAN], 0);
// stick max + trim min
anaSetFiltered(THR_STICK, +1024);
setTrimValue(0, MIXSRC_TrimEle - MIXSRC_FIRST_TRIM, TRIM_EXTENDED_MIN);
setTrimValue(0, MIXSRC_TRIMELE - MIXSRC_FIRST_TRIM, TRIM_EXTENDED_MIN);
evalMixes(1);
EXPECT_EQ(channelOutputs[2], -1024+2048);
EXPECT_EQ(channelOutputs[1], 0);
#if defined(SURFACE_RADIO)
EXPECT_EQ(channelOutputs[THR_CHAN], -1024); // no effect since we are in reverse mode
#else
EXPECT_EQ(channelOutputs[THR_CHAN], -1024+2048);
#endif
EXPECT_EQ(channelOutputs[ELE_CHAN], 0);
// stick min + trim max
anaSetFiltered(THR_STICK, -1024);
setTrimValue(0, MIXSRC_TrimEle - MIXSRC_FIRST_TRIM, TRIM_EXTENDED_MAX);
setTrimValue(0, MIXSRC_TRIMELE - MIXSRC_FIRST_TRIM, TRIM_EXTENDED_MAX);
evalMixes(1);
EXPECT_EQ(channelOutputs[2], +1024);
EXPECT_EQ(channelOutputs[1], 0);
EXPECT_EQ(channelOutputs[THR_CHAN], +1024);
EXPECT_EQ(channelOutputs[ELE_CHAN], 0);
// stick min + trim min
anaSetFiltered(THR_STICK, -1024);
setTrimValue(0, MIXSRC_TrimEle - MIXSRC_FIRST_TRIM, TRIM_EXTENDED_MIN);
setTrimValue(0, MIXSRC_TRIMELE - MIXSRC_FIRST_TRIM, TRIM_EXTENDED_MIN);
evalMixes(1);
EXPECT_EQ(channelOutputs[2], +1024);
EXPECT_EQ(channelOutputs[1], 0);
EXPECT_EQ(channelOutputs[THR_CHAN], +1024);
EXPECT_EQ(channelOutputs[ELE_CHAN], 0);
}