diff --git a/radio/src/mixer.cpp b/radio/src/mixer.cpp index 3f373ae6e..0e75f94d7 100644 --- a/radio/src/mixer.cpp +++ b/radio/src/mixer.cpp @@ -947,7 +947,7 @@ void evalMixes(uint8_t tick10ms) mixerCurrentFlightMode = p; evalFlightModeMixes(p==fm ? e_perout_mode_normal : e_perout_mode_inactive_flight_mode, p==fm ? tick10ms : 0); for (uint8_t i=0; i> 4) * fp_act[p]; + sum_chans512[i] += limit(-0x6fff, chans[i] >> 4, 0x6fff) * fp_act[p]; weight += fp_act[p]; } } diff --git a/radio/src/tests/gtests.h b/radio/src/tests/gtests.h index ab5c35abd..a1f6f5d24 100644 --- a/radio/src/tests/gtests.h +++ b/radio/src/tests/gtests.h @@ -65,6 +65,7 @@ inline void MODEL_RESET() memset(&anaInValues, 0, sizeof(anaInValues)); extern uint8_t s_mixer_first_run_done; s_mixer_first_run_done = false; + evalMixes(1); // this is needed to reset fp_act lastFlightMode = 255; } diff --git a/radio/src/tests/mixer.cpp b/radio/src/tests/mixer.cpp index 8d8058d31..074f7f6ca 100644 --- a/radio/src/tests/mixer.cpp +++ b/radio/src/tests/mixer.cpp @@ -47,6 +47,22 @@ class MixerTest : public OpenTxTest {}; } \ } while (0) +#define CHECK_FLIGHT_MODE_TRANSITION(channel, duration, initValue, endValue) \ + do { \ + uint32_t delta = 0xffff / duration; \ + int32_t weightInit = 0xffff; \ + int32_t weightEnd = 0; \ + for (int i = 0; i <= (duration); i++) { \ + evalMixes(1); \ + GTEST_ASSERT_LE( abs(((initValue) * weightInit + (endValue) * weightEnd) / 0xffff - channelOutputs[(channel)]), 1); \ + weightInit = weightInit - delta; \ + weightEnd = weightEnd + delta; \ + } \ + for (int i = 0; i < 100; i++) { /* be sure the transition is finished*/ \ + evalMixes(1); \ + } \ + } while (0) + TEST_F(TrimsTest, throttleTrim) { g_model.thrTrim = 1; @@ -659,3 +675,48 @@ TEST(Trainer, UnpluggedTest) ppmInput[0] = 1024; CHECK_DELAY(0, 5000); } + +TEST_F(MixerTest, flightModeTransition) +{ + SYSTEM_RESET(); + MODEL_RESET(); + MIXER_RESET(); + modelDefault(0); + g_model.flightModeData[1].swtch = TR(SWSRC_ID2, SWSRC_SA2); + g_model.flightModeData[0].fadeIn = 100; + g_model.flightModeData[0].fadeOut = 100; + g_model.flightModeData[1].fadeIn = 100; + g_model.flightModeData[1].fadeOut = 100; + g_model.mixData[0].destCh = 0; + g_model.mixData[0].mltpx = MLTPX_REP; + g_model.mixData[0].srcRaw = MIXSRC_MAX; + g_model.mixData[0].flightModes = 0b11110; + g_model.mixData[0].weight = 100; + g_model.mixData[1].destCh = 0; + g_model.mixData[1].mltpx = MLTPX_REP; + g_model.mixData[1].srcRaw = MIXSRC_MAX; + g_model.mixData[1].flightModes = 0b11101; + g_model.mixData[1].weight = -10; + evalMixes(1); + simuSetSwitch(0, 1); + CHECK_FLIGHT_MODE_TRANSITION(0, 1000, 1024, -102); +} + +TEST_F(MixerTest, flightModeOverflow) +{ + SYSTEM_RESET(); + MODEL_RESET(); + MIXER_RESET(); + modelDefault(0); + g_model.flightModeData[1].swtch = TR(SWSRC_ID2, SWSRC_SA2); + g_model.flightModeData[0].fadeIn = 100; + g_model.flightModeData[0].fadeOut = 100; + g_model.mixData[0].destCh = 0; + g_model.mixData[0].mltpx = MLTPX_REP; + g_model.mixData[0].srcRaw = MIXSRC_MAX; + g_model.mixData[0].flightModes = 0; + g_model.mixData[0].weight = 250; + evalMixes(1); + simuSetSwitch(0, 1); + CHECK_FLIGHT_MODE_TRANSITION(0, 1000, 1024, 1024); +}