Skip to content

Commit f5d1b9e

Browse files
committed
zephyrCommon: Add support for tone timeout
- Use another one-shot timer to stop the first timer. Signed-off-by: Ayush Singh <[email protected]>
1 parent f47b846 commit f5d1b9e

File tree

1 file changed

+13
-0
lines changed

1 file changed

+13
-0
lines changed

cores/arduino/zephyrCommon.cpp

+13
Original file line numberDiff line numberDiff line change
@@ -202,12 +202,18 @@ PinStatus digitalRead(pin_size_t pinNumber) {
202202
}
203203

204204
struct k_timer arduino_pin_timers[ARRAY_SIZE(arduino_pins)];
205+
struct k_timer arduino_pin_timers_timeout[ARRAY_SIZE(arduino_pins)];
205206

206207
void 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+
211217
void 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

222235
void noTone(pin_size_t pinNumber) {

0 commit comments

Comments
 (0)