Class which provides a handy interface to refresh a loop with microsecond precision within an RTOS.
FixedRefresh.cpp@0:fb0d810af3de, 2016-08-02 (annotated)
- Committer:
- Electrotiger
- Date:
- Tue Aug 02 01:41:36 2016 +0000
- Revision:
- 0:fb0d810af3de
- Child:
- 1:4b00feda7702
Released as independent library.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Electrotiger | 0:fb0d810af3de | 1 | /* |
Electrotiger | 0:fb0d810af3de | 2 | * FixedRefresh.cpp |
Electrotiger | 0:fb0d810af3de | 3 | * |
Electrotiger | 0:fb0d810af3de | 4 | * Created on: Jun 26, 2016 |
Electrotiger | 0:fb0d810af3de | 5 | * Author: Developer |
Electrotiger | 0:fb0d810af3de | 6 | */ |
Electrotiger | 0:fb0d810af3de | 7 | |
Electrotiger | 0:fb0d810af3de | 8 | #include <FixedRefresh.hpp> |
Electrotiger | 0:fb0d810af3de | 9 | |
Electrotiger | 0:fb0d810af3de | 10 | |
Electrotiger | 0:fb0d810af3de | 11 | |
Electrotiger | 0:fb0d810af3de | 12 | FixedRefresh::FixedRefresh() |
Electrotiger | 0:fb0d810af3de | 13 | :waitSemaphore(0) { |
Electrotiger | 0:fb0d810af3de | 14 | // Start the timer that measures the time between successive calls. |
Electrotiger | 0:fb0d810af3de | 15 | elapsedTime.start(); |
Electrotiger | 0:fb0d810af3de | 16 | } |
Electrotiger | 0:fb0d810af3de | 17 | |
Electrotiger | 0:fb0d810af3de | 18 | FixedRefresh::~FixedRefresh() { |
Electrotiger | 0:fb0d810af3de | 19 | // TODO Auto-generated destructor stub |
Electrotiger | 0:fb0d810af3de | 20 | } |
Electrotiger | 0:fb0d810af3de | 21 | |
Electrotiger | 0:fb0d810af3de | 22 | /* More complicated, Thread does not have a wait_us function, necessitating the use of |
Electrotiger | 0:fb0d810af3de | 23 | * a semaphore and a callback function to perform the wait operation. |
Electrotiger | 0:fb0d810af3de | 24 | */ |
Electrotiger | 0:fb0d810af3de | 25 | |
Electrotiger | 0:fb0d810af3de | 26 | bool FixedRefresh::refresh_us(uint32_t micros) { |
Electrotiger | 0:fb0d810af3de | 27 | /* Capture the elapsed time. */ |
Electrotiger | 0:fb0d810af3de | 28 | uint32_t elapsedTimeCapture = elapsedTime.read_us() + 7; |
Electrotiger | 0:fb0d810af3de | 29 | // If the elapsed time is less than the set time, then we can wait. |
Electrotiger | 0:fb0d810af3de | 30 | if(elapsedTimeCapture < micros) { |
Electrotiger | 0:fb0d810af3de | 31 | uint32_t waitTime = micros - elapsedTimeCapture; |
Electrotiger | 0:fb0d810af3de | 32 | // Activate the timer callback. |
Electrotiger | 0:fb0d810af3de | 33 | waitTimer.attach_us(this, &FixedRefresh::timerCallback, waitTime); |
Electrotiger | 0:fb0d810af3de | 34 | // Call the wait function again. Since we have called wait before, it is locked. |
Electrotiger | 0:fb0d810af3de | 35 | // This time, we actually wait for the timerCallback function to release it. |
Electrotiger | 0:fb0d810af3de | 36 | waitSemaphore.wait(); |
Electrotiger | 0:fb0d810af3de | 37 | return true; |
Electrotiger | 0:fb0d810af3de | 38 | } |
Electrotiger | 0:fb0d810af3de | 39 | else { |
Electrotiger | 0:fb0d810af3de | 40 | return false; |
Electrotiger | 0:fb0d810af3de | 41 | } |
Electrotiger | 0:fb0d810af3de | 42 | } |
Electrotiger | 0:fb0d810af3de | 43 | |
Electrotiger | 0:fb0d810af3de | 44 | void FixedRefresh::timerCallback() { |
Electrotiger | 0:fb0d810af3de | 45 | elapsedTime.reset(); |
Electrotiger | 0:fb0d810af3de | 46 | waitSemaphore.release(); |
Electrotiger | 0:fb0d810af3de | 47 | } |
Electrotiger | 0:fb0d810af3de | 48 |