diff --git a/ESP32_AP-Flasher/data/www/index.html b/ESP32_AP-Flasher/data/www/index.html index cf05b572..e602545b 100644 --- a/ESP32_AP-Flasher/data/www/index.html +++ b/ESP32_AP-Flasher/data/www/index.html @@ -157,6 +157,7 @@ Latency will be around 40 seconds.">
Currently active tags:
+
loading
AP config
edit littleFS
@@ -180,7 +181,7 @@ Latency will be around 40 seconds.">
-
+
diff --git a/ESP32_AP-Flasher/data/www/main.css b/ESP32_AP-Flasher/data/www/main.css index 54bd0f45..fbf9fa3a 100644 --- a/ESP32_AP-Flasher/data/www/main.css +++ b/ESP32_AP-Flasher/data/www/main.css @@ -270,7 +270,7 @@ select { } .tagpending { - animation: pending 1s ease infinite; + animation: pending 1.5s ease infinite; } .currimg { @@ -539,9 +539,9 @@ ul.messages li.new { } @keyframes pending { - 0% { background-color: #d0d0e0;} - 50% { background-color: #b0b0e0;} - 100% { background-color: #d0d0e0;} + 0% { } + 50% { background-color: #d4d4f5;} + 100% { } } @media screen and (max-width: 480px) { @@ -587,5 +587,10 @@ ul.messages li.new { .actionbox>div { gap: 5px; + flex-flow: wrap; + } + + .actionbox>div:first-child>div:first-child { + flex-basis: 100%; } } diff --git a/ESP32_AP-Flasher/data/www/main.js b/ESP32_AP-Flasher/data/www/main.js index 6aea1f36..79d8c592 100644 --- a/ESP32_AP-Flasher/data/www/main.js +++ b/ESP32_AP-Flasher/data/www/main.js @@ -25,6 +25,12 @@ const apstate = [ { state: "failed", color: "red" }, { state: "coming online", color: "yellow" } ]; +const runstate = [ + { state: "⏹︎ stopped" }, + { state: "⏸pause" }, + { state: "" }, // hide running + { state: "⏳︎ init" } +]; const imageQueue = []; let isProcessing = false; @@ -92,6 +98,7 @@ function connect() { if (msg.sys.apstate) { $("#apstatecolor").style.color = apstate[msg.sys.apstate].color; $("#apstate").innerHTML = apstate[msg.sys.apstate].state; + $("#runstate").innerHTML = runstate[msg.sys.runstate].state; } servertimediff = (Date.now() / 1000) - msg.sys.currtime; } @@ -209,6 +216,7 @@ function processTags(tagArray) { break; case WAKEUP_REASON_GPIO: $('#tag' + tagmac + ' .nextcheckin').innerHTML = "GPIO wakeup" + $('#tag' + tagmac).style.background = "#c8f1bb"; break; case WAKEUP_REASON_NFC: $('#tag' + tagmac + ' .nextcheckin').innerHTML = "NFC wakeup" diff --git a/ESP32_AP-Flasher/include/system.h b/ESP32_AP-Flasher/include/system.h new file mode 100644 index 00000000..9b34420d --- /dev/null +++ b/ESP32_AP-Flasher/include/system.h @@ -0,0 +1,14 @@ +#include + +#define WAKEUP_REASON_TIMED 0 +#define WAKEUP_REASON_BOOT 1 +#define WAKEUP_REASON_GPIO 2 +#define WAKEUP_REASON_NFC 3 +#define WAKEUP_REASON_FIRSTBOOT 0xFC +#define WAKEUP_REASON_NETWORK_SCAN 0xFD +#define WAKEUP_REASON_WDT_RESET 0xFE + +void init_time(); +void logLine(char* buffer); +void logLine(String text); +void logStartUp(); diff --git a/ESP32_AP-Flasher/include/tag_db.h b/ESP32_AP-Flasher/include/tag_db.h index c0b2db93..6f4aa83d 100644 --- a/ESP32_AP-Flasher/include/tag_db.h +++ b/ESP32_AP-Flasher/include/tag_db.h @@ -14,6 +14,7 @@ #define RUNSTATUS_STOP 0 #define RUNSTATUS_PAUSE 1 #define RUNSTATUS_RUN 2 +#define RUNSTATUS_INIT 3 class tagRecord { public: @@ -62,7 +63,7 @@ struct Config { uint8_t runStatus; }; -extern SemaphoreHandle_t tagDBOwner; +// extern SemaphoreHandle_t tagDBOwner; extern Config config; extern std::vector tagDB; extern DynamicJsonDocument APconfig; diff --git a/ESP32_AP-Flasher/src/contentmanager.cpp b/ESP32_AP-Flasher/src/contentmanager.cpp index d7818348..b2aa989c 100644 --- a/ESP32_AP-Flasher/src/contentmanager.cpp +++ b/ESP32_AP-Flasher/src/contentmanager.cpp @@ -184,14 +184,14 @@ void drawNew(uint8_t mac[8], bool buttonPressed, tagRecord *&taginfo) { // https://github.com/erikflowers/weather-icons drawWeather(filename, cfgobj, taginfo, imageParams); - taginfo->nextupdate = now + 3600; + taginfo->nextupdate = now + 1800; updateTagImage(filename, mac, 15, taginfo, imageParams); break; case Forecast: drawForecast(filename, cfgobj, taginfo, imageParams); - taginfo->nextupdate = now + 3 * 3600; + taginfo->nextupdate = now + 3600; updateTagImage(filename, mac, 15, taginfo, imageParams); break; diff --git a/ESP32_AP-Flasher/src/main.cpp b/ESP32_AP-Flasher/src/main.cpp index e6018d00..20c8cc26 100644 --- a/ESP32_AP-Flasher/src/main.cpp +++ b/ESP32_AP-Flasher/src/main.cpp @@ -8,6 +8,7 @@ #include "makeimage.h" #include "serialap.h" #include "settings.h" +#include "system.h" #include "tag_db.h" #ifdef HAS_USB @@ -26,31 +27,20 @@ void delayedStart(void* parameter) { Serial.println("Resuming content generation"); wsLog("resuming content generation"); config.runStatus = RUNSTATUS_RUN; + vTaskDelay(10 / portTICK_PERIOD_MS); vTaskDelete(NULL); } void timeTask(void* parameter) { - config.runStatus = RUNSTATUS_RUN; - esp_reset_reason_t resetReason = esp_reset_reason(); - if (resetReason == ESP_RST_PANIC) { - Serial.println("Panic! Pausing content generation for 60 seconds"); - config.runStatus = RUNSTATUS_PAUSE; - xTaskCreate(delayedStart, "delaystart", 2000, NULL, 2, NULL); - } + wsSendSysteminfo(); while (1) { time_t now; time(&now); - tm tm; - if (!getLocalTime(&tm)) { - Serial.println("Waiting for valid time from NTP-server"); - } else { - if (now % 5 == 0 || apInfo.state != AP_STATE_ONLINE) { - wsSendSysteminfo(); - } - if (now % 300 == 6 && config.runStatus != RUNSTATUS_STOP) saveDB("/current/tagDB.json"); - if (apInfo.state == AP_STATE_ONLINE) contentRunner(); - } + if (now % 5 == 0 || apInfo.state != AP_STATE_ONLINE || config.runStatus != RUNSTATUS_RUN) wsSendSysteminfo(); + if (now % 300 == 6 && config.runStatus != RUNSTATUS_STOP) saveDB("/current/tagDB.json"); + if (apInfo.state == AP_STATE_ONLINE) contentRunner(); + vTaskDelay(1000 / portTICK_PERIOD_MS); } } @@ -80,8 +70,7 @@ void setup() { Serial.begin(115200); Serial.print(">\n"); - - pinTest(); + pinTest(); #ifdef BOARD_HAS_PSRAM if (!psramInit()) { Serial.printf("This build of the AP expects PSRAM, but we couldn't find/init any. Something is terribly wrong here! System halted."); @@ -140,20 +129,36 @@ void setup() { rgbIdle(); #endif loadDB("/current/tagDB.json"); - tagDBOwner = xSemaphoreCreateMutex(); + // tagDBOwner = xSemaphoreCreateMutex(); xTaskCreate(APTask, "AP Process", 6000, NULL, 2, NULL); xTaskCreate(webSocketSendProcess, "ws", 2000, NULL, configMAX_PRIORITIES - 10, NULL); + vTaskDelay(10 / portTICK_PERIOD_MS); + + config.runStatus = RUNSTATUS_INIT; + xTaskCreate(timeTask, "timed tasks", 12000, NULL, 2, NULL); + + init_time(); + logStartUp(); + + esp_reset_reason_t resetReason = esp_reset_reason(); + if (resetReason == ESP_RST_PANIC) { + Serial.println("Panic! Pausing content generation for 30 seconds"); + config.runStatus = RUNSTATUS_PAUSE; + xTaskCreate(delayedStart, "delaystart", 2000, NULL, 2, NULL); + } else { + config.runStatus = RUNSTATUS_RUN; + } } void loop() { vTaskDelay(10000 / portTICK_PERIOD_MS); // performDeviceFlash(); while (1) { - // pinTest(); + // pinTest(); while (1) { vTaskDelay(10000 / portTICK_PERIOD_MS); - //pinTest(); + // pinTest(); } #ifdef OPENEPAPERLINK_PCB if (extTagConnected()) { diff --git a/ESP32_AP-Flasher/src/newproto.cpp b/ESP32_AP-Flasher/src/newproto.cpp index 88bc3921..c3422898 100644 --- a/ESP32_AP-Flasher/src/newproto.cpp +++ b/ESP32_AP-Flasher/src/newproto.cpp @@ -12,6 +12,7 @@ #include "commstructs.h" #include "serialap.h" #include "settings.h" +#include "system.h" #include "tag_db.h" #include "udp.h" #include "web.h" @@ -468,6 +469,23 @@ void processDataReq(struct espAvailDataReq* eadr, bool local) { taginfo->lastseen = now; if (eadr->adr.lastPacketRSSI != 0) { + if (eadr->adr.wakeupReason >= 0xF0) { + if (!taginfo->pending) taginfo->nextupdate = 0; + memset(taginfo->md5, 0, 16 * sizeof(uint8_t)); + memset(taginfo->md5pending, 0, 16 * sizeof(uint8_t)); + + const char* reason = ""; + if (eadr->adr.wakeupReason == WAKEUP_REASON_FIRSTBOOT) reason = "Booting"; + else if (eadr->adr.wakeupReason == WAKEUP_REASON_NETWORK_SCAN) reason = "Network scan"; + else if (eadr->adr.wakeupReason == WAKEUP_REASON_WDT_RESET) reason = "Watchdog reset"; + sprintf(buffer, "%02X%02X%02X%02X%02X%02X%02X%02X %s", eadr->src[7], eadr->src[6], eadr->src[5], eadr->src[4], eadr->src[3], eadr->src[2], eadr->src[1], eadr->src[0], reason); + logLine(buffer); + } + if (taginfo->batteryMv != eadr->adr.batteryMv) { + sprintf(buffer, "%02X%02X%02X%02X%02X%02X%02X%02X battery went from %.2fV to %.2fV", eadr->src[7], eadr->src[6], eadr->src[5], eadr->src[4], eadr->src[3], eadr->src[2], eadr->src[1], eadr->src[0], static_cast(taginfo->batteryMv) / 1000.0, static_cast(eadr->adr.batteryMv) / 1000.0); + logLine(buffer); + } + taginfo->LQI = eadr->adr.lastPacketLQI; taginfo->hwType = eadr->adr.hwType; taginfo->RSSI = eadr->adr.lastPacketRSSI; @@ -476,11 +494,6 @@ void processDataReq(struct espAvailDataReq* eadr, bool local) { taginfo->hwType = eadr->adr.hwType; taginfo->wakeupReason = eadr->adr.wakeupReason; taginfo->capabilities = eadr->adr.capabilities; - if (eadr->adr.wakeupReason >= 0xF0) { - if (!taginfo->pending) taginfo->nextupdate = 0; - memset(taginfo->md5, 0, 16 * sizeof(uint8_t)); - memset(taginfo->md5pending, 0, 16 * sizeof(uint8_t)); - } } if (local) { sprintf(buffer, "src[7], eadr->src[6], eadr->src[5], eadr->src[4], eadr->src[3], eadr->src[2], eadr->src[1], eadr->src[0]); diff --git a/ESP32_AP-Flasher/src/system.cpp b/ESP32_AP-Flasher/src/system.cpp new file mode 100644 index 00000000..07d2bc65 --- /dev/null +++ b/ESP32_AP-Flasher/src/system.cpp @@ -0,0 +1,80 @@ +#include "system.h" + +#include +#include + +#include "LittleFS.h" + +void init_time() { + struct tm timeinfo; + while (true) { + if (!getLocalTime(&timeinfo)) { + Serial.println("Waiting for valid time from NTP-server"); + vTaskDelay(1000 / portTICK_PERIOD_MS); + } else { + break; + } + } +} + +void logLine(char* buffer) { + logLine(String(buffer)); +} + +void logLine(String text) { + time_t now; + time(&now); + + char timeStr[24]; + strftime(timeStr, sizeof(timeStr), "%Y-%m-%d %H:%M:%S ", localtime(&now)); + + File logFile = LittleFS.open("/log.txt", "a"); + if (logFile) { + logFile.print(timeStr); + logFile.println(text); + logFile.close(); + } +} + +void logStartUp() { + esp_reset_reason_t resetReason = esp_reset_reason(); + + String logEntry = "Reboot. Reason: "; + switch (resetReason) { + case ESP_RST_POWERON: + logEntry += "Power-on"; + break; + case ESP_RST_EXT: + logEntry += "External"; + break; + case ESP_RST_SW: + logEntry += "Software"; + break; + case ESP_RST_PANIC: + logEntry += "Panic"; + break; + case ESP_RST_INT_WDT: + logEntry += "Watchdog"; + break; + case ESP_RST_TASK_WDT: + logEntry += "Task Watchdog"; + break; + case ESP_RST_WDT: + logEntry += "Other Watchdog"; + break; + case ESP_RST_DEEPSLEEP: + logEntry += "Deep Sleep"; + break; + case ESP_RST_BROWNOUT: + logEntry += "Brownout"; + break; + case ESP_RST_SDIO: + logEntry += "SDIO"; + break; + default: + logEntry += "Unknown"; + break; + } + + logLine(logEntry); +} diff --git a/ESP32_AP-Flasher/src/tag_db.cpp b/ESP32_AP-Flasher/src/tag_db.cpp index 513b0c8e..e0bdf4e6 100644 --- a/ESP32_AP-Flasher/src/tag_db.cpp +++ b/ESP32_AP-Flasher/src/tag_db.cpp @@ -11,7 +11,7 @@ std::vector tagDB; Config config; -SemaphoreHandle_t tagDBOwner; +// SemaphoreHandle_t tagDBOwner; tagRecord* tagRecord::findByMAC(uint8_t mac[8]) { for (int16_t c = 0; c < tagDB.size(); c++) {