From 228ec7722e8c25863cf3656ab07ffd5415d0b594 Mon Sep 17 00:00:00 2001 From: 3djc Date: Sat, 21 Nov 2020 13:25:24 +0100 Subject: [PATCH 1/8] Work throttle trim trims -> subtrim --- radio/src/opentx.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index 673c37aa7..f6b60cb7e 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -1748,7 +1748,8 @@ void copyTrimsToOffset(uint8_t ch) int16_t output = applyLimits(ch, chans[ch]) - zero; int16_t v = g_model.limitData[ch].offset; - if (g_model.limitData[ch].revert) output = -output; + if (g_model.limitData[ch].revert) + output = -output; v += (output * 125) / 128; g_model.limitData[ch].offset = limit((int16_t)-1000, (int16_t)v, (int16_t)1000); // make sure the offset doesn't go haywire @@ -1832,7 +1833,8 @@ void moveTrimsToOffsets() // copy state of 3 primary to subtrim for (uint8_t i=0; i Date: Sat, 21 Nov 2020 13:26:00 +0100 Subject: [PATCH 2/8] Test for Trims=>Subtrims --- radio/src/tests/mixer.cpp | 92 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) diff --git a/radio/src/tests/mixer.cpp b/radio/src/tests/mixer.cpp index deaf3ec14..823b08a81 100644 --- a/radio/src/tests/mixer.cpp +++ b/radio/src/tests/mixer.cpp @@ -339,6 +339,98 @@ TEST_F(TrimsTest, CopySticksToOffset) EXPECT_EQ(g_model.limitData[1].offset, -97); } +TEST_F(TrimsTest, TrimsToSubtrims) +{ + // No trim idle only + g_model.thrTrim = 0; + anaInValues[THR_STICK] = 0; + 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 + 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 + evalMixes(1); + EXPECT_EQ(channelOutputs[2], 200); // THR output value is still reflecting 100 trim + + // Trim idle only + g_model.thrTrim = 1; + anaInValues[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); + evalMixes(1); + EXPECT_EQ(channelOutputs[2], -574); // THR output value is reflecting 100 trim idle + moveTrimsToOffsets(); + + // Trim affecting Throttle should not be affected + 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 + evalMixes(1); + EXPECT_EQ(channelOutputs[2], -574); // THR output value is still reflecting 100 trim idle + + // 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->carryTrim = TRIM_ELE; + expo = expoAddress(ELE_STICK); + expo->carryTrim = TRIM_THR; + + anaInValues[THR_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 + 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 + + + // Trim idle only + // Cross trims + g_model.limitData[2].offset = 0; + g_model.limitData[1].offset = 0; + g_model.thrTrim = 1; + g_model.thrTrimSw = MIXSRC_TrimEle - MIXSRC_FIRST_TRIM; + expo = expoAddress(THR_STICK); + expo->carryTrim = TRIM_ELE; + expo = expoAddress(ELE_STICK); + expo->carryTrim = TRIM_THR; + + anaInValues[THR_STICK] = -1024; // Min stick + setTrimValue(0, MIXSRC_TrimEle - MIXSRC_FIRST_TRIM, 100); + setTrimValue(0, MIXSRC_TrimThr - MIXSRC_FIRST_TRIM, -100); + evalMixes(1); + EXPECT_EQ(channelOutputs[2], -574); // THR output value is reflecting 100 ele trim idle + 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(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 + evalMixes(1); + EXPECT_EQ(channelOutputs[2], -574); // THR output value is still reflecting 100 trim idle +} + TEST_F(TrimsTest, InstantTrim) { anaInValues[AIL_STICK] = 50; From d91b43b1a9da33c1698c8223c4b54efe4fa980d8 Mon Sep 17 00:00:00 2001 From: 3djc Date: Thu, 26 Nov 2020 18:10:21 +0100 Subject: [PATCH 3/8] patch throttle trim --- radio/src/mixer.cpp | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/radio/src/mixer.cpp b/radio/src/mixer.cpp index 56abde109..4f15ff68f 100644 --- a/radio/src/mixer.cpp +++ b/radio/src/mixer.cpp @@ -539,14 +539,25 @@ int getStickTrimValue(int stick, int stickValue) return trim; } -int getSourceTrimValue(int source, int stickValue=0) +int getSourceTrimOrigin(int source) { if (source >= MIXSRC_Rud && source <= MIXSRC_Ail) - return getStickTrimValue(source - MIXSRC_Rud, stickValue); + return source - MIXSRC_Rud; else if (source >= MIXSRC_FIRST_INPUT && source <= MIXSRC_LAST_INPUT) - return getStickTrimValue(virtualInputsTrims[source - MIXSRC_FIRST_INPUT], stickValue); + return virtualInputsTrims[source - MIXSRC_FIRST_INPUT]; else + return -1; +} + +int getSourceTrimValue(int source, int stickValue=0) +{ + auto origin = getSourceTrimOrigin(source); + if (origin >= 0) { + return getStickTrimValue(origin, stickValue); + } + else { return 0; + } } uint8_t mixerCurrentFlightMode; @@ -741,13 +752,17 @@ void evalFlightModeMixes(uint8_t mode, uint8_t tick10ms) } if (applyOffsetAndCurve) { - - //========== TRIMS ================ - if (!(mode & e_perout_mode_notrims)) { - if (md->carryTrim == 0) { - v += getSourceTrimValue(md->srcRaw, v); + bool applyTrims = !(mode & e_perout_mode_notrims); + if (!applyTrims && g_model.thrTrim) { + auto origin = getSourceTrimOrigin(md->srcRaw); + TRACE("thrTrim=%d srcRaw=%d origin=%d stick=%d", g_model.thrTrim, md->srcRaw, origin, g_model.getThrottleStickTrimSource() - MIXSRC_FIRST_TRIM); + if (origin == g_model.getThrottleStickTrimSource() - MIXSRC_FIRST_TRIM) { + applyTrims = true; } } + if (applyTrims && md->carryTrim == 0) { + v += getSourceTrimValue(md->srcRaw, v); + } } int32_t weight = GET_GVAR_PREC1(MD_WEIGHT(md), GV_RANGELARGE_NEG, GV_RANGELARGE, mixerCurrentFlightMode); From 59ff566ecbbd0dbed3022e45f41cb0f56b967529 Mon Sep 17 00:00:00 2001 From: 3djc Date: Thu, 26 Nov 2020 19:47:38 +0100 Subject: [PATCH 4/8] Fix trims2subtrims --- radio/src/tests/mixer.cpp | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/radio/src/tests/mixer.cpp b/radio/src/tests/mixer.cpp index 823b08a81..fa630a265 100644 --- a/radio/src/tests/mixer.cpp +++ b/radio/src/tests/mixer.cpp @@ -339,7 +339,7 @@ TEST_F(TrimsTest, CopySticksToOffset) EXPECT_EQ(g_model.limitData[1].offset, -97); } -TEST_F(TrimsTest, TrimsToSubtrims) +TEST_F(TrimsTest, MoveTrimsToOffsets) { // No trim idle only g_model.thrTrim = 0; @@ -355,7 +355,10 @@ TEST_F(TrimsTest, TrimsToSubtrims) EXPECT_EQ(g_model.limitData[1].offset, -195); // value transferred evalMixes(1); EXPECT_EQ(channelOutputs[2], 200); // THR output value is still reflecting 100 trim +} +TEST_F(TrimsTest, MoveTrimsToOffsetsWithTrimIdle) +{ // Trim idle only g_model.thrTrim = 1; anaInValues[THR_STICK] = -1024; // Min stick @@ -376,7 +379,10 @@ TEST_F(TrimsTest, TrimsToSubtrims) EXPECT_EQ(g_model.limitData[1].offset, -195); // value transferred evalMixes(1); EXPECT_EQ(channelOutputs[2], -574); // THR output value is still reflecting 100 trim idle +} +TEST_F(TrimsTest, MoveTrimsToOffsetsWithCrossTrims) +{ // No trim idle only // Cross trims g_model.thrTrim = 0; @@ -400,15 +406,17 @@ TEST_F(TrimsTest, TrimsToSubtrims) 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 +} - +TEST_F(TrimsTest, MoveTrimsToOffsetsWithCrosstrimsAndTrimIdle) +{ // Trim idle only // Cross trims g_model.limitData[2].offset = 0; g_model.limitData[1].offset = 0; g_model.thrTrim = 1; g_model.thrTrimSw = MIXSRC_TrimEle - MIXSRC_FIRST_TRIM; - expo = expoAddress(THR_STICK); + ExpoData *expo = expoAddress(THR_STICK); expo->carryTrim = TRIM_ELE; expo = expoAddress(ELE_STICK); expo->carryTrim = TRIM_THR; From c071566aacc56d179f4e61366846b35753e70f1a Mon Sep 17 00:00:00 2001 From: 3djc Date: Thu, 26 Nov 2020 20:20:45 +0100 Subject: [PATCH 5/8] fix crosstrims trim reset --- radio/src/mixer.cpp | 1 - radio/src/opentx.cpp | 14 ++++++++------ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/radio/src/mixer.cpp b/radio/src/mixer.cpp index 4f15ff68f..4992e608f 100644 --- a/radio/src/mixer.cpp +++ b/radio/src/mixer.cpp @@ -755,7 +755,6 @@ void evalFlightModeMixes(uint8_t mode, uint8_t tick10ms) bool applyTrims = !(mode & e_perout_mode_notrims); if (!applyTrims && g_model.thrTrim) { auto origin = getSourceTrimOrigin(md->srcRaw); - TRACE("thrTrim=%d srcRaw=%d origin=%d stick=%d", g_model.thrTrim, md->srcRaw, origin, g_model.getThrottleStickTrimSource() - MIXSRC_FIRST_TRIM); if (origin == g_model.getThrottleStickTrimSource() - MIXSRC_FIRST_TRIM) { applyTrims = true; } diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index f6b60cb7e..9b8713b51 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -1824,24 +1824,26 @@ void moveTrimsToOffsets() // copy state of 3 primary to subtrim pauseMixerCalculations(); evalFlightModeMixes(e_perout_mode_noinput, 0); // do output loop - zero input sticks and trims - for (uint8_t i=0; i Date: Fri, 27 Nov 2020 12:50:24 +0100 Subject: [PATCH 6/8] Trim center bips follows crosstrims --- radio/src/opentx.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index fa2f4fd2c..e34b011d6 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -1119,7 +1119,7 @@ void checkTrims() else { phase = getTrimFlightMode(mixerCurrentFlightMode, idx); before = getTrimValue(phase, idx); - thro = (idx==THR_STICK && g_model.thrTrim); + thro = (idx == (g_model.getThrottleStickTrimSource() - MIXSRC_FIRST_TRIM) && g_model.thrTrim); } #else phase = getTrimFlightMode(mixerCurrentFlightMode, idx); From 6d49f9158d516f8421b67aaa9033ab7654b92a15 Mon Sep 17 00:00:00 2001 From: 3djc Date: Fri, 4 Dec 2020 16:03:41 +0100 Subject: [PATCH 7/8] Fix --- radio/src/opentx.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index e34b011d6..e29df77cc 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -1831,14 +1831,14 @@ void moveTrimsToOffsets() // copy state of 3 primary to subtrim evalFlightModeMixes(e_perout_mode_noinput-e_perout_mode_notrims, 0); // do output loop - only trims - for (uint8_t i=0; i<4; i++) { + for (uint8_t i = 0; i < MAX_OUTPUT_CHANNELS; i++) { int16_t diff = applyLimits(i, chans[i]) - zeros[i]; int16_t v = g_model.limitData[i].offset; if (g_model.limitData[i].revert) diff = -diff; v += (diff * 125) / 128; - g_model.limitData[i].offset = limit((int16_t)-1000, (int16_t)v, (int16_t)1000); // make sure the offset doesn't go haywire + g_model.limitData[i].offset = limit((int16_t) -1000, (int16_t) v, (int16_t) 1000); // make sure the offset doesn't go haywire } // reset all trims, except throttle (if throttle trim) From 92a4733355766d7291e487d8b906ba3126c97f02 Mon Sep 17 00:00:00 2001 From: 3djc Date: Fri, 4 Dec 2020 16:04:44 +0100 Subject: [PATCH 8/8] Fix --- radio/src/opentx.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index e29df77cc..e127cf2e0 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -1825,7 +1825,7 @@ void moveTrimsToOffsets() // copy state of 3 primary to subtrim evalFlightModeMixes(e_perout_mode_noinput, 0); // do output loop - zero input sticks and trims - for (uint8_t i=0; i<4; i++) { + for (uint8_t i = 0; i < MAX_OUTPUT_CHANNELS; i++) { zeros[i] = applyLimits(i, chans[i]); }