Merge branch 'bugfix/fix_ftm_dist_est_v4.4' into 'release/v4.4'

FTM calibration update and improvements in FTM (Backport v4.4)

See merge request espressif/esp-idf!24930
This commit is contained in:
Jiang Jiang Jian
2023-07-21 19:28:23 +08:00
3 changed files with 123 additions and 73 deletions

View File

@ -1,5 +1,5 @@
| Supported Targets | ESP32-S2 | ESP32-C3 | | Supported Targets | ESP32-S2 | ESP32-C3 | ESP32-S3 |
| ----------------- | -------- | -------- | | ----------------- | -------- | -------- | -------- |
# FTM Example # 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 <cm0>` to give accurate readings with the Initiator. 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 <cm0>` to give accurate readings with the Initiator.
It is recommended to keep SoftAP bandwidth at 20MHz as it gives more accurate results.
```bash ```bash
ftm> scan ftm> scan

View File

@ -25,8 +25,17 @@
typedef struct { typedef struct {
struct arg_str *ssid; struct arg_str *ssid;
struct arg_str *password; struct arg_str *password;
struct arg_lit *disconnect;
struct arg_end *end; 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 { typedef struct {
struct arg_str *ssid; struct arg_str *ssid;
@ -47,8 +56,8 @@ typedef struct {
struct arg_end *end; struct arg_end *end;
} wifi_ftm_args_t; } wifi_ftm_args_t;
static wifi_args_t sta_args; static wifi_sta_args_t sta_args;
static wifi_args_t ap_args; static wifi_ap_args_t ap_args;
static wifi_scan_arg_t scan_args; static wifi_scan_arg_t scan_args;
static wifi_ftm_args_t ftm_args; static wifi_ftm_args_t ftm_args;
@ -60,25 +69,27 @@ wifi_config_t g_ap_config = {
#define ETH_ALEN 6 #define ETH_ALEN 6
#define MAX_CONNECT_RETRY_ATTEMPTS 5 #define MAX_CONNECT_RETRY_ATTEMPTS 5
#define DEFAULT_AP_CHANNEL 1
#define DEFAULT_AP_BANDWIDTH 20
static bool s_reconnect = true; static bool s_reconnect = true;
static int s_retry_num = 0; static int s_retry_num = 0;
static const char *TAG_STA = "ftm_station"; static const char *TAG_STA = "ftm_station";
static const char *TAG_AP = "ftm_ap"; static const char *TAG_AP = "ftm_ap";
static EventGroupHandle_t wifi_event_group; static EventGroupHandle_t s_wifi_event_group;
const int CONNECTED_BIT = BIT0; static const int CONNECTED_BIT = BIT0;
const int DISCONNECTED_BIT = BIT1; static const int DISCONNECTED_BIT = BIT1;
static EventGroupHandle_t ftm_event_group; static EventGroupHandle_t s_ftm_event_group;
const int FTM_REPORT_BIT = BIT0; static const int FTM_REPORT_BIT = BIT0;
const int FTM_FAILURE_BIT = BIT1; static const int FTM_FAILURE_BIT = BIT1;
wifi_ftm_report_entry_t *g_ftm_report; static wifi_ftm_report_entry_t *s_ftm_report;
uint8_t g_ftm_report_num_entries; static uint8_t s_ftm_report_num_entries;
static uint32_t g_rtt_est, g_dist_est; static uint32_t s_rtt_est, s_dist_est;
bool g_ap_started; static bool s_ap_started;
uint8_t g_ap_channel; static uint8_t s_ap_channel;
uint8_t g_ap_bssid[ETH_ALEN]; static uint8_t s_ap_bssid[ETH_ALEN];
const int g_report_lvl = const int g_report_lvl =
#ifdef CONFIG_ESP_FTM_REPORT_SHOW_DIAG #ifdef CONFIG_ESP_FTM_REPORT_SHOW_DIAG
@ -107,10 +118,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, ESP_LOGI(TAG_STA, "Connected to %s (BSSID: "MACSTR", Channel: %d)", event->ssid,
MAC2STR(event->bssid), event->channel); MAC2STR(event->bssid), event->channel);
memcpy(g_ap_bssid, event->bssid, ETH_ALEN); memcpy(s_ap_bssid, event->bssid, ETH_ALEN);
g_ap_channel = event->channel; s_ap_channel = event->channel;
xEventGroupClearBits(wifi_event_group, DISCONNECTED_BIT); xEventGroupClearBits(s_wifi_event_group, DISCONNECTED_BIT);
xEventGroupSetBits(wifi_event_group, CONNECTED_BIT); xEventGroupSetBits(s_wifi_event_group, CONNECTED_BIT);
} else if (event_id == WIFI_EVENT_STA_DISCONNECTED) { } else if (event_id == WIFI_EVENT_STA_DISCONNECTED) {
if (s_reconnect && ++s_retry_num < MAX_CONNECT_RETRY_ATTEMPTS) { if (s_reconnect && ++s_retry_num < MAX_CONNECT_RETRY_ATTEMPTS) {
ESP_LOGI(TAG_STA, "sta disconnect, retry attempt %d...", s_retry_num); ESP_LOGI(TAG_STA, "sta disconnect, retry attempt %d...", s_retry_num);
@ -118,26 +129,26 @@ static void event_handler(void *arg, esp_event_base_t event_base,
} else { } else {
ESP_LOGI(TAG_STA, "sta disconnected"); ESP_LOGI(TAG_STA, "sta disconnected");
} }
xEventGroupClearBits(wifi_event_group, CONNECTED_BIT); xEventGroupClearBits(s_wifi_event_group, CONNECTED_BIT);
xEventGroupSetBits(wifi_event_group, DISCONNECTED_BIT); xEventGroupSetBits(s_wifi_event_group, DISCONNECTED_BIT);
} else if (event_id == WIFI_EVENT_FTM_REPORT) { } else if (event_id == WIFI_EVENT_FTM_REPORT) {
wifi_event_ftm_report_t *event = (wifi_event_ftm_report_t *) event_data; 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) { if (event->status == FTM_STATUS_SUCCESS) {
g_rtt_est = event->rtt_est; xEventGroupSetBits(s_ftm_event_group, FTM_REPORT_BIT);
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);
} else { } else {
ESP_LOGI(TAG_STA, "FTM procedure with Peer("MACSTR") failed! (Status - %d)", ESP_LOGI(TAG_STA, "FTM procedure with Peer("MACSTR") failed! (Status - %d)",
MAC2STR(event->peer_mac), event->status); 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) { } else if (event_id == WIFI_EVENT_AP_START) {
g_ap_started = true; s_ap_started = true;
} else if (event_id == WIFI_EVENT_AP_STOP) { } else if (event_id == WIFI_EVENT_AP_STOP) {
g_ap_started = false; s_ap_started = false;
} }
} }
@ -146,6 +157,9 @@ static void ftm_process_report(void)
int i; int i;
char *log = NULL; char *log = NULL;
if (s_ftm_report_num_entries == 0)
return;
if (!g_report_lvl) if (!g_report_lvl)
return; return;
@ -161,22 +175,25 @@ static void ftm_process_report(void)
g_report_lvl & BIT3 ? " RSSI |":""); g_report_lvl & BIT3 ? " RSSI |":"");
ESP_LOGI(TAG_STA, "FTM Report:"); ESP_LOGI(TAG_STA, "FTM Report:");
ESP_LOGI(TAG_STA, "|%s", log); 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; char *log_ptr = log;
bzero(log, 200); bzero(log, 200);
if (g_report_lvl & BIT0) { 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) { if (g_report_lvl & BIT1) {
log_ptr += sprintf(log_ptr, "%7u |", g_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) { if (g_report_lvl & BIT2) {
log_ptr += sprintf(log_ptr, "%14llu |%14llu |%14llu |%14llu |", g_ftm_report[i].t1, log_ptr += sprintf(log_ptr, "%14llu |%14llu |%14llu |%14llu |", s_ftm_report[i].t1,
g_ftm_report[i].t2, g_ftm_report[i].t3, g_ftm_report[i].t4); s_ftm_report[i].t2, s_ftm_report[i].t3, s_ftm_report[i].t4);
} }
if (g_report_lvl & BIT3) { 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); ESP_LOGI(TAG_STA, "|%s", log);
} }
@ -193,8 +210,8 @@ void initialise_wifi(void)
} }
ESP_ERROR_CHECK(esp_netif_init()); ESP_ERROR_CHECK(esp_netif_init());
wifi_event_group = xEventGroupCreate(); s_wifi_event_group = xEventGroupCreate();
ftm_event_group = xEventGroupCreate(); s_ftm_event_group = xEventGroupCreate();
ESP_ERROR_CHECK( esp_event_loop_create_default() ); ESP_ERROR_CHECK( esp_event_loop_create_default() );
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
ESP_ERROR_CHECK(esp_wifi_init(&cfg)); ESP_ERROR_CHECK(esp_wifi_init(&cfg));
@ -214,7 +231,7 @@ void initialise_wifi(void)
static bool wifi_cmd_sta_join(const char *ssid, const char *pass) 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 }; wifi_config_t wifi_config = { 0 };
@ -225,9 +242,9 @@ static bool wifi_cmd_sta_join(const char *ssid, const char *pass)
if (bits & CONNECTED_BIT) { if (bits & CONNECTED_BIT) {
s_reconnect = false; s_reconnect = false;
xEventGroupClearBits(wifi_event_group, CONNECTED_BIT); xEventGroupClearBits(s_wifi_event_group, CONNECTED_BIT);
ESP_ERROR_CHECK( esp_wifi_disconnect() ); 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; s_reconnect = true;
@ -236,7 +253,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_set_config(ESP_IF_WIFI_STA, &wifi_config) );
ESP_ERROR_CHECK( esp_wifi_connect() ); 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; return true;
} }
@ -249,6 +266,13 @@ static int wifi_cmd_sta(int argc, char **argv)
arg_print_errors(stderr, sta_args.end, argv[0]); arg_print_errors(stderr, sta_args.end, argv[0]);
return 1; 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]); 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]); 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; 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; s_reconnect = false;
strlcpy((char*) g_ap_config.ap.ssid, ssid, MAX_SSID_LEN); 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); 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) { if (strlen(pass) == 0) {
g_ap_config.ap.authmode = WIFI_AUTH_OPEN; 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_mode(WIFI_MODE_AP));
ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_AP, &g_ap_config)); 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; return true;
} }
@ -342,10 +382,12 @@ static int wifi_cmd_ap(int argc, char** argv)
return 1; return 1;
} }
if (true == wifi_cmd_ap_set(ap_args.ssid->sval[0], ap_args.password->sval[0])) if (!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]); ap_args.channel->count != 0 ? ap_args.channel->ival[0] : DEFAULT_AP_CHANNEL,
else ap_args.bandwidth->count != 0 ? ap_args.bandwidth->ival[0] : DEFAULT_AP_BANDWIDTH)) {
ESP_LOGE(TAG_AP, "Failed to start SoftAP!"); ESP_LOGE(TAG_AP, "Failed to start SoftAP!");
return 1;
}
return 0; return 0;
} }
@ -360,7 +402,7 @@ static int wifi_cmd_query(int argc, char **argv)
esp_wifi_get_config(WIFI_IF_AP, &cfg); esp_wifi_get_config(WIFI_IF_AP, &cfg);
ESP_LOGI(TAG_AP, "AP mode, %s %s", cfg.ap.ssid, cfg.ap.password); ESP_LOGI(TAG_AP, "AP mode, %s %s", cfg.ap.ssid, cfg.ap.password);
} else if (WIFI_MODE_STA == mode) { } 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) { if (bits & CONNECTED_BIT) {
esp_wifi_get_config(WIFI_IF_STA, &cfg); esp_wifi_get_config(WIFI_IF_STA, &cfg);
ESP_LOGI(TAG_STA, "sta mode, connected %s", cfg.ap.ssid); ESP_LOGI(TAG_STA, "sta mode, connected %s", cfg.ap.ssid);
@ -434,10 +476,10 @@ static int wifi_cmd_ftm(int argc, char **argv)
if (ftm_args.responder->count != 0) if (ftm_args.responder->count != 0)
goto ftm_responder; 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) { if (bits & CONNECTED_BIT && !ftm_args.ssid->count) {
memcpy(ftmi_cfg.resp_mac, g_ap_bssid, ETH_ALEN); memcpy(ftmi_cfg.resp_mac, s_ap_bssid, ETH_ALEN);
ftmi_cfg.channel = g_ap_channel; ftmi_cfg.channel = s_ap_channel;
} else if (ftm_args.ssid->count == 1) { } else if (ftm_args.ssid->count == 1) {
ap_record = find_ftm_responder_ap(ftm_args.ssid->sval[0]); ap_record = find_ftm_responder_ap(ftm_args.ssid->sval[0]);
if (ap_record) { if (ap_record) {
@ -479,16 +521,16 @@ static int wifi_cmd_ftm(int argc, char **argv)
return 0; 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); pdTRUE, pdFALSE, portMAX_DELAY);
/* Processing data from FTM session */ /* 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) { if (bits & FTM_REPORT_BIT) {
ftm_process_report();
free(g_ftm_report);
g_ftm_report = NULL;
g_ftm_report_num_entries = 0;
ESP_LOGI(TAG_STA, "Estimated RTT - %d nSec, Estimated Distance - %d.%02d meters", 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 { } else {
/* Failure case */ /* Failure case */
} }
@ -503,7 +545,7 @@ ftm_responder:
} }
if (ftm_args.enable->count != 0) { 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"); ESP_LOGE(TAG_AP, "Start the SoftAP first with 'ap' command");
return 0; return 0;
} }
@ -515,7 +557,7 @@ ftm_responder:
} }
if (ftm_args.disable->count != 0) { 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"); ESP_LOGE(TAG_AP, "Start the SoftAP first with 'ap' command");
return 0; return 0;
} }
@ -529,8 +571,9 @@ ftm_responder:
void register_wifi(void) void register_wifi(void)
{ {
sta_args.ssid = arg_str1(NULL, NULL, "<ssid>", "SSID of AP"); sta_args.ssid = arg_str0(NULL, NULL, "<ssid>", "SSID of AP");
sta_args.password = arg_str0(NULL, NULL, "<pass>", "password of AP"); sta_args.password = arg_str0(NULL, NULL, "<pass>", "password of AP");
sta_args.disconnect = arg_lit0("d", "disconnect", "Disconnect from the connected AP");
sta_args.end = arg_end(2); sta_args.end = arg_end(2);
const esp_console_cmd_t sta_cmd = { const esp_console_cmd_t sta_cmd = {
@ -543,8 +586,10 @@ void register_wifi(void)
ESP_ERROR_CHECK( esp_console_cmd_register(&sta_cmd) ); ESP_ERROR_CHECK( esp_console_cmd_register(&sta_cmd) );
ap_args.ssid = arg_str1(NULL, NULL, "<ssid>", "SSID of AP"); ap_args.ssid = arg_str0(NULL, NULL, "<ssid>", "SSID of AP");
ap_args.password = arg_str0(NULL, NULL, "<pass>", "password of AP"); ap_args.password = arg_str0(NULL, NULL, "<pass>", "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); ap_args.end = arg_end(2);
const esp_console_cmd_t ap_cmd = { const esp_console_cmd_t ap_cmd = {
@ -622,16 +667,20 @@ void app_main(void)
register_system(); register_system();
register_wifi(); register_wifi();
printf("\n ==========================================================\n"); printf("\n ===============================================================\n");
printf(" | Steps to test FTM |\n"); printf(" | Steps to test FTM Initiator |\n");
printf(" | |\n"); printf(" | |\n");
printf(" | 1. Use 'help' for detailed information on parameters |\n"); printf(" | 1. Use 'scan' command to scan AP's. In results, check AP's |\n");
printf(" | 2. Start SoftAP with command 'ap <SSID> <password>' |\n"); printf(" | with tag '[FTM Responder]' for supported AP's |\n");
printf(" | OR |\n"); printf(" | 2. Optionally connect to the AP with 'sta <SSID> <password>'|\n");
printf(" | 2. Use 'scan' command to search for external AP's |\n"); printf(" | 3. Initiate FTM with 'ftm -I -s <SSID>' |\n");
printf(" | 3. On second device initiate FTM with an AP using |\n"); printf(" |______________________________________________________________|\n");
printf(" | command 'ftm -I -s <SSID>' |\n"); printf(" | Steps to test FTM Responder |\n");
printf(" ==========================================================\n\n"); printf(" | |\n");
printf(" | 1. Start SoftAP with command 'ap <SSID> <password>' |\n");
printf(" | 2. Optionally add '-c <ch>' 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 // start console REPL
ESP_ERROR_CHECK(esp_console_start_repl(repl)); ESP_ERROR_CHECK(esp_console_start_repl(repl));