This commit is contained in:
Bertrand Songis
2015-08-13 18:14:54 +02:00
parent 82c8246c25
commit 9303361d6b
3 changed files with 55 additions and 38 deletions
+16 -9
View File
@@ -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);
+26 -25
View File
@@ -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; i<TIMERS; i++) {
int8_t tm = g_model.timers[i].mode;
uint16_t tv = g_model.timers[i].start;
int8_t timerMode = g_model.timers[i].mode;
tmrstart_t timerStart = g_model.timers[i].start;
TimerState * timerState = &timersStates[i];
if (tm) {
if ((timerState->state == 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);
}
}
}
+13 -4
View File
@@ -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)