@@ -202,12 +202,18 @@ PinStatus digitalRead(pin_size_t pinNumber) {
202202}
203203
204204struct k_timer arduino_pin_timers[ARRAY_SIZE(arduino_pins)];
205+ struct k_timer arduino_pin_timers_timeout[ARRAY_SIZE(arduino_pins)];
205206
206207void tone_expiry_cb (struct k_timer *timer) {
207208 const struct gpio_dt_spec *spec = (gpio_dt_spec*)k_timer_user_data_get (timer);
208209 gpio_pin_toggle_dt (spec);
209210}
210211
212+ void tone_timeout_cb (struct k_timer *timer) {
213+ pin_size_t pinNumber = (pin_size_t )(uintptr_t )k_timer_user_data_get (timer);
214+ noTone (pinNumber);
215+ }
216+
211217void tone (pin_size_t pinNumber, unsigned int frequency, unsigned long duration) {
212218 struct k_timer *timer = &arduino_pin_timers[pinNumber];
213219 const struct gpio_dt_spec *spec = &arduino_pins[pinNumber];
@@ -217,6 +223,13 @@ void tone(pin_size_t pinNumber, unsigned int frequency, unsigned long duration)
217223 k_timer_user_data_set (timer, (void *)spec);
218224 gpio_pin_set_dt (spec, 1 );
219225 k_timer_start (timer, timeout, timeout);
226+
227+ if (duration > 0 ) {
228+ timer = &arduino_pin_timers_timeout[pinNumber];
229+ k_timer_init (timer, tone_timeout_cb, NULL );
230+ k_timer_user_data_set (timer, (void *)(uintptr_t )pinNumber);
231+ k_timer_start (timer, K_MSEC (duration), K_NO_WAIT);
232+ }
220233}
221234
222235void noTone (pin_size_t pinNumber) {
0 commit comments