diff --git a/platformio.ini b/platformio.ini index ab31e31..864f80b 100644 --- a/platformio.ini +++ b/platformio.ini @@ -33,7 +33,8 @@ lib_deps = digitaldragon/SSLClient @ ^1.3.2 ; Enable SPIFFS upload -board_build.filesystem = spiffs +#board_build.filesystem = spiffs +board_build.filesystem = littlefs ; Update partition settings board_build.partitions = partitions.csv board_upload.flash_size = 4MB @@ -44,13 +45,13 @@ build_flags = -Os -ffunction-sections -fdata-sections - -DNDEBUG + #-DNDEBUG -mtext-section-literals -DVERSION=\"${common.version}\" -DASYNCWEBSERVER_REGEX - -DCORE_DEBUG_LEVEL=3 + #-DCORE_DEBUG_LEVEL=3 -DCONFIG_ARDUHAL_LOG_COLORS=1 - -DOTA_DEBUG=1 + #-DOTA_DEBUG=1 -DCONFIG_OPTIMIZATION_LEVEL_DEBUG=1 -DBOOT_APP_PARTITION_OTA_0=1 -DCONFIG_LWIP_TCP_MSL=60000 diff --git a/src/commonFS.cpp b/src/commonFS.cpp index 05487ee..7940b22 100644 --- a/src/commonFS.cpp +++ b/src/commonFS.cpp @@ -1,8 +1,8 @@ #include "commonFS.h" -#include +#include bool saveJsonValue(const char* filename, const JsonDocument& doc) { - File file = SPIFFS.open(filename, "w"); + File file = LittleFS.open(filename, "w"); if (!file) { Serial.print("Fehler beim Öffnen der Datei zum Schreiben: "); Serial.println(filename); @@ -20,7 +20,7 @@ bool saveJsonValue(const char* filename, const JsonDocument& doc) { } bool loadJsonValue(const char* filename, JsonDocument& doc) { - File file = SPIFFS.open(filename, "r"); + File file = LittleFS.open(filename, "r"); if (!file) { Serial.print("Fehler beim Öffnen der Datei zum Lesen: "); Serial.println(filename); @@ -36,12 +36,12 @@ bool loadJsonValue(const char* filename, JsonDocument& doc) { return true; } -void initializeSPIFFS() { - if (!SPIFFS.begin(true, "/spiffs", 10, "spiffs")) { - Serial.println("SPIFFS Mount Failed"); +void initializeFileSystem() { + if (!LittleFS.begin(true)) { + Serial.println("LittleFS Mount Failed"); return; } - Serial.printf("SPIFFS Total: %u bytes\n", SPIFFS.totalBytes()); - Serial.printf("SPIFFS Used: %u bytes\n", SPIFFS.usedBytes()); - Serial.printf("SPIFFS Free: %u bytes\n", SPIFFS.totalBytes() - SPIFFS.usedBytes()); + Serial.printf("LittleFS Total: %u bytes\n", LittleFS.totalBytes()); + Serial.printf("LittleFS Used: %u bytes\n", LittleFS.usedBytes()); + Serial.printf("LittleFS Free: %u bytes\n", LittleFS.totalBytes() - LittleFS.usedBytes()); } \ No newline at end of file diff --git a/src/commonFS.h b/src/commonFS.h index 273bf72..d46b1e5 100644 --- a/src/commonFS.h +++ b/src/commonFS.h @@ -2,11 +2,11 @@ #define COMMONFS_H #include -#include #include +#include bool saveJsonValue(const char* filename, const JsonDocument& doc); bool loadJsonValue(const char* filename, JsonDocument& doc); -void initializeSPIFFS(); +void initializeFileSystem(); #endif diff --git a/src/main.cpp b/src/main.cpp index c5ac9e3..dbe88ce 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -24,7 +24,7 @@ void setup() { Serial.printf("%08X\n", (uint32_t)chipid); //print Low 4bytes. // Initialize SPIFFS - initializeSPIFFS(); + initializeFileSystem(); // Start Display setupDisplay(); @@ -74,6 +74,21 @@ void setup() { } +/** + * Safe interval check that handles millis() overflow + * @param currentTime Current millis() value + * @param lastTime Last recorded time + * @param interval Desired interval in milliseconds + * @return True if interval has elapsed + */ +bool intervalElapsed(unsigned long currentTime, unsigned long &lastTime, unsigned long interval) { + if (currentTime - lastTime >= interval || currentTime < lastTime) { + lastTime = currentTime; + return true; + } + return false; +} + unsigned long lastWeightReadTime = 0; const unsigned long weightReadInterval = 1000; // 1 second @@ -81,9 +96,6 @@ unsigned long lastAutoSetBambuAmsTime = 0; const unsigned long autoSetBambuAmsInterval = 1000; // 1 second uint8_t autoAmsCounter = 0; -unsigned long lastAmsSendTime = 0; -const unsigned long amsSendInterval = 60000; // 1 minute - uint8_t weightSend = 0; int16_t lastWeight = 0; @@ -95,40 +107,33 @@ void loop() { unsigned long currentMillis = millis(); // Überprüfe regelmäßig die WLAN-Verbindung - if (millis() - lastWifiCheckTime > wifiCheckInterval) { + if (intervalElapsed(currentMillis, lastWifiCheckTime, wifiCheckInterval)) { checkWiFiConnection(); - lastWifiCheckTime = millis(); - } - - // Send AMS Data min every Minute - if (currentMillis - lastAmsSendTime >= amsSendInterval) - { - lastAmsSendTime = currentMillis; - //sendAmsData(nullptr); } // Wenn Bambu auto set Spool aktiv - if (autoSendToBambu && autoSetToBambuSpoolId > 0 && currentMillis - lastAutoSetBambuAmsTime >= autoSetBambuAmsInterval) - { - if (hasReadRfidTag == 0) + if (autoSendToBambu && autoSetToBambuSpoolId > 0) { + if (intervalElapsed(currentMillis, lastAutoSetBambuAmsTime, autoSetBambuAmsInterval)) { - lastAutoSetBambuAmsTime = currentMillis; - oledShowMessage("Auto Set " + String(autoSetBambuAmsCounter - autoAmsCounter) + "s"); - autoAmsCounter++; - - if (autoAmsCounter >= autoSetBambuAmsCounter) + if (hasReadRfidTag == 0) + { + lastAutoSetBambuAmsTime = currentMillis; + oledShowMessage("Auto Set " + String(autoSetBambuAmsCounter - autoAmsCounter) + "s"); + autoAmsCounter++; + + if (autoAmsCounter >= autoSetBambuAmsCounter) + { + autoSetToBambuSpoolId = 0; + autoAmsCounter = 0; + oledShowWeight(weight); + } + } + else { - autoSetToBambuSpoolId = 0; autoAmsCounter = 0; - oledShowWeight(weight); } } - else - { - autoAmsCounter = 0; - } } - // Wenn Waage nicht Kalibriert if (scaleCalibrated == 3) diff --git a/src/ota.cpp b/src/ota.cpp index 4610786..b222889 100644 --- a/src/ota.cpp +++ b/src/ota.cpp @@ -17,8 +17,8 @@ static bool isSpiffsUpdate = false; void backupJsonConfigs() { // Bambu Credentials backup - if (SPIFFS.exists("/bambu_credentials.json")) { - File file = SPIFFS.open("/bambu_credentials.json", "r"); + if (LittleFS.exists("/bambu_credentials.json")) { + File file = LittleFS.open("/bambu_credentials.json", "r"); if (file) { bambuCredentialsBackup = file.readString(); file.close(); @@ -27,8 +27,8 @@ void backupJsonConfigs() { } // Spoolman URL backup - if (SPIFFS.exists("/spoolman_url.json")) { - File file = SPIFFS.open("/spoolman_url.json", "r"); + if (LittleFS.exists("/spoolman_url.json")) { + File file = LittleFS.open("/spoolman_url.json", "r"); if (file) { spoolmanUrlBackup = file.readString(); file.close(); @@ -40,7 +40,7 @@ void backupJsonConfigs() { void restoreJsonConfigs() { // Restore Bambu credentials if (bambuCredentialsBackup.length() > 0) { - File file = SPIFFS.open("/bambu_credentials.json", "w"); + File file = LittleFS.open("/bambu_credentials.json", "w"); if (file) { file.print(bambuCredentialsBackup); file.close(); @@ -51,7 +51,7 @@ void restoreJsonConfigs() { // Restore Spoolman URL if (spoolmanUrlBackup.length() > 0) { - File file = SPIFFS.open("/spoolman_url.json", "w"); + File file = LittleFS.open("/spoolman_url.json", "w"); if (file) { file.print(spoolmanUrlBackup); file.close(); diff --git a/src/website.cpp b/src/website.cpp index 5098394..e0c9cdf 100644 --- a/src/website.cpp +++ b/src/website.cpp @@ -113,12 +113,12 @@ void onWsEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventTyp // Funktion zum Laden und Ersetzen des Headers in einer HTML-Datei String loadHtmlWithHeader(const char* filename) { Serial.println("Lade HTML-Datei: " + String(filename)); - if (!SPIFFS.exists(filename)) { + if (!LittleFS.exists(filename)) { Serial.println("Fehler: Datei nicht gefunden!"); return "Fehler: Datei nicht gefunden!"; } - File file = SPIFFS.open(filename, "r"); + File file = LittleFS.open(filename, "r"); String html = file.readString(); file.close(); @@ -195,7 +195,7 @@ void setupWebserver(AsyncWebServer &server) { // Route für about server.on("/about", HTTP_GET, [](AsyncWebServerRequest *request){ Serial.println("Anfrage für /about erhalten"); - AsyncWebServerResponse *response = request->beginResponse(SPIFFS, "/index.html.gz", "text/html"); + AsyncWebServerResponse *response = request->beginResponse(LittleFS, "/index.html.gz", "text/html"); response->addHeader("Content-Encoding", "gzip"); response->addHeader("Cache-Control", CACHE_CONTROL); request->send(response); @@ -204,7 +204,7 @@ void setupWebserver(AsyncWebServer &server) { // Route für Waage server.on("/waage", HTTP_GET, [](AsyncWebServerRequest *request){ Serial.println("Anfrage für /waage erhalten"); - AsyncWebServerResponse *response = request->beginResponse(SPIFFS, "/waage.html.gz", "text/html"); + AsyncWebServerResponse *response = request->beginResponse(LittleFS, "/waage.html.gz", "text/html"); response->addHeader("Content-Encoding", "gzip"); response->addHeader("Cache-Control", CACHE_CONTROL); request->send(response); @@ -213,7 +213,7 @@ void setupWebserver(AsyncWebServer &server) { // Route für RFID server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){ Serial.println("Anfrage für /rfid erhalten"); - AsyncWebServerResponse *response = request->beginResponse(SPIFFS, "/rfid.html.gz", "text/html"); + AsyncWebServerResponse *response = request->beginResponse(LittleFS, "/rfid.html.gz", "text/html"); response->addHeader("Content-Encoding", "gzip"); response->addHeader("Cache-Control", CACHE_CONTROL); request->send(response); @@ -229,7 +229,7 @@ void setupWebserver(AsyncWebServer &server) { // Route für WiFi server.on("/wifi", HTTP_GET, [](AsyncWebServerRequest *request){ Serial.println("Anfrage für /wifi erhalten"); - AsyncWebServerResponse *response = request->beginResponse(SPIFFS, "/wifi.html.gz", "text/html"); + AsyncWebServerResponse *response = request->beginResponse(LittleFS, "/wifi.html.gz", "text/html"); response->addHeader("Content-Encoding", "gzip"); response->addHeader("Cache-Control", CACHE_CONTROL); request->send(response); @@ -322,7 +322,7 @@ void setupWebserver(AsyncWebServer &server) { // Route für das Laden der CSS-Datei server.on("/style.css", HTTP_GET, [](AsyncWebServerRequest *request){ Serial.println("Lade style.css"); - AsyncWebServerResponse *response = request->beginResponse(SPIFFS, "/style.css.gz", "text/css"); + AsyncWebServerResponse *response = request->beginResponse(LittleFS, "/style.css.gz", "text/css"); response->addHeader("Content-Encoding", "gzip"); response->addHeader("Cache-Control", CACHE_CONTROL); request->send(response); @@ -331,7 +331,7 @@ void setupWebserver(AsyncWebServer &server) { // Route für das Logo server.on("/logo.png", HTTP_GET, [](AsyncWebServerRequest *request){ - AsyncWebServerResponse *response = request->beginResponse(SPIFFS, "/logo.png.gz", "image/png"); + AsyncWebServerResponse *response = request->beginResponse(LittleFS, "/logo.png.gz", "image/png"); response->addHeader("Content-Encoding", "gzip"); response->addHeader("Cache-Control", CACHE_CONTROL); request->send(response); @@ -340,7 +340,7 @@ void setupWebserver(AsyncWebServer &server) { // Route für Favicon server.on("/favicon.ico", HTTP_GET, [](AsyncWebServerRequest *request){ - AsyncWebServerResponse *response = request->beginResponse(SPIFFS, "/favicon.ico", "image/x-icon"); + AsyncWebServerResponse *response = request->beginResponse(LittleFS, "/favicon.ico", "image/x-icon"); response->addHeader("Cache-Control", CACHE_CONTROL); request->send(response); Serial.println("favicon.ico gesendet"); @@ -348,7 +348,7 @@ void setupWebserver(AsyncWebServer &server) { // Route für spool_in.png server.on("/spool_in.png", HTTP_GET, [](AsyncWebServerRequest *request){ - AsyncWebServerResponse *response = request->beginResponse(SPIFFS, "/spool_in.png.gz", "image/png"); + AsyncWebServerResponse *response = request->beginResponse(LittleFS, "/spool_in.png.gz", "image/png"); response->addHeader("Content-Encoding", "gzip"); response->addHeader("Cache-Control", CACHE_CONTROL); request->send(response); @@ -357,7 +357,7 @@ void setupWebserver(AsyncWebServer &server) { // Route für set_spoolman.png server.on("/set_spoolman.png", HTTP_GET, [](AsyncWebServerRequest *request){ - AsyncWebServerResponse *response = request->beginResponse(SPIFFS, "/set_spoolman.png.gz", "image/png"); + AsyncWebServerResponse *response = request->beginResponse(LittleFS, "/set_spoolman.png.gz", "image/png"); response->addHeader("Content-Encoding", "gzip"); response->addHeader("Cache-Control", CACHE_CONTROL); request->send(response); @@ -367,7 +367,7 @@ void setupWebserver(AsyncWebServer &server) { // Route für JavaScript Dateien server.on("/spoolman.js", HTTP_GET, [](AsyncWebServerRequest *request){ Serial.println("Anfrage für /spoolman.js erhalten"); - AsyncWebServerResponse *response = request->beginResponse(SPIFFS, "/spoolman.js.gz", "text/javascript"); + AsyncWebServerResponse *response = request->beginResponse(LittleFS, "/spoolman.js.gz", "text/javascript"); response->addHeader("Content-Encoding", "gzip"); response->addHeader("Cache-Control", CACHE_CONTROL); request->send(response); @@ -376,7 +376,7 @@ void setupWebserver(AsyncWebServer &server) { server.on("/rfid.js", HTTP_GET, [](AsyncWebServerRequest *request){ Serial.println("Anfrage für /rfid.js erhalten"); - AsyncWebServerResponse *response = request->beginResponse(SPIFFS,"/rfid.js.gz", "text/javascript"); + AsyncWebServerResponse *response = request->beginResponse(LittleFS,"/rfid.js.gz", "text/javascript"); response->addHeader("Content-Encoding", "gzip"); response->addHeader("Cache-Control", CACHE_CONTROL); request->send(response); @@ -385,7 +385,7 @@ void setupWebserver(AsyncWebServer &server) { // Vereinfachter Update-Handler server.on("/upgrade", HTTP_GET, [](AsyncWebServerRequest *request) { - AsyncWebServerResponse *response = request->beginResponse(SPIFFS, "/upgrade.html.gz", "text/html"); + AsyncWebServerResponse *response = request->beginResponse(LittleFS, "/upgrade.html.gz", "text/html"); response->addHeader("Content-Encoding", "gzip"); response->addHeader("Cache-Control", "no-store"); request->send(response);