@@ -105,12 +105,15 @@ extern int ICACHE_RAM_ATTR __digitalRead(uint8_t pin) {
105
105
*/
106
106
107
107
typedef void (* voidFuncPtr )(void );
108
+ typedef void (* voidFuncPtrArg )(void * );
108
109
109
110
typedef struct {
110
111
uint8_t mode ;
111
112
void (* fn )(void );
113
+ void * arg ;
112
114
} interrupt_handler_t ;
113
115
116
+
114
117
static interrupt_handler_t interrupt_handlers [16 ];
115
118
static uint32_t interrupt_reg = 0 ;
116
119
@@ -127,31 +130,44 @@ void ICACHE_RAM_ATTR interrupt_handler(void *arg) {
127
130
while (!(changedbits & (1 << i ))) i ++ ;
128
131
changedbits &= ~(1 << i );
129
132
interrupt_handler_t * handler = & interrupt_handlers [i ];
130
- if (handler -> fn &&
131
- (handler -> mode == CHANGE ||
133
+ if (handler -> fn &&
134
+ (handler -> mode == CHANGE ||
132
135
(handler -> mode & 1 ) == !!(levels & (1 << i )))) {
133
136
// to make ISR compatible to Arduino AVR model where interrupts are disabled
134
137
// we disable them before we call the client ISR
135
- uint32_t savedPS = xt_rsil (15 ); // stop other interrupts
136
- handler -> fn ();
137
- xt_wsr_ps (savedPS );
138
+ uint32_t savedPS = xt_rsil (15 ); // stop other interrupts
139
+ if (handler -> arg )
140
+ {
141
+ ((voidFuncPtrArg )handler -> fn )(handler -> arg );
142
+ }
143
+ else
144
+ {
145
+ handler -> fn ();
146
+ }
147
+ xt_wsr_ps (savedPS );
138
148
}
139
149
}
140
150
ETS_GPIO_INTR_ENABLE ();
141
151
}
142
152
143
- extern void ICACHE_RAM_ATTR __attachInterrupt (uint8_t pin , voidFuncPtr userFunc , int mode ) {
153
+ extern void ICACHE_RAM_ATTR __attachInterruptArg (uint8_t pin , voidFuncPtr userFunc , void * arg , int mode ) {
144
154
if (pin < 16 ) {
145
155
interrupt_handler_t * handler = & interrupt_handlers [pin ];
146
156
handler -> mode = mode ;
147
157
handler -> fn = userFunc ;
158
+ handler -> arg = arg ;
148
159
interrupt_reg |= (1 << pin );
149
160
GPC (pin ) &= ~(0xF << GPCI );//INT mode disabled
150
161
GPIEC = (1 << pin ); //Clear Interrupt for this pin
151
162
GPC (pin ) |= ((mode & 0xF ) << GPCI );//INT mode "mode"
152
163
}
153
164
}
154
165
166
+ extern void ICACHE_RAM_ATTR __attachInterrupt (uint8_t pin , voidFuncPtr userFunc , int mode )
167
+ {
168
+ __attachInterruptArg (pin , userFunc , 0 , mode );
169
+ }
170
+
155
171
extern void ICACHE_RAM_ATTR __detachInterrupt (uint8_t pin ) {
156
172
if (pin < 16 ) {
157
173
GPC (pin ) &= ~(0xF << GPCI );//INT mode disabled
@@ -160,6 +176,7 @@ extern void ICACHE_RAM_ATTR __detachInterrupt(uint8_t pin) {
160
176
interrupt_handler_t * handler = & interrupt_handlers [pin ];
161
177
handler -> mode = 0 ;
162
178
handler -> fn = 0 ;
179
+ handler -> arg = 0 ;
163
180
}
164
181
}
165
182
@@ -176,7 +193,7 @@ void initPins() {
176
193
for (int i = 12 ; i <= 16 ; ++ i ) {
177
194
pinMode (i , INPUT );
178
195
}
179
-
196
+
180
197
ETS_GPIO_INTR_ATTACH (interrupt_handler , & interrupt_reg );
181
198
ETS_GPIO_INTR_ENABLE ();
182
199
}
@@ -186,3 +203,4 @@ extern void digitalWrite(uint8_t pin, uint8_t val) __attribute__ ((weak, alias("
186
203
extern int digitalRead (uint8_t pin ) __attribute__ ((weak , alias ("__digitalRead" )));
187
204
extern void attachInterrupt (uint8_t pin , voidFuncPtr handler , int mode ) __attribute__ ((weak , alias ("__attachInterrupt" )));
188
205
extern void detachInterrupt (uint8_t pin ) __attribute__ ((weak , alias ("__detachInterrupt" )));
206
+
0 commit comments