@@ -177,8 +177,27 @@ size_t analog_pin_index(pin_size_t pinNumber) {
177
177
178
178
static unsigned int irq_key;
179
179
static bool interrupts_disabled = false ;
180
+
181
+ struct pin_timer {
182
+ struct k_timer timer;
183
+ struct gpio_dt_spec spec;
184
+ };
185
+
186
+ struct pin_timer arduino_pin_timers[ARRAY_SIZE(arduino_pins)];
187
+ struct pin_timer arduino_pin_timers_timeout[ARRAY_SIZE(arduino_pins)];
188
+
189
+ void tone_expiry_cb (struct k_timer *timer) {
190
+ struct pin_timer * pt = (struct pin_timer *)k_timer_user_data_get (timer);
191
+ gpio_pin_toggle_dt (&pt->spec );
192
+ }
193
+
194
+ void tone_timeout_cb (struct k_timer *timer) {
195
+ struct pin_timer * pt = (struct pin_timer *)k_timer_user_data_get (timer);
196
+ noTone (pt->spec .pin );
180
197
}
181
198
199
+ } // namespace
200
+
182
201
void yield (void ) {
183
202
k_yield ();
184
203
}
@@ -212,21 +231,8 @@ PinStatus digitalRead(pin_size_t pinNumber) {
212
231
return (gpio_pin_get_dt (&arduino_pins[pinNumber]) == 1 ) ? HIGH : LOW;
213
232
}
214
233
215
- struct k_timer arduino_pin_timers[ARRAY_SIZE(arduino_pins)];
216
- struct k_timer arduino_pin_timers_timeout[ARRAY_SIZE(arduino_pins)];
217
-
218
- void tone_expiry_cb (struct k_timer *timer) {
219
- const struct gpio_dt_spec *spec = (gpio_dt_spec*)k_timer_user_data_get (timer);
220
- gpio_pin_toggle_dt (spec);
221
- }
222
-
223
- void tone_timeout_cb (struct k_timer *timer) {
224
- pin_size_t pinNumber = (pin_size_t )(uintptr_t )k_timer_user_data_get (timer);
225
- noTone (pinNumber);
226
- }
227
-
228
234
void tone (pin_size_t pinNumber, unsigned int frequency, unsigned long duration) {
229
- struct k_timer *timer = &arduino_pin_timers[pinNumber];
235
+ struct k_timer *timer = &arduino_pin_timers[pinNumber]. timer ;
230
236
const struct gpio_dt_spec *spec = &arduino_pins[pinNumber];
231
237
k_timeout_t timeout;
232
238
@@ -240,20 +246,24 @@ void tone(pin_size_t pinNumber, unsigned int frequency, unsigned long duration)
240
246
timeout = K_NSEC (NSEC_PER_SEC / (2 * frequency));
241
247
242
248
k_timer_init (timer, tone_expiry_cb, NULL );
243
- k_timer_user_data_set (timer, (void *)spec);
249
+ arduino_pin_timers[pinNumber].spec = *spec;
250
+ k_timer_user_data_set (timer, &arduino_pin_timers[pinNumber]);
244
251
gpio_pin_set_dt (spec, 1 );
245
252
k_timer_start (timer, timeout, timeout);
246
253
247
254
if (duration > 0 ) {
248
- timer = &arduino_pin_timers_timeout[pinNumber];
255
+ timer = &arduino_pin_timers_timeout[pinNumber].timer ;
256
+ arduino_pin_timers_timeout[pinNumber].spec .port = nullptr ;
257
+ arduino_pin_timers_timeout[pinNumber].spec .pin = pinNumber;
258
+ arduino_pin_timers_timeout[pinNumber].spec .dt_flags = 0 ;
249
259
k_timer_init (timer, tone_timeout_cb, NULL );
250
- k_timer_user_data_set (timer, ( void *)( uintptr_t ) pinNumber);
260
+ k_timer_user_data_set (timer, &arduino_pin_timers_timeout[ pinNumber] );
251
261
k_timer_start (timer, K_MSEC (duration), K_NO_WAIT);
252
262
}
253
263
}
254
264
255
265
void noTone (pin_size_t pinNumber) {
256
- k_timer_stop (&arduino_pin_timers[pinNumber]);
266
+ k_timer_stop (&arduino_pin_timers[pinNumber]. timer );
257
267
gpio_pin_set_dt (&arduino_pins[pinNumber], 0 );
258
268
}
259
269
0 commit comments