diff --git a/servo_controller/src/command_message.h b/servo_controller/src/command_message.h index c694276..6f07e3a 100644 --- a/servo_controller/src/command_message.h +++ b/servo_controller/src/command_message.h @@ -22,6 +22,7 @@ typedef enum { ADC_READ, ADC_READ_ALL, ADC_SET_READ, + DIGITAL_IN, // Keep last NUM_COMMANDS, diff --git a/servo_controller/src/digital_in.c b/servo_controller/src/digital_in.c new file mode 100644 index 0000000..fdd677e --- /dev/null +++ b/servo_controller/src/digital_in.c @@ -0,0 +1,64 @@ +#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 -EBUSY; + } + + 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; +} diff --git a/servo_controller/src/digital_in.h b/servo_controller/src/digital_in.h new file mode 100644 index 0000000..58431e9 --- /dev/null +++ b/servo_controller/src/digital_in.h @@ -0,0 +1,10 @@ +#ifndef DIGITAL_IN_H +#define DIGITAL_IN_H + + +#define DIGITAL_IN_CHANNELS 6 + +int digital_in_init(); + + +#endif // DIGITAL_IN_H \ No newline at end of file diff --git a/servo_controller/src/main.c b/servo_controller/src/main.c index 596d41f..4052444 100644 --- a/servo_controller/src/main.c +++ b/servo_controller/src/main.c @@ -2,6 +2,7 @@ #include "usb.h" #include "servo.h" #include "adc.h" +#include "digital_in.h" #include LOG_MODULE_REGISTER(main, LOG_LEVEL_INF); @@ -38,5 +39,12 @@ int main(void) { return 0; } + // DIGITAL IN init + ret = digital_in_init(); + if (ret != 0) { + LOG_ERR("Failed to enable DIGITAL IN"); + return 0; + } + return 0; } \ No newline at end of file