diff --git a/examples/coin_cell_demo/bulb/main/app_main.c b/examples/coin_cell_demo/bulb/main/app_main.c index 326eaf2..5116cbf 100644 --- a/examples/coin_cell_demo/bulb/main/app_main.c +++ b/examples/coin_cell_demo/bulb/main/app_main.c @@ -70,6 +70,36 @@ static led_strip_t *g_strip_handle = NULL; static uint32_t s_bulb_status = 0; +static char *bind_error_to_string(espnow_ctrl_bind_error_t bind_error) +{ + switch (bind_error) { + case ESPNOW_BIND_ERROR_NONE: { + return "No error"; + break; + } + + case ESPNOW_BIND_ERROR_TIMEOUT: { + return "bind timeout"; + break; + } + + case ESPNOW_BIND_ERROR_RSSI: { + return "bind packet RSSI below expected threshold"; + break; + } + + case ESPNOW_BIND_ERROR_LIST_FULL: { + return "bindlist is full"; + break; + } + + default: { + return "unknown error"; + break; + } + } +} + static void app_set_bulb_status(void) { espnow_storage_set(BULB_STATUS_KEY, &s_bulb_status, sizeof(s_bulb_status)); @@ -180,24 +210,30 @@ static void app_espnow_event_handler(void *handler_args, esp_event_base_t base, } switch (id) { - case ESP_EVENT_ESPNOW_CTRL_BIND: { - espnow_ctrl_bind_info_t *info = (espnow_ctrl_bind_info_t *)event_data; - ESP_LOGI(TAG, "bind, uuid: " MACSTR ", initiator_type: %d", MAC2STR(info->mac), info->initiator_attribute); + case ESP_EVENT_ESPNOW_CTRL_BIND: { + espnow_ctrl_bind_info_t *info = (espnow_ctrl_bind_info_t *)event_data; + ESP_LOGI(TAG, "bind, uuid: " MACSTR ", initiator_type: %d", MAC2STR(info->mac), info->initiator_attribute); - app_led_set_color(0, 255, 0); - break; - } + app_led_set_color(0, 255, 0); + break; + } - case ESP_EVENT_ESPNOW_CTRL_UNBIND: { - espnow_ctrl_bind_info_t *info = (espnow_ctrl_bind_info_t *)event_data; - ESP_LOGI(TAG, "unbind, uuid: " MACSTR ", initiator_type: %d", MAC2STR(info->mac), info->initiator_attribute); + case ESP_EVENT_ESPNOW_CTRL_BIND_ERROR: { + espnow_ctrl_bind_error_t *bind_error = (espnow_ctrl_bind_error_t *)event_data; + ESP_LOGW(TAG, "bind error: %s", bind_error_to_string(*bind_error)); + break; + } - app_led_set_color(255, 0, 0); - break; - } + case ESP_EVENT_ESPNOW_CTRL_UNBIND: { + espnow_ctrl_bind_info_t *info = (espnow_ctrl_bind_info_t *)event_data; + ESP_LOGI(TAG, "unbind, uuid: " MACSTR ", initiator_type: %d", MAC2STR(info->mac), info->initiator_attribute); + + app_led_set_color(255, 0, 0); + break; + } - default: - break; + default: + break; } } diff --git a/examples/control/main/app_main.c b/examples/control/main/app_main.c index 7abe783..db750be 100644 --- a/examples/control/main/app_main.c +++ b/examples/control/main/app_main.c @@ -70,6 +70,36 @@ static led_strip_handle_t g_strip_handle = NULL; static led_strip_t *g_strip_handle = NULL; #endif +static char *bind_error_to_string(espnow_ctrl_bind_error_t bind_error) +{ + switch (bind_error) { + case ESPNOW_BIND_ERROR_NONE: { + return "No error"; + break; + } + + case ESPNOW_BIND_ERROR_TIMEOUT: { + return "bind timeout"; + break; + } + + case ESPNOW_BIND_ERROR_RSSI: { + return "bind packet RSSI below expected threshold"; + break; + } + + case ESPNOW_BIND_ERROR_LIST_FULL: { + return "bindlist is full"; + break; + } + + default: { + return "unknown error"; + break; + } + } +} + static void app_wifi_init() { esp_event_loop_create_default(); @@ -229,6 +259,12 @@ static void app_espnow_event_handler(void *handler_args, esp_event_base_t base, break; } + case ESP_EVENT_ESPNOW_CTRL_BIND_ERROR: { + espnow_ctrl_bind_error_t *bind_error = (espnow_ctrl_bind_error_t *)event_data; + ESP_LOGW(TAG, "bind error: %s", bind_error_to_string(*bind_error)); + break; + } + case ESP_EVENT_ESPNOW_CTRL_UNBIND: { espnow_ctrl_bind_info_t *info = (espnow_ctrl_bind_info_t *)event_data; ESP_LOGI(TAG, "unbind, uuid: " MACSTR ", initiator_type: %d", MAC2STR(info->mac), info->initiator_attribute); diff --git a/examples/solution/main/app_main.c b/examples/solution/main/app_main.c index 5dfb6c3..f55a87d 100644 --- a/examples/solution/main/app_main.c +++ b/examples/solution/main/app_main.c @@ -230,6 +230,36 @@ static void app_control_button_init(void) #elif CONFIG_APP_ESPNOW_RESPONDER +static char *bind_error_to_string(espnow_ctrl_bind_error_t bind_error) +{ + switch (bind_error) { + case ESPNOW_BIND_ERROR_NONE: { + return "No error"; + break; + } + + case ESPNOW_BIND_ERROR_TIMEOUT: { + return "bind timeout"; + break; + } + + case ESPNOW_BIND_ERROR_RSSI: { + return "bind packet RSSI below expected threshold"; + break; + } + + case ESPNOW_BIND_ERROR_LIST_FULL: { + return "bindlist is full"; + break; + } + + default: { + return "unknown error"; + break; + } + } +} + static void app_espnow_event_handler(void *handler_args, esp_event_base_t base, int32_t id, void *event_data) { if (base != ESP_EVENT_ESPNOW) { @@ -245,6 +275,12 @@ static void app_espnow_event_handler(void *handler_args, esp_event_base_t base, break; } + case ESP_EVENT_ESPNOW_CTRL_BIND_ERROR: { + espnow_ctrl_bind_error_t *bind_error = (espnow_ctrl_bind_error_t *)event_data; + ESP_LOGW(TAG, "bind error: %s", bind_error_to_string(*bind_error)); + break; + } + case ESP_EVENT_ESPNOW_CTRL_UNBIND: { espnow_ctrl_bind_info_t *info = (espnow_ctrl_bind_info_t *)event_data; ESP_LOGI(TAG, "unbind, uuid: " MACSTR ", initiator_type: %d", MAC2STR(info->mac), info->initiator_attribute); diff --git a/src/control/include/espnow_ctrl.h b/src/control/include/espnow_ctrl.h index ac65f57..8ebeb9a 100644 --- a/src/control/include/espnow_ctrl.h +++ b/src/control/include/espnow_ctrl.h @@ -18,8 +18,9 @@ extern "C" { /** * @brief Enumerated list of control event id */ -#define ESP_EVENT_ESPNOW_CTRL_BIND (ESP_EVENT_ESPNOW_CTRL_BASE + 0) -#define ESP_EVENT_ESPNOW_CTRL_UNBIND (ESP_EVENT_ESPNOW_CTRL_BASE + 1) +#define ESP_EVENT_ESPNOW_CTRL_BIND (ESP_EVENT_ESPNOW_CTRL_BASE + 0) +#define ESP_EVENT_ESPNOW_CTRL_UNBIND (ESP_EVENT_ESPNOW_CTRL_BASE + 1) +#define ESP_EVENT_ESPNOW_CTRL_BIND_ERROR (ESP_EVENT_ESPNOW_CTRL_BASE + 2) /** * @brief Maximum number of device in bind list @@ -78,6 +79,13 @@ typedef enum { ESPNOW_ATTRIBUTE_CHARGING_STATE = 0x0303, } espnow_attribute_t; +typedef enum { + ESPNOW_BIND_ERROR_NONE, + ESPNOW_BIND_ERROR_TIMEOUT, + ESPNOW_BIND_ERROR_RSSI, + ESPNOW_BIND_ERROR_LIST_FULL, +} espnow_ctrl_bind_error_t; + /** * @brief Bind information from initiator */ diff --git a/src/control/src/espnow_ctrl.c b/src/control/src/espnow_ctrl.c index 663334e..accba17 100644 --- a/src/control/src/espnow_ctrl.c +++ b/src/control/src/espnow_ctrl.c @@ -97,7 +97,6 @@ static void espnow_load_bindlist(void) if(!g_bindlist.is_init) { espnow_storage_get("bindlist", &g_bindlist, sizeof(g_bindlist)); g_bindlist.is_init = true; - } } @@ -214,8 +213,8 @@ static esp_err_t espnow_ctrl_responder_bind_process(uint8_t *src_addr, void *dat #endif if (ctrl_data->responder_value_b) { - ESP_LOGI(TAG, "bind, esp_log_timestamp: %d, timestamp: %d, rssi: %d, rssi: %d", - esp_log_timestamp(), g_timestamp, rx_ctrl->rssi, g_rssi); + ESP_LOGI(TAG, "bind, timestamp: %d, max timestamp: %d, rssi: %d, min rssi: %d, bindlist size: %d", + esp_log_timestamp(), g_timestamp, rx_ctrl->rssi, g_rssi, g_bindlist.size); bool bind_cb_flag = false; @@ -225,7 +224,19 @@ static esp_err_t espnow_ctrl_responder_bind_process(uint8_t *src_addr, void *dat bind_cb_flag = true; } - if (bind_cb_flag && esp_log_timestamp() < g_timestamp && rx_ctrl->rssi > g_rssi) { + espnow_ctrl_bind_error_t bind_error = ESPNOW_BIND_ERROR_NONE; + if (esp_log_timestamp() > g_timestamp) { + bind_error = ESPNOW_BIND_ERROR_TIMEOUT; + } else if (rx_ctrl->rssi < g_rssi) { + bind_error = ESPNOW_BIND_ERROR_RSSI; + } else if (g_bindlist.size >= ESPNOW_BIND_LIST_MAX_SIZE) { + bind_error = ESPNOW_BIND_ERROR_LIST_FULL; + } + + if (bind_error != ESPNOW_BIND_ERROR_NONE) { + esp_event_post(ESP_EVENT_ESPNOW, ESP_EVENT_ESPNOW_CTRL_BIND_ERROR, + &bind_error, sizeof(bind_error), 0); + } else if (bind_cb_flag){ if (!espnow_ctrl_responder_is_bindlist(src_addr, ctrl_data->initiator_attribute)) { g_bindlist.data[g_bindlist.size].initiator_attribute = ctrl_data->initiator_attribute; memcpy(g_bindlist.data[g_bindlist.size].mac, src_addr, 6); diff --git a/src/utils/src/espnow_storage.c b/src/utils/src/espnow_storage.c index 929ee10..2106760 100644 --- a/src/utils/src/espnow_storage.c +++ b/src/utils/src/espnow_storage.c @@ -143,7 +143,6 @@ esp_err_t espnow_storage_get(const char *key, void *value, size_t length) nvs_close(handle); if (ret == ESP_ERR_NVS_NOT_FOUND) { - ESP_LOGD(TAG, " Get value for given key, key: %s", key); return ESP_ERR_NVS_NOT_FOUND; }