Compare commits
	
		
			7 Commits
		
	
	
		
			v1.2.71
			...
			e140f8e003
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| e140f8e003 | |||
| 3d0bdde476 | |||
| 3ac7d6b4f7 | |||
| 5f52775984 | |||
| 463eaf4b6f | |||
| 4bf6b11d3a | |||
| b0c4af7c4e | 
							
								
								
									
										15
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								CHANGELOG.md
									
									
									
									
									
								
							| @@ -1,5 +1,20 @@ | ||||
| # Changelog | ||||
|  | ||||
| ## [1.2.73] - 2025-02-20 | ||||
| ### Changed | ||||
| - update webpages for version v1.2.73 | ||||
| - improve OTA update process with enhanced size checks and progress logging | ||||
|  | ||||
| ### Fixed | ||||
| - enhance OTA update process with improved size checks and debugging output | ||||
|  | ||||
|  | ||||
| ## [1.2.72] - 2025-02-20 | ||||
| ### Changed | ||||
| - update webpages for version v1.2.72 | ||||
| - simplify OTA update process by removing unnecessary buffer and adjusting offsets | ||||
|  | ||||
|  | ||||
| ## [1.2.71] - 2025-02-20 | ||||
| ### Added | ||||
| - update version number to v1.2.65 in HTML files and platformio.ini; add script to create full binary | ||||
|   | ||||
| @@ -12,7 +12,7 @@ | ||||
|         <div style="display: flex; align-items: center; gap: 2rem;"> | ||||
|             <img src="/logo.png" alt="FilaMan Logo" class="logo"> | ||||
|             <div class="logo-text"> | ||||
|                 <h1>FilaMan<span class="version">v1.2.71</span></h1> | ||||
|                 <h1>FilaMan<span class="version">v1.2.73</span></h1> | ||||
|                 <h4>Filament Management Tool</h4> | ||||
|             </div> | ||||
|         </div> | ||||
|   | ||||
| @@ -12,7 +12,7 @@ | ||||
|         <div style="display: flex; align-items: center; gap: 2rem;"> | ||||
|             <img src="/logo.png" alt="FilaMan Logo" class="logo"> | ||||
|             <div class="logo-text"> | ||||
|                 <h1>FilaMan<span class="version">v1.2.71</span></h1> | ||||
|                 <h1>FilaMan<span class="version">v1.2.73</span></h1> | ||||
|                 <h4>Filament Management Tool</h4> | ||||
|             </div> | ||||
|         </div> | ||||
|   | ||||
| @@ -12,7 +12,7 @@ | ||||
|         <div style="display: flex; align-items: center; gap: 2rem;"> | ||||
|             <img src="/logo.png" alt="FilaMan Logo" class="logo"> | ||||
|             <div class="logo-text"> | ||||
|                 <h1>FilaMan<span class="version">v1.2.71</span></h1> | ||||
|                 <h1>FilaMan<span class="version">v1.2.73</span></h1> | ||||
|                 <h4>Filament Management Tool</h4> | ||||
|             </div> | ||||
|         </div> | ||||
|   | ||||
| @@ -12,7 +12,7 @@ | ||||
|         <div style="display: flex; align-items: center; gap: 2rem;"> | ||||
|             <img src="/logo.png" alt="FilaMan Logo" class="logo"> | ||||
|             <div class="logo-text"> | ||||
|                 <h1>FilaMan<span class="version">v1.2.71</span></h1> | ||||
|                 <h1>FilaMan<span class="version">v1.2.73</span></h1> | ||||
|                 <h4>Filament Management Tool</h4> | ||||
|             </div> | ||||
|         </div> | ||||
|   | ||||
| @@ -12,7 +12,7 @@ | ||||
|         <div style="display: flex; align-items: center; gap: 2rem;"> | ||||
|             <img src="/logo.png" alt="FilaMan Logo" class="logo"> | ||||
|             <div class="logo-text"> | ||||
|                 <h1>FilaMan<span class="version">v1.2.71</span></h1> | ||||
|                 <h1>FilaMan<span class="version">v1.2.73</span></h1> | ||||
|                 <h4>Filament Management Tool</h4> | ||||
|             </div> | ||||
|         </div> | ||||
|   | ||||
| @@ -12,7 +12,7 @@ | ||||
|         <div style="display: flex; align-items: center; gap: 2rem;"> | ||||
|             <img src="/logo.png" alt="FilaMan Logo" class="logo"> | ||||
|             <div class="logo-text"> | ||||
|                 <h1>FilaMan<span class="version">v1.2.71</span></h1> | ||||
|                 <h1>FilaMan<span class="version">v1.2.73</span></h1> | ||||
|                 <h4>Filament Management Tool</h4> | ||||
|             </div> | ||||
|         </div> | ||||
|   | ||||
| @@ -12,7 +12,7 @@ | ||||
|         <div style="display: flex; align-items: center; gap: 2rem;"> | ||||
|             <img src="/logo.png" alt="FilaMan Logo" class="logo"> | ||||
|             <div class="logo-text"> | ||||
|                 <h1>FilaMan<span class="version">v1.2.71</span></h1> | ||||
|                 <h1>FilaMan<span class="version">v1.2.73</span></h1> | ||||
|                 <h4>Filament Management Tool</h4> | ||||
|             </div> | ||||
|         </div> | ||||
|   | ||||
| @@ -9,7 +9,7 @@ | ||||
| ; https://docs.platformio.org/page/projectconf.html | ||||
|  | ||||
| [common] | ||||
| version = "1.2.71" | ||||
| version = "1.2.73" | ||||
|  | ||||
| [env:esp32dev] | ||||
| platform = espressif32 | ||||
| @@ -66,7 +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 | ||||
|     # scripts/create_full_bin.py  # Nicht mehr benötigt, da full.bin im Workflow erstellt wird | ||||
|  | ||||
| ; Remove or comment out the targets line | ||||
| ;targets = buildfs, build | ||||
|   | ||||
							
								
								
									
										177
									
								
								src/ota.cpp
									
									
									
									
									
								
							
							
						
						
									
										177
									
								
								src/ota.cpp
									
									
									
									
									
								
							| @@ -28,162 +28,87 @@ void handleOTAUpload(AsyncWebServerRequest *request, String filename, size_t ind | ||||
|     static size_t contentLength = 0; | ||||
|     static bool isFullImage = false; | ||||
|     static uint32_t currentOffset = 0; | ||||
|     static uint8_t *spiffsBuffer = nullptr; | ||||
|     static size_t spiffsSize = 0; | ||||
|     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 | ||||
|      | ||||
|     // Stop all tasks to save resources | ||||
|     if (!tasksAreStopped && (RfidReaderTask || BambuMqttTask || ScaleTask)) { | ||||
|         stopAllTasks(); | ||||
|         tasksAreStopped = true; | ||||
|     } | ||||
|     // Flash layout constants from partitions.csv | ||||
|     static const uint32_t FLASH_SIZE = 0x400000;    // 4MB total | ||||
|     static const uint32_t APP_SIZE = 0x1E0000;      // Size per app partition | ||||
|     static const uint32_t SPIFFS_OFFSET = 0x3D0000; // SPIFFS start | ||||
|      | ||||
|     if (!index) { | ||||
|         // Reset static variables | ||||
|         if (spiffsBuffer) { | ||||
|             free(spiffsBuffer); | ||||
|             spiffsBuffer = nullptr; | ||||
|         } | ||||
|          | ||||
|         contentLength = request->contentLength(); | ||||
|         Serial.printf("Update size: %u bytes\n", contentLength); | ||||
|         Serial.printf("Update size: %u bytes (0x%X)\n", contentLength, contentLength); | ||||
|          | ||||
|         if (contentLength == 0) { | ||||
|             request->send(400, "application/json", "{\"status\":\"error\",\"message\":\"Invalid file size\"}"); | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         if (data[0] == ESP_MAGIC) { | ||||
|             isFullImage = (contentLength > SPIFFS_START); | ||||
|         if (!tasksAreStopped && (RfidReaderTask || BambuMqttTask || ScaleTask)) { | ||||
|             stopAllTasks(); | ||||
|             tasksAreStopped = true; | ||||
|         } | ||||
|  | ||||
|             if (isFullImage) { | ||||
|                 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; | ||||
|                 } | ||||
|         isFullImage = (contentLength >= SPIFFS_OFFSET); | ||||
|          | ||||
|                 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); | ||||
|                 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"); | ||||
|         if (!isFullImage) { | ||||
|             // Regular firmware update must not exceed app partition size | ||||
|             if (contentLength > APP_SIZE) { | ||||
|                 Serial.printf("Firmware too large: 0x%X > 0x%X\n", contentLength, APP_SIZE); | ||||
|                 request->send(400, "application/json", "{\"status\":\"error\",\"message\":\"Firmware too large\"}"); | ||||
|                 return; | ||||
|             } | ||||
|              | ||||
|             if (!Update.begin(contentLength)) { | ||||
|                 Serial.printf("Not enough space for firmware: %u required\n", contentLength); | ||||
|                 request->send(400, "application/json", "{\"status\":\"error\",\"message\":\"Not enough space available\"}"); | ||||
|                 return; | ||||
|             } | ||||
|             Serial.printf("Firmware update started (size: 0x%X)\n", contentLength); | ||||
|         } else { | ||||
|             request->send(400, "application/json", "{\"status\":\"error\",\"message\":\"Invalid image format\"}"); | ||||
|             return; | ||||
|             // Full image update | ||||
|             if (contentLength > FLASH_SIZE) { | ||||
|                 Serial.printf("Image too large: 0x%X > 0x%X\n", contentLength, FLASH_SIZE); | ||||
|                 request->send(400, "application/json", "{\"status\":\"error\",\"message\":\"Image too large\"}"); | ||||
|                 return; | ||||
|             } | ||||
|              | ||||
|             if (!Update.begin(FLASH_SIZE, U_FLASH)) { | ||||
|                 Serial.println("Could not begin full image update"); | ||||
|                 request->send(400, "application/json", "{\"status\":\"error\",\"message\":\"Could not start full update\"}"); | ||||
|                 return; | ||||
|             } | ||||
|             Serial.printf("Full image update started (size: 0x%X)\n", contentLength); | ||||
|         } | ||||
|         currentOffset = 0; | ||||
|     } | ||||
|  | ||||
|     if (isFullImage) { | ||||
|         // 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; | ||||
|                 } | ||||
|             } | ||||
|     if (Update.write(data, len) != len) { | ||||
|         String errorMsg = Update.errorString(); | ||||
|         if (errorMsg != "No Error") { | ||||
|             Update.printError(Serial); | ||||
|             Serial.printf("Error at offset: 0x%X of 0x%X bytes\n", currentOffset, contentLength); | ||||
|             request->send(400, "application/json", "{\"status\":\"error\",\"message\":\"Error writing update: " + errorMsg + "\"}"); | ||||
|             return; | ||||
|         } | ||||
|     } | ||||
|      | ||||
|         // 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 - dataOffset, spiffsSize - spiffsOffset); | ||||
|                 memcpy(spiffsBuffer + spiffsOffset, data + dataOffset, copyLen); | ||||
|                 Serial.printf("Collecting SPIFFS data: offset=%u, len=%u\n", spiffsOffset, copyLen); | ||||
|             } | ||||
|         } | ||||
|     } else { | ||||
|         if (Update.write(data, len) != len) { | ||||
|             String errorMsg = Update.errorString(); | ||||
|             if (errorMsg != "No Error") { | ||||
|                 Update.printError(Serial); | ||||
|                 request->send(400, "application/json", "{\"status\":\"error\",\"message\":\"Error writing update: " + errorMsg + "\"}"); | ||||
|                 return; | ||||
|             } | ||||
|         } | ||||
|     // Progress logging | ||||
|     if ((currentOffset % 0x40000) == 0) { // Log every 256KB | ||||
|         Serial.printf("Update progress: 0x%X of 0x%X bytes (%.1f%%)\n",  | ||||
|             currentOffset,  | ||||
|             contentLength,  | ||||
|             (currentOffset * 100.0) / contentLength); | ||||
|     } | ||||
|      | ||||
|     currentOffset += len; | ||||
|      | ||||
|     if (final) { | ||||
|         if (Update.end(true)) { | ||||
|             Serial.println("Firmware update complete"); | ||||
|              | ||||
|             if (isFullImage && spiffsBuffer) { | ||||
|                 Serial.println("Starting SPIFFS update"); | ||||
|                  | ||||
|                 if (SPIFFS.begin(true)) { | ||||
|                     SPIFFS.end(); | ||||
|                 } | ||||
|                  | ||||
|                 if (!Update.begin(spiffsSize, U_SPIFFS)) { | ||||
|                     Serial.println("Could not begin SPIFFS update"); | ||||
|                     free(spiffsBuffer); | ||||
|                     request->send(400, "application/json", "{\"status\":\"error\",\"message\":\"SPIFFS update initialization failed\"}"); | ||||
|                     return; | ||||
|                 } | ||||
|                  | ||||
|                 Serial.printf("Writing SPIFFS data: %u bytes\n", spiffsSize); | ||||
|                 if (Update.write(spiffsBuffer, spiffsSize) != spiffsSize) { | ||||
|                     Serial.println("SPIFFS Write Failed"); | ||||
|                     Update.printError(Serial); | ||||
|                     free(spiffsBuffer); | ||||
|                     request->send(400, "application/json", "{\"status\":\"error\",\"message\":\"SPIFFS write failed\"}"); | ||||
|                     return; | ||||
|                 } | ||||
|                  | ||||
|                 if (!Update.end(true)) { | ||||
|                     Serial.println("SPIFFS End Failed"); | ||||
|                     Update.printError(Serial); | ||||
|                     free(spiffsBuffer); | ||||
|                     request->send(400, "application/json", "{\"status\":\"error\",\"message\":\"SPIFFS finish failed\"}"); | ||||
|                     return; | ||||
|                 } | ||||
|                  | ||||
|                 free(spiffsBuffer); | ||||
|                 spiffsBuffer = nullptr; | ||||
|                 Serial.println("SPIFFS update complete"); | ||||
|                  | ||||
|                 if (!SPIFFS.begin(true)) { | ||||
|                     Serial.println("SPIFFS mount after update failed"); | ||||
|                     request->send(400, "application/json", "{\"status\":\"error\",\"message\":\"SPIFFS verification failed\"}"); | ||||
|                     return; | ||||
|                 } | ||||
|                 SPIFFS.end(); | ||||
|             } | ||||
|              | ||||
|             Serial.printf("Update complete: 0x%X bytes written\n", currentOffset); | ||||
|             request->send(200, "application/json", "{\"status\":\"success\",\"message\":\"Update successful! Device will restart...\",\"restart\":true}"); | ||||
|             delay(1000); | ||||
|             ESP.restart(); | ||||
|         } else { | ||||
|             if (spiffsBuffer) { | ||||
|                 free(spiffsBuffer); | ||||
|                 spiffsBuffer = nullptr; | ||||
|             } | ||||
|             String errorMsg = Update.errorString(); | ||||
|             if (errorMsg != "No Error") { | ||||
|                 Update.printError(Serial); | ||||
|   | ||||
| @@ -3,6 +3,12 @@ | ||||
|  | ||||
| #include <ESPAsyncWebServer.h> | ||||
|  | ||||
| // Update size unknown constant, falls nicht bereits definiert | ||||
| #ifndef UPDATE_SIZE_UNKNOWN | ||||
| #define UPDATE_SIZE_UNKNOWN 0xFFFFFFFF | ||||
| #endif | ||||
|  | ||||
| void stopAllTasks(); | ||||
| void handleOTAUpload(AsyncWebServerRequest *request, String filename, size_t index, uint8_t *data, size_t len, bool final); | ||||
|  | ||||
| #endif | ||||
		Reference in New Issue
	
	Block a user