diff --git a/.vscode/settings.json b/.vscode/settings.json index 8e0afaf..818b670 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -22,6 +22,26 @@ "*.inc": "c", "*.tcc": "c", "*.ipp": "c", - "cstring": "cpp" + "cstring": "cpp", + "system_error": "c", + "chrono": "c", + "random": "c", + "limits": "c", + "array": "c", + "string": "c", + "string_view": "c", + "esp_bit_defs.h": "c", + "bitset": "c", + "initializer_list": "c", + "regex": "c", + "utility": "c", + "deque": "c", + "list": "c", + "unordered_map": "c", + "unordered_set": "c", + "vector": "c", + "freertos.h": "c", + "task.h": "c", + "led_strip.h": "c" } } diff --git a/main/light.c b/main/light.c index d5e23eb..9e367f7 100644 --- a/main/light.c +++ b/main/light.c @@ -17,7 +17,7 @@ static const char *LIGHT_TAG = "ScreenBgLight_Light"; #define RMT_TX_CHANNEL RMT_CHANNEL_0 #define RMT_TX_GPIO 1 -#define STRIP_LED_NUMBER 60 +#define STRIP_LED_NUMBER CONFIG_NUMBER_OF_LEDS #define EXAMPLE_CHASE_SPEED_MS (10) typedef enum light_mode_e { @@ -194,8 +194,6 @@ void light_strip_running_task(void *pv_parameters) { if (!light_led_strip) { ESP_LOGE(LIGHT_TAG, "install WS2812 driver failed 2"); } - // Show simple rainbow chasing pattern - ESP_LOGI(LIGHT_TAG, "light_strip_running_task: %d", light_mode); switch (light_mode) { case light_mode_init: light_for_init(); @@ -242,7 +240,35 @@ void light_init_strip() { 1, NULL); } +void light_play_colors(uint16_t len, uint8_t *buffer) { + light_mode = light_mode_desktop_sending_colors; + printf("COLORS=%.*s\r\n", len, buffer); + + ESP_ERROR_CHECK(light_led_strip->clear(light_led_strip, 100)); + for (uint16_t led_index = 0, buffer_cursor = 0; + led_index < STRIP_LED_NUMBER && buffer_cursor < len; + led_index++, buffer_cursor += 3) { + uint8_t r = buffer[buffer_cursor], g = buffer[buffer_cursor + 1], + b = buffer[buffer_cursor + 2]; + ESP_LOGI(LIGHT_TAG, "RGB: %d %d %d", r, g, b); + ESP_ERROR_CHECK( + light_led_strip->set_pixel(light_led_strip, led_index, r, g, b)); + } + ESP_ERROR_CHECK(light_led_strip->refresh(light_led_strip, 100)); + vTaskDelay(pdMS_TO_TICKS(10)); + for (uint16_t led_index = 0, buffer_cursor = 0; + led_index < STRIP_LED_NUMBER && buffer_cursor < len; + led_index++, buffer_cursor += 3) { + uint8_t r = buffer[buffer_cursor], g = buffer[buffer_cursor + 1], b = 0; + ESP_LOGI(LIGHT_TAG, "RGB: %d %d %d", r, g, b); + ESP_ERROR_CHECK( + light_led_strip->set_pixel(light_led_strip, led_index, r, g, b)); + } + ESP_ERROR_CHECK(light_led_strip->refresh(light_led_strip, 100)); + vTaskDelay(pdMS_TO_TICKS(10)); +} + void light_play(light_mode_t mode) { ESP_LOGI(LIGHT_TAG, "light_play: %d", mode); light_mode = mode; -} \ No newline at end of file +} diff --git a/main/main.c b/main/main.c index 6a9a768..71b549e 100644 --- a/main/main.c +++ b/main/main.c @@ -23,7 +23,7 @@ void app_main(void) { if (waiting_for_desktop_online()) { light_play(light_mode_desktop_online); } - if (waiting_for_desktop_sending_colors()) { - light_play(light_mode_desktop_sending_colors); + while (waiting_and_get_colors()) { + light_play_colors(NUMBER_OF_LEDS * 3, mqtt_colors_buffer); } } diff --git a/main/mqtt.c b/main/mqtt.c index 500e63a..e55a785 100644 --- a/main/mqtt.c +++ b/main/mqtt.c @@ -1,4 +1,5 @@ #include +#include #include #include "esp_bit_defs.h" @@ -13,6 +14,7 @@ #include "mqtt_client.h" #define MQTT_BROKER_URL CONFIG_MQTT_BROKER_URL +#define NUMBER_OF_LEDS CONFIG_NUMBER_OF_LEDS #define MQTT_FAILED_BIT BIT0 #define MQTT_CONNECTED_BIT BIT1 @@ -20,6 +22,7 @@ #define MQTT_DESKTOP_ONLINE_BIT BIT3 #define MQTT_DESKTOP_OFFLINE_BIT BIT4 #define MQTT_DESKTOP_SENDING_BIT BIT5 +#define MQTT_COLORS_STAND_BY_BIT BIT6 #define MQTT_BOARD_KEY_PREFIX "screen-bg-light/board/" #define MQTT_DESKTOP_KEY_PREFIX "screen-bg-light/desktop/" @@ -35,7 +38,13 @@ static const char *MQTT_TAG = "ScreenBgLight_MQTT"; static EventGroupHandle_t s_mqtt_event_group; -static uint8_t *colors; + +typedef struct colors { + uint8_t *buffer; + uint8_t number; +} s_colors_t; + +static uint8_t *mqtt_colors_buffer; static void log_error_if_nonzero(const char *message, int error_code) { if (error_code != 0) { @@ -80,7 +89,12 @@ static void mqtt_event_handler(void *handler_args, esp_event_base_t base, xEventGroupSetBits(s_mqtt_event_group, MQTT_DESKTOP_ONLINE_BIT); } else if (strncmp(event->topic, MQTT_KEY_DESKTOP_COLORS, event->topic_len) == 0) { - xEventGroupSetBits(s_mqtt_event_group, MQTT_DESKTOP_SENDING_BIT); + printf("LEN=%d, DATA=%.*s\r\n", event->data_len, event->data_len, + event->data); + memcpy(mqtt_colors_buffer, event->data, + MIN(event->data_len, NUMBER_OF_LEDS * 3)); + xEventGroupSetBits(s_mqtt_event_group, + MQTT_DESKTOP_SENDING_BIT | MQTT_COLORS_STAND_BY_BIT); } else { printf("TOPIC=%.*s\r\n", event->topic_len, event->topic); printf("DATA=%.*s\r\n", event->data_len, event->data); @@ -107,6 +121,7 @@ static void mqtt_event_handler(void *handler_args, esp_event_base_t base, } static void mqtt_app_start() { + mqtt_colors_buffer = (uint8_t *)malloc(sizeof(uint8_t) * NUMBER_OF_LEDS * 3); s_mqtt_event_group = xEventGroupCreate(); const esp_mqtt_client_config_t mqtt_cfg = { @@ -160,4 +175,17 @@ static bool waiting_for_desktop_sending_colors() { ESP_LOGE(MQTT_TAG, "UNEXPECTED EVENT"); return 0; } +} +static bool waiting_and_get_colors() { + ESP_LOGI(MQTT_TAG, "aaa bits: %x", xEventGroupGetBits(s_mqtt_event_group)); + EventBits_t bits = + xEventGroupWaitBits(s_mqtt_event_group, MQTT_COLORS_STAND_BY_BIT, pdFALSE, + pdFALSE, portMAX_DELAY); + if (bits & MQTT_COLORS_STAND_BY_BIT) { + xEventGroupClearBits(s_mqtt_event_group, MQTT_COLORS_STAND_BY_BIT); + return 1; + } else { + ESP_LOGE(MQTT_TAG, "UNEXPECTED EVENT"); + return 0; + } } \ No newline at end of file