us915 ch 9 20dbm
Dependents: DISCO-L072CZ-LRWAN1_LoRa_PingPong
Fork of SX1276GenericLib by
Arduino-mbed-APIs/arduino-mbed.h@84:3428e25c7157, 2017-08-11 (annotated)
- Committer:
- Helmut Tschemernjak
- Date:
- Fri Aug 11 15:11:08 2017 +0200
- Revision:
- 84:3428e25c7157
- Parent:
- 80:62f0b027efff
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?
User | Revision | Line number | New 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 |