LoRa node acquiring random float value and sending to LoRa Server - Working ok

Fork of SX1276GenericLib by Helmut Tschemernjak

Committer:
Helmut Tschemernjak
Date:
Mon Jul 31 16:11:17 2017 +0200
Revision:
77:7f227a4dffe6
Parent:
75:7330dd86cdea
Child:
78:9d2cc07d9525
Moved SAMD timer and sleep code into new file arduino-d21.cpp

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