#include "digital_in.h" #include "usb.h" #include #include #include #include #include LOG_MODULE_REGISTER(digital_in, LOG_LEVEL_INF); #define DIGITAL_IN_MACRO(node_id) GPIO_DT_SPEC_GET(node_id, gpios), static const struct gpio_dt_spec digital_inputs[] = { DT_FOREACH_CHILD(DT_NODELABEL(digital_inputs), DIGITAL_IN_MACRO) }; static struct gpio_callback digital_in_cb_data; void digital_in_irq_handler(const struct device *dev, struct gpio_callback *cb, uint32_t pins) { // TODO: what happens struct command_message_t *msg = usb_get_next_tx_buf(); command_create_message(msg, sizeof(pins), DIGITAL_IN, (uint8_t *)&pins); usb_send_command(msg); } int digital_in_pin_init(const struct gpio_dt_spec *gpio, uint32_t *bitmask) { int ret; if (!gpio_is_ready_dt(gpio)) { LOG_ERR("GPIO device %s is not ready\n", gpio->port->name); return -ENODEV; } ret = gpio_pin_configure_dt(gpio, GPIO_INPUT); if (ret != 0) { LOG_ERR("Failed to configure %s pin %d\n", gpio->port->name, gpio->pin); return ret; } ret = gpio_pin_interrupt_configure_dt(gpio, GPIO_INT_EDGE_TO_ACTIVE); if (ret != 0) { LOG_ERR("Failed to configure interrupt on %s pin %d\n", gpio->port->name, gpio->pin); return ret; } *bitmask |= BIT(gpio->pin); return ret; } int digital_in_init() { uint32_t bitmask = 0; for (int i = 0; i < DIGITAL_IN_CHANNELS; i++) { digital_in_pin_init(&digital_inputs[i], &bitmask); } gpio_init_callback(&digital_in_cb_data, digital_in_irq_handler, bitmask); gpio_add_callback(digital_inputs[0].port, &digital_in_cb_data); return 0; }