#include "nvs_flash.h" #include "nvs.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "sdkconfig.h" #include #include #include #include "esp_expected.hpp" #include "wifi_provisioner.hpp" #include "clock_core.hpp" extern "C" void app_main(void) { esp_err_t err = nvs_flash_init(); if (err == ESP_ERR_NVS_NO_FREE_PAGES || err == ESP_ERR_NVS_NEW_VERSION_FOUND) { // NVS partition was truncated and needs to be erased // Retry nvs_flash_init ESP_ERROR_CHECK(nvs_flash_erase()); err = nvs_flash_init(); } ESP_ERROR_CHECK(err); auto* provisioner = new WifiProvisioner("wifi_settings", [task_id = xTaskGetCurrentTaskHandle()](const auto& params) { printf("Settings successfully done."); xTaskNotify(task_id, 0, eNoAction); }); if (!provisioner->addParameter("SSID", "ssid", WifiProvisioner::Parameter::Type::STRING).has_value()) { printf("Error adding parameter."); return; } if (!provisioner->addParameter("Password", "password", WifiProvisioner::Parameter::Type::STRING).has_value()) { printf("Error adding parameter."); return; } // @todo: Remove later. provisioner->clearSettings(); if (!provisioner->parametersAreConfigured()) { auto result = provisioner->startProvisioning(); if (!result.has_value()) { ESP_ERROR_CHECK(result.error()); } printf("Provisioning started...\n"); const auto notification_received = xTaskNotifyWait(pdFALSE, ULONG_MAX, nullptr, portMAX_DELAY); if (notification_received == pdPASS) { printf("Notification happened."); } else { abortWithError("Main task notification timed out."); } } const auto password = unwrapOrAbort(provisioner->getParameter("password") .and_then([] (const auto& value) { return value.template getValue>(); })); const auto ssid = unwrapOrAbort(provisioner->getParameter("ssid") .and_then([] (const auto& value) { return value.template getValue>(); })); // Pack up the provisioner. delete provisioner; printf("We now have a wifi with SSID: %s, password: %s\n", ssid.c_str(), password.c_str()); clock_core::run(ssid.c_str(), password.c_str()); }