1 Commits
v2.0.1 ... main

Author SHA1 Message Date
603b407df4 Version 2.1.0
Increase stability of operation.
Changed the frequency of sending messages.
Changed the event for the first start of tasks.
2025-02-16 19:02:00 +03:00
3 changed files with 68 additions and 46 deletions

View File

@ -18,10 +18,6 @@ void app_main(void)
esp_wifi_start(); esp_wifi_start();
zh_espnow_init_config_t espnow_init_config = ZH_ESPNOW_INIT_CONFIG_DEFAULT(); zh_espnow_init_config_t espnow_init_config = ZH_ESPNOW_INIT_CONFIG_DEFAULT();
zh_espnow_init(&espnow_init_config); zh_espnow_init(&espnow_init_config);
xTaskCreatePinnedToCore(&zh_send_led_attributes_message_task, "led_attributes_message_task", ZH_MESSAGE_STACK_SIZE, led_config, ZH_MESSAGE_TASK_PRIORITY, (TaskHandle_t *)&led_config->attributes_message_task, tskNO_AFFINITY);
vTaskSuspend(led_config->attributes_message_task);
xTaskCreatePinnedToCore(&zh_send_led_keep_alive_message_task, "led_keep_alive_message_task", ZH_MESSAGE_STACK_SIZE, led_config, ZH_MESSAGE_TASK_PRIORITY, (TaskHandle_t *)&led_config->keep_alive_message_task, tskNO_AFFINITY);
vTaskSuspend(led_config->keep_alive_message_task);
#ifdef CONFIG_IDF_TARGET_ESP8266 #ifdef CONFIG_IDF_TARGET_ESP8266
esp_event_handler_register(ZH_ESPNOW, ESP_EVENT_ANY_ID, &zh_espnow_event_handler, led_config); esp_event_handler_register(ZH_ESPNOW, ESP_EVENT_ANY_ID, &zh_espnow_event_handler, led_config);
#else #else
@ -429,8 +425,9 @@ void zh_send_led_attributes_message_task(void *pvParameter)
vTaskDelete(NULL); vTaskDelete(NULL);
} }
void zh_send_led_config_message(const led_config_t *led_config) void zh_send_led_config_message_task(void *pvParameter)
{ {
led_config_t *led_config = pvParameter;
zh_espnow_data_t data = {0}; zh_espnow_data_t data = {0};
data.device_type = ZHDT_LED; data.device_type = ZHDT_LED;
data.payload_type = ZHPT_CONFIG; data.payload_type = ZHPT_CONFIG;
@ -442,11 +439,17 @@ void zh_send_led_config_message(const led_config_t *led_config)
data.payload_data.config_message.led_config_message.optimistic = false; data.payload_data.config_message.led_config_message.optimistic = false;
data.payload_data.config_message.led_config_message.qos = 2; data.payload_data.config_message.led_config_message.qos = 2;
data.payload_data.config_message.led_config_message.retain = true; data.payload_data.config_message.led_config_message.retain = true;
zh_espnow_send(led_config->gateway_mac, (uint8_t *)&data, sizeof(zh_espnow_data_t)); for (;;)
{
zh_espnow_send(led_config->gateway_mac, (uint8_t *)&data, sizeof(zh_espnow_data_t));
vTaskDelay(ZH_LED_CONFIG_MESSAGE_FREQUENCY * 1000 / portTICK_PERIOD_MS);
}
vTaskDelete(NULL);
} }
void zh_send_led_hardware_config_message(const led_config_t *led_config) void zh_send_led_hardware_config_message_task(void *pvParameter)
{ {
led_config_t *led_config = pvParameter;
zh_espnow_data_t data = {0}; zh_espnow_data_t data = {0};
data.device_type = ZHDT_LED; data.device_type = ZHDT_LED;
data.payload_type = ZHPT_HARDWARE; data.payload_type = ZHPT_HARDWARE;
@ -456,7 +459,12 @@ void zh_send_led_hardware_config_message(const led_config_t *led_config)
data.payload_data.config_message.led_hardware_config_message.red_pin = led_config->hardware_config.red_pin; data.payload_data.config_message.led_hardware_config_message.red_pin = led_config->hardware_config.red_pin;
data.payload_data.config_message.led_hardware_config_message.green_pin = led_config->hardware_config.green_pin; data.payload_data.config_message.led_hardware_config_message.green_pin = led_config->hardware_config.green_pin;
data.payload_data.config_message.led_hardware_config_message.blue_pin = led_config->hardware_config.blue_pin; data.payload_data.config_message.led_hardware_config_message.blue_pin = led_config->hardware_config.blue_pin;
zh_espnow_send(led_config->gateway_mac, (uint8_t *)&data, sizeof(zh_espnow_data_t)); for (;;)
{
zh_espnow_send(led_config->gateway_mac, (uint8_t *)&data, sizeof(zh_espnow_data_t));
vTaskDelay(ZH_LED_HARDWARE_CONFIG_MESSAGE_FREQUENCY * 1000 / portTICK_PERIOD_MS);
}
vTaskDelete(NULL);
} }
void zh_send_led_keep_alive_message_task(void *pvParameter) void zh_send_led_keep_alive_message_task(void *pvParameter)
@ -475,6 +483,27 @@ void zh_send_led_keep_alive_message_task(void *pvParameter)
vTaskDelete(NULL); vTaskDelete(NULL);
} }
void zh_send_led_status_message_task(void *pvParameter)
{
led_config_t *led_config = pvParameter;
zh_espnow_data_t data = {0};
data.device_type = ZHDT_LED;
data.payload_type = ZHPT_STATE;
for (;;)
{
data.payload_data.status_message.led_status_message.status = led_config->status.status;
data.payload_data.status_message.led_status_message.brightness = led_config->status.brightness;
data.payload_data.status_message.led_status_message.temperature = led_config->status.temperature;
data.payload_data.status_message.led_status_message.red = led_config->status.red;
data.payload_data.status_message.led_status_message.green = led_config->status.green;
data.payload_data.status_message.led_status_message.blue = led_config->status.blue;
data.payload_data.status_message.led_status_message.effect = led_config->status.effect;
zh_espnow_send(led_config->gateway_mac, (uint8_t *)&data, sizeof(zh_espnow_data_t));
vTaskDelay(ZH_LED_STATUS_MESSAGE_FREQUENCY * 1000 / portTICK_PERIOD_MS);
}
vTaskDelete(NULL);
}
void zh_send_led_status_message(const led_config_t *led_config) void zh_send_led_status_message(const led_config_t *led_config)
{ {
zh_espnow_data_t data = {0}; zh_espnow_data_t data = {0};
@ -508,24 +537,15 @@ void zh_espnow_event_handler(void *arg, esp_event_base_t event_base, int32_t eve
switch (data->payload_type) switch (data->payload_type)
{ {
case ZHPT_KEEP_ALIVE: case ZHPT_KEEP_ALIVE:
if (data->payload_data.keep_alive_message.online_status == ZH_ONLINE) memcpy(led_config->gateway_mac, recv_data->mac_addr, 6);
if (is_first_boot == false)
{ {
memcpy(led_config->gateway_mac, recv_data->mac_addr, 6); is_first_boot = true;
if (led_config->gateway_is_available == false) xTaskCreatePinnedToCore(&zh_send_led_attributes_message_task, "led_attributes_message_task", ZH_MESSAGE_STACK_SIZE, led_config, ZH_MESSAGE_TASK_PRIORITY, NULL, tskNO_AFFINITY);
{ xTaskCreatePinnedToCore(&zh_send_led_keep_alive_message_task, "led_keep_alive_message_task", ZH_MESSAGE_STACK_SIZE, led_config, ZH_MESSAGE_TASK_PRIORITY, NULL, tskNO_AFFINITY);
led_config->gateway_is_available = true; xTaskCreatePinnedToCore(&zh_send_led_config_message_task, "led_config_message_task", ZH_MESSAGE_STACK_SIZE, led_config, ZH_MESSAGE_TASK_PRIORITY, NULL, tskNO_AFFINITY);
zh_send_led_hardware_config_message(led_config); xTaskCreatePinnedToCore(&zh_send_led_hardware_config_message_task, "led_hardware_config_message_task", ZH_MESSAGE_STACK_SIZE, led_config, ZH_MESSAGE_TASK_PRIORITY, NULL, tskNO_AFFINITY);
zh_send_led_config_message(led_config); xTaskCreatePinnedToCore(&zh_send_led_status_message_task, "led_status_message_task", ZH_MESSAGE_STACK_SIZE, led_config, ZH_MESSAGE_TASK_PRIORITY, NULL, tskNO_AFFINITY);
zh_send_led_status_message(led_config);
vTaskResume(led_config->attributes_message_task);
vTaskResume(led_config->keep_alive_message_task);
}
}
else
{
led_config->gateway_is_available = false;
vTaskSuspend(led_config->attributes_message_task);
vTaskSuspend(led_config->keep_alive_message_task);
} }
break; break;
case ZHPT_SET: case ZHPT_SET:
@ -632,14 +652,7 @@ void zh_espnow_event_handler(void *arg, esp_event_base_t event_base, int32_t eve
ZH_ESPNOW_EVENT_HANDLER_EXIT: ZH_ESPNOW_EVENT_HANDLER_EXIT:
heap_caps_free(recv_data->data); heap_caps_free(recv_data->data);
break; break;
case ZH_ESPNOW_ON_SEND_EVENT:; case ZH_ESPNOW_ON_SEND_EVENT:
zh_espnow_event_on_send_t *send_data = event_data;
if (send_data->status == ZH_ESPNOW_SEND_FAIL)
{
led_config->gateway_is_available = false;
vTaskSuspend(led_config->attributes_message_task);
vTaskSuspend(led_config->keep_alive_message_task);
}
break; break;
default: default:
break; break;

View File

@ -36,12 +36,17 @@
#define get_app_description() esp_app_get_description() #define get_app_description() esp_app_get_description()
#endif #endif
#define ZH_LED_KEEP_ALIVE_MESSAGE_FREQUENCY 10 // Frequency of sending a led keep alive message to the gateway (in seconds). #define ZH_LED_KEEP_ALIVE_MESSAGE_FREQUENCY 10 // Frequency of sending a led keep alive message to the gateway (in seconds).
#define ZH_LED_ATTRIBUTES_MESSAGE_FREQUENCY 60 // Frequency of sending a led attributes message to the gateway (in seconds). #define ZH_LED_ATTRIBUTES_MESSAGE_FREQUENCY 60 // Frequency of sending a led attributes message to the gateway (in seconds).
#define ZH_LED_HARDWARE_CONFIG_MESSAGE_FREQUENCY 60 // Frequency of sending a led hardware config message to the gateway (in seconds).
#define ZH_LED_CONFIG_MESSAGE_FREQUENCY 60 // Frequency of sending a led config message to the gateway (in seconds).
#define ZH_LED_STATUS_MESSAGE_FREQUENCY 60 // Frequency of sending a led status message to the gateway (in seconds).
#define ZH_MESSAGE_TASK_PRIORITY 5 // Prioritize the task of sending messages to the gateway. #define ZH_MESSAGE_TASK_PRIORITY 5 // Prioritize the task of sending messages to the gateway.
#define ZH_MESSAGE_STACK_SIZE 2048 // The stack size of the task of sending messages to the gateway. #define ZH_MESSAGE_STACK_SIZE 2048 // The stack size of the task of sending messages to the gateway.
static bool is_first_boot = false;
typedef struct // Structure of data exchange between tasks, functions and event handlers. typedef struct // Structure of data exchange between tasks, functions and event handlers.
{ {
struct // Storage structure of led hardware configuration data. struct // Storage structure of led hardware configuration data.
@ -71,10 +76,7 @@ typedef struct // Structure of data exchange between tasks, functions and event
uint8_t green; // Green color channel. uint8_t green; // Green color channel.
uint8_t blue; // Blue color channel. uint8_t blue; // Blue color channel.
} channel; } channel;
volatile bool gateway_is_available; // Gateway availability status flag. @note Used to control the tasks when the gateway connection is established / lost.
uint8_t gateway_mac[6]; // Gateway MAC address. uint8_t gateway_mac[6]; // Gateway MAC address.
TaskHandle_t attributes_message_task; // Unique task handle for zh_send_led_attributes_message_task().
TaskHandle_t keep_alive_message_task; // Unique task handle for zh_send_led_keep_alive_message_task().
const esp_partition_t *update_partition; // Next update partition. const esp_partition_t *update_partition; // Next update partition.
esp_ota_handle_t update_handle; // Unique OTA handle. esp_ota_handle_t update_handle; // Unique OTA handle.
uint16_t ota_message_part_number; // The sequence number of the firmware upgrade part. @note Used to verify that all parts have been received. uint16_t ota_message_part_number; // The sequence number of the firmware upgrade part. @note Used to verify that all parts have been received.
@ -138,23 +140,23 @@ int32_t zh_map(int32_t value, int32_t in_min, int32_t in_max, int32_t out_min, i
/** /**
* @brief Task for prepare the led attributes message and sending it to the gateway. * @brief Task for prepare the led attributes message and sending it to the gateway.
* *
* @param[in,out] pvParameter Pointer to structure of data exchange between tasks, functions and event handlers. * @param[in] pvParameter Pointer to structure of data exchange between tasks, functions and event handlers.
*/ */
void zh_send_led_attributes_message_task(void *pvParameter); void zh_send_led_attributes_message_task(void *pvParameter);
/** /**
* @brief Function for prepare the led configuration message and sending it to the gateway. * @brief Task for prepare the led configuration message and sending it to the gateway.
* *
* @param[in] led_config Pointer to the structure of data exchange between tasks, functions and event handlers. * @param[in] pvParameter Pointer to the structure of data exchange between tasks, functions and event handlers.
*/ */
void zh_send_led_config_message(const led_config_t *led_config); void zh_send_led_config_message_task(void *pvParameter);
/** /**
* @brief Function for prepare the led hardware configuration message and sending it to the gateway. * @brief Task for prepare the led hardware configuration message and sending it to the gateway.
* *
* @param[in] led_config Pointer to the structure of data exchange between tasks, functions and event handlers. * @param[in] pvParameter Pointer to the structure of data exchange between tasks, functions and event handlers.
*/ */
void zh_send_led_hardware_config_message(const led_config_t *led_config); void zh_send_led_hardware_config_message_task(void *pvParameter);
/** /**
* @brief Task for prepare the led keep alive message and sending it to the gateway. * @brief Task for prepare the led keep alive message and sending it to the gateway.
@ -163,6 +165,13 @@ void zh_send_led_hardware_config_message(const led_config_t *led_config);
*/ */
void zh_send_led_keep_alive_message_task(void *pvParameter); void zh_send_led_keep_alive_message_task(void *pvParameter);
/**
* @brief Task for prepare the sled status message and sending it to the gateway.
*
* @param[in] pvParameter Pointer to the structure of data exchange between tasks, functions and event handlers.
*/
void zh_send_led_status_message_task(void *pvParameter);
/** /**
* @brief Function for prepare the led status message and sending it to the gateway. * @brief Function for prepare the led status message and sending it to the gateway.
* *

View File

@ -1 +1 @@
2.0.1 2.1.0