@@ -56,6 +56,10 @@ static ETSTimer timer;
56
56
} // namespace _IRrecv
57
57
#endif // ESP8266
58
58
#if defined(ESP32)
59
+ #if ( defined(ESP_ARDUINO_VERSION) && \
60
+ (ESP_ARDUINO_VERSION >= ESP_ARDUINO_VERSION_VAL(3 , 0 , 0 )) )
61
+ #define _ESP32_ARDUINOV3
62
+ #endif // Version > 3
59
63
// We need a horrible timer hack for ESP32 Arduino framework < v2.0.0
60
64
#if !defined(_ESP32_IRRECV_TIMER_HACK)
61
65
// Version check
@@ -69,14 +73,6 @@ static ETSTimer timer;
69
73
#endif // Version check
70
74
#endif // !defined(_ESP32_IRRECV_TIMER_HACK)
71
75
72
- // Define ARDUINO_COREV3 macro
73
- #if defined(ESP_ARDUINO_VERSION) && \
74
- (ESP_ARDUINO_VERSION >= ESP_ARDUINO_VERSION_VAL(3 , 0 , 0 ))
75
- #define ARDUINO_COREV3 1
76
- #else
77
- #define ARDUINO_COREV3 0
78
- #endif
79
-
80
76
#if _ESP32_IRRECV_TIMER_HACK
81
77
// Required structs/types from:
82
78
// https://github.com/espressif/arduino-esp32/blob/6b0114366baf986c155e8173ab7c22bc0c5fcedc/cores/esp32/esp32-hal-timer.c#L28-L58
@@ -250,15 +246,14 @@ static void USE_IRAM_ATTR gpio_intr() {
250
246
// @see https://github.com/crankyoldgit/IRremoteESP8266/issues/1350
251
247
// @see https://github.com/espressif/arduino-esp32/blob/6b0114366baf986c155e8173ab7c22bc0c5fcedc/cores/esp32/esp32-hal-timer.c#L176-L178
252
248
timer->dev ->config .alarm_en = 1 ;
253
- #elif ARDUINO_COREV3
249
+ #elif defined(_ESP32_ARDUINOV3)
254
250
// For ESP32 core version 3.x, replace `timerAlarmEnable`
255
251
timerWrite (timer, 0 );
256
252
uint64_t alarm_value = 50000 ; // Example value (50ms)
257
253
timerAlarm (timer, alarm_value, false , 0 );
258
- #else
259
- // For ESP32 core version 2.x, keep using `timerAlarmEnable`
260
- timerWrite (timer, 0 );
261
- timerAlarmEnable (timer);
254
+ #else // !_ESP32_ARDUINOV3
255
+ timerWrite (timer, 0 );
256
+ timerAlarmEnable (timer);
262
257
#endif // _ESP32_IRRECV_TIMER_HACK
263
258
#endif // ESP32
264
259
}
@@ -374,13 +369,12 @@ void IRrecv::enableIRIn(const bool pullup) {
374
369
375
370
#if defined(ESP32)
376
371
// Initialise the ESP32 timer.
377
- #if ARDUINO_COREV3
372
+ #if defined(_ESP32_ARDUINOV3)
378
373
// Use newer timerBegin signature for ESP32 core version 3.x
379
374
timer = timerBegin (1000000 ); // Initialize with 1MHz (1us per tick)
380
- #else
381
- // Fallback for ESP32 core version 2.x or earlier
382
- timer = timerBegin (0 , 1000000 , true ); // Old signature with divider
383
- #endif
375
+ #else // _ESP32_ARDUINOV3
376
+ timer = timerBegin (0 , 1000000 , true );
377
+ #endif // _ESP32_ARDUINOV3
384
378
385
379
// Ensure the timer is successfully initialized
386
380
#ifdef DEBUG
@@ -391,15 +385,16 @@ void IRrecv::enableIRIn(const bool pullup) {
391
385
#endif // DEBUG
392
386
assert (timer != NULL ); // Check we actually got the timer.
393
387
// Set the timer so it only fires once, and set its trigger in microseconds.
394
- #if ARDUINO_COREV3
395
- timerWrite (timer, 0 ); // Reset the timer for ESP32 core version 3.x
396
- timerAttachInterrupt (timer, &read_timeout);
397
- #else
398
- // Attach timer interrupt for core version 2.x
399
- timerAlarmWrite (timer, MS_TO_USEC (params.timeout ), true );
400
- timerAttachInterrupt (timer, &read_timeout, false );
401
- #endif
402
-
388
+ #if defined(_ESP32_ARDUINOV3)
389
+ timerWrite (timer, 0 ); // Reset the timer for ESP32 core version 3.x
390
+ timerAttachInterrupt (timer, &read_timeout);
391
+ #else // _ESP32_ARDUINOV3
392
+ timerAlarmWrite (timer, MS_TO_USEC (params.timeout ), ONCE);
393
+ // Note: Interrupt needs to be attached before it can be enabled or disabled.
394
+ // Note: EDGE (true) is not supported, use LEVEL (false). Ref: #1713
395
+ // See: https://github.com/espressif/arduino-esp32/blob/caef4006af491130136b219c1205bdcf8f08bf2b/cores/esp32/esp32-hal-timer.c#L224-L227
396
+ timerAttachInterrupt (timer, &read_timeout, false );
397
+ #endif // _ESP32_ARDUINOV3
403
398
#endif // ESP32
404
399
405
400
// Initialise state machine variables
@@ -423,20 +418,14 @@ void IRrecv::disableIRIn(void) {
423
418
#ifndef UNIT_TEST
424
419
#if defined(ESP8266)
425
420
os_timer_disarm (&timer);
426
- #endif // ESP8266
427
- #if defined(ESP32)
428
- // Check for ESP32 core version and handle timer functions differently
429
- #if ARDUINO_COREV3
430
- // For ESP32 core version 3.x
431
- timerWrite (timer, 0 ); // Reset the timer
432
- timerDetachInterrupt (timer); // Detach the interrupt
433
- timerEnd (timer); // End the timer
434
- #else
435
- // For ESP32 core version 2.x
436
- timerAlarmDisable (timer); // Disable the alarm
437
- timerDetachInterrupt (timer); // Detach the interrupt
438
- timerEnd (timer); // End the timer
439
- #endif
421
+ #elif defined(_ESP32_ARDUINOV3)
422
+ timerWrite (timer, 0 ); // Reset the timer
423
+ timerDetachInterrupt (timer);
424
+ timerEnd (timer);
425
+ #elif defined(ESP32)
426
+ timerAlarmDisable (timer);
427
+ timerDetachInterrupt (timer);
428
+ timerEnd (timer);
440
429
#endif // ESP32
441
430
detachInterrupt (params.recvpin );
442
431
#endif // UNIT_TEST
@@ -463,15 +452,11 @@ void IRrecv::resume(void) {
463
452
params.overflow = false ;
464
453
#if defined(ESP32)
465
454
// Check for ESP32 core version and handle timer functions differently
466
- #if defined(ESP_ARDUINO_VERSION) && \
467
- (ESP_ARDUINO_VERSION >= ESP_ARDUINO_VERSION_VAL (3 , 0 , 0 ))
468
- // For ESP32 core version 3.x
469
- timerWrite (timer, 0 ); // Reset the timer (no need for timerAlarmDisable)
470
- #else
471
- // For ESP32 core version 2.x
472
- timerAlarmDisable (timer); // Disable the alarm
473
- #endif
474
-
455
+ #if defined(_ESP32_ARDUINOV3)
456
+ timerWrite (timer, 0 ); // Reset the timer (no need for timerAlarmDisable)
457
+ #else // _ESP32_ARDUINOV3
458
+ timerAlarmDisable (timer);
459
+ #endif
475
460
// Re-enable GPIO interrupt in both versions
476
461
gpio_intr_enable ((gpio_num_t )params.recvpin );
477
462
#endif // ESP32
0 commit comments