diff --git a/cores/arduino/zephyrCommon.cpp b/cores/arduino/zephyrCommon.cpp index 9dfe2010..c023e7ad 100644 --- a/cores/arduino/zephyrCommon.cpp +++ b/cores/arduino/zephyrCommon.cpp @@ -349,3 +349,47 @@ long random(long max) { } #endif + +#ifdef CONFIG_GPIO_GET_DIRECTION + +unsigned long pulseIn(pin_size_t pinNumber, uint8_t state, unsigned long timeout) { + struct k_timer timer; + int64_t start, end, delta = 0; + const struct gpio_dt_spec *spec = &arduino_pins[pinNumber]; + + k_timer_init(&timer, NULL, NULL); + k_timer_start(&timer, K_MSEC(timeout), K_NO_WAIT); + + if (!gpio_is_ready_dt(spec)) { + goto cleanup; + } + + if (!gpio_pin_is_input_dt(spec)) { + goto cleanup; + } + + while(gpio_pin_get_dt(spec) == state && k_timer_status_get(&timer) == 0); + if (k_timer_status_get(&timer) > 0) { + goto cleanup; + } + + while(gpio_pin_get_dt(spec) != state && k_timer_status_get(&timer) == 0); + if (k_timer_status_get(&timer) > 0) { + goto cleanup; + } + + start = k_uptime_ticks(); + while(gpio_pin_get_dt(spec) == state && k_timer_status_get(&timer) == 0); + if (k_timer_status_get(&timer) > 0) { + goto cleanup; + } + end = k_uptime_ticks(); + + delta = k_ticks_to_us_floor64(end - start); + +cleanup: + k_timer_stop(&timer); + return (unsigned long)delta; +} + +#endif // CONFIG_GPIO_GET_DIRECTION