Skip to content

Commit e1b7227

Browse files
committed
timer
1 parent dcbcbb2 commit e1b7227

File tree

1 file changed

+28
-18
lines changed

1 file changed

+28
-18
lines changed

cores/arduino/zephyrCommon.cpp

Lines changed: 28 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -177,8 +177,27 @@ size_t analog_pin_index(pin_size_t pinNumber) {
177177

178178
static unsigned int irq_key;
179179
static 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+
182201
void 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-
228234
void 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

255265
void 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

Comments
 (0)