ST-DEVKIT-LRWAN

Dependents:   DISCO-L072CZ-LRWAN1-base

Fork of SX1276GenericLib by Helmut Tschemernjak

Committer:
Helmut Tschemernjak
Date:
Sun Jul 16 21:25:00 2017 +0200
Revision:
67:d3afd803f40d
Parent:
66:fbb2da34bd9a
Child:
68:66251038a897
added mbed alike Timeout support for Arduino D21.

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 40:0165543c0986 20
Helmut Tschemernjak 65:b2d98328fcba 21 typedef int PinName;
Helmut Tschemernjak 65:b2d98328fcba 22 #define NC -1
Helmut Tschemernjak 65:b2d98328fcba 23 #define wait_ms delay
Helmut Tschemernjak 65:b2d98328fcba 24
Helmut Tschemernjak 67:d3afd803f40d 25
Helmut Tschemernjak 67:d3afd803f40d 26
Helmut Tschemernjak 65:b2d98328fcba 27 class DigitalInOut {
Helmut Tschemernjak 65:b2d98328fcba 28 public:
Helmut Tschemernjak 65:b2d98328fcba 29 DigitalInOut(PinName pin) {
Helmut Tschemernjak 65:b2d98328fcba 30 _gpioPin = pin;
Helmut Tschemernjak 65:b2d98328fcba 31 }
Helmut Tschemernjak 65:b2d98328fcba 32 void write(int value) {
Helmut Tschemernjak 65:b2d98328fcba 33 digitalWrite(_gpioPin, value == 0 ? LOW : HIGH);
Helmut Tschemernjak 65:b2d98328fcba 34 };
Helmut Tschemernjak 46:e78a1d0391ac 35
Helmut Tschemernjak 65:b2d98328fcba 36 void output() {
Helmut Tschemernjak 65:b2d98328fcba 37 pinMode(_gpioPin, OUTPUT);
Helmut Tschemernjak 65:b2d98328fcba 38 };
Helmut Tschemernjak 46:e78a1d0391ac 39
Helmut Tschemernjak 65:b2d98328fcba 40 void input() {
Helmut Tschemernjak 65:b2d98328fcba 41 pinMode(_gpioPin, INPUT);
Helmut Tschemernjak 65:b2d98328fcba 42 };
Helmut Tschemernjak 46:e78a1d0391ac 43
Helmut Tschemernjak 65:b2d98328fcba 44 int read() {
Helmut Tschemernjak 65:b2d98328fcba 45 if (digitalRead(_gpioPin) == HIGH)
Helmut Tschemernjak 65:b2d98328fcba 46 return 1;
Helmut Tschemernjak 65:b2d98328fcba 47 else
Helmut Tschemernjak 65:b2d98328fcba 48 return 0;
Helmut Tschemernjak 65:b2d98328fcba 49 };
Helmut Tschemernjak 65:b2d98328fcba 50 operator int() {
Helmut Tschemernjak 65:b2d98328fcba 51 return read();
Helmut Tschemernjak 65:b2d98328fcba 52 };
Helmut Tschemernjak 46:e78a1d0391ac 53
Helmut Tschemernjak 65:b2d98328fcba 54 DigitalInOut& operator= (int value) {
Helmut Tschemernjak 65:b2d98328fcba 55 // Underlying write is thread safe
Helmut Tschemernjak 65:b2d98328fcba 56 write(value);
Helmut Tschemernjak 65:b2d98328fcba 57 return *this;
Helmut Tschemernjak 65:b2d98328fcba 58 }
Helmut Tschemernjak 46:e78a1d0391ac 59
Helmut Tschemernjak 65:b2d98328fcba 60 DigitalInOut& operator= (DigitalInOut& rhs) {
Helmut Tschemernjak 65:b2d98328fcba 61 write(rhs.read());
Helmut Tschemernjak 65:b2d98328fcba 62 return *this;
Helmut Tschemernjak 65:b2d98328fcba 63 }
Helmut Tschemernjak 46:e78a1d0391ac 64
Helmut Tschemernjak 46:e78a1d0391ac 65 private:
Helmut Tschemernjak 65:b2d98328fcba 66 int _gpioPin;
Helmut Tschemernjak 65:b2d98328fcba 67 };
Helmut Tschemernjak 65:b2d98328fcba 68
Helmut Tschemernjak 65:b2d98328fcba 69 class DigitalOut : public DigitalInOut {
Helmut Tschemernjak 65:b2d98328fcba 70 public:
Helmut Tschemernjak 46:e78a1d0391ac 71
Helmut Tschemernjak 65:b2d98328fcba 72 DigitalOut(PinName pin) : DigitalInOut(pin) {
Helmut Tschemernjak 65:b2d98328fcba 73 output();
Helmut Tschemernjak 65:b2d98328fcba 74 }
Helmut Tschemernjak 46:e78a1d0391ac 75
Helmut Tschemernjak 65:b2d98328fcba 76 DigitalOut& operator= (int value) {
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 };
Helmut Tschemernjak 65:b2d98328fcba 82
Helmut Tschemernjak 65:b2d98328fcba 83 class DigitalIn : public DigitalInOut {
Helmut Tschemernjak 65:b2d98328fcba 84 public:
Helmut Tschemernjak 46:e78a1d0391ac 85
Helmut Tschemernjak 65:b2d98328fcba 86 DigitalIn(PinName pin) : DigitalInOut(pin) {
Helmut Tschemernjak 65:b2d98328fcba 87 input();
Helmut Tschemernjak 65:b2d98328fcba 88 }
Helmut Tschemernjak 65:b2d98328fcba 89 };
Helmut Tschemernjak 65:b2d98328fcba 90
Helmut Tschemernjak 65:b2d98328fcba 91 class XSPI {
Helmut Tschemernjak 65:b2d98328fcba 92 public:
Helmut Tschemernjak 65:b2d98328fcba 93 XSPI(PinName mosi, PinName miso, PinName sclk) {
Helmut Tschemernjak 65:b2d98328fcba 94 _mosi = mosi;
Helmut Tschemernjak 65:b2d98328fcba 95 _miso = miso;
Helmut Tschemernjak 65:b2d98328fcba 96 _sclk = sclk;
Helmut Tschemernjak 65:b2d98328fcba 97 if (mosi == PIN_SPI_MOSI && miso == PIN_SPI_MISO && sclk == PIN_SPI_SCK)
Helmut Tschemernjak 65:b2d98328fcba 98 _spi = &SPI;
Helmut Tschemernjak 65:b2d98328fcba 99 #if SPI_INTERFACES_COUNT > 1
Helmut Tschemernjak 65:b2d98328fcba 100 else if (mosi == PIN_SPI1_MOSI && miso == PIN_SPI1_MISO && sclk == PIN_SPI1_SCK)
Helmut Tschemernjak 65:b2d98328fcba 101 _spi = &SPI1;
Helmut Tschemernjak 65:b2d98328fcba 102 #endif
Helmut Tschemernjak 65:b2d98328fcba 103 #if SPI_INTERFACES_COUNT > 2
Helmut Tschemernjak 65:b2d98328fcba 104 else if (mosi == PIN_SPI2_MOSI && miso == PIN_SPI2_MISO && sclk == PIN_SPI2_SCK)
Helmut Tschemernjak 65:b2d98328fcba 105 _spi = &SPI2;
Helmut Tschemernjak 65:b2d98328fcba 106 #endif
Helmut Tschemernjak 65:b2d98328fcba 107 else {
Helmut Tschemernjak 65:b2d98328fcba 108 _spi = NULL;
Helmut Tschemernjak 65:b2d98328fcba 109 return;
Helmut Tschemernjak 65:b2d98328fcba 110 }
Helmut Tschemernjak 65:b2d98328fcba 111 _hz = 1000000;
Helmut Tschemernjak 65:b2d98328fcba 112 _mode = SPI_MODE0;
Helmut Tschemernjak 65:b2d98328fcba 113 _spi->beginTransaction(SPISettings(_hz, MSBFIRST, _mode));
Helmut Tschemernjak 65:b2d98328fcba 114 _spi->endTransaction();
Helmut Tschemernjak 65:b2d98328fcba 115 }
Helmut Tschemernjak 46:e78a1d0391ac 116
Helmut Tschemernjak 65:b2d98328fcba 117 void format(int bits, int mode = 0) {
Helmut Tschemernjak 65:b2d98328fcba 118 if (mode == 0)
Helmut Tschemernjak 65:b2d98328fcba 119 _mode = SPI_MODE0;
Helmut Tschemernjak 65:b2d98328fcba 120 else if (mode == 1)
Helmut Tschemernjak 65:b2d98328fcba 121 _mode = SPI_MODE1;
Helmut Tschemernjak 65:b2d98328fcba 122 else if (mode == 2)
Helmut Tschemernjak 65:b2d98328fcba 123 _mode = SPI_MODE2;
Helmut Tschemernjak 65:b2d98328fcba 124 else if (mode == 3)
Helmut Tschemernjak 65:b2d98328fcba 125 _mode = SPI_MODE3;
Helmut Tschemernjak 65:b2d98328fcba 126 else
Helmut Tschemernjak 65:b2d98328fcba 127 _mode = SPI_MODE0;
Helmut Tschemernjak 65:b2d98328fcba 128 _bits = bits;
Helmut Tschemernjak 65:b2d98328fcba 129 _spi->beginTransaction(SPISettings(_hz, MSBFIRST, _mode));
Helmut Tschemernjak 65:b2d98328fcba 130 _spi->endTransaction();
Helmut Tschemernjak 65:b2d98328fcba 131 }
Helmut Tschemernjak 65:b2d98328fcba 132 void frequency(int hz) {
Helmut Tschemernjak 65:b2d98328fcba 133 _hz = hz;
Helmut Tschemernjak 65:b2d98328fcba 134 _spi->beginTransaction(SPISettings(_hz, MSBFIRST, _mode));
Helmut Tschemernjak 65:b2d98328fcba 135 _spi->endTransaction();
Helmut Tschemernjak 65:b2d98328fcba 136 }
Helmut Tschemernjak 46:e78a1d0391ac 137
Helmut Tschemernjak 65:b2d98328fcba 138 int write(int value) {
Helmut Tschemernjak 65:b2d98328fcba 139 _spi->beginTransaction(SPISettings(_hz, MSBFIRST, _mode));
Helmut Tschemernjak 65:b2d98328fcba 140 int ret = _spi->transfer(value);
Helmut Tschemernjak 65:b2d98328fcba 141 _spi->endTransaction();
Helmut Tschemernjak 65:b2d98328fcba 142 return ret;
Helmut Tschemernjak 65:b2d98328fcba 143 }
Helmut Tschemernjak 61:08b50780eb91 144
Helmut Tschemernjak 65:b2d98328fcba 145 private:
Helmut Tschemernjak 65:b2d98328fcba 146 SPIClass *_spi;
Helmut Tschemernjak 65:b2d98328fcba 147 int _hz;
Helmut Tschemernjak 65:b2d98328fcba 148 int _mode;
Helmut Tschemernjak 65:b2d98328fcba 149 int _bits;
Helmut Tschemernjak 65:b2d98328fcba 150 int _mosi, _miso, _sclk;
Helmut Tschemernjak 46:e78a1d0391ac 151 };
Helmut Tschemernjak 40:0165543c0986 152
Helmut Tschemernjak 65:b2d98328fcba 153 class InterruptIn {
Helmut Tschemernjak 65:b2d98328fcba 154 public:
Helmut Tschemernjak 65:b2d98328fcba 155 static void donothing(void) {
Helmut Tschemernjak 65:b2d98328fcba 156 }
Helmut Tschemernjak 65:b2d98328fcba 157
Helmut Tschemernjak 65:b2d98328fcba 158 InterruptIn(PinName pin) : _func() {
Helmut Tschemernjak 65:b2d98328fcba 159 _gpioPin = pin;
Helmut Tschemernjak 65:b2d98328fcba 160 _func = InterruptIn::donothing;
Helmut Tschemernjak 65:b2d98328fcba 161 pinMode(_gpioPin, INPUT);
Helmut Tschemernjak 65:b2d98328fcba 162 }
Helmut Tschemernjak 65:b2d98328fcba 163
Helmut Tschemernjak 65:b2d98328fcba 164 ~InterruptIn() {
Helmut Tschemernjak 65:b2d98328fcba 165 detachInterrupt(digitalPinToInterrupt(_gpioPin));
Helmut Tschemernjak 65:b2d98328fcba 166 };
Helmut Tschemernjak 65:b2d98328fcba 167
Helmut Tschemernjak 65:b2d98328fcba 168 static void _irq_handler(InterruptIn *id) {
Helmut Tschemernjak 65:b2d98328fcba 169 if (id)
Helmut Tschemernjak 65:b2d98328fcba 170 id->_func();
Helmut Tschemernjak 65:b2d98328fcba 171 }
Helmut Tschemernjak 65:b2d98328fcba 172
Helmut Tschemernjak 65:b2d98328fcba 173 void rise(Callback<void()> func);
Helmut Tschemernjak 65:b2d98328fcba 174
Helmut Tschemernjak 65:b2d98328fcba 175 void fall(Callback<void()> func);
Helmut Tschemernjak 65:b2d98328fcba 176
Helmut Tschemernjak 65:b2d98328fcba 177 private:
Helmut Tschemernjak 65:b2d98328fcba 178 int _gpioPin;
Helmut Tschemernjak 65:b2d98328fcba 179 Callback<void()> _func;
Helmut Tschemernjak 65:b2d98328fcba 180 };
Helmut Tschemernjak 65:b2d98328fcba 181
Helmut Tschemernjak 67:d3afd803f40d 182 extern uint32_t ms_getTicker(void);
Helmut Tschemernjak 66:fbb2da34bd9a 183 extern uint32_t us_getTicker(void);
Helmut Tschemernjak 67:d3afd803f40d 184 extern uint64_t ns_getTicker(void);
Helmut Tschemernjak 67:d3afd803f40d 185 extern void sleep(void);
Helmut Tschemernjak 67:d3afd803f40d 186 extern void deepsleep(void);
Helmut Tschemernjak 67:d3afd803f40d 187
Helmut Tschemernjak 66:fbb2da34bd9a 188
Helmut Tschemernjak 65:b2d98328fcba 189 class Timer {
Helmut Tschemernjak 65:b2d98328fcba 190 public:
Helmut Tschemernjak 65:b2d98328fcba 191 void start(void) {
Helmut Tschemernjak 67:d3afd803f40d 192 _time = ns_getTicker();
Helmut Tschemernjak 67:d3afd803f40d 193 }
Helmut Tschemernjak 67:d3afd803f40d 194 uint32_t read_sec(void) {
Helmut Tschemernjak 67:d3afd803f40d 195 int64_t n = ns_getTicker() - (uint64_t)_time;
Helmut Tschemernjak 67:d3afd803f40d 196 n /= (uint64_t)1000000000;
Helmut Tschemernjak 67:d3afd803f40d 197 return n;
Helmut Tschemernjak 65:b2d98328fcba 198 }
Helmut Tschemernjak 67:d3afd803f40d 199 uint32_t read_ms(void) {
Helmut Tschemernjak 67:d3afd803f40d 200 int64_t n = ns_getTicker() - (uint64_t)_time;
Helmut Tschemernjak 67:d3afd803f40d 201 n /= (uint64_t)1000000;
Helmut Tschemernjak 67:d3afd803f40d 202 return n;
Helmut Tschemernjak 65:b2d98328fcba 203 }
Helmut Tschemernjak 67:d3afd803f40d 204 uint32_t read_us(void) {
Helmut Tschemernjak 67:d3afd803f40d 205 int64_t n = ns_getTicker() - (uint64_t)_time;
Helmut Tschemernjak 67:d3afd803f40d 206 n /= (uint64_t)1000;
Helmut Tschemernjak 67:d3afd803f40d 207 return n;
Helmut Tschemernjak 65:b2d98328fcba 208 }
Helmut Tschemernjak 65:b2d98328fcba 209 private:
Helmut Tschemernjak 67:d3afd803f40d 210 uint64_t _time;
Helmut Tschemernjak 65:b2d98328fcba 211 };
Helmut Tschemernjak 65:b2d98328fcba 212
Helmut Tschemernjak 65:b2d98328fcba 213
Helmut Tschemernjak 65:b2d98328fcba 214 class Timeout {
Helmut Tschemernjak 65:b2d98328fcba 215 public:
Helmut Tschemernjak 65:b2d98328fcba 216 Timeout() : _func() {
Helmut Tschemernjak 65:b2d98328fcba 217 }
Helmut Tschemernjak 65:b2d98328fcba 218 ~Timeout() {
Helmut Tschemernjak 65:b2d98328fcba 219 detach();
Helmut Tschemernjak 65:b2d98328fcba 220 }
Helmut Tschemernjak 65:b2d98328fcba 221
Helmut Tschemernjak 67:d3afd803f40d 222 void attach_sec(Callback<void()> func, uint32_t secs) {
Helmut Tschemernjak 67:d3afd803f40d 223 if (secs == 0)
Helmut Tschemernjak 67:d3afd803f40d 224 return detach();
Helmut Tschemernjak 67:d3afd803f40d 225 _func = func;
Helmut Tschemernjak 67:d3afd803f40d 226 _timeout = ns_getTicker() + (uint64_t)secs * (uint64_t)1000000000;
Helmut Tschemernjak 67:d3afd803f40d 227 insert();
Helmut Tschemernjak 67:d3afd803f40d 228 restart();
Helmut Tschemernjak 67:d3afd803f40d 229 }
Helmut Tschemernjak 67:d3afd803f40d 230
Helmut Tschemernjak 67:d3afd803f40d 231 void attach(Callback<void()> func, uint32_t msecs) {
Helmut Tschemernjak 65:b2d98328fcba 232 if (msecs == 0)
Helmut Tschemernjak 65:b2d98328fcba 233 return detach();
Helmut Tschemernjak 65:b2d98328fcba 234 _func = func;
Helmut Tschemernjak 67:d3afd803f40d 235 _timeout = ns_getTicker() + (uint64_t)msecs * (uint64_t)1000000;
Helmut Tschemernjak 65:b2d98328fcba 236 insert();
Helmut Tschemernjak 65:b2d98328fcba 237 restart();
Helmut Tschemernjak 65:b2d98328fcba 238 }
Helmut Tschemernjak 65:b2d98328fcba 239
Helmut Tschemernjak 65:b2d98328fcba 240 void attach_us(Callback<void()> func, long usecs) {
Helmut Tschemernjak 65:b2d98328fcba 241 if (usecs == 0)
Helmut Tschemernjak 65:b2d98328fcba 242 return detach();
Helmut Tschemernjak 65:b2d98328fcba 243 _func = func;
Helmut Tschemernjak 67:d3afd803f40d 244 _timeout = ns_getTicker() + (uint64_t)usecs * (uint64_t)1000;
Helmut Tschemernjak 65:b2d98328fcba 245 insert();
Helmut Tschemernjak 65:b2d98328fcba 246 restart();
Helmut Tschemernjak 65:b2d98328fcba 247 }
Helmut Tschemernjak 65:b2d98328fcba 248
Helmut Tschemernjak 67:d3afd803f40d 249 void detach(void) {
Helmut Tschemernjak 65:b2d98328fcba 250 _func = NULL;
Helmut Tschemernjak 65:b2d98328fcba 251 remove();
Helmut Tschemernjak 65:b2d98328fcba 252 restart();
Helmut Tschemernjak 65:b2d98328fcba 253 }
Helmut Tschemernjak 65:b2d98328fcba 254
Helmut Tschemernjak 65:b2d98328fcba 255 static void _irq_handler(Timeout *tp) {
Helmut Tschemernjak 65:b2d98328fcba 256 if (tp) {
Helmut Tschemernjak 65:b2d98328fcba 257 tp->_func();
Helmut Tschemernjak 65:b2d98328fcba 258 }
Helmut Tschemernjak 65:b2d98328fcba 259 }
Helmut Tschemernjak 65:b2d98328fcba 260
Helmut Tschemernjak 67:d3afd803f40d 261 static void restart(void);
Helmut Tschemernjak 67:d3afd803f40d 262 uint64_t _timeout; // in ns this lasts for 539 years.
Helmut Tschemernjak 65:b2d98328fcba 263 protected:
Helmut Tschemernjak 65:b2d98328fcba 264 void insert(void);
Helmut Tschemernjak 65:b2d98328fcba 265 void remove(void);
Helmut Tschemernjak 65:b2d98328fcba 266 private:
Helmut Tschemernjak 65:b2d98328fcba 267 Callback<void()> _func;
Helmut Tschemernjak 65:b2d98328fcba 268 };
Helmut Tschemernjak 65:b2d98328fcba 269
Helmut Tschemernjak 65:b2d98328fcba 270 #endif // __ARDUINO_MBED_H__
Helmut Tschemernjak 65:b2d98328fcba 271
Helmut Tschemernjak 40:0165543c0986 272 #endif // ARDUINO