66 lines
1.6 KiB
C
66 lines
1.6 KiB
C
#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");
|
|
|
|
/* Default: LED off */
|
|
ESP_RETURN_ON_ERROR(status_led_set_rgb(0, 0, 0), TAG, "set rgb");
|
|
ESP_LOGI(TAG, "WS2812 on GPIO%d — off", 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;
|
|
}
|