LoRa node acquiring analog input and sending to LoRa Server - Working ok

Dependents:   DISCO-L072CZ-LRWAN1_LoRa_node EIoT_LoRa_node_1 EIoT_LoRa_node_2 EIoT_LoRa_node_3

Fork of SX1276GenericLib by Helmut Tschemernjak

Committer:
Helmut Tschemernjak
Date:
Sat Nov 18 13:54:15 2017 +0100
Revision:
97:3d5d489206aa
Parent:
92:ee3de1d353cd
Child:
101:50377edb21c6
Change timeout functions to use a generic TIMER_REF instead of a D21 TCC pointer
Added support for ESP32 SPI, Serial
Added suport for ESP32 64-bit timer

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Helmut Tschemernjak 40:0165543c0986 1 /*
Helmut Tschemernjak 65:b2d98328fcba 2 * The file is Licensed under the Apache License, Version 2.0
Helmut Tschemernjak 46:e78a1d0391ac 3 * (c) 2017 Helmut Tschemernjak
Helmut Tschemernjak 46:e78a1d0391ac 4 * 30826 Garbsen (Hannover) Germany
Helmut Tschemernjak 46:e78a1d0391ac 5 */
Helmut Tschemernjak 40:0165543c0986 6
Helmut Tschemernjak 65:b2d98328fcba 7
Helmut Tschemernjak 65:b2d98328fcba 8
Helmut Tschemernjak 65:b2d98328fcba 9 #ifdef ARDUINO
Helmut Tschemernjak 65:b2d98328fcba 10 #ifndef __ARDUINO_MBED_H__
Helmut Tschemernjak 65:b2d98328fcba 11 #define __ARDUINO_MBED_H__
Helmut Tschemernjak 40:0165543c0986 12
Helmut Tschemernjak 65:b2d98328fcba 13 #include <arduino.h>
Helmut Tschemernjak 65:b2d98328fcba 14 #include "Callback-A.h"
Helmut Tschemernjak 65:b2d98328fcba 15 #include <SPI.h>
Helmut Tschemernjak 65:b2d98328fcba 16 #undef min
Helmut Tschemernjak 65:b2d98328fcba 17 #undef max
Helmut Tschemernjak 65:b2d98328fcba 18 #undef map
Helmut Tschemernjak 40:0165543c0986 19
Helmut Tschemernjak 65:b2d98328fcba 20 typedef int PinName;
Helmut Tschemernjak 65:b2d98328fcba 21 #define NC -1
Helmut Tschemernjak 70:1d496aae2819 22 /* we need to redefine out dprintf because stdio.h uses the same name */
Helmut Tschemernjak 70:1d496aae2819 23 #define dprint dxprintf
Helmut Tschemernjak 69:d440a5b04708 24 #if ARDUINO_SAMD_VARIANT_COMPLIANCE >= 10606
Helmut Tschemernjak 69:d440a5b04708 25 #define MYdigitalPinToInterrupt(x) digitalPinToInterrupt(x)
Helmut Tschemernjak 69:d440a5b04708 26 #else
Helmut Tschemernjak 69:d440a5b04708 27 #define MYdigitalPinToInterrupt(x) (x)
Helmut Tschemernjak 69:d440a5b04708 28 #endif
Helmut Tschemernjak 69:d440a5b04708 29
Helmut Tschemernjak 97:3d5d489206aa 30 #ifdef ARDUINO_ARCH_ESP32
Helmut Tschemernjak 97:3d5d489206aa 31 typedef int TIMER_REF;
Helmut Tschemernjak 97:3d5d489206aa 32 #elif ARDUINO_SAMD_ZERO
Helmut Tschemernjak 97:3d5d489206aa 33 typedef Tcc TIMER_REF;
Helmut Tschemernjak 97:3d5d489206aa 34 #else
Helmut Tschemernjak 97:3d5d489206aa 35 #error "unkown platform"
Helmut Tschemernjak 97:3d5d489206aa 36 #endif
Helmut Tschemernjak 97:3d5d489206aa 37
Helmut Tschemernjak 90:d98572047c9c 38 class DigitalOut;
Helmut Tschemernjak 92:ee3de1d353cd 39 void InitSerial(Stream *serial, int timeout_ms, DigitalOut *led, bool waitForSerial);
Helmut Tschemernjak 75:7330dd86cdea 40 extern Stream *ser;
Helmut Tschemernjak 84:3428e25c7157 41 extern bool SerialUSB_active;
Helmut Tschemernjak 75:7330dd86cdea 42
Helmut Tschemernjak 77:7f227a4dffe6 43 /*
Helmut Tschemernjak 97:3d5d489206aa 44 * Arduino_d21.cpp Arduino_ESP32.cpp
Helmut Tschemernjak 77:7f227a4dffe6 45 */
Helmut Tschemernjak 97:3d5d489206aa 46 extern void startTimer(TIMER_REF *t, uint64_t delay_ns);
Helmut Tschemernjak 97:3d5d489206aa 47 extern void stopTimer(TIMER_REF *t);
Helmut Tschemernjak 97:3d5d489206aa 48 extern TIMER_REF *getTimeoutTimer(void);
Helmut Tschemernjak 77:7f227a4dffe6 49 extern uint64_t ns_getTicker(void);
Helmut Tschemernjak 78:9d2cc07d9525 50 extern int CPUID(uint8_t *buf, int maxSize, uint32_t xorval);
Helmut Tschemernjak 77:7f227a4dffe6 51 extern void sleep(void);
Helmut Tschemernjak 77:7f227a4dffe6 52 extern void deepsleep(void);
Helmut Tschemernjak 77:7f227a4dffe6 53
Helmut Tschemernjak 77:7f227a4dffe6 54 #define MAX_TIMEOUTS 10
Helmut Tschemernjak 77:7f227a4dffe6 55 class Timeout;
Helmut Tschemernjak 77:7f227a4dffe6 56 struct TimeoutVector {
Helmut Tschemernjak 77:7f227a4dffe6 57 Timeout *timer;
Helmut Tschemernjak 77:7f227a4dffe6 58 };
Helmut Tschemernjak 77:7f227a4dffe6 59 extern TimeoutVector TimeOuts[];
Helmut Tschemernjak 77:7f227a4dffe6 60
Helmut Tschemernjak 77:7f227a4dffe6 61
Helmut Tschemernjak 77:7f227a4dffe6 62 /*
Helmut Tschemernjak 77:7f227a4dffe6 63 * Arduino-mbed.cpp
Helmut Tschemernjak 77:7f227a4dffe6 64 */
Helmut Tschemernjak 77:7f227a4dffe6 65 extern uint32_t s_getTicker(void);
Helmut Tschemernjak 77:7f227a4dffe6 66 extern uint32_t ms_getTicker(void);
Helmut Tschemernjak 77:7f227a4dffe6 67 extern uint32_t us_getTicker(void);
Helmut Tschemernjak 80:62f0b027efff 68 extern void wait_ms(uint32_t ms);
Helmut Tschemernjak 77:7f227a4dffe6 69
Helmut Tschemernjak 69:d440a5b04708 70
Helmut Tschemernjak 68:66251038a897 71 enum PinMode {
Helmut Tschemernjak 68:66251038a897 72 PullUp = 1,
Helmut Tschemernjak 68:66251038a897 73 PullDown = 2,
Helmut Tschemernjak 68:66251038a897 74 };
Helmut Tschemernjak 67:d3afd803f40d 75
Helmut Tschemernjak 65:b2d98328fcba 76 class DigitalInOut {
Helmut Tschemernjak 65:b2d98328fcba 77 public:
Helmut Tschemernjak 65:b2d98328fcba 78 DigitalInOut(PinName pin) {
Helmut Tschemernjak 65:b2d98328fcba 79 _gpioPin = pin;
Helmut Tschemernjak 65:b2d98328fcba 80 }
Helmut Tschemernjak 65:b2d98328fcba 81 void write(int value) {
Helmut Tschemernjak 65:b2d98328fcba 82 digitalWrite(_gpioPin, value == 0 ? LOW : HIGH);
Helmut Tschemernjak 65:b2d98328fcba 83 };
Helmut Tschemernjak 46:e78a1d0391ac 84
Helmut Tschemernjak 65:b2d98328fcba 85 void output() {
Helmut Tschemernjak 65:b2d98328fcba 86 pinMode(_gpioPin, OUTPUT);
Helmut Tschemernjak 65:b2d98328fcba 87 };
Helmut Tschemernjak 46:e78a1d0391ac 88
Helmut Tschemernjak 65:b2d98328fcba 89 void input() {
Helmut Tschemernjak 65:b2d98328fcba 90 pinMode(_gpioPin, INPUT);
Helmut Tschemernjak 65:b2d98328fcba 91 };
Helmut Tschemernjak 46:e78a1d0391ac 92
Helmut Tschemernjak 68:66251038a897 93 void mode(PinMode pull) {
Helmut Tschemernjak 68:66251038a897 94 switch(pull) {
Helmut Tschemernjak 68:66251038a897 95 case PullUp:
Helmut Tschemernjak 68:66251038a897 96 pinMode(_gpioPin, INPUT_PULLUP);
Helmut Tschemernjak 68:66251038a897 97 break;
Helmut Tschemernjak 68:66251038a897 98 case PullDown:
Helmut Tschemernjak 68:66251038a897 99 pinMode(_gpioPin, INPUT_PULLDOWN);
Helmut Tschemernjak 68:66251038a897 100 break;
Helmut Tschemernjak 68:66251038a897 101 }
Helmut Tschemernjak 68:66251038a897 102 }
Helmut Tschemernjak 68:66251038a897 103
Helmut Tschemernjak 65:b2d98328fcba 104 int read() {
Helmut Tschemernjak 65:b2d98328fcba 105 if (digitalRead(_gpioPin) == HIGH)
Helmut Tschemernjak 65:b2d98328fcba 106 return 1;
Helmut Tschemernjak 65:b2d98328fcba 107 else
Helmut Tschemernjak 65:b2d98328fcba 108 return 0;
Helmut Tschemernjak 65:b2d98328fcba 109 };
Helmut Tschemernjak 65:b2d98328fcba 110 operator int() {
Helmut Tschemernjak 65:b2d98328fcba 111 return read();
Helmut Tschemernjak 65:b2d98328fcba 112 };
Helmut Tschemernjak 46:e78a1d0391ac 113
Helmut Tschemernjak 65:b2d98328fcba 114 DigitalInOut& operator= (int value) {
Helmut Tschemernjak 65:b2d98328fcba 115 // Underlying write is thread safe
Helmut Tschemernjak 65:b2d98328fcba 116 write(value);
Helmut Tschemernjak 65:b2d98328fcba 117 return *this;
Helmut Tschemernjak 65:b2d98328fcba 118 }
Helmut Tschemernjak 46:e78a1d0391ac 119
Helmut Tschemernjak 65:b2d98328fcba 120 DigitalInOut& operator= (DigitalInOut& rhs) {
Helmut Tschemernjak 65:b2d98328fcba 121 write(rhs.read());
Helmut Tschemernjak 65:b2d98328fcba 122 return *this;
Helmut Tschemernjak 65:b2d98328fcba 123 }
Helmut Tschemernjak 46:e78a1d0391ac 124
Helmut Tschemernjak 46:e78a1d0391ac 125 private:
Helmut Tschemernjak 65:b2d98328fcba 126 int _gpioPin;
Helmut Tschemernjak 65:b2d98328fcba 127 };
Helmut Tschemernjak 65:b2d98328fcba 128
Helmut Tschemernjak 65:b2d98328fcba 129 class DigitalOut : public DigitalInOut {
Helmut Tschemernjak 65:b2d98328fcba 130 public:
Helmut Tschemernjak 46:e78a1d0391ac 131
Helmut Tschemernjak 65:b2d98328fcba 132 DigitalOut(PinName pin) : DigitalInOut(pin) {
Helmut Tschemernjak 65:b2d98328fcba 133 output();
Helmut Tschemernjak 65:b2d98328fcba 134 }
Helmut Tschemernjak 46:e78a1d0391ac 135
Helmut Tschemernjak 65:b2d98328fcba 136 DigitalOut& operator= (int value) {
Helmut Tschemernjak 65:b2d98328fcba 137 write(value);
Helmut Tschemernjak 65:b2d98328fcba 138 return *this;
Helmut Tschemernjak 65:b2d98328fcba 139 }
Helmut Tschemernjak 46:e78a1d0391ac 140
Helmut Tschemernjak 65:b2d98328fcba 141 };
Helmut Tschemernjak 65:b2d98328fcba 142
Helmut Tschemernjak 65:b2d98328fcba 143 class DigitalIn : public DigitalInOut {
Helmut Tschemernjak 65:b2d98328fcba 144 public:
Helmut Tschemernjak 46:e78a1d0391ac 145
Helmut Tschemernjak 65:b2d98328fcba 146 DigitalIn(PinName pin) : DigitalInOut(pin) {
Helmut Tschemernjak 65:b2d98328fcba 147 input();
Helmut Tschemernjak 65:b2d98328fcba 148 }
Helmut Tschemernjak 65:b2d98328fcba 149 };
Helmut Tschemernjak 65:b2d98328fcba 150
Helmut Tschemernjak 65:b2d98328fcba 151 class XSPI {
Helmut Tschemernjak 65:b2d98328fcba 152 public:
Helmut Tschemernjak 65:b2d98328fcba 153 XSPI(PinName mosi, PinName miso, PinName sclk) {
Helmut Tschemernjak 65:b2d98328fcba 154 _mosi = mosi;
Helmut Tschemernjak 65:b2d98328fcba 155 _miso = miso;
Helmut Tschemernjak 65:b2d98328fcba 156 _sclk = sclk;
Helmut Tschemernjak 97:3d5d489206aa 157 #ifdef ARDUINO_ARCH_ESP32 // TODO
Helmut Tschemernjak 97:3d5d489206aa 158 if (1)
Helmut Tschemernjak 97:3d5d489206aa 159 _spi = &SPI;
Helmut Tschemernjak 97:3d5d489206aa 160 #elif defined (ARDUINO_SAMD_ZERO)
Helmut Tschemernjak 65:b2d98328fcba 161 if (mosi == PIN_SPI_MOSI && miso == PIN_SPI_MISO && sclk == PIN_SPI_SCK)
Helmut Tschemernjak 65:b2d98328fcba 162 _spi = &SPI;
Helmut Tschemernjak 65:b2d98328fcba 163 #if SPI_INTERFACES_COUNT > 1
Helmut Tschemernjak 65:b2d98328fcba 164 else if (mosi == PIN_SPI1_MOSI && miso == PIN_SPI1_MISO && sclk == PIN_SPI1_SCK)
Helmut Tschemernjak 65:b2d98328fcba 165 _spi = &SPI1;
Helmut Tschemernjak 65:b2d98328fcba 166 #endif
Helmut Tschemernjak 65:b2d98328fcba 167 #if SPI_INTERFACES_COUNT > 2
Helmut Tschemernjak 65:b2d98328fcba 168 else if (mosi == PIN_SPI2_MOSI && miso == PIN_SPI2_MISO && sclk == PIN_SPI2_SCK)
Helmut Tschemernjak 65:b2d98328fcba 169 _spi = &SPI2;
Helmut Tschemernjak 65:b2d98328fcba 170 #endif
Helmut Tschemernjak 97:3d5d489206aa 171 #endif
Helmut Tschemernjak 65:b2d98328fcba 172 else {
Helmut Tschemernjak 65:b2d98328fcba 173 _spi = NULL;
Helmut Tschemernjak 65:b2d98328fcba 174 return;
Helmut Tschemernjak 65:b2d98328fcba 175 }
Helmut Tschemernjak 65:b2d98328fcba 176 _hz = 1000000;
Helmut Tschemernjak 65:b2d98328fcba 177 _mode = SPI_MODE0;
Helmut Tschemernjak 65:b2d98328fcba 178 _spi->beginTransaction(SPISettings(_hz, MSBFIRST, _mode));
Helmut Tschemernjak 69:d440a5b04708 179 }
Helmut Tschemernjak 69:d440a5b04708 180 ~XSPI() {
Helmut Tschemernjak 65:b2d98328fcba 181 _spi->endTransaction();
Helmut Tschemernjak 69:d440a5b04708 182 };
Helmut Tschemernjak 46:e78a1d0391ac 183
Helmut Tschemernjak 65:b2d98328fcba 184 void format(int bits, int mode = 0) {
Helmut Tschemernjak 65:b2d98328fcba 185 if (mode == 0)
Helmut Tschemernjak 65:b2d98328fcba 186 _mode = SPI_MODE0;
Helmut Tschemernjak 65:b2d98328fcba 187 else if (mode == 1)
Helmut Tschemernjak 65:b2d98328fcba 188 _mode = SPI_MODE1;
Helmut Tschemernjak 65:b2d98328fcba 189 else if (mode == 2)
Helmut Tschemernjak 65:b2d98328fcba 190 _mode = SPI_MODE2;
Helmut Tschemernjak 65:b2d98328fcba 191 else if (mode == 3)
Helmut Tschemernjak 65:b2d98328fcba 192 _mode = SPI_MODE3;
Helmut Tschemernjak 65:b2d98328fcba 193 else
Helmut Tschemernjak 65:b2d98328fcba 194 _mode = SPI_MODE0;
Helmut Tschemernjak 65:b2d98328fcba 195 _bits = bits;
Helmut Tschemernjak 69:d440a5b04708 196 _spi->endTransaction();
Helmut Tschemernjak 65:b2d98328fcba 197 _spi->beginTransaction(SPISettings(_hz, MSBFIRST, _mode));
Helmut Tschemernjak 65:b2d98328fcba 198 }
Helmut Tschemernjak 65:b2d98328fcba 199 void frequency(int hz) {
Helmut Tschemernjak 65:b2d98328fcba 200 _hz = hz;
Helmut Tschemernjak 69:d440a5b04708 201 _spi->endTransaction();
Helmut Tschemernjak 65:b2d98328fcba 202 _spi->beginTransaction(SPISettings(_hz, MSBFIRST, _mode));
Helmut Tschemernjak 65:b2d98328fcba 203 }
Helmut Tschemernjak 46:e78a1d0391ac 204
Helmut Tschemernjak 65:b2d98328fcba 205 int write(int value) {
Helmut Tschemernjak 65:b2d98328fcba 206 int ret = _spi->transfer(value);
Helmut Tschemernjak 65:b2d98328fcba 207 return ret;
Helmut Tschemernjak 65:b2d98328fcba 208 }
Helmut Tschemernjak 61:08b50780eb91 209
Helmut Tschemernjak 65:b2d98328fcba 210 private:
Helmut Tschemernjak 65:b2d98328fcba 211 SPIClass *_spi;
Helmut Tschemernjak 65:b2d98328fcba 212 int _hz;
Helmut Tschemernjak 65:b2d98328fcba 213 int _mode;
Helmut Tschemernjak 65:b2d98328fcba 214 int _bits;
Helmut Tschemernjak 65:b2d98328fcba 215 int _mosi, _miso, _sclk;
Helmut Tschemernjak 46:e78a1d0391ac 216 };
Helmut Tschemernjak 40:0165543c0986 217
Helmut Tschemernjak 65:b2d98328fcba 218 class InterruptIn {
Helmut Tschemernjak 65:b2d98328fcba 219 public:
Helmut Tschemernjak 65:b2d98328fcba 220 static void donothing(void) {
Helmut Tschemernjak 65:b2d98328fcba 221 }
Helmut Tschemernjak 65:b2d98328fcba 222
Helmut Tschemernjak 65:b2d98328fcba 223 InterruptIn(PinName pin) : _func() {
Helmut Tschemernjak 65:b2d98328fcba 224 _gpioPin = pin;
Helmut Tschemernjak 65:b2d98328fcba 225 _func = InterruptIn::donothing;
Helmut Tschemernjak 65:b2d98328fcba 226 pinMode(_gpioPin, INPUT);
Helmut Tschemernjak 65:b2d98328fcba 227 }
Helmut Tschemernjak 65:b2d98328fcba 228
Helmut Tschemernjak 65:b2d98328fcba 229 ~InterruptIn() {
Helmut Tschemernjak 69:d440a5b04708 230 detachInterrupt(MYdigitalPinToInterrupt(_gpioPin));
Helmut Tschemernjak 65:b2d98328fcba 231 };
Helmut Tschemernjak 65:b2d98328fcba 232
Helmut Tschemernjak 65:b2d98328fcba 233 static void _irq_handler(InterruptIn *id) {
Helmut Tschemernjak 65:b2d98328fcba 234 if (id)
Helmut Tschemernjak 65:b2d98328fcba 235 id->_func();
Helmut Tschemernjak 65:b2d98328fcba 236 }
Helmut Tschemernjak 65:b2d98328fcba 237
Helmut Tschemernjak 65:b2d98328fcba 238 void rise(Callback<void()> func);
Helmut Tschemernjak 65:b2d98328fcba 239
Helmut Tschemernjak 65:b2d98328fcba 240 void fall(Callback<void()> func);
Helmut Tschemernjak 65:b2d98328fcba 241
Helmut Tschemernjak 88:d120930aeb13 242 void high(Callback<void()> func);
Helmut Tschemernjak 88:d120930aeb13 243
Helmut Tschemernjak 88:d120930aeb13 244 void low(Callback<void()> func);
Helmut Tschemernjak 88:d120930aeb13 245
Helmut Tschemernjak 69:d440a5b04708 246 void mode(PinMode pull) {
Helmut Tschemernjak 69:d440a5b04708 247 switch(pull) {
Helmut Tschemernjak 69:d440a5b04708 248 case PullUp:
Helmut Tschemernjak 69:d440a5b04708 249 pinMode(_gpioPin, INPUT_PULLUP);
Helmut Tschemernjak 69:d440a5b04708 250 break;
Helmut Tschemernjak 69:d440a5b04708 251 case PullDown:
Helmut Tschemernjak 69:d440a5b04708 252 pinMode(_gpioPin, INPUT_PULLDOWN);
Helmut Tschemernjak 69:d440a5b04708 253 break;
Helmut Tschemernjak 69:d440a5b04708 254 }
Helmut Tschemernjak 69:d440a5b04708 255 }
Helmut Tschemernjak 92:ee3de1d353cd 256 int read () {
Helmut Tschemernjak 92:ee3de1d353cd 257 if (digitalRead(_gpioPin) == HIGH)
Helmut Tschemernjak 92:ee3de1d353cd 258 return 0;
Helmut Tschemernjak 92:ee3de1d353cd 259 else
Helmut Tschemernjak 92:ee3de1d353cd 260 return 1;
Helmut Tschemernjak 92:ee3de1d353cd 261 }
Helmut Tschemernjak 65:b2d98328fcba 262 private:
Helmut Tschemernjak 65:b2d98328fcba 263 int _gpioPin;
Helmut Tschemernjak 65:b2d98328fcba 264 Callback<void()> _func;
Helmut Tschemernjak 65:b2d98328fcba 265 };
Helmut Tschemernjak 65:b2d98328fcba 266
Helmut Tschemernjak 67:d3afd803f40d 267
Helmut Tschemernjak 66:fbb2da34bd9a 268
Helmut Tschemernjak 65:b2d98328fcba 269 class Timer {
Helmut Tschemernjak 65:b2d98328fcba 270 public:
Helmut Tschemernjak 65:b2d98328fcba 271 void start(void) {
Helmut Tschemernjak 67:d3afd803f40d 272 _time = ns_getTicker();
Helmut Tschemernjak 67:d3afd803f40d 273 }
Helmut Tschemernjak 67:d3afd803f40d 274 uint32_t read_sec(void) {
Helmut Tschemernjak 67:d3afd803f40d 275 int64_t n = ns_getTicker() - (uint64_t)_time;
Helmut Tschemernjak 67:d3afd803f40d 276 n /= (uint64_t)1000000000;
Helmut Tschemernjak 67:d3afd803f40d 277 return n;
Helmut Tschemernjak 65:b2d98328fcba 278 }
Helmut Tschemernjak 67:d3afd803f40d 279 uint32_t read_ms(void) {
Helmut Tschemernjak 67:d3afd803f40d 280 int64_t n = ns_getTicker() - (uint64_t)_time;
Helmut Tschemernjak 67:d3afd803f40d 281 n /= (uint64_t)1000000;
Helmut Tschemernjak 67:d3afd803f40d 282 return n;
Helmut Tschemernjak 65:b2d98328fcba 283 }
Helmut Tschemernjak 67:d3afd803f40d 284 uint32_t read_us(void) {
Helmut Tschemernjak 67:d3afd803f40d 285 int64_t n = ns_getTicker() - (uint64_t)_time;
Helmut Tschemernjak 67:d3afd803f40d 286 n /= (uint64_t)1000;
Helmut Tschemernjak 67:d3afd803f40d 287 return n;
Helmut Tschemernjak 65:b2d98328fcba 288 }
Helmut Tschemernjak 65:b2d98328fcba 289 private:
Helmut Tschemernjak 67:d3afd803f40d 290 uint64_t _time;
Helmut Tschemernjak 65:b2d98328fcba 291 };
Helmut Tschemernjak 65:b2d98328fcba 292
Helmut Tschemernjak 65:b2d98328fcba 293
Helmut Tschemernjak 65:b2d98328fcba 294 class Timeout {
Helmut Tschemernjak 65:b2d98328fcba 295 public:
Helmut Tschemernjak 65:b2d98328fcba 296 Timeout() : _func() {
Helmut Tschemernjak 65:b2d98328fcba 297 }
Helmut Tschemernjak 65:b2d98328fcba 298 ~Timeout() {
Helmut Tschemernjak 65:b2d98328fcba 299 detach();
Helmut Tschemernjak 65:b2d98328fcba 300 }
Helmut Tschemernjak 65:b2d98328fcba 301
Helmut Tschemernjak 67:d3afd803f40d 302 void attach_sec(Callback<void()> func, uint32_t secs) {
Helmut Tschemernjak 67:d3afd803f40d 303 if (secs == 0)
Helmut Tschemernjak 67:d3afd803f40d 304 return detach();
Helmut Tschemernjak 67:d3afd803f40d 305 _func = func;
Helmut Tschemernjak 67:d3afd803f40d 306 _timeout = ns_getTicker() + (uint64_t)secs * (uint64_t)1000000000;
Helmut Tschemernjak 67:d3afd803f40d 307 insert();
Helmut Tschemernjak 67:d3afd803f40d 308 restart();
Helmut Tschemernjak 67:d3afd803f40d 309 }
Helmut Tschemernjak 67:d3afd803f40d 310
Helmut Tschemernjak 67:d3afd803f40d 311 void attach(Callback<void()> func, uint32_t msecs) {
Helmut Tschemernjak 65:b2d98328fcba 312 if (msecs == 0)
Helmut Tschemernjak 65:b2d98328fcba 313 return detach();
Helmut Tschemernjak 65:b2d98328fcba 314 _func = func;
Helmut Tschemernjak 67:d3afd803f40d 315 _timeout = ns_getTicker() + (uint64_t)msecs * (uint64_t)1000000;
Helmut Tschemernjak 65:b2d98328fcba 316 insert();
Helmut Tschemernjak 65:b2d98328fcba 317 restart();
Helmut Tschemernjak 65:b2d98328fcba 318 }
Helmut Tschemernjak 65:b2d98328fcba 319
Helmut Tschemernjak 65:b2d98328fcba 320 void attach_us(Callback<void()> func, long usecs) {
Helmut Tschemernjak 65:b2d98328fcba 321 if (usecs == 0)
Helmut Tschemernjak 65:b2d98328fcba 322 return detach();
Helmut Tschemernjak 65:b2d98328fcba 323 _func = func;
Helmut Tschemernjak 67:d3afd803f40d 324 _timeout = ns_getTicker() + (uint64_t)usecs * (uint64_t)1000;
Helmut Tschemernjak 65:b2d98328fcba 325 insert();
Helmut Tschemernjak 65:b2d98328fcba 326 restart();
Helmut Tschemernjak 65:b2d98328fcba 327 }
Helmut Tschemernjak 65:b2d98328fcba 328
Helmut Tschemernjak 67:d3afd803f40d 329 void detach(void) {
Helmut Tschemernjak 65:b2d98328fcba 330 _func = NULL;
Helmut Tschemernjak 65:b2d98328fcba 331 remove();
Helmut Tschemernjak 65:b2d98328fcba 332 restart();
Helmut Tschemernjak 65:b2d98328fcba 333 }
Helmut Tschemernjak 65:b2d98328fcba 334
Helmut Tschemernjak 65:b2d98328fcba 335 static void _irq_handler(Timeout *tp) {
Helmut Tschemernjak 65:b2d98328fcba 336 if (tp) {
Helmut Tschemernjak 65:b2d98328fcba 337 tp->_func();
Helmut Tschemernjak 65:b2d98328fcba 338 }
Helmut Tschemernjak 65:b2d98328fcba 339 }
Helmut Tschemernjak 65:b2d98328fcba 340
Helmut Tschemernjak 67:d3afd803f40d 341 static void restart(void);
Helmut Tschemernjak 67:d3afd803f40d 342 uint64_t _timeout; // in ns this lasts for 539 years.
Helmut Tschemernjak 65:b2d98328fcba 343 protected:
Helmut Tschemernjak 65:b2d98328fcba 344 void insert(void);
Helmut Tschemernjak 65:b2d98328fcba 345 void remove(void);
Helmut Tschemernjak 65:b2d98328fcba 346 private:
Helmut Tschemernjak 65:b2d98328fcba 347 Callback<void()> _func;
Helmut Tschemernjak 65:b2d98328fcba 348 };
Helmut Tschemernjak 65:b2d98328fcba 349
Helmut Tschemernjak 65:b2d98328fcba 350 #endif // __ARDUINO_MBED_H__
Helmut Tschemernjak 65:b2d98328fcba 351
Helmut Tschemernjak 40:0165543c0986 352 #endif // ARDUINO