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.cpp@101:50377edb21c6, 2017-11-19 (annotated)
- Committer:
- Helmut Tschemernjak
- Date:
- Sun Nov 19 17:51:27 2017 +0100
- Revision:
- 101:50377edb21c6
- Parent:
- 97:3d5d489206aa
- Child:
- 105:6e6d141c3da8
Added a feature to preset the ns_ticker start value
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 | 70:1d496aae2819 | 299 | uint32_t s_getTicker(void) |
Helmut Tschemernjak | 70:1d496aae2819 | 300 | { |
Helmut Tschemernjak | 70:1d496aae2819 | 301 | long long ns = ns_getTicker(); |
Helmut Tschemernjak | 70:1d496aae2819 | 302 | ns /= (long long)1000000000; // to secs |
Helmut Tschemernjak | 70:1d496aae2819 | 303 | |
Helmut Tschemernjak | 70:1d496aae2819 | 304 | int secs = ns; |
Helmut Tschemernjak | 70:1d496aae2819 | 305 | return secs; |
Helmut Tschemernjak | 70:1d496aae2819 | 306 | } |
Helmut Tschemernjak | 70:1d496aae2819 | 307 | |
Helmut Tschemernjak | 70:1d496aae2819 | 308 | |
Helmut Tschemernjak | 67:d3afd803f40d | 309 | uint32_t ms_getTicker(void) |
Helmut Tschemernjak | 67:d3afd803f40d | 310 | { |
Helmut Tschemernjak | 93:c328629726a6 | 311 | long long ns = ns_getTicker(); |
Helmut Tschemernjak | 93:c328629726a6 | 312 | ns /= (long long)1000000; // to ms |
Helmut Tschemernjak | 67:d3afd803f40d | 313 | |
Helmut Tschemernjak | 93:c328629726a6 | 314 | uint32_t ms = ns & 0xffffffff; |
Helmut Tschemernjak | 93:c328629726a6 | 315 | return ms; |
Helmut Tschemernjak | 67:d3afd803f40d | 316 | } |
Helmut Tschemernjak | 67:d3afd803f40d | 317 | |
Helmut Tschemernjak | 67:d3afd803f40d | 318 | uint32_t us_getTicker(void) |
Helmut Tschemernjak | 67:d3afd803f40d | 319 | { |
Helmut Tschemernjak | 67:d3afd803f40d | 320 | long long ns = ns_getTicker(); |
Helmut Tschemernjak | 67:d3afd803f40d | 321 | |
Helmut Tschemernjak | 67:d3afd803f40d | 322 | ns /= (long long)1000; // to us |
Helmut Tschemernjak | 67:d3afd803f40d | 323 | uint32_t us = ns & 0xffffffff; |
Helmut Tschemernjak | 67:d3afd803f40d | 324 | |
Helmut Tschemernjak | 67:d3afd803f40d | 325 | return us; |
Helmut Tschemernjak | 67:d3afd803f40d | 326 | } |
Helmut Tschemernjak | 67:d3afd803f40d | 327 | |
Helmut Tschemernjak | 101:50377edb21c6 | 328 | #ifdef ARDUINO_ARCH_ESP32 |
Helmut Tschemernjak | 101:50377edb21c6 | 329 | #undef noInterrupts |
Helmut Tschemernjak | 101:50377edb21c6 | 330 | #undef interrupts |
Helmut Tschemernjak | 101:50377edb21c6 | 331 | #define noInterrupts() portENTER_CRITICAL(&timerLock) |
Helmut Tschemernjak | 101:50377edb21c6 | 332 | #define interrupts() portEXIT_CRITICAL(&timerLock) |
Helmut Tschemernjak | 101:50377edb21c6 | 333 | static portMUX_TYPE timerLock = portMUX_INITIALIZER_UNLOCKED; |
Helmut Tschemernjak | 101:50377edb21c6 | 334 | #endif |
Helmut Tschemernjak | 67:d3afd803f40d | 335 | |
Helmut Tschemernjak | 65:b2d98328fcba | 336 | void |
Helmut Tschemernjak | 65:b2d98328fcba | 337 | Timeout::insert(void) |
Helmut Tschemernjak | 65:b2d98328fcba | 338 | { |
Helmut Tschemernjak | 65:b2d98328fcba | 339 | noInterrupts(); |
Helmut Tschemernjak | 65:b2d98328fcba | 340 | for (int i = 0; i < MAX_TIMEOUTS-1; i++) { |
Helmut Tschemernjak | 65:b2d98328fcba | 341 | struct TimeoutVector *tvp = &TimeOuts[i]; |
Helmut Tschemernjak | 79:8ae448a3c1fd | 342 | if (tvp->timer == this) // already here, timer has been restartet. |
Helmut Tschemernjak | 79:8ae448a3c1fd | 343 | break; |
Helmut Tschemernjak | 65:b2d98328fcba | 344 | if (tvp->timer == NULL) { |
Helmut Tschemernjak | 65:b2d98328fcba | 345 | tvp->timer = this; |
Helmut Tschemernjak | 65:b2d98328fcba | 346 | break; |
Helmut Tschemernjak | 65:b2d98328fcba | 347 | } |
Helmut Tschemernjak | 65:b2d98328fcba | 348 | } |
Helmut Tschemernjak | 65:b2d98328fcba | 349 | interrupts(); |
Helmut Tschemernjak | 65:b2d98328fcba | 350 | } |
Helmut Tschemernjak | 65:b2d98328fcba | 351 | |
Helmut Tschemernjak | 65:b2d98328fcba | 352 | void |
Helmut Tschemernjak | 65:b2d98328fcba | 353 | Timeout::remove(void) |
Helmut Tschemernjak | 65:b2d98328fcba | 354 | { |
Helmut Tschemernjak | 65:b2d98328fcba | 355 | noInterrupts(); |
Helmut Tschemernjak | 65:b2d98328fcba | 356 | for (int i = 0; i < MAX_TIMEOUTS-1; i++) { |
Helmut Tschemernjak | 65:b2d98328fcba | 357 | struct TimeoutVector *tvp = &TimeOuts[i]; |
Helmut Tschemernjak | 65:b2d98328fcba | 358 | if (tvp->timer == this) { |
Helmut Tschemernjak | 65:b2d98328fcba | 359 | tvp->timer = NULL; |
Helmut Tschemernjak | 65:b2d98328fcba | 360 | break; |
Helmut Tschemernjak | 65:b2d98328fcba | 361 | } |
Helmut Tschemernjak | 65:b2d98328fcba | 362 | } |
Helmut Tschemernjak | 65:b2d98328fcba | 363 | interrupts(); |
Helmut Tschemernjak | 65:b2d98328fcba | 364 | } |
Helmut Tschemernjak | 65:b2d98328fcba | 365 | |
Helmut Tschemernjak | 65:b2d98328fcba | 366 | |
Helmut Tschemernjak | 65:b2d98328fcba | 367 | void |
Helmut Tschemernjak | 67:d3afd803f40d | 368 | Timeout::restart() |
Helmut Tschemernjak | 65:b2d98328fcba | 369 | { |
Helmut Tschemernjak | 97:3d5d489206aa | 370 | TIMER_REF *t = getTimeoutTimer(); |
Helmut Tschemernjak | 67:d3afd803f40d | 371 | uint64_t timeout = ~0; |
Helmut Tschemernjak | 65:b2d98328fcba | 372 | |
Helmut Tschemernjak | 65:b2d98328fcba | 373 | /* |
Helmut Tschemernjak | 65:b2d98328fcba | 374 | * find the lowest timeout value which is our the next timeout |
Helmut Tschemernjak | 65:b2d98328fcba | 375 | * zero means stop the timer. |
Helmut Tschemernjak | 65:b2d98328fcba | 376 | */ |
Helmut Tschemernjak | 65:b2d98328fcba | 377 | noInterrupts(); |
Helmut Tschemernjak | 65:b2d98328fcba | 378 | for (int i = 0; i < MAX_TIMEOUTS-1; i++) { |
Helmut Tschemernjak | 65:b2d98328fcba | 379 | struct TimeoutVector *tvp = &TimeOuts[i]; |
Helmut Tschemernjak | 67:d3afd803f40d | 380 | if (tvp->timer) { |
Helmut Tschemernjak | 67:d3afd803f40d | 381 | if (tvp->timer->_timeout < timeout) { |
Helmut Tschemernjak | 67:d3afd803f40d | 382 | timeout = tvp->timer->_timeout; |
Helmut Tschemernjak | 65:b2d98328fcba | 383 | } |
Helmut Tschemernjak | 65:b2d98328fcba | 384 | } |
Helmut Tschemernjak | 65:b2d98328fcba | 385 | } |
Helmut Tschemernjak | 65:b2d98328fcba | 386 | interrupts(); |
Helmut Tschemernjak | 65:b2d98328fcba | 387 | |
Helmut Tschemernjak | 67:d3afd803f40d | 388 | if (timeout == (uint64_t)~0) { |
Helmut Tschemernjak | 67:d3afd803f40d | 389 | stopTimer(t); |
Helmut Tschemernjak | 65:b2d98328fcba | 390 | return; |
Helmut Tschemernjak | 65:b2d98328fcba | 391 | } |
Helmut Tschemernjak | 67:d3afd803f40d | 392 | |
Helmut Tschemernjak | 67:d3afd803f40d | 393 | uint64_t nsecs = ns_getTicker(); |
Helmut Tschemernjak | 65:b2d98328fcba | 394 | |
Helmut Tschemernjak | 67:d3afd803f40d | 395 | if (timeout > nsecs) { |
Helmut Tschemernjak | 67:d3afd803f40d | 396 | startTimer(t, (uint64_t)timeout - (uint64_t)nsecs); |
Helmut Tschemernjak | 65:b2d98328fcba | 397 | return; |
Helmut Tschemernjak | 65:b2d98328fcba | 398 | } else { |
Helmut Tschemernjak | 67:d3afd803f40d | 399 | startTimer(t, (uint64_t)1); // just one nsec to trigger interrrupt |
Helmut Tschemernjak | 65:b2d98328fcba | 400 | } |
Helmut Tschemernjak | 65:b2d98328fcba | 401 | } |
Helmut Tschemernjak | 67:d3afd803f40d | 402 | |
Helmut Tschemernjak | 46:e78a1d0391ac | 403 | #endif // ARDUINO |