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:
Wed Nov 22 12:14:00 2017 +0100
Revision:
105:6e6d141c3da8
Parent:
101:50377edb21c6
Moved ESP32 helper functions into arduino-esp32.cpp
Allow to change MAX_TIMEOUTS without need to change
custom d21 and ESP32 assembler files

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