Cosmetics
[opentx.git] / radio / src / tests / timers.cpp
blob7e04e82cc461b62549a3e2158bb2d72e08a90c61
1 /*
2 * Copyright (C) OpenTX
4 * Based on code named
5 * th9x - http://code.google.com/p/th9x
6 * er9x - http://code.google.com/p/er9x
7 * gruvin9x - http://code.google.com/p/gruvin9x
9 * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License version 2 as
13 * published by the Free Software Foundation.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
21 #include "gtests.h"
23 #define THR_100 128 // approximately 10% full throttle
24 #define THR_50 64 // approximately 10% full throttle
25 #define THR_10 13 // approximately 10% full throttle
27 #define TEST_AB_EQUAL(a, b) if (a != b) { return ::testing::AssertionFailure() << \
28 #a "= " << (uint32_t)a << ", " << #b "= " << (uint32_t)b; };
30 void initModelTimer(uint32_t idx, uint8_t mode, int16_t start = 0)
32 memset(&g_model.timers[idx], 0, sizeof(TimerData));
33 g_model.timers[idx].mode = mode;
34 g_model.timers[idx].start = start;
35 g_model.timers[idx].countdownBeep = COUNTDOWN_SILENT;
39 Run timers for n seconds and test the end state
41 ::testing::AssertionResult evalTimersForNSecondsAndTest(unsigned int n, uint8_t throttle, uint32_t idx, uint8_t state, int value)
43 unsigned int noLoops = n * 100;
44 while (noLoops--) {
45 evalTimers(throttle, 1);
47 TEST_AB_EQUAL(timersStates[idx].state, state);
48 TEST_AB_EQUAL(timersStates[idx].val, value);
49 return ::testing::AssertionSuccess();
52 TEST(Timers, timerReset)
54 initModelTimer(0, TMRMODE_THR_REL, 200);
55 timerReset(0);
56 EXPECT_TRUE(evalTimersForNSecondsAndTest(0, THR_100, 0, TMR_OFF, 200));
58 initModelTimer(1, TMRMODE_THR_REL, 0);
59 timerReset(1);
60 EXPECT_TRUE(evalTimersForNSecondsAndTest(0, THR_100, 1, TMR_OFF, 0));
63 TEST(Timers, timerSet)
65 timerSet(0, 500);
66 EXPECT_TRUE(evalTimersForNSecondsAndTest(0, THR_100, 0, TMR_OFF, 500));
68 timerSet(1, 300);
69 EXPECT_TRUE(evalTimersForNSecondsAndTest(0, THR_100, 1, TMR_OFF, 300));
72 TEST(Timers, timerGreaterThan9hours)
74 initModelTimer(0, TMRMODE_ABS, 0);
75 timerSet(0, 0);
76 // test with 24 hours
77 EXPECT_TRUE(evalTimersForNSecondsAndTest(24*3600, THR_100, 0, TMR_RUNNING, 24*3600));
80 TEST(Timers, saveRestoreTimers)
82 g_model.timers[0].persistent = 1;
83 g_model.timers[1].persistent = 1;
84 timerSet(0, 500);
85 timerSet(1, 1500);
86 saveTimers();
87 EXPECT_EQ(g_model.timers[0].value, 500);
88 EXPECT_EQ(g_model.timers[1].value, 1500);
89 EXPECT_TRUE(evalTimersForNSecondsAndTest(0, THR_100, 0, TMR_OFF, 500));
90 EXPECT_TRUE(evalTimersForNSecondsAndTest(0, THR_100, 1, TMR_OFF, 1500));
92 timerReset(0);
93 timerReset(1);
94 restoreTimers();
95 EXPECT_TRUE(evalTimersForNSecondsAndTest(0, THR_100, 0, TMR_OFF, 500));
96 EXPECT_TRUE(evalTimersForNSecondsAndTest(0, THR_100, 1, TMR_OFF, 1500));
99 TEST(Timers, timerOff)
101 initModelTimer(0, TMRMODE_NONE, 0);
102 timerReset(0);
104 EXPECT_TRUE(evalTimersForNSecondsAndTest(0, THR_100, 0, TMR_OFF, 0));
105 EXPECT_TRUE(evalTimersForNSecondsAndTest(10, THR_100, 0, TMR_OFF, 0));
108 TEST(Timers, timerAbsolute)
110 initModelTimer(0, TMRMODE_ABS, 0);
111 timerReset(0);
113 EXPECT_TRUE(evalTimersForNSecondsAndTest(1, THR_100, 0, TMR_RUNNING, 1));
114 EXPECT_TRUE(evalTimersForNSecondsAndTest(100, THR_100, 0, TMR_RUNNING, 101));
115 EXPECT_TRUE(evalTimersForNSecondsAndTest(100, 0, 0, TMR_RUNNING, 201));
117 // max timer value test
118 timerSet(0, TIMER_MAX-10);
119 EXPECT_TRUE(evalTimersForNSecondsAndTest(1, THR_100, 0, TMR_RUNNING, TIMER_MAX-9));
120 EXPECT_TRUE(evalTimersForNSecondsAndTest(100, THR_100, 0, TMR_RUNNING, TIMER_MAX));
122 // test down-running
123 g_model.timers[0].start = 200;
124 timerReset(0);
125 EXPECT_TRUE(evalTimersForNSecondsAndTest(1, THR_100, 0, TMR_RUNNING, 199));
126 EXPECT_TRUE(evalTimersForNSecondsAndTest(100, THR_100, 0, TMR_RUNNING, 99));
127 EXPECT_TRUE(evalTimersForNSecondsAndTest(100, THR_100, 0, TMR_NEGATIVE, -1));
128 EXPECT_TRUE(evalTimersForNSecondsAndTest(100, THR_100, 0, TMR_STOPPED, -101));
132 TEST(Timers, timerThrottle)
134 initModelTimer(0, TMRMODE_THR, 0);
135 timerReset(0);
137 EXPECT_TRUE(evalTimersForNSecondsAndTest(1, 0, 0, TMR_RUNNING, 0));
138 EXPECT_TRUE(evalTimersForNSecondsAndTest(100, THR_100, 0, TMR_RUNNING, 100));
139 EXPECT_TRUE(evalTimersForNSecondsAndTest(100, THR_10, 0, TMR_RUNNING, 200));
140 EXPECT_TRUE(evalTimersForNSecondsAndTest(100, 0, 0, TMR_RUNNING, 200));
142 // test down-running
143 g_model.timers[0].start = 200;
144 timerReset(0);
145 EXPECT_TRUE(evalTimersForNSecondsAndTest(1, THR_100, 0, TMR_RUNNING, 199));
146 EXPECT_TRUE(evalTimersForNSecondsAndTest(1, 0, 0, TMR_RUNNING, 199));
147 EXPECT_TRUE(evalTimersForNSecondsAndTest(100, THR_100, 0, TMR_RUNNING, 99));
148 EXPECT_TRUE(evalTimersForNSecondsAndTest(100, THR_50, 0, TMR_NEGATIVE, -1));
149 EXPECT_TRUE(evalTimersForNSecondsAndTest(100, THR_100, 0, TMR_STOPPED,-101));
152 TEST(Timers, timerThrottleRelative)
154 initModelTimer(0, TMRMODE_THR_REL, 0);
156 timerReset(0);
157 EXPECT_TRUE(evalTimersForNSecondsAndTest(1, 0, 0, TMR_RUNNING, 0));
158 EXPECT_TRUE(evalTimersForNSecondsAndTest(100, THR_100, 0, TMR_RUNNING, 100));
159 EXPECT_TRUE(evalTimersForNSecondsAndTest(100, THR_50, 0, TMR_RUNNING, 150)); // 50% throttle == 50s
160 EXPECT_TRUE(evalTimersForNSecondsAndTest(100, THR_10, 0, TMR_RUNNING, 160)); // 10% throttle == 10s
161 EXPECT_TRUE(evalTimersForNSecondsAndTest(100, 0, 0, TMR_RUNNING, 160));
163 // test down-running
164 initModelTimer(0, TMRMODE_THR_REL, 200);
165 timerReset(0);
166 EXPECT_TRUE(evalTimersForNSecondsAndTest(1, THR_100, 0, TMR_RUNNING, 199));
167 EXPECT_TRUE(evalTimersForNSecondsAndTest(1, 0, 0, TMR_RUNNING, 199));
168 EXPECT_TRUE(evalTimersForNSecondsAndTest(100, THR_100, 0, TMR_RUNNING, 99));
169 EXPECT_TRUE(evalTimersForNSecondsAndTest(200, THR_50, 0, TMR_NEGATIVE, -1)); // 50% throttle == 100s
170 EXPECT_TRUE(evalTimersForNSecondsAndTest(100, THR_10, 0, TMR_NEGATIVE,-11)); // 10% throttle == 10s
171 EXPECT_TRUE(evalTimersForNSecondsAndTest(100, THR_100, 0, TMR_STOPPED,-111));
174 TEST(Timers, timerThrottleTriggered)
176 initModelTimer(0, TMRMODE_THR_TRG, 0);
178 timerReset(0);
179 EXPECT_TRUE(evalTimersForNSecondsAndTest(1, 0, 0, TMR_OFF, 0));
180 EXPECT_TRUE(evalTimersForNSecondsAndTest(100, THR_10-1, 0, TMR_OFF, 0)); // below threshold
181 EXPECT_TRUE(evalTimersForNSecondsAndTest(100, THR_50, 0, TMR_RUNNING, 100));
182 EXPECT_TRUE(evalTimersForNSecondsAndTest(100, THR_100, 0, TMR_RUNNING, 200));
183 EXPECT_TRUE(evalTimersForNSecondsAndTest(100, 0, 0, TMR_RUNNING, 300));
185 // test down-running
186 initModelTimer(0, TMRMODE_THR_TRG, 200);
187 timerReset(0);
188 EXPECT_TRUE(evalTimersForNSecondsAndTest(1, 0, 0, TMR_OFF, 200));
189 EXPECT_TRUE(evalTimersForNSecondsAndTest(100, THR_10-1, 0, TMR_OFF, 200)); // below threshold
190 EXPECT_TRUE(evalTimersForNSecondsAndTest(100, THR_100, 0, TMR_RUNNING, 100));
191 EXPECT_TRUE(evalTimersForNSecondsAndTest(101, THR_50, 0, TMR_NEGATIVE, -1));
192 EXPECT_TRUE(evalTimersForNSecondsAndTest(10, 0, 0, TMR_NEGATIVE,-11));
193 EXPECT_TRUE(evalTimersForNSecondsAndTest(100, 0, 0, TMR_STOPPED,-111));