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.
Dependents: DISCO-L072CZ-LRWAN1_LoRa_node EIoT_LoRa_node_1 EIoT_LoRa_node_2 EIoT_LoRa_node_3
Fork of SX1276GenericLib by
Arduino-mbed-APIs/arduino-mbed.cpp@97:3d5d489206aa, 2017-11-18 (annotated)
- Committer:
- Helmut Tschemernjak
- Date:
- Sat Nov 18 13:54:15 2017 +0100
- Revision:
- 97:3d5d489206aa
- Parent:
- 96:9da7e00c9d0f
- Child:
- 101:50377edb21c6
Change timeout functions to use a generic TIMER_REF instead of a D21 TCC pointer
Added support for ESP32 SPI, Serial
Added suport for ESP32 64-bit timer
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Helmut Tschemernjak | 46:e78a1d0391ac | 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 | 46:e78a1d0391ac | 6 | |
Helmut Tschemernjak | 65:b2d98328fcba | 7 | #ifdef ARDUINO |
Helmut Tschemernjak | 65:b2d98328fcba | 8 | |
Helmut Tschemernjak | 65:b2d98328fcba | 9 | using namespace std; |
Helmut Tschemernjak | 65:b2d98328fcba | 10 | |
Helmut Tschemernjak | 65:b2d98328fcba | 11 | #include "arduino-mbed.h" |
Helmut Tschemernjak | 75:7330dd86cdea | 12 | #include "arduino-util.h" |
Helmut Tschemernjak | 65:b2d98328fcba | 13 | |
Helmut Tschemernjak | 96:9da7e00c9d0f | 14 | #ifdef ARDUINO_SAMD_FEATHER_M0 |
Helmut Tschemernjak | 96:9da7e00c9d0f | 15 | #define SERIALUSB Serial |
Helmut Tschemernjak | 96:9da7e00c9d0f | 16 | #else |
Helmut Tschemernjak | 96:9da7e00c9d0f | 17 | #define SERIALUSB SerialUSB |
Helmut Tschemernjak | 96:9da7e00c9d0f | 18 | #endif |
Helmut Tschemernjak | 96:9da7e00c9d0f | 19 | |
Helmut Tschemernjak | 75:7330dd86cdea | 20 | Stream *ser; |
Helmut Tschemernjak | 90:d98572047c9c | 21 | bool SerialUSB_active; |
Helmut Tschemernjak | 84:3428e25c7157 | 22 | |
Helmut Tschemernjak | 93:c328629726a6 | 23 | void InitSerial(Stream *serial, int timeout_ms, DigitalOut *led, bool waitForSerial) { |
Helmut Tschemernjak | 75:7330dd86cdea | 24 | ser = serial; |
Helmut Tschemernjak | 97:3d5d489206aa | 25 | #ifdef ARDUINO_SAMD_ZERO |
Helmut Tschemernjak | 90:d98572047c9c | 26 | SerialUSB_active = true; |
Helmut Tschemernjak | 90:d98572047c9c | 27 | if (!timeout_ms) |
Helmut Tschemernjak | 90:d98572047c9c | 28 | return; |
Helmut Tschemernjak | 96:9da7e00c9d0f | 29 | if (serial == (Stream *)&SERIALUSB) { |
Helmut Tschemernjak | 84:3428e25c7157 | 30 | uint32_t start = ms_getTicker(); |
Helmut Tschemernjak | 84:3428e25c7157 | 31 | |
Helmut Tschemernjak | 84:3428e25c7157 | 32 | SerialUSB_active = true; |
Helmut Tschemernjak | 93:c328629726a6 | 33 | |
Helmut Tschemernjak | 93:c328629726a6 | 34 | if (waitForSerial) { |
Helmut Tschemernjak | 96:9da7e00c9d0f | 35 | while(!SERIALUSB) { |
Helmut Tschemernjak | 93:c328629726a6 | 36 | *led = 1; |
Helmut Tschemernjak | 93:c328629726a6 | 37 | delay(80); |
Helmut Tschemernjak | 93:c328629726a6 | 38 | *led = 0; |
Helmut Tschemernjak | 93:c328629726a6 | 39 | delay(80); |
Helmut Tschemernjak | 93:c328629726a6 | 40 | } |
Helmut Tschemernjak | 93:c328629726a6 | 41 | return; |
Helmut Tschemernjak | 93:c328629726a6 | 42 | } |
Helmut Tschemernjak | 96:9da7e00c9d0f | 43 | while(!SERIALUSB) { |
Helmut Tschemernjak | 84:3428e25c7157 | 44 | if (ms_getTicker() > start + timeout_ms) { |
Helmut Tschemernjak | 84:3428e25c7157 | 45 | SerialUSB_active = false; |
Helmut Tschemernjak | 84:3428e25c7157 | 46 | break; |
Helmut Tschemernjak | 84:3428e25c7157 | 47 | } |
Helmut Tschemernjak | 84:3428e25c7157 | 48 | } |
Helmut Tschemernjak | 84:3428e25c7157 | 49 | if (!SerialUSB_active) { |
Helmut Tschemernjak | 84:3428e25c7157 | 50 | USB->DEVICE.CTRLA.bit.SWRST = 1; // disconnect the USB Port |
Helmut Tschemernjak | 84:3428e25c7157 | 51 | while (USB->DEVICE.CTRLA.bit.SWRST == 1); |
Helmut Tschemernjak | 90:d98572047c9c | 52 | if (led) { |
Helmut Tschemernjak | 90:d98572047c9c | 53 | for (int i = 0; i < 10; i++) { |
Helmut Tschemernjak | 96:9da7e00c9d0f | 54 | // lets blink the LED to show that Serial over USB is off. |
Helmut Tschemernjak | 90:d98572047c9c | 55 | *led = 1; |
Helmut Tschemernjak | 90:d98572047c9c | 56 | delay(80); |
Helmut Tschemernjak | 90:d98572047c9c | 57 | *led = 0; |
Helmut Tschemernjak | 90:d98572047c9c | 58 | delay(80); |
Helmut Tschemernjak | 90:d98572047c9c | 59 | } |
Helmut Tschemernjak | 90:d98572047c9c | 60 | } |
Helmut Tschemernjak | 84:3428e25c7157 | 61 | } |
Helmut Tschemernjak | 84:3428e25c7157 | 62 | } |
Helmut Tschemernjak | 97:3d5d489206aa | 63 | #elif ARDUINO_ARCH_ESP32 |
Helmut Tschemernjak | 97:3d5d489206aa | 64 | SerialUSB_active = false; |
Helmut Tschemernjak | 97:3d5d489206aa | 65 | #else |
Helmut Tschemernjak | 97:3d5d489206aa | 66 | #eror "unkown MCU" |
Helmut Tschemernjak | 97:3d5d489206aa | 67 | #endif |
Helmut Tschemernjak | 75:7330dd86cdea | 68 | } |
Helmut Tschemernjak | 65:b2d98328fcba | 69 | |
Helmut Tschemernjak | 65:b2d98328fcba | 70 | static void pinInt00(void); |
Helmut Tschemernjak | 65:b2d98328fcba | 71 | static void pinInt01(void); |
Helmut Tschemernjak | 65:b2d98328fcba | 72 | static void pinInt02(void); |
Helmut Tschemernjak | 65:b2d98328fcba | 73 | static void pinInt03(void); |
Helmut Tschemernjak | 65:b2d98328fcba | 74 | static void pinInt04(void); |
Helmut Tschemernjak | 65:b2d98328fcba | 75 | static void pinInt05(void); |
Helmut Tschemernjak | 65:b2d98328fcba | 76 | static void pinInt06(void); |
Helmut Tschemernjak | 65:b2d98328fcba | 77 | static void pinInt07(void); |
Helmut Tschemernjak | 65:b2d98328fcba | 78 | static void pinInt08(void); |
Helmut Tschemernjak | 65:b2d98328fcba | 79 | static void pinInt09(void); |
Helmut Tschemernjak | 65:b2d98328fcba | 80 | static void pinInt10(void); |
Helmut Tschemernjak | 65:b2d98328fcba | 81 | static void pinInt11(void); |
Helmut Tschemernjak | 65:b2d98328fcba | 82 | static void pinInt12(void); |
Helmut Tschemernjak | 65:b2d98328fcba | 83 | static void pinInt13(void); |
Helmut Tschemernjak | 65:b2d98328fcba | 84 | static void pinInt14(void); |
Helmut Tschemernjak | 65:b2d98328fcba | 85 | static void pinInt15(void); |
Helmut Tschemernjak | 65:b2d98328fcba | 86 | static void pinInt16(void); |
Helmut Tschemernjak | 65:b2d98328fcba | 87 | static void pinInt17(void); |
Helmut Tschemernjak | 65:b2d98328fcba | 88 | static void pinInt18(void); |
Helmut Tschemernjak | 65:b2d98328fcba | 89 | static void pinInt19(void); |
Helmut Tschemernjak | 65:b2d98328fcba | 90 | static void pinInt20(void); |
Helmut Tschemernjak | 65:b2d98328fcba | 91 | static void pinInt21(void); |
Helmut Tschemernjak | 65:b2d98328fcba | 92 | static void pinInt22(void); |
Helmut Tschemernjak | 65:b2d98328fcba | 93 | static void pinInt23(void); |
Helmut Tschemernjak | 65:b2d98328fcba | 94 | static void pinInt24(void); |
Helmut Tschemernjak | 65:b2d98328fcba | 95 | static void pinInt25(void); |
Helmut Tschemernjak | 65:b2d98328fcba | 96 | static void pinInt26(void); |
Helmut Tschemernjak | 65:b2d98328fcba | 97 | static void pinInt27(void); |
Helmut Tschemernjak | 65:b2d98328fcba | 98 | static void pinInt28(void); |
Helmut Tschemernjak | 65:b2d98328fcba | 99 | static void pinInt29(void); |
Helmut Tschemernjak | 65:b2d98328fcba | 100 | static void pinInt30(void); |
Helmut Tschemernjak | 65:b2d98328fcba | 101 | static void pinInt31(void); |
Helmut Tschemernjak | 65:b2d98328fcba | 102 | static void pinInt32(void); |
Helmut Tschemernjak | 65:b2d98328fcba | 103 | static void pinInt33(void); |
Helmut Tschemernjak | 65:b2d98328fcba | 104 | static void pinInt34(void); |
Helmut Tschemernjak | 65:b2d98328fcba | 105 | static void pinInt35(void); |
Helmut Tschemernjak | 65:b2d98328fcba | 106 | static void pinInt36(void); |
Helmut Tschemernjak | 65:b2d98328fcba | 107 | static void pinInt37(void); |
Helmut Tschemernjak | 65:b2d98328fcba | 108 | static void pinInt38(void); |
Helmut Tschemernjak | 65:b2d98328fcba | 109 | static void pinInt39(void); |
Helmut Tschemernjak | 65:b2d98328fcba | 110 | static void pinInt40(void); |
Helmut Tschemernjak | 65:b2d98328fcba | 111 | static void pinInt41(void); |
Helmut Tschemernjak | 65:b2d98328fcba | 112 | static void pinInt42(void); |
Helmut Tschemernjak | 65:b2d98328fcba | 113 | static void pinInt43(void); |
Helmut Tschemernjak | 65:b2d98328fcba | 114 | static void pinInt44(void); |
Helmut Tschemernjak | 65:b2d98328fcba | 115 | static void pinInt45(void); |
Helmut Tschemernjak | 65:b2d98328fcba | 116 | static void pinInt46(void); |
Helmut Tschemernjak | 65:b2d98328fcba | 117 | static void pinInt47(void); |
Helmut Tschemernjak | 46:e78a1d0391ac | 118 | |
Helmut Tschemernjak | 46:e78a1d0391ac | 119 | |
Helmut Tschemernjak | 46:e78a1d0391ac | 120 | |
Helmut Tschemernjak | 65:b2d98328fcba | 121 | #define MAX_MCU_PINS 48 |
Helmut Tschemernjak | 65:b2d98328fcba | 122 | class InterruptIn; |
Helmut Tschemernjak | 65:b2d98328fcba | 123 | struct intPtrTable { |
Helmut Tschemernjak | 65:b2d98328fcba | 124 | void (*func)(void); |
Helmut Tschemernjak | 65:b2d98328fcba | 125 | InterruptIn *context; |
Helmut Tschemernjak | 65:b2d98328fcba | 126 | } intPtrTable[MAX_MCU_PINS] = { |
Helmut Tschemernjak | 65:b2d98328fcba | 127 | { pinInt00, NULL }, |
Helmut Tschemernjak | 65:b2d98328fcba | 128 | { pinInt01, NULL }, |
Helmut Tschemernjak | 65:b2d98328fcba | 129 | { pinInt02, NULL }, |
Helmut Tschemernjak | 65:b2d98328fcba | 130 | { pinInt03, NULL }, |
Helmut Tschemernjak | 65:b2d98328fcba | 131 | { pinInt04, NULL }, |
Helmut Tschemernjak | 65:b2d98328fcba | 132 | { pinInt05, NULL }, |
Helmut Tschemernjak | 65:b2d98328fcba | 133 | { pinInt06, NULL }, |
Helmut Tschemernjak | 65:b2d98328fcba | 134 | { pinInt07, NULL }, |
Helmut Tschemernjak | 65:b2d98328fcba | 135 | { pinInt08, NULL }, |
Helmut Tschemernjak | 65:b2d98328fcba | 136 | { pinInt09, NULL }, |
Helmut Tschemernjak | 65:b2d98328fcba | 137 | { pinInt10, NULL }, |
Helmut Tschemernjak | 65:b2d98328fcba | 138 | { pinInt11, NULL }, |
Helmut Tschemernjak | 65:b2d98328fcba | 139 | { pinInt12, NULL }, |
Helmut Tschemernjak | 65:b2d98328fcba | 140 | { pinInt13, NULL }, |
Helmut Tschemernjak | 65:b2d98328fcba | 141 | { pinInt14, NULL }, |
Helmut Tschemernjak | 65:b2d98328fcba | 142 | { pinInt15, NULL }, |
Helmut Tschemernjak | 65:b2d98328fcba | 143 | { pinInt16, NULL }, |
Helmut Tschemernjak | 65:b2d98328fcba | 144 | { pinInt17, NULL }, |
Helmut Tschemernjak | 65:b2d98328fcba | 145 | { pinInt18, NULL }, |
Helmut Tschemernjak | 65:b2d98328fcba | 146 | { pinInt19, NULL }, |
Helmut Tschemernjak | 65:b2d98328fcba | 147 | { pinInt20, NULL }, |
Helmut Tschemernjak | 65:b2d98328fcba | 148 | { pinInt21, NULL }, |
Helmut Tschemernjak | 65:b2d98328fcba | 149 | { pinInt22, NULL }, |
Helmut Tschemernjak | 65:b2d98328fcba | 150 | { pinInt23, NULL }, |
Helmut Tschemernjak | 65:b2d98328fcba | 151 | { pinInt24, NULL }, |
Helmut Tschemernjak | 65:b2d98328fcba | 152 | { pinInt25, NULL }, |
Helmut Tschemernjak | 65:b2d98328fcba | 153 | { pinInt26, NULL }, |
Helmut Tschemernjak | 65:b2d98328fcba | 154 | { pinInt27, NULL }, |
Helmut Tschemernjak | 65:b2d98328fcba | 155 | { pinInt28, NULL }, |
Helmut Tschemernjak | 65:b2d98328fcba | 156 | { pinInt29, NULL }, |
Helmut Tschemernjak | 65:b2d98328fcba | 157 | { pinInt30, NULL }, |
Helmut Tschemernjak | 65:b2d98328fcba | 158 | { pinInt31, NULL }, |
Helmut Tschemernjak | 65:b2d98328fcba | 159 | { pinInt32, NULL }, |
Helmut Tschemernjak | 65:b2d98328fcba | 160 | { pinInt33, NULL }, |
Helmut Tschemernjak | 65:b2d98328fcba | 161 | { pinInt34, NULL }, |
Helmut Tschemernjak | 65:b2d98328fcba | 162 | { pinInt35, NULL }, |
Helmut Tschemernjak | 65:b2d98328fcba | 163 | { pinInt36, NULL }, |
Helmut Tschemernjak | 65:b2d98328fcba | 164 | { pinInt37, NULL }, |
Helmut Tschemernjak | 65:b2d98328fcba | 165 | { pinInt38, NULL }, |
Helmut Tschemernjak | 65:b2d98328fcba | 166 | { pinInt39, NULL }, |
Helmut Tschemernjak | 65:b2d98328fcba | 167 | { pinInt40, NULL }, |
Helmut Tschemernjak | 65:b2d98328fcba | 168 | { pinInt41, NULL }, |
Helmut Tschemernjak | 65:b2d98328fcba | 169 | { pinInt42, NULL }, |
Helmut Tschemernjak | 65:b2d98328fcba | 170 | { pinInt43, NULL }, |
Helmut Tschemernjak | 65:b2d98328fcba | 171 | { pinInt44, NULL }, |
Helmut Tschemernjak | 65:b2d98328fcba | 172 | { pinInt45, NULL }, |
Helmut Tschemernjak | 65:b2d98328fcba | 173 | { pinInt46, NULL }, |
Helmut Tschemernjak | 65:b2d98328fcba | 174 | { pinInt47, NULL } |
Helmut Tschemernjak | 65:b2d98328fcba | 175 | }; // our max MCUs pins |
Helmut Tschemernjak | 46:e78a1d0391ac | 176 | |
Helmut Tschemernjak | 46:e78a1d0391ac | 177 | |
Helmut Tschemernjak | 46:e78a1d0391ac | 178 | |
Helmut Tschemernjak | 65:b2d98328fcba | 179 | static void pinInt00(void) { InterruptIn::_irq_handler(intPtrTable[0].context); } |
Helmut Tschemernjak | 65:b2d98328fcba | 180 | static void pinInt01(void) { InterruptIn::_irq_handler(intPtrTable[1].context); } |
Helmut Tschemernjak | 65:b2d98328fcba | 181 | static void pinInt02(void) { InterruptIn::_irq_handler(intPtrTable[2].context); } |
Helmut Tschemernjak | 65:b2d98328fcba | 182 | static void pinInt03(void) { InterruptIn::_irq_handler(intPtrTable[3].context); } |
Helmut Tschemernjak | 65:b2d98328fcba | 183 | static void pinInt04(void) { InterruptIn::_irq_handler(intPtrTable[4].context); } |
Helmut Tschemernjak | 65:b2d98328fcba | 184 | static void pinInt05(void) { InterruptIn::_irq_handler(intPtrTable[5].context); } |
Helmut Tschemernjak | 65:b2d98328fcba | 185 | static void pinInt06(void) { InterruptIn::_irq_handler(intPtrTable[6].context); } |
Helmut Tschemernjak | 65:b2d98328fcba | 186 | static void pinInt07(void) { InterruptIn::_irq_handler(intPtrTable[7].context); } |
Helmut Tschemernjak | 65:b2d98328fcba | 187 | static void pinInt08(void) { InterruptIn::_irq_handler(intPtrTable[8].context); } |
Helmut Tschemernjak | 65:b2d98328fcba | 188 | static void pinInt09(void) { InterruptIn::_irq_handler(intPtrTable[9].context); } |
Helmut Tschemernjak | 65:b2d98328fcba | 189 | static void pinInt10(void) { InterruptIn::_irq_handler(intPtrTable[10].context); } |
Helmut Tschemernjak | 65:b2d98328fcba | 190 | static void pinInt11(void) { InterruptIn::_irq_handler(intPtrTable[11].context); } |
Helmut Tschemernjak | 65:b2d98328fcba | 191 | static void pinInt12(void) { InterruptIn::_irq_handler(intPtrTable[12].context); } |
Helmut Tschemernjak | 65:b2d98328fcba | 192 | static void pinInt13(void) { InterruptIn::_irq_handler(intPtrTable[13].context); } |
Helmut Tschemernjak | 65:b2d98328fcba | 193 | static void pinInt14(void) { InterruptIn::_irq_handler(intPtrTable[14].context); } |
Helmut Tschemernjak | 65:b2d98328fcba | 194 | static void pinInt15(void) { InterruptIn::_irq_handler(intPtrTable[15].context); } |
Helmut Tschemernjak | 65:b2d98328fcba | 195 | static void pinInt16(void) { InterruptIn::_irq_handler(intPtrTable[16].context); } |
Helmut Tschemernjak | 65:b2d98328fcba | 196 | static void pinInt17(void) { InterruptIn::_irq_handler(intPtrTable[17].context); } |
Helmut Tschemernjak | 65:b2d98328fcba | 197 | static void pinInt18(void) { InterruptIn::_irq_handler(intPtrTable[18].context); } |
Helmut Tschemernjak | 65:b2d98328fcba | 198 | static void pinInt19(void) { InterruptIn::_irq_handler(intPtrTable[19].context); } |
Helmut Tschemernjak | 65:b2d98328fcba | 199 | static void pinInt20(void) { InterruptIn::_irq_handler(intPtrTable[20].context); } |
Helmut Tschemernjak | 65:b2d98328fcba | 200 | static void pinInt21(void) { InterruptIn::_irq_handler(intPtrTable[21].context); } |
Helmut Tschemernjak | 65:b2d98328fcba | 201 | static void pinInt22(void) { InterruptIn::_irq_handler(intPtrTable[22].context); } |
Helmut Tschemernjak | 65:b2d98328fcba | 202 | static void pinInt23(void) { InterruptIn::_irq_handler(intPtrTable[23].context); } |
Helmut Tschemernjak | 65:b2d98328fcba | 203 | static void pinInt24(void) { InterruptIn::_irq_handler(intPtrTable[24].context); } |
Helmut Tschemernjak | 65:b2d98328fcba | 204 | static void pinInt25(void) { InterruptIn::_irq_handler(intPtrTable[25].context); } |
Helmut Tschemernjak | 65:b2d98328fcba | 205 | static void pinInt26(void) { InterruptIn::_irq_handler(intPtrTable[26].context); } |
Helmut Tschemernjak | 65:b2d98328fcba | 206 | static void pinInt27(void) { InterruptIn::_irq_handler(intPtrTable[27].context); } |
Helmut Tschemernjak | 65:b2d98328fcba | 207 | static void pinInt28(void) { InterruptIn::_irq_handler(intPtrTable[28].context); } |
Helmut Tschemernjak | 65:b2d98328fcba | 208 | static void pinInt29(void) { InterruptIn::_irq_handler(intPtrTable[29].context); } |
Helmut Tschemernjak | 65:b2d98328fcba | 209 | static void pinInt30(void) { InterruptIn::_irq_handler(intPtrTable[30].context); } |
Helmut Tschemernjak | 65:b2d98328fcba | 210 | static void pinInt31(void) { InterruptIn::_irq_handler(intPtrTable[31].context); } |
Helmut Tschemernjak | 65:b2d98328fcba | 211 | static void pinInt32(void) { InterruptIn::_irq_handler(intPtrTable[32].context); } |
Helmut Tschemernjak | 65:b2d98328fcba | 212 | static void pinInt33(void) { InterruptIn::_irq_handler(intPtrTable[33].context); } |
Helmut Tschemernjak | 65:b2d98328fcba | 213 | static void pinInt34(void) { InterruptIn::_irq_handler(intPtrTable[34].context); } |
Helmut Tschemernjak | 65:b2d98328fcba | 214 | static void pinInt35(void) { InterruptIn::_irq_handler(intPtrTable[35].context); } |
Helmut Tschemernjak | 65:b2d98328fcba | 215 | static void pinInt36(void) { InterruptIn::_irq_handler(intPtrTable[36].context); } |
Helmut Tschemernjak | 65:b2d98328fcba | 216 | static void pinInt37(void) { InterruptIn::_irq_handler(intPtrTable[37].context); } |
Helmut Tschemernjak | 65:b2d98328fcba | 217 | static void pinInt38(void) { InterruptIn::_irq_handler(intPtrTable[38].context); } |
Helmut Tschemernjak | 65:b2d98328fcba | 218 | static void pinInt39(void) { InterruptIn::_irq_handler(intPtrTable[39].context); } |
Helmut Tschemernjak | 65:b2d98328fcba | 219 | static void pinInt40(void) { InterruptIn::_irq_handler(intPtrTable[40].context); } |
Helmut Tschemernjak | 65:b2d98328fcba | 220 | static void pinInt41(void) { InterruptIn::_irq_handler(intPtrTable[41].context); } |
Helmut Tschemernjak | 65:b2d98328fcba | 221 | static void pinInt42(void) { InterruptIn::_irq_handler(intPtrTable[42].context); } |
Helmut Tschemernjak | 65:b2d98328fcba | 222 | static void pinInt43(void) { InterruptIn::_irq_handler(intPtrTable[43].context); } |
Helmut Tschemernjak | 65:b2d98328fcba | 223 | static void pinInt44(void) { InterruptIn::_irq_handler(intPtrTable[44].context); } |
Helmut Tschemernjak | 65:b2d98328fcba | 224 | static void pinInt45(void) { InterruptIn::_irq_handler(intPtrTable[45].context); } |
Helmut Tschemernjak | 65:b2d98328fcba | 225 | static void pinInt46(void) { InterruptIn::_irq_handler(intPtrTable[46].context); } |
Helmut Tschemernjak | 65:b2d98328fcba | 226 | static void pinInt47(void) { InterruptIn::_irq_handler(intPtrTable[47].context); } |
Helmut Tschemernjak | 46:e78a1d0391ac | 227 | |
Helmut Tschemernjak | 46:e78a1d0391ac | 228 | |
Helmut Tschemernjak | 80:62f0b027efff | 229 | void wait_ms(uint32_t ms) |
Helmut Tschemernjak | 80:62f0b027efff | 230 | { |
Helmut Tschemernjak | 80:62f0b027efff | 231 | uint32_t start = ms_getTicker(); |
Helmut Tschemernjak | 80:62f0b027efff | 232 | |
Helmut Tschemernjak | 80:62f0b027efff | 233 | while (true) { |
Helmut Tschemernjak | 80:62f0b027efff | 234 | uint32_t t = ms_getTicker(); |
Helmut Tschemernjak | 80:62f0b027efff | 235 | if (t < start) // warp. |
Helmut Tschemernjak | 80:62f0b027efff | 236 | start = 0; |
Helmut Tschemernjak | 80:62f0b027efff | 237 | if (t > (start + ms)) |
Helmut Tschemernjak | 80:62f0b027efff | 238 | break; |
Helmut Tschemernjak | 80:62f0b027efff | 239 | } |
Helmut Tschemernjak | 80:62f0b027efff | 240 | } |
Helmut Tschemernjak | 80:62f0b027efff | 241 | |
Helmut Tschemernjak | 77:7f227a4dffe6 | 242 | struct TimeoutVector TimeOuts[MAX_TIMEOUTS]; |
Helmut Tschemernjak | 46:e78a1d0391ac | 243 | |
Helmut Tschemernjak | 65:b2d98328fcba | 244 | void |
Helmut Tschemernjak | 65:b2d98328fcba | 245 | InterruptIn::rise(Callback<void()> func) { |
Helmut Tschemernjak | 65:b2d98328fcba | 246 | if (_gpioPin >= MAX_MCU_PINS-1) |
Helmut Tschemernjak | 65:b2d98328fcba | 247 | return; |
Helmut Tschemernjak | 65:b2d98328fcba | 248 | if (func) { |
Helmut Tschemernjak | 65:b2d98328fcba | 249 | _func = func; |
Helmut Tschemernjak | 65:b2d98328fcba | 250 | intPtrTable[_gpioPin].context = this; |
Helmut Tschemernjak | 69:d440a5b04708 | 251 | attachInterrupt(MYdigitalPinToInterrupt(_gpioPin), intPtrTable[_gpioPin].func, RISING); |
Helmut Tschemernjak | 65:b2d98328fcba | 252 | } else { |
Helmut Tschemernjak | 65:b2d98328fcba | 253 | _func = InterruptIn::donothing; |
Helmut Tschemernjak | 65:b2d98328fcba | 254 | intPtrTable[_gpioPin].context = NULL; |
Helmut Tschemernjak | 65:b2d98328fcba | 255 | detachInterrupt(_gpioPin); |
Helmut Tschemernjak | 46:e78a1d0391ac | 256 | } |
Helmut Tschemernjak | 65:b2d98328fcba | 257 | }; |
Helmut Tschemernjak | 46:e78a1d0391ac | 258 | |
Helmut Tschemernjak | 65:b2d98328fcba | 259 | void |
Helmut Tschemernjak | 65:b2d98328fcba | 260 | InterruptIn::fall(Callback<void()> func) { |
Helmut Tschemernjak | 65:b2d98328fcba | 261 | if (func) { |
Helmut Tschemernjak | 65:b2d98328fcba | 262 | _func = func; |
Helmut Tschemernjak | 65:b2d98328fcba | 263 | intPtrTable[_gpioPin].context = this; |
Helmut Tschemernjak | 69:d440a5b04708 | 264 | attachInterrupt(MYdigitalPinToInterrupt(_gpioPin), intPtrTable[_gpioPin].func, FALLING); |
Helmut Tschemernjak | 65:b2d98328fcba | 265 | } else { |
Helmut Tschemernjak | 65:b2d98328fcba | 266 | _func = InterruptIn::donothing; |
Helmut Tschemernjak | 65:b2d98328fcba | 267 | intPtrTable[_gpioPin].context = NULL; |
Helmut Tschemernjak | 65:b2d98328fcba | 268 | detachInterrupt(_gpioPin); |
Helmut Tschemernjak | 46:e78a1d0391ac | 269 | } |
Helmut Tschemernjak | 46:e78a1d0391ac | 270 | } |
Helmut Tschemernjak | 46:e78a1d0391ac | 271 | |
Helmut Tschemernjak | 88:d120930aeb13 | 272 | void |
Helmut Tschemernjak | 88:d120930aeb13 | 273 | InterruptIn::high(Callback<void()> func) { |
Helmut Tschemernjak | 88:d120930aeb13 | 274 | if (func) { |
Helmut Tschemernjak | 88:d120930aeb13 | 275 | _func = func; |
Helmut Tschemernjak | 88:d120930aeb13 | 276 | intPtrTable[_gpioPin].context = this; |
Helmut Tschemernjak | 88:d120930aeb13 | 277 | attachInterrupt(MYdigitalPinToInterrupt(_gpioPin), intPtrTable[_gpioPin].func, HIGH); |
Helmut Tschemernjak | 88:d120930aeb13 | 278 | } else { |
Helmut Tschemernjak | 88:d120930aeb13 | 279 | _func = InterruptIn::donothing; |
Helmut Tschemernjak | 88:d120930aeb13 | 280 | intPtrTable[_gpioPin].context = NULL; |
Helmut Tschemernjak | 88:d120930aeb13 | 281 | detachInterrupt(_gpioPin); |
Helmut Tschemernjak | 88:d120930aeb13 | 282 | } |
Helmut Tschemernjak | 88:d120930aeb13 | 283 | } |
Helmut Tschemernjak | 88:d120930aeb13 | 284 | |
Helmut Tschemernjak | 88:d120930aeb13 | 285 | void |
Helmut Tschemernjak | 88:d120930aeb13 | 286 | InterruptIn::low(Callback<void()> func) { |
Helmut Tschemernjak | 88:d120930aeb13 | 287 | if (func) { |
Helmut Tschemernjak | 88:d120930aeb13 | 288 | _func = func; |
Helmut Tschemernjak | 88:d120930aeb13 | 289 | intPtrTable[_gpioPin].context = this; |
Helmut Tschemernjak | 88:d120930aeb13 | 290 | attachInterrupt(MYdigitalPinToInterrupt(_gpioPin), intPtrTable[_gpioPin].func, LOW); |
Helmut Tschemernjak | 88:d120930aeb13 | 291 | } else { |
Helmut Tschemernjak | 88:d120930aeb13 | 292 | _func = InterruptIn::donothing; |
Helmut Tschemernjak | 88:d120930aeb13 | 293 | intPtrTable[_gpioPin].context = NULL; |
Helmut Tschemernjak | 88:d120930aeb13 | 294 | detachInterrupt(_gpioPin); |
Helmut Tschemernjak | 88:d120930aeb13 | 295 | } |
Helmut Tschemernjak | 88:d120930aeb13 | 296 | } |
Helmut Tschemernjak | 88:d120930aeb13 | 297 | |
Helmut Tschemernjak | 88:d120930aeb13 | 298 | |
Helmut Tschemernjak | 88:d120930aeb13 | 299 | |
Helmut Tschemernjak | 46:e78a1d0391ac | 300 | |
Helmut Tschemernjak | 70:1d496aae2819 | 301 | uint32_t s_getTicker(void) |
Helmut Tschemernjak | 70:1d496aae2819 | 302 | { |
Helmut Tschemernjak | 70:1d496aae2819 | 303 | long long ns = ns_getTicker(); |
Helmut Tschemernjak | 70:1d496aae2819 | 304 | ns /= (long long)1000000000; // to secs |
Helmut Tschemernjak | 70:1d496aae2819 | 305 | |
Helmut Tschemernjak | 70:1d496aae2819 | 306 | int secs = ns; |
Helmut Tschemernjak | 70:1d496aae2819 | 307 | return secs; |
Helmut Tschemernjak | 70:1d496aae2819 | 308 | } |
Helmut Tschemernjak | 70:1d496aae2819 | 309 | |
Helmut Tschemernjak | 70:1d496aae2819 | 310 | |
Helmut Tschemernjak | 67:d3afd803f40d | 311 | uint32_t ms_getTicker(void) |
Helmut Tschemernjak | 67:d3afd803f40d | 312 | { |
Helmut Tschemernjak | 93:c328629726a6 | 313 | long long ns = ns_getTicker(); |
Helmut Tschemernjak | 93:c328629726a6 | 314 | ns /= (long long)1000000; // to ms |
Helmut Tschemernjak | 67:d3afd803f40d | 315 | |
Helmut Tschemernjak | 93:c328629726a6 | 316 | uint32_t ms = ns & 0xffffffff; |
Helmut Tschemernjak | 93:c328629726a6 | 317 | return ms; |
Helmut Tschemernjak | 67:d3afd803f40d | 318 | } |
Helmut Tschemernjak | 67:d3afd803f40d | 319 | |
Helmut Tschemernjak | 67:d3afd803f40d | 320 | uint32_t us_getTicker(void) |
Helmut Tschemernjak | 67:d3afd803f40d | 321 | { |
Helmut Tschemernjak | 67:d3afd803f40d | 322 | long long ns = ns_getTicker(); |
Helmut Tschemernjak | 67:d3afd803f40d | 323 | |
Helmut Tschemernjak | 67:d3afd803f40d | 324 | ns /= (long long)1000; // to us |
Helmut Tschemernjak | 67:d3afd803f40d | 325 | uint32_t us = ns & 0xffffffff; |
Helmut Tschemernjak | 67:d3afd803f40d | 326 | |
Helmut Tschemernjak | 67:d3afd803f40d | 327 | return us; |
Helmut Tschemernjak | 67:d3afd803f40d | 328 | } |
Helmut Tschemernjak | 67:d3afd803f40d | 329 | |
Helmut Tschemernjak | 67:d3afd803f40d | 330 | |
Helmut Tschemernjak | 65:b2d98328fcba | 331 | void |
Helmut Tschemernjak | 65:b2d98328fcba | 332 | Timeout::insert(void) |
Helmut Tschemernjak | 65:b2d98328fcba | 333 | { |
Helmut Tschemernjak | 65:b2d98328fcba | 334 | noInterrupts(); |
Helmut Tschemernjak | 65:b2d98328fcba | 335 | for (int i = 0; i < MAX_TIMEOUTS-1; i++) { |
Helmut Tschemernjak | 65:b2d98328fcba | 336 | struct TimeoutVector *tvp = &TimeOuts[i]; |
Helmut Tschemernjak | 79:8ae448a3c1fd | 337 | if (tvp->timer == this) // already here, timer has been restartet. |
Helmut Tschemernjak | 79:8ae448a3c1fd | 338 | break; |
Helmut Tschemernjak | 65:b2d98328fcba | 339 | if (tvp->timer == NULL) { |
Helmut Tschemernjak | 65:b2d98328fcba | 340 | tvp->timer = this; |
Helmut Tschemernjak | 65:b2d98328fcba | 341 | break; |
Helmut Tschemernjak | 65:b2d98328fcba | 342 | } |
Helmut Tschemernjak | 65:b2d98328fcba | 343 | } |
Helmut Tschemernjak | 65:b2d98328fcba | 344 | interrupts(); |
Helmut Tschemernjak | 65:b2d98328fcba | 345 | } |
Helmut Tschemernjak | 65:b2d98328fcba | 346 | |
Helmut Tschemernjak | 65:b2d98328fcba | 347 | void |
Helmut Tschemernjak | 65:b2d98328fcba | 348 | Timeout::remove(void) |
Helmut Tschemernjak | 65:b2d98328fcba | 349 | { |
Helmut Tschemernjak | 65:b2d98328fcba | 350 | noInterrupts(); |
Helmut Tschemernjak | 65:b2d98328fcba | 351 | for (int i = 0; i < MAX_TIMEOUTS-1; i++) { |
Helmut Tschemernjak | 65:b2d98328fcba | 352 | struct TimeoutVector *tvp = &TimeOuts[i]; |
Helmut Tschemernjak | 65:b2d98328fcba | 353 | if (tvp->timer == this) { |
Helmut Tschemernjak | 65:b2d98328fcba | 354 | tvp->timer = NULL; |
Helmut Tschemernjak | 65:b2d98328fcba | 355 | break; |
Helmut Tschemernjak | 65:b2d98328fcba | 356 | } |
Helmut Tschemernjak | 65:b2d98328fcba | 357 | } |
Helmut Tschemernjak | 65:b2d98328fcba | 358 | interrupts(); |
Helmut Tschemernjak | 65:b2d98328fcba | 359 | } |
Helmut Tschemernjak | 65:b2d98328fcba | 360 | |
Helmut Tschemernjak | 65:b2d98328fcba | 361 | |
Helmut Tschemernjak | 65:b2d98328fcba | 362 | void |
Helmut Tschemernjak | 67:d3afd803f40d | 363 | Timeout::restart() |
Helmut Tschemernjak | 65:b2d98328fcba | 364 | { |
Helmut Tschemernjak | 97:3d5d489206aa | 365 | TIMER_REF *t = getTimeoutTimer(); |
Helmut Tschemernjak | 67:d3afd803f40d | 366 | uint64_t timeout = ~0; |
Helmut Tschemernjak | 65:b2d98328fcba | 367 | |
Helmut Tschemernjak | 65:b2d98328fcba | 368 | /* |
Helmut Tschemernjak | 65:b2d98328fcba | 369 | * find the lowest timeout value which is our the next timeout |
Helmut Tschemernjak | 65:b2d98328fcba | 370 | * zero means stop the timer. |
Helmut Tschemernjak | 65:b2d98328fcba | 371 | */ |
Helmut Tschemernjak | 65:b2d98328fcba | 372 | noInterrupts(); |
Helmut Tschemernjak | 65:b2d98328fcba | 373 | for (int i = 0; i < MAX_TIMEOUTS-1; i++) { |
Helmut Tschemernjak | 65:b2d98328fcba | 374 | struct TimeoutVector *tvp = &TimeOuts[i]; |
Helmut Tschemernjak | 67:d3afd803f40d | 375 | if (tvp->timer) { |
Helmut Tschemernjak | 67:d3afd803f40d | 376 | if (tvp->timer->_timeout < timeout) { |
Helmut Tschemernjak | 67:d3afd803f40d | 377 | timeout = tvp->timer->_timeout; |
Helmut Tschemernjak | 65:b2d98328fcba | 378 | } |
Helmut Tschemernjak | 65:b2d98328fcba | 379 | } |
Helmut Tschemernjak | 65:b2d98328fcba | 380 | } |
Helmut Tschemernjak | 65:b2d98328fcba | 381 | interrupts(); |
Helmut Tschemernjak | 65:b2d98328fcba | 382 | |
Helmut Tschemernjak | 67:d3afd803f40d | 383 | if (timeout == (uint64_t)~0) { |
Helmut Tschemernjak | 67:d3afd803f40d | 384 | stopTimer(t); |
Helmut Tschemernjak | 65:b2d98328fcba | 385 | return; |
Helmut Tschemernjak | 65:b2d98328fcba | 386 | } |
Helmut Tschemernjak | 67:d3afd803f40d | 387 | |
Helmut Tschemernjak | 67:d3afd803f40d | 388 | uint64_t nsecs = ns_getTicker(); |
Helmut Tschemernjak | 65:b2d98328fcba | 389 | |
Helmut Tschemernjak | 67:d3afd803f40d | 390 | if (timeout > nsecs) { |
Helmut Tschemernjak | 67:d3afd803f40d | 391 | startTimer(t, (uint64_t)timeout - (uint64_t)nsecs); |
Helmut Tschemernjak | 65:b2d98328fcba | 392 | return; |
Helmut Tschemernjak | 65:b2d98328fcba | 393 | } else { |
Helmut Tschemernjak | 67:d3afd803f40d | 394 | startTimer(t, (uint64_t)1); // just one nsec to trigger interrrupt |
Helmut Tschemernjak | 65:b2d98328fcba | 395 | } |
Helmut Tschemernjak | 65:b2d98328fcba | 396 | } |
Helmut Tschemernjak | 67:d3afd803f40d | 397 | |
Helmut Tschemernjak | 46:e78a1d0391ac | 398 | #endif // ARDUINO |