18
18
19
19
#include "WInterrupts.h"
20
20
21
- typedef void (* interruptCB )(void );
21
+ typedef void (* interruptCB )(void * );
22
22
23
23
static interruptCB callbacksPioA [32 ];
24
24
static interruptCB callbacksPioB [32 ];
25
25
static interruptCB callbacksPioC [32 ];
26
26
static interruptCB callbacksPioD [32 ];
27
27
28
+ static void * callbackParamsPioA [32 ];
29
+ static void * callbackParamsPioB [32 ];
30
+ static void * callbackParamsPioC [32 ];
31
+ static void * callbackParamsPioD [32 ];
32
+
28
33
/* Configure PIO interrupt sources */
29
34
static void __initialize () {
30
35
int i ;
@@ -60,8 +65,17 @@ static void __initialize() {
60
65
NVIC_EnableIRQ (PIOD_IRQn );
61
66
}
62
67
68
+ void attachInterrupt (uint32_t pin , void (* callback )(void ), uint32_t mode ) {
69
+ // THIS IMPLEMENTATION IS NOT PORTABLE!
70
+ //
71
+ // On ARM's calling convention, calling a function with more arguments than it declares
72
+ // is OK - The extra parameter is ignored and causes no harm
73
+ //
74
+ // This implementation takes advantage of it to support callbacks with and without parameters with minimum overhead.
75
+ attachInterruptParam (pin , (void (* )(void * ))callback , mode , NULL );
76
+ }
63
77
64
- void attachInterrupt (uint32_t pin , void (* callback )(void ), uint32_t mode )
78
+ void attachInterruptParam (uint32_t pin , void (* callback )(void * ), uint32_t mode , void * param )
65
79
{
66
80
static int enabled = 0 ;
67
81
if (!enabled ) {
@@ -79,14 +93,19 @@ void attachInterrupt(uint32_t pin, void (*callback)(void), uint32_t mode)
79
93
;
80
94
81
95
// Set callback function
82
- if (pio == PIOA )
96
+ if (pio == PIOA ) {
83
97
callbacksPioA [pos ] = callback ;
84
- if (pio == PIOB )
98
+ callbackParamsPioA [pos ] = param ;
99
+ } else if (pio == PIOB ) {
85
100
callbacksPioB [pos ] = callback ;
86
- if (pio == PIOC )
101
+ callbackParamsPioB [pos ] = param ;
102
+ } else if (pio == PIOC ) {
87
103
callbacksPioC [pos ] = callback ;
88
- if (pio == PIOD )
104
+ callbackParamsPioC [pos ] = param ;
105
+ } else if (pio == PIOD ) {
89
106
callbacksPioD [pos ] = callback ;
107
+ callbackParamsPioD [pos ] = param ;
108
+ }
90
109
91
110
// Configure the interrupt mode
92
111
if (mode == CHANGE ) {
@@ -139,7 +158,7 @@ void PIOA_Handler(void) {
139
158
while ((leading_zeros = __CLZ (isr ))< 32 )
140
159
{
141
160
uint8_t pin = 32 - leading_zeros - 1 ;
142
- if (callbacksPioA [pin ]) callbacksPioA [pin ]();
161
+ if (callbacksPioA [pin ]) callbacksPioA [pin ](callbackParamsPioA [ pin ] );
143
162
isr = isr & (~(1 <<pin ));
144
163
}
145
164
}
@@ -150,7 +169,7 @@ void PIOB_Handler(void) {
150
169
while ((leading_zeros = __CLZ (isr ))< 32 )
151
170
{
152
171
uint8_t pin = 32 - leading_zeros - 1 ;
153
- if (callbacksPioB [pin ]) callbacksPioB [pin ]();
172
+ if (callbacksPioB [pin ]) callbacksPioB [pin ](callbackParamsPioB [ pin ] );
154
173
isr = isr & (~(1 <<pin ));
155
174
}
156
175
}
@@ -161,7 +180,7 @@ void PIOC_Handler(void) {
161
180
while ((leading_zeros = __CLZ (isr ))< 32 )
162
181
{
163
182
uint8_t pin = 32 - leading_zeros - 1 ;
164
- if (callbacksPioC [pin ]) callbacksPioC [pin ]();
183
+ if (callbacksPioC [pin ]) callbacksPioC [pin ](callbackParamsPioC [ pin ] );
165
184
isr = isr & (~(1 <<pin ));
166
185
}
167
186
}
@@ -172,7 +191,7 @@ void PIOD_Handler(void) {
172
191
while ((leading_zeros = __CLZ (isr ))< 32 )
173
192
{
174
193
uint8_t pin = 32 - leading_zeros - 1 ;
175
- if (callbacksPioD [pin ]) callbacksPioD [pin ]();
194
+ if (callbacksPioD [pin ]) callbacksPioD [pin ](callbackParamsPioD [ pin ] );
176
195
isr = isr & (~(1 <<pin ));
177
196
}
178
197
}
0 commit comments