18
18
19
19
#include " Arduino.h"
20
20
21
- #ifdef digitalPinToInterruptObj
22
- static mbed::InterruptIn* PinNameToInterruptObj (PinName P) {
23
- // reverse search for pinName in g_APinDescription[P].name fields
24
- for (pin_size_t i=0 ; i < PINS_COUNT; i++) {
25
- if (g_APinDescription[i].name == P) {
26
- return g_APinDescription[i].irq ;
27
- }
28
- }
29
- return NULL ;
30
- }
31
- #endif
32
-
33
21
void detachInterrupt (PinName interruptNum) {
34
- # ifdef digitalPinToInterruptObj
35
- if (PinNameToInterruptObj (interruptNum) != NULL ) {
36
- delete PinNameToInterruptObj (interruptNum );
22
+ pin_size_t idx = PinNameToIndex (interruptNum);
23
+ if (idx != NOT_A_PIN ) {
24
+ detachInterrupt (idx );
37
25
}
38
- #endif
39
26
}
40
27
41
28
void detachInterrupt (pin_size_t interruptNum) {
42
- #ifdef digitalPinToInterruptObj
43
- if (digitalPinToInterruptObj (interruptNum) != NULL ) {
29
+ if ((interruptNum < PINS_COUNT) && (digitalPinToInterruptObj (interruptNum) != NULL )) {
44
30
delete digitalPinToInterruptObj (interruptNum);
45
31
}
46
- #endif
47
32
}
48
33
49
34
void attachInterruptParam (PinName interruptNum, voidFuncPtrParam func, PinStatus mode, void * param) {
50
- detachInterrupt (interruptNum);
51
- mbed::InterruptIn* irq = new mbed::InterruptIn (interruptNum);
52
- if (mode == CHANGE) {
53
- irq->rise (mbed::callback (func, param));
54
- irq->fall (mbed::callback (func, param));
55
- } else if (mode == FALLING) {
56
- irq->fall (mbed::callback (func, param));
35
+ pin_size_t idx = PinNameToIndex (interruptNum);
36
+ if (idx != NOT_A_PIN) {
37
+ attachInterruptParam (PinNameToIndex (interruptNum), func, mode, param);
57
38
} else {
58
- irq->rise (mbed::callback (func, param));
39
+ mbed::InterruptIn* irq = new mbed::InterruptIn (interruptNum);
40
+ if (mode == CHANGE) {
41
+ irq->rise (mbed::callback (func, param));
42
+ irq->fall (mbed::callback (func, param));
43
+ } else if (mode == FALLING) {
44
+ irq->fall (mbed::callback (func, param));
45
+ } else {
46
+ irq->rise (mbed::callback (func, param));
47
+ }
59
48
}
60
- #ifdef digitalPinToInterruptObj
61
- digitalPinToInterruptObj (interruptNum) = irq;
62
- #endif
63
49
}
64
50
65
51
void attachInterrupt (PinName interruptNum, voidFuncPtr func, PinStatus mode) {
66
52
attachInterruptParam (interruptNum, (voidFuncPtrParam)func, mode, NULL );
67
53
}
68
54
69
55
void attachInterruptParam (pin_size_t interruptNum, voidFuncPtrParam func, PinStatus mode, void * param) {
56
+ if (interruptNum >= PINS_COUNT) {
57
+ return ;
58
+ }
70
59
detachInterrupt (interruptNum);
71
60
mbed::InterruptIn* irq = new mbed::InterruptIn (digitalPinToPinName (interruptNum));
72
61
if (mode == CHANGE) {
@@ -77,11 +66,19 @@ void attachInterruptParam(pin_size_t interruptNum, voidFuncPtrParam func, PinSta
77
66
} else {
78
67
irq->rise (mbed::callback (func, param));
79
68
}
80
- #ifdef digitalPinToInterruptObj
81
69
digitalPinToInterruptObj (interruptNum) = irq;
82
- #endif
70
+ // Give a default pullup for the pin, since calling InterruptIn with PinMode is impossible
71
+ if (digitalPinToGpio (interruptNum) == NULL ) {
72
+ if (mode == FALLING) {
73
+ pinMode (interruptNum, INPUT_PULLUP);
74
+ } else if (mode == RISING) {
75
+ pinMode (interruptNum, INPUT_PULLDOWN);
76
+ } else {
77
+ pinMode (interruptNum, INPUT);
78
+ }
79
+ }
83
80
}
84
81
85
82
void attachInterrupt (pin_size_t interruptNum, voidFuncPtr func, PinStatus mode) {
86
83
attachInterruptParam (interruptNum, (voidFuncPtrParam)func, mode, NULL );
87
- }
84
+ }
0 commit comments