Skip to content

Commit 2718262

Browse files
committed
zephyrCommon: Add tone and noTone
- Add implementation of tone and noTone - Use another one-shot timer to stop the first timer. - Silence when frequency = 0 Signed-off-by: Ayush Singh <[email protected]>
1 parent 4c34ceb commit 2718262

File tree

2 files changed

+46
-0
lines changed

2 files changed

+46
-0
lines changed

cores/arduino/main.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ int main(void) {
1212
for (;;) {
1313
loop();
1414
if (arduino::serialEventRun) arduino::serialEventRun();
15+
k_yield();
1516
}
1617

1718
return 0;

cores/arduino/zephyrCommon.cpp

+45
Original file line numberDiff line numberDiff line change
@@ -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+
204249
void delay(unsigned long ms) { k_sleep(K_MSEC(ms)); }
205250

206251
void delayMicroseconds(unsigned int us) { k_sleep(K_USEC(us)); }

0 commit comments

Comments
 (0)