From b4e816b7841df3fefa64a7dbe939daf3a99805ee Mon Sep 17 00:00:00 2001 From: Damjan Adamic Date: Mon, 7 Jul 2014 18:34:06 +0200 Subject: [PATCH] Re #1443 - Reverting back d675ab157893770116dc158efe58573f3dd04f4a with some improvements: * when telemetry is not streaming all logical switches that involve telemetry value evaluate to FALSE (same as before the change in above commit) * the duration and delay processing is now enabled for such logical switches (new functionality that was not present before above commit) --- radio/src/switches.cpp | 8 ++- radio/src/tests/gtests.cpp | 110 ++++++++++++++++++++++++++++++++----- 2 files changed, 101 insertions(+), 17 deletions(-) diff --git a/radio/src/switches.cpp b/radio/src/switches.cpp index ffc5e3cf9..4e4eacbb6 100644 --- a/radio/src/switches.cpp +++ b/radio/src/switches.cpp @@ -242,8 +242,8 @@ bool getLogicalSwitch(uint8_t idx) // Telemetry if (v1 >= MIXSRC_FIRST_TELEM) { if ((!TELEMETRY_STREAMING() && v1 >= MIXSRC_FIRST_TELEM+TELEM_FIRST_STREAMED_VALUE-1) || IS_FAI_FORBIDDEN(v1-1)) { - x = 0; //replace actual value with zero and continue processing (needed for duraton and delay) - //we could also return actual stored values (except when FAI FORBIDDEN, then we would return 0) + result = false; + goto DurationAndDelayProcessing; } y = convertLswTelemValue(ls); @@ -334,6 +334,10 @@ bool getLogicalSwitch(uint8_t idx) } } +#if defined(FRSKY) +DurationAndDelayProcessing: +#endif + #if defined(CPUARM) if (ls->delay || ls->duration) { LogicalSwitchContext &context = lswFm[mixerCurrentFlightMode].lsw[idx]; diff --git a/radio/src/tests/gtests.cpp b/radio/src/tests/gtests.cpp index 4e53d79c4..e7ccefa56 100644 --- a/radio/src/tests/gtests.cpp +++ b/radio/src/tests/gtests.cpp @@ -431,7 +431,7 @@ TEST(getSwitch, nullSW) #if defined(PCBTARANIS) && defined(FRSKY) -TEST(getSwitch, TelemetryValueWithDelay) +TEST(getSwitch, VfasWithDelay) { MODEL_RESET(); MIXER_RESET(); @@ -446,10 +446,10 @@ TEST(getSwitch, TelemetryValueWithDelay) 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); @@ -467,21 +467,25 @@ TEST(getSwitch, TelemetryValueWithDelay) EXPECT_EQ(getSwitch(SWSRC_SW1), false); //every logicalSwitchesTimerTick() represents 100ms - //so now after 5 ticks we should have a TRUE value + //so now after 5 ticks we should still have a FALSE value logicalSwitchesTimerTick(); evalLogicalSwitches(); - EXPECT_EQ(getSwitch(SWSRC_SW1), true); + 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 become FALSE + //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); @@ -509,26 +513,57 @@ TEST(getSwitch, TelemetryValueWithDelay) evalLogicalSwitches(); EXPECT_EQ(getSwitch(SWSRC_SW1), true); + logicalSwitchesTimerTick(); + logicalSwitchesTimerTick(); + logicalSwitchesTimerTick(); logicalSwitchesTimerTick(); evalLogicalSwitches(); EXPECT_EQ(getSwitch(SWSRC_SW1), true); - //increase vfas - frskyData.hub.vfas = 195; - evalLogicalSwitches(); - logicalSwitchesTimerTick(); - evalLogicalSwitches(); - EXPECT_EQ(getSwitch(SWSRC_SW1), false); - - //now stop telemetry, L1 should become 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); +} + +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(); @@ -538,14 +573,59 @@ TEST(getSwitch, TelemetryValueWithDelay) evalLogicalSwitches(); EXPECT_EQ(getSwitch(SWSRC_SW1), false); - logicalSwitchesTimerTick(); + //now set RSSI to 100, L1 should become TRUE for 0.5s + frskyData.rssi[0].value = 100; evalLogicalSwitches(); - EXPECT_EQ(getSwitch(SWSRC_SW1), false); + 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); } #endif // #if defined(PCBTARANIS) && defined(FRSKY)