@@ -201,6 +201,51 @@ PinStatus digitalRead(pin_size_t pinNumber) {
201201 return (gpio_pin_get_dt (&arduino_pins[pinNumber]) == 1 ) ? HIGH : LOW;
202202}
203203
204+ struct k_timer arduino_pin_timers[ARRAY_SIZE(arduino_pins)];
205+ struct k_timer arduino_pin_timers_timeout[ARRAY_SIZE(arduino_pins)];
206+
207+ void tone_expiry_cb (struct k_timer *timer) {
208+ const struct gpio_dt_spec *spec = (gpio_dt_spec*)k_timer_user_data_get (timer);
209+ gpio_pin_toggle_dt (spec);
210+ }
211+
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+
217+ void tone (pin_size_t pinNumber, unsigned int frequency, unsigned long duration) {
218+ struct k_timer *timer = &arduino_pin_timers[pinNumber];
219+ const struct gpio_dt_spec *spec = &arduino_pins[pinNumber];
220+ k_timeout_t timeout;
221+
222+ pinMode (pinNumber, OUTPUT);
223+
224+ if (frequency == 0 ) {
225+ gpio_pin_set_dt (spec, 0 );
226+ return ;
227+ }
228+
229+ timeout = K_NSEC (NSEC_PER_SEC / (2 * frequency));
230+
231+ k_timer_init (timer, tone_expiry_cb, NULL );
232+ k_timer_user_data_set (timer, (void *)spec);
233+ gpio_pin_set_dt (spec, 1 );
234+ k_timer_start (timer, timeout, timeout);
235+
236+ if (duration > 0 ) {
237+ timer = &arduino_pin_timers_timeout[pinNumber];
238+ k_timer_init (timer, tone_timeout_cb, NULL );
239+ k_timer_user_data_set (timer, (void *)(uintptr_t )pinNumber);
240+ k_timer_start (timer, K_MSEC (duration), K_NO_WAIT);
241+ }
242+ }
243+
244+ void noTone (pin_size_t pinNumber) {
245+ k_timer_stop (&arduino_pin_timers[pinNumber]);
246+ gpio_pin_set_dt (&arduino_pins[pinNumber], 0 );
247+ }
248+
204249void delay (unsigned long ms) { k_sleep (K_MSEC (ms)); }
205250
206251void delayMicroseconds (unsigned int us) { k_sleep (K_USEC (us)); }
0 commit comments