2
2
#include < Schedule.h>
3
3
#include < Arduino.h>
4
4
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
9
8
{
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 ();
12
16
}
13
- if (localArg->scheduledFunction )
17
+
18
+ void cleanupFunctional (void * arg)
14
19
{
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;
21
22
}
23
+
22
24
}
23
25
24
- void cleanupFunctional ( void * arg )
26
+ void attachInterrupt ( uint8_t pin, std::function< void ( void )> intRoutine, int mode )
25
27
{
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
+ }
28
41
}
29
42
30
43
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
35
48
cleanupFunctional (localArg);
36
49
}
37
50
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
+ };
41
61
42
- attachInterruptArg (pin, interruptFunctional, as, mode);
62
+ attachInterruptArg (pin, interruptFunctional, arg, mode);
63
+ }
43
64
}
44
65
45
66
void detachFunctionalInterrupt (uint8_t pin)
0 commit comments