#include "digital_in.h" #include #include #include static const struct gpio_dt_spec encoder_c1_gpio = GPIO_DT_SPEC_GET(DT_ALIAS(encoder_c1), gpios); static const struct gpio_dt_spec encoder_c2_gpio = GPIO_DT_SPEC_GET(DT_ALIAS(encoder_c2), gpios); Digital_in::Digital_in(uint8_t pin_id) : gpio(nullptr) { switch (pin_id) { case ENCODER_C1: gpio = &encoder_c1_gpio; break; case ENCODER_C2: gpio = &encoder_c2_gpio; break; default: gpio = nullptr; break; } } void Digital_in::init() { if (gpio == nullptr || !gpio_is_ready_dt(gpio)) { return; } // The overlay supplies the pin's GPIO flags. gpio_pin_configure_dt(gpio, GPIO_INPUT); } bool Digital_in::is_hi() { if (gpio == nullptr) { return false; } // Read the physical pin level: high is true, low is false. return gpio_pin_get_raw(gpio->port, gpio->pin) > 0; } bool Digital_in::is_lo() { return !is_hi(); } int Digital_in::enable_rising_edge_interrupt( struct gpio_callback *callback, gpio_callback_handler_t handler) { if (gpio == nullptr || !gpio_is_ready_dt(gpio)) { return -ENODEV; } gpio_init_callback(callback, handler, BIT(gpio->pin)); const int ret = gpio_add_callback(gpio->port, callback); if (ret < 0) { return ret; } // Physical rising edge, independent of the active level in the overlay. return gpio_pin_interrupt_configure( gpio->port, gpio->pin, GPIO_INT_EDGE_RISING); }