Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of SX1276GenericLib by
Arduino-mbed-APIs/arduino-mbed.h@73:23cc8ba412e0, 2017-07-23 (annotated)
- Committer:
- Helmut Tschemernjak
- Date:
- Sun Jul 23 18:03:14 2017 +0200
- Revision:
- 73:23cc8ba412e0
- Parent:
- 71:7067e67902a8
- Child:
- 75:7330dd86cdea
Backup
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 | 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 | 69:d440a5b04708 | 31 | |
Helmut Tschemernjak | 68:66251038a897 | 32 | enum PinMode { |
Helmut Tschemernjak | 68:66251038a897 | 33 | PullUp = 1, |
Helmut Tschemernjak | 68:66251038a897 | 34 | PullDown = 2, |
Helmut Tschemernjak | 68:66251038a897 | 35 | }; |
Helmut Tschemernjak | 67:d3afd803f40d | 36 | |
Helmut Tschemernjak | 65:b2d98328fcba | 37 | class DigitalInOut { |
Helmut Tschemernjak | 65:b2d98328fcba | 38 | public: |
Helmut Tschemernjak | 65:b2d98328fcba | 39 | DigitalInOut(PinName pin) { |
Helmut Tschemernjak | 65:b2d98328fcba | 40 | _gpioPin = pin; |
Helmut Tschemernjak | 65:b2d98328fcba | 41 | } |
Helmut Tschemernjak | 65:b2d98328fcba | 42 | void write(int value) { |
Helmut Tschemernjak | 65:b2d98328fcba | 43 | digitalWrite(_gpioPin, value == 0 ? LOW : HIGH); |
Helmut Tschemernjak | 65:b2d98328fcba | 44 | }; |
Helmut Tschemernjak | 46:e78a1d0391ac | 45 | |
Helmut Tschemernjak | 65:b2d98328fcba | 46 | void output() { |
Helmut Tschemernjak | 65:b2d98328fcba | 47 | pinMode(_gpioPin, OUTPUT); |
Helmut Tschemernjak | 65:b2d98328fcba | 48 | }; |
Helmut Tschemernjak | 46:e78a1d0391ac | 49 | |
Helmut Tschemernjak | 65:b2d98328fcba | 50 | void input() { |
Helmut Tschemernjak | 65:b2d98328fcba | 51 | pinMode(_gpioPin, INPUT); |
Helmut Tschemernjak | 65:b2d98328fcba | 52 | }; |
Helmut Tschemernjak | 46:e78a1d0391ac | 53 | |
Helmut Tschemernjak | 68:66251038a897 | 54 | void mode(PinMode pull) { |
Helmut Tschemernjak | 68:66251038a897 | 55 | switch(pull) { |
Helmut Tschemernjak | 68:66251038a897 | 56 | case PullUp: |
Helmut Tschemernjak | 68:66251038a897 | 57 | pinMode(_gpioPin, INPUT_PULLUP); |
Helmut Tschemernjak | 68:66251038a897 | 58 | break; |
Helmut Tschemernjak | 68:66251038a897 | 59 | case PullDown: |
Helmut Tschemernjak | 68:66251038a897 | 60 | pinMode(_gpioPin, INPUT_PULLDOWN); |
Helmut Tschemernjak | 68:66251038a897 | 61 | break; |
Helmut Tschemernjak | 68:66251038a897 | 62 | } |
Helmut Tschemernjak | 68:66251038a897 | 63 | } |
Helmut Tschemernjak | 68:66251038a897 | 64 | |
Helmut Tschemernjak | 65:b2d98328fcba | 65 | int read() { |
Helmut Tschemernjak | 65:b2d98328fcba | 66 | if (digitalRead(_gpioPin) == HIGH) |
Helmut Tschemernjak | 65:b2d98328fcba | 67 | return 1; |
Helmut Tschemernjak | 65:b2d98328fcba | 68 | else |
Helmut Tschemernjak | 65:b2d98328fcba | 69 | return 0; |
Helmut Tschemernjak | 65:b2d98328fcba | 70 | }; |
Helmut Tschemernjak | 65:b2d98328fcba | 71 | operator int() { |
Helmut Tschemernjak | 65:b2d98328fcba | 72 | return read(); |
Helmut Tschemernjak | 65:b2d98328fcba | 73 | }; |
Helmut Tschemernjak | 46:e78a1d0391ac | 74 | |
Helmut Tschemernjak | 65:b2d98328fcba | 75 | DigitalInOut& operator= (int value) { |
Helmut Tschemernjak | 65:b2d98328fcba | 76 | // Underlying write is thread safe |
Helmut Tschemernjak | 65:b2d98328fcba | 77 | write(value); |
Helmut Tschemernjak | 65:b2d98328fcba | 78 | return *this; |
Helmut Tschemernjak | 65:b2d98328fcba | 79 | } |
Helmut Tschemernjak | 46:e78a1d0391ac | 80 | |
Helmut Tschemernjak | 65:b2d98328fcba | 81 | DigitalInOut& operator= (DigitalInOut& rhs) { |
Helmut Tschemernjak | 65:b2d98328fcba | 82 | write(rhs.read()); |
Helmut Tschemernjak | 65:b2d98328fcba | 83 | return *this; |
Helmut Tschemernjak | 65:b2d98328fcba | 84 | } |
Helmut Tschemernjak | 46:e78a1d0391ac | 85 | |
Helmut Tschemernjak | 46:e78a1d0391ac | 86 | private: |
Helmut Tschemernjak | 65:b2d98328fcba | 87 | int _gpioPin; |
Helmut Tschemernjak | 65:b2d98328fcba | 88 | }; |
Helmut Tschemernjak | 65:b2d98328fcba | 89 | |
Helmut Tschemernjak | 65:b2d98328fcba | 90 | class DigitalOut : public DigitalInOut { |
Helmut Tschemernjak | 65:b2d98328fcba | 91 | public: |
Helmut Tschemernjak | 46:e78a1d0391ac | 92 | |
Helmut Tschemernjak | 65:b2d98328fcba | 93 | DigitalOut(PinName pin) : DigitalInOut(pin) { |
Helmut Tschemernjak | 65:b2d98328fcba | 94 | output(); |
Helmut Tschemernjak | 65:b2d98328fcba | 95 | } |
Helmut Tschemernjak | 46:e78a1d0391ac | 96 | |
Helmut Tschemernjak | 65:b2d98328fcba | 97 | DigitalOut& operator= (int value) { |
Helmut Tschemernjak | 65:b2d98328fcba | 98 | write(value); |
Helmut Tschemernjak | 65:b2d98328fcba | 99 | return *this; |
Helmut Tschemernjak | 65:b2d98328fcba | 100 | } |
Helmut Tschemernjak | 46:e78a1d0391ac | 101 | |
Helmut Tschemernjak | 65:b2d98328fcba | 102 | }; |
Helmut Tschemernjak | 65:b2d98328fcba | 103 | |
Helmut Tschemernjak | 65:b2d98328fcba | 104 | class DigitalIn : public DigitalInOut { |
Helmut Tschemernjak | 65:b2d98328fcba | 105 | public: |
Helmut Tschemernjak | 46:e78a1d0391ac | 106 | |
Helmut Tschemernjak | 65:b2d98328fcba | 107 | DigitalIn(PinName pin) : DigitalInOut(pin) { |
Helmut Tschemernjak | 65:b2d98328fcba | 108 | input(); |
Helmut Tschemernjak | 65:b2d98328fcba | 109 | } |
Helmut Tschemernjak | 65:b2d98328fcba | 110 | }; |
Helmut Tschemernjak | 65:b2d98328fcba | 111 | |
Helmut Tschemernjak | 65:b2d98328fcba | 112 | class XSPI { |
Helmut Tschemernjak | 65:b2d98328fcba | 113 | public: |
Helmut Tschemernjak | 65:b2d98328fcba | 114 | XSPI(PinName mosi, PinName miso, PinName sclk) { |
Helmut Tschemernjak | 65:b2d98328fcba | 115 | _mosi = mosi; |
Helmut Tschemernjak | 65:b2d98328fcba | 116 | _miso = miso; |
Helmut Tschemernjak | 65:b2d98328fcba | 117 | _sclk = sclk; |
Helmut Tschemernjak | 65:b2d98328fcba | 118 | if (mosi == PIN_SPI_MOSI && miso == PIN_SPI_MISO && sclk == PIN_SPI_SCK) |
Helmut Tschemernjak | 65:b2d98328fcba | 119 | _spi = &SPI; |
Helmut Tschemernjak | 65:b2d98328fcba | 120 | #if SPI_INTERFACES_COUNT > 1 |
Helmut Tschemernjak | 65:b2d98328fcba | 121 | else if (mosi == PIN_SPI1_MOSI && miso == PIN_SPI1_MISO && sclk == PIN_SPI1_SCK) |
Helmut Tschemernjak | 65:b2d98328fcba | 122 | _spi = &SPI1; |
Helmut Tschemernjak | 65:b2d98328fcba | 123 | #endif |
Helmut Tschemernjak | 65:b2d98328fcba | 124 | #if SPI_INTERFACES_COUNT > 2 |
Helmut Tschemernjak | 65:b2d98328fcba | 125 | else if (mosi == PIN_SPI2_MOSI && miso == PIN_SPI2_MISO && sclk == PIN_SPI2_SCK) |
Helmut Tschemernjak | 65:b2d98328fcba | 126 | _spi = &SPI2; |
Helmut Tschemernjak | 65:b2d98328fcba | 127 | #endif |
Helmut Tschemernjak | 65:b2d98328fcba | 128 | else { |
Helmut Tschemernjak | 65:b2d98328fcba | 129 | _spi = NULL; |
Helmut Tschemernjak | 65:b2d98328fcba | 130 | return; |
Helmut Tschemernjak | 65:b2d98328fcba | 131 | } |
Helmut Tschemernjak | 65:b2d98328fcba | 132 | _hz = 1000000; |
Helmut Tschemernjak | 65:b2d98328fcba | 133 | _mode = SPI_MODE0; |
Helmut Tschemernjak | 65:b2d98328fcba | 134 | _spi->beginTransaction(SPISettings(_hz, MSBFIRST, _mode)); |
Helmut Tschemernjak | 69:d440a5b04708 | 135 | } |
Helmut Tschemernjak | 69:d440a5b04708 | 136 | ~XSPI() { |
Helmut Tschemernjak | 65:b2d98328fcba | 137 | _spi->endTransaction(); |
Helmut Tschemernjak | 69:d440a5b04708 | 138 | }; |
Helmut Tschemernjak | 46:e78a1d0391ac | 139 | |
Helmut Tschemernjak | 65:b2d98328fcba | 140 | void format(int bits, int mode = 0) { |
Helmut Tschemernjak | 65:b2d98328fcba | 141 | if (mode == 0) |
Helmut Tschemernjak | 65:b2d98328fcba | 142 | _mode = SPI_MODE0; |
Helmut Tschemernjak | 65:b2d98328fcba | 143 | else if (mode == 1) |
Helmut Tschemernjak | 65:b2d98328fcba | 144 | _mode = SPI_MODE1; |
Helmut Tschemernjak | 65:b2d98328fcba | 145 | else if (mode == 2) |
Helmut Tschemernjak | 65:b2d98328fcba | 146 | _mode = SPI_MODE2; |
Helmut Tschemernjak | 65:b2d98328fcba | 147 | else if (mode == 3) |
Helmut Tschemernjak | 65:b2d98328fcba | 148 | _mode = SPI_MODE3; |
Helmut Tschemernjak | 65:b2d98328fcba | 149 | else |
Helmut Tschemernjak | 65:b2d98328fcba | 150 | _mode = SPI_MODE0; |
Helmut Tschemernjak | 65:b2d98328fcba | 151 | _bits = bits; |
Helmut Tschemernjak | 69:d440a5b04708 | 152 | _spi->endTransaction(); |
Helmut Tschemernjak | 65:b2d98328fcba | 153 | _spi->beginTransaction(SPISettings(_hz, MSBFIRST, _mode)); |
Helmut Tschemernjak | 65:b2d98328fcba | 154 | } |
Helmut Tschemernjak | 65:b2d98328fcba | 155 | void frequency(int hz) { |
Helmut Tschemernjak | 65:b2d98328fcba | 156 | _hz = hz; |
Helmut Tschemernjak | 69:d440a5b04708 | 157 | _spi->endTransaction(); |
Helmut Tschemernjak | 65:b2d98328fcba | 158 | _spi->beginTransaction(SPISettings(_hz, MSBFIRST, _mode)); |
Helmut Tschemernjak | 65:b2d98328fcba | 159 | } |
Helmut Tschemernjak | 46:e78a1d0391ac | 160 | |
Helmut Tschemernjak | 65:b2d98328fcba | 161 | int write(int value) { |
Helmut Tschemernjak | 65:b2d98328fcba | 162 | int ret = _spi->transfer(value); |
Helmut Tschemernjak | 65:b2d98328fcba | 163 | return ret; |
Helmut Tschemernjak | 65:b2d98328fcba | 164 | } |
Helmut Tschemernjak | 61:08b50780eb91 | 165 | |
Helmut Tschemernjak | 65:b2d98328fcba | 166 | private: |
Helmut Tschemernjak | 65:b2d98328fcba | 167 | SPIClass *_spi; |
Helmut Tschemernjak | 65:b2d98328fcba | 168 | int _hz; |
Helmut Tschemernjak | 65:b2d98328fcba | 169 | int _mode; |
Helmut Tschemernjak | 65:b2d98328fcba | 170 | int _bits; |
Helmut Tschemernjak | 65:b2d98328fcba | 171 | int _mosi, _miso, _sclk; |
Helmut Tschemernjak | 46:e78a1d0391ac | 172 | }; |
Helmut Tschemernjak | 40:0165543c0986 | 173 | |
Helmut Tschemernjak | 65:b2d98328fcba | 174 | class InterruptIn { |
Helmut Tschemernjak | 65:b2d98328fcba | 175 | public: |
Helmut Tschemernjak | 65:b2d98328fcba | 176 | static void donothing(void) { |
Helmut Tschemernjak | 65:b2d98328fcba | 177 | } |
Helmut Tschemernjak | 65:b2d98328fcba | 178 | |
Helmut Tschemernjak | 65:b2d98328fcba | 179 | InterruptIn(PinName pin) : _func() { |
Helmut Tschemernjak | 65:b2d98328fcba | 180 | _gpioPin = pin; |
Helmut Tschemernjak | 65:b2d98328fcba | 181 | _func = InterruptIn::donothing; |
Helmut Tschemernjak | 65:b2d98328fcba | 182 | pinMode(_gpioPin, INPUT); |
Helmut Tschemernjak | 65:b2d98328fcba | 183 | } |
Helmut Tschemernjak | 65:b2d98328fcba | 184 | |
Helmut Tschemernjak | 65:b2d98328fcba | 185 | ~InterruptIn() { |
Helmut Tschemernjak | 69:d440a5b04708 | 186 | detachInterrupt(MYdigitalPinToInterrupt(_gpioPin)); |
Helmut Tschemernjak | 65:b2d98328fcba | 187 | }; |
Helmut Tschemernjak | 65:b2d98328fcba | 188 | |
Helmut Tschemernjak | 65:b2d98328fcba | 189 | static void _irq_handler(InterruptIn *id) { |
Helmut Tschemernjak | 65:b2d98328fcba | 190 | if (id) |
Helmut Tschemernjak | 65:b2d98328fcba | 191 | id->_func(); |
Helmut Tschemernjak | 65:b2d98328fcba | 192 | } |
Helmut Tschemernjak | 65:b2d98328fcba | 193 | |
Helmut Tschemernjak | 65:b2d98328fcba | 194 | void rise(Callback<void()> func); |
Helmut Tschemernjak | 65:b2d98328fcba | 195 | |
Helmut Tschemernjak | 65:b2d98328fcba | 196 | void fall(Callback<void()> func); |
Helmut Tschemernjak | 65:b2d98328fcba | 197 | |
Helmut Tschemernjak | 69:d440a5b04708 | 198 | void mode(PinMode pull) { |
Helmut Tschemernjak | 69:d440a5b04708 | 199 | switch(pull) { |
Helmut Tschemernjak | 69:d440a5b04708 | 200 | case PullUp: |
Helmut Tschemernjak | 69:d440a5b04708 | 201 | pinMode(_gpioPin, INPUT_PULLUP); |
Helmut Tschemernjak | 69:d440a5b04708 | 202 | break; |
Helmut Tschemernjak | 69:d440a5b04708 | 203 | case PullDown: |
Helmut Tschemernjak | 69:d440a5b04708 | 204 | pinMode(_gpioPin, INPUT_PULLDOWN); |
Helmut Tschemernjak | 69:d440a5b04708 | 205 | break; |
Helmut Tschemernjak | 69:d440a5b04708 | 206 | } |
Helmut Tschemernjak | 69:d440a5b04708 | 207 | } |
Helmut Tschemernjak | 65:b2d98328fcba | 208 | private: |
Helmut Tschemernjak | 65:b2d98328fcba | 209 | int _gpioPin; |
Helmut Tschemernjak | 65:b2d98328fcba | 210 | Callback<void()> _func; |
Helmut Tschemernjak | 65:b2d98328fcba | 211 | }; |
Helmut Tschemernjak | 65:b2d98328fcba | 212 | |
Helmut Tschemernjak | 70:1d496aae2819 | 213 | extern uint32_t s_getTicker(void); |
Helmut Tschemernjak | 67:d3afd803f40d | 214 | extern uint32_t ms_getTicker(void); |
Helmut Tschemernjak | 66:fbb2da34bd9a | 215 | extern uint32_t us_getTicker(void); |
Helmut Tschemernjak | 67:d3afd803f40d | 216 | extern uint64_t ns_getTicker(void); |
Helmut Tschemernjak | 67:d3afd803f40d | 217 | extern void sleep(void); |
Helmut Tschemernjak | 67:d3afd803f40d | 218 | extern void deepsleep(void); |
Helmut Tschemernjak | 67:d3afd803f40d | 219 | |
Helmut Tschemernjak | 66:fbb2da34bd9a | 220 | |
Helmut Tschemernjak | 65:b2d98328fcba | 221 | class Timer { |
Helmut Tschemernjak | 65:b2d98328fcba | 222 | public: |
Helmut Tschemernjak | 65:b2d98328fcba | 223 | void start(void) { |
Helmut Tschemernjak | 67:d3afd803f40d | 224 | _time = ns_getTicker(); |
Helmut Tschemernjak | 67:d3afd803f40d | 225 | } |
Helmut Tschemernjak | 67:d3afd803f40d | 226 | uint32_t read_sec(void) { |
Helmut Tschemernjak | 67:d3afd803f40d | 227 | int64_t n = ns_getTicker() - (uint64_t)_time; |
Helmut Tschemernjak | 67:d3afd803f40d | 228 | n /= (uint64_t)1000000000; |
Helmut Tschemernjak | 67:d3afd803f40d | 229 | return n; |
Helmut Tschemernjak | 65:b2d98328fcba | 230 | } |
Helmut Tschemernjak | 67:d3afd803f40d | 231 | uint32_t read_ms(void) { |
Helmut Tschemernjak | 67:d3afd803f40d | 232 | int64_t n = ns_getTicker() - (uint64_t)_time; |
Helmut Tschemernjak | 67:d3afd803f40d | 233 | n /= (uint64_t)1000000; |
Helmut Tschemernjak | 67:d3afd803f40d | 234 | return n; |
Helmut Tschemernjak | 65:b2d98328fcba | 235 | } |
Helmut Tschemernjak | 67:d3afd803f40d | 236 | uint32_t read_us(void) { |
Helmut Tschemernjak | 67:d3afd803f40d | 237 | int64_t n = ns_getTicker() - (uint64_t)_time; |
Helmut Tschemernjak | 67:d3afd803f40d | 238 | n /= (uint64_t)1000; |
Helmut Tschemernjak | 67:d3afd803f40d | 239 | return n; |
Helmut Tschemernjak | 65:b2d98328fcba | 240 | } |
Helmut Tschemernjak | 65:b2d98328fcba | 241 | private: |
Helmut Tschemernjak | 67:d3afd803f40d | 242 | uint64_t _time; |
Helmut Tschemernjak | 65:b2d98328fcba | 243 | }; |
Helmut Tschemernjak | 65:b2d98328fcba | 244 | |
Helmut Tschemernjak | 65:b2d98328fcba | 245 | |
Helmut Tschemernjak | 65:b2d98328fcba | 246 | class Timeout { |
Helmut Tschemernjak | 65:b2d98328fcba | 247 | public: |
Helmut Tschemernjak | 65:b2d98328fcba | 248 | Timeout() : _func() { |
Helmut Tschemernjak | 65:b2d98328fcba | 249 | } |
Helmut Tschemernjak | 65:b2d98328fcba | 250 | ~Timeout() { |
Helmut Tschemernjak | 65:b2d98328fcba | 251 | detach(); |
Helmut Tschemernjak | 65:b2d98328fcba | 252 | } |
Helmut Tschemernjak | 65:b2d98328fcba | 253 | |
Helmut Tschemernjak | 67:d3afd803f40d | 254 | void attach_sec(Callback<void()> func, uint32_t secs) { |
Helmut Tschemernjak | 67:d3afd803f40d | 255 | if (secs == 0) |
Helmut Tschemernjak | 67:d3afd803f40d | 256 | return detach(); |
Helmut Tschemernjak | 67:d3afd803f40d | 257 | _func = func; |
Helmut Tschemernjak | 67:d3afd803f40d | 258 | _timeout = ns_getTicker() + (uint64_t)secs * (uint64_t)1000000000; |
Helmut Tschemernjak | 67:d3afd803f40d | 259 | insert(); |
Helmut Tschemernjak | 67:d3afd803f40d | 260 | restart(); |
Helmut Tschemernjak | 67:d3afd803f40d | 261 | } |
Helmut Tschemernjak | 67:d3afd803f40d | 262 | |
Helmut Tschemernjak | 67:d3afd803f40d | 263 | void attach(Callback<void()> func, uint32_t msecs) { |
Helmut Tschemernjak | 65:b2d98328fcba | 264 | if (msecs == 0) |
Helmut Tschemernjak | 65:b2d98328fcba | 265 | return detach(); |
Helmut Tschemernjak | 65:b2d98328fcba | 266 | _func = func; |
Helmut Tschemernjak | 67:d3afd803f40d | 267 | _timeout = ns_getTicker() + (uint64_t)msecs * (uint64_t)1000000; |
Helmut Tschemernjak | 65:b2d98328fcba | 268 | insert(); |
Helmut Tschemernjak | 65:b2d98328fcba | 269 | restart(); |
Helmut Tschemernjak | 65:b2d98328fcba | 270 | } |
Helmut Tschemernjak | 65:b2d98328fcba | 271 | |
Helmut Tschemernjak | 65:b2d98328fcba | 272 | void attach_us(Callback<void()> func, long usecs) { |
Helmut Tschemernjak | 65:b2d98328fcba | 273 | if (usecs == 0) |
Helmut Tschemernjak | 65:b2d98328fcba | 274 | return detach(); |
Helmut Tschemernjak | 65:b2d98328fcba | 275 | _func = func; |
Helmut Tschemernjak | 67:d3afd803f40d | 276 | _timeout = ns_getTicker() + (uint64_t)usecs * (uint64_t)1000; |
Helmut Tschemernjak | 65:b2d98328fcba | 277 | insert(); |
Helmut Tschemernjak | 65:b2d98328fcba | 278 | restart(); |
Helmut Tschemernjak | 65:b2d98328fcba | 279 | } |
Helmut Tschemernjak | 65:b2d98328fcba | 280 | |
Helmut Tschemernjak | 67:d3afd803f40d | 281 | void detach(void) { |
Helmut Tschemernjak | 65:b2d98328fcba | 282 | _func = NULL; |
Helmut Tschemernjak | 65:b2d98328fcba | 283 | remove(); |
Helmut Tschemernjak | 65:b2d98328fcba | 284 | restart(); |
Helmut Tschemernjak | 65:b2d98328fcba | 285 | } |
Helmut Tschemernjak | 65:b2d98328fcba | 286 | |
Helmut Tschemernjak | 65:b2d98328fcba | 287 | static void _irq_handler(Timeout *tp) { |
Helmut Tschemernjak | 65:b2d98328fcba | 288 | if (tp) { |
Helmut Tschemernjak | 65:b2d98328fcba | 289 | tp->_func(); |
Helmut Tschemernjak | 65:b2d98328fcba | 290 | } |
Helmut Tschemernjak | 65:b2d98328fcba | 291 | } |
Helmut Tschemernjak | 65:b2d98328fcba | 292 | |
Helmut Tschemernjak | 67:d3afd803f40d | 293 | static void restart(void); |
Helmut Tschemernjak | 67:d3afd803f40d | 294 | uint64_t _timeout; // in ns this lasts for 539 years. |
Helmut Tschemernjak | 65:b2d98328fcba | 295 | protected: |
Helmut Tschemernjak | 65:b2d98328fcba | 296 | void insert(void); |
Helmut Tschemernjak | 65:b2d98328fcba | 297 | void remove(void); |
Helmut Tschemernjak | 65:b2d98328fcba | 298 | private: |
Helmut Tschemernjak | 65:b2d98328fcba | 299 | Callback<void()> _func; |
Helmut Tschemernjak | 65:b2d98328fcba | 300 | }; |
Helmut Tschemernjak | 65:b2d98328fcba | 301 | |
Helmut Tschemernjak | 65:b2d98328fcba | 302 | #endif // __ARDUINO_MBED_H__ |
Helmut Tschemernjak | 65:b2d98328fcba | 303 | |
Helmut Tschemernjak | 40:0165543c0986 | 304 | #endif // ARDUINO |