#include "status_led.h" #include "esp_check.h" #include "esp_log.h" #include "led_strip.h" #include "led_strip_rmt.h" static const char *TAG = "status_led"; static led_strip_handle_t s_strip; esp_err_t status_led_init(void) { if (s_strip) { return ESP_OK; } led_strip_config_t strip_cfg = { .strip_gpio_num = STATUS_LED_GPIO, .max_leds = STATUS_LED_COUNT, .led_pixel_format = LED_PIXEL_FORMAT_GRB, .led_model = LED_MODEL_WS2812, .flags = { .invert_out = false, }, }; led_strip_rmt_config_t rmt_cfg = { .clk_src = RMT_CLK_SRC_DEFAULT, .resolution_hz = 10 * 1000 * 1000, .mem_block_symbols = 64, .flags = { .with_dma = false, }, }; ESP_RETURN_ON_ERROR( led_strip_new_rmt_device(&strip_cfg, &rmt_cfg, &s_strip), TAG, "led_strip_new_rmt_device failed"); /* Boot test: white at half brightness */ ESP_RETURN_ON_ERROR(status_led_set_rgb(128, 128, 128), TAG, "set rgb"); ESP_LOGI(TAG, "WS2812 on GPIO%d — white", STATUS_LED_GPIO); return ESP_OK; } esp_err_t status_led_set_rgb(uint8_t r, uint8_t g, uint8_t b) { if (!s_strip) { return ESP_ERR_INVALID_STATE; } ESP_RETURN_ON_ERROR(led_strip_set_pixel(s_strip, 0, r, g, b), TAG, "set_pixel"); ESP_RETURN_ON_ERROR(led_strip_refresh(s_strip), TAG, "refresh"); return ESP_OK; } esp_err_t status_led_off(void) { if (!s_strip) { return ESP_ERR_INVALID_STATE; } ESP_RETURN_ON_ERROR(led_strip_clear(s_strip), TAG, "clear"); ESP_RETURN_ON_ERROR(led_strip_refresh(s_strip), TAG, "refresh"); return ESP_OK; }