enter recovery mode
This commit is contained in:
parent
ee924b8b30
commit
c4d2db98d5
|
@ -3,10 +3,11 @@ ESPMegaRecovery::ESPMegaRecovery()
|
||||||
{
|
{
|
||||||
// Initialize all the pointers to null
|
// Initialize all the pointers to null
|
||||||
this->fram = nullptr;
|
this->fram = nullptr;
|
||||||
this->web_server = nullptr;
|
|
||||||
this->fram_address = 0;
|
this->fram_address = 0;
|
||||||
this->bootloop_counter = 0;
|
this->bootloop_counter = 0;
|
||||||
this->recovery_mode = false;
|
this->recovery_mode = false;
|
||||||
|
this->web_server = nullptr;
|
||||||
|
this->iot = nullptr;
|
||||||
}
|
}
|
||||||
void ESPMegaRecovery::begin() {
|
void ESPMegaRecovery::begin() {
|
||||||
// Retrieve the bootloop counter from the FRAM
|
// Retrieve the bootloop counter from the FRAM
|
||||||
|
@ -18,13 +19,15 @@ void ESPMegaRecovery::begin() {
|
||||||
ESP_LOGV("ESPMegaRecovery", "Bootloop counter: %d", this->getBootloopCounter());
|
ESP_LOGV("ESPMegaRecovery", "Bootloop counter: %d", this->getBootloopCounter());
|
||||||
// If the bootloop counter is greater than 5, enter recovery mode
|
// If the bootloop counter is greater than 5, enter recovery mode
|
||||||
if(this->getBootloopCounter() > 5) {
|
if(this->getBootloopCounter() > 5) {
|
||||||
ESP_LOGW("ESPMegaRecovery", "Entering recovery mode");
|
ESP_LOGE("ESPMegaRecovery", "Bootloop detected");
|
||||||
this->enterRecoveryMode();
|
|
||||||
// Reset the bootloop counter to prevent re-entering recovery mode
|
// Reset the bootloop counter to prevent re-entering recovery mode
|
||||||
// The device might unintentionally restart multiple times
|
// The device might unintentionally restart multiple times
|
||||||
// By resetting the counter, the user can press reset once in recovery mode to exit
|
// By resetting the counter, the user can press reset once in recovery mode to exit
|
||||||
ESP_LOGD("ESPMegaRecovery", "Resetting bootloop counter");
|
ESP_LOGD("ESPMegaRecovery", "Resetting bootloop counter");
|
||||||
this->resetBootloopCounter();
|
this->resetBootloopCounter();
|
||||||
|
ESP_LOGW("ESPMegaRecovery", "Entering recovery mode");
|
||||||
|
this->enterRecoveryMode();
|
||||||
|
this->loop();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void ESPMegaRecovery::loop() {
|
void ESPMegaRecovery::loop() {
|
||||||
|
@ -32,9 +35,10 @@ void ESPMegaRecovery::loop() {
|
||||||
if(this->isRecoveryMode()) {
|
if(this->isRecoveryMode()) {
|
||||||
int i = 0;
|
int i = 0;
|
||||||
while(true) {
|
while(true) {
|
||||||
if (i%10 == 0)
|
if (i%10 == 0) {
|
||||||
ESP_LOGV("ESPMegaRecovery", "System is in recovery mode, no tasks will be executed");
|
ESP_LOGV("ESPMegaRecovery", "System is in recovery mode, no tasks will be executed");
|
||||||
ESP_LOGV("ESPMegaRecovery", "Please upload a new firmware to exit recovery mode");
|
ESP_LOGV("ESPMegaRecovery", "Please upload a new firmware to exit recovery mode");
|
||||||
|
}
|
||||||
// This code will become the new loop
|
// This code will become the new loop
|
||||||
delay(1000);
|
delay(1000);
|
||||||
i++;
|
i++;
|
||||||
|
@ -54,10 +58,25 @@ void ESPMegaRecovery::loop() {
|
||||||
void ESPMegaRecovery::enterRecoveryMode() {
|
void ESPMegaRecovery::enterRecoveryMode() {
|
||||||
// Set the recovery mode flag
|
// Set the recovery mode flag
|
||||||
this->recovery_mode = true;
|
this->recovery_mode = true;
|
||||||
// Remove web server binding
|
// Enabling the IoT module
|
||||||
|
ESP_LOGI("ESPMegaRecovery", "Enabling the IoT module");
|
||||||
|
this->iot = new ESPMegaIoT();
|
||||||
|
this->iot->bindFRAM(this->fram);
|
||||||
|
ETH.begin();
|
||||||
|
this->iot->bindEthernetInterface(Ð);
|
||||||
|
ESP_LOGI("ESPMegaRecovery", "Loading network configuration");
|
||||||
|
this->iot->loadNetworkConfig();
|
||||||
|
ESP_LOGI("ESPMegaRecovery", "Attempting to connect to the network");
|
||||||
|
this->iot->connectNetwork();
|
||||||
|
// Start the web server
|
||||||
|
ESP_LOGI("ESPMegaRecovery", "Starting the web server");
|
||||||
|
this->web_server = new ESPMegaWebServer(80, this->iot);
|
||||||
|
this->web_server->bindFRAM(this->fram);
|
||||||
|
this->web_server->loadCredentialsFromFRAM();
|
||||||
|
ESP_LOGI("ESPMegaRecovery", "Aquiring the web server instance");
|
||||||
AsyncWebServer *server = this->web_server->getServer();
|
AsyncWebServer *server = this->web_server->getServer();
|
||||||
server->reset();
|
|
||||||
// Add OTA update and restart endpoint
|
// Add OTA update and restart endpoint
|
||||||
|
ESP_LOGI("ESPMegaRecovery", "Adding OTA update and reboot endpoints");
|
||||||
auto bindedOtaRequestHandler = std::bind(&ESPMegaWebServer::otaRequestHandler, this->web_server, std::placeholders::_1);
|
auto bindedOtaRequestHandler = std::bind(&ESPMegaWebServer::otaRequestHandler, this->web_server, std::placeholders::_1);
|
||||||
auto bindedOtaUploadHandler = std::bind(&ESPMegaWebServer::otaUploadHandler, this->web_server, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4, std::placeholders::_5, std::placeholders::_6);
|
auto bindedOtaUploadHandler = std::bind(&ESPMegaWebServer::otaUploadHandler, this->web_server, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4, std::placeholders::_5, std::placeholders::_6);
|
||||||
server->on("/ota_update", HTTP_POST, bindedOtaRequestHandler, bindedOtaUploadHandler);
|
server->on("/ota_update", HTTP_POST, bindedOtaRequestHandler, bindedOtaUploadHandler);
|
||||||
|
|
|
@ -29,6 +29,7 @@ private:
|
||||||
FRAM* fram;
|
FRAM* fram;
|
||||||
uint32_t fram_address;
|
uint32_t fram_address;
|
||||||
uint8_t bootloop_counter;
|
uint8_t bootloop_counter;
|
||||||
|
ESPMegaIoT* iot;
|
||||||
ESPMegaWebServer* web_server;
|
ESPMegaWebServer* web_server;
|
||||||
bool recovery_mode;
|
bool recovery_mode;
|
||||||
};
|
};
|
Loading…
Reference in New Issue