Skip to content

Commit 228f3c8

Browse files
bertmelisCurclamas
authored andcommitted
Allow using argument with attachInterrupt (espressif#1535)
* Allow using argument with attachInterrupt * formatting replace tabs with spaces * fix bug more then 1 interrupt * leftover * add example * make attachInterruptArg public * update example * leftover
1 parent ab1709d commit 228f3c8

File tree

3 files changed

+75
-9
lines changed

3 files changed

+75
-9
lines changed

Diff for: cores/esp32/esp32-hal-gpio.c

+29-9
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,12 @@ const DRAM_ATTR esp32_gpioMux_t esp32_gpioMux[GPIO_PIN_COUNT]={
7070
};
7171

7272
typedef void (*voidFuncPtr)(void);
73-
static voidFuncPtr __pinInterruptHandlers[GPIO_PIN_COUNT] = {0,};
73+
typedef void (*voidFuncPtrArg)(void*);
74+
typedef struct {
75+
voidFuncPtr fn;
76+
void* arg;
77+
} InterruptHandle_t;
78+
static InterruptHandle_t __pinInterruptHandlers[GPIO_PIN_COUNT] = {0,};
7479

7580
#include "driver/rtc_io.h"
7681

@@ -193,7 +198,7 @@ extern int IRAM_ATTR __digitalRead(uint8_t pin)
193198

194199
static intr_handle_t gpio_intr_handle = NULL;
195200

196-
static void IRAM_ATTR __onPinInterrupt(void *arg)
201+
static void IRAM_ATTR __onPinInterrupt()
197202
{
198203
uint32_t gpio_intr_status_l=0;
199204
uint32_t gpio_intr_status_h=0;
@@ -207,8 +212,12 @@ static void IRAM_ATTR __onPinInterrupt(void *arg)
207212
if(gpio_intr_status_l) {
208213
do {
209214
if(gpio_intr_status_l & ((uint32_t)1 << pin)) {
210-
if(__pinInterruptHandlers[pin]) {
211-
__pinInterruptHandlers[pin]();
215+
if(__pinInterruptHandlers[pin].fn) {
216+
if(__pinInterruptHandlers[pin].arg){
217+
((voidFuncPtrArg)__pinInterruptHandlers[pin].fn)(__pinInterruptHandlers[pin].arg);
218+
} else {
219+
__pinInterruptHandlers[pin].fn();
220+
}
212221
}
213222
}
214223
} while(++pin<32);
@@ -217,23 +226,28 @@ static void IRAM_ATTR __onPinInterrupt(void *arg)
217226
pin=32;
218227
do {
219228
if(gpio_intr_status_h & ((uint32_t)1 << (pin - 32))) {
220-
if(__pinInterruptHandlers[pin]) {
221-
__pinInterruptHandlers[pin]();
229+
if(__pinInterruptHandlers[pin].fn) {
230+
if(__pinInterruptHandlers[pin].arg){
231+
((voidFuncPtrArg)__pinInterruptHandlers[pin].fn)(__pinInterruptHandlers[pin].arg);
232+
} else {
233+
__pinInterruptHandlers[pin].fn();
234+
}
222235
}
223236
}
224237
} while(++pin<GPIO_PIN_COUNT);
225238
}
226239
}
227240

228-
extern void __attachInterrupt(uint8_t pin, voidFuncPtr userFunc, int intr_type)
241+
extern void __attachInterruptArg(uint8_t pin, voidFuncPtrArg userFunc, void * arg, int intr_type)
229242
{
230243
static bool interrupt_initialized = false;
231244

232245
if(!interrupt_initialized) {
233246
interrupt_initialized = true;
234247
esp_intr_alloc(ETS_GPIO_INTR_SOURCE, (int)ESP_INTR_FLAG_IRAM, __onPinInterrupt, NULL, &gpio_intr_handle);
235248
}
236-
__pinInterruptHandlers[pin] = userFunc;
249+
__pinInterruptHandlers[pin].fn = (voidFuncPtr)userFunc;
250+
__pinInterruptHandlers[pin].arg = arg;
237251
esp_intr_disable(gpio_intr_handle);
238252
if(esp_intr_get_cpu(gpio_intr_handle)) { //APP_CPU
239253
GPIO.pin[pin].int_ena = 1;
@@ -244,10 +258,15 @@ extern void __attachInterrupt(uint8_t pin, voidFuncPtr userFunc, int intr_type)
244258
esp_intr_enable(gpio_intr_handle);
245259
}
246260

261+
extern void __attachInterrupt(uint8_t pin, voidFuncPtr userFunc, int intr_type) {
262+
__attachInterruptArg(pin, (voidFuncPtrArg)userFunc, NULL, intr_type);
263+
}
264+
247265
extern void __detachInterrupt(uint8_t pin)
248266
{
249267
esp_intr_disable(gpio_intr_handle);
250-
__pinInterruptHandlers[pin] = NULL;
268+
__pinInterruptHandlers[pin].fn = NULL;
269+
__pinInterruptHandlers[pin].arg = NULL;
251270
GPIO.pin[pin].int_ena = 0;
252271
GPIO.pin[pin].int_type = 0;
253272
esp_intr_enable(gpio_intr_handle);
@@ -258,5 +277,6 @@ extern void pinMode(uint8_t pin, uint8_t mode) __attribute__ ((weak, alias("__pi
258277
extern void digitalWrite(uint8_t pin, uint8_t val) __attribute__ ((weak, alias("__digitalWrite")));
259278
extern int digitalRead(uint8_t pin) __attribute__ ((weak, alias("__digitalRead")));
260279
extern void attachInterrupt(uint8_t pin, voidFuncPtr handler, int mode) __attribute__ ((weak, alias("__attachInterrupt")));
280+
extern void attachInterruptArg(uint8_t pin, voidFuncPtr handler, void * arg, int mode) __attribute__ ((weak, alias("__attachInterruptArg")));
261281
extern void detachInterrupt(uint8_t pin) __attribute__ ((weak, alias("__detachInterrupt")));
262282

Diff for: cores/esp32/esp32-hal-gpio.h

+1
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ 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);
8283
void detachInterrupt(uint8_t pin);
8384

8485
#ifdef __cplusplus
+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
#include <Arduino.h>
2+
3+
struct Button {
4+
const uint8_t PIN;
5+
uint32_t numberKeyPresses;
6+
bool pressed;
7+
};
8+
9+
Button button1 = {23, 0, false};
10+
Button button2 = {18, 0, false};
11+
12+
void IRAM_ATTR isr(void* arg) {
13+
Button* s = static_cast<Button*>(arg);
14+
s->numberKeyPresses += 1;
15+
s->pressed = true;
16+
}
17+
18+
void IRAM_ATTR isr() {
19+
button2.numberKeyPresses += 1;
20+
button2.pressed = true;
21+
}
22+
23+
void setup() {
24+
Serial.begin(115200);
25+
pinMode(button1.PIN, INPUT_PULLUP);
26+
attachInterruptArg(button1.PIN, isr, &button1, FALLING);
27+
pinMode(button2.PIN, INPUT_PULLUP);
28+
attachInterrupt(button2.PIN, isr, FALLING);
29+
}
30+
31+
void loop() {
32+
if (button1.pressed) {
33+
Serial.printf("Button 1 has been pressed %u times\n", button1.numberKeyPresses);
34+
button1.pressed = false;
35+
}
36+
if (button2.pressed) {
37+
Serial.printf("Button 2 has been pressed %u times\n", button2.numberKeyPresses);
38+
button2.pressed = false;
39+
}
40+
static uint32_t lastMillis = 0;
41+
if (millis() - lastMillis > 10000) {
42+
lastMillis = millis();
43+
detachInterrupt(button1.PIN);
44+
}
45+
}

0 commit comments

Comments
 (0)