From 53b0c359bbc589d7663f43ea71031b0d63ea96a8 Mon Sep 17 00:00:00 2001 From: Ivan Grokhotkov Date: Thu, 20 Jul 2023 15:41:15 +0530 Subject: [PATCH 1/2] examples: wifi/ftm: make global variables static Prevents conflict between g_ftm_report_num_entries defined in the example and in the Wi-Fi library. --- examples/wifi/ftm/main/ftm_main.c | 98 +++++++++++++++---------------- 1 file changed, 49 insertions(+), 49 deletions(-) diff --git a/examples/wifi/ftm/main/ftm_main.c b/examples/wifi/ftm/main/ftm_main.c index c7a9a21d79..5217fcf05b 100644 --- a/examples/wifi/ftm/main/ftm_main.c +++ b/examples/wifi/ftm/main/ftm_main.c @@ -66,19 +66,19 @@ static int s_retry_num = 0; static const char *TAG_STA = "ftm_station"; static const char *TAG_AP = "ftm_ap"; -static EventGroupHandle_t wifi_event_group; -const int CONNECTED_BIT = BIT0; -const int DISCONNECTED_BIT = BIT1; +static EventGroupHandle_t s_wifi_event_group; +static const int CONNECTED_BIT = BIT0; +static const int DISCONNECTED_BIT = BIT1; -static EventGroupHandle_t ftm_event_group; -const int FTM_REPORT_BIT = BIT0; -const int FTM_FAILURE_BIT = BIT1; -wifi_ftm_report_entry_t *g_ftm_report; -uint8_t g_ftm_report_num_entries; -static uint32_t g_rtt_est, g_dist_est; -bool g_ap_started; -uint8_t g_ap_channel; -uint8_t g_ap_bssid[ETH_ALEN]; +static EventGroupHandle_t s_ftm_event_group; +static const int FTM_REPORT_BIT = BIT0; +static const int FTM_FAILURE_BIT = BIT1; +static wifi_ftm_report_entry_t *s_ftm_report; +static uint8_t s_ftm_report_num_entries; +static uint32_t s_rtt_est, s_dist_est; +static bool s_ap_started; +static uint8_t s_ap_channel; +static uint8_t s_ap_bssid[ETH_ALEN]; const int g_report_lvl = #ifdef CONFIG_ESP_FTM_REPORT_SHOW_DIAG @@ -107,10 +107,10 @@ static void event_handler(void *arg, esp_event_base_t event_base, ESP_LOGI(TAG_STA, "Connected to %s (BSSID: "MACSTR", Channel: %d)", event->ssid, MAC2STR(event->bssid), event->channel); - memcpy(g_ap_bssid, event->bssid, ETH_ALEN); - g_ap_channel = event->channel; - xEventGroupClearBits(wifi_event_group, DISCONNECTED_BIT); - xEventGroupSetBits(wifi_event_group, CONNECTED_BIT); + memcpy(s_ap_bssid, event->bssid, ETH_ALEN); + s_ap_channel = event->channel; + xEventGroupClearBits(s_wifi_event_group, DISCONNECTED_BIT); + xEventGroupSetBits(s_wifi_event_group, CONNECTED_BIT); } else if (event_id == WIFI_EVENT_STA_DISCONNECTED) { if (s_reconnect && ++s_retry_num < MAX_CONNECT_RETRY_ATTEMPTS) { ESP_LOGI(TAG_STA, "sta disconnect, retry attempt %d...", s_retry_num); @@ -118,26 +118,26 @@ static void event_handler(void *arg, esp_event_base_t event_base, } else { ESP_LOGI(TAG_STA, "sta disconnected"); } - xEventGroupClearBits(wifi_event_group, CONNECTED_BIT); - xEventGroupSetBits(wifi_event_group, DISCONNECTED_BIT); + xEventGroupClearBits(s_wifi_event_group, CONNECTED_BIT); + xEventGroupSetBits(s_wifi_event_group, DISCONNECTED_BIT); } else if (event_id == WIFI_EVENT_FTM_REPORT) { wifi_event_ftm_report_t *event = (wifi_event_ftm_report_t *) event_data; if (event->status == FTM_STATUS_SUCCESS) { - g_rtt_est = event->rtt_est; - g_dist_est = event->dist_est; - g_ftm_report = event->ftm_report_data; - g_ftm_report_num_entries = event->ftm_report_num_entries; - xEventGroupSetBits(ftm_event_group, FTM_REPORT_BIT); + s_rtt_est = event->rtt_est; + s_dist_est = event->dist_est; + s_ftm_report = event->ftm_report_data; + s_ftm_report_num_entries = event->ftm_report_num_entries; + xEventGroupSetBits(s_ftm_event_group, FTM_REPORT_BIT); } else { ESP_LOGI(TAG_STA, "FTM procedure with Peer("MACSTR") failed! (Status - %d)", MAC2STR(event->peer_mac), event->status); - xEventGroupSetBits(ftm_event_group, FTM_FAILURE_BIT); + xEventGroupSetBits(s_ftm_event_group, FTM_FAILURE_BIT); } } else if (event_id == WIFI_EVENT_AP_START) { - g_ap_started = true; + s_ap_started = true; } else if (event_id == WIFI_EVENT_AP_STOP) { - g_ap_started = false; + s_ap_started = false; } } @@ -161,22 +161,22 @@ static void ftm_process_report(void) g_report_lvl & BIT3 ? " RSSI |":""); ESP_LOGI(TAG_STA, "FTM Report:"); ESP_LOGI(TAG_STA, "|%s", log); - for (i = 0; i < g_ftm_report_num_entries; i++) { + for (i = 0; i < s_ftm_report_num_entries; i++) { char *log_ptr = log; bzero(log, 200); if (g_report_lvl & BIT0) { - log_ptr += sprintf(log_ptr, "%6d|", g_ftm_report[i].dlog_token); + log_ptr += sprintf(log_ptr, "%6d|", s_ftm_report[i].dlog_token); } if (g_report_lvl & BIT1) { - log_ptr += sprintf(log_ptr, "%7u |", g_ftm_report[i].rtt); + log_ptr += sprintf(log_ptr, "%7u |", s_ftm_report[i].rtt); } if (g_report_lvl & BIT2) { - log_ptr += sprintf(log_ptr, "%14llu |%14llu |%14llu |%14llu |", g_ftm_report[i].t1, - g_ftm_report[i].t2, g_ftm_report[i].t3, g_ftm_report[i].t4); + log_ptr += sprintf(log_ptr, "%14llu |%14llu |%14llu |%14llu |", s_ftm_report[i].t1, + s_ftm_report[i].t2, s_ftm_report[i].t3, s_ftm_report[i].t4); } if (g_report_lvl & BIT3) { - log_ptr += sprintf(log_ptr, "%6d |", g_ftm_report[i].rssi); + log_ptr += sprintf(log_ptr, "%6d |", s_ftm_report[i].rssi); } ESP_LOGI(TAG_STA, "|%s", log); } @@ -193,8 +193,8 @@ void initialise_wifi(void) } ESP_ERROR_CHECK(esp_netif_init()); - wifi_event_group = xEventGroupCreate(); - ftm_event_group = xEventGroupCreate(); + s_wifi_event_group = xEventGroupCreate(); + s_ftm_event_group = xEventGroupCreate(); ESP_ERROR_CHECK( esp_event_loop_create_default() ); wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); ESP_ERROR_CHECK(esp_wifi_init(&cfg)); @@ -214,7 +214,7 @@ void initialise_wifi(void) static bool wifi_cmd_sta_join(const char *ssid, const char *pass) { - int bits = xEventGroupWaitBits(wifi_event_group, CONNECTED_BIT, 0, 1, 0); + int bits = xEventGroupWaitBits(s_wifi_event_group, CONNECTED_BIT, 0, 1, 0); wifi_config_t wifi_config = { 0 }; @@ -225,9 +225,9 @@ static bool wifi_cmd_sta_join(const char *ssid, const char *pass) if (bits & CONNECTED_BIT) { s_reconnect = false; - xEventGroupClearBits(wifi_event_group, CONNECTED_BIT); + xEventGroupClearBits(s_wifi_event_group, CONNECTED_BIT); ESP_ERROR_CHECK( esp_wifi_disconnect() ); - xEventGroupWaitBits(wifi_event_group, DISCONNECTED_BIT, 0, 1, portTICK_RATE_MS); + xEventGroupWaitBits(s_wifi_event_group, DISCONNECTED_BIT, 0, 1, portTICK_RATE_MS); } s_reconnect = true; @@ -236,7 +236,7 @@ static bool wifi_cmd_sta_join(const char *ssid, const char *pass) ESP_ERROR_CHECK( esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config) ); ESP_ERROR_CHECK( esp_wifi_connect() ); - xEventGroupWaitBits(wifi_event_group, CONNECTED_BIT, 0, 1, 5000 / portTICK_RATE_MS); + xEventGroupWaitBits(s_wifi_event_group, CONNECTED_BIT, 0, 1, 5000 / portTICK_RATE_MS); return true; } @@ -360,7 +360,7 @@ static int wifi_cmd_query(int argc, char **argv) esp_wifi_get_config(WIFI_IF_AP, &cfg); ESP_LOGI(TAG_AP, "AP mode, %s %s", cfg.ap.ssid, cfg.ap.password); } else if (WIFI_MODE_STA == mode) { - int bits = xEventGroupWaitBits(wifi_event_group, CONNECTED_BIT, 0, 1, 0); + int bits = xEventGroupWaitBits(s_wifi_event_group, CONNECTED_BIT, 0, 1, 0); if (bits & CONNECTED_BIT) { esp_wifi_get_config(WIFI_IF_STA, &cfg); ESP_LOGI(TAG_STA, "sta mode, connected %s", cfg.ap.ssid); @@ -434,10 +434,10 @@ static int wifi_cmd_ftm(int argc, char **argv) if (ftm_args.responder->count != 0) goto ftm_responder; - bits = xEventGroupWaitBits(wifi_event_group, CONNECTED_BIT, 0, 1, 0); + bits = xEventGroupWaitBits(s_wifi_event_group, CONNECTED_BIT, 0, 1, 0); if (bits & CONNECTED_BIT && !ftm_args.ssid->count) { - memcpy(ftmi_cfg.resp_mac, g_ap_bssid, ETH_ALEN); - ftmi_cfg.channel = g_ap_channel; + memcpy(ftmi_cfg.resp_mac, s_ap_bssid, ETH_ALEN); + ftmi_cfg.channel = s_ap_channel; } else if (ftm_args.ssid->count == 1) { ap_record = find_ftm_responder_ap(ftm_args.ssid->sval[0]); if (ap_record) { @@ -479,16 +479,16 @@ static int wifi_cmd_ftm(int argc, char **argv) return 0; } - bits = xEventGroupWaitBits(ftm_event_group, FTM_REPORT_BIT | FTM_FAILURE_BIT, + bits = xEventGroupWaitBits(s_ftm_event_group, FTM_REPORT_BIT | FTM_FAILURE_BIT, pdTRUE, pdFALSE, portMAX_DELAY); /* Processing data from FTM session */ if (bits & FTM_REPORT_BIT) { ftm_process_report(); - free(g_ftm_report); - g_ftm_report = NULL; - g_ftm_report_num_entries = 0; + free(s_ftm_report); + s_ftm_report = NULL; + s_ftm_report_num_entries = 0; ESP_LOGI(TAG_STA, "Estimated RTT - %d nSec, Estimated Distance - %d.%02d meters", - g_rtt_est, g_dist_est / 100, g_dist_est % 100); + s_rtt_est, s_dist_est / 100, s_dist_est % 100); } else { /* Failure case */ } @@ -503,7 +503,7 @@ ftm_responder: } if (ftm_args.enable->count != 0) { - if (!g_ap_started) { + if (!s_ap_started) { ESP_LOGE(TAG_AP, "Start the SoftAP first with 'ap' command"); return 0; } @@ -515,7 +515,7 @@ ftm_responder: } if (ftm_args.disable->count != 0) { - if (!g_ap_started) { + if (!s_ap_started) { ESP_LOGE(TAG_AP, "Start the SoftAP first with 'ap' command"); return 0; } From fb64c24785d8f79bebce3a014a4c4b85b61a05a8 Mon Sep 17 00:00:00 2001 From: Nachiket Kukade Date: Thu, 20 Jul 2023 15:46:06 +0530 Subject: [PATCH 2/2] fix(esp_wifi): Update FTM calibration and fix other FTM issues Update wifi libs with below fixes - 1. Bugfixes in Initiator and Responder mode 2. Fix wrong RTT value in first FTM procedure without connection 3. Update FTM calibration values for ESP32S2, S3 and C3 4. Update distance estimation logic 5. Add some useful command parameters in FTM example 6. Fix bug when number of FTM measurement frames received is more than (number_of_brusts * FTMs per brust). Co-authored-by: Sarvesh Bodakhe --- components/esp_wifi/lib | 2 +- examples/wifi/ftm/README.md | 5 +- examples/wifi/ftm/main/ftm_main.c | 107 ++++++++++++++++++++++-------- 3 files changed, 82 insertions(+), 32 deletions(-) diff --git a/components/esp_wifi/lib b/components/esp_wifi/lib index adcb3b0a7a..1e65557980 160000 --- a/components/esp_wifi/lib +++ b/components/esp_wifi/lib @@ -1 +1 @@ -Subproject commit adcb3b0a7a1f167c9d62c859564384a39c19f01f +Subproject commit 1e65557980e6cd8af46245f18588ef62c8a40c30 diff --git a/examples/wifi/ftm/README.md b/examples/wifi/ftm/README.md index 49203bde9a..143cbe39fe 100644 --- a/examples/wifi/ftm/README.md +++ b/examples/wifi/ftm/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32-S2 | ESP32-C3 | -| ----------------- | -------- | -------- | +| Supported Targets | ESP32-S2 | ESP32-C3 | ESP32-S3 | +| ----------------- | -------- | -------- | -------- | # FTM Example @@ -43,6 +43,7 @@ ftm> ``` Use `help` to get a list of available commands and options. Use `scan` command to scan for AP's that support FTM Responder mode. Before initiating FTM with an external AP, make sure that `FTM Responder` tag is visible in the respective scan result entry. Alternatively, start SoftAP on another device using `ap` command, it supports FTM Responder by default. If external FTM Initiators get a large error in distance readings with the SoftAP, note down the reading at zero distance in centimeters, say `cm0`. This distance can be offset using command `ftm -R -o ` to give accurate readings with the Initiator. +It is recommended to keep SoftAP bandwidth at 20MHz as it gives more accurate results. ```bash ftm> scan diff --git a/examples/wifi/ftm/main/ftm_main.c b/examples/wifi/ftm/main/ftm_main.c index 5217fcf05b..637c31349a 100644 --- a/examples/wifi/ftm/main/ftm_main.c +++ b/examples/wifi/ftm/main/ftm_main.c @@ -25,8 +25,17 @@ typedef struct { struct arg_str *ssid; struct arg_str *password; + struct arg_lit *disconnect; struct arg_end *end; -} wifi_args_t; +} wifi_sta_args_t; + +typedef struct { + struct arg_str *ssid; + struct arg_str *password; + struct arg_int *channel; + struct arg_int *bandwidth; + struct arg_end *end; +} wifi_ap_args_t; typedef struct { struct arg_str *ssid; @@ -47,8 +56,8 @@ typedef struct { struct arg_end *end; } wifi_ftm_args_t; -static wifi_args_t sta_args; -static wifi_args_t ap_args; +static wifi_sta_args_t sta_args; +static wifi_ap_args_t ap_args; static wifi_scan_arg_t scan_args; static wifi_ftm_args_t ftm_args; @@ -60,6 +69,8 @@ wifi_config_t g_ap_config = { #define ETH_ALEN 6 #define MAX_CONNECT_RETRY_ATTEMPTS 5 +#define DEFAULT_AP_CHANNEL 1 +#define DEFAULT_AP_BANDWIDTH 20 static bool s_reconnect = true; static int s_retry_num = 0; @@ -123,11 +134,11 @@ static void event_handler(void *arg, esp_event_base_t event_base, } else if (event_id == WIFI_EVENT_FTM_REPORT) { wifi_event_ftm_report_t *event = (wifi_event_ftm_report_t *) event_data; + s_rtt_est = event->rtt_est; + s_dist_est = event->dist_est; + s_ftm_report = event->ftm_report_data; + s_ftm_report_num_entries = event->ftm_report_num_entries; if (event->status == FTM_STATUS_SUCCESS) { - s_rtt_est = event->rtt_est; - s_dist_est = event->dist_est; - s_ftm_report = event->ftm_report_data; - s_ftm_report_num_entries = event->ftm_report_num_entries; xEventGroupSetBits(s_ftm_event_group, FTM_REPORT_BIT); } else { ESP_LOGI(TAG_STA, "FTM procedure with Peer("MACSTR") failed! (Status - %d)", @@ -146,6 +157,9 @@ static void ftm_process_report(void) int i; char *log = NULL; + if (s_ftm_report_num_entries == 0) + return; + if (!g_report_lvl) return; @@ -169,7 +183,10 @@ static void ftm_process_report(void) log_ptr += sprintf(log_ptr, "%6d|", s_ftm_report[i].dlog_token); } if (g_report_lvl & BIT1) { - log_ptr += sprintf(log_ptr, "%7u |", s_ftm_report[i].rtt); + if (s_ftm_report[i].rtt != UINT32_MAX) + log_ptr += sprintf(log_ptr, "%7" PRIi32 " |", s_ftm_report[i].rtt); + else + log_ptr += sprintf(log_ptr, " INVALID |"); } if (g_report_lvl & BIT2) { log_ptr += sprintf(log_ptr, "%14llu |%14llu |%14llu |%14llu |", s_ftm_report[i].t1, @@ -249,6 +266,13 @@ static int wifi_cmd_sta(int argc, char **argv) arg_print_errors(stderr, sta_args.end, argv[0]); return 1; } + if (sta_args.disconnect->count) { + s_reconnect = false; + xEventGroupClearBits(s_wifi_event_group, CONNECTED_BIT); + esp_wifi_disconnect(); + xEventGroupWaitBits(s_wifi_event_group, DISCONNECTED_BIT, 0, 1, portTICK_PERIOD_MS); + return 0; + } ESP_LOGI(TAG_STA, "sta connecting to '%s'", sta_args.ssid->sval[0]); wifi_cmd_sta_join(sta_args.ssid->sval[0], sta_args.password->sval[0]); @@ -311,7 +335,7 @@ static int wifi_cmd_scan(int argc, char **argv) return 0; } -static bool wifi_cmd_ap_set(const char* ssid, const char* pass) +static bool wifi_cmd_ap_set(const char* ssid, const char* pass, uint8_t channel, uint8_t bw) { s_reconnect = false; strlcpy((char*) g_ap_config.ap.ssid, ssid, MAX_SSID_LEN); @@ -323,13 +347,29 @@ static bool wifi_cmd_ap_set(const char* ssid, const char* pass) } strlcpy((char*) g_ap_config.ap.password, pass, MAX_PASSPHRASE_LEN); } + if (!(channel >=1 && channel <= 14)) { + ESP_LOGE(TAG_AP, "Channel cannot be %d!", channel); + return false; + } + if (bw != 20 && bw != 40) { + ESP_LOGE(TAG_AP, "Cannot set %d MHz bandwidth!", bw); + return false; + } if (strlen(pass) == 0) { g_ap_config.ap.authmode = WIFI_AUTH_OPEN; } - + g_ap_config.ap.channel = channel; ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_AP)); ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_AP, &g_ap_config)); + if (bw == 40) { + esp_wifi_set_bandwidth(ESP_IF_WIFI_AP, WIFI_BW_HT40); + } else { + esp_wifi_set_bandwidth(ESP_IF_WIFI_AP, WIFI_BW_HT20); + } + ESP_LOGI(TAG_AP, "Starting SoftAP with FTM Responder support, SSID - %s, Password - %s, Primary Channel - %d, Bandwidth - %dMHz", + ap_args.ssid->sval[0], ap_args.password->sval[0], channel, bw); + return true; } @@ -342,10 +382,12 @@ static int wifi_cmd_ap(int argc, char** argv) return 1; } - if (true == wifi_cmd_ap_set(ap_args.ssid->sval[0], ap_args.password->sval[0])) - ESP_LOGI(TAG_AP, "Starting SoftAP with FTM Responder support, SSID - %s, Password - %s", ap_args.ssid->sval[0], ap_args.password->sval[0]); - else + if (!wifi_cmd_ap_set(ap_args.ssid->sval[0], ap_args.password->sval[0], + ap_args.channel->count != 0 ? ap_args.channel->ival[0] : DEFAULT_AP_CHANNEL, + ap_args.bandwidth->count != 0 ? ap_args.bandwidth->ival[0] : DEFAULT_AP_BANDWIDTH)) { ESP_LOGE(TAG_AP, "Failed to start SoftAP!"); + return 1; + } return 0; } @@ -482,11 +524,11 @@ static int wifi_cmd_ftm(int argc, char **argv) bits = xEventGroupWaitBits(s_ftm_event_group, FTM_REPORT_BIT | FTM_FAILURE_BIT, pdTRUE, pdFALSE, portMAX_DELAY); /* Processing data from FTM session */ + ftm_process_report(); + free(s_ftm_report); + s_ftm_report = NULL; + s_ftm_report_num_entries = 0; if (bits & FTM_REPORT_BIT) { - ftm_process_report(); - free(s_ftm_report); - s_ftm_report = NULL; - s_ftm_report_num_entries = 0; ESP_LOGI(TAG_STA, "Estimated RTT - %d nSec, Estimated Distance - %d.%02d meters", s_rtt_est, s_dist_est / 100, s_dist_est % 100); } else { @@ -529,8 +571,9 @@ ftm_responder: void register_wifi(void) { - sta_args.ssid = arg_str1(NULL, NULL, "", "SSID of AP"); + sta_args.ssid = arg_str0(NULL, NULL, "", "SSID of AP"); sta_args.password = arg_str0(NULL, NULL, "", "password of AP"); + sta_args.disconnect = arg_lit0("d", "disconnect", "Disconnect from the connected AP"); sta_args.end = arg_end(2); const esp_console_cmd_t sta_cmd = { @@ -543,8 +586,10 @@ void register_wifi(void) ESP_ERROR_CHECK( esp_console_cmd_register(&sta_cmd) ); - ap_args.ssid = arg_str1(NULL, NULL, "", "SSID of AP"); + ap_args.ssid = arg_str0(NULL, NULL, "", "SSID of AP"); ap_args.password = arg_str0(NULL, NULL, "", "password of AP"); + ap_args.channel = arg_int0("c", "channel", "<1-11>", "Primary channel of AP"); + ap_args.bandwidth = arg_int0("b", "bandwidth", "<20/40>", "Channel bandwidth"); ap_args.end = arg_end(2); const esp_console_cmd_t ap_cmd = { @@ -622,16 +667,20 @@ void app_main(void) register_system(); register_wifi(); - printf("\n ==========================================================\n"); - printf(" | Steps to test FTM |\n"); - printf(" | |\n"); - printf(" | 1. Use 'help' for detailed information on parameters |\n"); - printf(" | 2. Start SoftAP with command 'ap ' |\n"); - printf(" | OR |\n"); - printf(" | 2. Use 'scan' command to search for external AP's |\n"); - printf(" | 3. On second device initiate FTM with an AP using |\n"); - printf(" | command 'ftm -I -s ' |\n"); - printf(" ==========================================================\n\n"); + printf("\n ===============================================================\n"); + printf(" | Steps to test FTM Initiator |\n"); + printf(" | |\n"); + printf(" | 1. Use 'scan' command to scan AP's. In results, check AP's |\n"); + printf(" | with tag '[FTM Responder]' for supported AP's |\n"); + printf(" | 2. Optionally connect to the AP with 'sta '|\n"); + printf(" | 3. Initiate FTM with 'ftm -I -s ' |\n"); + printf(" |______________________________________________________________|\n"); + printf(" | Steps to test FTM Responder |\n"); + printf(" | |\n"); + printf(" | 1. Start SoftAP with command 'ap ' |\n"); + printf(" | 2. Optionally add '-c ' to set channel, '-b 40' for 40M |\n"); + printf(" | 3. Use 'help' for detailed information for all parameters |\n"); + printf(" ================================================================\n\n"); // start console REPL ESP_ERROR_CHECK(esp_console_start_repl(repl));