From 9303361d6b1f16250dc4b7c7df1f309eb4d1450f Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 13 Aug 2015 18:12:17 +0200 Subject: [PATCH] Fixes #2702 --- radio/src/tests/timers.cpp | 25 ++++++++++++------- radio/src/timers.cpp | 51 +++++++++++++++++++------------------- radio/src/timers.h | 17 ++++++++++--- 3 files changed, 55 insertions(+), 38 deletions(-) diff --git a/radio/src/tests/timers.cpp b/radio/src/tests/timers.cpp index ae1987409..4eff9c825 100644 --- a/radio/src/tests/timers.cpp +++ b/radio/src/tests/timers.cpp @@ -115,11 +115,10 @@ void initModelTimer(uint32_t idx, uint8_t mode, int16_t start = 0) /* Run timers for n seconds and test the end state */ -::testing::AssertionResult evalTimersForNSecondsAndTest(unsigned int n, uint8_t throttle, uint32_t idx, uint8_t state, int16_t value) +::testing::AssertionResult evalTimersForNSecondsAndTest(unsigned int n, uint8_t throttle, uint32_t idx, uint8_t state, int value) { unsigned int noLoops = n * 100; - while(noLoops--) - { + while (noLoops--) { evalTimers(throttle, 1); } TEST_AB_EQUAL(timersStates[idx].state, state); @@ -131,21 +130,29 @@ TEST(Timers, timerReset) { initModelTimer(0, TMRMODE_THR_REL, 200); timerReset(0); - EXPECT_TRUE(evalTimersForNSecondsAndTest(0, THR_100, 0, TMR_OFF, 200)); + EXPECT_TRUE(evalTimersForNSecondsAndTest(0, THR_100, 0, TMR_OFF, 200)); initModelTimer(1, TMRMODE_THR_REL, 0); timerReset(1); - EXPECT_TRUE(evalTimersForNSecondsAndTest(0, THR_100, 1, TMR_OFF, 0)); + EXPECT_TRUE(evalTimersForNSecondsAndTest(0, THR_100, 1, TMR_OFF, 0)); } #if defined(CPUARM) TEST(Timers, timerSet) { timerSet(0, 500); - EXPECT_TRUE(evalTimersForNSecondsAndTest(0, THR_100, 0, TMR_OFF, 500)); + EXPECT_TRUE(evalTimersForNSecondsAndTest(0, THR_100, 0, TMR_OFF, 500)); timerSet(1, 300); - EXPECT_TRUE(evalTimersForNSecondsAndTest(0, THR_100, 1, TMR_OFF, 300)); + EXPECT_TRUE(evalTimersForNSecondsAndTest(0, THR_100, 1, TMR_OFF, 300)); +} + +TEST(Timers, timerGreaterThan9hours) +{ + initModelTimer(0, TMRMODE_ABS, 0); + timerSet(0, 0); + // test with 24 hours + EXPECT_TRUE(evalTimersForNSecondsAndTest(24*3600, THR_100, 0, TMR_RUNNING, 24*3600)); } #endif // #if defined(CPUARM) @@ -201,10 +208,12 @@ TEST(Timers, timerAbsolute) EXPECT_TRUE(evalTimersForNSecondsAndTest(100, THR_100, 0, TMR_NEGATIVE, -1)); EXPECT_TRUE(evalTimersForNSecondsAndTest(100, THR_100, 0, TMR_STOPPED, -101)); +#if !defined(CPUARM) // min timer value test timerSet(0, TIMER_MIN+10); EXPECT_TRUE(evalTimersForNSecondsAndTest(1, THR_100, 0, TMR_RUNNING, TIMER_MIN+9)); EXPECT_TRUE(evalTimersForNSecondsAndTest(100, THR_100, 0, TMR_RUNNING, TIMER_MIN)); +#endif } TEST(Timers, timerThrottle) @@ -227,8 +236,6 @@ TEST(Timers, timerThrottle) EXPECT_TRUE(evalTimersForNSecondsAndTest(100, THR_100, 0, TMR_STOPPED,-101)); } - - TEST(Timers, timerThrottleRelative) { initModelTimer(0, TMRMODE_THR_REL, 0); diff --git a/radio/src/timers.cpp b/radio/src/timers.cpp index 5ca45be47..bc591c0f9 100644 --- a/radio/src/timers.cpp +++ b/radio/src/timers.cpp @@ -52,7 +52,7 @@ void timerReset(uint8_t idx) } #if defined(CPUARM) -void timerSet(int idx, int16_t val) +void timerSet(int idx, int val) { TimerState & timerState = timersStates[idx]; timerState.state = TMR_OFF; // is changed to RUNNING dep from mode @@ -102,18 +102,18 @@ void saveTimers() void evalTimers(int16_t throttle, uint8_t tick10ms) { for (uint8_t i=0; istate == TMR_OFF) && (tm != TMRMODE_THR_TRG)) { + if (timerMode) { + if ((timerState->state == TMR_OFF) && (timerMode != TMRMODE_THR_TRG)) { timerState->state = TMR_RUNNING; timerState->cnt = 0; timerState->sum = 0; } - if (tm == TMRMODE_THR_REL) { + if (timerMode == TMRMODE_THR_REL) { timerState->cnt++; timerState->sum += throttle; } @@ -123,16 +123,16 @@ void evalTimers(int16_t throttle, uint8_t tick10ms) if (timerState->val == TIMER_MIN) break; timerState->val_10ms -= 100 ; - int16_t newTimerVal = timerState->val; - if (tv) newTimerVal = tv - newTimerVal; + tmrval_t newTimerVal = timerState->val; + if (timerStart) newTimerVal = timerStart - newTimerVal; - if (tm == TMRMODE_ABS) { + if (timerMode == TMRMODE_ABS) { newTimerVal++; } - else if (tm == TMRMODE_THR) { + else if (timerMode == TMRMODE_THR) { if (throttle) newTimerVal++; } - else if (tm == TMRMODE_THR_REL) { + else if (timerMode == TMRMODE_THR_REL) { // @@@ open.20.fsguruh: why so complicated? we have already a s_sum field; use it for the half seconds (not showable) as well // check for s_cnt[i]==0 is not needed because we are shure it is at least 1 #if defined(ACCURAT_THROTTLE_TIMER) @@ -146,42 +146,43 @@ void evalTimers(int16_t throttle, uint8_t tick10ms) timerState->sum -= 32*timerState->cnt; } #endif - timerState->cnt=0; + timerState->cnt = 0; } - else if (tm == TMRMODE_THR_TRG) { + else if (timerMode == TMRMODE_THR_TRG) { // we can't rely on (throttle || newTimerVal > 0) as a detection if timer should be running // because having persistent timer brakes this rule if ((throttle > THR_TRG_TRESHOLD) && timerState->state == TMR_OFF) { timerState->state = TMR_RUNNING; // start timer running timerState->cnt = 0; timerState->sum = 0; - TRACE("Timer[%d] THr triggered", i); + // TRACE("Timer[%d] THr triggered", i); } if (timerState->state != TMR_OFF) newTimerVal++; } else { - if (tm > 0) tm -= (TMRMODE_COUNT-1); - if (getSwitch(tm)) + if (timerMode > 0) timerMode -= (TMRMODE_COUNT-1); + if (getSwitch(timerMode)) { newTimerVal++; + } } switch (timerState->state) { case TMR_RUNNING: - if (tv && newTimerVal>=(int16_t)tv) { + if (timerStart && newTimerVal>=(tmrval_t)timerStart) { AUDIO_TIMER_00(g_model.timers[i].countdownBeep); timerState->state = TMR_NEGATIVE; - TRACE("Timer[%d] negative", i); + // TRACE("Timer[%d] negative", i); } break; case TMR_NEGATIVE: - if (newTimerVal >= (int16_t)tv + MAX_ALERT_TIME) { + if (newTimerVal >= (tmrval_t)timerStart + MAX_ALERT_TIME) { timerState->state = TMR_STOPPED; - TRACE("Timer[%d] stopped state at %d", i, newTimerVal); + // TRACE("Timer[%d] stopped state at %d", i, newTimerVal); } break; } - if (tv) newTimerVal = tv - newTimerVal; // if counting backwards - display backwards + if (timerStart) newTimerVal = timerStart - newTimerVal; // if counting backwards - display backwards if (newTimerVal != timerState->val) { timerState->val = newTimerVal; @@ -189,20 +190,20 @@ void evalTimers(int16_t throttle, uint8_t tick10ms) if (g_model.timers[i].countdownBeep && g_model.timers[i].start) { if (newTimerVal==30) { AUDIO_TIMER_30(); - TRACE("Timer[%d] 30s announcement", i); + // TRACE("Timer[%d] 30s announcement", i); } if (newTimerVal==20) { AUDIO_TIMER_20(); - TRACE("Timer[%d] 20s announcement", i); + // TRACE("Timer[%d] 20s announcement", i); } if (newTimerVal<=10) { AUDIO_TIMER_LT10(g_model.timers[i].countdownBeep, newTimerVal); - TRACE("Timer[%d] %ds announcement", i, newTimerVal); + // TRACE("Timer[%d] %ds announcement", i, newTimerVal); } } if (g_model.timers[i].minuteBeep && (newTimerVal % 60)==0) { AUDIO_TIMER_MINUTE(newTimerVal); - TRACE("Timer[%d] %d minute announcement", i, newTimerVal/60); + // TRACE("Timer[%d] %d minute announcement", i, newTimerVal/60); } } } diff --git a/radio/src/timers.h b/radio/src/timers.h index 363a0bbd4..98f34d637 100644 --- a/radio/src/timers.h +++ b/radio/src/timers.h @@ -42,14 +42,23 @@ #define TMR_NEGATIVE 2 #define TMR_STOPPED 3 -#define TIMER_MAX (32767) -#define TIMER_MIN (-32767-1) +#if defined(CPUARM) +typedef int32_t tmrval_t; +typedef uint32_t tmrstart_t; +#define TIMER_MIN (-0xffffff/2) +#else +typedef int16_t tmrval_t; +typedef uint16_t tmrstart_t; +#define TIMER_MIN (-0xffff/2) +#endif + +#define TIMER_MAX (-TIMER_MIN-1) struct TimerState { uint16_t cnt; uint16_t sum; uint8_t state; - int16_t val; + tmrval_t val; uint8_t val_10ms; }; @@ -58,7 +67,7 @@ extern TimerState timersStates[TIMERS]; void timerReset(uint8_t idx); #if defined(CPUARM) -void timerSet(int idx, int16_t val); +void timerSet(int idx, int val); #endif // #if defined(CPUARM) #if defined(CPUARM) || defined(CPUM2560)