EL4121 Embedded System / mbed-os

Dependents:   cobaLCDJoyMotor_Thread odometry_omni_3roda_v3 odometry_omni_3roda_v1 odometry_omni_3roda_v2 ... more

Committer:
be_bryan
Date:
Mon Dec 11 17:54:04 2017 +0000
Revision:
0:b74591d5ab33
motor ++

Who changed what in which revision?

UserRevisionLine numberNew contents of line
be_bryan 0:b74591d5ab33 1 /*
be_bryan 0:b74591d5ab33 2 * Copyright (c) 2017, ARM Limited, All Rights Reserved
be_bryan 0:b74591d5ab33 3 * SPDX-License-Identifier: Apache-2.0
be_bryan 0:b74591d5ab33 4 *
be_bryan 0:b74591d5ab33 5 * Licensed under the Apache License, Version 2.0 (the "License"); you may
be_bryan 0:b74591d5ab33 6 * not use this file except in compliance with the License.
be_bryan 0:b74591d5ab33 7 * You may obtain a copy of the License at
be_bryan 0:b74591d5ab33 8 *
be_bryan 0:b74591d5ab33 9 * http://www.apache.org/licenses/LICENSE-2.0
be_bryan 0:b74591d5ab33 10 *
be_bryan 0:b74591d5ab33 11 * Unless required by applicable law or agreed to in writing, software
be_bryan 0:b74591d5ab33 12 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
be_bryan 0:b74591d5ab33 13 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
be_bryan 0:b74591d5ab33 14 * See the License for the specific language governing permissions and
be_bryan 0:b74591d5ab33 15 * limitations under the License.
be_bryan 0:b74591d5ab33 16 */
be_bryan 0:b74591d5ab33 17
be_bryan 0:b74591d5ab33 18 #include "mbed.h"
be_bryan 0:b74591d5ab33 19 #include "greentea-client/test_env.h"
be_bryan 0:b74591d5ab33 20 #include "unity.h"
be_bryan 0:b74591d5ab33 21 #include "utest.h"
be_bryan 0:b74591d5ab33 22 #include "rtos.h"
be_bryan 0:b74591d5ab33 23 #include "hal/us_ticker_api.h"
be_bryan 0:b74591d5ab33 24
be_bryan 0:b74591d5ab33 25 #if !DEVICE_LOWPOWERTIMER
be_bryan 0:b74591d5ab33 26 #error [NOT_SUPPORTED] test not supported
be_bryan 0:b74591d5ab33 27 #endif
be_bryan 0:b74591d5ab33 28
be_bryan 0:b74591d5ab33 29 using namespace utest::v1;
be_bryan 0:b74591d5ab33 30
be_bryan 0:b74591d5ab33 31 extern uint32_t SystemCoreClock;
be_bryan 0:b74591d5ab33 32
be_bryan 0:b74591d5ab33 33 /* This test is created based on the test for Timer class.
be_bryan 0:b74591d5ab33 34 * Since low power timer is less accurate than regular
be_bryan 0:b74591d5ab33 35 * timer we need to adjust delta.
be_bryan 0:b74591d5ab33 36 */
be_bryan 0:b74591d5ab33 37
be_bryan 0:b74591d5ab33 38 /* Macro to define delta based on CPU clock frequency.
be_bryan 0:b74591d5ab33 39 *
be_bryan 0:b74591d5ab33 40 * Note that some extra time is counted by the timer.
be_bryan 0:b74591d5ab33 41 * Additional time is caused by the function calls and
be_bryan 0:b74591d5ab33 42 * additional operations performed by wait and
be_bryan 0:b74591d5ab33 43 * stop functions before in fact timer is stopped. This may
be_bryan 0:b74591d5ab33 44 * add additional time to the counted result.
be_bryan 0:b74591d5ab33 45 *
be_bryan 0:b74591d5ab33 46 * To take in to account this extra time we introduce DELTA
be_bryan 0:b74591d5ab33 47 * value based on CPU clock (speed):
be_bryan 0:b74591d5ab33 48 * DELTA = TOLERANCE_FACTOR / SystemCoreClock * US_FACTOR
be_bryan 0:b74591d5ab33 49 *
be_bryan 0:b74591d5ab33 50 * e.g.
be_bryan 0:b74591d5ab33 51 * For K64F DELTA = (80000 / 120000000) * 1000000 = 666[us]
be_bryan 0:b74591d5ab33 52 * For NUCLEO_F070RB DELTA = (80000 / 48000000) * 1000000 = 1666[us]
be_bryan 0:b74591d5ab33 53 * For NRF51_DK DELTA = (80000 / 16000000) * 1000000 = 5000[us]
be_bryan 0:b74591d5ab33 54 */
be_bryan 0:b74591d5ab33 55 #define US_PER_SEC 1000000
be_bryan 0:b74591d5ab33 56 #define US_PER_MSEC 1000
be_bryan 0:b74591d5ab33 57 #define TOLERANCE_FACTOR 80000.0f
be_bryan 0:b74591d5ab33 58 #define US_FACTOR 1000000.0f
be_bryan 0:b74591d5ab33 59
be_bryan 0:b74591d5ab33 60 static const int delta_sys_clk_us = ((int) (TOLERANCE_FACTOR / (float) SystemCoreClock * US_FACTOR));
be_bryan 0:b74591d5ab33 61
be_bryan 0:b74591d5ab33 62 /* When test performs time measurement using Timer in sequence, then measurement error accumulates
be_bryan 0:b74591d5ab33 63 * in the successive attempts. */
be_bryan 0:b74591d5ab33 64 #define DELTA_US(i) (delta_sys_clk_us * i)
be_bryan 0:b74591d5ab33 65 #define DELTA_S(i) ((float)delta_sys_clk_us * i / US_PER_SEC)
be_bryan 0:b74591d5ab33 66 #define DELTA_MS(i) (1 + ( (i * delta_sys_clk_us) / US_PER_MSEC))
be_bryan 0:b74591d5ab33 67
be_bryan 0:b74591d5ab33 68 /* This test verifies if low power timer is stopped after
be_bryan 0:b74591d5ab33 69 * creation.
be_bryan 0:b74591d5ab33 70 *
be_bryan 0:b74591d5ab33 71 * Given Timer has been successfully created.
be_bryan 0:b74591d5ab33 72 * When read of timer elapsed time is requested.
be_bryan 0:b74591d5ab33 73 * Then result is always 0.
be_bryan 0:b74591d5ab33 74 */
be_bryan 0:b74591d5ab33 75 void test_lptimer_creation()
be_bryan 0:b74591d5ab33 76 {
be_bryan 0:b74591d5ab33 77 LowPowerTimer lp_timer;
be_bryan 0:b74591d5ab33 78
be_bryan 0:b74591d5ab33 79 /* Check results. */
be_bryan 0:b74591d5ab33 80 TEST_ASSERT_EQUAL_FLOAT(0, lp_timer.read());
be_bryan 0:b74591d5ab33 81 TEST_ASSERT_EQUAL_INT32(0, lp_timer.read_ms());
be_bryan 0:b74591d5ab33 82 TEST_ASSERT_EQUAL_INT32(0, lp_timer.read_us());
be_bryan 0:b74591d5ab33 83 TEST_ASSERT_EQUAL_UINT64(0, lp_timer.read_high_resolution_us());
be_bryan 0:b74591d5ab33 84
be_bryan 0:b74591d5ab33 85 /* Wait 10 ms.
be_bryan 0:b74591d5ab33 86 * After that operation timer read routines should still return 0. */
be_bryan 0:b74591d5ab33 87 wait_ms(10);
be_bryan 0:b74591d5ab33 88
be_bryan 0:b74591d5ab33 89 /* Check results. */
be_bryan 0:b74591d5ab33 90 TEST_ASSERT_EQUAL_FLOAT(0, lp_timer.read());
be_bryan 0:b74591d5ab33 91 TEST_ASSERT_EQUAL_INT32(0, lp_timer.read_ms());
be_bryan 0:b74591d5ab33 92 TEST_ASSERT_EQUAL_INT32(0, lp_timer.read_us());
be_bryan 0:b74591d5ab33 93 TEST_ASSERT_EQUAL_UINT64(0, lp_timer.read_high_resolution_us());
be_bryan 0:b74591d5ab33 94 }
be_bryan 0:b74591d5ab33 95
be_bryan 0:b74591d5ab33 96 /* This test verifies if read(), read_us(), read_ms(),
be_bryan 0:b74591d5ab33 97 * read_high_resolution_us()
be_bryan 0:b74591d5ab33 98 * functions return time accumulated between
be_bryan 0:b74591d5ab33 99 * low power timer starts and stops.
be_bryan 0:b74591d5ab33 100 *
be_bryan 0:b74591d5ab33 101 * Given Timer has been successfully created and
be_bryan 0:b74591d5ab33 102 * few times started and stopped after a specified period of time.
be_bryan 0:b74591d5ab33 103 * When timer read request is performed.
be_bryan 0:b74591d5ab33 104 * Then read functions return accumulated time elapsed between starts
be_bryan 0:b74591d5ab33 105 * and stops.
be_bryan 0:b74591d5ab33 106 */
be_bryan 0:b74591d5ab33 107 void test_lptimer_time_accumulation()
be_bryan 0:b74591d5ab33 108 {
be_bryan 0:b74591d5ab33 109 LowPowerTimer lp_timer;
be_bryan 0:b74591d5ab33 110
be_bryan 0:b74591d5ab33 111 /* Start the timer. */
be_bryan 0:b74591d5ab33 112 lp_timer.start();
be_bryan 0:b74591d5ab33 113
be_bryan 0:b74591d5ab33 114 /* Wait 10 ms. */
be_bryan 0:b74591d5ab33 115 wait_ms(10);
be_bryan 0:b74591d5ab33 116
be_bryan 0:b74591d5ab33 117 /* Stop the timer. */
be_bryan 0:b74591d5ab33 118 lp_timer.stop();
be_bryan 0:b74591d5ab33 119
be_bryan 0:b74591d5ab33 120 /* Check results - totally 10 ms have elapsed. */
be_bryan 0:b74591d5ab33 121 TEST_ASSERT_FLOAT_WITHIN(DELTA_S(1), 0.010f, lp_timer.read());
be_bryan 0:b74591d5ab33 122 TEST_ASSERT_INT32_WITHIN(DELTA_MS(1), 10, lp_timer.read_ms());
be_bryan 0:b74591d5ab33 123 TEST_ASSERT_INT32_WITHIN(DELTA_US(1), 10000, lp_timer.read_us());
be_bryan 0:b74591d5ab33 124 TEST_ASSERT_UINT64_WITHIN(DELTA_US(1), 10000, lp_timer.read_high_resolution_us());
be_bryan 0:b74591d5ab33 125
be_bryan 0:b74591d5ab33 126 /* Wait 50 ms - this is done to show that time elapsed when
be_bryan 0:b74591d5ab33 127 * the timer is stopped does not have influence on the
be_bryan 0:b74591d5ab33 128 * timer counted time. */
be_bryan 0:b74591d5ab33 129 wait_ms(50);
be_bryan 0:b74591d5ab33 130
be_bryan 0:b74591d5ab33 131 /* ------ */
be_bryan 0:b74591d5ab33 132
be_bryan 0:b74591d5ab33 133 /* Start the timer. */
be_bryan 0:b74591d5ab33 134 lp_timer.start();
be_bryan 0:b74591d5ab33 135
be_bryan 0:b74591d5ab33 136 /* Wait 20 ms. */
be_bryan 0:b74591d5ab33 137 wait_ms(20);
be_bryan 0:b74591d5ab33 138
be_bryan 0:b74591d5ab33 139 /* Stop the timer. */
be_bryan 0:b74591d5ab33 140 lp_timer.stop();
be_bryan 0:b74591d5ab33 141
be_bryan 0:b74591d5ab33 142 /* Check results - totally 30 ms have elapsed. */
be_bryan 0:b74591d5ab33 143 TEST_ASSERT_FLOAT_WITHIN(DELTA_S(2), 0.030f, lp_timer.read());
be_bryan 0:b74591d5ab33 144 TEST_ASSERT_INT32_WITHIN(DELTA_MS(2), 30, lp_timer.read_ms());
be_bryan 0:b74591d5ab33 145 TEST_ASSERT_INT32_WITHIN(DELTA_US(2), 30000, lp_timer.read_us());
be_bryan 0:b74591d5ab33 146 TEST_ASSERT_UINT64_WITHIN(DELTA_US(2), 30000, lp_timer.read_high_resolution_us());
be_bryan 0:b74591d5ab33 147
be_bryan 0:b74591d5ab33 148 /* Wait 50 ms - this is done to show that time elapsed when
be_bryan 0:b74591d5ab33 149 * the timer is stopped does not have influence on the
be_bryan 0:b74591d5ab33 150 * timer counted time. */
be_bryan 0:b74591d5ab33 151
be_bryan 0:b74591d5ab33 152 /* ------ */
be_bryan 0:b74591d5ab33 153
be_bryan 0:b74591d5ab33 154 /* Start the timer. */
be_bryan 0:b74591d5ab33 155 lp_timer.start();
be_bryan 0:b74591d5ab33 156
be_bryan 0:b74591d5ab33 157 /* Wait 30 ms. */
be_bryan 0:b74591d5ab33 158 wait_ms(30);
be_bryan 0:b74591d5ab33 159
be_bryan 0:b74591d5ab33 160 /* Stop the timer. */
be_bryan 0:b74591d5ab33 161 lp_timer.stop();
be_bryan 0:b74591d5ab33 162
be_bryan 0:b74591d5ab33 163 /* Check results - totally 60 ms have elapsed. */
be_bryan 0:b74591d5ab33 164 TEST_ASSERT_FLOAT_WITHIN(DELTA_S(3), 0.060f, lp_timer.read());
be_bryan 0:b74591d5ab33 165 TEST_ASSERT_INT32_WITHIN(DELTA_MS(3), 60, lp_timer.read_ms());
be_bryan 0:b74591d5ab33 166 TEST_ASSERT_INT32_WITHIN(DELTA_US(3), 60000, lp_timer.read_us());
be_bryan 0:b74591d5ab33 167 TEST_ASSERT_UINT64_WITHIN(DELTA_US(3), 60000, lp_timer.read_high_resolution_us());
be_bryan 0:b74591d5ab33 168
be_bryan 0:b74591d5ab33 169 /* Wait 50 ms - this is done to show that time elapsed when
be_bryan 0:b74591d5ab33 170 * the timer is stopped does not have influence on the
be_bryan 0:b74591d5ab33 171 * timer time. */
be_bryan 0:b74591d5ab33 172 wait_ms(50);
be_bryan 0:b74591d5ab33 173
be_bryan 0:b74591d5ab33 174 /* ------ */
be_bryan 0:b74591d5ab33 175
be_bryan 0:b74591d5ab33 176 /* Start the timer. */
be_bryan 0:b74591d5ab33 177 lp_timer.start();
be_bryan 0:b74591d5ab33 178
be_bryan 0:b74591d5ab33 179 /* Wait 1 sec. */
be_bryan 0:b74591d5ab33 180 wait_ms(1000);
be_bryan 0:b74591d5ab33 181
be_bryan 0:b74591d5ab33 182 /* Stop the timer. */
be_bryan 0:b74591d5ab33 183 lp_timer.stop();
be_bryan 0:b74591d5ab33 184
be_bryan 0:b74591d5ab33 185 /* Check results - totally 1060 ms have elapsed. */
be_bryan 0:b74591d5ab33 186 TEST_ASSERT_FLOAT_WITHIN(DELTA_S(4), 1.060f, lp_timer.read());
be_bryan 0:b74591d5ab33 187 TEST_ASSERT_INT32_WITHIN(DELTA_MS(4), 1060, lp_timer.read_ms());
be_bryan 0:b74591d5ab33 188 TEST_ASSERT_INT32_WITHIN(DELTA_US(4), 1060000, lp_timer.read_us());
be_bryan 0:b74591d5ab33 189 TEST_ASSERT_UINT64_WITHIN(DELTA_US(4), 1060000, lp_timer.read_high_resolution_us());
be_bryan 0:b74591d5ab33 190 }
be_bryan 0:b74591d5ab33 191
be_bryan 0:b74591d5ab33 192 /* This test verifies if reset() function resets the
be_bryan 0:b74591d5ab33 193 * low power timer counted time.
be_bryan 0:b74591d5ab33 194 *
be_bryan 0:b74591d5ab33 195 * Given timer has been started and stopped once, then reset
be_bryan 0:b74591d5ab33 196 * operation was performed.
be_bryan 0:b74591d5ab33 197 * When timer is started and stopped next time.
be_bryan 0:b74591d5ab33 198 * Then timer read functions returns only the the second
be_bryan 0:b74591d5ab33 199 * measured time.
be_bryan 0:b74591d5ab33 200 */
be_bryan 0:b74591d5ab33 201 void test_lptimer_reset()
be_bryan 0:b74591d5ab33 202 {
be_bryan 0:b74591d5ab33 203 LowPowerTimer lp_timer;
be_bryan 0:b74591d5ab33 204
be_bryan 0:b74591d5ab33 205 /* First measure 10 ms delay. */
be_bryan 0:b74591d5ab33 206 lp_timer.start();
be_bryan 0:b74591d5ab33 207
be_bryan 0:b74591d5ab33 208 /* Wait 10 ms. */
be_bryan 0:b74591d5ab33 209 wait_ms(10);
be_bryan 0:b74591d5ab33 210
be_bryan 0:b74591d5ab33 211 /* Stop the timer. */
be_bryan 0:b74591d5ab33 212 lp_timer.stop();
be_bryan 0:b74591d5ab33 213
be_bryan 0:b74591d5ab33 214 /* Check results - totally 10 ms elapsed. */
be_bryan 0:b74591d5ab33 215 TEST_ASSERT_FLOAT_WITHIN(DELTA_S(1), 0.010f, lp_timer.read());
be_bryan 0:b74591d5ab33 216 TEST_ASSERT_INT32_WITHIN(DELTA_MS(1), 10, lp_timer.read_ms());
be_bryan 0:b74591d5ab33 217 TEST_ASSERT_INT32_WITHIN(DELTA_US(1), 10000, lp_timer.read_us());
be_bryan 0:b74591d5ab33 218 TEST_ASSERT_UINT64_WITHIN(DELTA_US(1), 10000, lp_timer.read_high_resolution_us());
be_bryan 0:b74591d5ab33 219
be_bryan 0:b74591d5ab33 220 /* Reset the timer - previous measured time should be lost now. */
be_bryan 0:b74591d5ab33 221 lp_timer.reset();
be_bryan 0:b74591d5ab33 222
be_bryan 0:b74591d5ab33 223 /* Now measure 20 ms delay. */
be_bryan 0:b74591d5ab33 224 lp_timer.start();
be_bryan 0:b74591d5ab33 225
be_bryan 0:b74591d5ab33 226 /* Wait 20 ms. */
be_bryan 0:b74591d5ab33 227 wait_ms(20);
be_bryan 0:b74591d5ab33 228
be_bryan 0:b74591d5ab33 229 /* Stop the timer. */
be_bryan 0:b74591d5ab33 230 lp_timer.stop();
be_bryan 0:b74591d5ab33 231
be_bryan 0:b74591d5ab33 232 /* Check results - 20 ms elapsed since the reset. */
be_bryan 0:b74591d5ab33 233 TEST_ASSERT_FLOAT_WITHIN(DELTA_S(1), 0.020f, lp_timer.read());
be_bryan 0:b74591d5ab33 234 TEST_ASSERT_INT32_WITHIN(DELTA_MS(1), 20, lp_timer.read_ms());
be_bryan 0:b74591d5ab33 235 TEST_ASSERT_INT32_WITHIN(DELTA_US(1), 20000, lp_timer.read_us());
be_bryan 0:b74591d5ab33 236 TEST_ASSERT_UINT64_WITHIN(DELTA_US(1), 20000, lp_timer.read_high_resolution_us());
be_bryan 0:b74591d5ab33 237 }
be_bryan 0:b74591d5ab33 238
be_bryan 0:b74591d5ab33 239 /* This test verifies if calling start() for already
be_bryan 0:b74591d5ab33 240 * started low power timer does nothing.
be_bryan 0:b74591d5ab33 241 *
be_bryan 0:b74591d5ab33 242 * Given timer is already started.
be_bryan 0:b74591d5ab33 243 * When timer is started again.
be_bryan 0:b74591d5ab33 244 * Then second start operation is ignored.
be_bryan 0:b74591d5ab33 245 */
be_bryan 0:b74591d5ab33 246 void test_lptimer_start_started_timer()
be_bryan 0:b74591d5ab33 247 {
be_bryan 0:b74591d5ab33 248 LowPowerTimer lp_timer;
be_bryan 0:b74591d5ab33 249
be_bryan 0:b74591d5ab33 250 /* Start the timer. */
be_bryan 0:b74591d5ab33 251 lp_timer.start();
be_bryan 0:b74591d5ab33 252
be_bryan 0:b74591d5ab33 253 /* Wait 10 ms. */
be_bryan 0:b74591d5ab33 254 wait_ms(10);
be_bryan 0:b74591d5ab33 255
be_bryan 0:b74591d5ab33 256 /* Now start timer again. */
be_bryan 0:b74591d5ab33 257 lp_timer.start();
be_bryan 0:b74591d5ab33 258
be_bryan 0:b74591d5ab33 259 /* Wait 20 ms. */
be_bryan 0:b74591d5ab33 260 wait_ms(20);
be_bryan 0:b74591d5ab33 261
be_bryan 0:b74591d5ab33 262 /* Stop the timer. */
be_bryan 0:b74591d5ab33 263 lp_timer.stop();
be_bryan 0:b74591d5ab33 264
be_bryan 0:b74591d5ab33 265 /* Check results - 30 ms have elapsed since the first start. */
be_bryan 0:b74591d5ab33 266 TEST_ASSERT_FLOAT_WITHIN(DELTA_S(2), 0.030f, lp_timer.read());
be_bryan 0:b74591d5ab33 267 TEST_ASSERT_INT32_WITHIN(DELTA_MS(2), 30, lp_timer.read_ms());
be_bryan 0:b74591d5ab33 268 TEST_ASSERT_INT32_WITHIN(DELTA_US(2), 30000, lp_timer.read_us());
be_bryan 0:b74591d5ab33 269 TEST_ASSERT_UINT64_WITHIN(DELTA_US(2), 30000, lp_timer.read_high_resolution_us());
be_bryan 0:b74591d5ab33 270 }
be_bryan 0:b74591d5ab33 271
be_bryan 0:b74591d5ab33 272 /* This test verifies low power timer float operator.
be_bryan 0:b74591d5ab33 273 *
be_bryan 0:b74591d5ab33 274 * Given timer is created and a time period time is counted.
be_bryan 0:b74591d5ab33 275 * When timer object is casted on float type.
be_bryan 0:b74591d5ab33 276 * Then counted type in seconds is returned by means of
be_bryan 0:b74591d5ab33 277 * read() function.
be_bryan 0:b74591d5ab33 278 */
be_bryan 0:b74591d5ab33 279 void test_lptimer_float_operator()
be_bryan 0:b74591d5ab33 280 {
be_bryan 0:b74591d5ab33 281 LowPowerTimer lp_timer;
be_bryan 0:b74591d5ab33 282
be_bryan 0:b74591d5ab33 283 /* Start the timer. */
be_bryan 0:b74591d5ab33 284 lp_timer.start();
be_bryan 0:b74591d5ab33 285
be_bryan 0:b74591d5ab33 286 /* Wait 10 ms. */
be_bryan 0:b74591d5ab33 287 wait_ms(10);
be_bryan 0:b74591d5ab33 288
be_bryan 0:b74591d5ab33 289 /* Stop the timer. */
be_bryan 0:b74591d5ab33 290 lp_timer.stop();
be_bryan 0:b74591d5ab33 291
be_bryan 0:b74591d5ab33 292 /* Check result - 10 ms elapsed. */
be_bryan 0:b74591d5ab33 293 TEST_ASSERT_FLOAT_WITHIN(DELTA_S(1), 0.010f, (float )(lp_timer));
be_bryan 0:b74591d5ab33 294 }
be_bryan 0:b74591d5ab33 295
be_bryan 0:b74591d5ab33 296 /* This test verifies if time counted by the low power timer is
be_bryan 0:b74591d5ab33 297 * valid.
be_bryan 0:b74591d5ab33 298 *
be_bryan 0:b74591d5ab33 299 * Given timer is created.
be_bryan 0:b74591d5ab33 300 * When timer is used to measure 1ms/10ms/100ms/1s
be_bryan 0:b74591d5ab33 301 * delays.
be_bryan 0:b74591d5ab33 302 * Then the results are valid (within acceptable range).
be_bryan 0:b74591d5ab33 303 */
be_bryan 0:b74591d5ab33 304 template<int wait_val_us>
be_bryan 0:b74591d5ab33 305 void test_lptimer_time_measurement()
be_bryan 0:b74591d5ab33 306 {
be_bryan 0:b74591d5ab33 307 LowPowerTimer lp_timer;
be_bryan 0:b74591d5ab33 308
be_bryan 0:b74591d5ab33 309 /* Start the timer. */
be_bryan 0:b74591d5ab33 310 lp_timer.start();
be_bryan 0:b74591d5ab33 311
be_bryan 0:b74591d5ab33 312 /* Wait <wait_val_us> us. */
be_bryan 0:b74591d5ab33 313 wait_us(wait_val_us);
be_bryan 0:b74591d5ab33 314
be_bryan 0:b74591d5ab33 315 /* Stop the timer. */
be_bryan 0:b74591d5ab33 316 lp_timer.stop();
be_bryan 0:b74591d5ab33 317
be_bryan 0:b74591d5ab33 318 /* Check results - wait_val_us us have elapsed. */
be_bryan 0:b74591d5ab33 319 TEST_ASSERT_FLOAT_WITHIN(DELTA_S(1), (float )wait_val_us / 1000000, lp_timer.read());
be_bryan 0:b74591d5ab33 320 TEST_ASSERT_INT32_WITHIN(DELTA_MS(1), wait_val_us / 1000, lp_timer.read_ms());
be_bryan 0:b74591d5ab33 321 TEST_ASSERT_INT32_WITHIN(DELTA_US(1), wait_val_us, lp_timer.read_us());
be_bryan 0:b74591d5ab33 322 TEST_ASSERT_UINT64_WITHIN(DELTA_US(1), wait_val_us, lp_timer.read_high_resolution_us());
be_bryan 0:b74591d5ab33 323 }
be_bryan 0:b74591d5ab33 324
be_bryan 0:b74591d5ab33 325 utest::v1::status_t test_setup(const size_t number_of_cases)
be_bryan 0:b74591d5ab33 326 {
be_bryan 0:b74591d5ab33 327 GREENTEA_SETUP(15, "default_auto");
be_bryan 0:b74591d5ab33 328 return verbose_test_setup_handler(number_of_cases);
be_bryan 0:b74591d5ab33 329 }
be_bryan 0:b74591d5ab33 330
be_bryan 0:b74591d5ab33 331 Case cases[] = {
be_bryan 0:b74591d5ab33 332 Case("Test: LowPowerTimer - stopped after creation.", test_lptimer_creation),
be_bryan 0:b74591d5ab33 333 Case("Test: LowPowerTimer - measure time accumulation.", test_lptimer_time_accumulation),
be_bryan 0:b74591d5ab33 334 Case("Test: LowPowerTimer - reset.", test_lptimer_reset),
be_bryan 0:b74591d5ab33 335 Case("Test: LowPowerTimer - start started timer.", test_lptimer_start_started_timer),
be_bryan 0:b74591d5ab33 336 Case("Test: LowPowerTimer - float operator.", test_lptimer_float_operator),
be_bryan 0:b74591d5ab33 337 Case("Test: LowPowerTimer - time measurement 1 ms.", test_lptimer_time_measurement<1000>),
be_bryan 0:b74591d5ab33 338 Case("Test: LowPowerTimer - time measurement 10 ms.", test_lptimer_time_measurement<10000>),
be_bryan 0:b74591d5ab33 339 Case("Test: LowPowerTimer - time measurement 100 ms.", test_lptimer_time_measurement<100000>),
be_bryan 0:b74591d5ab33 340 Case("Test: LowPowerTimer - time measurement 1 s.", test_lptimer_time_measurement<1000000>)
be_bryan 0:b74591d5ab33 341 };
be_bryan 0:b74591d5ab33 342
be_bryan 0:b74591d5ab33 343 Specification specification(test_setup, cases);
be_bryan 0:b74591d5ab33 344
be_bryan 0:b74591d5ab33 345 int main()
be_bryan 0:b74591d5ab33 346 {
be_bryan 0:b74591d5ab33 347 return !Harness::run(specification);
be_bryan 0:b74591d5ab33 348 }