@@ -177,8 +177,27 @@ size_t analog_pin_index(pin_size_t pinNumber) {
177177
178178static unsigned int irq_key;
179179static 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 );
180197}
181198
199+ } // namespace
200+
182201void yield (void ) {
183202 k_yield ();
184203}
@@ -212,21 +231,8 @@ PinStatus digitalRead(pin_size_t pinNumber) {
212231 return (gpio_pin_get_dt (&arduino_pins[pinNumber]) == 1 ) ? HIGH : LOW;
213232}
214233
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-
228234void 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 ;
230236 const struct gpio_dt_spec *spec = &arduino_pins[pinNumber];
231237 k_timeout_t timeout;
232238
@@ -240,20 +246,24 @@ void tone(pin_size_t pinNumber, unsigned int frequency, unsigned long duration)
240246 timeout = K_NSEC (NSEC_PER_SEC / (2 * frequency));
241247
242248 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]);
244251 gpio_pin_set_dt (spec, 1 );
245252 k_timer_start (timer, timeout, timeout);
246253
247254 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 ;
249259 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] );
251261 k_timer_start (timer, K_MSEC (duration), K_NO_WAIT);
252262 }
253263}
254264
255265void noTone (pin_size_t pinNumber) {
256- k_timer_stop (&arduino_pin_timers[pinNumber]);
266+ k_timer_stop (&arduino_pin_timers[pinNumber]. timer );
257267 gpio_pin_set_dt (&arduino_pins[pinNumber], 0 );
258268}
259269
0 commit comments