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
3043void 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
4566void detachFunctionalInterrupt (uint8_t pin)
0 commit comments