diff --git a/src/Sys/SysModPrint.cpp b/src/Sys/SysModPrint.cpp index b6f7e1f..b7fa4bd 100644 --- a/src/Sys/SysModPrint.cpp +++ b/src/Sys/SysModPrint.cpp @@ -18,38 +18,6 @@ #include "SysModules.h" SysModPrint::SysModPrint() :SysModule("Print") { - -#if ARDUINO_USB_CDC_ON_BOOT || !defined(CONFIG_IDF_TARGET_ESP32S2) - Serial.begin(115200); -#else - Serial.begin(115200, SERIAL_8N1, RX, TX); // workaround for Lolin S2 mini - this board uses non-standard pins for RX and TX -#endif - delay(500); - // un-comment the next lines for redirecting kernel error messages to Serial - #if CORE_DEBUG_LEVEL - #if ARDUINO_USB_CDC_ON_BOOT - Serial0.setDebugOutput(false); - #endif - Serial.setDebugOutput(true); - #endif - - // softhack007: USB CDC needs a bit more time to initialize -#if ARDUINO_USB_CDC_ON_BOOT || ARDUINO_USB_MODE - unsigned waitCounter = 0; - do { - delay(1000); - waitCounter ++; - } while ((!Serial) && (waitCounter < 8)); // wait until Serial is ready / connected - delay(3000); // this extra delay avoids repeating disconnects on -s2 "Disconnected (ClearCommError failed" - Serial.println(" **** COMMODORE BASIC V2 **** "); -#endif - if (!sys->sysTools_normal_startup() && Serial) { // only print if Serial is connected, and startup was not normal - Serial.print("\nWARNING - possible crash: "); - Serial.println(sys->sysTools_getRestartReason()); - Serial.println(""); - } - Serial.println("Ready.\n"); - if (Serial) Serial.flush(); // drain output buffer }; void SysModPrint::setup() { diff --git a/src/Sys/SysModSystem.cpp b/src/Sys/SysModSystem.cpp index 6ee7d13..40457d0 100644 --- a/src/Sys/SysModSystem.cpp +++ b/src/Sys/SysModSystem.cpp @@ -12,7 +12,7 @@ #include "SysModSystem.h" #include "SysModPrint.h" #include "SysModUI.h" -#include "SysModWeb.h" +// #include "SysModWeb.h" #include "SysModModel.h" #include "User/UserModMDNS.h" @@ -38,8 +38,6 @@ SysModSystem::SysModSystem() :SysModule("System") {}; void SysModSystem::setup() { SysModule::setup(); - ppf("Stack %d of %d B (async %d B) %d\n", sysTools_get_arduino_maxStackUsage(), getArduinoLoopTaskStackSize(), sysTools_get_webserver_maxStackUsage(), uxTaskGetStackHighWaterMark(xTaskGetCurrentTaskHandle())); - const Variable parentVar = ui->initSysMod(Variable(), name, 2000); parentVar.var["s"] = true; //setup @@ -57,16 +55,6 @@ void SysModSystem::setup() { default: return false; }}); - ui->initText(parentVar, "uptime", nullptr, 16, true, [](EventArguments) { switch (eventType) { - case onUI: - variable.setComment("s. Uptime of board"); - return true; - case onLoop1s: - variable.setValue(millis()/1000); - return true; - default: return false; - }}); - ui->initNumber(parentVar, "now", UINT16_MAX, 0, (unsigned long)-1, true, [this](EventArguments) { switch (eventType) { case onUI: variable.setComment("s"); @@ -87,21 +75,6 @@ void SysModSystem::setup() { default: return false; }}); - ui->initButton(parentVar, "reboot", false, [](EventArguments) { switch (eventType) { - case onChange: - // web->ws.closeAll(1012); - - // mdls->reboot(); //not working yet - // long dly = millis(); - // while (millis() - dly < 450) { - // yield(); // enough time to send response to client - // } - // FASTLED.clear(); - ESP.restart(); - return true; - default: return false; - }}); - ui->initText(parentVar, "loops", nullptr, 16, true, [this](EventArguments) { switch (eventType) { case onUI: variable.setComment("Loops per second"); @@ -113,35 +86,6 @@ void SysModSystem::setup() { default: return false; }}); - print->fFormat(chipInfo, sizeof(chipInfo), "%s %s (%d.%d.%d) c#:%d %d MHz f:%d KB %d MHz %d", ESP.getChipModel(), ESP.getSdkVersion(), ESP_ARDUINO_VERSION_MAJOR, ESP_ARDUINO_VERSION_MINOR, ESP_ARDUINO_VERSION_PATCH, ESP.getChipCores(), ESP.getCpuFreqMHz(), ESP.getFlashChipSize()/1024, ESP.getFlashChipSpeed()/1000000, ESP.getFlashChipMode()); - ui->initText(parentVar, "chip", chipInfo, sizeof(chipInfo), true); - - ui->initProgress(parentVar, "heap", 0, 0, ESP.getHeapSize()/1000, true, [](EventArguments) { switch (eventType) { - case onChange: - variable.var["max"] = ESP.getHeapSize()/1000; //makes sense? - web->addResponse(variable.var, "comment", "f:%d / t:%d (l:%d) B [%d %d]", ESP.getFreeHeap(), ESP.getHeapSize(), ESP.getMaxAllocHeap(), esp_get_free_heap_size(), esp_get_free_internal_heap_size()); - //temporary add esp_get_free_heap_size(), esp_get_free_internal_heap_size() to see if/how it differs - //esp_get_free_heap_size can be bigger in case of heap - return true; - case onLoop1s: - variable.setValue((ESP.getHeapSize()-ESP.getFreeHeap()) / 1000); - return true; - default: return false; - }}); - - if (psramFound()) { - ui->initProgress(parentVar, "psram", 0, 0, ESP.getPsramSize()/1000, true, [](EventArguments) { switch (eventType) { - case onChange: - variable.var["max"] = ESP.getPsramSize()/1000; //makes sense? - web->addResponse(variable.var, "comment", "%d / %d (%d) B", ESP.getFreePsram(), ESP.getPsramSize(), ESP.getMinFreePsram()); - return true; - case onLoop1s: - variable.setValue((ESP.getPsramSize()-ESP.getFreePsram()) / 1000); - return true; - default: return false; - }}); - } - ui->initProgress(parentVar, "mainStack", 0, 0, getArduinoLoopTaskStackSize(), true, [this](EventArguments) { switch (eventType) { case onChange: variable.var["max"] = getArduinoLoopTaskStackSize(); //makes sense? @@ -153,77 +97,8 @@ void SysModSystem::setup() { default: return false; }}); - ui->initSelect(parentVar, "reset 0", (int)rtc_get_reset_reason(0), true, [this](EventArguments) { switch (eventType) { - case onUI: - variable.setComment("Reason Core 0"); - addResetReasonsSelect(variable.setOptions()); - return true; - default: return false; - }}); - - if (ESP.getChipCores() > 1) - ui->initSelect(parentVar, "reset 1", (int)rtc_get_reset_reason(1), true, [this](EventArguments) { switch (eventType) { - case onUI: - variable.setComment("Reason Core 1"); - addResetReasonsSelect(variable.setOptions()); - return true; - default: return false; - }}); - - ui->initSelect(parentVar, "restart", (int)esp_reset_reason(), true, [this](EventArguments) { switch (eventType) { - case onUI: - variable.setComment("Restart reason"); - addRestartReasonsSelect(variable.setOptions()); - return true; - default: return false; - }}); - ui->initCheckBox(parentVar, "safeMode", &safeMode); - //calculate version in format YYMMDDHH - //https://forum.arduino.cc/t/can-you-format-__date__/200818/10 - // int month, day, year, hour, minute, second; - // const char month_names[] = "JanFebMarAprMayJunJulAugSepOctNovDec"; - // sscanf(__DATE__, "%s %d %d", version, &day, &year); // Mon dd yyyy - // month = (strnstr(month_names, version, 32)-month_names)/3+1; - // sscanf(__TIME__, "%d:%d:%d", &hour, &minute, &second); //hh:mm:ss - // print->fFormat(version, sizeof(version), "%02d%02d%02d%02d", year-2000, month, day, hour); - - // ppf("version %s %s %s %d:%d:%d\n", version, __DATE__, __TIME__, hour, minute, second); - - strlcat(build, _INIT(TOSTRING(APP)), sizeof(build)); - strlcat(build, "_", sizeof(build)); - strlcat(build, _INIT(TOSTRING(VERSION)), sizeof(build)); - strlcat(build, "_", sizeof(build)); - strlcat(build, _INIT(TOSTRING(PIOENV)), sizeof(build)); - - ui->initText(parentVar, "build", build, sizeof(build), true); - // ui->initText(parentVar, "date", __DATE__, 16, true); - // ui->initText(parentVar, "time", __TIME__, 16, true); - - ui->initFileUpload(parentVar, "update", nullptr, UINT16_MAX, false, [](EventArguments) { switch (eventType) { - case onUI: - variable.setComment("OTA Firmware Update"); - return true; - default: return false; - }}); - - // char msgbuf[32]; - // snprintf(msgbuf, sizeof(msgbuf)-1, "%s rev.%d", ESP.getChipModel(), ESP.getChipRevision()); - // ui->initText(parentVar, "e32model")] = msgbuf; - // ui->initText(parentVar, "e32cores")] = ESP.getChipCores(); - // ui->initText(parentVar, "e32speed")] = ESP.getCpuFreqMHz(); - // ui->initText(parentVar, "e32flash")] = int((ESP.getFlashChipSize()/1024)/1024); - // ui->initText(parentVar, "e32flashspeed")] = int(ESP.getFlashChipSpeed()/1000000); - // ui->initText(parentVar, "e32flashmode")] = int(ESP.getFlashChipMode()); - // switch (ESP.getFlashChipMode()) { - // // missing: Octal modes - // case FM_QIO: ui->initText(parentVar, "e32flashtext")] = F(" (QIO)"); break; - // case FM_QOUT: ui->initText(parentVar, "e32flashtext")] = F(" (QOUT)");break; - // case FM_DIO: ui->initText(parentVar, "e32flashtext")] = F(" (DIO)"); break; - // case FM_DOUT: ui->initText(parentVar, "e32flashtext")] = F(" (DOUT or other)");break; - // default: ui->initText(parentVar, "e32flashtext")] = F(" (other)"); break; - // } } void SysModSystem::loop() { @@ -239,88 +114,7 @@ void SysModSystem::loop10s() { ppf("❤️"); } -//replace code by sentence as soon it occurs, so we know what will happen and what not -void SysModSystem::addResetReasonsSelect(JsonArray options) { - options.add(String("NO_MEAN (0)")); // 0, - options.add(sysTools_reset2String( 1)); //POWERON_RESET"); // 1, /**<1, */ - options.add(sysTools_reset2String( 2)); // 2, /**<3, Software reset digital core*/ - options.add(sysTools_reset2String( 3)); // 3, /**<3, Software reset digital core*/ - options.add(sysTools_reset2String( 4)); // 4, /**<4, Legacy watch dog reset digital core*/ - options.add(sysTools_reset2String( 5)); // 5, /**<3, Deep Sleep reset digital core*/ - options.add(sysTools_reset2String( 6)); // 6, /**<6, Reset by SLC module, reset digital core*/ - options.add(sysTools_reset2String( 7)); // 7, /**<7, Timer Group0 Watch dog reset digital core*/ - options.add(sysTools_reset2String( 8)); // 8, /**<8, Timer Group1 Watch dog reset digital core*/ - options.add(sysTools_reset2String( 9)); // 9, /**<9, RTC Watch dog Reset digital core*/ - options.add(sysTools_reset2String(10)); //10, /**<10, Instrusion tested to reset CPU*/ - options.add(sysTools_reset2String(11)); //11, /**<11, Time Group reset CPU*/ - options.add(sysTools_reset2String(12)); //SW_CPU_RESET"); //12, /**<12, */ - options.add(sysTools_reset2String(13)); //13, /**<13, RTC Watch dog Reset CPU*/ - options.add(sysTools_reset2String(14)); //EXT_CPU_RESET"); //14, /**<14, */ - options.add(sysTools_reset2String(15)); //15, /**<15, Reset when the vdd voltage is not stable*/ - options.add(sysTools_reset2String(16)); //16 /**<16, RTC Watch dog reset digital core and rtc module*/ - // codes below are only used on -S3/-S2/-C3 - options.add(sysTools_reset2String(17)); //17 /* Time Group1 reset CPU */ - options.add(sysTools_reset2String(18)); //18 /* super watchdog reset digital core and rtc module */ - options.add(sysTools_reset2String(19)); //19 /* glitch reset digital core and rtc module */ - options.add(sysTools_reset2String(20)); //20 /* efuse reset digital core */ - options.add(sysTools_reset2String(21)); //21 /* usb uart reset digital core */ - options.add(sysTools_reset2String(22)); //22 /* usb jtag reset digital core */ - options.add(sysTools_reset2String(23)); //23 /* power glitch reset digital core and rtc module */ -} - -//replace code by sentence as soon it occurs, so we know what will happen and what not -void SysModSystem::addRestartReasonsSelect(JsonArray options) { - options.add(String("(0) ESP_RST_UNKNOWN"));// //!< Reset reason can not be determined - options.add(sysTools_restart2String( 1)); // ESP_RST_POWERON");// //!< - options.add(sysTools_restart2String( 2)); // !< Reset by external pin (not applicable for ESP32) - options.add(sysTools_restart2String( 3)); // ESP_RST_SW");// //!< Software reset via esp_restart - options.add(sysTools_restart2String( 4)); //ESP_RST_PANIC");// //!< - options.add(sysTools_restart2String( 5)); // //!< Reset (software or hardware) due to interrupt watchdog - options.add(sysTools_restart2String( 6)); // //!< Reset due to task watchdog - options.add(sysTools_restart2String( 7)); // //!< Reset due to other watchdogs - options.add(sysTools_restart2String( 8)); ////!< Reset after exiting deep sleep mode - options.add(sysTools_restart2String( 9)); // //!< Brownout reset (software or hardware) - options.add(sysTools_restart2String(10)); // //!< Reset over SDIO -} - //from esptools.h - public - -// check if estart was "normal" -bool SysModSystem::sysTools_normal_startup() { - esp_reset_reason_t restartCode = getRestartReason(); - if ((restartCode == ESP_RST_POWERON) || (restartCode == ESP_RST_SW)) return true; // poweron or esp_restart() - return false; -} - -// RESTART reason as long string -String SysModSystem::sysTools_getRestartReason() { - esp_reset_reason_t restartCode = getRestartReason(); - String reasonText = restartCode2InfoLong(restartCode); - String longText = String("(code ") + String((int)restartCode) + String( ") ") + reasonText; - - int core0code = getCoreResetReason(0); - int core1code = getCoreResetReason(1); - longText = longText + ". Core#0 (code " + String(core0code) + ") " + resetCode2Info(core0code); - if (core1code > 0) - longText = longText + "; Core#1 (code " + String(core1code) + ") " + resetCode2Info(core1code); - - longText = longText + "."; - return longText; -} - -// helper for SysModSystem::addRestartReasonsSelect. Returns "(#) ReasonText" -String SysModSystem::sysTools_restart2String(int reasoncode) { - esp_reset_reason_t restartCode = esp_reset_reason_t(reasoncode); // its a trick, not a sony ;-) - String longText = String("(") + String(reasoncode) + String( ") ") + restartCode2Info(restartCode); - return longText; -} - -// helper for SysModSystem::addResetReasonsSelect. Returns "CoreResetReasonText (#)" -String SysModSystem::sysTools_reset2String(int resetCode) { - String longText = resetCode2Info(resetCode) + String(" (") + String(resetCode) + String(")"); - return longText; -} - int SysModSystem::sysTools_get_arduino_maxStackUsage(void) { char * loop_taskname = pcTaskGetTaskName(loop_taskHandle); // ask for name of the known task (to make sure we are still looking at the right one) @@ -330,116 +124,4 @@ int SysModSystem::sysTools_get_arduino_maxStackUsage(void) { if (loop_taskHandle != nullptr) return uxTaskGetStackHighWaterMark(loop_taskHandle); // got it !! else return -1; -} - -int SysModSystem::sysTools_get_webserver_maxStackUsage(void) { - char * tcp_taskname = pcTaskGetTaskName(tcp_taskHandle); // ask for name of the known task (to make sure we are still looking at the right one) - - if ((tcp_taskHandle == nullptr) || (tcp_taskname == nullptr) || (strncmp(tcp_taskname, "async_tcp", 10) != 0)) { - tcp_taskHandle = xTaskGetHandle("async_tcp"); // need to look for the task by name. FreeRTOS docs say this is very slow, so we store the result for next time - } - - if (tcp_taskHandle != nullptr) return uxTaskGetStackHighWaterMark(tcp_taskHandle); // got it !! - else return -1; -} - - -//from esptools.h - private - -// helper fuctions -int SysModSystem::getCoreResetReason(int core) { - if (core >= ESP.getChipCores()) return 0; - return((int)rtc_get_reset_reason(core)); -} - -String SysModSystem::resetCode2Info(int reason) { - switch(reason) { - - case 1 : // 1 = Vbat power on reset - return "power-on"; break; - case 2 : // 2 = this code is not defined on ESP32 - return "exception"; break; - case 3 : // 3 = Software reset digital core - return "SW reset"; break; - case 12: //12 = Software reset CPU - return "SW restart"; break; - case 5 : // 5 = Deep Sleep wakeup reset digital core - return "wakeup"; break; - case 14: //14 = for APP CPU, reset by PRO CPU - return "restart"; break; - case 15: //15 = Reset when the vdd voltage is not stable (brownout) - return "brown-out"; break; - - // watchdog resets - case 4 : // 4 = Legacy watch dog reset digital core - case 6 : // 6 = Reset by SLC module, reset digital core - case 7 : // 7 = Timer Group0 Watch dog reset digital core - case 8 : // 8 = Timer Group1 Watch dog reset digital core - case 9 : // 9 = RTC Watch dog Reset digital core - case 11: //11 = Time Group watchdog reset CPU - case 13: //13 = RTC Watch dog Reset CPU - case 16: //16 = RTC Watch dog reset digital core and rtc module - case 17: //17 = Time Group1 reset CPU - return "watchdog"; break; - case 18: //18 = super watchdog reset digital core and rtc module - return "super watchdog"; break; - - // misc - case 10: // 10 = Instrusion tested to reset CPU - return "intrusion"; break; - case 19: //19 = glitch reset digital core and rtc module - return "glitch"; break; - case 20: //20 = efuse reset digital core - return "EFUSE reset"; break; - case 21: //21 = usb uart reset digital core - return "USB UART reset"; break; - case 22: //22 = usb jtag reset digital core - return "JTAG reset"; break; - case 23: //23 = power glitch reset digital core and rtc module - return "power glitch"; break; - - // unknown reason code - case 0: - return "none"; break; - default: - return "unknown"; break; - } -} - -esp_reset_reason_t SysModSystem::getRestartReason() { - return(esp_reset_reason()); -} -String SysModSystem::restartCode2InfoLong(esp_reset_reason_t reason) { - switch (reason) { - case ESP_RST_UNKNOWN: return("Reset reason can not be determined"); break; - case ESP_RST_POWERON: return("Restart due to power-on event"); break; - case ESP_RST_EXT: return("Reset by external pin (not applicable for ESP32)"); break; - case ESP_RST_SW: return("Software restart via esp_restart()"); break; - case ESP_RST_PANIC: return("Software reset due to panic or unhandled exception (SW error)"); break; - case ESP_RST_INT_WDT: return("Reset (software or hardware) due to interrupt watchdog"); break; - case ESP_RST_TASK_WDT: return("Reset due to task watchdog"); break; - case ESP_RST_WDT: return("Reset due to other watchdogs"); break; - case ESP_RST_DEEPSLEEP:return("Restart after exiting deep sleep mode"); break; - case ESP_RST_BROWNOUT: return("Brownout Reset (software or hardware)"); break; - case ESP_RST_SDIO: return("Reset over SDIO"); break; - } - return("unknown"); -} - -String SysModSystem::restartCode2Info(esp_reset_reason_t reason) { - switch (reason) { - case ESP_RST_UNKNOWN: return("unknown reason"); break; - case ESP_RST_POWERON: return("power-on event"); break; - case ESP_RST_EXT: return("external pin reset"); break; - case ESP_RST_SW: return("SW restart by esp_restart()"); break; - case ESP_RST_PANIC: return("SW error - panic or exception"); break; - case ESP_RST_INT_WDT: return("interrupt watchdog"); break; - case ESP_RST_TASK_WDT: return("task watchdog"); break; - case ESP_RST_WDT: return("other watchdog"); break; - case ESP_RST_DEEPSLEEP:return("exit from deep sleep"); break; - case ESP_RST_BROWNOUT: return("Brownout Reset"); break; - case ESP_RST_SDIO: return("Reset over SDIO"); break; - } - return("unknown"); -} - +} \ No newline at end of file diff --git a/src/Sys/SysModSystem.h b/src/Sys/SysModSystem.h index 60ae436..2a65ba1 100644 --- a/src/Sys/SysModSystem.h +++ b/src/Sys/SysModSystem.h @@ -17,8 +17,6 @@ class SysModSystem:public SysModule { public: - char build[64] = ""; - char chipInfo[64] = ""; bool3State safeMode = false; Toki toki = Toki(); //Minimal millisecond accurate timekeeping. @@ -32,12 +30,7 @@ class SysModSystem:public SysModule { void loop10s() override; //from esp32Tools - bool sysTools_normal_startup(); // FALSE if unusual startup code --> use next function to get more info - String sysTools_getRestartReason(); // long string including restart codes from system, Core#0 and Core#1 (if availeable) - String sysTools_restart2String(int reasoncode); // helper for SysModSystem::addRestartReasonsSelect. Returns "(#) ReasonText" - String sysTools_reset2String(int resetCode); // helper for SysModSystem::addResetReasonsSelect. Returns "shortResetReasonText (#)" int sysTools_get_arduino_maxStackUsage(); // to query max used stack of the arduino task. returns "-1" if unknown - int sysTools_get_webserver_maxStackUsage(); // to query max used stack of the webserver task. returns "-1" if unknown //tbd: utility function ... (pka prepareHostname) void removeInvalidCharacters(char* hostname, const char *in) diff --git a/src/User/UserModLive.cpp b/src/User/UserModLive.cpp index b90a0e2..06c1a10 100644 --- a/src/User/UserModLive.cpp +++ b/src/User/UserModLive.cpp @@ -394,7 +394,7 @@ static float _time(float j) { ppf("Before parsing of %s\n", fileName); ppf("Heap %s:%d f:%d / t:%d (l:%d) B [%d %d]\n", __FUNCTION__, __LINE__, ESP.getFreeHeap(), ESP.getHeapSize(), ESP.getMaxAllocHeap(), esp_get_free_heap_size(), esp_get_free_internal_heap_size()); - ppf("Stack %d of %d B (async %d B) %d\n", sys->sysTools_get_arduino_maxStackUsage(), getArduinoLoopTaskStackSize(), sys->sysTools_get_webserver_maxStackUsage(), uxTaskGetStackHighWaterMark(xTaskGetCurrentTaskHandle())); + ppf("Stack %d of %d B %d\n", sys->sysTools_get_arduino_maxStackUsage(), getArduinoLoopTaskStackSize(), uxTaskGetStackHighWaterMark(xTaskGetCurrentTaskHandle())); Executable executable = parser.parseScript(&scScript); executable.name = string(fileName);