fota lib for mdot

Dependents:   UQ_LoraWAN

Committer:
rklaassen
Date:
Tue Jan 15 09:25:58 2019 -0600
Revision:
8:7ba1f2abb8c0
Parent:
3:63d10f2375ea
README test

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 1 #include "mbed.h"
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 2
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 3 /**
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 4 * Class to make wake up a microcontroller from deepsleep using a low-power timer.
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 5 *
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 6 * @code
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 7 * // Depending on the LED connections either the LED is off the 2 seconds
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 8 * // the target spends in deepsleep(), and on for the other second. Or it is inverted
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 9 *
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 10 * #include "mbed.h"
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 11 * #include "WakeUp.h"
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 12 *
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 13 * DigitalOut myled(LED1);
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 14 *
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 15 * int main() {
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 16 * wait(5);
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 17 *
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 18 * //The low-power oscillator can be quite inaccurate on some targets
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 19 * //this function calibrates it against the main clock
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 20 * WakeUp::calibrate();
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 21 *
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 22 * while(1) {
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 23 * //Set LED to zero
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 24 * myled = 0;
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 25 *
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 26 * //Set wakeup time for 2 seconds
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 27 * WakeUp::set_ms(2000);
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 28 *
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 29 * //Enter deepsleep, the program won't go beyond this point until it is woken up
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 30 * deepsleep();
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 31 *
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 32 * //Set LED for 1 second to one
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 33 * myled = 1;
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 34 * wait(1);
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 35 * }
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 36 * }
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 37 * @endcode
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 38 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 39 class WakeUp
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 40 {
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 41 public:
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 42 /**
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 43 * Set the timeout
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 44 *
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 45 * @param s required time in seconds
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 46 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 47 static void set(uint32_t s) {
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 48 set_ms(1000 * s);
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 49 }
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 50
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 51 /**
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 52 * Set the timeout
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 53 *
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 54 * @param ms required time in milliseconds
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 55 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 56 static void set_ms(uint32_t ms);
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 57
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 58 /**
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 59 * Attach a function to be called after timeout
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 60 *
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 61 * This is optional, if you just want to wake up you
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 62 * do not need to attach a function.
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 63 *
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 64 * Important: Many targets will run the wake-up routine
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 65 * at reduced clock speed, afterwards clock speed is restored.
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 66 * This means that clock speed dependent functions, such as printf
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 67 * might end up distorted.
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 68 *
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 69 * Also supports normal way to attach member functions
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 70 * (not documented for simplicity)
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 71 *
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 72 * @param *function function to call
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 73 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 74 static void attach(void (*function)(void)) {
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 75 callback.attach(function);
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 76 }
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 77
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 78 template<typename T>
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 79 static void attach(T *object, void (T::*member)(void)) {
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 80 callback.attach(object, member);
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 81 }
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 82
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 83 /**
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 84 * Calibrate the timer
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 85 *
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 86 * Some of the low-power timers have very bad accuracy.
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 87 * This function calibrates it against the main timer.
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 88 *
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 89 * Warning: Blocks for 100ms!
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 90 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 91 static void calibrate(void);
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 92
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 93
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 94 private:
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 95 static FunctionPointer callback;
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 96 static void irq_handler(void);
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 97 static float cycles_per_ms;
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 98 };