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_PingPong DISCO-L072CZ-LRWAN1_LoRa_PingPong DISCO-L072CZ-LRWAN1_LoRa_PingPong DISCO-L072CZ-LRWAN1_LoRa_USB_Rx ... more
Fork of SX1276Lib by
Arduino-mbed-APIs/arduino-esp32.cpp@104:b5183e348f9d, 2017-11-21 (annotated)
- Committer:
- Helmut Tschemernjak
- Date:
- Tue Nov 21 16:59:28 2017 +0100
- Revision:
- 104:b5183e348f9d
- Parent:
- 103:59930a715bf8
- Child:
- 105:6e6d141c3da8
Added better CPUID code, now the Mac address and the MCU revision
is being used.
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| Helmut Tschemernjak | 97:3d5d489206aa | 1 | /* |
| Helmut Tschemernjak | 97:3d5d489206aa | 2 | * The file is Licensed under the Apache License, Version 2.0 |
| Helmut Tschemernjak | 97:3d5d489206aa | 3 | * (c) 2017 Helmut Tschemernjak |
| Helmut Tschemernjak | 97:3d5d489206aa | 4 | * 30826 Garbsen (Hannover) Germany |
| Helmut Tschemernjak | 97:3d5d489206aa | 5 | */ |
| Helmut Tschemernjak | 97:3d5d489206aa | 6 | |
| Helmut Tschemernjak | 97:3d5d489206aa | 7 | #ifdef ARDUINO |
| Helmut Tschemernjak | 97:3d5d489206aa | 8 | |
| Helmut Tschemernjak | 97:3d5d489206aa | 9 | using namespace std; |
| Helmut Tschemernjak | 97:3d5d489206aa | 10 | |
| Helmut Tschemernjak | 97:3d5d489206aa | 11 | #include "arduino-mbed.h" |
| Helmut Tschemernjak | 97:3d5d489206aa | 12 | #include "arduino-util.h" |
| Helmut Tschemernjak | 101:50377edb21c6 | 13 | #include <time.h> |
| Helmut Tschemernjak | 97:3d5d489206aa | 14 | |
| Helmut Tschemernjak | 104:b5183e348f9d | 15 | #if defined(ARDUINO_ARCH_ESP32) |
| Helmut Tschemernjak | 97:3d5d489206aa | 16 | |
| Helmut Tschemernjak | 104:b5183e348f9d | 17 | #include "soc/efuse_reg.h" |
| Helmut Tschemernjak | 104:b5183e348f9d | 18 | |
| Helmut Tschemernjak | 104:b5183e348f9d | 19 | |
| Helmut Tschemernjak | 97:3d5d489206aa | 20 | /* |
| Helmut Tschemernjak | 97:3d5d489206aa | 21 | * ARDUINO_ARCH_ESP32 ESP32 development board |
| Helmut Tschemernjak | 97:3d5d489206aa | 22 | * Heltec ESP32 boards |
| Helmut Tschemernjak | 97:3d5d489206aa | 23 | */ |
| Helmut Tschemernjak | 97:3d5d489206aa | 24 | |
| Helmut Tschemernjak | 104:b5183e348f9d | 25 | int CPUID(uint8_t *buf, int maxSize, uint32_t xorval) |
| Helmut Tschemernjak | 97:3d5d489206aa | 26 | { |
| Helmut Tschemernjak | 104:b5183e348f9d | 27 | uint8_t uuid[16]; |
| Helmut Tschemernjak | 104:b5183e348f9d | 28 | int f1 = 0x6aa0f551; // EFUSE_BLK0_RDATA1_REG address |
| Helmut Tschemernjak | 104:b5183e348f9d | 29 | int f2 = 0x6aa0f55d; // EFUSE_BLK0_RDATA2_REG address |
| Helmut Tschemernjak | 97:3d5d489206aa | 30 | |
| Helmut Tschemernjak | 104:b5183e348f9d | 31 | if (maxSize >= sizeof(uuid)) { |
| Helmut Tschemernjak | 104:b5183e348f9d | 32 | int fa = f1 ^ xorval; |
| Helmut Tschemernjak | 104:b5183e348f9d | 33 | int fb = f2 ^ xorval; |
| Helmut Tschemernjak | 104:b5183e348f9d | 34 | |
| Helmut Tschemernjak | 104:b5183e348f9d | 35 | uint32_t mac_low = REG_READ(fa); |
| Helmut Tschemernjak | 104:b5183e348f9d | 36 | uint32_t mac_high = REG_READ(fb); |
| Helmut Tschemernjak | 104:b5183e348f9d | 37 | |
| Helmut Tschemernjak | 104:b5183e348f9d | 38 | uuid[0] = mac_high >> 8; |
| Helmut Tschemernjak | 104:b5183e348f9d | 39 | uuid[1] = mac_high; |
| Helmut Tschemernjak | 104:b5183e348f9d | 40 | uuid[2] = mac_low >> 24; |
| Helmut Tschemernjak | 104:b5183e348f9d | 41 | uuid[3] = mac_low >> 16; |
| Helmut Tschemernjak | 104:b5183e348f9d | 42 | uuid[4] = mac_low >> 8; |
| Helmut Tschemernjak | 104:b5183e348f9d | 43 | uuid[5] = mac_low; |
| Helmut Tschemernjak | 104:b5183e348f9d | 44 | |
| Helmut Tschemernjak | 104:b5183e348f9d | 45 | uuid[6] = uuid[0] ^ 0x16; |
| Helmut Tschemernjak | 104:b5183e348f9d | 46 | uuid[7] = uuid[1] ^ 0x27; |
| Helmut Tschemernjak | 104:b5183e348f9d | 47 | uuid[8] = uuid[2] ^ 0x38; |
| Helmut Tschemernjak | 104:b5183e348f9d | 48 | uuid[9] = uuid[4] ^ 0x49; |
| Helmut Tschemernjak | 104:b5183e348f9d | 49 | uuid[10] = uuid[5] ^ 0x50; |
| Helmut Tschemernjak | 104:b5183e348f9d | 50 | uuid[11] = uuid[5] ^ 0x61; |
| Helmut Tschemernjak | 104:b5183e348f9d | 51 | |
| Helmut Tschemernjak | 104:b5183e348f9d | 52 | uuid[12] = ESP.getChipRevision(); |
| Helmut Tschemernjak | 104:b5183e348f9d | 53 | uuid[13] = 0x12; |
| Helmut Tschemernjak | 104:b5183e348f9d | 54 | uuid[14] = 0x34; |
| Helmut Tschemernjak | 104:b5183e348f9d | 55 | uuid[15] = 0x56; |
| Helmut Tschemernjak | 104:b5183e348f9d | 56 | memcpy(buf, &uuid[0], sizeof(uuid)); |
| Helmut Tschemernjak | 104:b5183e348f9d | 57 | return sizeof(uuid); |
| Helmut Tschemernjak | 97:3d5d489206aa | 58 | } |
| Helmut Tschemernjak | 97:3d5d489206aa | 59 | return 0; |
| Helmut Tschemernjak | 97:3d5d489206aa | 60 | } |
| Helmut Tschemernjak | 97:3d5d489206aa | 61 | |
| Helmut Tschemernjak | 97:3d5d489206aa | 62 | /* |
| Helmut Tschemernjak | 97:3d5d489206aa | 63 | * see esp32-hal-timer.h is automatically included from: |
| Helmut Tschemernjak | 97:3d5d489206aa | 64 | * Arduino15/packages/arduino/hardware/espressif/esp32/cores/esp32 |
| Helmut Tschemernjak | 97:3d5d489206aa | 65 | */ |
| Helmut Tschemernjak | 97:3d5d489206aa | 66 | static void initTimer(int timerID); |
| Helmut Tschemernjak | 97:3d5d489206aa | 67 | void IRAM_ATTR onTimer(void); |
| Helmut Tschemernjak | 97:3d5d489206aa | 68 | /* |
| Helmut Tschemernjak | 103:59930a715bf8 | 69 | * The Atmel ESP32 has four 64-bit timer. |
| Helmut Tschemernjak | 103:59930a715bf8 | 70 | * At present the solution uses two timers, one for counting ticks, |
| Helmut Tschemernjak | 103:59930a715bf8 | 71 | * a second for setting alarms. This is required for the rev-0 ESP |
| Helmut Tschemernjak | 103:59930a715bf8 | 72 | * |
| Helmut Tschemernjak | 103:59930a715bf8 | 73 | * For the rev. 1 ESP a single timer will work for counting as well for |
| Helmut Tschemernjak | 103:59930a715bf8 | 74 | * setting the alarm via timerAlarmWrite(timer, timerRead(timer) + 1000000, false) |
| Helmut Tschemernjak | 103:59930a715bf8 | 75 | * once we support only ESP32-R1 the timer functions can be optimized to use only a |
| Helmut Tschemernjak | 103:59930a715bf8 | 76 | * single 64-bit timer. |
| Helmut Tschemernjak | 97:3d5d489206aa | 77 | */ |
| Helmut Tschemernjak | 97:3d5d489206aa | 78 | struct TIMER_config { |
| Helmut Tschemernjak | 97:3d5d489206aa | 79 | int timerID; |
| Helmut Tschemernjak | 97:3d5d489206aa | 80 | hw_timer_t *timer; |
| Helmut Tschemernjak | 97:3d5d489206aa | 81 | uint8_t nbits; |
| Helmut Tschemernjak | 97:3d5d489206aa | 82 | } Timer_data[] { |
| Helmut Tschemernjak | 97:3d5d489206aa | 83 | { 0, NULL, 32 }, |
| Helmut Tschemernjak | 97:3d5d489206aa | 84 | { 1, NULL, 32 }, |
| Helmut Tschemernjak | 97:3d5d489206aa | 85 | { 2, NULL, 32 }, |
| Helmut Tschemernjak | 103:59930a715bf8 | 86 | { 3, NULL, 32 }, |
| Helmut Tschemernjak | 97:3d5d489206aa | 87 | { -1, NULL, 0 } |
| Helmut Tschemernjak | 97:3d5d489206aa | 88 | }; |
| Helmut Tschemernjak | 97:3d5d489206aa | 89 | |
| Helmut Tschemernjak | 97:3d5d489206aa | 90 | /* |
| Helmut Tschemernjak | 97:3d5d489206aa | 91 | * We preferably use ESP32 timers because it supports 64-bit counters |
| Helmut Tschemernjak | 97:3d5d489206aa | 92 | */ |
| Helmut Tschemernjak | 97:3d5d489206aa | 93 | #define USE_TIMER_TIMEOUT 0 // 0, 1, 2 (see ESP32 docs) |
| Helmut Tschemernjak | 97:3d5d489206aa | 94 | #define USE_TIMER_TICKER 1 // 0, 1, 2 (see ESP32 docs) |
| Helmut Tschemernjak | 97:3d5d489206aa | 95 | #define MAX_TIMERS 3 |
| Helmut Tschemernjak | 101:50377edb21c6 | 96 | #define TIMER_DIVIDER 80 |
| Helmut Tschemernjak | 101:50377edb21c6 | 97 | #define TIMER_CLOCK 80 |
| Helmut Tschemernjak | 97:3d5d489206aa | 98 | |
| Helmut Tschemernjak | 97:3d5d489206aa | 99 | /* |
| Helmut Tschemernjak | 97:3d5d489206aa | 100 | * Calculation of ticks see timerBegin divider |
| Helmut Tschemernjak | 97:3d5d489206aa | 101 | */ |
| Helmut Tschemernjak | 97:3d5d489206aa | 102 | #define NS_PER_CLOCK_CPU 1000 // ns secs per clock |
| Helmut Tschemernjak | 97:3d5d489206aa | 103 | #define NS_PER_CLOCK_RTC 1000 // ns secs per clock |
| Helmut Tschemernjak | 97:3d5d489206aa | 104 | #define TIMER_INFINITE 0x7fffffffffffffff // max esp alarm timeout |
| Helmut Tschemernjak | 97:3d5d489206aa | 105 | #define NS_PER_CLOCK NS_PER_CLOCK_RTC |
| Helmut Tschemernjak | 97:3d5d489206aa | 106 | |
| Helmut Tschemernjak | 97:3d5d489206aa | 107 | |
| Helmut Tschemernjak | 97:3d5d489206aa | 108 | const char *GetTimerName(int timerID) |
| Helmut Tschemernjak | 97:3d5d489206aa | 109 | { |
| Helmut Tschemernjak | 97:3d5d489206aa | 110 | switch(timerID) { |
| Helmut Tschemernjak | 97:3d5d489206aa | 111 | case USE_TIMER_TIMEOUT: |
| Helmut Tschemernjak | 97:3d5d489206aa | 112 | return "TIMEOUT"; |
| Helmut Tschemernjak | 97:3d5d489206aa | 113 | break; |
| Helmut Tschemernjak | 97:3d5d489206aa | 114 | case USE_TIMER_TICKER: |
| Helmut Tschemernjak | 97:3d5d489206aa | 115 | return "TICKER"; |
| Helmut Tschemernjak | 97:3d5d489206aa | 116 | break; |
| Helmut Tschemernjak | 97:3d5d489206aa | 117 | default: |
| Helmut Tschemernjak | 97:3d5d489206aa | 118 | return "Uknown"; |
| Helmut Tschemernjak | 97:3d5d489206aa | 119 | } |
| Helmut Tschemernjak | 97:3d5d489206aa | 120 | } |
| Helmut Tschemernjak | 97:3d5d489206aa | 121 | |
| Helmut Tschemernjak | 97:3d5d489206aa | 122 | /* ----------------- TICKER TIMER CODE ----------------------*/ |
| Helmut Tschemernjak | 97:3d5d489206aa | 123 | |
| Helmut Tschemernjak | 97:3d5d489206aa | 124 | /* |
| Helmut Tschemernjak | 97:3d5d489206aa | 125 | * The global ns_counter contains the time in ns from the last time |
| Helmut Tschemernjak | 97:3d5d489206aa | 126 | * the counter has been wrapped. It cannot be used directly because the |
| Helmut Tschemernjak | 97:3d5d489206aa | 127 | * current counter has to be added fore using it. Use instead |
| Helmut Tschemernjak | 97:3d5d489206aa | 128 | * ns_getTicker(), us_ ns_getTicker(), ms_getTicker() |
| Helmut Tschemernjak | 97:3d5d489206aa | 129 | */ |
| Helmut Tschemernjak | 97:3d5d489206aa | 130 | |
| Helmut Tschemernjak | 97:3d5d489206aa | 131 | static volatile bool initTickerDone = false; |
| Helmut Tschemernjak | 97:3d5d489206aa | 132 | |
| Helmut Tschemernjak | 97:3d5d489206aa | 133 | uint64_t ns_getTicker(void) |
| Helmut Tschemernjak | 97:3d5d489206aa | 134 | { |
| Helmut Tschemernjak | 97:3d5d489206aa | 135 | int timerID = Timer_data[USE_TIMER_TICKER].timerID; |
| Helmut Tschemernjak | 97:3d5d489206aa | 136 | |
| Helmut Tschemernjak | 97:3d5d489206aa | 137 | if (!initTickerDone) { |
| Helmut Tschemernjak | 97:3d5d489206aa | 138 | initTimer(timerID); |
| Helmut Tschemernjak | 97:3d5d489206aa | 139 | initTickerDone = true; |
| Helmut Tschemernjak | 97:3d5d489206aa | 140 | } |
| Helmut Tschemernjak | 97:3d5d489206aa | 141 | |
| Helmut Tschemernjak | 97:3d5d489206aa | 142 | hw_timer_t *timer = Timer_data[USE_TIMER_TICKER].timer; |
| Helmut Tschemernjak | 97:3d5d489206aa | 143 | uint64_t ns = timerRead(timer); |
| Helmut Tschemernjak | 97:3d5d489206aa | 144 | uint16_t div = timerGetDivider(timer); |
| Helmut Tschemernjak | 97:3d5d489206aa | 145 | ns *= div; // get to the real clocks |
| Helmut Tschemernjak | 101:50377edb21c6 | 146 | ns *= 1000; // convert micros to NS. |
| Helmut Tschemernjak | 101:50377edb21c6 | 147 | ns /= TIMER_CLOCK; // 80 MHz clock, convert to micro seconds |
| Helmut Tschemernjak | 97:3d5d489206aa | 148 | |
| Helmut Tschemernjak | 97:3d5d489206aa | 149 | return ns; |
| Helmut Tschemernjak | 97:3d5d489206aa | 150 | } |
| Helmut Tschemernjak | 97:3d5d489206aa | 151 | |
| Helmut Tschemernjak | 97:3d5d489206aa | 152 | |
| Helmut Tschemernjak | 97:3d5d489206aa | 153 | /* ----------------- SUPPORT CODE FOR TCC TIMERS----------------------*/ |
| Helmut Tschemernjak | 97:3d5d489206aa | 154 | |
| Helmut Tschemernjak | 97:3d5d489206aa | 155 | static volatile bool initTimerDone = false; |
| Helmut Tschemernjak | 97:3d5d489206aa | 156 | |
| Helmut Tschemernjak | 97:3d5d489206aa | 157 | static void initTimer(int timerID) |
| Helmut Tschemernjak | 97:3d5d489206aa | 158 | { |
| Helmut Tschemernjak | 97:3d5d489206aa | 159 | //dprintf("initTimer: %s", GetTimerName(timerID)); |
| Helmut Tschemernjak | 97:3d5d489206aa | 160 | struct TIMER_config *cp = &Timer_data[timerID]; |
| Helmut Tschemernjak | 97:3d5d489206aa | 161 | if (timerID > MAX_TIMERS-1) |
| Helmut Tschemernjak | 97:3d5d489206aa | 162 | return; |
| Helmut Tschemernjak | 97:3d5d489206aa | 163 | |
| Helmut Tschemernjak | 101:50377edb21c6 | 164 | cp->timer = timerBegin(timerID, TIMER_DIVIDER, true); |
| Helmut Tschemernjak | 97:3d5d489206aa | 165 | timerWrite(cp->timer, 0); |
| Helmut Tschemernjak | 101:50377edb21c6 | 166 | if (timerID == USE_TIMER_TICKER) { |
| Helmut Tschemernjak | 101:50377edb21c6 | 167 | time_t t = time(NULL); |
| Helmut Tschemernjak | 101:50377edb21c6 | 168 | if (t > 0) { |
| Helmut Tschemernjak | 101:50377edb21c6 | 169 | struct tm mytm; |
| Helmut Tschemernjak | 101:50377edb21c6 | 170 | uint64_t tstart; |
| Helmut Tschemernjak | 101:50377edb21c6 | 171 | |
| Helmut Tschemernjak | 101:50377edb21c6 | 172 | localtime_r(&t, &mytm); |
| Helmut Tschemernjak | 101:50377edb21c6 | 173 | tstart = mytm.tm_sec + (mytm.tm_min * 60) + (mytm.tm_hour * 3600); |
| Helmut Tschemernjak | 101:50377edb21c6 | 174 | tstart *= 1000000; |
| Helmut Tschemernjak | 101:50377edb21c6 | 175 | tstart *= TIMER_CLOCK; |
| Helmut Tschemernjak | 101:50377edb21c6 | 176 | tstart /= TIMER_DIVIDER; |
| Helmut Tschemernjak | 101:50377edb21c6 | 177 | timerWrite(cp->timer, tstart); |
| Helmut Tschemernjak | 101:50377edb21c6 | 178 | } |
| Helmut Tschemernjak | 97:3d5d489206aa | 179 | timerStart(cp->timer); |
| Helmut Tschemernjak | 101:50377edb21c6 | 180 | } else { |
| Helmut Tschemernjak | 97:3d5d489206aa | 181 | timerAttachInterrupt(cp->timer, &onTimer, true); |
| Helmut Tschemernjak | 97:3d5d489206aa | 182 | timerAlarmWrite(cp->timer, TIMER_INFINITE, true); |
| Helmut Tschemernjak | 97:3d5d489206aa | 183 | timerAlarmEnable(cp->timer); |
| Helmut Tschemernjak | 97:3d5d489206aa | 184 | timerStart(cp->timer); |
| Helmut Tschemernjak | 97:3d5d489206aa | 185 | } |
| Helmut Tschemernjak | 97:3d5d489206aa | 186 | /* |
| Helmut Tschemernjak | 97:3d5d489206aa | 187 | * somehow the timer needs some time to initalize before being used. |
| Helmut Tschemernjak | 97:3d5d489206aa | 188 | * otherwise it will not issue any alarms |
| Helmut Tschemernjak | 97:3d5d489206aa | 189 | * This affects only ESP32 rev 0 |
| Helmut Tschemernjak | 97:3d5d489206aa | 190 | */ |
| Helmut Tschemernjak | 101:50377edb21c6 | 191 | if (ESP.getChipRevision() == 0) |
| Helmut Tschemernjak | 101:50377edb21c6 | 192 | delay(20); |
| Helmut Tschemernjak | 97:3d5d489206aa | 193 | } |
| Helmut Tschemernjak | 97:3d5d489206aa | 194 | |
| Helmut Tschemernjak | 97:3d5d489206aa | 195 | |
| Helmut Tschemernjak | 97:3d5d489206aa | 196 | TIMER_REF *getTimeoutTimer(void) |
| Helmut Tschemernjak | 97:3d5d489206aa | 197 | { |
| Helmut Tschemernjak | 97:3d5d489206aa | 198 | struct TIMER_config *cp = &Timer_data[USE_TIMER_TIMEOUT]; |
| Helmut Tschemernjak | 97:3d5d489206aa | 199 | |
| Helmut Tschemernjak | 97:3d5d489206aa | 200 | return &cp->timerID; |
| Helmut Tschemernjak | 97:3d5d489206aa | 201 | } |
| Helmut Tschemernjak | 97:3d5d489206aa | 202 | |
| Helmut Tschemernjak | 97:3d5d489206aa | 203 | |
| Helmut Tschemernjak | 97:3d5d489206aa | 204 | void stopTimer(int *timerIDPtr) |
| Helmut Tschemernjak | 97:3d5d489206aa | 205 | { |
| Helmut Tschemernjak | 97:3d5d489206aa | 206 | struct TIMER_config *cp = &Timer_data[*timerIDPtr]; |
| Helmut Tschemernjak | 97:3d5d489206aa | 207 | if (*timerIDPtr > MAX_TIMERS-1) |
| Helmut Tschemernjak | 97:3d5d489206aa | 208 | return; |
| Helmut Tschemernjak | 97:3d5d489206aa | 209 | |
| Helmut Tschemernjak | 97:3d5d489206aa | 210 | if (cp->timer) |
| Helmut Tschemernjak | 97:3d5d489206aa | 211 | timerAlarmWrite(cp->timer, TIMER_INFINITE, true); |
| Helmut Tschemernjak | 97:3d5d489206aa | 212 | } |
| Helmut Tschemernjak | 97:3d5d489206aa | 213 | |
| Helmut Tschemernjak | 97:3d5d489206aa | 214 | |
| Helmut Tschemernjak | 97:3d5d489206aa | 215 | /* ----------------- TIMEOUT TIMER CODE ----------------------*/ |
| Helmut Tschemernjak | 97:3d5d489206aa | 216 | |
| Helmut Tschemernjak | 97:3d5d489206aa | 217 | void startTimer(int *timerIDPtr, uint64_t delay_ns) |
| Helmut Tschemernjak | 97:3d5d489206aa | 218 | { |
| Helmut Tschemernjak | 97:3d5d489206aa | 219 | if (!initTimerDone) { |
| Helmut Tschemernjak | 97:3d5d489206aa | 220 | initTimer(*timerIDPtr); // initial setup with stopped timer |
| Helmut Tschemernjak | 97:3d5d489206aa | 221 | initTimerDone = true; |
| Helmut Tschemernjak | 97:3d5d489206aa | 222 | } |
| Helmut Tschemernjak | 97:3d5d489206aa | 223 | |
| Helmut Tschemernjak | 97:3d5d489206aa | 224 | struct TIMER_config *cp = &Timer_data[*timerIDPtr]; |
| Helmut Tschemernjak | 97:3d5d489206aa | 225 | if (*timerIDPtr > MAX_TIMERS-1) |
| Helmut Tschemernjak | 97:3d5d489206aa | 226 | return; |
| Helmut Tschemernjak | 97:3d5d489206aa | 227 | uint64_t usecs = delay_ns/1000; |
| Helmut Tschemernjak | 97:3d5d489206aa | 228 | if (delay_ns == 1) // immediate timeout |
| Helmut Tschemernjak | 97:3d5d489206aa | 229 | usecs = 1; |
| Helmut Tschemernjak | 97:3d5d489206aa | 230 | timerAlarmWrite(cp->timer, usecs, true); |
| Helmut Tschemernjak | 97:3d5d489206aa | 231 | // dprintf("startTimer: %s in %d us", GetTimerName(*timerIDPtr), usecs); |
| Helmut Tschemernjak | 97:3d5d489206aa | 232 | } |
| Helmut Tschemernjak | 97:3d5d489206aa | 233 | |
| Helmut Tschemernjak | 97:3d5d489206aa | 234 | /* |
| Helmut Tschemernjak | 97:3d5d489206aa | 235 | * The onTimer is only called for every Timeout expired timer |
| Helmut Tschemernjak | 97:3d5d489206aa | 236 | */ |
| Helmut Tschemernjak | 97:3d5d489206aa | 237 | void IRAM_ATTR onTimer(void) { |
| Helmut Tschemernjak | 97:3d5d489206aa | 238 | //dprintf("onTimer int called"); |
| Helmut Tschemernjak | 97:3d5d489206aa | 239 | uint64_t nsecs = ns_getTicker(); |
| Helmut Tschemernjak | 97:3d5d489206aa | 240 | |
| Helmut Tschemernjak | 97:3d5d489206aa | 241 | for (int i = 0; i < MAX_TIMEOUTS-1; i++) { |
| Helmut Tschemernjak | 97:3d5d489206aa | 242 | struct TimeoutVector *tvp = &TimeOuts[i]; |
| Helmut Tschemernjak | 97:3d5d489206aa | 243 | if (tvp->timer && nsecs >= tvp->timer->_timeout) { |
| Helmut Tschemernjak | 97:3d5d489206aa | 244 | Timeout *saveTimer = tvp->timer; |
| Helmut Tschemernjak | 97:3d5d489206aa | 245 | tvp->timer = NULL; |
| Helmut Tschemernjak | 97:3d5d489206aa | 246 | Timeout::_irq_handler(saveTimer); |
| Helmut Tschemernjak | 97:3d5d489206aa | 247 | } |
| Helmut Tschemernjak | 97:3d5d489206aa | 248 | } |
| Helmut Tschemernjak | 97:3d5d489206aa | 249 | /* |
| Helmut Tschemernjak | 97:3d5d489206aa | 250 | * we need to restart the timer for remaining interrupts |
| Helmut Tschemernjak | 97:3d5d489206aa | 251 | * Another reason is that we stopped this counter, in case there are |
| Helmut Tschemernjak | 97:3d5d489206aa | 252 | * remaining counts, we need to re-schedule the counter. |
| Helmut Tschemernjak | 97:3d5d489206aa | 253 | */ |
| Helmut Tschemernjak | 97:3d5d489206aa | 254 | Timeout::restart(); |
| Helmut Tschemernjak | 97:3d5d489206aa | 255 | } |
| Helmut Tschemernjak | 97:3d5d489206aa | 256 | |
| Helmut Tschemernjak | 97:3d5d489206aa | 257 | |
| Helmut Tschemernjak | 97:3d5d489206aa | 258 | /* ----------------- ESP32 sleep() and deepsleep() code ----------------------*/ |
| Helmut Tschemernjak | 97:3d5d489206aa | 259 | |
| Helmut Tschemernjak | 97:3d5d489206aa | 260 | void sleep(void) |
| Helmut Tschemernjak | 97:3d5d489206aa | 261 | { |
| Helmut Tschemernjak | 97:3d5d489206aa | 262 | asm("waiti 0"); |
| Helmut Tschemernjak | 97:3d5d489206aa | 263 | } |
| Helmut Tschemernjak | 97:3d5d489206aa | 264 | |
| Helmut Tschemernjak | 97:3d5d489206aa | 265 | /* |
| Helmut Tschemernjak | 97:3d5d489206aa | 266 | * TODO |
| Helmut Tschemernjak | 97:3d5d489206aa | 267 | * The ESP32 deepsleep can be enhanced to bring the ESP into low power mode. |
| Helmut Tschemernjak | 97:3d5d489206aa | 268 | */ |
| Helmut Tschemernjak | 97:3d5d489206aa | 269 | |
| Helmut Tschemernjak | 97:3d5d489206aa | 270 | void deepsleep(void) |
| Helmut Tschemernjak | 97:3d5d489206aa | 271 | { |
| Helmut Tschemernjak | 101:50377edb21c6 | 272 | // Light Sleep |
| Helmut Tschemernjak | 97:3d5d489206aa | 273 | asm("waiti 0"); |
| Helmut Tschemernjak | 97:3d5d489206aa | 274 | } |
| Helmut Tschemernjak | 97:3d5d489206aa | 275 | |
| Helmut Tschemernjak | 97:3d5d489206aa | 276 | #endif // ESp32 Timer, sleep, etc. |
| Helmut Tschemernjak | 97:3d5d489206aa | 277 | |
| Helmut Tschemernjak | 97:3d5d489206aa | 278 | #endif // ARDUINO |

