Skip to content

Commit c77aed4

Browse files
bertmelisme-no-dev
authored andcommitted
Allow using argument with attachInterrupt (#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 901a341 commit c77aed4

File tree

3 files changed

+75
-9
lines changed

3 files changed

+75
-9
lines changed

‎cores/esp32/esp32-hal-gpio.c‎

Lines changed: 29 additions & 9 deletions
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
typedefvoid (*voidFuncPtr)(void);
73-
staticvoidFuncPtr__pinInterruptHandlers[GPIO_PIN_COUNT] ={0,};
73+
typedefvoid (*voidFuncPtrArg)(void*);
74+
typedefstruct{
75+
voidFuncPtrfn;
76+
void*arg;
77+
} InterruptHandle_t;
78+
staticInterruptHandle_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
staticintr_handle_tgpio_intr_handle=NULL;
195200

196-
staticvoidIRAM_ATTR__onPinInterrupt(void*arg)
201+
staticvoidIRAM_ATTR__onPinInterrupt()
197202
{
198203
uint32_tgpio_intr_status_l=0;
199204
uint32_tgpio_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-
externvoid__attachInterrupt(uint8_tpin, voidFuncPtruserFunc, intintr_type)
241+
externvoid__attachInterruptArg(uint8_tpin, voidFuncPtrArguserFunc, void*arg, intintr_type)
229242
{
230243
staticboolinterrupt_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+
externvoid__attachInterrupt(uint8_tpin, voidFuncPtruserFunc, intintr_type){
262+
__attachInterruptArg(pin, (voidFuncPtrArg)userFunc, NULL, intr_type);
263+
}
264+
247265
externvoid__detachInterrupt(uint8_tpin)
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
externvoiddigitalWrite(uint8_tpin, uint8_tval) __attribute__ ((weak, alias("__digitalWrite")));
259278
externintdigitalRead(uint8_tpin) __attribute__ ((weak, alias("__digitalRead")));
260279
externvoidattachInterrupt(uint8_tpin, voidFuncPtrhandler, intmode) __attribute__ ((weak, alias("__attachInterrupt")));
280+
externvoidattachInterruptArg(uint8_tpin, voidFuncPtrhandler, void*arg, intmode) __attribute__ ((weak, alias("__attachInterruptArg")));
261281
externvoiddetachInterrupt(uint8_tpin) __attribute__ ((weak, alias("__detachInterrupt")));
262282

‎cores/esp32/esp32-hal-gpio.h‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ void digitalWrite(uint8_t pin, uint8_t val);
7979
intdigitalRead(uint8_tpin);
8080

8181
voidattachInterrupt(uint8_tpin, void (*)(void), intmode);
82+
voidattachInterruptArg(uint8_tpin, void (*)(void), void*arg, intmode);
8283
voiddetachInterrupt(uint8_tpin);
8384

8485
#ifdef__cplusplus
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
#include<Arduino.h>
2+
3+
structButton{
4+
constuint8_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+
voidsetup(){
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+
voidloop(){
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+
staticuint32_t lastMillis = 0;
41+
if (millis() - lastMillis > 10000){
42+
lastMillis = millis();
43+
detachInterrupt(button1.PIN);
44+
}
45+
}

0 commit comments

Comments
(0)