#pragma once #include #include #include #include "esp_err.h" #define INFINITY_NODE_OUTPUT_COUNT 3 #define INFINITY_LEDS_PER_OUTPUT 106 typedef enum { PANEL_SLOT_TOP = 0, PANEL_SLOT_MIDDLE = 1, PANEL_SLOT_BOTTOM = 2, } panel_slot_t; typedef enum { PANEL_DRIVER_KIND_UNVALIDATED = 0, PANEL_DRIVER_KIND_GPIO, PANEL_DRIVER_KIND_RMT, PANEL_DRIVER_KIND_I2S, PANEL_DRIVER_KIND_UART, PANEL_DRIVER_KIND_SPI, PANEL_DRIVER_KIND_EXTERNAL, } panel_driver_kind_t; typedef struct { uint8_t r; uint8_t g; uint8_t b; } rgb8_t; typedef struct { panel_slot_t panel_slot; const char *physical_output_name; const char *driver_reference; panel_driver_kind_t driver_kind; uint16_t led_count; bool reverse; bool enabled; } panel_output_config_t; typedef struct panel_driver panel_driver_t; typedef struct { esp_err_t (*init)(panel_driver_t *driver); esp_err_t (*configure)(panel_driver_t *driver, const panel_output_config_t *config); esp_err_t (*submit_frame)(panel_driver_t *driver, panel_slot_t panel_slot, const rgb8_t *pixels, size_t pixel_count); esp_err_t (*apply)(panel_driver_t *driver); esp_err_t (*self_test)(panel_driver_t *driver); } panel_driver_vtable_t; struct panel_driver { const panel_driver_vtable_t *vtable; void *context; }; esp_err_t panel_driver_validate_output(const panel_output_config_t *config); esp_err_t panel_driver_self_test_all(panel_driver_t *driver, const panel_output_config_t *outputs, size_t output_count);