2525#else
2626
2727using utest::v1::Case;
28+ using namespace std ::chrono;
2829
29- static const int test_timeout = 10 ;
30+ #define TEST_ASSERT_EQUAL_DURATION (expected, actual ) \
31+ do { \
32+ using ct = std::common_type_t <decltype (expected), decltype (actual)>; \
33+ TEST_ASSERT_EQUAL (ct (expected).count (), ct (actual).count ()); \
34+ } while (0 )
35+
36+ #define TEST_ASSERT_DURATION_WITHIN (delta, expected, actual ) \
37+ do { \
38+ using ct = std::common_type_t <decltype (delta), decltype (expected), decltype (actual)>; \
39+ TEST_ASSERT_INT_WITHIN (ct (delta).count (), ct (expected).count (), ct (actual).count ()); \
40+ } while (0 )
3041
3142#define TICKER_COUNT 16
32- #define MULTI_TICKER_TIME_MS 100
43+ #define MULTI_TICKER_TIME 100ms
3344
3445/* Due to poor accuracy of LowPowerTicker on many platforms
3546 there is no sense to tune tolerance value as it was in Ticker tests.
3647
3748 Tolerance value is set to 600us for measurement inaccuracy + 5% tolerance
3849 for LowPowerTicker. */
39- #define TOLERANCE_US (DELAY ) (600 + DELAY / 20 )
40-
50+ #define TOLERANCE (DELAY ) (600us + DELAY / 20 )
4151
52+ static const int test_timeout = 10 ;
4253volatile uint32_t ticker_callback_flag;
4354volatile uint32_t multi_counter;
4455Timer gtimer;
@@ -73,14 +84,14 @@ void increment_multi_counter(void)
7384void test_multi_ticker (void )
7485{
7586 LowPowerTicker ticker[TICKER_COUNT];
76- const uint32_t extra_wait = 10 ; // extra 10ms wait time
87+ const milliseconds extra_wait = 10ms ; // extra 10ms wait time
7788
7889 multi_counter = 0 ;
7990 for (int i = 0 ; i < TICKER_COUNT; i++) {
80- ticker[i].attach_us (callback (increment_multi_counter), MULTI_TICKER_TIME_MS * 1000 );
91+ ticker[i].attach (callback (increment_multi_counter), MULTI_TICKER_TIME );
8192 }
8293
83- ThisThread::sleep_for (MULTI_TICKER_TIME_MS + extra_wait);
94+ ThisThread::sleep_for (MULTI_TICKER_TIME + extra_wait);
8495 TEST_ASSERT_EQUAL (TICKER_COUNT, multi_counter);
8596
8697 for (int i = 0 ; i < TICKER_COUNT; i++) {
@@ -93,10 +104,10 @@ void test_multi_ticker(void)
93104
94105 multi_counter = 0 ;
95106 for (int i = 0 ; i < TICKER_COUNT; i++) {
96- ticker[i].attach_us (callback (increment_multi_counter), (MULTI_TICKER_TIME_MS + i) * 1000 );
107+ ticker[i].attach (callback (increment_multi_counter), MULTI_TICKER_TIME + milliseconds{i} );
97108 }
98109
99- ThisThread::sleep_for (MULTI_TICKER_TIME_MS + TICKER_COUNT + extra_wait);
110+ ThisThread::sleep_for (MULTI_TICKER_TIME + milliseconds{ TICKER_COUNT} + extra_wait);
100111 TEST_ASSERT_EQUAL (TICKER_COUNT, multi_counter);
101112
102113 for (int i = 0 ; i < TICKER_COUNT; i++) {
@@ -117,19 +128,18 @@ void test_multi_ticker(void)
117128void test_multi_call_time (void )
118129{
119130 LowPowerTicker ticker;
120- int time_diff;
121131 const int attach_count = 10 ;
122132
123133 for (int i = 0 ; i < attach_count; i++) {
124134 ticker_callback_flag = 0 ;
125135 gtimer.reset ();
126136
127137 gtimer.start ();
128- ticker.attach_us (callback (stop_gtimer_set_flag), MULTI_TICKER_TIME_MS * 1000 );
138+ ticker.attach (callback (stop_gtimer_set_flag), MULTI_TICKER_TIME );
129139 while (!ticker_callback_flag);
130- time_diff = gtimer.read_us ();
140+ const auto time_diff = gtimer.elapsed_time ();
131141
132- TEST_ASSERT_UINT32_WITHIN ( TOLERANCE_US (MULTI_TICKER_TIME_MS * 1000 ), MULTI_TICKER_TIME_MS * 1000 , time_diff);
142+ TEST_ASSERT_DURATION_WITHIN ( TOLERANCE (MULTI_TICKER_TIME ), MULTI_TICKER_TIME , time_diff);
133143 }
134144}
135145
@@ -142,20 +152,16 @@ void test_multi_call_time(void)
142152void test_detach (void )
143153{
144154 LowPowerTicker ticker;
145- bool ret;
146- const float ticker_time_s = 0 .1f ;
147- const uint32_t wait_time_ms = 500 ;
148155 Semaphore sem (0 , 1 );
149156
150- ticker.attach (callback (sem_release, &sem), ticker_time_s );
157+ ticker.attach (callback (sem_release, &sem), 100ms );
151158
152159 sem.acquire ();
153160
154161 sem.acquire ();
155162 ticker.detach (); /* cancel */
156163
157- ret = sem.try_acquire_for (wait_time_ms);
158- TEST_ASSERT_FALSE (ret);
164+ TEST_ASSERT_FALSE (sem.try_acquire_for (500ms));
159165}
160166
161167/* * Test single callback time via attach
@@ -164,54 +170,29 @@ void test_detach(void)
164170 When callback attached with time interval specified
165171 Then ticker properly executes callback within a specified time interval
166172 */
167- template <us_timestamp_t DELAY_US >
173+ template <typename Duration, uint64_t DELAY >
168174void test_attach_time (void )
169175{
170176 LowPowerTicker ticker;
171177 ticker_callback_flag = 0 ;
178+ const auto delay = Duration{DELAY};
172179
173180 gtimer.reset ();
174181 gtimer.start ();
175- ticker.attach (callback (stop_gtimer_set_flag), ((float )DELAY_US) / 1000000 .0f );
176- while (!ticker_callback_flag);
177- ticker.detach ();
178- const int time_diff = gtimer.read_us ();
179-
180- TEST_ASSERT_UINT64_WITHIN (TOLERANCE_US (DELAY_US), DELAY_US, time_diff);
181- }
182-
183- /* * Test single callback time via attach_us
184-
185- Given a Ticker
186- When callback attached with time interval specified
187- Then ticker properly executes callback within a specified time interval
188- */
189- template <us_timestamp_t DELAY_US>
190- void test_attach_us_time (void )
191- {
192- LowPowerTicker ticker;
193- ticker_callback_flag = 0 ;
194-
195- gtimer.reset ();
196- gtimer.start ();
197- ticker.attach_us (callback (stop_gtimer_set_flag), DELAY_US);
182+ ticker.attach (callback (stop_gtimer_set_flag), delay);
198183 while (!ticker_callback_flag);
199184 ticker.detach ();
200- const int time_diff = gtimer.read_us ();
185+ const auto time_diff = gtimer.elapsed_time ();
201186
202- TEST_ASSERT_UINT64_WITHIN ( TOLERANCE_US (DELAY_US ), DELAY_US , time_diff);
187+ TEST_ASSERT_DURATION_WITHIN ( TOLERANCE (delay ), delay , time_diff);
203188}
204189
205190// Test cases
206191Case cases[] = {
207- Case (" Test attach for 0.001s and time measure" , test_attach_time<1000 >),
208- Case (" Test attach_us for 1ms and time measure" , test_attach_us_time<1000 >),
209- Case (" Test attach for 0.01s and time measure" , test_attach_time<10000 >),
210- Case (" Test attach_us for 10ms and time measure" , test_attach_us_time<10000 >),
211- Case (" Test attach for 0.1s and time measure" , test_attach_time<100000 >),
212- Case (" Test attach_us for 100ms and time measure" , test_attach_us_time<100000 >),
213- Case (" Test attach for 0.5s and time measure" , test_attach_time<500000 >),
214- Case (" Test attach_us for 500ms and time measure" , test_attach_us_time<500000 >),
192+ Case (" Test attach for 1ms and time measure" , test_attach_time<milliseconds, 1 >),
193+ Case (" Test attach for 10ms and time measure" , test_attach_time<milliseconds, 10 >),
194+ Case (" Test attach for 100ms and time measure" , test_attach_time<milliseconds, 100 >),
195+ Case (" Test attach for 500ms and time measure" , test_attach_time<milliseconds, 500 >),
215196 Case (" Test detach" , test_detach),
216197 Case (" Test multi call and time measure" , test_multi_call_time),
217198 Case (" Test multi ticker" , test_multi_ticker),
0 commit comments