diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt index 7923635..6c5221a 100644 --- a/main/CMakeLists.txt +++ b/main/CMakeLists.txt @@ -2,6 +2,7 @@ set(SOURCES "main.c" "usb-cdc.c" "nvs.c" + "nvs-config.c" "led.c" "cli-uart.c" "i2c.c" @@ -15,6 +16,7 @@ set(SOURCES "cli-commands.c" "cli-commands-gpio.c" "cli-commands-wifi.c" + "cli-commands-config.c" "cli-commands-device-info.c" "cli-args.c" ) diff --git a/main/cli-commands-config.c b/main/cli-commands-config.c new file mode 100644 index 0000000..5377537 --- /dev/null +++ b/main/cli-commands-config.c @@ -0,0 +1,214 @@ +#include "cli.h" +#include "cli-args.h" +#include "cli-commands.h" +#include "helpers.h" +#include "nvs-config.h" +#include +#include + +void cli_config_get(Cli* cli, mstring_t* args) { + mstring_t* value = mstring_alloc(); + WiFiMode wifi_mode; + + nvs_config_get_ap_ssid(value); + cli_printf(cli, "ap_ssid: %s", mstring_get_cstr(value)); + cli_write_eol(cli); + + nvs_config_get_ap_pass(value); + cli_printf(cli, "ap_pass: %s", mstring_get_cstr(value)); + cli_write_eol(cli); + + nvs_config_get_sta_ssid(value); + cli_printf(cli, "sta_ssid: %s", mstring_get_cstr(value)); + cli_write_eol(cli); + + nvs_config_get_sta_pass(value); + cli_printf(cli, "sta_pass: %s", mstring_get_cstr(value)); + cli_write_eol(cli); + + nvs_config_get_wifi_mode(&wifi_mode); + switch(wifi_mode) { + case WiFiModeAP: + mstring_set(value, "AP"); + break; + case WiFiModeSTA: + mstring_set(value, "STA"); + break; + } + + cli_printf(cli, "wifi_mode: %s", mstring_get_cstr(value)); + cli_write_eol(cli); + + mstring_free(value); +} + +void cli_config_set_wifi_mode_usage(Cli* cli) { + cli_write_str(cli, "config_set_wifi_mode "); +} + +void cli_config_set_wifi_mode(Cli* cli, mstring_t* args) { + mstring_t* mode = mstring_alloc(); + WiFiMode wifi_mode; + + do { + if(!cli_args_read_string_and_trim(args, mode)) { + cli_config_set_wifi_mode_usage(cli); + break; + } + + if(mstring_cmp_cstr(mode, "AP") == 0) { + wifi_mode = WiFiModeAP; + } else if(mstring_cmp_cstr(mode, "STA") == 0) { + wifi_mode = WiFiModeSTA; + } else { + cli_config_set_wifi_mode_usage(cli); + break; + } + + if(nvs_config_set_wifi_mode(wifi_mode) == ESP_OK) { + cli_write_str(cli, "OK"); + } else { + cli_write_str(cli, "ERR"); + } + } while(false); + + mstring_free(mode); +} + +void cli_config_set_ap_pass(Cli* cli, mstring_t* args) { + mstring_t* pass = mstring_alloc(); + + do { + if(!cli_args_read_quoted_string_and_trim(args, pass)) { + cli_write_str(cli, "config_set_ap_pass \"\", min 8 symbols or empty quotes"); + break; + } + + if(nvs_config_set_ap_pass(pass) == ESP_OK) { + cli_write_str(cli, "OK"); + } else { + cli_write_str(cli, "config_set_ap_pass \"\", min 8 symbols or empty quotes"); + } + } while(false); + + mstring_free(pass); +} + +void cli_config_set_ap_ssid(Cli* cli, mstring_t* args) { + mstring_t* ssid = mstring_alloc(); + + do { + if(!cli_args_read_quoted_string_and_trim(args, ssid)) { + cli_write_str(cli, "config_set_ap_ssid \"\", 1-32 symbols"); + break; + } + + if(nvs_config_set_ap_ssid(ssid) == ESP_OK) { + cli_write_str(cli, "OK"); + } else { + cli_write_str(cli, "config_set_ap_ssid \"\", 1-32 symbols"); + } + } while(false); + + mstring_free(ssid); +} + +void cli_config_set_sta_pass(Cli* cli, mstring_t* args) { + mstring_t* pass = mstring_alloc(); + + do { + if(!cli_args_read_quoted_string_and_trim(args, pass)) { + cli_write_str(cli, "config_set_sta_pass \"\", min 8 symbols or empty quotes"); + break; + } + + if(nvs_config_set_sta_pass(pass) == ESP_OK) { + cli_write_str(cli, "OK"); + } else { + cli_write_str(cli, "config_set_sta_pass \"\", min 8 symbols or empty quotes"); + } + } while(false); + + mstring_free(pass); +} + +void cli_config_set_sta_ssid(Cli* cli, mstring_t* args) { + mstring_t* ssid = mstring_alloc(); + + do { + if(!cli_args_read_quoted_string_and_trim(args, ssid)) { + cli_write_str(cli, "config_set_sta_ssid \"\", 1-32 symbols"); + break; + } + + if(nvs_config_set_sta_ssid(ssid) == ESP_OK) { + cli_write_str(cli, "OK"); + } else { + cli_write_str(cli, "config_set_sta_ssid \"\", 1-32 symbols"); + } + } while(false); + + mstring_free(ssid); +} + +const char* nvs_type_to_str(nvs_type_t type) { + switch(type) { + case NVS_TYPE_U8: + return "U8"; + case NVS_TYPE_I8: + return "I8"; + case NVS_TYPE_U16: + return "U16"; + case NVS_TYPE_I16: + return "I16"; + case NVS_TYPE_U32: + return "U32"; + case NVS_TYPE_I32: + return "I32"; + case NVS_TYPE_U64: + return "U64"; + case NVS_TYPE_I64: + return "I64"; + case NVS_TYPE_STR: + return "STR"; + case NVS_TYPE_BLOB: + return "BLOB"; + case NVS_TYPE_ANY: + return "ANY"; + default: + return "UNK"; + } +} + +void cli_nvs_dump(Cli* cli, mstring_t* args) { + const char* partitions[] = { + "nvs", + "nvs_storage", + }; + + for(size_t i = 0; i < COUNT_OF(partitions); i++) { + cli_write_str(cli, partitions[i]); + cli_write_str(cli, ":"); + cli_write_eol(cli); + + do { + nvs_iterator_t it = nvs_entry_find(partitions[i], NULL, NVS_TYPE_ANY); + while(it != NULL) { + nvs_entry_info_t info; + nvs_entry_info(it, &info); + it = nvs_entry_next(it); + + if(strlen(info.namespace_name)) { + cli_printf(cli, " \"%s:%s\"", info.namespace_name, info.key); + } else { + cli_printf(cli, " \"%s\"", info.key); + } + cli_printf(cli, " %s", nvs_type_to_str(info.type)); + cli_write_eol(cli); + }; + + } while(false); + } + + cli_write_str(cli, "OK"); +} \ No newline at end of file diff --git a/main/cli-commands-wifi.c b/main/cli-commands-wifi.c index ca00651..e2d2797 100644 --- a/main/cli-commands-wifi.c +++ b/main/cli-commands-wifi.c @@ -96,4 +96,38 @@ void cli_wifi_scan(Cli* cli, mstring_t* args) { cli_write_str(cli, "OK"); free(ap_info); +} + +void cli_wifi_ap_clients(Cli* cli, mstring_t* args) { + wifi_sta_list_t* wifi_sta_list = malloc(sizeof(wifi_sta_list_t)); + esp_err_t err = esp_wifi_ap_get_sta_list(wifi_sta_list); + + if(err == ESP_OK) { + for(size_t i = 0; i < wifi_sta_list->num; i++) { + cli_printf( + cli, + "%02x:%02x:%02x:%02x:%02x:%02x ", + wifi_sta_list->sta[i].mac[0], + wifi_sta_list->sta[i].mac[1], + wifi_sta_list->sta[i].mac[2], + wifi_sta_list->sta[i].mac[3], + wifi_sta_list->sta[i].mac[4], + wifi_sta_list->sta[i].mac[5]); + cli_printf(cli, "%idBm ", wifi_sta_list->sta[i].rssi); + + if(wifi_sta_list->sta[i].phy_11b) cli_write_str(cli, "b"); + if(wifi_sta_list->sta[i].phy_11g) cli_write_str(cli, "g"); + if(wifi_sta_list->sta[i].phy_11n) cli_write_str(cli, "n"); + if(wifi_sta_list->sta[i].phy_lr) cli_write_str(cli, "lr"); + if(wifi_sta_list->sta[i].is_mesh_child) cli_write_str(cli, "m"); + + cli_write_eol(cli); + } + + cli_write_str(cli, "OK"); + } else { + cli_write_str(cli, "FAIL"); + } + + free(wifi_sta_list); } \ No newline at end of file diff --git a/main/cli-commands.c b/main/cli-commands.c index 4f1f31f..ddcb13c 100644 --- a/main/cli-commands.c +++ b/main/cli-commands.c @@ -1,5 +1,6 @@ #include #include +#include #include "cli.h" #include "led.h" #include "nvs.h" @@ -7,14 +8,25 @@ #include "cli-args.h" #include "cli-commands.h" +void cli_device_info(Cli* cli, mstring_t* args); +void cli_factory_reset(Cli* cli, mstring_t* args); +void cli_gpio_get(Cli* cli, mstring_t* args); +void cli_gpio_set(Cli* cli, mstring_t* args); void cli_led(Cli* cli, mstring_t* args); void cli_help(Cli* cli, mstring_t* args); void cli_ping(Cli* cli, mstring_t* args); -void cli_gpio_set(Cli* cli, mstring_t* args); -void cli_gpio_get(Cli* cli, mstring_t* args); -void cli_device_info(Cli* cli, mstring_t* args); -void cli_factory_reset(Cli* cli, mstring_t* args); +void cli_sw_reset(Cli* cli, mstring_t* args); void cli_wifi_scan(Cli* cli, mstring_t* args); +void cli_wifi_ap_clients(Cli* cli, mstring_t* args); + +void cli_config_get(Cli* cli, mstring_t* args); +void cli_config_set_wifi_mode(Cli* cli, mstring_t* args); +void cli_config_set_ap_pass(Cli* cli, mstring_t* args); +void cli_config_set_ap_ssid(Cli* cli, mstring_t* args); +void cli_config_set_sta_pass(Cli* cli, mstring_t* args); +void cli_config_set_sta_ssid(Cli* cli, mstring_t* args); + +void cli_nvs_dump(Cli* cli, mstring_t* args); const CliItem cli_items[] = { { @@ -26,28 +38,28 @@ const CliItem cli_items[] = { .callback = cli_help, }, { - .name = "led", - .callback = cli_led, + .name = "config_get", + .callback = cli_config_get, }, { - .name = "help", - .callback = cli_help, + .name = "config_set_wifi_mode", + .callback = cli_config_set_wifi_mode, }, { - .name = "ping", - .callback = cli_ping, + .name = "config_set_ap_pass", + .callback = cli_config_set_ap_pass, }, { - .name = "gpio_set", - .callback = cli_gpio_set, + .name = "config_set_ap_ssid", + .callback = cli_config_set_ap_ssid, }, { - .name = "gpio_get", - .callback = cli_gpio_get, + .name = "config_set_sta_pass", + .callback = cli_config_set_sta_pass, }, { - .name = "wifi_scan", - .callback = cli_wifi_scan, + .name = "config_set_sta_ssid", + .callback = cli_config_set_sta_ssid, }, { .name = "device_info", @@ -57,6 +69,42 @@ const CliItem cli_items[] = { .name = "factory_reset", .callback = cli_factory_reset, }, + { + .name = "gpio_get", + .callback = cli_gpio_get, + }, + { + .name = "gpio_set", + .callback = cli_gpio_set, + }, + { + .name = "help", + .callback = cli_help, + }, + { + .name = "led", + .callback = cli_led, + }, + { + .name = "nvs_dump", + .callback = cli_nvs_dump, + }, + { + .name = "ping", + .callback = cli_ping, + }, + { + .name = "reset", + .callback = cli_sw_reset, + }, + { + .name = "wifi_ap_clients", + .callback = cli_wifi_ap_clients, + }, + { + .name = "wifi_scan", + .callback = cli_wifi_scan, + }, }; size_t cli_items_count = COUNT_OF(cli_items); @@ -71,9 +119,18 @@ void cli_help(Cli* cli, mstring_t* args) { } } +void cli_sw_reset(Cli* cli, mstring_t* args) { + cli_write_str(cli, "SW RESET"); + cli_write_eol(cli); + cli_flush(cli); + esp_restart(); + cli_write_str(cli, "OK"); +} + void cli_factory_reset(Cli* cli, mstring_t* args) { cli_write_str(cli, "Erasing NVS"); cli_write_eol(cli); + cli_flush(cli); nvs_erase(); cli_write_str(cli, "OK"); } @@ -85,6 +142,7 @@ void cli_ping(Cli* cli, mstring_t* args) { void cli_led_print_usage(Cli* cli) { cli_write_str(cli, "Usage: led "); } + void cli_led(Cli* cli, mstring_t* args) { int red; int green;