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

Fork of SX1276GenericLib by Helmut Tschemernjak

Committer:
Helmut Tschemernjak
Date:
Fri Aug 11 15:11:08 2017 +0200
Revision:
84:3428e25c7157
Parent:
80:62f0b027efff
Child:
88:d120930aeb13
Modified InitSerial() to check if the USB Serial is active,
turn off USB if no SerialUSB is being in use to save power

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