mirror of
https://github.com/espressif/esp-idf.git
synced 2025-07-30 18:57:19 +02:00
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:
Submodule components/esp_wifi/lib updated: adcb3b0a7a...1e65557980
@ -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 <cm0>` 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
|
||||
|
@ -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,25 +69,27 @@ 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;
|
||||
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 +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,
|
||||
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 +129,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;
|
||||
|
||||
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) {
|
||||
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);
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -161,22 +175,25 @@ 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);
|
||||
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 |", 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 +210,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 +231,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 +242,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 +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_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;
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
@ -360,7 +402,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 +476,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 +521,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 */
|
||||
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(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",
|
||||
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 +545,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 +557,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;
|
||||
}
|
||||
@ -529,8 +571,9 @@ ftm_responder:
|
||||
|
||||
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.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>", "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.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 <SSID> <password>' |\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 <SSID>' |\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 <SSID> <password>'|\n");
|
||||
printf(" | 3. Initiate FTM with 'ftm -I -s <SSID>' |\n");
|
||||
printf(" |______________________________________________________________|\n");
|
||||
printf(" | Steps to test FTM Responder |\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
|
||||
ESP_ERROR_CHECK(esp_console_start_repl(repl));
|
||||
|
Reference in New Issue
Block a user