@@ -103,9 +103,23 @@ constexpr const N max_in_list(const N max, const Head &head, const Tail &...tail
103103 return max_in_list ((max >= head) ? max : head, tail...);
104104}
105105
106+ template <class N , class Head >
107+ constexpr const N sum_in_list (const N acc, const Head& head)
108+ {
109+ return acc + head;
110+ }
111+
112+ template <class N , class Head , class ... Tail>
113+ constexpr const N sum_in_list (const N acc, const Head& head, const Tail&... tail)
114+ {
115+ return sum_in_list (acc + head, tail...);
116+ }
117+
106118#define GPIO_NGPIOS (n, p, i ) DT_PROP(DT_GPIO_CTLR_BY_IDX(n, p, i), ngpios)
107119const int max_ngpios = max_in_list(
108120 0 , DT_FOREACH_PROP_ELEM_SEP(DT_PATH(zephyr_user), digital_pin_gpios, GPIO_NGPIOS, (, )));
121+ const int sum_ngpios = sum_in_list(
122+ 0 , DT_FOREACH_PROP_ELEM_SEP(DT_PATH(zephyr_user), digital_pin_gpios, GPIO_NGPIOS, (, )));
109123
110124/*
111125 * GPIO callback implementation
@@ -248,49 +262,56 @@ struct pin_timer {
248262 struct gpio_dt_spec spec;
249263};
250264
251- struct k_timer arduino_pin_timers[ARRAY_SIZE(arduino_pins) ];
252- struct k_timer arduino_pin_timers_timeout[ARRAY_SIZE(arduino_pins) ];
265+ struct pin_timer arduino_pin_timers[sum_ngpios ];
266+ struct pin_timer arduino_pin_timers_timeout[sum_ngpios ];
253267
254- void tone_expiry_cb (struct k_timer *timer) {
255- const struct gpio_dt_spec *spec = (gpio_dt_spec*)k_timer_user_data_get (timer);
256- gpio_pin_toggle_dt (spec);
268+ void tone_expiry_cb (struct k_timer *timer)
269+ {
270+ struct pin_timer *pt = (struct pin_timer *)k_timer_user_data_get (timer);
271+ gpio_pin_toggle_dt (&pt->spec );
257272}
258273
259274void tone_timeout_cb (struct k_timer *timer) {
260- pin_size_t pinNumber = (pin_size_t )( uintptr_t )k_timer_user_data_get (timer);
261- noTone (pinNumber );
275+ struct pin_timer *pt = (struct pin_timer * )k_timer_user_data_get (timer);
276+ noTone (global_gpio_pin (pt-> spec . port , pt-> spec . pin ) );
262277}
263278
264279void tone (pin_size_t pinNumber, unsigned int frequency, unsigned long duration) {
265- struct k_timer *timer = &arduino_pin_timers[pinNumber];
266- const struct gpio_dt_spec *spec = &arduino_pins [pinNumber];
280+ struct k_timer *timer = &arduino_pin_timers[pinNumber]. timer ;
281+ const struct gpio_dt_spec *spec = &arduino_pin_timers [pinNumber]. spec ;
267282 k_timeout_t timeout;
283+ arduino_pin_timers[pinNumber].spec .port = local_gpio_port (pinNumber);
284+ arduino_pin_timers[pinNumber].spec .pin = local_gpio_pin (pinNumber);
285+ arduino_pin_timers[pinNumber].spec .dt_flags = local_gpio_dt_flags (pinNumber);
268286
269287 pinMode (pinNumber, OUTPUT);
270288
271289 if (frequency == 0 ) {
272- gpio_pin_set_dt (spec, 0 );
290+ gpio_pin_set_dt (&arduino_pin_timers[pinNumber]. spec , 0 );
273291 return ;
274292 }
275293
276294 timeout = K_NSEC (NSEC_PER_SEC / (2 * frequency));
277295
278296 k_timer_init (timer, tone_expiry_cb, NULL );
279- k_timer_user_data_set (timer, ( void *)spec );
280- gpio_pin_set_dt (spec, 1 );
297+ k_timer_user_data_set (timer, &arduino_pin_timers[pinNumber] );
298+ gpio_pin_set_dt (&arduino_pin_timers[pinNumber]. spec , 1 );
281299 k_timer_start (timer, timeout, timeout);
282300
283301 if (duration > 0 ) {
284- timer = &arduino_pin_timers_timeout[pinNumber];
302+ timer = &arduino_pin_timers_timeout[pinNumber].timer ;
303+ arduino_pin_timers_timeout[pinNumber].spec .port = local_gpio_port (pinNumber);
304+ arduino_pin_timers_timeout[pinNumber].spec .pin = local_gpio_pin (pinNumber);
305+ arduino_pin_timers_timeout[pinNumber].spec .dt_flags = local_gpio_dt_flags (pinNumber);
285306 k_timer_init (timer, tone_timeout_cb, NULL );
286- k_timer_user_data_set (timer, ( void *)( uintptr_t ) pinNumber);
307+ k_timer_user_data_set (timer, &arduino_pin_timers_timeout[ pinNumber] );
287308 k_timer_start (timer, K_MSEC (duration), K_NO_WAIT);
288309 }
289310}
290311
291312void noTone (pin_size_t pinNumber) {
292- k_timer_stop (&arduino_pin_timers[pinNumber]);
293- gpio_pin_set_dt (&arduino_pins [pinNumber], 0 );
313+ k_timer_stop (&arduino_pin_timers[pinNumber]. timer );
314+ gpio_pin_set_dt (&arduino_pin_timers [pinNumber]. spec , 0 );
294315}
295316
296317void delay (unsigned long ms) { k_sleep (K_MSEC (ms)); }
0 commit comments