Skip to content

Commit 5c46e6d

Browse files
committed
Bring back FunctionalInterrupt's attachInterrupt()
1 parent ef061bc commit 5c46e6d

File tree

2 files changed

+42
-30
lines changed

2 files changed

+42
-30
lines changed

libraries/FunctionalInterrupt/src/FunctionalInterrupt.cpp

+41-20
Original file line numberDiff line numberDiff line change
@@ -2,29 +2,42 @@
22
#include <Schedule.h>
33
#include <Arduino.h>
44

5-
void ICACHE_RAM_ATTR interruptFunctional(void* arg)
6-
{
7-
ArgStructure* localArg = static_cast<ArgStructure*>(arg);
8-
if (localArg->interruptInfo)
5+
namespace {
6+
7+
struct ArgStructure
98
{
10-
localArg->interruptInfo->value = digitalRead(localArg->interruptInfo->pin);
11-
localArg->interruptInfo->micro = micros();
9+
std::function<void()> function = nullptr;
10+
};
11+
12+
void ICACHE_RAM_ATTR interruptFunctional(void* arg)
13+
{
14+
ArgStructure* localArg = static_cast<ArgStructure*>(arg);
15+
localArg->function();
1216
}
13-
if (localArg->scheduledFunction)
17+
18+
void cleanupFunctional(void* arg)
1419
{
15-
schedule_function(
16-
[scheduledFunction = localArg->scheduledFunction,
17-
interruptInfo = *localArg->interruptInfo]()
18-
{
19-
scheduledFunction(interruptInfo);
20-
});
20+
ArgStructure* localArg = static_cast<ArgStructure*>(arg);
21+
delete localArg;
2122
}
23+
2224
}
2325

24-
void cleanupFunctional(void* arg)
26+
void attachInterrupt(uint8_t pin, std::function<void(void)> intRoutine, int mode)
2527
{
26-
ArgStructure* localArg = static_cast<ArgStructure*>(arg);
27-
delete localArg;
28+
void* localArg = detachInterruptArg(pin);
29+
if (localArg)
30+
{
31+
cleanupFunctional(localArg);
32+
}
33+
34+
if (intRoutine)
35+
{
36+
ArgStructure* arg = new ArgStructure;
37+
arg->function = std::move(intRoutine);
38+
39+
attachInterruptArg(pin, interruptFunctional, arg, mode);
40+
}
2841
}
2942

3043
void attachScheduledInterrupt(uint8_t pin, std::function<void(InterruptInfo)> scheduledIntRoutine, int mode)
@@ -35,11 +48,19 @@ void attachScheduledInterrupt(uint8_t pin, std::function<void(InterruptInfo)> sc
3548
cleanupFunctional(localArg);
3649
}
3750

38-
ArgStructure* as = new ArgStructure;
39-
as->interruptInfo = new InterruptInfo(pin);
40-
as->scheduledFunction = scheduledIntRoutine;
51+
if (scheduledIntRoutine)
52+
{
53+
ArgStructure* arg = new ArgStructure;
54+
arg->function = [scheduledIntRoutine = std::move(scheduledIntRoutine), pin]()
55+
{
56+
InterruptInfo interruptInfo(pin);
57+
interruptInfo.value = digitalRead(pin);
58+
interruptInfo.micro = micros();
59+
schedule_function([scheduledIntRoutine, interruptInfo]() { scheduledIntRoutine(std::move(interruptInfo)); });
60+
};
4161

42-
attachInterruptArg(pin, interruptFunctional, as, mode);
62+
attachInterruptArg(pin, interruptFunctional, arg, mode);
63+
}
4364
}
4465

4566
void detachFunctionalInterrupt(uint8_t pin)

libraries/FunctionalInterrupt/src/FunctionalInterrupt.h

+1-10
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,7 @@ struct InterruptInfo
1313
uint32_t micro = 0;
1414
};
1515

16-
struct ArgStructure
17-
{
18-
~ArgStructure()
19-
{
20-
delete interruptInfo;
21-
}
22-
InterruptInfo* interruptInfo = nullptr;
23-
std::function<void(InterruptInfo)> scheduledFunction = nullptr;
24-
};
25-
16+
void attachInterrupt(uint8_t pin, std::function<void(void)> intRoutine, int mode);
2617
void attachScheduledInterrupt(uint8_t pin, std::function<void(InterruptInfo)> scheduledIntRoutine, int mode);
2718
void detachFunctionalInterrupt(uint8_t pin);
2819

0 commit comments

Comments
 (0)