Add ESP32 GUI information to safeboot

This commit is contained in:
Theo Arends 2022-05-15 12:31:27 +02:00
parent 8c2658bb3f
commit 777309c327
1 changed files with 46 additions and 37 deletions

View File

@ -561,8 +561,10 @@ const WebServerDispatch_t WebServerDispatch[] PROGMEM = {
{ "dl", HTTP_ANY, HandleBackupConfiguration }, { "dl", HTTP_ANY, HandleBackupConfiguration },
{ "rs", HTTP_ANY, HandleRestoreConfiguration }, { "rs", HTTP_ANY, HandleRestoreConfiguration },
{ "rt", HTTP_ANY, HandleResetConfiguration }, { "rt", HTTP_ANY, HandleResetConfiguration },
{ "in", HTTP_ANY, HandleInformation },
#endif // Not FIRMWARE_MINIMAL #endif // Not FIRMWARE_MINIMAL
#ifndef FIRMWARE_MINIMAL_ONLY
{ "in", HTTP_ANY, HandleInformation },
#endif // Not FIRMWARE_MINIMAL_ONLY
}; };
void WebServer_on(const char * prefix, void (*func)(void), uint8_t method = HTTP_ANY) { void WebServer_on(const char * prefix, void (*func)(void), uint8_t method = HTTP_ANY) {
@ -1291,7 +1293,14 @@ void HandleRoot(void)
if (HTTP_ADMIN == Web.state) { if (HTTP_ADMIN == Web.state) {
#ifdef FIRMWARE_MINIMAL #ifdef FIRMWARE_MINIMAL
#ifdef ESP32
#ifndef FIRMWARE_MINIMAL_ONLY
WSContentSpaceButton(BUTTON_INFORMATION);
WSContentButton(BUTTON_FIRMWARE_UPGRADE);
#endif // FIRMWARE_MINIMAL_ONLY
#else // ESP8266
WSContentSpaceButton(BUTTON_FIRMWARE_UPGRADE); WSContentSpaceButton(BUTTON_FIRMWARE_UPGRADE);
#endif // ESP32
WSContentButton(BUTTON_CONSOLE); WSContentButton(BUTTON_CONSOLE);
#else #else
WSContentSpaceButton(BUTTON_CONFIGURATION); WSContentSpaceButton(BUTTON_CONFIGURATION);
@ -1836,25 +1845,6 @@ void ModuleSaveSettings(void) {
/*-------------------------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------------------------*/
const char kUnescapeCode[] = "&><\"\'\\";
const char kEscapeCode[] PROGMEM = "&amp;|&gt;|&lt;|&quot;|&apos;|&#92;";
String HtmlEscape(const String unescaped) {
char escaped[10];
size_t ulen = unescaped.length();
String result = "";
for (size_t i = 0; i < ulen; i++) {
char c = unescaped[i];
char *p = strchr(kUnescapeCode, c);
if (p != nullptr) {
result += GetTextIndexed(escaped, sizeof(escaped), p - kUnescapeCode, kEscapeCode);
} else {
result += c;
}
}
return result;
}
void HandleWifiConfiguration(void) { void HandleWifiConfiguration(void) {
char tmp[TOPSZ]; // Max length is currently 150 char tmp[TOPSZ]; // Max length is currently 150
@ -2330,8 +2320,31 @@ void HandleRestoreConfiguration(void)
Web.upload_file_type = UPL_SETTINGS; Web.upload_file_type = UPL_SETTINGS;
} }
#endif // Not FIRMWARE_MINIMAL
/*-------------------------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------------------------*/
#ifndef FIRMWARE_MINIMAL_ONLY
const char kUnescapeCode[] = "&><\"\'\\";
const char kEscapeCode[] PROGMEM = "&amp;|&gt;|&lt;|&quot;|&apos;|&#92;";
String HtmlEscape(const String unescaped) {
char escaped[10];
size_t ulen = unescaped.length();
String result = "";
for (size_t i = 0; i < ulen; i++) {
char c = unescaped[i];
char *p = strchr(kUnescapeCode, c);
if (p != nullptr) {
result += GetTextIndexed(escaped, sizeof(escaped), p - kUnescapeCode, kEscapeCode);
} else {
result += c;
}
}
return result;
}
void HandleInformation(void) void HandleInformation(void)
{ {
if (!HttpCheckPriviledgedAccess()) { return; } if (!HttpCheckPriviledgedAccess()) { return; }
@ -2469,35 +2482,31 @@ void HandleInformation(void)
WSContentSend_P(PSTR("}1" D_PSR_FREE_MEMORY "}2%d kB"), ESP.getFreePsram() / 1024); WSContentSend_P(PSTR("}1" D_PSR_FREE_MEMORY "}2%d kB"), ESP.getFreePsram() / 1024);
} }
WSContentSend_P(PSTR("}1}2&nbsp;")); // Empty line WSContentSend_P(PSTR("}1}2&nbsp;")); // Empty line
uint32_t cur_part = ESP_PARTITION_SUBTYPE_APP_FACTORY; // 0
const esp_partition_t *running_ota = esp_ota_get_running_partition();
if (running_ota) { cur_part = running_ota->subtype; } // 16 - 32
esp_partition_iterator_t it = esp_partition_find(ESP_PARTITION_TYPE_ANY, ESP_PARTITION_SUBTYPE_ANY, NULL); esp_partition_iterator_t it = esp_partition_find(ESP_PARTITION_TYPE_ANY, ESP_PARTITION_SUBTYPE_ANY, NULL);
for (; it != NULL; it = esp_partition_next(it)) { for (; it != NULL; it = esp_partition_next(it)) {
const esp_partition_t *part = esp_partition_get(it); const esp_partition_t *part = esp_partition_get(it);
AddLog(LOG_LEVEL_DEBUG, PSTR("PRT: Type %d, Subtype %d, Name %s, Size %d"), part->type, part->subtype, part->label, part->size); // AddLog(LOG_LEVEL_DEBUG, PSTR("PRT: Type %d, Subtype %d, Name %s, Size %d"), part->type, part->subtype, part->label, part->size);
uint32_t part_size = part->size / 1024; uint32_t part_size = part->size / 1024;
if (ESP_PARTITION_TYPE_APP == part->type) { if (ESP_PARTITION_TYPE_APP == part->type) {
uint32_t cur_part = ESP_PARTITION_SUBTYPE_APP_FACTORY;
const esp_partition_t *running_ota = esp_ota_get_running_partition();
if (running_ota) {
cur_part = running_ota->subtype;
}
uint32_t prog_size = 0; // No active ota partition uint32_t prog_size = 0; // No active ota partition
if (part->subtype == ESP_PARTITION_SUBTYPE_APP_FACTORY) { if (part->subtype == ESP_PARTITION_SUBTYPE_APP_FACTORY) {
prog_size = EspProgramSize(part->label); // safeboot partition prog_size = EspProgramSize(part->label); // safeboot partition
} }
else if ((part->subtype >= ESP_PARTITION_SUBTYPE_APP_OTA_MIN) && (part->subtype <= ESP_PARTITION_SUBTYPE_APP_OTA_MAX)) { else if ((part->subtype >= ESP_PARTITION_SUBTYPE_APP_OTA_MIN) && (part->subtype <= ESP_PARTITION_SUBTYPE_APP_OTA_MAX)) {
if (running_ota->subtype == part->subtype) { if (cur_part == part->subtype) {
prog_size = ESP_getSketchSize(); // Active running ota partition prog_size = ESP_getSketchSize(); // Active running ota partition
} }
else if (cur_part == ESP_PARTITION_SUBTYPE_APP_FACTORY) {
prog_size = EspProgramSize(part->label); // Only app partition when safeboot partitions
}
} }
char running[2] = { 0 }; char running[2] = { 0 };
if (part->subtype == cur_part) { if (part->subtype == cur_part) { running[0] = '*'; }
running[0] = '*';
}
uint32_t part_used = ((prog_size / 1024) * 100) / part_size; uint32_t part_used = ((prog_size / 1024) * 100) / part_size;
WSContentSend_PD(PSTR("}1" D_PARTITION " %s%s}2%d kB (" D_USED " %d%%)"), part->label, running, part_size, part_used); WSContentSend_PD(PSTR("}1" D_PARTITION " %s%s}2%d kB (" D_USED " %d%%)"), part->label, running, part_size, part_used);
} }
@ -2520,7 +2529,7 @@ void HandleInformation(void)
WSContentSpaceButton(BUTTON_MAIN); WSContentSpaceButton(BUTTON_MAIN);
WSContentStop(); WSContentStop();
} }
#endif // Not FIRMWARE_MINIMAL #endif // Not FIRMWARE_MINIMAL_ONLY
/*-------------------------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------------------------*/