TEST(Mixer, SlowUpOnSwitch) { MODEL_RESET(); MIXER_RESET(); g_model.mixData[0].destCh = 0; g_model.mixData[0].mltpx = MLTPX_ADD; g_model.mixData[0].srcRaw = MIXSRC_MAX; g_model.mixData[0].weight = 100; g_model.mixData[0].swtch = SWSRC_THR; g_model.mixData[0].speedUp = SLOW_STEP*5; g_model.mixData[0].speedDown = 0; simuSetSwitch(0, 0); evalFlightModeMixes(e_perout_mode_normal, 0); s_mixer_first_run_done = true; EXPECT_EQ(chans[0], 0); simuSetSwitch(0, 1); CHECK_SLOW_MOVEMENT(0, +1, 250); simuSetSwitch(0, 0); evalFlightModeMixes(e_perout_mode_normal, 1); EXPECT_EQ(chans[0], 0); lastAct = 0; simuSetSwitch(0, 1); CHECK_SLOW_MOVEMENT(0, +1, 100); }
TEST(getSwitch, OldTypeStickyCSW) { MODEL_RESET(); MIXER_RESET(); g_model.logicalSw[0] = { SWSRC_SA0, 0, 0, LS_FUNC_AND }; g_model.logicalSw[1] = { SWSRC_SW1, SWSRC_SW2, 0, LS_FUNC_OR }; evalLogicalSwitches(); EXPECT_EQ(getSwitch(SWSRC_SW1), false); EXPECT_EQ(getSwitch(SWSRC_SW2), false); // now trigger SA0, both switches should become true simuSetSwitch(0, -1); evalLogicalSwitches(); EXPECT_EQ(getSwitch(SWSRC_SW1), true); EXPECT_EQ(getSwitch(SWSRC_SW2), true); // now release SA0 and SW2 should stay true simuSetSwitch(0, 0); evalLogicalSwitches(); EXPECT_EQ(getSwitch(SWSRC_SW1), false); EXPECT_EQ(getSwitch(SWSRC_SW2), true); // now reset logical switches logicalSwitchesReset(); evalLogicalSwitches(); EXPECT_EQ(getSwitch(SWSRC_SW1), false); EXPECT_EQ(getSwitch(SWSRC_SW2), false); }
TEST(Mixer, DelayOnSwitch) { MODEL_RESET(); MIXER_RESET(); g_model.mixData[0].destCh = 0; g_model.mixData[0].mltpx = MLTPX_ADD; g_model.mixData[0].srcRaw = MIXSRC_MAX; g_model.mixData[0].weight = 100; g_model.mixData[0].swtch = TR(SWSRC_THR, SWSRC_SA2); g_model.mixData[0].delayUp = DELAY_STEP*5; g_model.mixData[0].delayDown = DELAY_STEP*5; evalFlightModeMixes(e_perout_mode_normal, 0); EXPECT_EQ(chans[0], 0); simuSetSwitch(0, 1); CHECK_DELAY(0, 500); evalFlightModeMixes(e_perout_mode_normal, 1); EXPECT_EQ(chans[0], CHANNEL_MAX); simuSetSwitch(0, 0); CHECK_DELAY(0, 500); evalFlightModeMixes(e_perout_mode_normal, 1); EXPECT_EQ(chans[0], 0); }
TEST(Mixer, SlowOnSwitchReplace) { MODEL_RESET(); MIXER_RESET(); g_model.mixData[0].destCh = 0; g_model.mixData[0].mltpx = MLTPX_ADD; g_model.mixData[0].srcRaw = MIXSRC_MAX; g_model.mixData[0].weight = 50; g_model.mixData[1].destCh = 0; g_model.mixData[1].mltpx = MLTPX_REP; g_model.mixData[1].srcRaw = MIXSRC_MAX; g_model.mixData[1].weight = 100; g_model.mixData[1].swtch = SWSRC_THR; g_model.mixData[1].speedDown = SLOW_STEP*5; simuSetSwitch(0, 0); evalFlightModeMixes(e_perout_mode_normal, 1); EXPECT_EQ(chans[0], CHANNEL_MAX/2); simuSetSwitch(0, 1); evalFlightModeMixes(e_perout_mode_normal, 1); // slow is not applied, but it's better than the first mix not applied at all! EXPECT_EQ(chans[0], CHANNEL_MAX); simuSetSwitch(0, 0); evalFlightModeMixes(e_perout_mode_normal, 1); // slow is not applied, but it's better than the first mix not applied at all! EXPECT_EQ(chans[0], CHANNEL_MAX/2); }
TEST(Mixer, RecursiveAddChannelAfterInactivePhase) { MODEL_RESET(); MIXER_RESET(); g_model.flightModeData[1].swtch = SWSRC_ID1; g_model.mixData[0].destCh = 0; g_model.mixData[0].mltpx = MLTPX_ADD; g_model.mixData[0].srcRaw = MIXSRC_CH2; g_model.mixData[0].flightModes = 0b11110; g_model.mixData[0].weight = 50; g_model.mixData[1].destCh = 0; g_model.mixData[1].mltpx = MLTPX_ADD; g_model.mixData[1].srcRaw = MIXSRC_MAX; g_model.mixData[1].flightModes = 0b11101; g_model.mixData[1].weight = 50; g_model.mixData[2].destCh = 1; g_model.mixData[2].srcRaw = MIXSRC_MAX; g_model.mixData[2].weight = 100; simuSetSwitch(3, -1); #if defined(CPUARM) doMixerCalculations(); #else perMain(); #endif EXPECT_EQ(chans[0], CHANNEL_MAX/2); EXPECT_EQ(chans[1], CHANNEL_MAX); simuSetSwitch(3, 0); #if defined(CPUARM) doMixerCalculations(); #else perMain(); #endif EXPECT_EQ(chans[0], CHANNEL_MAX/2); EXPECT_EQ(chans[1], CHANNEL_MAX); }
TEST(getSwitch, OldTypeStickyCSW) { RADIO_RESET(); MODEL_RESET(); MIXER_RESET(); SET_LOGICAL_SWITCH(0, LS_FUNC_AND, SWSRC_SA0, SWSRC_NONE); SET_LOGICAL_SWITCH(1, LS_FUNC_OR, SWSRC_SW1, SWSRC_SW2); evalLogicalSwitches(); EXPECT_EQ(getSwitch(SWSRC_SW1), false); EXPECT_EQ(getSwitch(SWSRC_SW2), false); // now trigger SA0, both switches should become true simuSetSwitch(0, -1); evalLogicalSwitches(); EXPECT_EQ(getSwitch(SWSRC_SW1), true); EXPECT_EQ(getSwitch(SWSRC_SW2), true); // now release SA0 and SW2 should stay true simuSetSwitch(0, 0); evalLogicalSwitches(); EXPECT_EQ(getSwitch(SWSRC_SW1), false); EXPECT_EQ(getSwitch(SWSRC_SW2), true); // now reset logical switches logicalSwitchesReset(); evalLogicalSwitches(); EXPECT_EQ(getSwitch(SWSRC_SW1), false); EXPECT_EQ(getSwitch(SWSRC_SW2), false); }
TEST(Mixer, R2029Comment) { MODEL_RESET(); MIXER_RESET(); g_model.mixData[0].destCh = 0; g_model.mixData[0].srcRaw = MIXSRC_CH2; g_model.mixData[0].swtch = -SWSRC_THR; g_model.mixData[0].weight = 100; g_model.mixData[1].destCh = 1; g_model.mixData[1].srcRaw = MIXSRC_Thr; g_model.mixData[1].swtch = SWSRC_THR; g_model.mixData[1].weight = 100; anaInValues[THR_STICK] = 1024; simuSetSwitch(0, 1); evalFlightModeMixes(e_perout_mode_normal, 0); EXPECT_EQ(chans[0], 0); EXPECT_EQ(chans[1], CHANNEL_MAX); simuSetSwitch(0, 0); evalFlightModeMixes(e_perout_mode_normal, 0); EXPECT_EQ(chans[0], 0); EXPECT_EQ(chans[1], 0); simuSetSwitch(0, 1); evalFlightModeMixes(e_perout_mode_normal, 0); EXPECT_EQ(chans[0], 0); EXPECT_EQ(chans[1], CHANNEL_MAX); }
TEST(Mixer, SlowOnMultiply) { MODEL_RESET(); MIXER_RESET(); g_model.mixData[0].destCh = 0; g_model.mixData[0].mltpx = MLTPX_ADD; g_model.mixData[0].srcRaw = MIXSRC_MAX; g_model.mixData[0].weight = 100; g_model.mixData[1].destCh = 0; g_model.mixData[1].mltpx = MLTPX_MUL; g_model.mixData[1].srcRaw = MIXSRC_MAX; g_model.mixData[1].weight = 100; g_model.mixData[1].swtch = TR(SWSRC_THR, SWSRC_SA0); g_model.mixData[1].speedUp = SLOW_STEP*5; g_model.mixData[1].speedDown = SLOW_STEP*5; s_mixer_first_run_done = true; simuSetSwitch(0, 1); CHECK_SLOW_MOVEMENT(0, 1, 250); simuSetSwitch(0, -1); CHECK_NO_MOVEMENT(0, CHANNEL_MAX, 250); simuSetSwitch(0, 1); CHECK_NO_MOVEMENT(0, CHANNEL_MAX, 250); }
TEST(getSwitch, recursiveSW) { MODEL_RESET(); MIXER_RESET(); g_model.logicalSw[0] = { SWSRC_RUD, -SWSRC_SW2, LS_FUNC_OR }; g_model.logicalSw[1] = { SWSRC_ELE, -SWSRC_SW1, LS_FUNC_OR }; evalLogicalSwitches(); EXPECT_EQ(getSwitch(SWSRC_SW1), false); EXPECT_EQ(getSwitch(SWSRC_SW2), true); LS_RECURSIVE_EVALUATION_RESET(); evalLogicalSwitches(); EXPECT_EQ(getSwitch(SWSRC_SW1), false); EXPECT_EQ(getSwitch(SWSRC_SW2), true); simuSetSwitch(1, 1); LS_RECURSIVE_EVALUATION_RESET(); evalLogicalSwitches(); EXPECT_EQ(getSwitch(SWSRC_SW1), true); EXPECT_EQ(getSwitch(SWSRC_SW2), true); LS_RECURSIVE_EVALUATION_RESET(); evalLogicalSwitches(); EXPECT_EQ(getSwitch(SWSRC_SW1), true); EXPECT_EQ(getSwitch(SWSRC_SW2), false); }
TEST(Mixer, SlowAndDelayOnReplace3POSSource) { MODEL_RESET(); MIXER_RESET(); g_model.mixData[0].destCh = 0; g_model.mixData[0].mltpx = MLTPX_REP; g_model.mixData[0].srcRaw = MIXSRC_3POS; g_model.mixData[0].weight = 100; g_model.mixData[0].delayUp = 10; g_model.mixData[0].speedUp = SLOW_STEP*5; g_model.mixData[0].speedDown = SLOW_STEP*5; s_mixer_first_run_done = true; simuSetSwitch(3, -1); CHECK_SLOW_MOVEMENT(0, -1, 250); EXPECT_EQ(chans[0], -CHANNEL_MAX); simuSetSwitch(3, 0); CHECK_DELAY(0, 500); CHECK_SLOW_MOVEMENT(0, +1, 250/*half course*/); EXPECT_EQ(chans[0], 0); simuSetSwitch(3, 1); CHECK_DELAY(0, 500); CHECK_SLOW_MOVEMENT(0, +1, 250); }
TEST(Mixer, SlowOnSwitchAndPhase) { MODEL_RESET(); MIXER_RESET(); g_model.flightModeData[1].swtch = TR(SWSRC_THR, SWSRC_SA0); g_model.mixData[0].destCh = 0; g_model.mixData[0].mltpx = MLTPX_ADD; g_model.mixData[0].srcRaw = MIXSRC_MAX; g_model.mixData[0].weight = 100; g_model.mixData[0].swtch = TR(SWSRC_THR, SWSRC_SA0); #if defined(CPUARM) g_model.mixData[0].flightModes = 0x2 + 0x4 + 0x8 + 0x10 + 0x20 + 0x40 + 0x80 + 0x100 /*only enabled in phase 0*/; #else g_model.mixData[0].flightModes = 0x2 + 0x4 + 0x8 + 0x10 /*only enabled in phase 0*/; #endif g_model.mixData[0].speedUp = SLOW_STEP*5; g_model.mixData[0].speedDown = SLOW_STEP*5; s_mixer_first_run_done = true; evalFlightModeMixes(e_perout_mode_normal, 0); EXPECT_EQ(chans[0], 0); simuSetSwitch(0, 1); mixerCurrentFlightMode = 0; CHECK_SLOW_MOVEMENT(0, +1, 250); simuSetSwitch(0, -1); mixerCurrentFlightMode = 1; CHECK_SLOW_MOVEMENT(0, -1, 250); }
TEST(Mixer, BlockingChannel) { MODEL_RESET(); MIXER_RESET(); g_model.mixData[0].destCh = 0; g_model.mixData[0].srcRaw = MIXSRC_CH1; g_model.mixData[0].weight = 100; evalFlightModeMixes(e_perout_mode_normal, 0); EXPECT_EQ(chans[0], 0); }
TEST(getSwitch, circularCSW) { MODEL_RESET(); MIXER_RESET(); g_model.logicalSw[0] = { SWSRC_SW1, SWSRC_SW1, LS_FUNC_OR }; g_model.logicalSw[1] = { SWSRC_SW1, SWSRC_SW1, LS_FUNC_AND }; evalLogicalSwitches(); EXPECT_EQ(getSwitch(SWSRC_SW1), false); EXPECT_EQ(getSwitch(-SWSRC_SW1), true); EXPECT_EQ(getSwitch(SWSRC_SW2), false); EXPECT_EQ(getSwitch(-SWSRC_SW2), true); }
TEST(Mixer, SlowDisabledOnStartup) { MODEL_RESET(); MIXER_RESET(); g_model.mixData[0].destCh = 0; g_model.mixData[0].mltpx = MLTPX_ADD; g_model.mixData[0].srcRaw = MIXSRC_MAX; g_model.mixData[0].weight = 100; g_model.mixData[0].speedUp = SLOW_STEP*5; g_model.mixData[0].speedDown = SLOW_STEP*5; evalFlightModeMixes(e_perout_mode_normal, 0); EXPECT_EQ(chans[0], CHANNEL_MAX); }
TEST(Trainer, UnpluggedTest) { MODEL_RESET(); MIXER_RESET(); g_model.mixData[0].destCh = 0; g_model.mixData[0].mltpx = MLTPX_ADD; g_model.mixData[0].srcRaw = MIXSRC_FIRST_TRAINER; g_model.mixData[0].weight = 100; g_model.mixData[0].delayUp = DELAY_STEP*5; g_model.mixData[0].delayDown = DELAY_STEP*5; ppmInputValidityTimer = 0; ppmInput[0] = 1024; CHECK_DELAY(0, 5000); }
TEST(Mixer, CascadedOrderedChannels) { MODEL_RESET(); MIXER_RESET(); g_model.mixData[0].destCh = 0; g_model.mixData[0].srcRaw = MIXSRC_THR; g_model.mixData[0].weight = 100; g_model.mixData[1].destCh = 1; g_model.mixData[1].srcRaw = MIXSRC_CH1; g_model.mixData[1].weight = 100; simuSetSwitch(0, 1); evalFlightModeMixes(e_perout_mode_normal, 0); EXPECT_EQ(chans[0], CHANNEL_MAX); EXPECT_EQ(chans[1], CHANNEL_MAX); }
TEST(getSwitch, inputWithTrim) { MODEL_RESET(); modelDefault(0); MIXER_RESET(); g_model.logicalSw[0] = { LS_FUNC_VPOS, MIXSRC_FIRST_INPUT, 0, 0 }; doMixerCalculations(); evalLogicalSwitches(); EXPECT_EQ(getSwitch(SWSRC_SW1), false); setTrimValue(0, 0, 32); doMixerCalculations(); evalLogicalSwitches(); EXPECT_EQ(getSwitch(SWSRC_SW1), true); }
TEST(Mixer, InfiniteRecursiveChannels) { MODEL_RESET(); MIXER_RESET(); g_model.mixData[0].destCh = 0; g_model.mixData[0].srcRaw = MIXSRC_CH2; g_model.mixData[0].weight = 100; g_model.mixData[1].destCh = 1; g_model.mixData[1].srcRaw = MIXSRC_CH3; g_model.mixData[1].weight = 100; g_model.mixData[2].destCh = 2; g_model.mixData[2].srcRaw = MIXSRC_CH1; g_model.mixData[2].weight = 100; evalFlightModeMixes(e_perout_mode_normal, 0); EXPECT_EQ(chans[2], 0); EXPECT_EQ(chans[1], 0); EXPECT_EQ(chans[0], 0); }
TEST(evalLogicalSwitches, playFile) { SYSTEM_RESET(); MODEL_RESET(); modelDefault(0); MIXER_RESET(); extern uint64_t sdAvailableLogicalSwitchAudioFiles; sdAvailableLogicalSwitchAudioFiles = 0xffffffffffffffff; char filename[AUDIO_FILENAME_MAXLEN+1]; isAudioFileReferenced((LOGICAL_SWITCH_AUDIO_CATEGORY << 24) + (0 << 16) + AUDIO_EVENT_OFF, filename); EXPECT_EQ(strcmp(filename, "/SOUNDS/en/MODEL01/L1-off.wav"), 0); isAudioFileReferenced((LOGICAL_SWITCH_AUDIO_CATEGORY << 24) + (0 << 16) + AUDIO_EVENT_ON, filename); EXPECT_EQ(strcmp(filename, "/SOUNDS/en/MODEL01/L1-on.wav"), 0); isAudioFileReferenced((LOGICAL_SWITCH_AUDIO_CATEGORY << 24) + (31 << 16) + AUDIO_EVENT_OFF, filename); EXPECT_EQ(strcmp(filename, "/SOUNDS/en/MODEL01/L32-off.wav"), 0); isAudioFileReferenced((LOGICAL_SWITCH_AUDIO_CATEGORY << 24) + (31 << 16) + AUDIO_EVENT_ON, filename); EXPECT_EQ(strcmp(filename, "/SOUNDS/en/MODEL01/L32-on.wav"), 0); }
TEST(Mixer, RecursiveAddChannel) { MODEL_RESET(); MIXER_RESET(); g_model.mixData[0].destCh = 0; g_model.mixData[0].mltpx = MLTPX_ADD; g_model.mixData[0].srcRaw = MIXSRC_MAX; g_model.mixData[0].weight = 50; g_model.mixData[1].destCh = 0; g_model.mixData[1].mltpx = MLTPX_ADD; g_model.mixData[1].srcRaw = MIXSRC_CH2; g_model.mixData[1].weight = 100; g_model.mixData[2].destCh = 1; g_model.mixData[2].srcRaw = MIXSRC_Rud; g_model.mixData[2].weight = 100; evalFlightModeMixes(e_perout_mode_normal, 0); EXPECT_EQ(chans[0], CHANNEL_MAX/2); EXPECT_EQ(chans[1], 0); }
TEST(Mixer, SlowOnSwitchSource) { MODEL_RESET(); MIXER_RESET(); g_model.mixData[0].destCh = 0; g_model.mixData[0].mltpx = MLTPX_ADD; g_model.mixData[0].srcRaw = TR(MIXSRC_THR, MIXSRC_SA); g_model.mixData[0].weight = 100; g_model.mixData[0].speedUp = SLOW_STEP*5; g_model.mixData[0].speedDown = SLOW_STEP*5; s_mixer_first_run_done = true; simuSetSwitch(0, -1); CHECK_SLOW_MOVEMENT(0, -1, 250); EXPECT_EQ(chans[0], -CHANNEL_MAX); simuSetSwitch(0, 1); CHECK_SLOW_MOVEMENT(0, +1, 500); }
TEST(Mixer, NoTrimOnInactiveMix) { MODEL_RESET(); MIXER_RESET(); g_model.mixData[0].destCh = 0; g_model.mixData[0].mltpx = MLTPX_ADD; g_model.mixData[0].srcRaw = MIXSRC_Thr; g_model.mixData[0].weight = 100; g_model.mixData[0].swtch = SWSRC_THR; g_model.mixData[0].speedUp = SLOW_STEP*5; g_model.mixData[0].speedDown = SLOW_STEP*5; setTrimValue(0, 2, 256); s_mixer_first_run_done = true; simuSetSwitch(0, 1); CHECK_SLOW_MOVEMENT(0, 1, 100); simuSetSwitch(0, -1); CHECK_SLOW_MOVEMENT(0, -1, 100); }
TEST(Mixer, Cascaded5Channels) { MODEL_RESET(); MIXER_RESET(); g_model.mixData[0].destCh = 0; g_model.mixData[0].srcRaw = MIXSRC_CH2; g_model.mixData[0].weight = 100; g_model.mixData[1].destCh = 1; g_model.mixData[1].srcRaw = MIXSRC_CH3; g_model.mixData[1].weight = 100; g_model.mixData[2].destCh = 2; g_model.mixData[2].srcRaw = MIXSRC_CH4; g_model.mixData[2].weight = 100; g_model.mixData[3].destCh = 3; g_model.mixData[3].srcRaw = MIXSRC_CH5; g_model.mixData[3].weight = 100; g_model.mixData[4].destCh = 4; g_model.mixData[4].srcRaw = MIXSRC_THR; g_model.mixData[4].weight = 100; for (uint8_t i=0; i<10; i++) { simuSetSwitch(0, 1); doMixerCalculations(); EXPECT_EQ(chans[0], CHANNEL_MAX); EXPECT_EQ(chans[1], CHANNEL_MAX); EXPECT_EQ(chans[2], CHANNEL_MAX); EXPECT_EQ(chans[3], CHANNEL_MAX); EXPECT_EQ(chans[4], CHANNEL_MAX); simuSetSwitch(0, 0); doMixerCalculations(); EXPECT_EQ(chans[0], -CHANNEL_MAX); EXPECT_EQ(chans[1], -CHANNEL_MAX); EXPECT_EQ(chans[2], -CHANNEL_MAX); EXPECT_EQ(chans[3], -CHANNEL_MAX); EXPECT_EQ(chans[4], -CHANNEL_MAX); } }
TEST(getSwitch, RssiWithDuration) { MODEL_RESET(); MIXER_RESET(); memclear(&frskyData, sizeof(frskyData)); /* Test for logical switch: L1 RSSI > 10 Duration (0.5s) (gdb) print Open9xX9D::g_model.logicalSw[0] $1 = {v1 = -56 '\310', v2 = 10, v3 = 0, func = 3 '\003', delay = 0 '\000', duration = 5 '\005', andsw = 0 '\000'} */ g_model.logicalSw[0] = {-56, 10, 0, 3, 0, 5, 0}; EXPECT_EQ(TELEMETRY_STREAMING(), false); evalLogicalSwitches(); logicalSwitchesTimerTick(); evalLogicalSwitches(); EXPECT_EQ(getSwitch(SWSRC_SW1), false); logicalSwitchesTimerTick(); evalLogicalSwitches(); EXPECT_EQ(getSwitch(SWSRC_SW1), false); //now set RSSI to 5, L1 should still be FALSE frskyData.rssi[0].value = 5; evalLogicalSwitches(); EXPECT_EQ(TELEMETRY_STREAMING(), true); logicalSwitchesTimerTick(); evalLogicalSwitches(); EXPECT_EQ(getSwitch(SWSRC_SW1), false); logicalSwitchesTimerTick(); evalLogicalSwitches(); EXPECT_EQ(getSwitch(SWSRC_SW1), false); //now set RSSI to 100, L1 should become TRUE for 0.5s frskyData.rssi[0].value = 100; evalLogicalSwitches(); EXPECT_EQ(TELEMETRY_STREAMING(), true); logicalSwitchesTimerTick(); evalLogicalSwitches(); EXPECT_EQ(getSwitch(SWSRC_SW1), true); logicalSwitchesTimerTick(); evalLogicalSwitches(); EXPECT_EQ(getSwitch(SWSRC_SW1), true); logicalSwitchesTimerTick(); evalLogicalSwitches(); EXPECT_EQ(getSwitch(SWSRC_SW1), true); logicalSwitchesTimerTick(); evalLogicalSwitches(); EXPECT_EQ(getSwitch(SWSRC_SW1), true); logicalSwitchesTimerTick(); evalLogicalSwitches(); EXPECT_EQ(getSwitch(SWSRC_SW1), false); logicalSwitchesTimerTick(); evalLogicalSwitches(); EXPECT_EQ(getSwitch(SWSRC_SW1), false); //repeat telemetry streaming OFF and ON to test for duration processing frskyData.rssi[0].value = 0; evalLogicalSwitches(); EXPECT_EQ(TELEMETRY_STREAMING(), false); logicalSwitchesTimerTick(); evalLogicalSwitches(); EXPECT_EQ(getSwitch(SWSRC_SW1), false); //now set RSSI to 100, L1 should become TRUE for 0.5s frskyData.rssi[0].value = 100; evalLogicalSwitches(); EXPECT_EQ(TELEMETRY_STREAMING(), true); logicalSwitchesTimerTick(); evalLogicalSwitches(); EXPECT_EQ(getSwitch(SWSRC_SW1), true); logicalSwitchesTimerTick(); logicalSwitchesTimerTick(); logicalSwitchesTimerTick(); logicalSwitchesTimerTick(); evalLogicalSwitches(); EXPECT_EQ(getSwitch(SWSRC_SW1), false); }
TEST(getSwitch, VfasWithDelay) { MODEL_RESET(); MIXER_RESET(); memclear(&frskyData, sizeof(frskyData)); /* Test for logical switch: L1 Vfas < 9.6 Delay (0.5s) (gdb) print Open9xX9D::g_model.logicalSw[0] $3 = {v1 = -40 '\330', v2 = 96, v3 = 0, func = 4 '\004', delay = 5 '\005', duration = 0 '\000', andsw = 0 '\000'} */ g_model.logicalSw[0] = {-40, 96, 0, 4, 5, 0, 0}; frskyData.hub.vfas = 150; //unit is 100mV //telemetry streaming is FALSE, so L1 should be FALSE no matter what value Vfas has evalLogicalSwitches(); EXPECT_EQ(getSwitch(SWSRC_SW1), false); logicalSwitchesTimerTick(); evalLogicalSwitches(); EXPECT_EQ(getSwitch(SWSRC_SW1), false); logicalSwitchesTimerTick(); evalLogicalSwitches(); EXPECT_EQ(getSwitch(SWSRC_SW1), false); logicalSwitchesTimerTick(); evalLogicalSwitches(); EXPECT_EQ(getSwitch(SWSRC_SW1), false); logicalSwitchesTimerTick(); evalLogicalSwitches(); EXPECT_EQ(getSwitch(SWSRC_SW1), false); //every logicalSwitchesTimerTick() represents 100ms //so now after 5 ticks we should still have a FALSE value logicalSwitchesTimerTick(); evalLogicalSwitches(); EXPECT_EQ(getSwitch(SWSRC_SW1), false); //now turn on telemetry EXPECT_EQ(TELEMETRY_STREAMING(), false); frskyData.rssi[0].value = 50; EXPECT_EQ(TELEMETRY_STREAMING(), true); //vfas is 15.0V so L1 should still be FALSE logicalSwitchesTimerTick(); evalLogicalSwitches(); EXPECT_EQ(getSwitch(SWSRC_SW1), false); logicalSwitchesTimerTick(); logicalSwitchesTimerTick(); logicalSwitchesTimerTick(); logicalSwitchesTimerTick(); logicalSwitchesTimerTick(); evalLogicalSwitches(); EXPECT_EQ(getSwitch(SWSRC_SW1), false); //now reduce vfas to 9.5V and L1 should become TRUE after 0.5s frskyData.hub.vfas = 95; evalLogicalSwitches(); logicalSwitchesTimerTick(); evalLogicalSwitches(); EXPECT_EQ(getSwitch(SWSRC_SW1), false); logicalSwitchesTimerTick(); evalLogicalSwitches(); EXPECT_EQ(getSwitch(SWSRC_SW1), false); logicalSwitchesTimerTick(); evalLogicalSwitches(); EXPECT_EQ(getSwitch(SWSRC_SW1), false); logicalSwitchesTimerTick(); evalLogicalSwitches(); EXPECT_EQ(getSwitch(SWSRC_SW1), false); logicalSwitchesTimerTick(); evalLogicalSwitches(); EXPECT_EQ(getSwitch(SWSRC_SW1), true); logicalSwitchesTimerTick(); logicalSwitchesTimerTick(); logicalSwitchesTimerTick(); logicalSwitchesTimerTick(); evalLogicalSwitches(); EXPECT_EQ(getSwitch(SWSRC_SW1), true); //now stop telemetry, L1 should become FALSE immediatelly frskyData.rssi[0].value = 0; EXPECT_EQ(TELEMETRY_STREAMING(), false); evalLogicalSwitches(); logicalSwitchesTimerTick(); logicalSwitchesTimerTick(); logicalSwitchesTimerTick(); logicalSwitchesTimerTick(); logicalSwitchesTimerTick(); evalLogicalSwitches(); EXPECT_EQ(getSwitch(SWSRC_SW1), false); }