75 lines
1.6 KiB
C++
75 lines
1.6 KiB
C++
#include "digital_in.h"
|
|
|
|
#include <errno.h>
|
|
#include <zephyr/devicetree.h>
|
|
#include <zephyr/sys/util.h>
|
|
|
|
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);
|
|
}
|