// // Created by erki on 07/01/24. // #pragma once #include "nvs_handle.hpp" #include #include #include #include #include #include #include struct CJsonStringDeleter { void operator()(char* json_str) const { if (json_str) cJSON_free(json_str); } }; using CJsonStrPtr = std::unique_ptr; struct CJsonDeleter { void operator()(cJSON* element) const { if (element) cJSON_Delete(element); } }; using CJsonPtr = std::unique_ptr; class WifiProvisioner { public: struct Parameter { etl::string<100> name; etl::string<15> nvs_name; enum class Type { INT, FLOAT, STRING }; Type type; using Value = std::variant>; Value data; Parameter() = default; Parameter(const char* name, const char* nvs_name, const Parameter::Type type) : name(name) , nvs_name(nvs_name) , type(type) { } std::expected getValue(nvs::NVSHandle* file_handle) const; }; explicit WifiProvisioner(const char* settings_namespace); WifiProvisioner() = delete; WifiProvisioner(const WifiProvisioner&) = delete; WifiProvisioner(WifiProvisioner&&) = delete; WifiProvisioner& operator=(const WifiProvisioner&) = delete; WifiProvisioner& operator=(WifiProvisioner&&) = delete; bool parametersAreConfigured(); std::expected startProvisioning(); std::expected addParameter(const char* name, const char* nvs_name, const Parameter::Type type); CJsonPtr getParameterObjects() const; private: std::unique_ptr file_handle_; bool settings_initialized_ = false; httpd_handle_t http_server_ = nullptr; etl::vector params_; esp_err_t initializeNvsNamespace_(); std::expected initializeWifiAp_(); std::expected initializeCaptivePortal_(); };