diff --git a/ESPMegaPRO-firmware/lib/ESPMegaPRO/ESPMegaPRO_OOP.cpp b/ESPMegaPRO-firmware/lib/ESPMegaPRO/ESPMegaPRO_OOP.cpp index 7930d98..2c306de 100644 --- a/ESPMegaPRO-firmware/lib/ESPMegaPRO/ESPMegaPRO_OOP.cpp +++ b/ESPMegaPRO-firmware/lib/ESPMegaPRO/ESPMegaPRO_OOP.cpp @@ -256,6 +256,7 @@ void ESPMegaPRO::enableWebServer(uint16_t port) { return; } webServer = new ESPMegaWebServer(port, this->iot); + webServer->bindFRAM(&fram); webServer->begin(); webServerEnabled = true; } \ No newline at end of file diff --git a/ESPMegaPRO-firmware/lib/ESPMegaPRO/ESPMegaWebServer.cpp b/ESPMegaPRO-firmware/lib/ESPMegaPRO/ESPMegaWebServer.cpp index 5306a63..b438ad2 100644 --- a/ESPMegaPRO-firmware/lib/ESPMegaPRO/ESPMegaWebServer.cpp +++ b/ESPMegaPRO-firmware/lib/ESPMegaPRO/ESPMegaWebServer.cpp @@ -14,6 +14,7 @@ ESPMegaWebServer::~ESPMegaWebServer() void ESPMegaWebServer::begin() { + this->loadCredentialsFromFRAM(); this->server->begin(); auto bindedDashboardHandler = std::bind(&ESPMegaWebServer::dashboardHandler, this, std::placeholders::_1); this->server->on("/", HTTP_GET, bindedDashboardHandler); @@ -26,6 +27,83 @@ void ESPMegaWebServer::loop() // AsyncWebServer doesn't have a loop function } +void ESPMegaWebServer::bindFRAM(FRAM *fram) +{ + this->fram = fram; +} + +void ESPMegaWebServer::loadCredentialsFromFRAM() +{ + this->fram->read(301, (uint8_t*)this->webUsername, 32); + this->fram->read(333, (uint8_t*)this->webPassword, 32); + // Verify if credentials are valid + // A valid username and password is null terminated + // Scan for null terminator + bool validUsername = false; + bool validPassword = false; + for (int i = 0; i < 32; i++) + { + if (this->webUsername[i] == '\0') + { + validUsername = true; + break; + } + } + for (int i = 0; i < 32; i++) + { + if (this->webPassword[i] == '\0') + { + validPassword = true; + break; + } + } + if (!validUsername || !validPassword) + { + this->resetCredentials(); + return; + } + // A valid username and password is at least 1 character long + if(strlen(this->webUsername) == 0 || strlen(this->webPassword) == 0) + { + this->resetCredentials(); + return; + } +} + +void ESPMegaWebServer::saveCredentialsToFRAM() +{ + this->fram->write(301, (uint8_t*)this->webUsername, 32); + this->fram->write(333, (uint8_t*)this->webPassword, 32); +} + +void ESPMegaWebServer::resetCredentials() +{ + // The default username and password is "admin" + strcpy(this->webUsername, "admin"); + strcpy(this->webPassword, "admin"); + this->saveCredentialsToFRAM(); +} + +char* ESPMegaWebServer::getWebUsername() +{ + return this->webUsername; +} + +char* ESPMegaWebServer::getWebPassword() +{ + return this->webPassword; +} + +void ESPMegaWebServer::setWebUsername(const char* username) +{ + strcpy(this->webUsername, username); +} + +void ESPMegaWebServer::setWebPassword(const char* password) +{ + strcpy(this->webPassword, password); +} + void ESPMegaWebServer::dashboardHandler(AsyncWebServerRequest *request) { auto bindedDashboardProcessor = std::bind(&ESPMegaWebServer::dashboardProcessor, this, std::placeholders::_1); @@ -123,5 +201,20 @@ String ESPMegaWebServer::configProcessor(const String &var) { return String(mqttConfig->base_topic); } + else if (var == "web_username") + { + return String(this->webUsername); + } + else if (var == "web_password") + { + return String(this->webPassword); + } return ""; -} \ No newline at end of file +} + +void ESPMegaWebServer::otaHandler(AsyncWebServerRequest *request) +{ + // Prepare to receive firmware + +} + diff --git a/ESPMegaPRO-firmware/lib/ESPMegaPRO/ESPMegaWebServer.hpp b/ESPMegaPRO-firmware/lib/ESPMegaPRO/ESPMegaWebServer.hpp index 1dbaa27..d5873b6 100644 --- a/ESPMegaPRO-firmware/lib/ESPMegaPRO/ESPMegaWebServer.hpp +++ b/ESPMegaPRO-firmware/lib/ESPMegaPRO/ESPMegaWebServer.hpp @@ -3,8 +3,15 @@ #include #include #include +#include #include + +/** + * @brief Provides a web server for ESPMegaPRO + * + * This class use FRAM address 301-400 + */ class ESPMegaWebServer { public: @@ -12,7 +19,20 @@ class ESPMegaWebServer ~ESPMegaWebServer(); void begin(); void loop(); + void resetCredentials(); + char* getWebUsername(); + char* getWebPassword(); + void setWebUsername(const char* username); + void setWebPassword(const char* password); + void bindFRAM(FRAM *fram); + void loadCredentialsFromFRAM(); + void saveCredentialsToFRAM(); private: + // FRAM + FRAM *fram; + // Credentials + char webUsername[32]; + char webPassword[32]; // Web Server AsyncWebServer *server; uint16_t port; diff --git a/ESPMegaPRO-firmware/src/main.cpp b/ESPMegaPRO-firmware/src/main.cpp index c141733..8bb9f87 100644 --- a/ESPMegaPRO-firmware/src/main.cpp +++ b/ESPMegaPRO-firmware/src/main.cpp @@ -128,7 +128,7 @@ void setup() ESP_LOGI("Initializer", "Installing climate card"); espmega.installCard(2, &climateCard); ESP_LOGI("Initializer", "Binding climate card to FRAM"); - climateCard.bindFRAM(&espmega.fram, 301); + climateCard.bindFRAM(&espmega.fram, 1001); ESP_LOGI("Initializer", "Loading climate card state from FRAM"); climateCard.loadStateFromFRAM(); ESP_LOGI("Initializer", "Enabling climate card FRAM autosave"); @@ -145,6 +145,9 @@ void setup() #ifdef WEB_SERVER_ENABLE ESP_LOGI("Initializer", "Enabling web server"); espmega.enableWebServer(80); + espmega.webServer->setWebUsername("admin"); + espmega.webServer->setWebPassword("Passw0rd"); + espmega.webServer->saveCredentialsToFRAM(); #endif }