feat: 数据同步。
This commit is contained in:
parent
3184a00bc6
commit
cd16a29389
22
.vscode/settings.json
vendored
22
.vscode/settings.json
vendored
@ -22,6 +22,26 @@
|
|||||||
"*.inc": "c",
|
"*.inc": "c",
|
||||||
"*.tcc": "c",
|
"*.tcc": "c",
|
||||||
"*.ipp": "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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
32
main/light.c
32
main/light.c
@ -17,7 +17,7 @@ static const char *LIGHT_TAG = "ScreenBgLight_Light";
|
|||||||
|
|
||||||
#define RMT_TX_CHANNEL RMT_CHANNEL_0
|
#define RMT_TX_CHANNEL RMT_CHANNEL_0
|
||||||
#define RMT_TX_GPIO 1
|
#define RMT_TX_GPIO 1
|
||||||
#define STRIP_LED_NUMBER 60
|
#define STRIP_LED_NUMBER CONFIG_NUMBER_OF_LEDS
|
||||||
#define EXAMPLE_CHASE_SPEED_MS (10)
|
#define EXAMPLE_CHASE_SPEED_MS (10)
|
||||||
|
|
||||||
typedef enum light_mode_e {
|
typedef enum light_mode_e {
|
||||||
@ -194,8 +194,6 @@ void light_strip_running_task(void *pv_parameters) {
|
|||||||
if (!light_led_strip) {
|
if (!light_led_strip) {
|
||||||
ESP_LOGE(LIGHT_TAG, "install WS2812 driver failed 2");
|
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) {
|
switch (light_mode) {
|
||||||
case light_mode_init:
|
case light_mode_init:
|
||||||
light_for_init();
|
light_for_init();
|
||||||
@ -242,6 +240,34 @@ void light_init_strip() {
|
|||||||
1, NULL);
|
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) {
|
void light_play(light_mode_t mode) {
|
||||||
ESP_LOGI(LIGHT_TAG, "light_play: %d", mode);
|
ESP_LOGI(LIGHT_TAG, "light_play: %d", mode);
|
||||||
light_mode = mode;
|
light_mode = mode;
|
||||||
|
@ -23,7 +23,7 @@ void app_main(void) {
|
|||||||
if (waiting_for_desktop_online()) {
|
if (waiting_for_desktop_online()) {
|
||||||
light_play(light_mode_desktop_online);
|
light_play(light_mode_desktop_online);
|
||||||
}
|
}
|
||||||
if (waiting_for_desktop_sending_colors()) {
|
while (waiting_and_get_colors()) {
|
||||||
light_play(light_mode_desktop_sending_colors);
|
light_play_colors(NUMBER_OF_LEDS * 3, mqtt_colors_buffer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
32
main/mqtt.c
32
main/mqtt.c
@ -1,4 +1,5 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "esp_bit_defs.h"
|
#include "esp_bit_defs.h"
|
||||||
@ -13,6 +14,7 @@
|
|||||||
#include "mqtt_client.h"
|
#include "mqtt_client.h"
|
||||||
|
|
||||||
#define MQTT_BROKER_URL CONFIG_MQTT_BROKER_URL
|
#define MQTT_BROKER_URL CONFIG_MQTT_BROKER_URL
|
||||||
|
#define NUMBER_OF_LEDS CONFIG_NUMBER_OF_LEDS
|
||||||
|
|
||||||
#define MQTT_FAILED_BIT BIT0
|
#define MQTT_FAILED_BIT BIT0
|
||||||
#define MQTT_CONNECTED_BIT BIT1
|
#define MQTT_CONNECTED_BIT BIT1
|
||||||
@ -20,6 +22,7 @@
|
|||||||
#define MQTT_DESKTOP_ONLINE_BIT BIT3
|
#define MQTT_DESKTOP_ONLINE_BIT BIT3
|
||||||
#define MQTT_DESKTOP_OFFLINE_BIT BIT4
|
#define MQTT_DESKTOP_OFFLINE_BIT BIT4
|
||||||
#define MQTT_DESKTOP_SENDING_BIT BIT5
|
#define MQTT_DESKTOP_SENDING_BIT BIT5
|
||||||
|
#define MQTT_COLORS_STAND_BY_BIT BIT6
|
||||||
|
|
||||||
#define MQTT_BOARD_KEY_PREFIX "screen-bg-light/board/"
|
#define MQTT_BOARD_KEY_PREFIX "screen-bg-light/board/"
|
||||||
#define MQTT_DESKTOP_KEY_PREFIX "screen-bg-light/desktop/"
|
#define MQTT_DESKTOP_KEY_PREFIX "screen-bg-light/desktop/"
|
||||||
@ -35,7 +38,13 @@
|
|||||||
static const char *MQTT_TAG = "ScreenBgLight_MQTT";
|
static const char *MQTT_TAG = "ScreenBgLight_MQTT";
|
||||||
|
|
||||||
static EventGroupHandle_t s_mqtt_event_group;
|
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) {
|
static void log_error_if_nonzero(const char *message, int error_code) {
|
||||||
if (error_code != 0) {
|
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);
|
xEventGroupSetBits(s_mqtt_event_group, MQTT_DESKTOP_ONLINE_BIT);
|
||||||
} else if (strncmp(event->topic, MQTT_KEY_DESKTOP_COLORS,
|
} else if (strncmp(event->topic, MQTT_KEY_DESKTOP_COLORS,
|
||||||
event->topic_len) == 0) {
|
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 {
|
} else {
|
||||||
printf("TOPIC=%.*s\r\n", event->topic_len, event->topic);
|
printf("TOPIC=%.*s\r\n", event->topic_len, event->topic);
|
||||||
printf("DATA=%.*s\r\n", event->data_len, event->data);
|
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() {
|
static void mqtt_app_start() {
|
||||||
|
mqtt_colors_buffer = (uint8_t *)malloc(sizeof(uint8_t) * NUMBER_OF_LEDS * 3);
|
||||||
s_mqtt_event_group = xEventGroupCreate();
|
s_mqtt_event_group = xEventGroupCreate();
|
||||||
|
|
||||||
const esp_mqtt_client_config_t mqtt_cfg = {
|
const esp_mqtt_client_config_t mqtt_cfg = {
|
||||||
@ -161,3 +176,16 @@ static bool waiting_for_desktop_sending_colors() {
|
|||||||
return 0;
|
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;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user