Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: cobaLCDJoyMotor_Thread odometry_omni_3roda_v3 odometry_omni_3roda_v1 odometry_omni_3roda_v2 ... more
TESTS/mbed_drivers/lp_timer/main.cpp@0:b74591d5ab33, 2017-12-11 (annotated)
- Committer:
- be_bryan
- Date:
- Mon Dec 11 17:54:04 2017 +0000
- Revision:
- 0:b74591d5ab33
motor ++
Who changed what in which revision?
| User | Revision | Line number | New 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 | } |