Skip to content

Commit b21b3b9

Browse files
committed
Implementation
1 parent 05c5e46 commit b21b3b9

File tree

2 files changed

+27
-5
lines changed

2 files changed

+27
-5
lines changed

cores/esp32/FunctionalInterrupt.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ typedef void (*voidFuncPtrArg)(void*);
1313

1414
extern "C"
1515
{
16-
extern void __attachInterruptArg(uint8_t pin, voidFuncPtrArg userFunc, void * arg, int intr_type);
16+
extern void __attachInterruptFunctionalArg(uint8_t pin, voidFuncPtrArg userFunc, void * arg, int intr_type, bool functional);
1717
}
1818

1919
void interruptFunctional(void* arg)
@@ -28,7 +28,7 @@ void interruptFunctional(void* arg)
2828
void attachInterrupt(uint8_t pin, std::function<void(void)> intRoutine, int mode)
2929
{
3030
// use the local interrupt routine which takes the ArgStructure as argument
31-
__attachInterruptArg (pin, (voidFuncPtrArg)interruptFunctional, new InterruptArgStructure{intRoutine}, mode);
31+
__attachInterruptFunctionalArg (pin, (voidFuncPtrArg)interruptFunctional, new InterruptArgStructure{intRoutine}, mode, true);
3232
}
3333

3434
extern "C"

cores/esp32/esp32-hal-gpio.c

+25-3
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ typedef void (*voidFuncPtrArg)(void*);
7474
typedef struct {
7575
voidFuncPtr fn;
7676
void* arg;
77+
bool functional;
7778
} InterruptHandle_t;
7879
static InterruptHandle_t __pinInterruptHandlers[GPIO_PIN_COUNT] = {0,};
7980

@@ -238,16 +239,26 @@ static void IRAM_ATTR __onPinInterrupt()
238239
}
239240
}
240241

241-
extern void __attachInterruptArg(uint8_t pin, voidFuncPtrArg userFunc, void * arg, int intr_type)
242+
extern void cleanupFunctional(void* arg);
243+
244+
extern void __attachInterruptFunctionalArg(uint8_t pin, voidFuncPtrArg userFunc, void * arg, int intr_type, bool functional)
242245
{
243246
static bool interrupt_initialized = false;
244-
247+
245248
if(!interrupt_initialized) {
246249
interrupt_initialized = true;
247250
esp_intr_alloc(ETS_GPIO_INTR_SOURCE, (int)ESP_INTR_FLAG_IRAM, __onPinInterrupt, NULL, &gpio_intr_handle);
248251
}
252+
253+
// if new attach without detach remove old info
254+
if (__pinInterruptHandlers[pin].functional && __pinInterruptHandlers[pin].arg)
255+
{
256+
cleanupFunctional(__pinInterruptHandlers[pin].arg);
257+
}
249258
__pinInterruptHandlers[pin].fn = (voidFuncPtr)userFunc;
250259
__pinInterruptHandlers[pin].arg = arg;
260+
__pinInterruptHandlers[pin].functional = functional;
261+
251262
esp_intr_disable(gpio_intr_handle);
252263
if(esp_intr_get_cpu(gpio_intr_handle)) { //APP_CPU
253264
GPIO.pin[pin].int_ena = 1;
@@ -258,15 +269,26 @@ extern void __attachInterruptArg(uint8_t pin, voidFuncPtrArg userFunc, void * ar
258269
esp_intr_enable(gpio_intr_handle);
259270
}
260271

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+
261277
extern void __attachInterrupt(uint8_t pin, voidFuncPtr userFunc, int intr_type) {
262-
__attachInterruptArg(pin, (voidFuncPtrArg)userFunc, NULL, intr_type);
278+
__attachInterruptFunctionalArg(pin, (voidFuncPtrArg)userFunc, NULL, intr_type, false);
263279
}
264280

265281
extern void __detachInterrupt(uint8_t pin)
266282
{
267283
esp_intr_disable(gpio_intr_handle);
284+
if (__pinInterruptHandlers[pin].functional && __pinInterruptHandlers[pin].arg)
285+
{
286+
cleanupFunctional(__pinInterruptHandlers[pin].arg);
287+
}
268288
__pinInterruptHandlers[pin].fn = NULL;
269289
__pinInterruptHandlers[pin].arg = NULL;
290+
__pinInterruptHandlers[pin].arg = false;
291+
270292
GPIO.pin[pin].int_ena = 0;
271293
GPIO.pin[pin].int_type = 0;
272294
esp_intr_enable(gpio_intr_handle);

0 commit comments

Comments
 (0)