Updated zh_network

This commit is contained in:
2024-06-01 08:00:49 +03:00
parent a8cd9202c5
commit 1690f864a0
4 changed files with 181 additions and 186 deletions

View File

@ -21,9 +21,8 @@
## 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 operation in ESP-NOW + STA mode, your WiFi router must be set to the same channel as ESP-NOW. 2. For correct work at ESP-NOW + STA mode your WiFi router must be set on channel 1.
3. All devices on the network must have the same WiFi channel. 3. The ZHNetwork and the zh_network are incompatible.
4. The ZHNetwork and the zh_network are incompatible.
## Testing ## Testing
@ -85,7 +84,7 @@ typedef struct
void app_main(void) void app_main(void)
{ {
esp_log_level_set("zh_vector", ESP_LOG_NONE); esp_log_level_set("zh_vector", ESP_LOG_NONE);
// esp_log_level_set("zh_network", ESP_LOG_NONE); esp_log_level_set("zh_network", ESP_LOG_NONE);
nvs_flash_init(); nvs_flash_init();
esp_netif_init(); esp_netif_init();
esp_event_loop_create_default(); esp_event_loop_create_default();

View File

@ -35,7 +35,6 @@
* @note Value range from 1 to 218. Smaller size - higher transmission speed. * @note Value range from 1 to 218. Smaller size - higher transmission speed.
* *
* @attention All devices on the network must have the same ZH_NETWORK_MAX_MESSAGE_SIZE. * @attention All devices on the network must have the same ZH_NETWORK_MAX_MESSAGE_SIZE.
*
*/ */
#define ZH_NETWORK_MAX_MESSAGE_SIZE 218 #define ZH_NETWORK_MAX_MESSAGE_SIZE 218
@ -52,8 +51,7 @@
.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 \
} }
#ifdef __cplusplus #ifdef __cplusplus
@ -66,9 +64,7 @@ extern "C"
* *
* @note Before initialize ESP-NOW interface recommend initialize zh_network_init_config_t structure with default values. * @note Before initialize ESP-NOW interface recommend initialize zh_network_init_config_t structure with default values.
* *
* @code * @code zh_network_init_config_t config = ZH_NETWORK_INIT_CONFIG_DEFAULT() @endcode
* zh_network_init_config_t config = ZH_NETWORK_INIT_CONFIG_DEFAULT()
* @endcode
*/ */
typedef struct typedef struct
{ {
@ -80,8 +76,7 @@ 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. } zh_network_init_config_t;
} __attribute__((packed)) zh_network_init_config_t;
/// \cond /// \cond
ESP_EVENT_DECLARE_BASE(ESP_EVENT_BASE); ESP_EVENT_DECLARE_BASE(ESP_EVENT_BASE);
@ -95,7 +90,7 @@ extern "C"
{ {
ZH_NETWORK_ON_RECV_EVENT, ///< The event when the ESP-NOW message was received. ZH_NETWORK_ON_RECV_EVENT, ///< The event when the ESP-NOW message was received.
ZH_NETWORK_ON_SEND_EVENT ///< The event when the ESP-NOW message was sent. ZH_NETWORK_ON_SEND_EVENT ///< The event when the ESP-NOW message was sent.
} __attribute__((packed)) zh_network_event_type_t; } zh_network_event_type_t;
/** /**
* @brief Enumeration of possible status of sent ESP-NOW message. * @brief Enumeration of possible status of sent ESP-NOW message.
@ -105,19 +100,18 @@ extern "C"
{ {
ZH_NETWORK_SEND_SUCCESS, ///< If ESP-NOW message was sent success. ZH_NETWORK_SEND_SUCCESS, ///< If ESP-NOW message was sent success.
ZH_NETWORK_SEND_FAIL ///< If ESP-NOW message was sent fail. ZH_NETWORK_SEND_FAIL ///< If ESP-NOW message was sent fail.
} __attribute__((packed)) zh_network_on_send_event_type_t; } zh_network_on_send_event_type_t;
/** /**
* @brief Structure for sending data to the event handler when an ESP-NOW message was sent. * @brief Structure for sending data to the event handler when an ESP-NOW message was sent.
* *
* @note Should be used with ZH_NETWORK event base and ZH_NETWORK_ON_SEND_EVENT event. * @note Should be used with ZH_NETWORK event base and ZH_NETWORK_ON_SEND_EVENT event.
*
*/ */
typedef struct typedef struct
{ {
uint8_t mac_addr[6]; ///< MAC address of the device to which the ESP-NOW message was sent. @note uint8_t mac_addr[6]; ///< MAC address of the device to which the ESP-NOW message was sent. @note
zh_network_on_send_event_type_t status; ///< Status of sent ESP-NOW message. @note zh_network_on_send_event_type_t status; ///< Status of sent ESP-NOW message. @note
} __attribute__((packed)) zh_network_event_on_send_t; } zh_network_event_on_send_t;
/** /**
* @brief Structure for sending data to the event handler when an ESP-NOW message was received. * @brief Structure for sending data to the event handler when an ESP-NOW message was received.
@ -129,16 +123,14 @@ extern "C"
uint8_t mac_addr[6]; ///< MAC address of the sender ESP-NOW message. @note uint8_t mac_addr[6]; ///< MAC address of the sender ESP-NOW message. @note
uint8_t *data; ///< Pointer to the data of the received ESP-NOW message. @note uint8_t *data; ///< Pointer to the data of the received ESP-NOW message. @note
uint8_t data_len; ///< Size of the received ESP-NOW message. @note uint8_t data_len; ///< Size of the received ESP-NOW message. @note
} __attribute__((packed)) zh_network_event_on_recv_t; } zh_network_event_on_recv_t;
/** /**
* @brief Initialize ESP-NOW interface. * @brief Initialize ESP-NOW interface.
* *
* @note Before initialize ESP-NOW interface recommend initialize zh_network_init_config_t structure with default values. * @note Before initialize ESP-NOW interface recommend initialize zh_network_init_config_t structure with default values.
* *
* @code * @code zh_network_init_config_t config = ZH_NETWORK_INIT_CONFIG_DEFAULT() @endcode
* zh_network_init_config_t config = ZH_NETWORK_INIT_CONFIG_DEFAULT()
* @endcode
* *
* @param[in] config Pointer to ESP-NOW initialized configuration structure. Can point to a temporary variable. * @param[in] config Pointer to ESP-NOW initialized configuration structure. Can point to a temporary variable.
* *
@ -148,7 +140,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(const zh_network_init_config_t *config); esp_err_t zh_network_init(zh_network_init_config_t *config);
/** /**
* @brief Deinitialize ESP-NOW interface. * @brief Deinitialize ESP-NOW interface.
@ -172,7 +164,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 or any internal error * - ESP_FAIL if ESP-NOW is not initialized
*/ */
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);

View File

@ -1 +1 @@
1.4.4 1.0.0

View File

@ -21,7 +21,7 @@ static void _processing(void *pvParameter);
static const char *TAG = "zh_network"; static const char *TAG = "zh_network";
static EventGroupHandle_t _event_group_handle = {0}; static EventGroupHandle_t _send_cb_status_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};
@ -34,47 +34,53 @@ static const uint8_t _broadcast_mac[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
static bool _is_initialized = false; static bool _is_initialized = false;
/// \cond /// \cond
typedef struct typedef enum
{
uint8_t original_target_mac[6];
uint8_t intermediate_target_mac[6];
} __attribute__((packed)) _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; } message_type_t;
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 payload[ZH_NETWORK_MAX_MESSAGE_SIZE]; uint8_t data[ZH_NETWORK_MAX_MESSAGE_SIZE];
uint8_t payload_len; uint8_t data_len;
} data; } data_t;
} __attribute__((packed)) _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(const zh_network_init_config_t *config) esp_err_t zh_network_init(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)
@ -82,18 +88,12 @@ esp_err_t zh_network_init(const 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;
} }
_init_config = *config; if (esp_wifi_set_channel(1, WIFI_SECOND_CHAN_NONE) == ESP_ERR_WIFI_NOT_INIT)
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;
}
if (esp_wifi_set_channel(_init_config.wifi_channel, WIFI_SECOND_CHAN_NONE) == ESP_ERR_WIFI_NOT_INIT)
{ {
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(_queue_t) - 12) > ESP_NOW_MAX_DATA_LEN) if (sizeof(data_t) > 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,10 +106,11 @@ esp_err_t zh_network_init(const zh_network_init_config_t *config)
{ {
esp_read_mac(_self_mac, ESP_MAC_WIFI_SOFTAP); esp_read_mac(_self_mac, ESP_MAC_WIFI_SOFTAP);
} }
_event_group_handle = xEventGroupCreate(); _init_config = *config;
_queue_handle = xQueueCreate(_init_config.queue_size, sizeof(_queue_t)); _send_cb_status_event_group_handle = xEventGroupCreate();
_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)
@ -135,7 +136,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(_event_group_handle); vEventGroupDelete(_send_cb_status_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();
@ -174,31 +175,32 @@ 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;
queue.data.network_id = _init_config.network_id; data_t *send_data = &queue.data;
queue.data.message_id = abs(esp_random()); // It is not clear why esp_random() sometimes gives negative values. send_data->network_id = _init_config.network_id;
memcpy(queue.data.original_sender_mac, _self_mac, 6); send_data->message_id = abs(esp_random()); // It is not clear why esp_random() sometimes gives negative values.
memcpy(send_data->original_sender_mac, &_self_mac, 6);
if (target == NULL) if (target == NULL)
{ {
queue.data.message_type = BROADCAST; send_data->message_type = BROADCAST;
memcpy(queue.data.original_target_mac, _broadcast_mac, 6); memcpy(send_data->original_target_mac, &_broadcast_mac, 6);
} }
else else
{ {
if (memcmp(target, _broadcast_mac, 6) != 0) if (memcmp(target, &_broadcast_mac, 6) != 0)
{ {
queue.data.message_type = UNICAST; send_data->message_type = UNICAST;
memcpy(queue.data.original_target_mac, target, 6); memcpy(send_data->original_target_mac, target, 6);
} }
else else
{ {
queue.data.message_type = BROADCAST; send_data->message_type = BROADCAST;
memcpy(queue.data.original_target_mac, _broadcast_mac, 6); memcpy(send_data->original_target_mac, &_broadcast_mac, 6);
} }
} }
memcpy(queue.data.payload, data, data_len); memcpy(&send_data->data, data, data_len);
queue.data.payload_len = data_len; send_data->data_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.");
@ -210,7 +212,6 @@ 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.");
return ESP_FAIL;
} }
return ESP_OK; return ESP_OK;
} }
@ -219,11 +220,11 @@ 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(_event_group_handle, DATA_SEND_SUCCESS); xEventGroupSetBits(_send_cb_status_event_group_handle, DATA_SEND_SUCCESS);
} }
else else
{ {
xEventGroupSetBits(_event_group_handle, DATA_SEND_FAIL); xEventGroupSetBits(_send_cb_status_event_group_handle, DATA_SEND_FAIL);
} }
} }
@ -243,12 +244,10 @@ 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(_queue_t) - 12) if (data_len == sizeof(data_t))
{ {
_queue_t queue = {0}; data_t *recv_data = (data_t *)data;
queue.id = ON_RECV; if (memcmp(&recv_data->network_id, &_init_config.network_id, sizeof(recv_data->network_id)) != 0)
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;
@ -256,7 +255,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(&queue.data.message_id, message_id, sizeof(queue.data.message_id)) == 0) if (memcmp(&recv_data->message_id, message_id, sizeof(recv_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;
@ -264,17 +263,21 @@ 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, &queue.data.message_id); zh_vector_push_back(&_id_vector, &recv_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};
queue.id = ON_RECV;
recv_data = &queue.data;
memcpy(recv_data, data, data_len);
#ifdef CONFIG_IDF_TARGET_ESP8266 #ifdef CONFIG_IDF_TARGET_ESP8266
memcpy(queue.data.sender_mac, mac_addr, 6); memcpy(recv_data->sender_mac, mac_addr, 6);
#else #else
memcpy(queue.data.sender_mac, esp_now_info->src_addr, 6); memcpy(recv_data->sender_mac, esp_now_info->src_addr, 6);
#endif #endif
#ifdef CONFIG_IDF_TARGET_ESP8266 #ifdef CONFIG_IDF_TARGET_ESP8266
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));
@ -294,10 +297,11 @@ 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:
@ -311,14 +315,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 (queue.data.message_type == BROADCAST || queue.data.message_type == SEARCH_REQUEST || queue.data.message_type == SEARCH_RESPONSE) if (data->message_type == BROADCAST || data->message_type == SEARCH_REQUEST || data->message_type == SEARCH_RESPONSE)
{ {
memcpy(peer->peer_addr, _broadcast_mac, 6); memcpy(peer->peer_addr, &_broadcast_mac, 6);
if (memcmp(queue.data.original_sender_mac, _self_mac, 6) == 0) if (memcmp(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, &queue.data.message_id); zh_vector_push_back(&_id_vector, &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);
@ -332,8 +336,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(queue.data.original_target_mac, routing_table->original_target_mac, 6) == 0) if (memcmp(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;
@ -344,7 +348,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 (queue.data.message_type == UNICAST) if (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,11 +364,11 @@ static void _processing(void *pvParameter)
} }
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;
queue.data.message_type = SEARCH_REQUEST; data->message_type = SEARCH_REQUEST;
memcpy(queue.data.original_sender_mac, _self_mac, 6); memcpy(data->original_sender_mac, &_self_mac, 6);
queue.data.payload_len = 0; data->data_len = 0;
memset(queue.data.payload, 0, ZH_NETWORK_MAX_MESSAGE_SIZE); memset(data->data, 0, ZH_NETWORK_MAX_MESSAGE_SIZE);
queue.data.message_id = abs(esp_random()); // It is not clear why esp_random() sometimes gives negative values. 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)
{ {
@ -389,20 +393,20 @@ 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, queue.data.original_target_mac, 6); memcpy(on_send->mac_addr, data->original_target_mac, 6);
if (esp_now_send((uint8_t *)peer->peer_addr, (uint8_t *)&queue.data, sizeof(_queue_t) - 12) != ESP_OK) if (esp_now_send((uint8_t *)peer->peer_addr, (uint8_t *)data, sizeof(data_t)) != ESP_OK)
{ {
ESP_LOGE(TAG, "ESP-NOW message processing task internal error."); ESP_LOGE(TAG, "ESP-NOW message processing task internal error.");
heap_caps_free(peer); heap_caps_free(peer);
heap_caps_free(on_send); heap_caps_free(on_send);
break; break;
} }
EventBits_t bit = xEventGroupWaitBits(_event_group_handle, DATA_SEND_SUCCESS | DATA_SEND_FAIL, pdTRUE, pdFALSE, 50 / portTICK_PERIOD_MS); EventBits_t bit = xEventGroupWaitBits(_send_cb_status_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(queue.data.original_sender_mac, _self_mac, 6) == 0) if (memcmp(data->original_sender_mac, &_self_mac, 6) == 0)
{ {
if (queue.data.message_type == BROADCAST) if (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;
@ -412,22 +416,22 @@ static void _processing(void *pvParameter)
ESP_LOGE(TAG, "ESP-NOW message processing task internal error."); ESP_LOGE(TAG, "ESP-NOW message processing task internal error.");
} }
} }
if (queue.data.message_type == SEARCH_REQUEST) if (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 (queue.data.message_type == SEARCH_RESPONSE) if (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 (queue.data.message_type == DELIVERY_CONFIRM) if (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 (queue.data.message_type == UNICAST) if (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));
@ -442,27 +446,27 @@ static void _processing(void *pvParameter)
} }
else else
{ {
if (queue.data.message_type == BROADCAST) if (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 (queue.data.message_type == SEARCH_REQUEST) if (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 (queue.data.message_type == SEARCH_RESPONSE) if (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 (queue.data.message_type == DELIVERY_CONFIRM) if (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 (queue.data.message_type == UNICAST) if (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));
@ -471,22 +475,22 @@ static void _processing(void *pvParameter)
} }
else else
{ {
if (memcmp(queue.data.original_target_mac, _broadcast_mac, 6) != 0) if (memcmp(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(queue.data.original_target_mac, routing_table->original_target_mac, 6) == 0) if (memcmp(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 (queue.data.message_type == UNICAST) if (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 (queue.data.message_type == DELIVERY_CONFIRM) if (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,11 +502,11 @@ static void _processing(void *pvParameter)
} }
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;
queue.data.message_type = SEARCH_REQUEST; data->message_type = SEARCH_REQUEST;
memcpy(queue.data.original_sender_mac, _self_mac, 6); memcpy(data->original_sender_mac, &_self_mac, 6);
queue.data.payload_len = 0; data->data_len = 0;
memset(queue.data.payload, 0, ZH_NETWORK_MAX_MESSAGE_SIZE); memset(data->data, 0, ZH_NETWORK_MAX_MESSAGE_SIZE);
queue.data.message_id = abs(esp_random()); // It is not clear why esp_random() sometimes gives negative values. 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)
{ {
@ -516,7 +520,7 @@ 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 (queue.data.message_type) switch (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));
@ -528,9 +532,9 @@ static void _processing(void *pvParameter)
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, queue.data.original_sender_mac, 6); memcpy(on_recv->mac_addr, data->original_sender_mac, 6);
on_recv->data_len = queue.data.payload_len; on_recv->data_len = data->data_len;
on_recv->data = heap_caps_malloc(queue.data.payload_len, MALLOC_CAP_8BIT); on_recv->data = heap_caps_malloc(data->data_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.");
@ -538,8 +542,8 @@ static void _processing(void *pvParameter)
heap_caps_free(on_recv->data); heap_caps_free(on_recv->data);
break; break;
} }
memset(on_recv->data, 0, queue.data.payload_len); memset(on_recv->data, 0, data->data_len);
memcpy(on_recv->data, queue.data.payload, queue.data.payload_len); memcpy(on_recv->data, data->data, data->data_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)
@ -555,7 +559,7 @@ static void _processing(void *pvParameter)
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(queue.data.original_target_mac, _self_mac, 6) == 0) if (memcmp(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)
@ -565,9 +569,9 @@ static void _processing(void *pvParameter)
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, queue.data.original_sender_mac, 6); memcpy(on_recv->mac_addr, data->original_sender_mac, 6);
on_recv->data_len = queue.data.payload_len; on_recv->data_len = data->data_len;
on_recv->data = heap_caps_malloc(queue.data.payload_len, MALLOC_CAP_8BIT); on_recv->data = heap_caps_malloc(data->data_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.");
@ -575,8 +579,8 @@ static void _processing(void *pvParameter)
heap_caps_free(on_recv->data); heap_caps_free(on_recv->data);
break; break;
} }
memset(on_recv->data, 0, queue.data.payload_len); memset(on_recv->data, 0, data->data_len);
memcpy(on_recv->data, queue.data.payload, queue.data.payload_len); memcpy(on_recv->data, data->data, data->data_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)
{ {
@ -584,13 +588,13 @@ static void _processing(void *pvParameter)
} }
heap_caps_free(on_recv); heap_caps_free(on_recv);
queue.id = TO_SEND; queue.id = TO_SEND;
queue.data.message_type = DELIVERY_CONFIRM; data->message_type = DELIVERY_CONFIRM;
memcpy(queue.data.original_target_mac, queue.data.original_sender_mac, 6); memcpy(data->original_target_mac, data->original_sender_mac, 6);
memcpy(queue.data.original_sender_mac, _self_mac, 6); memcpy(data->original_sender_mac, &_self_mac, 6);
queue.data.payload_len = 0; data->data_len = 0;
memset(queue.data.payload, 0, ZH_NETWORK_MAX_MESSAGE_SIZE); memset(data->data, 0, ZH_NETWORK_MAX_MESSAGE_SIZE);
queue.data.confirm_id = queue.data.message_id; data->confirm_id = data->message_id;
queue.data.message_id = abs(esp_random()); // It is not clear why esp_random() sometimes gives negative values. 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.");
@ -607,9 +611,9 @@ static void _processing(void *pvParameter)
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(queue.data.original_target_mac, _self_mac, 6) == 0) if (memcmp(data->original_target_mac, &_self_mac, 6) == 0)
{ {
zh_vector_push_back(&_response_vector, &queue.data.confirm_id); zh_vector_push_back(&_response_vector, &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);
@ -629,32 +633,32 @@ static void _processing(void *pvParameter)
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(queue.data.original_target_mac, routing_table->original_target_mac, 6) == 0) if (memcmp(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, queue.data.original_sender_mac, 6); memcpy(&routing_table.original_target_mac, data->original_sender_mac, 6);
memcpy(routing_table.intermediate_target_mac, queue.data.sender_mac, 6); memcpy(&routing_table.intermediate_target_mac, 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(queue.data.original_target_mac, _self_mac, 6) == 0) if (memcmp(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;
queue.data.message_type = SEARCH_RESPONSE; data->message_type = SEARCH_RESPONSE;
memcpy(queue.data.original_target_mac, queue.data.original_sender_mac, 6); memcpy(data->original_target_mac, data->original_sender_mac, 6);
memcpy(queue.data.original_sender_mac, _self_mac, 6); memcpy(data->original_sender_mac, &_self_mac, 6);
queue.data.payload_len = 0; data->data_len = 0;
memset(queue.data.payload, 0, ZH_NETWORK_MAX_MESSAGE_SIZE); memset(data->data, 0, ZH_NETWORK_MAX_MESSAGE_SIZE);
queue.data.message_id = abs(esp_random()); // It is not clear why esp_random() sometimes gives negative values. 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)
{ {
@ -674,23 +678,23 @@ static void _processing(void *pvParameter)
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(queue.data.original_target_mac, routing_table->original_target_mac, 6) == 0) if (memcmp(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, queue.data.original_sender_mac, 6); memcpy(&routing_table.original_target_mac, data->original_sender_mac, 6);
memcpy(routing_table.intermediate_target_mac, queue.data.sender_mac, 6); memcpy(&routing_table.intermediate_target_mac, 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(queue.data.original_target_mac, _self_mac, 6) != 0) if (memcmp(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));
@ -711,7 +715,7 @@ 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(&queue.data.message_id, message_id, sizeof(queue.data.message_id)) == 0) if (memcmp(&data->message_id, message_id, sizeof(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);
@ -722,7 +726,7 @@ 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, queue.data.original_target_mac, 6); memcpy(on_send->mac_addr, 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));
@ -740,7 +744,7 @@ 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(queue.data.original_sender_mac, _self_mac, 6) == 0) if (memcmp(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)
@ -750,7 +754,7 @@ 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, queue.data.original_target_mac, 6); memcpy(on_send->mac_addr, 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));
@ -771,15 +775,15 @@ static void _processing(void *pvParameter)
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(queue.data.original_target_mac, routing_table->original_target_mac, 6) == 0) if (memcmp(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 (queue.data.message_type == UNICAST) if (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 (queue.data.message_type == DELIVERY_CONFIRM) if (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));
} }
@ -797,7 +801,7 @@ 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(queue.data.original_sender_mac, _self_mac, 6) == 0) if (memcmp(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)
@ -807,7 +811,7 @@ 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, queue.data.original_target_mac, 6); memcpy(on_send->mac_addr, 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));
@ -819,11 +823,11 @@ static void _processing(void *pvParameter)
} }
else else
{ {
if (queue.data.message_type == UNICAST) if (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 (queue.data.message_type == DELIVERY_CONFIRM) if (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));
} }