Skip to content

Commit

Permalink
fix: add bind error event for timeout, rssi and bindlist size.
Browse files Browse the repository at this point in the history
  • Loading branch information
bubblesnake authored and lhespress committed Jul 4, 2024
1 parent e8748dd commit d9ebbba
Show file tree
Hide file tree
Showing 6 changed files with 147 additions and 21 deletions.
64 changes: 50 additions & 14 deletions examples/coin_cell_demo/bulb/main/app_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -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));
Expand Down Expand Up @@ -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;
}
}

Expand Down
36 changes: 36 additions & 0 deletions examples/control/main/app_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down Expand Up @@ -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);
Expand Down
36 changes: 36 additions & 0 deletions examples/solution/main/app_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -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);
Expand Down
12 changes: 10 additions & 2 deletions src/control/include/espnow_ctrl.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
*/
Expand Down
19 changes: 15 additions & 4 deletions src/control/src/espnow_ctrl.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

}
}

Expand Down Expand Up @@ -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;

Expand All @@ -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);
Expand Down
1 change: 0 additions & 1 deletion src/utils/src/espnow_storage.c
Original file line number Diff line number Diff line change
Expand Up @@ -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, "<ESP_ERR_NVS_NOT_FOUND> Get value for given key, key: %s", key);
return ESP_ERR_NVS_NOT_FOUND;
}

Expand Down

0 comments on commit d9ebbba

Please sign in to comment.