Version 1.0.1
Added multiple attempts to send a message. Fixed bug with ESP-NOW channel setting when device is connected to router. Changed internal error message. Added support of ESP-IDF v4.x.x. Medium main code refactoring. Added WiFi channel selection.
This commit is contained in:
parent
906f1e2725
commit
76281e85be
@ -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
|
406
zh_network.c
406
zh_network.c
@ -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
|
|
||||||
{
|
|
||||||
BROADCAST,
|
|
||||||
UNICAST,
|
|
||||||
DELIVERY_CONFIRM,
|
|
||||||
SEARCH_REQUEST,
|
|
||||||
SEARCH_RESPONSE
|
|
||||||
} message_type_t;
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
message_type_t message_type;
|
|
||||||
uint32_t network_id;
|
|
||||||
uint32_t message_id;
|
|
||||||
uint32_t confirm_id;
|
|
||||||
uint8_t original_target_mac[6];
|
|
||||||
uint8_t original_sender_mac[6];
|
|
||||||
uint8_t sender_mac[6];
|
|
||||||
uint8_t data[ZH_NETWORK_MAX_MESSAGE_SIZE];
|
|
||||||
uint8_t data_len;
|
|
||||||
} data_t;
|
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
uint8_t original_target_mac[6];
|
uint8_t original_target_mac[6];
|
||||||
uint8_t intermediate_target_mac[6];
|
uint8_t intermediate_target_mac[6];
|
||||||
} routing_table_t;
|
} _routing_table_t;
|
||||||
|
|
||||||
typedef enum
|
|
||||||
{
|
|
||||||
TO_SEND,
|
|
||||||
ON_RECV,
|
|
||||||
WAIT_ROUTE,
|
|
||||||
WAIT_RESPONSE,
|
|
||||||
} queue_id_t;
|
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
queue_id_t id;
|
|
||||||
uint64_t time;
|
uint64_t time;
|
||||||
data_t data;
|
enum
|
||||||
} queue_t;
|
{
|
||||||
|
TO_SEND,
|
||||||
|
ON_RECV,
|
||||||
|
WAIT_ROUTE,
|
||||||
|
WAIT_RESPONSE,
|
||||||
|
} id;
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
BROADCAST,
|
||||||
|
UNICAST,
|
||||||
|
DELIVERY_CONFIRM,
|
||||||
|
SEARCH_REQUEST,
|
||||||
|
SEARCH_RESPONSE
|
||||||
|
} __attribute__((packed)) message_type;
|
||||||
|
uint32_t network_id;
|
||||||
|
uint32_t message_id;
|
||||||
|
uint32_t confirm_id;
|
||||||
|
uint8_t original_target_mac[6];
|
||||||
|
uint8_t original_sender_mac[6];
|
||||||
|
uint8_t sender_mac[6];
|
||||||
|
uint8_t payload[ZH_NETWORK_MAX_MESSAGE_SIZE];
|
||||||
|
uint8_t payload_len;
|
||||||
|
} __attribute__((packed)) 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
zh_network.zip
Normal file
BIN
zh_network.zip
Normal file
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user