Skip to content

Commit d17530f

Browse files
committed
Merge branch 'functional-shouldbe-lib'
2 parents a2a55f4 + 5c46e6d commit d17530f

File tree

11 files changed

+212
-137
lines changed

11 files changed

+212
-137
lines changed

CMakeLists.txt

+2-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ set(CORE_SRCS
1919
cores/esp32/esp32-hal-uart.c
2020
cores/esp32/esp32-hal-rmt.c
2121
cores/esp32/Esp.cpp
22-
cores/esp32/FunctionalInterrupt.cpp
2322
cores/esp32/HardwareSerial.cpp
2423
cores/esp32/IPAddress.cpp
2524
cores/esp32/IPv6Address.cpp
@@ -47,6 +46,7 @@ set(LIBRARY_SRCS
4746
libraries/FFat/src/FFat.cpp
4847
libraries/FS/src/FS.cpp
4948
libraries/FS/src/vfs_api.cpp
49+
libraries/FunctionalInterrupt/src/FunctionalInterrupt.cpp
5050
libraries/HTTPClient/src/HTTPClient.cpp
5151
libraries/HTTPUpdate/src/HTTPUpdate.cpp
5252
libraries/NetBIOS/src/NetBIOS.cpp
@@ -187,6 +187,7 @@ set(COMPONENT_ADD_INCLUDEDIRS
187187
libraries/ESPmDNS/src
188188
libraries/FFat/src
189189
libraries/FS/src
190+
libraries/FunctionalInterrupt/src
190191
libraries/HTTPClient/src
191192
libraries/HTTPUpdate/src
192193
libraries/NetBIOS/src

cores/esp32/FunctionalInterrupt.cpp

-44
This file was deleted.

cores/esp32/FunctionalInterrupt.h

-20
This file was deleted.

cores/esp32/esp32-hal-gpio.c

+10-24
Original file line numberDiff line numberDiff line change
@@ -74,9 +74,8 @@ typedef void (*voidFuncPtrArg)(void*);
7474
typedef struct {
7575
voidFuncPtr fn;
7676
void* arg;
77-
bool functional;
7877
} InterruptHandle_t;
79-
static InterruptHandle_t __pinInterruptHandlers[GPIO_PIN_COUNT] = {0,};
78+
static InterruptHandle_t __pinInterruptHandlers[GPIO_PIN_COUNT] = { {0,0}, };
8079

8180
#include "driver/rtc_io.h"
8281

@@ -239,9 +238,7 @@ static void IRAM_ATTR __onPinInterrupt()
239238
}
240239
}
241240

242-
extern void cleanupFunctional(void* arg);
243-
244-
extern void __attachInterruptFunctionalArg(uint8_t pin, voidFuncPtrArg userFunc, void * arg, int intr_type, bool functional)
241+
extern void __attachInterruptArg(uint8_t pin, voidFuncPtrArg userFunc, void* arg, int intr_type)
245242
{
246243
static bool interrupt_initialized = false;
247244

@@ -250,14 +247,8 @@ extern void __attachInterruptFunctionalArg(uint8_t pin, voidFuncPtrArg userFunc,
250247
esp_intr_alloc(ETS_GPIO_INTR_SOURCE, (int)ESP_INTR_FLAG_IRAM, __onPinInterrupt, NULL, &gpio_intr_handle);
251248
}
252249

253-
// if new attach without detach remove old info
254-
if (__pinInterruptHandlers[pin].functional && __pinInterruptHandlers[pin].arg)
255-
{
256-
cleanupFunctional(__pinInterruptHandlers[pin].arg);
257-
}
258250
__pinInterruptHandlers[pin].fn = (voidFuncPtr)userFunc;
259251
__pinInterruptHandlers[pin].arg = arg;
260-
__pinInterruptHandlers[pin].functional = functional;
261252

262253
esp_intr_disable(gpio_intr_handle);
263254
if(esp_intr_get_cpu(gpio_intr_handle)) { //APP_CPU
@@ -269,36 +260,31 @@ extern void __attachInterruptFunctionalArg(uint8_t pin, voidFuncPtrArg userFunc,
269260
esp_intr_enable(gpio_intr_handle);
270261
}
271262

272-
extern void __attachInterruptArg(uint8_t pin, voidFuncPtrArg userFunc, void * arg, int intr_type)
273-
{
274-
__attachInterruptFunctionalArg(pin, userFunc, arg, intr_type, false);
275-
}
276-
277263
extern void __attachInterrupt(uint8_t pin, voidFuncPtr userFunc, int intr_type) {
278-
__attachInterruptFunctionalArg(pin, (voidFuncPtrArg)userFunc, NULL, intr_type, false);
264+
__attachInterruptArg(pin, (voidFuncPtrArg)userFunc, NULL, intr_type);
279265
}
280266

281267
extern void __detachInterrupt(uint8_t pin)
282268
{
283269
esp_intr_disable(gpio_intr_handle);
284-
if (__pinInterruptHandlers[pin].functional && __pinInterruptHandlers[pin].arg)
285-
{
286-
cleanupFunctional(__pinInterruptHandlers[pin].arg);
287-
}
288270
__pinInterruptHandlers[pin].fn = NULL;
289271
__pinInterruptHandlers[pin].arg = NULL;
290-
__pinInterruptHandlers[pin].functional = false;
291272

292273
GPIO.pin[pin].int_ena = 0;
293274
GPIO.pin[pin].int_type = 0;
294275
esp_intr_enable(gpio_intr_handle);
295276
}
296277

278+
extern void* __detachInterruptArg(uint8_t pin) {
279+
void* arg = (pin < GPIO_PIN_COUNT) ? __pinInterruptHandlers[pin].arg : NULL;
280+
__detachInterrupt(pin);
281+
return arg;
282+
}
297283

298284
extern void pinMode(uint8_t pin, uint8_t mode) __attribute__ ((weak, alias("__pinMode")));
299285
extern void digitalWrite(uint8_t pin, uint8_t val) __attribute__ ((weak, alias("__digitalWrite")));
300286
extern int digitalRead(uint8_t pin) __attribute__ ((weak, alias("__digitalRead")));
301287
extern void attachInterrupt(uint8_t pin, voidFuncPtr handler, int mode) __attribute__ ((weak, alias("__attachInterrupt")));
288+
extern void detachInterrupt(uint8_t pin) __attribute__((weak, alias("__detachInterrupt")));
302289
extern void attachInterruptArg(uint8_t pin, voidFuncPtrArg handler, void * arg, int mode) __attribute__ ((weak, alias("__attachInterruptArg")));
303-
extern void detachInterrupt(uint8_t pin) __attribute__ ((weak, alias("__detachInterrupt")));
304-
290+
extern void* detachInterruptArg(uint8_t pin) __attribute__((weak, alias("__detachInterruptArg")));

cores/esp32/esp32-hal-gpio.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,9 @@ void digitalWrite(uint8_t pin, uint8_t val);
7979
int digitalRead(uint8_t pin);
8080

8181
void attachInterrupt(uint8_t pin, void (*)(void), int mode);
82-
void attachInterruptArg(uint8_t pin, void (*)(void*), void * arg, int mode);
8382
void detachInterrupt(uint8_t pin);
83+
void attachInterruptArg(uint8_t pin, void (*)(void*), void* arg, int mode);
84+
void* detachInterruptArg(uint8_t pin);
8485

8586
#ifdef __cplusplus
8687
}

libraries/ESP32/examples/GPIO/FunctionalInterrupt/FunctionalInterrupt.ino

-47
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
#include <FunctionalInterrupt.h>
2+
#include <Arduino.h>
3+
4+
#if defined(ESP32)
5+
#define BUTTON1 16
6+
#define BUTTON2 17
7+
#elif defined(ARDUINO_ESP8266_WEMOS_D1MINI)
8+
#define BUTTON1 D4
9+
#define BUTTON2 D3
10+
#else
11+
#define BUTTON1 2
12+
#define BUTTON2 0
13+
#endif
14+
15+
class Button {
16+
public:
17+
Button(uint8_t reqPin) : PIN(reqPin) {
18+
pinMode(PIN, INPUT_PULLUP);
19+
// Arduino C API:
20+
//attachInterruptArg(PIN, [](void* self) {
21+
// static_cast<Button*>(self)->isr();
22+
//}, this, FALLING); // works on ESP32; fails on ESP8266: "ISR not in IRAM"
23+
//attachInterruptArg(PIN, reinterpret_cast<void(*)(void*)>(&isr_static), this, FALLING); // works on ESP32; works on ESP8266
24+
// FunctionalInterrupts API:
25+
attachScheduledInterrupt(PIN, [this](InterruptInfo ii) { Serial.print("Pin "); Serial.println(ii.pin); isr(); }, FALLING); // works on ESP32; works on ESP8266
26+
};
27+
~Button() {
28+
// Arduino C API:
29+
//detachInterrupt(PIN);
30+
// FunctionalInterrupt API:
31+
detachFunctionalInterrupt(PIN);
32+
}
33+
34+
#if defined(ESP8266)
35+
void ICACHE_RAM_ATTR isr()
36+
#elif defined(ESP32)
37+
void IRAM_ATTR isr()
38+
#endif
39+
{
40+
numberKeyPresses += 1;
41+
pressed = true;
42+
}
43+
44+
#if defined(ESP8266)
45+
static void ICACHE_RAM_ATTR isr_static(Button* const self)
46+
#elif defined(ESP32)
47+
static void IRAM_ATTR isr_static(Button* const self)
48+
#endif
49+
{
50+
self->isr();
51+
}
52+
53+
void checkPressed() {
54+
if (pressed) {
55+
Serial.printf("Button on pin %u has been pressed %u times\n", PIN, numberKeyPresses);
56+
pressed = false;
57+
}
58+
}
59+
60+
private:
61+
const uint8_t PIN;
62+
volatile uint32_t numberKeyPresses = 0;
63+
volatile bool pressed = false;
64+
};
65+
66+
Button* button1;
67+
Button* button2;
68+
69+
70+
void setup() {
71+
Serial.begin(115200);
72+
Serial.println("FunctionalInterrupt test/example");
73+
74+
button1 = new Button(BUTTON1);
75+
button2 = new Button(BUTTON2);
76+
77+
Serial.println("setup() complete");
78+
}
79+
80+
void loop() {
81+
button1->checkPressed();
82+
button2->checkPressed();
83+
}
+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#######################################
2+
# Datatypes (KEYWORD1)
3+
#######################################
4+
5+
InterruptInfo KEYWORD1
6+
ArgStructure KEYWORD1
7+
8+
#######################################
9+
# Methods and Functions (KEYWORD2)
10+
#######################################
11+
12+
attachScheduledInterrupt KEYWORD2
13+
detachFunctionalInterrupt KEYWORD2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
name=FunctionalInterrupt
2+
version=1.0
3+
author=hreintke <hreintke@tauri.nl>
4+
maintainer=hreintke <hreintke@tauri.nl>
5+
sentence=C++ functional and scheduled interrupt handling
6+
paragraph=
7+
category=Other
8+
url=
9+
architectures=esp32

0 commit comments

Comments
 (0)