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:
Sun Nov 19 17:51:27 2017 +0100
Revision:
101:50377edb21c6
Parent:
97:3d5d489206aa
Child:
105:6e6d141c3da8
Added a feature to preset the ns_ticker start value

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