Updated components
This commit is contained in:
		| @@ -21,8 +21,9 @@ | |||||||
| ## Attention | ## Attention | ||||||
|  |  | ||||||
| 1. The definition of ZH_NETWORK_MAX_MESSAGE_SIZE in the zh_network.h can be changed between 1 and 218. Smaller size - higher transmission speed. All devices on the network must have the same ZH_NETWORK_MAX_MESSAGE_SIZE. | 1. The definition of ZH_NETWORK_MAX_MESSAGE_SIZE in the zh_network.h can be changed between 1 and 218. Smaller size - higher transmission speed. All devices on the network must have the same ZH_NETWORK_MAX_MESSAGE_SIZE. | ||||||
| 2. For correct work at ESP-NOW + STA mode your WiFi router must be set on channel 1. | 2. For correct operation in ESP-NOW + STA mode, your WiFi router must be set to the same channel as ESP-NOW. | ||||||
| 3. The ZHNetwork and the zh_network are incompatible. | 3. All devices on the network must have the same WiFi channel. | ||||||
|  | 4. The ZHNetwork and the zh_network are incompatible. | ||||||
|  |  | ||||||
| ## Testing | ## Testing | ||||||
|  |  | ||||||
|   | |||||||
| @@ -51,7 +51,9 @@ | |||||||
|         .max_waiting_time = 1000,        \ |         .max_waiting_time = 1000,        \ | ||||||
|         .id_vector_size = 100,           \ |         .id_vector_size = 100,           \ | ||||||
|         .route_vector_size = 100,        \ |         .route_vector_size = 100,        \ | ||||||
|         .wifi_interface = WIFI_IF_STA    \ |         .wifi_interface = WIFI_IF_STA,   \ | ||||||
|  |         .wifi_channel = 1,               \ | ||||||
|  |         .attempts = 3                    \ | ||||||
|     } |     } | ||||||
|  |  | ||||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||||
| @@ -76,6 +78,8 @@ extern "C" | |||||||
|         uint16_t id_vector_size;         ///< Maximum size of unique ID of received messages. @note If the size is exceeded, the first value will be deleted. Minimum recommended value: number of planned nodes in the network + 10%. |         uint16_t id_vector_size;         ///< Maximum size of unique ID of received messages. @note If the size is exceeded, the first value will be deleted. Minimum recommended value: number of planned nodes in the network + 10%. | ||||||
|         uint16_t route_vector_size;      ///< The maximum size of the routing table. @note If the size is exceeded, the first route will be deleted. Minimum recommended value: number of planned nodes in the network + 10%. |         uint16_t route_vector_size;      ///< The maximum size of the routing table. @note If the size is exceeded, the first route will be deleted. Minimum recommended value: number of planned nodes in the network + 10%. | ||||||
|         wifi_interface_t wifi_interface; ///< WiFi interface (STA or AP) used for ESP-NOW operation. @note The MAC address of the device depends on the selected WiFi interface. |         wifi_interface_t wifi_interface; ///< WiFi interface (STA or AP) used for ESP-NOW operation. @note The MAC address of the device depends on the selected WiFi interface. | ||||||
|  |         uint8_t wifi_channel;            ///< Wi-Fi channel uses to send/receive ESPNOW data. @note Values from 1 to 14. | ||||||
|  |         uint8_t attempts;                ///< Maximum number of attempts to send a message. @note It is not recommended to set a value greater than 5. | ||||||
|     } zh_network_init_config_t; |     } zh_network_init_config_t; | ||||||
|  |  | ||||||
|     /// \cond |     /// \cond | ||||||
| @@ -140,7 +144,7 @@ extern "C" | |||||||
|      *              - ESP_ERR_WIFI_NOT_INIT if WiFi is not initialized |      *              - ESP_ERR_WIFI_NOT_INIT if WiFi is not initialized | ||||||
|      *              - ESP_FAIL if any internal error |      *              - ESP_FAIL if any internal error | ||||||
|      */ |      */ | ||||||
|     esp_err_t zh_network_init(zh_network_init_config_t *config); |     esp_err_t zh_network_init(const zh_network_init_config_t *config); | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * @brief Deinitialize ESP-NOW interface. |      * @brief Deinitialize ESP-NOW interface. | ||||||
| @@ -164,7 +168,7 @@ extern "C" | |||||||
|      *              - ESP_OK if sent was success |      *              - ESP_OK if sent was success | ||||||
|      *              - ESP_ERR_INVALID_ARG if parameter error |      *              - ESP_ERR_INVALID_ARG if parameter error | ||||||
|      *              - ESP_ERR_INVALID_STATE if queue for outgoing data is almost full |      *              - ESP_ERR_INVALID_STATE if queue for outgoing data is almost full | ||||||
|      *              - ESP_FAIL if ESP-NOW is not initialized |      *              - ESP_FAIL if ESP-NOW is not initialized or any internal error | ||||||
|      */ |      */ | ||||||
|     esp_err_t zh_network_send(const uint8_t *target, const uint8_t *data, const uint8_t data_len); |     esp_err_t zh_network_send(const uint8_t *target, const uint8_t *data, const uint8_t data_len); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1 +1 @@ | |||||||
| 1.0.0 | 1.0.1 | ||||||
| @@ -12,7 +12,7 @@ | |||||||
| /// \endcond | /// \endcond | ||||||
|  |  | ||||||
| static void _send_cb(const uint8_t *mac_addr, esp_now_send_status_t status); | static void _send_cb(const uint8_t *mac_addr, esp_now_send_status_t status); | ||||||
| #ifdef CONFIG_IDF_TARGET_ESP8266 | #if defined CONFIG_IDF_TARGET_ESP8266 || ESP_IDF_VERSION_MAJOR == 4 | ||||||
| static void _recv_cb(const uint8_t *mac_addr, const uint8_t *data, int data_len); | static void _recv_cb(const uint8_t *mac_addr, const uint8_t *data, int data_len); | ||||||
| #else | #else | ||||||
| static void _recv_cb(const esp_now_recv_info_t *esp_now_info, const uint8_t *data, int data_len); | static void _recv_cb(const esp_now_recv_info_t *esp_now_info, const uint8_t *data, int data_len); | ||||||
| @@ -21,7 +21,7 @@ static void _processing(void *pvParameter); | |||||||
|  |  | ||||||
| static const char *TAG = "zh_network"; | static const char *TAG = "zh_network"; | ||||||
|  |  | ||||||
| static EventGroupHandle_t _send_cb_status_event_group_handle = {0}; | static EventGroupHandle_t _event_group_handle = {0}; | ||||||
| static QueueHandle_t _queue_handle = {0}; | static QueueHandle_t _queue_handle = {0}; | ||||||
| static TaskHandle_t _processing_task_handle = {0}; | static TaskHandle_t _processing_task_handle = {0}; | ||||||
| static SemaphoreHandle_t _id_vector_mutex = {0}; | static SemaphoreHandle_t _id_vector_mutex = {0}; | ||||||
| @@ -32,55 +32,50 @@ static zh_vector_t _response_vector = {0}; | |||||||
| static uint8_t _self_mac[6] = {0}; | static uint8_t _self_mac[6] = {0}; | ||||||
| static const uint8_t _broadcast_mac[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; | static const uint8_t _broadcast_mac[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; | ||||||
| static bool _is_initialized = false; | static bool _is_initialized = false; | ||||||
|  | static uint8_t _attempts = 0; | ||||||
|  |  | ||||||
| /// \cond | /// \cond | ||||||
| typedef enum | typedef struct | ||||||
|  | { | ||||||
|  |     uint8_t original_target_mac[6]; | ||||||
|  |     uint8_t intermediate_target_mac[6]; | ||||||
|  | } _routing_table_t; | ||||||
|  |  | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     uint64_t time; | ||||||
|  |     enum | ||||||
|  |     { | ||||||
|  |         TO_SEND, | ||||||
|  |         ON_RECV, | ||||||
|  |         WAIT_ROUTE, | ||||||
|  |         WAIT_RESPONSE, | ||||||
|  |     } id; | ||||||
|  |     struct | ||||||
|  |     { | ||||||
|  |         enum | ||||||
|         { |         { | ||||||
|             BROADCAST, |             BROADCAST, | ||||||
|             UNICAST, |             UNICAST, | ||||||
|             DELIVERY_CONFIRM, |             DELIVERY_CONFIRM, | ||||||
|             SEARCH_REQUEST, |             SEARCH_REQUEST, | ||||||
|             SEARCH_RESPONSE |             SEARCH_RESPONSE | ||||||
| } message_type_t; |         } __attribute__((packed)) message_type; | ||||||
|  |  | ||||||
| typedef struct |  | ||||||
| { |  | ||||||
|     message_type_t message_type; |  | ||||||
|         uint32_t network_id; |         uint32_t network_id; | ||||||
|         uint32_t message_id; |         uint32_t message_id; | ||||||
|         uint32_t confirm_id; |         uint32_t confirm_id; | ||||||
|         uint8_t original_target_mac[6]; |         uint8_t original_target_mac[6]; | ||||||
|         uint8_t original_sender_mac[6]; |         uint8_t original_sender_mac[6]; | ||||||
|         uint8_t sender_mac[6]; |         uint8_t sender_mac[6]; | ||||||
|     uint8_t data[ZH_NETWORK_MAX_MESSAGE_SIZE]; |         uint8_t payload[ZH_NETWORK_MAX_MESSAGE_SIZE]; | ||||||
|     uint8_t data_len; |         uint8_t payload_len; | ||||||
| } data_t; |     } __attribute__((packed)) data; | ||||||
|  | } _queue_t; | ||||||
| typedef struct |  | ||||||
| { |  | ||||||
|     uint8_t original_target_mac[6]; |  | ||||||
|     uint8_t intermediate_target_mac[6]; |  | ||||||
| } routing_table_t; |  | ||||||
|  |  | ||||||
| typedef enum |  | ||||||
| { |  | ||||||
|     TO_SEND, |  | ||||||
|     ON_RECV, |  | ||||||
|     WAIT_ROUTE, |  | ||||||
|     WAIT_RESPONSE, |  | ||||||
| } queue_id_t; |  | ||||||
|  |  | ||||||
| typedef struct |  | ||||||
| { |  | ||||||
|     queue_id_t id; |  | ||||||
|     uint64_t time; |  | ||||||
|     data_t data; |  | ||||||
| } queue_t; |  | ||||||
|  |  | ||||||
| ESP_EVENT_DEFINE_BASE(ZH_NETWORK); | ESP_EVENT_DEFINE_BASE(ZH_NETWORK); | ||||||
| /// \endcond | /// \endcond | ||||||
|  |  | ||||||
| esp_err_t zh_network_init(zh_network_init_config_t *config) | esp_err_t zh_network_init(const zh_network_init_config_t *config) | ||||||
| { | { | ||||||
|     ESP_LOGI(TAG, "ESP-NOW initialization begin."); |     ESP_LOGI(TAG, "ESP-NOW initialization begin."); | ||||||
|     if (config == NULL) |     if (config == NULL) | ||||||
| @@ -88,12 +83,29 @@ esp_err_t zh_network_init(zh_network_init_config_t *config) | |||||||
|         ESP_LOGE(TAG, "ESP-NOW initialization fail. Invalid argument."); |         ESP_LOGE(TAG, "ESP-NOW initialization fail. Invalid argument."); | ||||||
|         return ESP_ERR_INVALID_ARG; |         return ESP_ERR_INVALID_ARG; | ||||||
|     } |     } | ||||||
|     if (esp_wifi_set_channel(1, WIFI_SECOND_CHAN_NONE) == ESP_ERR_WIFI_NOT_INIT) |     _init_config = *config; | ||||||
|  |     if (_init_config.wifi_channel < 1 || _init_config.wifi_channel > 14) | ||||||
|  |     { | ||||||
|  |         ESP_LOGE(TAG, "ESP-NOW initialization fail. WiFi channel."); | ||||||
|  |         return ESP_ERR_INVALID_ARG; | ||||||
|  |     } | ||||||
|  |     esp_err_t err = esp_wifi_set_channel(_init_config.wifi_channel, WIFI_SECOND_CHAN_NONE); | ||||||
|  |     if (err == ESP_ERR_WIFI_NOT_INIT || err == ESP_ERR_WIFI_NOT_STARTED) | ||||||
|     { |     { | ||||||
|         ESP_LOGE(TAG, "ESP-NOW initialization fail. WiFi not initialized."); |         ESP_LOGE(TAG, "ESP-NOW initialization fail. WiFi not initialized."); | ||||||
|         return ESP_ERR_WIFI_NOT_INIT; |         return ESP_ERR_WIFI_NOT_INIT; | ||||||
|     } |     } | ||||||
|     if (sizeof(data_t) > ESP_NOW_MAX_DATA_LEN) |     else if (err == ESP_FAIL) | ||||||
|  |     { | ||||||
|  |         uint8_t prim = 0; | ||||||
|  |         wifi_second_chan_t sec = 0; | ||||||
|  |         esp_wifi_get_channel(&prim, &sec); | ||||||
|  |         if (prim != _init_config.wifi_channel) | ||||||
|  |         { | ||||||
|  |             ESP_LOGW(TAG, "ESP-NOW initialization warning. The device is connected to the router. Channel %d will be used for ESP-NOW.", prim); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     if ((sizeof(_queue_t) - 14) > ESP_NOW_MAX_DATA_LEN) | ||||||
|     { |     { | ||||||
|         ESP_LOGE(TAG, "ESP-NOW initialization fail. The maximum value of the transmitted data size is incorrect."); |         ESP_LOGE(TAG, "ESP-NOW initialization fail. The maximum value of the transmitted data size is incorrect."); | ||||||
|         return ESP_ERR_INVALID_ARG; |         return ESP_ERR_INVALID_ARG; | ||||||
| @@ -106,11 +118,10 @@ esp_err_t zh_network_init(zh_network_init_config_t *config) | |||||||
|     { |     { | ||||||
|         esp_read_mac(_self_mac, ESP_MAC_WIFI_SOFTAP); |         esp_read_mac(_self_mac, ESP_MAC_WIFI_SOFTAP); | ||||||
|     } |     } | ||||||
|     _init_config = *config; |     _event_group_handle = xEventGroupCreate(); | ||||||
|     _send_cb_status_event_group_handle = xEventGroupCreate(); |     _queue_handle = xQueueCreate(_init_config.queue_size, sizeof(_queue_t)); | ||||||
|     _queue_handle = xQueueCreate(_init_config.queue_size, sizeof(queue_t)); |  | ||||||
|     zh_vector_init(&_id_vector, sizeof(uint32_t), false); |     zh_vector_init(&_id_vector, sizeof(uint32_t), false); | ||||||
|     zh_vector_init(&_route_vector, sizeof(routing_table_t), false); |     zh_vector_init(&_route_vector, sizeof(_routing_table_t), false); | ||||||
|     zh_vector_init(&_response_vector, sizeof(uint32_t), false); |     zh_vector_init(&_response_vector, sizeof(uint32_t), false); | ||||||
|     _id_vector_mutex = xSemaphoreCreateMutex(); |     _id_vector_mutex = xSemaphoreCreateMutex(); | ||||||
|     if (esp_now_init() != ESP_OK || esp_now_register_send_cb(_send_cb) != ESP_OK || esp_now_register_recv_cb(_recv_cb) != ESP_OK) |     if (esp_now_init() != ESP_OK || esp_now_register_send_cb(_send_cb) != ESP_OK || esp_now_register_recv_cb(_recv_cb) != ESP_OK) | ||||||
| @@ -136,7 +147,7 @@ esp_err_t zh_network_deinit(void) | |||||||
|         ESP_LOGE(TAG, "ESP-NOW deinitialization fail. ESP-NOW not initialized."); |         ESP_LOGE(TAG, "ESP-NOW deinitialization fail. ESP-NOW not initialized."); | ||||||
|         return ESP_FAIL; |         return ESP_FAIL; | ||||||
|     } |     } | ||||||
|     vEventGroupDelete(_send_cb_status_event_group_handle); |     vEventGroupDelete(_event_group_handle); | ||||||
|     vQueueDelete(_queue_handle); |     vQueueDelete(_queue_handle); | ||||||
|     esp_now_unregister_send_cb(); |     esp_now_unregister_send_cb(); | ||||||
|     esp_now_unregister_recv_cb(); |     esp_now_unregister_recv_cb(); | ||||||
| @@ -175,32 +186,31 @@ esp_err_t zh_network_send(const uint8_t *target, const uint8_t *data, const uint | |||||||
|         ESP_LOGW(TAG, "Adding outgoing ESP-NOW data to queue fail. Queue is almost full."); |         ESP_LOGW(TAG, "Adding outgoing ESP-NOW data to queue fail. Queue is almost full."); | ||||||
|         return ESP_ERR_INVALID_STATE; |         return ESP_ERR_INVALID_STATE; | ||||||
|     } |     } | ||||||
|     queue_t queue = {0}; |     _queue_t queue = {0}; | ||||||
|     queue.id = TO_SEND; |     queue.id = TO_SEND; | ||||||
|     data_t *send_data = &queue.data; |     queue.data.network_id = _init_config.network_id; | ||||||
|     send_data->network_id = _init_config.network_id; |     queue.data.message_id = abs(esp_random()); // It is not clear why esp_random() sometimes gives negative values. | ||||||
|     send_data->message_id = abs(esp_random()); // It is not clear why esp_random() sometimes gives negative values. |     memcpy(queue.data.original_sender_mac, _self_mac, 6); | ||||||
|     memcpy(send_data->original_sender_mac, &_self_mac, 6); |  | ||||||
|     if (target == NULL) |     if (target == NULL) | ||||||
|     { |     { | ||||||
|         send_data->message_type = BROADCAST; |         queue.data.message_type = BROADCAST; | ||||||
|         memcpy(send_data->original_target_mac, &_broadcast_mac, 6); |         memcpy(queue.data.original_target_mac, _broadcast_mac, 6); | ||||||
|     } |     } | ||||||
|     else |     else | ||||||
|     { |     { | ||||||
|         if (memcmp(target, &_broadcast_mac, 6) != 0) |         if (memcmp(target, _broadcast_mac, 6) != 0) | ||||||
|         { |         { | ||||||
|             send_data->message_type = UNICAST; |             queue.data.message_type = UNICAST; | ||||||
|             memcpy(send_data->original_target_mac, target, 6); |             memcpy(queue.data.original_target_mac, target, 6); | ||||||
|         } |         } | ||||||
|         else |         else | ||||||
|         { |         { | ||||||
|             send_data->message_type = BROADCAST; |             queue.data.message_type = BROADCAST; | ||||||
|             memcpy(send_data->original_target_mac, &_broadcast_mac, 6); |             memcpy(queue.data.original_target_mac, _broadcast_mac, 6); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     memcpy(&send_data->data, data, data_len); |     memcpy(queue.data.payload, data, data_len); | ||||||
|     send_data->data_len = data_len; |     queue.data.payload_len = data_len; | ||||||
|     if (target == NULL) |     if (target == NULL) | ||||||
|     { |     { | ||||||
|         ESP_LOGI(TAG, "Adding outgoing ESP-NOW data to MAC FF:FF:FF:FF:FF:FF to queue success."); |         ESP_LOGI(TAG, "Adding outgoing ESP-NOW data to MAC FF:FF:FF:FF:FF:FF to queue success."); | ||||||
| @@ -211,7 +221,8 @@ esp_err_t zh_network_send(const uint8_t *target, const uint8_t *data, const uint | |||||||
|     } |     } | ||||||
|     if (xQueueSend(_queue_handle, &queue, portTICK_PERIOD_MS) != pdTRUE) |     if (xQueueSend(_queue_handle, &queue, portTICK_PERIOD_MS) != pdTRUE) | ||||||
|     { |     { | ||||||
|         ESP_LOGE(TAG, "ESP-NOW message processing task internal error."); |         ESP_LOGE(TAG, "ESP-NOW message processing task internal error at line %d.", __LINE__); | ||||||
|  |         return ESP_FAIL; | ||||||
|     } |     } | ||||||
|     return ESP_OK; |     return ESP_OK; | ||||||
| } | } | ||||||
| @@ -220,21 +231,21 @@ static void _send_cb(const uint8_t *mac_addr, esp_now_send_status_t status) | |||||||
| { | { | ||||||
|     if (status == ESP_NOW_SEND_SUCCESS) |     if (status == ESP_NOW_SEND_SUCCESS) | ||||||
|     { |     { | ||||||
|         xEventGroupSetBits(_send_cb_status_event_group_handle, DATA_SEND_SUCCESS); |         xEventGroupSetBits(_event_group_handle, DATA_SEND_SUCCESS); | ||||||
|     } |     } | ||||||
|     else |     else | ||||||
|     { |     { | ||||||
|         xEventGroupSetBits(_send_cb_status_event_group_handle, DATA_SEND_FAIL); |         xEventGroupSetBits(_event_group_handle, DATA_SEND_FAIL); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| #ifdef CONFIG_IDF_TARGET_ESP8266 | #if defined CONFIG_IDF_TARGET_ESP8266 || ESP_IDF_VERSION_MAJOR == 4 | ||||||
| static void _recv_cb(const uint8_t *mac_addr, const uint8_t *data, int data_len) | static void _recv_cb(const uint8_t *mac_addr, const uint8_t *data, int data_len) | ||||||
| #else | #else | ||||||
| static void _recv_cb(const esp_now_recv_info_t *esp_now_info, const uint8_t *data, int data_len) | static void _recv_cb(const esp_now_recv_info_t *esp_now_info, const uint8_t *data, int data_len) | ||||||
| #endif | #endif | ||||||
| { | { | ||||||
| #ifdef CONFIG_IDF_TARGET_ESP8266 | #if defined CONFIG_IDF_TARGET_ESP8266 || ESP_IDF_VERSION_MAJOR == 4 | ||||||
|     ESP_LOGI(TAG, "Adding incoming ESP-NOW data from MAC %02X:%02X:%02X:%02X:%02X:%02X to queue begin.", MAC2STR(mac_addr)); |     ESP_LOGI(TAG, "Adding incoming ESP-NOW data from MAC %02X:%02X:%02X:%02X:%02X:%02X to queue begin.", MAC2STR(mac_addr)); | ||||||
| #else | #else | ||||||
|     ESP_LOGI(TAG, "Adding incoming ESP-NOW data from MAC %02X:%02X:%02X:%02X:%02X:%02X to queue begin.", MAC2STR(esp_now_info->src_addr)); |     ESP_LOGI(TAG, "Adding incoming ESP-NOW data from MAC %02X:%02X:%02X:%02X:%02X:%02X to queue begin.", MAC2STR(esp_now_info->src_addr)); | ||||||
| @@ -244,10 +255,12 @@ static void _recv_cb(const esp_now_recv_info_t *esp_now_info, const uint8_t *dat | |||||||
|         ESP_LOGW(TAG, "Adding incoming ESP-NOW data to queue fail. Queue is almost full."); |         ESP_LOGW(TAG, "Adding incoming ESP-NOW data to queue fail. Queue is almost full."); | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
|     if (data_len == sizeof(data_t)) |     if (data_len == sizeof(_queue_t) - 14) | ||||||
|     { |     { | ||||||
|         data_t *recv_data = (data_t *)data; |         _queue_t queue = {0}; | ||||||
|         if (memcmp(&recv_data->network_id, &_init_config.network_id, sizeof(recv_data->network_id)) != 0) |         queue.id = ON_RECV; | ||||||
|  |         memcpy(&queue.data, data, data_len); | ||||||
|  |         if (memcmp(&queue.data.network_id, &_init_config.network_id, sizeof(queue.data.network_id)) != 0) | ||||||
|         { |         { | ||||||
|             ESP_LOGW(TAG, "Adding incoming ESP-NOW data to queue fail. Incorrect mesh network ID."); |             ESP_LOGW(TAG, "Adding incoming ESP-NOW data to queue fail. Incorrect mesh network ID."); | ||||||
|             return; |             return; | ||||||
| @@ -255,7 +268,7 @@ static void _recv_cb(const esp_now_recv_info_t *esp_now_info, const uint8_t *dat | |||||||
|         for (uint16_t i = 0; i < zh_vector_get_size(&_id_vector); ++i) |         for (uint16_t i = 0; i < zh_vector_get_size(&_id_vector); ++i) | ||||||
|         { |         { | ||||||
|             uint32_t *message_id = zh_vector_get_item(&_id_vector, i); |             uint32_t *message_id = zh_vector_get_item(&_id_vector, i); | ||||||
|             if (memcmp(&recv_data->message_id, message_id, sizeof(recv_data->message_id)) == 0) |             if (memcmp(&queue.data.message_id, message_id, sizeof(queue.data.message_id)) == 0) | ||||||
|             { |             { | ||||||
|                 ESP_LOGW(TAG, "Adding incoming ESP-NOW data to queue fail. Repeat message received."); |                 ESP_LOGW(TAG, "Adding incoming ESP-NOW data to queue fail. Repeat message received."); | ||||||
|                 return; |                 return; | ||||||
| @@ -263,30 +276,26 @@ static void _recv_cb(const esp_now_recv_info_t *esp_now_info, const uint8_t *dat | |||||||
|         } |         } | ||||||
|         if (xSemaphoreTake(_id_vector_mutex, portTICK_PERIOD_MS) == pdTRUE) |         if (xSemaphoreTake(_id_vector_mutex, portTICK_PERIOD_MS) == pdTRUE) | ||||||
|         { |         { | ||||||
|             zh_vector_push_back(&_id_vector, &recv_data->message_id); |             zh_vector_push_back(&_id_vector, &queue.data.message_id); | ||||||
|             if (zh_vector_get_size(&_id_vector) > _init_config.id_vector_size) |             if (zh_vector_get_size(&_id_vector) > _init_config.id_vector_size) | ||||||
|             { |             { | ||||||
|                 zh_vector_delete_item(&_id_vector, 0); |                 zh_vector_delete_item(&_id_vector, 0); | ||||||
|             } |             } | ||||||
|             xSemaphoreGive(_id_vector_mutex); |             xSemaphoreGive(_id_vector_mutex); | ||||||
|         } |         } | ||||||
|         queue_t queue = {0}; | #if defined CONFIG_IDF_TARGET_ESP8266 || ESP_IDF_VERSION_MAJOR == 4 | ||||||
|         queue.id = ON_RECV; |         memcpy(queue.data.sender_mac, mac_addr, 6); | ||||||
|         recv_data = &queue.data; |  | ||||||
|         memcpy(recv_data, data, data_len); |  | ||||||
| #ifdef CONFIG_IDF_TARGET_ESP8266 |  | ||||||
|         memcpy(recv_data->sender_mac, mac_addr, 6); |  | ||||||
| #else | #else | ||||||
|         memcpy(recv_data->sender_mac, esp_now_info->src_addr, 6); |         memcpy(queue.data.sender_mac, esp_now_info->src_addr, 6); | ||||||
| #endif | #endif | ||||||
| #ifdef CONFIG_IDF_TARGET_ESP8266 | #if defined CONFIG_IDF_TARGET_ESP8266 || ESP_IDF_VERSION_MAJOR == 4 | ||||||
|         ESP_LOGI(TAG, "Adding incoming ESP-NOW data from MAC %02X:%02X:%02X:%02X:%02X:%02X to queue success.", MAC2STR(mac_addr)); |         ESP_LOGI(TAG, "Adding incoming ESP-NOW data from MAC %02X:%02X:%02X:%02X:%02X:%02X to queue success.", MAC2STR(mac_addr)); | ||||||
| #else | #else | ||||||
|         ESP_LOGI(TAG, "Adding incoming ESP-NOW data from MAC %02X:%02X:%02X:%02X:%02X:%02X to queue success.", MAC2STR(esp_now_info->src_addr)); |         ESP_LOGI(TAG, "Adding incoming ESP-NOW data from MAC %02X:%02X:%02X:%02X:%02X:%02X to queue success.", MAC2STR(esp_now_info->src_addr)); | ||||||
| #endif | #endif | ||||||
|         if (xQueueSendToFront(_queue_handle, &queue, portTICK_PERIOD_MS) != pdTRUE) |         if (xQueueSendToFront(_queue_handle, &queue, portTICK_PERIOD_MS) != pdTRUE) | ||||||
|         { |         { | ||||||
|             ESP_LOGE(TAG, "ESP-NOW message processing task internal error."); |             ESP_LOGE(TAG, "ESP-NOW message processing task internal error at line %d.", __LINE__); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     else |     else | ||||||
| @@ -297,11 +306,10 @@ static void _recv_cb(const esp_now_recv_info_t *esp_now_info, const uint8_t *dat | |||||||
|  |  | ||||||
| static void _processing(void *pvParameter) | static void _processing(void *pvParameter) | ||||||
| { | { | ||||||
|     queue_t queue = {0}; |     _queue_t queue = {0}; | ||||||
|     while (xQueueReceive(_queue_handle, &queue, portMAX_DELAY) == pdTRUE) |     while (xQueueReceive(_queue_handle, &queue, portMAX_DELAY) == pdTRUE) | ||||||
|     { |     { | ||||||
|         bool flag = false; |         bool flag = false; | ||||||
|         data_t *data = &queue.data; |  | ||||||
|         switch (queue.id) |         switch (queue.id) | ||||||
|         { |         { | ||||||
|         case TO_SEND: |         case TO_SEND: | ||||||
| @@ -315,14 +323,14 @@ static void _processing(void *pvParameter) | |||||||
|             } |             } | ||||||
|             memset(peer, 0, sizeof(esp_now_peer_info_t)); |             memset(peer, 0, sizeof(esp_now_peer_info_t)); | ||||||
|             peer->ifidx = _init_config.wifi_interface; |             peer->ifidx = _init_config.wifi_interface; | ||||||
|             if (data->message_type == BROADCAST || data->message_type == SEARCH_REQUEST || data->message_type == SEARCH_RESPONSE) |             if (queue.data.message_type == BROADCAST || queue.data.message_type == SEARCH_REQUEST || queue.data.message_type == SEARCH_RESPONSE) | ||||||
|             { |             { | ||||||
|                 memcpy(peer->peer_addr, &_broadcast_mac, 6); |                 memcpy(peer->peer_addr, _broadcast_mac, 6); | ||||||
|                 if (memcmp(data->original_sender_mac, &_self_mac, 6) == 0) |                 if (memcmp(queue.data.original_sender_mac, _self_mac, 6) == 0) | ||||||
|                 { |                 { | ||||||
|                     if (xSemaphoreTake(_id_vector_mutex, portTICK_PERIOD_MS) == pdTRUE) |                     if (xSemaphoreTake(_id_vector_mutex, portTICK_PERIOD_MS) == pdTRUE) | ||||||
|                     { |                     { | ||||||
|                         zh_vector_push_back(&_id_vector, &data->message_id); |                         zh_vector_push_back(&_id_vector, &queue.data.message_id); | ||||||
|                         if (zh_vector_get_size(&_id_vector) > _init_config.id_vector_size) |                         if (zh_vector_get_size(&_id_vector) > _init_config.id_vector_size) | ||||||
|                         { |                         { | ||||||
|                             zh_vector_delete_item(&_id_vector, 0); |                             zh_vector_delete_item(&_id_vector, 0); | ||||||
| @@ -336,8 +344,8 @@ static void _processing(void *pvParameter) | |||||||
|                 ESP_LOGI(TAG, "Checking routing table to MAC %02X:%02X:%02X:%02X:%02X:%02X.", MAC2STR(queue.data.original_target_mac)); |                 ESP_LOGI(TAG, "Checking routing table to MAC %02X:%02X:%02X:%02X:%02X:%02X.", MAC2STR(queue.data.original_target_mac)); | ||||||
|                 for (uint16_t i = 0; i < zh_vector_get_size(&_route_vector); ++i) |                 for (uint16_t i = 0; i < zh_vector_get_size(&_route_vector); ++i) | ||||||
|                 { |                 { | ||||||
|                     routing_table_t *routing_table = zh_vector_get_item(&_route_vector, i); |                     _routing_table_t *routing_table = zh_vector_get_item(&_route_vector, i); | ||||||
|                     if (memcmp(data->original_target_mac, routing_table->original_target_mac, 6) == 0) |                     if (memcmp(queue.data.original_target_mac, routing_table->original_target_mac, 6) == 0) | ||||||
|                     { |                     { | ||||||
|                         memcpy(peer->peer_addr, routing_table->intermediate_target_mac, 6); |                         memcpy(peer->peer_addr, routing_table->intermediate_target_mac, 6); | ||||||
|                         flag = true; |                         flag = true; | ||||||
| @@ -348,7 +356,7 @@ static void _processing(void *pvParameter) | |||||||
|                 if (flag == false) |                 if (flag == false) | ||||||
|                 { |                 { | ||||||
|                     ESP_LOGI(TAG, "Routing to MAC %02X:%02X:%02X:%02X:%02X:%02X not found.", MAC2STR(queue.data.original_target_mac)); |                     ESP_LOGI(TAG, "Routing to MAC %02X:%02X:%02X:%02X:%02X:%02X not found.", MAC2STR(queue.data.original_target_mac)); | ||||||
|                     if (data->message_type == UNICAST) |                     if (queue.data.message_type == UNICAST) | ||||||
|                     { |                     { | ||||||
|                         ESP_LOGI(TAG, "Unicast message from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X transferred to routing waiting list.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); |                         ESP_LOGI(TAG, "Unicast message from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X transferred to routing waiting list.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); | ||||||
|                     } |                     } | ||||||
| @@ -360,19 +368,19 @@ static void _processing(void *pvParameter) | |||||||
|                     queue.time = esp_timer_get_time() / 1000; |                     queue.time = esp_timer_get_time() / 1000; | ||||||
|                     if (xQueueSend(_queue_handle, &queue, portTICK_PERIOD_MS) != pdTRUE) |                     if (xQueueSend(_queue_handle, &queue, portTICK_PERIOD_MS) != pdTRUE) | ||||||
|                     { |                     { | ||||||
|                         ESP_LOGE(TAG, "ESP-NOW message processing task internal error."); |                         ESP_LOGE(TAG, "ESP-NOW message processing task internal error at line %d.", __LINE__); | ||||||
|                     } |                     } | ||||||
|                     ESP_LOGI(TAG, "System message for routing request from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X added to queue.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); |                     ESP_LOGI(TAG, "System message for routing request from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X added to queue.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); | ||||||
|                     queue.id = TO_SEND; |                     queue.id = TO_SEND; | ||||||
|                     data->message_type = SEARCH_REQUEST; |                     queue.data.message_type = SEARCH_REQUEST; | ||||||
|                     memcpy(data->original_sender_mac, &_self_mac, 6); |                     memcpy(queue.data.original_sender_mac, _self_mac, 6); | ||||||
|                     data->data_len = 0; |                     queue.data.payload_len = 0; | ||||||
|                     memset(data->data, 0, ZH_NETWORK_MAX_MESSAGE_SIZE); |                     memset(queue.data.payload, 0, ZH_NETWORK_MAX_MESSAGE_SIZE); | ||||||
|                     data->message_id = abs(esp_random()); // It is not clear why esp_random() sometimes gives negative values. |                     queue.data.message_id = abs(esp_random()); // It is not clear why esp_random() sometimes gives negative values. | ||||||
|                     ESP_LOGI(TAG, "Outgoing ESP-NOW data from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X processed success.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); |                     ESP_LOGI(TAG, "Outgoing ESP-NOW data from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X processed success.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); | ||||||
|                     if (xQueueSendToFront(_queue_handle, &queue, portTICK_PERIOD_MS) != pdTRUE) |                     if (xQueueSendToFront(_queue_handle, &queue, portTICK_PERIOD_MS) != pdTRUE) | ||||||
|                     { |                     { | ||||||
|                         ESP_LOGE(TAG, "ESP-NOW message processing task internal error."); |                         ESP_LOGE(TAG, "ESP-NOW message processing task internal error at line %d.", __LINE__); | ||||||
|                     } |                     } | ||||||
|                     heap_caps_free(peer); |                     heap_caps_free(peer); | ||||||
|                     break; |                     break; | ||||||
| @@ -393,45 +401,48 @@ static void _processing(void *pvParameter) | |||||||
|                 break; |                 break; | ||||||
|             } |             } | ||||||
|             memset(on_send, 0, sizeof(zh_network_event_on_send_t)); |             memset(on_send, 0, sizeof(zh_network_event_on_send_t)); | ||||||
|             memcpy(on_send->mac_addr, data->original_target_mac, 6); |             memcpy(on_send->mac_addr, queue.data.original_target_mac, 6); | ||||||
|             if (esp_now_send((uint8_t *)peer->peer_addr, (uint8_t *)data, sizeof(data_t)) != ESP_OK) |         SEND: | ||||||
|  |             ++_attempts; | ||||||
|  |             if (esp_now_send((uint8_t *)peer->peer_addr, (uint8_t *)&queue.data, sizeof(_queue_t) - 14) != ESP_OK) | ||||||
|             { |             { | ||||||
|                 ESP_LOGE(TAG, "ESP-NOW message processing task internal error."); |                 ESP_LOGE(TAG, "ESP-NOW message processing task internal error at line %d.", __LINE__); | ||||||
|                 heap_caps_free(peer); |                 heap_caps_free(peer); | ||||||
|                 heap_caps_free(on_send); |                 heap_caps_free(on_send); | ||||||
|                 break; |                 break; | ||||||
|             } |             } | ||||||
|             EventBits_t bit = xEventGroupWaitBits(_send_cb_status_event_group_handle, DATA_SEND_SUCCESS | DATA_SEND_FAIL, pdTRUE, pdFALSE, 50 / portTICK_PERIOD_MS); |             EventBits_t bit = xEventGroupWaitBits(_event_group_handle, DATA_SEND_SUCCESS | DATA_SEND_FAIL, pdTRUE, pdFALSE, 50 / portTICK_PERIOD_MS); | ||||||
|             if ((bit & DATA_SEND_SUCCESS) != 0) |             if ((bit & DATA_SEND_SUCCESS) != 0) | ||||||
|             { |             { | ||||||
|                 if (memcmp(data->original_sender_mac, &_self_mac, 6) == 0) |                 _attempts = 0; | ||||||
|  |                 if (memcmp(queue.data.original_sender_mac, _self_mac, 6) == 0) | ||||||
|                 { |                 { | ||||||
|                     if (data->message_type == BROADCAST) |                     if (queue.data.message_type == BROADCAST) | ||||||
|                     { |                     { | ||||||
|                         ESP_LOGI(TAG, "Broadcast message from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X sent success.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); |                         ESP_LOGI(TAG, "Broadcast message from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X sent success.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); | ||||||
|                         on_send->status = ZH_NETWORK_SEND_SUCCESS; |                         on_send->status = ZH_NETWORK_SEND_SUCCESS; | ||||||
|                         ESP_LOGI(TAG, "Outgoing ESP-NOW data from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X processed success.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); |                         ESP_LOGI(TAG, "Outgoing ESP-NOW data from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X processed success.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); | ||||||
|                         if (esp_event_post(ZH_NETWORK, ZH_NETWORK_ON_SEND_EVENT, on_send, sizeof(zh_network_event_on_send_t), portTICK_PERIOD_MS) != ESP_OK) |                         if (esp_event_post(ZH_NETWORK, ZH_NETWORK_ON_SEND_EVENT, on_send, sizeof(zh_network_event_on_send_t), portTICK_PERIOD_MS) != ESP_OK) | ||||||
|                         { |                         { | ||||||
|                             ESP_LOGE(TAG, "ESP-NOW message processing task internal error."); |                             ESP_LOGE(TAG, "ESP-NOW message processing task internal error at line %d.", __LINE__); | ||||||
|                         } |                         } | ||||||
|                     } |                     } | ||||||
|                     if (data->message_type == SEARCH_REQUEST) |                     if (queue.data.message_type == SEARCH_REQUEST) | ||||||
|                     { |                     { | ||||||
|                         ESP_LOGI(TAG, "System message for routing request from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X sent success.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); |                         ESP_LOGI(TAG, "System message for routing request from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X sent success.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); | ||||||
|                         ESP_LOGI(TAG, "Outgoing ESP-NOW data from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X processed success.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); |                         ESP_LOGI(TAG, "Outgoing ESP-NOW data from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X processed success.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); | ||||||
|                     } |                     } | ||||||
|                     if (data->message_type == SEARCH_RESPONSE) |                     if (queue.data.message_type == SEARCH_RESPONSE) | ||||||
|                     { |                     { | ||||||
|                         ESP_LOGI(TAG, "System message for routing response from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X sent success.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); |                         ESP_LOGI(TAG, "System message for routing response from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X sent success.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); | ||||||
|                         ESP_LOGI(TAG, "Outgoing ESP-NOW data from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X processed success.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); |                         ESP_LOGI(TAG, "Outgoing ESP-NOW data from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X processed success.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); | ||||||
|                     } |                     } | ||||||
|                     if (data->message_type == DELIVERY_CONFIRM) |                     if (queue.data.message_type == DELIVERY_CONFIRM) | ||||||
|                     { |                     { | ||||||
|                         ESP_LOGI(TAG, "System message for message receiving confirmation from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X via MAC %02X:%02X:%02X:%02X:%02X:%02X sent success.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac), MAC2STR(peer->peer_addr)); |                         ESP_LOGI(TAG, "System message for message receiving confirmation from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X via MAC %02X:%02X:%02X:%02X:%02X:%02X sent success.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac), MAC2STR(peer->peer_addr)); | ||||||
|                         ESP_LOGI(TAG, "Outgoing ESP-NOW data from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X processed success.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); |                         ESP_LOGI(TAG, "Outgoing ESP-NOW data from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X processed success.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); | ||||||
|                     } |                     } | ||||||
|                     if (data->message_type == UNICAST) |                     if (queue.data.message_type == UNICAST) | ||||||
|                     { |                     { | ||||||
|                         ESP_LOGI(TAG, "Unicast message from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X via MAC %02X:%02X:%02X:%02X:%02X:%02X sent success.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac), MAC2STR(peer->peer_addr)); |                         ESP_LOGI(TAG, "Unicast message from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X via MAC %02X:%02X:%02X:%02X:%02X:%02X sent success.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac), MAC2STR(peer->peer_addr)); | ||||||
|                         ESP_LOGI(TAG, "Unicast message from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X transferred to confirmation message waiting list.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); |                         ESP_LOGI(TAG, "Unicast message from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X transferred to confirmation message waiting list.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); | ||||||
| @@ -440,33 +451,33 @@ static void _processing(void *pvParameter) | |||||||
|                         queue.time = esp_timer_get_time() / 1000; |                         queue.time = esp_timer_get_time() / 1000; | ||||||
|                         if (xQueueSend(_queue_handle, &queue, portTICK_PERIOD_MS) != pdTRUE) |                         if (xQueueSend(_queue_handle, &queue, portTICK_PERIOD_MS) != pdTRUE) | ||||||
|                         { |                         { | ||||||
|                             ESP_LOGE(TAG, "ESP-NOW message processing task internal error."); |                             ESP_LOGE(TAG, "ESP-NOW message processing task internal error at line %d.", __LINE__); | ||||||
|                         } |                         } | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|                 else |                 else | ||||||
|                 { |                 { | ||||||
|                     if (data->message_type == BROADCAST) |                     if (queue.data.message_type == BROADCAST) | ||||||
|                     { |                     { | ||||||
|                         ESP_LOGI(TAG, "Broadcast message from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X sent success.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); |                         ESP_LOGI(TAG, "Broadcast message from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X sent success.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); | ||||||
|                         ESP_LOGI(TAG, "Outgoing ESP-NOW data from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X processed success.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); |                         ESP_LOGI(TAG, "Outgoing ESP-NOW data from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X processed success.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); | ||||||
|                     } |                     } | ||||||
|                     if (data->message_type == SEARCH_REQUEST) |                     if (queue.data.message_type == SEARCH_REQUEST) | ||||||
|                     { |                     { | ||||||
|                         ESP_LOGI(TAG, "System message for routing request from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X sent success.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); |                         ESP_LOGI(TAG, "System message for routing request from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X sent success.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); | ||||||
|                         ESP_LOGI(TAG, "Outgoing ESP-NOW data from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X processed success.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); |                         ESP_LOGI(TAG, "Outgoing ESP-NOW data from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X processed success.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); | ||||||
|                     } |                     } | ||||||
|                     if (data->message_type == SEARCH_RESPONSE) |                     if (queue.data.message_type == SEARCH_RESPONSE) | ||||||
|                     { |                     { | ||||||
|                         ESP_LOGI(TAG, "System message for routing response from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X sent success.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); |                         ESP_LOGI(TAG, "System message for routing response from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X sent success.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); | ||||||
|                         ESP_LOGI(TAG, "Outgoing ESP-NOW data from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X processed success.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); |                         ESP_LOGI(TAG, "Outgoing ESP-NOW data from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X processed success.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); | ||||||
|                     } |                     } | ||||||
|                     if (data->message_type == DELIVERY_CONFIRM) |                     if (queue.data.message_type == DELIVERY_CONFIRM) | ||||||
|                     { |                     { | ||||||
|                         ESP_LOGI(TAG, "System message for message receiving confirmation from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X via MAC %02X:%02X:%02X:%02X:%02X:%02X sent success.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac), MAC2STR(peer->peer_addr)); |                         ESP_LOGI(TAG, "System message for message receiving confirmation from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X via MAC %02X:%02X:%02X:%02X:%02X:%02X sent success.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac), MAC2STR(peer->peer_addr)); | ||||||
|                         ESP_LOGI(TAG, "Outgoing ESP-NOW data from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X processed success.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); |                         ESP_LOGI(TAG, "Outgoing ESP-NOW data from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X processed success.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); | ||||||
|                     } |                     } | ||||||
|                     if (data->message_type == UNICAST) |                     if (queue.data.message_type == UNICAST) | ||||||
|                     { |                     { | ||||||
|                         ESP_LOGI(TAG, "Unicast message from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X via MAC %02X:%02X:%02X:%02X:%02X:%02X sent success.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac), MAC2STR(peer->peer_addr)); |                         ESP_LOGI(TAG, "Unicast message from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X via MAC %02X:%02X:%02X:%02X:%02X:%02X sent success.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac), MAC2STR(peer->peer_addr)); | ||||||
|                         ESP_LOGI(TAG, "Outgoing ESP-NOW data from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X processed success.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); |                         ESP_LOGI(TAG, "Outgoing ESP-NOW data from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X processed success.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); | ||||||
| @@ -475,22 +486,27 @@ static void _processing(void *pvParameter) | |||||||
|             } |             } | ||||||
|             else |             else | ||||||
|             { |             { | ||||||
|                 if (memcmp(data->original_target_mac, &_broadcast_mac, 6) != 0) |                 if (_attempts < _init_config.attempts) | ||||||
|  |                 { | ||||||
|  |                     goto SEND; | ||||||
|  |                 } | ||||||
|  |                 _attempts = 0; | ||||||
|  |                 if (memcmp(queue.data.original_target_mac, _broadcast_mac, 6) != 0) | ||||||
|                 { |                 { | ||||||
|                     ESP_LOGI(TAG, "Routing to MAC %02X:%02X:%02X:%02X:%02X:%02X via MAC %02X:%02X:%02X:%02X:%02X:%02X is incorrect.", MAC2STR(queue.data.original_target_mac), MAC2STR(peer->peer_addr)); |                     ESP_LOGI(TAG, "Routing to MAC %02X:%02X:%02X:%02X:%02X:%02X via MAC %02X:%02X:%02X:%02X:%02X:%02X is incorrect.", MAC2STR(queue.data.original_target_mac), MAC2STR(peer->peer_addr)); | ||||||
|                     for (uint16_t i = 0; i < zh_vector_get_size(&_route_vector); ++i) |                     for (uint16_t i = 0; i < zh_vector_get_size(&_route_vector); ++i) | ||||||
|                     { |                     { | ||||||
|                         routing_table_t *routing_table = zh_vector_get_item(&_route_vector, i); |                         _routing_table_t *routing_table = zh_vector_get_item(&_route_vector, i); | ||||||
|                         if (memcmp(data->original_target_mac, routing_table->original_target_mac, 6) == 0) |                         if (memcmp(queue.data.original_target_mac, routing_table->original_target_mac, 6) == 0) | ||||||
|                         { |                         { | ||||||
|                             zh_vector_delete_item(&_route_vector, i); |                             zh_vector_delete_item(&_route_vector, i); | ||||||
|                         } |                         } | ||||||
|                     } |                     } | ||||||
|                     if (data->message_type == UNICAST) |                     if (queue.data.message_type == UNICAST) | ||||||
|                     { |                     { | ||||||
|                         ESP_LOGI(TAG, "Unicast message from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X transferred to routing waiting list.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); |                         ESP_LOGI(TAG, "Unicast message from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X transferred to routing waiting list.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); | ||||||
|                     } |                     } | ||||||
|                     if (data->message_type == DELIVERY_CONFIRM) |                     if (queue.data.message_type == DELIVERY_CONFIRM) | ||||||
|                     { |                     { | ||||||
|                         ESP_LOGI(TAG, "System message for message receiving confirmation from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X transferred to routing waiting list.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); |                         ESP_LOGI(TAG, "System message for message receiving confirmation from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X transferred to routing waiting list.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); | ||||||
|                     } |                     } | ||||||
| @@ -498,19 +514,19 @@ static void _processing(void *pvParameter) | |||||||
|                     queue.time = esp_timer_get_time() / 1000; |                     queue.time = esp_timer_get_time() / 1000; | ||||||
|                     if (xQueueSend(_queue_handle, &queue, portTICK_PERIOD_MS) != pdTRUE) |                     if (xQueueSend(_queue_handle, &queue, portTICK_PERIOD_MS) != pdTRUE) | ||||||
|                     { |                     { | ||||||
|                         ESP_LOGE(TAG, "ESP-NOW message processing task internal error."); |                         ESP_LOGE(TAG, "ESP-NOW message processing task internal error at line %d.", __LINE__); | ||||||
|                     } |                     } | ||||||
|                     ESP_LOGI(TAG, "System message for routing request to MAC %02X:%02X:%02X:%02X:%02X:%02X added to queue.", MAC2STR(queue.data.original_target_mac)); |                     ESP_LOGI(TAG, "System message for routing request to MAC %02X:%02X:%02X:%02X:%02X:%02X added to queue.", MAC2STR(queue.data.original_target_mac)); | ||||||
|                     queue.id = TO_SEND; |                     queue.id = TO_SEND; | ||||||
|                     data->message_type = SEARCH_REQUEST; |                     queue.data.message_type = SEARCH_REQUEST; | ||||||
|                     memcpy(data->original_sender_mac, &_self_mac, 6); |                     memcpy(queue.data.original_sender_mac, _self_mac, 6); | ||||||
|                     data->data_len = 0; |                     queue.data.payload_len = 0; | ||||||
|                     memset(data->data, 0, ZH_NETWORK_MAX_MESSAGE_SIZE); |                     memset(queue.data.payload, 0, ZH_NETWORK_MAX_MESSAGE_SIZE); | ||||||
|                     data->message_id = abs(esp_random()); // It is not clear why esp_random() sometimes gives negative values. |                     queue.data.message_id = abs(esp_random()); // It is not clear why esp_random() sometimes gives negative values. | ||||||
|                     ESP_LOGI(TAG, "Outgoing ESP-NOW data from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X processed success.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); |                     ESP_LOGI(TAG, "Outgoing ESP-NOW data from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X processed success.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); | ||||||
|                     if (xQueueSendToFront(_queue_handle, &queue, portTICK_PERIOD_MS) != pdTRUE) |                     if (xQueueSendToFront(_queue_handle, &queue, portTICK_PERIOD_MS) != pdTRUE) | ||||||
|                     { |                     { | ||||||
|                         ESP_LOGE(TAG, "ESP-NOW message processing task internal error."); |                         ESP_LOGE(TAG, "ESP-NOW message processing task internal error at line %d.", __LINE__); | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
| @@ -520,84 +536,84 @@ static void _processing(void *pvParameter) | |||||||
|             break; |             break; | ||||||
|         case ON_RECV: |         case ON_RECV: | ||||||
|             ESP_LOGI(TAG, "Incoming ESP-NOW data from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X processing begin.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); |             ESP_LOGI(TAG, "Incoming ESP-NOW data from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X processing begin.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); | ||||||
|             switch (data->message_type) |             switch (queue.data.message_type) | ||||||
|             { |             { | ||||||
|             case BROADCAST: |             case BROADCAST: | ||||||
|                 ESP_LOGI(TAG, "Broadcast message from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X is received.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); |                 ESP_LOGI(TAG, "Broadcast message from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X is received.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); | ||||||
|                 zh_network_event_on_recv_t *on_recv = heap_caps_malloc(sizeof(zh_network_event_on_recv_t), MALLOC_CAP_8BIT); |                 zh_network_event_on_recv_t *on_recv = heap_caps_malloc(sizeof(zh_network_event_on_recv_t), MALLOC_CAP_8BIT); | ||||||
|                 if (on_recv == NULL) |                 if (on_recv == NULL) | ||||||
|                 { |                 { | ||||||
|                     ESP_LOGE(TAG, "ESP-NOW message processing task internal error."); |                     ESP_LOGE(TAG, "ESP-NOW message processing task internal error at line %d.", __LINE__); | ||||||
|                     heap_caps_free(on_recv); |                     heap_caps_free(on_recv); | ||||||
|                     break; |                     break; | ||||||
|                 } |                 } | ||||||
|                 memset(on_recv, 0, sizeof(zh_network_event_on_recv_t)); |                 memset(on_recv, 0, sizeof(zh_network_event_on_recv_t)); | ||||||
|                 memcpy(on_recv->mac_addr, data->original_sender_mac, 6); |                 memcpy(on_recv->mac_addr, queue.data.original_sender_mac, 6); | ||||||
|                 on_recv->data_len = data->data_len; |                 on_recv->data_len = queue.data.payload_len; | ||||||
|                 on_recv->data = heap_caps_malloc(data->data_len, MALLOC_CAP_8BIT); |                 on_recv->data = heap_caps_malloc(queue.data.payload_len, MALLOC_CAP_8BIT); | ||||||
|                 if (on_recv->data == NULL) |                 if (on_recv->data == NULL) | ||||||
|                 { |                 { | ||||||
|                     ESP_LOGE(TAG, "ESP-NOW message processing task internal error."); |                     ESP_LOGE(TAG, "ESP-NOW message processing task internal error at line %d.", __LINE__); | ||||||
|                     heap_caps_free(on_recv); |                     heap_caps_free(on_recv); | ||||||
|                     heap_caps_free(on_recv->data); |                     heap_caps_free(on_recv->data); | ||||||
|                     break; |                     break; | ||||||
|                 } |                 } | ||||||
|                 memset(on_recv->data, 0, data->data_len); |                 memset(on_recv->data, 0, queue.data.payload_len); | ||||||
|                 memcpy(on_recv->data, data->data, data->data_len); |                 memcpy(on_recv->data, queue.data.payload, queue.data.payload_len); | ||||||
|                 ESP_LOGI(TAG, "Broadcast message from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X added to queue for resend to all nodes.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); |                 ESP_LOGI(TAG, "Broadcast message from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X added to queue for resend to all nodes.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); | ||||||
|                 ESP_LOGI(TAG, "Incoming ESP-NOW data from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X processed success.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); |                 ESP_LOGI(TAG, "Incoming ESP-NOW data from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X processed success.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); | ||||||
|                 if (esp_event_post(ZH_NETWORK, ZH_NETWORK_ON_RECV_EVENT, on_recv, sizeof(zh_network_event_on_recv_t) + on_recv->data_len + sizeof(on_recv->data_len), portTICK_PERIOD_MS) != ESP_OK) |                 if (esp_event_post(ZH_NETWORK, ZH_NETWORK_ON_RECV_EVENT, on_recv, sizeof(zh_network_event_on_recv_t) + on_recv->data_len + sizeof(on_recv->data_len), portTICK_PERIOD_MS) != ESP_OK) | ||||||
|                 { |                 { | ||||||
|                     ESP_LOGE(TAG, "ESP-NOW message processing task internal error."); |                     ESP_LOGE(TAG, "ESP-NOW message processing task internal error at line %d.", __LINE__); | ||||||
|                 } |                 } | ||||||
|                 heap_caps_free(on_recv); |                 heap_caps_free(on_recv); | ||||||
|                 queue.id = TO_SEND; |                 queue.id = TO_SEND; | ||||||
|                 if (xQueueSend(_queue_handle, &queue, portTICK_PERIOD_MS) != pdTRUE) |                 if (xQueueSend(_queue_handle, &queue, portTICK_PERIOD_MS) != pdTRUE) | ||||||
|                 { |                 { | ||||||
|                     ESP_LOGE(TAG, "ESP-NOW message processing task internal error."); |                     ESP_LOGE(TAG, "ESP-NOW message processing task internal error at line %d.", __LINE__); | ||||||
|                 } |                 } | ||||||
|                 break; |                 break; | ||||||
|             case UNICAST: |             case UNICAST: | ||||||
|                 ESP_LOGI(TAG, "Unicast message from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X is received.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); |                 ESP_LOGI(TAG, "Unicast message from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X is received.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); | ||||||
|                 if (memcmp(data->original_target_mac, &_self_mac, 6) == 0) |                 if (memcmp(queue.data.original_target_mac, _self_mac, 6) == 0) | ||||||
|                 { |                 { | ||||||
|                     zh_network_event_on_recv_t *on_recv = heap_caps_malloc(sizeof(zh_network_event_on_recv_t), MALLOC_CAP_8BIT); |                     zh_network_event_on_recv_t *on_recv = heap_caps_malloc(sizeof(zh_network_event_on_recv_t), MALLOC_CAP_8BIT); | ||||||
|                     if (on_recv == NULL) |                     if (on_recv == NULL) | ||||||
|                     { |                     { | ||||||
|                         ESP_LOGE(TAG, "ESP-NOW message processing task internal error."); |                         ESP_LOGE(TAG, "ESP-NOW message processing task internal error at line %d.", __LINE__); | ||||||
|                         heap_caps_free(on_recv); |                         heap_caps_free(on_recv); | ||||||
|                         break; |                         break; | ||||||
|                     } |                     } | ||||||
|                     memset(on_recv, 0, sizeof(zh_network_event_on_recv_t)); |                     memset(on_recv, 0, sizeof(zh_network_event_on_recv_t)); | ||||||
|                     memcpy(on_recv->mac_addr, data->original_sender_mac, 6); |                     memcpy(on_recv->mac_addr, queue.data.original_sender_mac, 6); | ||||||
|                     on_recv->data_len = data->data_len; |                     on_recv->data_len = queue.data.payload_len; | ||||||
|                     on_recv->data = heap_caps_malloc(data->data_len, MALLOC_CAP_8BIT); |                     on_recv->data = heap_caps_malloc(queue.data.payload_len, MALLOC_CAP_8BIT); | ||||||
|                     if (on_recv->data == NULL) |                     if (on_recv->data == NULL) | ||||||
|                     { |                     { | ||||||
|                         ESP_LOGE(TAG, "ESP-NOW message processing task internal error."); |                         ESP_LOGE(TAG, "ESP-NOW message processing task internal error at line %d.", __LINE__); | ||||||
|                         heap_caps_free(on_recv); |                         heap_caps_free(on_recv); | ||||||
|                         heap_caps_free(on_recv->data); |                         heap_caps_free(on_recv->data); | ||||||
|                         break; |                         break; | ||||||
|                     } |                     } | ||||||
|                     memset(on_recv->data, 0, data->data_len); |                     memset(on_recv->data, 0, queue.data.payload_len); | ||||||
|                     memcpy(on_recv->data, data->data, data->data_len); |                     memcpy(on_recv->data, queue.data.payload, queue.data.payload_len); | ||||||
|                     ESP_LOGI(TAG, "Incoming ESP-NOW data from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X processed success.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); |                     ESP_LOGI(TAG, "Incoming ESP-NOW data from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X processed success.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); | ||||||
|                     if (esp_event_post(ZH_NETWORK, ZH_NETWORK_ON_RECV_EVENT, on_recv, sizeof(zh_network_event_on_recv_t) + on_recv->data_len + sizeof(on_recv->data_len), portTICK_PERIOD_MS) != ESP_OK) |                     if (esp_event_post(ZH_NETWORK, ZH_NETWORK_ON_RECV_EVENT, on_recv, sizeof(zh_network_event_on_recv_t) + on_recv->data_len + sizeof(on_recv->data_len), portTICK_PERIOD_MS) != ESP_OK) | ||||||
|                     { |                     { | ||||||
|                         ESP_LOGE(TAG, "ESP-NOW message processing task internal error."); |                         ESP_LOGE(TAG, "ESP-NOW message processing task internal error at line %d.", __LINE__); | ||||||
|                     } |                     } | ||||||
|                     heap_caps_free(on_recv); |                     heap_caps_free(on_recv); | ||||||
|                     queue.id = TO_SEND; |                     queue.id = TO_SEND; | ||||||
|                     data->message_type = DELIVERY_CONFIRM; |                     queue.data.message_type = DELIVERY_CONFIRM; | ||||||
|                     memcpy(data->original_target_mac, data->original_sender_mac, 6); |                     memcpy(queue.data.original_target_mac, queue.data.original_sender_mac, 6); | ||||||
|                     memcpy(data->original_sender_mac, &_self_mac, 6); |                     memcpy(queue.data.original_sender_mac, _self_mac, 6); | ||||||
|                     data->data_len = 0; |                     queue.data.payload_len = 0; | ||||||
|                     memset(data->data, 0, ZH_NETWORK_MAX_MESSAGE_SIZE); |                     memset(queue.data.payload, 0, ZH_NETWORK_MAX_MESSAGE_SIZE); | ||||||
|                     data->confirm_id = data->message_id; |                     queue.data.confirm_id = queue.data.message_id; | ||||||
|                     data->message_id = abs(esp_random()); // It is not clear why esp_random() sometimes gives negative values. |                     queue.data.message_id = abs(esp_random()); // It is not clear why esp_random() sometimes gives negative values. | ||||||
|                     if (xQueueSendToFront(_queue_handle, &queue, portTICK_PERIOD_MS) != pdTRUE) |                     if (xQueueSendToFront(_queue_handle, &queue, portTICK_PERIOD_MS) != pdTRUE) | ||||||
|                     { |                     { | ||||||
|                         ESP_LOGE(TAG, "ESP-NOW message processing task internal error."); |                         ESP_LOGE(TAG, "ESP-NOW message processing task internal error at line %d.", __LINE__); | ||||||
|                     } |                     } | ||||||
|                     break; |                     break; | ||||||
|                 } |                 } | ||||||
| @@ -606,14 +622,14 @@ static void _processing(void *pvParameter) | |||||||
|                 queue.id = TO_SEND; |                 queue.id = TO_SEND; | ||||||
|                 if (xQueueSendToFront(_queue_handle, &queue, portTICK_PERIOD_MS) != pdTRUE) |                 if (xQueueSendToFront(_queue_handle, &queue, portTICK_PERIOD_MS) != pdTRUE) | ||||||
|                 { |                 { | ||||||
|                     ESP_LOGE(TAG, "ESP-NOW message processing task internal error."); |                     ESP_LOGE(TAG, "ESP-NOW message processing task internal error at line %d.", __LINE__); | ||||||
|                 } |                 } | ||||||
|                 break; |                 break; | ||||||
|             case DELIVERY_CONFIRM: |             case DELIVERY_CONFIRM: | ||||||
|                 ESP_LOGI(TAG, "System message for message receiving confirmation from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X is received.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); |                 ESP_LOGI(TAG, "System message for message receiving confirmation from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X is received.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); | ||||||
|                 if (memcmp(data->original_target_mac, &_self_mac, 6) == 0) |                 if (memcmp(queue.data.original_target_mac, _self_mac, 6) == 0) | ||||||
|                 { |                 { | ||||||
|                     zh_vector_push_back(&_response_vector, &data->confirm_id); |                     zh_vector_push_back(&_response_vector, &queue.data.confirm_id); | ||||||
|                     if (zh_vector_get_size(&_response_vector) > _init_config.queue_size) |                     if (zh_vector_get_size(&_response_vector) > _init_config.queue_size) | ||||||
|                     { |                     { | ||||||
|                         zh_vector_delete_item(&_response_vector, 0); |                         zh_vector_delete_item(&_response_vector, 0); | ||||||
| @@ -626,43 +642,43 @@ static void _processing(void *pvParameter) | |||||||
|                 queue.id = TO_SEND; |                 queue.id = TO_SEND; | ||||||
|                 if (xQueueSendToFront(_queue_handle, &queue, portTICK_PERIOD_MS) != pdTRUE) |                 if (xQueueSendToFront(_queue_handle, &queue, portTICK_PERIOD_MS) != pdTRUE) | ||||||
|                 { |                 { | ||||||
|                     ESP_LOGE(TAG, "ESP-NOW message processing task internal error."); |                     ESP_LOGE(TAG, "ESP-NOW message processing task internal error at line %d.", __LINE__); | ||||||
|                 } |                 } | ||||||
|                 break; |                 break; | ||||||
|             case SEARCH_REQUEST: |             case SEARCH_REQUEST: | ||||||
|                 ESP_LOGI(TAG, "System message for routing request from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X is received.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); |                 ESP_LOGI(TAG, "System message for routing request from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X is received.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); | ||||||
|                 for (uint16_t i = 0; i < zh_vector_get_size(&_route_vector); ++i) |                 for (uint16_t i = 0; i < zh_vector_get_size(&_route_vector); ++i) | ||||||
|                 { |                 { | ||||||
|                     routing_table_t *routing_table = zh_vector_get_item(&_route_vector, i); |                     _routing_table_t *routing_table = zh_vector_get_item(&_route_vector, i); | ||||||
|                     if (memcmp(data->original_target_mac, routing_table->original_target_mac, 6) == 0) |                     if (memcmp(queue.data.original_target_mac, routing_table->original_target_mac, 6) == 0) | ||||||
|                     { |                     { | ||||||
|                         zh_vector_delete_item(&_route_vector, i); |                         zh_vector_delete_item(&_route_vector, i); | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|                 { // Just to avoid the compiler warning. |                 { // Just to avoid the compiler warning. | ||||||
|                     routing_table_t routing_table = {0}; |                     _routing_table_t routing_table = {0}; | ||||||
|                     memcpy(&routing_table.original_target_mac, data->original_sender_mac, 6); |                     memcpy(routing_table.original_target_mac, queue.data.original_sender_mac, 6); | ||||||
|                     memcpy(&routing_table.intermediate_target_mac, data->sender_mac, 6); |                     memcpy(routing_table.intermediate_target_mac, queue.data.sender_mac, 6); | ||||||
|                     zh_vector_push_back(&_route_vector, &routing_table); |                     zh_vector_push_back(&_route_vector, &routing_table); | ||||||
|                 } |                 } | ||||||
|                 if (zh_vector_get_size(&_route_vector) > _init_config.route_vector_size) |                 if (zh_vector_get_size(&_route_vector) > _init_config.route_vector_size) | ||||||
|                 { |                 { | ||||||
|                     zh_vector_delete_item(&_route_vector, 0); |                     zh_vector_delete_item(&_route_vector, 0); | ||||||
|                 } |                 } | ||||||
|                 if (memcmp(data->original_target_mac, &_self_mac, 6) == 0) |                 if (memcmp(queue.data.original_target_mac, _self_mac, 6) == 0) | ||||||
|                 { |                 { | ||||||
|                     ESP_LOGI(TAG, "System message for routing response from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X added to the queue.", MAC2STR(queue.data.original_target_mac), MAC2STR(queue.data.original_sender_mac)); |                     ESP_LOGI(TAG, "System message for routing response from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X added to the queue.", MAC2STR(queue.data.original_target_mac), MAC2STR(queue.data.original_sender_mac)); | ||||||
|                     queue.id = TO_SEND; |                     queue.id = TO_SEND; | ||||||
|                     data->message_type = SEARCH_RESPONSE; |                     queue.data.message_type = SEARCH_RESPONSE; | ||||||
|                     memcpy(data->original_target_mac, data->original_sender_mac, 6); |                     memcpy(queue.data.original_target_mac, queue.data.original_sender_mac, 6); | ||||||
|                     memcpy(data->original_sender_mac, &_self_mac, 6); |                     memcpy(queue.data.original_sender_mac, _self_mac, 6); | ||||||
|                     data->data_len = 0; |                     queue.data.payload_len = 0; | ||||||
|                     memset(data->data, 0, ZH_NETWORK_MAX_MESSAGE_SIZE); |                     memset(queue.data.payload, 0, ZH_NETWORK_MAX_MESSAGE_SIZE); | ||||||
|                     data->message_id = abs(esp_random()); // It is not clear why esp_random() sometimes gives negative values. |                     queue.data.message_id = abs(esp_random()); // It is not clear why esp_random() sometimes gives negative values. | ||||||
|                     ESP_LOGI(TAG, "Incoming ESP-NOW data from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X processed success.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); |                     ESP_LOGI(TAG, "Incoming ESP-NOW data from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X processed success.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); | ||||||
|                     if (xQueueSendToFront(_queue_handle, &queue, portTICK_PERIOD_MS) != pdTRUE) |                     if (xQueueSendToFront(_queue_handle, &queue, portTICK_PERIOD_MS) != pdTRUE) | ||||||
|                     { |                     { | ||||||
|                         ESP_LOGE(TAG, "ESP-NOW message processing task internal error."); |                         ESP_LOGE(TAG, "ESP-NOW message processing task internal error at line %d.", __LINE__); | ||||||
|                     } |                     } | ||||||
|                     break; |                     break; | ||||||
|                 } |                 } | ||||||
| @@ -671,37 +687,37 @@ static void _processing(void *pvParameter) | |||||||
|                 queue.id = TO_SEND; |                 queue.id = TO_SEND; | ||||||
|                 if (xQueueSendToFront(_queue_handle, &queue, portTICK_PERIOD_MS) != pdTRUE) |                 if (xQueueSendToFront(_queue_handle, &queue, portTICK_PERIOD_MS) != pdTRUE) | ||||||
|                 { |                 { | ||||||
|                     ESP_LOGE(TAG, "ESP-NOW message processing task internal error."); |                     ESP_LOGE(TAG, "ESP-NOW message processing task internal error at line %d.", __LINE__); | ||||||
|                 } |                 } | ||||||
|                 break; |                 break; | ||||||
|             case SEARCH_RESPONSE: |             case SEARCH_RESPONSE: | ||||||
|                 ESP_LOGI(TAG, "System message for routing response from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X is received.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); |                 ESP_LOGI(TAG, "System message for routing response from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X is received.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); | ||||||
|                 for (uint16_t i = 0; i < zh_vector_get_size(&_route_vector); ++i) |                 for (uint16_t i = 0; i < zh_vector_get_size(&_route_vector); ++i) | ||||||
|                 { |                 { | ||||||
|                     routing_table_t *routing_table = zh_vector_get_item(&_route_vector, i); |                     _routing_table_t *routing_table = zh_vector_get_item(&_route_vector, i); | ||||||
|                     if (memcmp(data->original_target_mac, routing_table->original_target_mac, 6) == 0) |                     if (memcmp(queue.data.original_target_mac, routing_table->original_target_mac, 6) == 0) | ||||||
|                     { |                     { | ||||||
|                         zh_vector_delete_item(&_route_vector, i); |                         zh_vector_delete_item(&_route_vector, i); | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|                 { // Just to avoid the compiler warning. |                 { // Just to avoid the compiler warning. | ||||||
|                     routing_table_t routing_table = {0}; |                     _routing_table_t routing_table = {0}; | ||||||
|                     memcpy(&routing_table.original_target_mac, data->original_sender_mac, 6); |                     memcpy(routing_table.original_target_mac, queue.data.original_sender_mac, 6); | ||||||
|                     memcpy(&routing_table.intermediate_target_mac, data->sender_mac, 6); |                     memcpy(routing_table.intermediate_target_mac, queue.data.sender_mac, 6); | ||||||
|                     zh_vector_push_back(&_route_vector, &routing_table); |                     zh_vector_push_back(&_route_vector, &routing_table); | ||||||
|                 } |                 } | ||||||
|                 if (zh_vector_get_size(&_route_vector) > _init_config.route_vector_size) |                 if (zh_vector_get_size(&_route_vector) > _init_config.route_vector_size) | ||||||
|                 { |                 { | ||||||
|                     zh_vector_delete_item(&_route_vector, 0); |                     zh_vector_delete_item(&_route_vector, 0); | ||||||
|                 } |                 } | ||||||
|                 if (memcmp(data->original_target_mac, &_self_mac, 6) != 0) |                 if (memcmp(queue.data.original_target_mac, _self_mac, 6) != 0) | ||||||
|                 { |                 { | ||||||
|                     ESP_LOGI(TAG, "System message for routing response from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X added to queue for resend to all nodes.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); |                     ESP_LOGI(TAG, "System message for routing response from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X added to queue for resend to all nodes.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); | ||||||
|                     ESP_LOGI(TAG, "Incoming ESP-NOW data from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X processed success.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); |                     ESP_LOGI(TAG, "Incoming ESP-NOW data from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X processed success.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); | ||||||
|                     queue.id = TO_SEND; |                     queue.id = TO_SEND; | ||||||
|                     if (xQueueSendToFront(_queue_handle, &queue, portTICK_PERIOD_MS) != pdTRUE) |                     if (xQueueSendToFront(_queue_handle, &queue, portTICK_PERIOD_MS) != pdTRUE) | ||||||
|                     { |                     { | ||||||
|                         ESP_LOGE(TAG, "ESP-NOW message processing task internal error."); |                         ESP_LOGE(TAG, "ESP-NOW message processing task internal error at line %d.", __LINE__); | ||||||
|                     } |                     } | ||||||
|                     break; |                     break; | ||||||
|                 } |                 } | ||||||
| @@ -715,24 +731,24 @@ static void _processing(void *pvParameter) | |||||||
|             for (uint16_t i = 0; i < zh_vector_get_size(&_response_vector); ++i) |             for (uint16_t i = 0; i < zh_vector_get_size(&_response_vector); ++i) | ||||||
|             { |             { | ||||||
|                 uint32_t *message_id = zh_vector_get_item(&_response_vector, i); |                 uint32_t *message_id = zh_vector_get_item(&_response_vector, i); | ||||||
|                 if (memcmp(&data->message_id, message_id, sizeof(data->message_id)) == 0) |                 if (memcmp(&queue.data.message_id, message_id, sizeof(queue.data.message_id)) == 0) | ||||||
|                 { |                 { | ||||||
|                     zh_vector_delete_item(&_response_vector, i); |                     zh_vector_delete_item(&_response_vector, i); | ||||||
|                     zh_network_event_on_send_t *on_send = heap_caps_malloc(sizeof(zh_network_event_on_send_t), MALLOC_CAP_8BIT); |                     zh_network_event_on_send_t *on_send = heap_caps_malloc(sizeof(zh_network_event_on_send_t), MALLOC_CAP_8BIT); | ||||||
|                     if (on_send == NULL) |                     if (on_send == NULL) | ||||||
|                     { |                     { | ||||||
|                         ESP_LOGE(TAG, "ESP-NOW message processing task internal error."); |                         ESP_LOGE(TAG, "ESP-NOW message processing task internal error at line %d.", __LINE__); | ||||||
|                         heap_caps_free(on_send); |                         heap_caps_free(on_send); | ||||||
|                         break; |                         break; | ||||||
|                     } |                     } | ||||||
|                     memset(on_send, 0, sizeof(zh_network_event_on_send_t)); |                     memset(on_send, 0, sizeof(zh_network_event_on_send_t)); | ||||||
|                     memcpy(on_send->mac_addr, data->original_target_mac, 6); |                     memcpy(on_send->mac_addr, queue.data.original_target_mac, 6); | ||||||
|                     on_send->status = ZH_NETWORK_SEND_SUCCESS; |                     on_send->status = ZH_NETWORK_SEND_SUCCESS; | ||||||
|                     ESP_LOGI(TAG, "Unicast message from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X sent success.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); |                     ESP_LOGI(TAG, "Unicast message from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X sent success.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); | ||||||
|                     ESP_LOGI(TAG, "Unicast message from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X removed from confirmation message waiting list.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); |                     ESP_LOGI(TAG, "Unicast message from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X removed from confirmation message waiting list.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); | ||||||
|                     if (esp_event_post(ZH_NETWORK, ZH_NETWORK_ON_SEND_EVENT, on_send, sizeof(zh_network_event_on_send_t), portTICK_PERIOD_MS) != ESP_OK) |                     if (esp_event_post(ZH_NETWORK, ZH_NETWORK_ON_SEND_EVENT, on_send, sizeof(zh_network_event_on_send_t), portTICK_PERIOD_MS) != ESP_OK) | ||||||
|                     { |                     { | ||||||
|                         ESP_LOGE(TAG, "ESP-NOW message processing task internal error."); |                         ESP_LOGE(TAG, "ESP-NOW message processing task internal error at line %d.", __LINE__); | ||||||
|                     } |                     } | ||||||
|                     heap_caps_free(on_send); |                     heap_caps_free(on_send); | ||||||
|                     flag = true; |                     flag = true; | ||||||
| @@ -744,23 +760,23 @@ static void _processing(void *pvParameter) | |||||||
|                 if ((esp_timer_get_time() / 1000 - queue.time) > _init_config.max_waiting_time) |                 if ((esp_timer_get_time() / 1000 - queue.time) > _init_config.max_waiting_time) | ||||||
|                 { |                 { | ||||||
|                     ESP_LOGW(TAG, "Time for waiting confirmation message from MAC %02X:%02X:%02X:%02X:%02X:%02X is expired.", MAC2STR(queue.data.original_target_mac)); |                     ESP_LOGW(TAG, "Time for waiting confirmation message from MAC %02X:%02X:%02X:%02X:%02X:%02X is expired.", MAC2STR(queue.data.original_target_mac)); | ||||||
|                     if (memcmp(data->original_sender_mac, &_self_mac, 6) == 0) |                     if (memcmp(queue.data.original_sender_mac, _self_mac, 6) == 0) | ||||||
|                     { |                     { | ||||||
|                         zh_network_event_on_send_t *on_send = heap_caps_malloc(sizeof(zh_network_event_on_send_t), MALLOC_CAP_8BIT); |                         zh_network_event_on_send_t *on_send = heap_caps_malloc(sizeof(zh_network_event_on_send_t), MALLOC_CAP_8BIT); | ||||||
|                         if (on_send == NULL) |                         if (on_send == NULL) | ||||||
|                         { |                         { | ||||||
|                             ESP_LOGE(TAG, "ESP-NOW message processing task internal error."); |                             ESP_LOGE(TAG, "ESP-NOW message processing task internal error at line %d.", __LINE__); | ||||||
|                             heap_caps_free(on_send); |                             heap_caps_free(on_send); | ||||||
|                             break; |                             break; | ||||||
|                         } |                         } | ||||||
|                         memset(on_send, 0, sizeof(zh_network_event_on_send_t)); |                         memset(on_send, 0, sizeof(zh_network_event_on_send_t)); | ||||||
|                         memcpy(on_send->mac_addr, data->original_target_mac, 6); |                         memcpy(on_send->mac_addr, queue.data.original_target_mac, 6); | ||||||
|                         on_send->status = ZH_NETWORK_SEND_FAIL; |                         on_send->status = ZH_NETWORK_SEND_FAIL; | ||||||
|                         ESP_LOGE(TAG, "Unicast message from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X sent fail.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); |                         ESP_LOGE(TAG, "Unicast message from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X sent fail.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); | ||||||
|                         ESP_LOGI(TAG, "Unicast message from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X removed from confirmation message waiting list.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); |                         ESP_LOGI(TAG, "Unicast message from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X removed from confirmation message waiting list.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); | ||||||
|                         if (esp_event_post(ZH_NETWORK, ZH_NETWORK_ON_SEND_EVENT, on_send, sizeof(zh_network_event_on_send_t), portTICK_PERIOD_MS) != ESP_OK) |                         if (esp_event_post(ZH_NETWORK, ZH_NETWORK_ON_SEND_EVENT, on_send, sizeof(zh_network_event_on_send_t), portTICK_PERIOD_MS) != ESP_OK) | ||||||
|                         { |                         { | ||||||
|                             ESP_LOGE(TAG, "ESP-NOW message processing task internal error."); |                             ESP_LOGE(TAG, "ESP-NOW message processing task internal error at line %d.", __LINE__); | ||||||
|                         } |                         } | ||||||
|                         heap_caps_free(on_send); |                         heap_caps_free(on_send); | ||||||
|                     } |                     } | ||||||
| @@ -768,29 +784,29 @@ static void _processing(void *pvParameter) | |||||||
|                 } |                 } | ||||||
|                 if (xQueueSend(_queue_handle, &queue, portTICK_PERIOD_MS) != pdTRUE) |                 if (xQueueSend(_queue_handle, &queue, portTICK_PERIOD_MS) != pdTRUE) | ||||||
|                 { |                 { | ||||||
|                     ESP_LOGE(TAG, "ESP-NOW message processing task internal error."); |                     ESP_LOGE(TAG, "ESP-NOW message processing task internal error at line %d.", __LINE__); | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|             break; |             break; | ||||||
|         case WAIT_ROUTE: |         case WAIT_ROUTE: | ||||||
|             for (uint16_t i = 0; i < zh_vector_get_size(&_route_vector); ++i) |             for (uint16_t i = 0; i < zh_vector_get_size(&_route_vector); ++i) | ||||||
|             { |             { | ||||||
|                 routing_table_t *routing_table = zh_vector_get_item(&_route_vector, i); |                 _routing_table_t *routing_table = zh_vector_get_item(&_route_vector, i); | ||||||
|                 if (memcmp(data->original_target_mac, routing_table->original_target_mac, 6) == 0) |                 if (memcmp(queue.data.original_target_mac, routing_table->original_target_mac, 6) == 0) | ||||||
|                 { |                 { | ||||||
|                     ESP_LOGI(TAG, "Routing to MAC %02X:%02X:%02X:%02X:%02X:%02X is received.", MAC2STR(queue.data.original_target_mac)); |                     ESP_LOGI(TAG, "Routing to MAC %02X:%02X:%02X:%02X:%02X:%02X is received.", MAC2STR(queue.data.original_target_mac)); | ||||||
|                     if (data->message_type == UNICAST) |                     if (queue.data.message_type == UNICAST) | ||||||
|                     { |                     { | ||||||
|                         ESP_LOGI(TAG, "Unicast message from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X removed from routing waiting list and added to queue.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); |                         ESP_LOGI(TAG, "Unicast message from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X removed from routing waiting list and added to queue.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); | ||||||
|                     } |                     } | ||||||
|                     if (data->message_type == DELIVERY_CONFIRM) |                     if (queue.data.message_type == DELIVERY_CONFIRM) | ||||||
|                     { |                     { | ||||||
|                         ESP_LOGI(TAG, "System message for message receiving confirmation from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X removed from routing waiting list and added to queue.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); |                         ESP_LOGI(TAG, "System message for message receiving confirmation from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X removed from routing waiting list and added to queue.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); | ||||||
|                     } |                     } | ||||||
|                     queue.id = TO_SEND; |                     queue.id = TO_SEND; | ||||||
|                     if (xQueueSend(_queue_handle, &queue, portTICK_PERIOD_MS) != pdTRUE) |                     if (xQueueSend(_queue_handle, &queue, portTICK_PERIOD_MS) != pdTRUE) | ||||||
|                     { |                     { | ||||||
|                         ESP_LOGE(TAG, "ESP-NOW message processing task internal error."); |                         ESP_LOGE(TAG, "ESP-NOW message processing task internal error at line %d.", __LINE__); | ||||||
|                     } |                     } | ||||||
|                     flag = true; |                     flag = true; | ||||||
|                     break; |                     break; | ||||||
| @@ -801,33 +817,33 @@ static void _processing(void *pvParameter) | |||||||
|                 if ((esp_timer_get_time() / 1000 - queue.time) > _init_config.max_waiting_time) |                 if ((esp_timer_get_time() / 1000 - queue.time) > _init_config.max_waiting_time) | ||||||
|                 { |                 { | ||||||
|                     ESP_LOGW(TAG, "Time for waiting routing to MAC %02X:%02X:%02X:%02X:%02X:%02X is expired.", MAC2STR(queue.data.original_target_mac)); |                     ESP_LOGW(TAG, "Time for waiting routing to MAC %02X:%02X:%02X:%02X:%02X:%02X is expired.", MAC2STR(queue.data.original_target_mac)); | ||||||
|                     if (memcmp(data->original_sender_mac, &_self_mac, 6) == 0) |                     if (memcmp(queue.data.original_sender_mac, _self_mac, 6) == 0) | ||||||
|                     { |                     { | ||||||
|                         zh_network_event_on_send_t *on_send = heap_caps_malloc(sizeof(zh_network_event_on_send_t), MALLOC_CAP_8BIT); |                         zh_network_event_on_send_t *on_send = heap_caps_malloc(sizeof(zh_network_event_on_send_t), MALLOC_CAP_8BIT); | ||||||
|                         if (on_send == NULL) |                         if (on_send == NULL) | ||||||
|                         { |                         { | ||||||
|                             ESP_LOGE(TAG, "ESP-NOW message processing task internal error."); |                             ESP_LOGE(TAG, "ESP-NOW message processing task internal error at line %d.", __LINE__); | ||||||
|                             heap_caps_free(on_send); |                             heap_caps_free(on_send); | ||||||
|                             break; |                             break; | ||||||
|                         } |                         } | ||||||
|                         memset(on_send, 0, sizeof(zh_network_event_on_send_t)); |                         memset(on_send, 0, sizeof(zh_network_event_on_send_t)); | ||||||
|                         memcpy(on_send->mac_addr, data->original_target_mac, 6); |                         memcpy(on_send->mac_addr, queue.data.original_target_mac, 6); | ||||||
|                         on_send->status = ZH_NETWORK_SEND_FAIL; |                         on_send->status = ZH_NETWORK_SEND_FAIL; | ||||||
|                         ESP_LOGE(TAG, "Unicast message from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X sent fail.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); |                         ESP_LOGE(TAG, "Unicast message from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X sent fail.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); | ||||||
|                         ESP_LOGI(TAG, "Unicast message from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X removed from routing waiting list.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); |                         ESP_LOGI(TAG, "Unicast message from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X removed from routing waiting list.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); | ||||||
|                         if (esp_event_post(ZH_NETWORK, ZH_NETWORK_ON_SEND_EVENT, on_send, sizeof(zh_network_event_on_send_t), portTICK_PERIOD_MS) != ESP_OK) |                         if (esp_event_post(ZH_NETWORK, ZH_NETWORK_ON_SEND_EVENT, on_send, sizeof(zh_network_event_on_send_t), portTICK_PERIOD_MS) != ESP_OK) | ||||||
|                         { |                         { | ||||||
|                             ESP_LOGE(TAG, "ESP-NOW message processing task internal error."); |                             ESP_LOGE(TAG, "ESP-NOW message processing task internal error at line %d.", __LINE__); | ||||||
|                         } |                         } | ||||||
|                         heap_caps_free(on_send); |                         heap_caps_free(on_send); | ||||||
|                     } |                     } | ||||||
|                     else |                     else | ||||||
|                     { |                     { | ||||||
|                         if (data->message_type == UNICAST) |                         if (queue.data.message_type == UNICAST) | ||||||
|                         { |                         { | ||||||
|                             ESP_LOGI(TAG, "Unicast message from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X removed from routing waiting list.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); |                             ESP_LOGI(TAG, "Unicast message from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X removed from routing waiting list.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); | ||||||
|                         } |                         } | ||||||
|                         if (data->message_type == DELIVERY_CONFIRM) |                         if (queue.data.message_type == DELIVERY_CONFIRM) | ||||||
|                         { |                         { | ||||||
|                             ESP_LOGI(TAG, "System message for message receiving confirmation from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X removed from routing waiting list.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); |                             ESP_LOGI(TAG, "System message for message receiving confirmation from MAC %02X:%02X:%02X:%02X:%02X:%02X to MAC %02X:%02X:%02X:%02X:%02X:%02X removed from routing waiting list.", MAC2STR(queue.data.original_sender_mac), MAC2STR(queue.data.original_target_mac)); | ||||||
|                         } |                         } | ||||||
| @@ -836,7 +852,7 @@ static void _processing(void *pvParameter) | |||||||
|                 } |                 } | ||||||
|                 if (xQueueSend(_queue_handle, &queue, portTICK_PERIOD_MS) != pdTRUE) |                 if (xQueueSend(_queue_handle, &queue, portTICK_PERIOD_MS) != pdTRUE) | ||||||
|                 { |                 { | ||||||
|                     ESP_LOGE(TAG, "ESP-NOW message processing task internal error."); |                     ESP_LOGE(TAG, "ESP-NOW message processing task internal error at line %d.", __LINE__); | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|             break; |             break; | ||||||
|   | |||||||
							
								
								
									
										
											BIN
										
									
								
								components/zh_network/zh_network.zip
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								components/zh_network/zh_network.zip
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
		Reference in New Issue
	
	Block a user