diff --git a/html/header.html b/html/header.html index f6eae24..c04f5c6 100644 --- a/html/header.html +++ b/html/header.html @@ -12,7 +12,7 @@
-

FilaManv1.2.70

+

FilaManv1.2.65

Filament Management Tool

diff --git a/html/index.html b/html/index.html index 0171501..20a7709 100644 --- a/html/index.html +++ b/html/index.html @@ -12,7 +12,7 @@
-

FilaManv1.2.70

+

FilaManv1.2.65

Filament Management Tool

diff --git a/html/rfid.html b/html/rfid.html index 339df61..cb9a558 100644 --- a/html/rfid.html +++ b/html/rfid.html @@ -12,7 +12,7 @@
-

FilaManv1.2.70

+

FilaManv1.2.65

Filament Management Tool

diff --git a/html/spoolman.html b/html/spoolman.html index d282f54..c90ed45 100644 --- a/html/spoolman.html +++ b/html/spoolman.html @@ -12,7 +12,7 @@
-

FilaManv1.2.70

+

FilaManv1.2.65

Filament Management Tool

diff --git a/html/upgrade.html b/html/upgrade.html index 7f53318..6664494 100644 --- a/html/upgrade.html +++ b/html/upgrade.html @@ -12,7 +12,7 @@
-

FilaManv1.2.70

+

FilaManv1.2.65

Filament Management Tool

diff --git a/html/waage.html b/html/waage.html index d54c54e..2e41f1c 100644 --- a/html/waage.html +++ b/html/waage.html @@ -12,7 +12,7 @@
-

FilaManv1.2.70

+

FilaManv1.2.65

Filament Management Tool

diff --git a/html/wifi.html b/html/wifi.html index 38c05c1..02c0c8f 100644 --- a/html/wifi.html +++ b/html/wifi.html @@ -12,7 +12,7 @@
-

FilaManv1.2.70

+

FilaManv1.2.65

Filament Management Tool

diff --git a/platformio.ini b/platformio.ini index e68cc00..1ad464a 100644 --- a/platformio.ini +++ b/platformio.ini @@ -9,7 +9,7 @@ ; https://docs.platformio.org/page/projectconf.html [common] -version = "1.2.70" +version = "1.2.65" [env:esp32dev] platform = espressif32 @@ -66,6 +66,7 @@ extra_scripts = pre:scripts/pre_spiffs.py ; wird als zweites ausgeführt pre:scripts/combine_html.py ; wird als drittes ausgeführt scripts/gzip_files.py + scripts/create_full_bin.py ; Neues Skript zur Erstellung der full.bin ; Remove or comment out the targets line ;targets = buildfs, build diff --git a/scripts/create_full_bin.py b/scripts/create_full_bin.py new file mode 100644 index 0000000..4a2dc23 --- /dev/null +++ b/scripts/create_full_bin.py @@ -0,0 +1,48 @@ +import os +import shutil +from platformio import util + +Import("env") + +def create_full_bin(source, target, env): + # Get paths + firmware_path = str(target[0]) + build_dir = os.path.dirname(firmware_path) + project_dir = env.get("PROJECT_DIR") + + # Create full binary + firmware_name = os.path.basename(firmware_path) + spiffs_bin = os.path.join(build_dir, "spiffs.bin") + full_bin = os.path.join(build_dir, "full.bin") + + print("Creating full.bin...") + + # Check if files exist + if not os.path.exists(firmware_path): + print("Error: Firmware binary not found!") + return + if not os.path.exists(spiffs_bin): + print("Error: SPIFFS binary not found!") + return + + # Calculate padding size + firmware_size = os.path.getsize(firmware_path) + padding_size = 0x3D0000 - firmware_size # SPIFFS start address - firmware size + + # Create full binary + with open(full_bin, 'wb') as outfile: + # Copy firmware + with open(firmware_path, 'rb') as f: + outfile.write(f.read()) + + # Add padding + outfile.write(b'\xFF' * padding_size) + + # Copy SPIFFS + with open(spiffs_bin, 'rb') as f: + outfile.write(f.read()) + + print(f"Created full.bin ({os.path.getsize(full_bin)} bytes)") + +# Register the callback +env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", create_full_bin) \ No newline at end of file diff --git a/src/ota.cpp b/src/ota.cpp index c2f3d3f..517eaf7 100644 --- a/src/ota.cpp +++ b/src/ota.cpp @@ -10,13 +10,16 @@ // Magic byte patterns für verschiedene Image-Typen const uint8_t FIRMWARE_MAGIC = 0xE9; const uint8_t ESP_MAGIC = 0xE9; +static bool tasksAreStopped = false; void stopAllTasks() { // Stop all tasks - Serial.println("Stopping all tasks"); - vTaskSuspend(RfidReaderTask); - vTaskSuspend(BambuMqttTask); - vTaskSuspend(ScaleTask); + Serial.println("Stopping RFID Reader"); + if (RfidReaderTask) vTaskSuspend(RfidReaderTask); + Serial.println("Stopping Bambu"); + if (BambuMqttTask) vTaskSuspend(BambuMqttTask); + Serial.println("Stopping Scale"); + if (ScaleTask) vTaskSuspend(ScaleTask); vTaskDelay(100 / portTICK_PERIOD_MS); Serial.println("All tasks stopped"); } @@ -27,11 +30,15 @@ void handleOTAUpload(AsyncWebServerRequest *request, String filename, size_t ind static uint32_t currentOffset = 0; static uint8_t *spiffsBuffer = nullptr; static size_t spiffsSize = 0; - static const uint32_t SPIFFS_START = 0x310000; // SPIFFS start in full.bin + static const uint32_t SPIFFS_START = 0x3D0000; // Korrigierter SPIFFS start address aus partitions.csv + static const uint32_t SPIFFS_SIZE = 0x30000; // Korrigierte SPIFFS size aus partitions.csv - stopAllTasks(); + // Stop all tasks to save resources + if (!tasksAreStopped && (RfidReaderTask || BambuMqttTask || ScaleTask)) { + stopAllTasks(); + tasksAreStopped = true; + } - Serial.println("Start Main Upgrad Function"); if (!index) { // Reset static variables if (spiffsBuffer) { @@ -48,26 +55,31 @@ void handleOTAUpload(AsyncWebServerRequest *request, String filename, size_t ind } if (data[0] == ESP_MAGIC) { - isFullImage = (contentLength > 0x3D0000); - - // Korrektur: Bei full.bin die gesamte Größe verwenden - if (!Update.begin(contentLength, U_FLASH)) { - Serial.printf("Not enough space: %u required\n", contentLength); - request->send(400, "application/json", "{\"status\":\"error\",\"message\":\"Not enough space available\"}"); - return; - } - - Serial.println(isFullImage ? "Full image update started" : "Firmware update started"); + isFullImage = (contentLength > SPIFFS_START); if (isFullImage) { - spiffsSize = 0x0F0000; // 960KB SPIFFS size + if (!Update.begin(SPIFFS_START, U_FLASH)) { + Serial.printf("Not enough space for firmware: %u required\n", SPIFFS_START); + request->send(400, "application/json", "{\"status\":\"error\",\"message\":\"Not enough space available\"}"); + return; + } + + spiffsSize = SPIFFS_SIZE; spiffsBuffer = (uint8_t*)malloc(spiffsSize); if (!spiffsBuffer) { Serial.println("Failed to allocate SPIFFS buffer"); request->send(400, "application/json", "{\"status\":\"error\",\"message\":\"Memory allocation failed\"}"); return; } - memset(spiffsBuffer, 0xFF, spiffsSize); // Initialize buffer with 0xFF + memset(spiffsBuffer, 0xFF, spiffsSize); + Serial.println("Full image update started"); + } else { + if (!Update.begin(contentLength, U_FLASH)) { + Serial.printf("Not enough space: %u required\n", contentLength); + request->send(400, "application/json", "{\"status\":\"error\",\"message\":\"Not enough space available\"}"); + return; + } + Serial.println("Firmware update started"); } } else { request->send(400, "application/json", "{\"status\":\"error\",\"message\":\"Invalid image format\"}"); @@ -77,28 +89,34 @@ void handleOTAUpload(AsyncWebServerRequest *request, String filename, size_t ind } if (isFullImage) { - // Zuerst vollständiges Firmware-Update durchführen - if (Update.write(data, len) != len) { - String errorMsg = Update.errorString(); - if (errorMsg != "No Error") { - Update.printError(Serial); - if (spiffsBuffer) free(spiffsBuffer); - request->send(400, "application/json", "{\"status\":\"error\",\"message\":\"Error writing firmware: " + errorMsg + "\"}"); - return; + // Firmware Teil + if (currentOffset < SPIFFS_START) { + size_t writeLen = min(len, (size_t)(SPIFFS_START - currentOffset)); + if (Update.write(data, writeLen) != writeLen) { + String errorMsg = Update.errorString(); + if (errorMsg != "No Error") { + Update.printError(Serial); + if (spiffsBuffer) free(spiffsBuffer); + request->send(400, "application/json", "{\"status\":\"error\",\"message\":\"Error writing firmware: " + errorMsg + "\"}"); + return; + } } } - // SPIFFS-Daten separat sammeln - if (currentOffset >= SPIFFS_START) { - uint32_t spiffsOffset = currentOffset - SPIFFS_START; + // SPIFFS Teil + if (currentOffset + len > SPIFFS_START) { + uint32_t spiffsOffset = (currentOffset >= SPIFFS_START) ? + (currentOffset - SPIFFS_START) : 0; + uint32_t dataOffset = (currentOffset < SPIFFS_START) ? + (SPIFFS_START - currentOffset) : 0; + if (spiffsOffset < spiffsSize) { - size_t copyLen = min(len, spiffsSize - spiffsOffset); - memcpy(spiffsBuffer + spiffsOffset, data, copyLen); - Serial.printf("Collecting SPIFFS data at offset %u, length %u\n", spiffsOffset, copyLen); + size_t copyLen = min(len - dataOffset, spiffsSize - spiffsOffset); + memcpy(spiffsBuffer + spiffsOffset, data + dataOffset, copyLen); + Serial.printf("Collecting SPIFFS data: offset=%u, len=%u\n", spiffsOffset, copyLen); } } } else { - // Normal firmware update if (Update.write(data, len) != len) { String errorMsg = Update.errorString(); if (errorMsg != "No Error") { @@ -118,12 +136,10 @@ void handleOTAUpload(AsyncWebServerRequest *request, String filename, size_t ind if (isFullImage && spiffsBuffer) { Serial.println("Starting SPIFFS update"); - // Unmount SPIFFS first - if (SPIFFS.begin()) { + if (SPIFFS.begin(true)) { SPIFFS.end(); } - // Update SPIFFS if (!Update.begin(spiffsSize, U_SPIFFS)) { Serial.println("Could not begin SPIFFS update"); free(spiffsBuffer); @@ -131,6 +147,7 @@ void handleOTAUpload(AsyncWebServerRequest *request, String filename, size_t ind return; } + Serial.printf("Writing SPIFFS data: %u bytes\n", spiffsSize); if (Update.write(spiffsBuffer, spiffsSize) != spiffsSize) { Serial.println("SPIFFS Write Failed"); Update.printError(Serial); @@ -151,7 +168,6 @@ void handleOTAUpload(AsyncWebServerRequest *request, String filename, size_t ind spiffsBuffer = nullptr; Serial.println("SPIFFS update complete"); - // Verify SPIFFS if (!SPIFFS.begin(true)) { Serial.println("SPIFFS mount after update failed"); request->send(400, "application/json", "{\"status\":\"error\",\"message\":\"SPIFFS verification failed\"}"); diff --git a/src/wlan.cpp b/src/wlan.cpp index 38544e7..780dd8a 100644 --- a/src/wlan.cpp +++ b/src/wlan.cpp @@ -12,7 +12,7 @@ bool wm_nonblocking = false; void initWiFi() { WiFi.mode(WIFI_STA); // explicitly set mode, esp defaults to STA+AP - esp_wifi_set_max_tx_power(72); // Setze maximale Sendeleistung auf 20dBm + //esp_wifi_set_max_tx_power(72); // Setze maximale Sendeleistung auf 20dBm if(wm_nonblocking) wm.setConfigPortalBlocking(false); wm.setConfigPortalTimeout(320); // Portal nach 5min schließen