Compare commits
	
		
			25 Commits
		
	
	
		
			v1.3.38
			...
			adb354ddcd
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| adb354ddcd | |||
| 15d5e5edce | |||
| c6edf30245 | |||
| 65ac207f36 | |||
| 698abbd669 | |||
| 04a7c2cce3 | |||
| 78f54b72fd | |||
| f4eee9af91 | |||
| cad14b3bc2 | |||
| 312f75fc5f | |||
| b8714e93e2 | |||
| cd9da0fe4f | |||
| 2b620ef5ed | |||
| 3f63a01b8b | |||
| 22bb16b6a4 | |||
| 53ceee7816 | |||
| d48b002806 | |||
| dd905b6c6e | |||
| 77b9eda110 | |||
| 32a6e9dcd3 | |||
| 6cd5539e60 | |||
| 903b697912 | |||
| 72c2fb70c2 | |||
| f2f3f0ab9f | |||
| c07692c218 | 
							
								
								
									
										6
									
								
								.github/workflows/gitea-release.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								.github/workflows/gitea-release.yml
									
									
									
									
										vendored
									
									
								
							| @@ -40,10 +40,8 @@ jobs: | |||||||
|         # Copy firmware binary |         # Copy firmware binary | ||||||
|         cp .pio/build/esp32dev/firmware.bin .pio/build/esp32dev/upgrade_filaman_firmware_v${VERSION}.bin |         cp .pio/build/esp32dev/firmware.bin .pio/build/esp32dev/upgrade_filaman_firmware_v${VERSION}.bin | ||||||
|          |          | ||||||
|         # Create SPIFFS binary with minimal ESP32 image header |         # Create SPIFFS binary with minimal header | ||||||
|         echo -ne '\xE9\x01\x00\x00\x00\x00\x00\x00\x00\x30\x00\x00\x00\x00\x00\x00' > .pio/build/esp32dev/upgrade_filaman_website_v${VERSION}.bin |         ( printf '\xe9\x01\x00\x00' && cat .pio/build/esp32dev/spiffs.bin ) > .pio/build/esp32dev/upgrade_filaman_website_v${VERSION}.bin | ||||||
|         # Append the actual SPIFFS data |  | ||||||
|         cat .pio/build/esp32dev/spiffs.bin >> .pio/build/esp32dev/upgrade_filaman_website_v${VERSION}.bin |  | ||||||
|          |          | ||||||
|         # Create full binary |         # Create full binary | ||||||
|         (cd .pio/build/esp32dev &&  |         (cd .pio/build/esp32dev &&  | ||||||
|   | |||||||
							
								
								
									
										6
									
								
								.github/workflows/github-release.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								.github/workflows/github-release.yml
									
									
									
									
										vendored
									
									
								
							| @@ -47,10 +47,8 @@ jobs: | |||||||
|         # Copy firmware binary |         # Copy firmware binary | ||||||
|         cp .pio/build/esp32dev/firmware.bin .pio/build/esp32dev/upgrade_filaman_firmware_v${VERSION}.bin |         cp .pio/build/esp32dev/firmware.bin .pio/build/esp32dev/upgrade_filaman_firmware_v${VERSION}.bin | ||||||
|          |          | ||||||
|         # Create SPIFFS binary with minimal ESP32 image header |         # Create SPIFFS binary with minimal header | ||||||
|         echo -ne '\xE9\x01\x00\x00\x00\x00\x00\x00\x00\x30\x00\x00\x00\x00\x00\x00' > .pio/build/esp32dev/upgrade_filaman_website_v${VERSION}.bin |         ( printf '\xe9\x01\x00\x00' && cat .pio/build/esp32dev/spiffs.bin ) > .pio/build/esp32dev/upgrade_filaman_website_v${VERSION}.bin | ||||||
|         # Append the actual SPIFFS data |  | ||||||
|         cat .pio/build/esp32dev/spiffs.bin >> .pio/build/esp32dev/upgrade_filaman_website_v${VERSION}.bin |  | ||||||
|          |          | ||||||
|         # Create full binary (always) |         # Create full binary (always) | ||||||
|         (cd .pio/build/esp32dev &&  |         (cd .pio/build/esp32dev &&  | ||||||
|   | |||||||
							
								
								
									
										55
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										55
									
								
								CHANGELOG.md
									
									
									
									
									
								
							| @@ -1,5 +1,60 @@ | |||||||
| # Changelog | # Changelog | ||||||
|  |  | ||||||
|  | ## [1.3.46] - 2025-02-22 | ||||||
|  | ### Changed | ||||||
|  | - update webpages for version v1.3.46 | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ## [1.3.45] - 2025-02-22 | ||||||
|  | ### Changed | ||||||
|  | - update webpages for version v1.3.45 | ||||||
|  | - workflow: update SPIFFS binary creation to include minimal header and adjust update validation logic | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ## [1.3.44] - 2025-02-22 | ||||||
|  | ### Changed | ||||||
|  | - update webpages for version v1.3.44 | ||||||
|  | - update header title to 'Hollo Lollo Trollo' | ||||||
|  | - update header title to 'Filament Management Tool' and improve update response messages | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ## [1.3.43] - 2025-02-22 | ||||||
|  | ### Changed | ||||||
|  | - update webpages for version v1.3.43 | ||||||
|  | - update header title to 'Hollo Lollo Trollo' | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ## [1.3.42] - 2025-02-22 | ||||||
|  | ### Changed | ||||||
|  | - update webpages for version v1.3.42 | ||||||
|  |  | ||||||
|  | ### Fixed | ||||||
|  | - correct path for SPIFFS binary creation in Gitea release workflow | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ## [1.3.41] - 2025-02-22 | ||||||
|  | ### Changed | ||||||
|  | - update webpages for version v1.3.41 | ||||||
|  |  | ||||||
|  | ### Fixed | ||||||
|  | - remove redundant buffer size setting in NFC initialization | ||||||
|  | - update SPIFFS binary creation and enhance NFC buffer size | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ## [1.3.40] - 2025-02-22 | ||||||
|  | ### Changed | ||||||
|  | - update webpages for version v1.3.40 | ||||||
|  |  | ||||||
|  | ### Fixed | ||||||
|  | - update SPIFFS binary header and enhance WebSocket error handling | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ## [1.3.39] - 2025-02-22 | ||||||
|  | ### Changed | ||||||
|  | - update webpages for version v1.3.39 | ||||||
|  | - workflow: update SPIFFS binary creation to set chip version to max supported | ||||||
|  |  | ||||||
|  |  | ||||||
| ## [1.3.38] - 2025-02-22 | ## [1.3.38] - 2025-02-22 | ||||||
| ### Changed | ### Changed | ||||||
| - update webpages for version v1.3.38 | - update webpages for version v1.3.38 | ||||||
|   | |||||||
| @@ -24,7 +24,7 @@ | |||||||
|             <img src="/logo.png" alt="FilaMan Logo" class="logo"> |             <img src="/logo.png" alt="FilaMan Logo" class="logo"> | ||||||
|             <div class="logo-text"> |             <div class="logo-text"> | ||||||
|                 <h1>FilaMan<span class="version"></span></h1> |                 <h1>FilaMan<span class="version"></span></h1> | ||||||
|                 <h4>Filament Management Tool</h4> |                 <h4>Hollo Lollo Trollo</h4> | ||||||
|             </div> |             </div> | ||||||
|         </div> |         </div> | ||||||
|         <nav style="display: flex; gap: 1rem;"> |         <nav style="display: flex; gap: 1rem;"> | ||||||
|   | |||||||
| @@ -9,7 +9,7 @@ | |||||||
| ; https://docs.platformio.org/page/projectconf.html | ; https://docs.platformio.org/page/projectconf.html | ||||||
|  |  | ||||||
| [common] | [common] | ||||||
| version = "1.3.38" | version = "1.3.46" | ||||||
|  |  | ||||||
| #test | #test | ||||||
|  |  | ||||||
|   | |||||||
| @@ -19,6 +19,12 @@ | |||||||
| void setup() { | void setup() { | ||||||
|   Serial.begin(115200); |   Serial.begin(115200); | ||||||
|  |  | ||||||
|  |   uint64_t chipid; | ||||||
|  |  | ||||||
|  |   chipid = ESP.getEfuseMac(); //The chip ID is essentially its MAC address(length: 6 bytes). | ||||||
|  |   Serial.printf("ESP32 Chip ID = %04X", (uint16_t)(chipid >> 32)); //print High 2 bytes | ||||||
|  |   Serial.printf("%08X\n", (uint32_t)chipid); //print Low 4bytes. | ||||||
|  |  | ||||||
|   // Initialize SPIFFS |   // Initialize SPIFFS | ||||||
|   initializeSPIFFS(); |   initializeSPIFFS(); | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										107
									
								
								src/website.cpp
									
									
									
									
									
								
							
							
						
						
									
										107
									
								
								src/website.cpp
									
									
									
									
									
								
							| @@ -8,6 +8,7 @@ | |||||||
| #include "scale.h" | #include "scale.h" | ||||||
| #include "esp_task_wdt.h" | #include "esp_task_wdt.h" | ||||||
| #include <Update.h> | #include <Update.h> | ||||||
|  | #include "display.h" | ||||||
|  |  | ||||||
| #ifndef VERSION | #ifndef VERSION | ||||||
|   #define VERSION "1.1.0" |   #define VERSION "1.1.0" | ||||||
| @@ -32,6 +33,10 @@ void onWsEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventTyp | |||||||
|         sendWriteResult(client, 3); |         sendWriteResult(client, 3); | ||||||
|     } else if (type == WS_EVT_DISCONNECT) { |     } else if (type == WS_EVT_DISCONNECT) { | ||||||
|         Serial.println("Client getrennt."); |         Serial.println("Client getrennt."); | ||||||
|  |     } else if (type == WS_EVT_ERROR) { | ||||||
|  |         Serial.printf("WebSocket Client #%u error(%u): %s\n", client->id(), *((uint16_t*)arg), (char*)data); | ||||||
|  |     } else if (type == WS_EVT_PONG) { | ||||||
|  |         Serial.printf("WebSocket Client #%u pong\n", client->id()); | ||||||
|     } else if (type == WS_EVT_DATA) { |     } else if (type == WS_EVT_DATA) { | ||||||
|         String message = String((char*)data); |         String message = String((char*)data); | ||||||
|         JsonDocument doc; |         JsonDocument doc; | ||||||
| @@ -363,58 +368,86 @@ void setupWebserver(AsyncWebServer &server) { | |||||||
|         [](AsyncWebServerRequest *request) { |         [](AsyncWebServerRequest *request) { | ||||||
|             // Nach Update-Abschluss |             // Nach Update-Abschluss | ||||||
|             bool success = !Update.hasError(); |             bool success = !Update.hasError(); | ||||||
|  |             String message = success ? "Update successful" : String("Update failed: ") + Update.errorString(); | ||||||
|             AsyncWebServerResponse *response = request->beginResponse( |             AsyncWebServerResponse *response = request->beginResponse( | ||||||
|                 success ? 200 : 400, |                 success ? 200 : 400, | ||||||
|                 "application/json", |                 "application/json", | ||||||
|                 success ? "{\"success\":true,\"message\":\"Update successful\"}"  |                 "{\"success\":" + String(success ? "true" : "false") + ",\"message\":\"" + message + "\"}" | ||||||
|                        : "{\"success\":false,\"message\":\"Update failed\"}" |  | ||||||
|             ); |             ); | ||||||
|             response->addHeader("Connection", "close"); |             response->addHeader("Connection", "close"); | ||||||
|             request->send(response); |             request->send(response); | ||||||
|              |              | ||||||
|             if (success) { |             if (success) { | ||||||
|  |                 oledShowMessage("Upgrade successful Rebooting"); | ||||||
|                 delay(500); |                 delay(500); | ||||||
|                 ESP.restart(); |                 ESP.restart(); | ||||||
|             } |             } | ||||||
|  |             else { | ||||||
|  |                 oledShowMessage("Upgrade failed"); | ||||||
|  |             } | ||||||
|         }, |         }, | ||||||
|         [](AsyncWebServerRequest *request, const String& filename, size_t index, uint8_t *data, size_t len, bool final) { |         [](AsyncWebServerRequest *request, const String& filename, size_t index, uint8_t *data, size_t len, bool final) { | ||||||
|             static size_t updateSize = 0; |             static size_t updateSize = 0; | ||||||
|             static int command = 0; |             static int command = 0; | ||||||
|  |  | ||||||
|  |             oledShowMessage("Upgrade please wait"); | ||||||
|  |  | ||||||
|             if (!index) { |             if (!index) { | ||||||
|                 updateSize = request->contentLength(); |                 updateSize = request->contentLength(); | ||||||
|                 command = (filename.indexOf("spiffs") > -1) ? U_SPIFFS : U_FLASH; |                 command = (filename.indexOf("spiffs") > -1) ? U_SPIFFS : U_FLASH; | ||||||
|                 Serial.printf("Update Start: %s\nSize: %u\nCommand: %d\n", filename.c_str(), updateSize, command); |                 Serial.printf("Update Start: %s\nSize: %u\nCommand: %d\n", filename.c_str(), updateSize, command); | ||||||
|                  |                  | ||||||
|  |                 if (command == U_SPIFFS) { | ||||||
|  |                     Serial.println("Backup JSON configs..."); | ||||||
|  |                     backupJsonConfigs(); | ||||||
|  |                      | ||||||
|  |                     // Deaktiviere alle Validierungen für SPIFFS-Updates | ||||||
|  |                     if (!Update.begin(UPDATE_SIZE_UNKNOWN, command)) { | ||||||
|  |                         Serial.printf("Update Begin Error: %s\n", Update.errorString()); | ||||||
|  |                         restoreJsonConfigs(); | ||||||
|  |                         String errorMsg = String("Update begin failed: ") + Update.errorString(); | ||||||
|  |                         request->send(400, "application/json", "{\"success\":false,\"message\":\"" + errorMsg + "\"}"); | ||||||
|  |                         return; | ||||||
|  |                     } | ||||||
|  |                 } else { | ||||||
|  |                     // Normale Validierung für Firmware-Updates | ||||||
|                     if (!Update.begin(updateSize, command)) { |                     if (!Update.begin(updateSize, command)) { | ||||||
|                     Serial.printf("Update Begin Error: "); |                         Serial.printf("Update Begin Error: %s\n", Update.errorString()); | ||||||
|                     Update.printError(Serial); |  | ||||||
|                         String errorMsg = String("Update begin failed: ") + Update.errorString(); |                         String errorMsg = String("Update begin failed: ") + Update.errorString(); | ||||||
|                         request->send(400, "application/json", "{\"success\":false,\"message\":\"" + errorMsg + "\"}"); |                         request->send(400, "application/json", "{\"success\":false,\"message\":\"" + errorMsg + "\"}"); | ||||||
|                         return; |                         return; | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|  |             } | ||||||
|  |  | ||||||
|             if (len) { |             if (len) { | ||||||
|                 if (Update.write(data, len) != len) { |                 if (Update.write(data, len) != len) { | ||||||
|                     Serial.printf("Update Write Error: "); |                     Serial.printf("Update Write Error: %s\n", Update.errorString()); | ||||||
|                     Update.printError(Serial); |                     if (command == U_SPIFFS) { | ||||||
|  |                         restoreJsonConfigs(); | ||||||
|  |                     } | ||||||
|                     String errorMsg = String("Write failed: ") + Update.errorString(); |                     String errorMsg = String("Write failed: ") + Update.errorString(); | ||||||
|                     request->send(400, "application/json", "{\"success\":false,\"message\":\"" + errorMsg + "\"}"); |                     request->send(400, "application/json", "{\"success\":false,\"message\":\"" + errorMsg + "\"}"); | ||||||
|                     return; |                     return; | ||||||
|                 } |                 } | ||||||
|                 Serial.printf("Progress: %u/%u\r", index + len, updateSize); |                  | ||||||
|  |                 // Sende den Fortschritt als JSON | ||||||
|  |                 String progress = "{\"progress\":" + String((index + len) * 100 / updateSize) + "}"; | ||||||
|  |                 request->send(200, "application/json", progress); | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             if (final) { |             if (final) { | ||||||
|                 if (!Update.end(true)) { |                 if (!Update.end(true)) { | ||||||
|                     Serial.printf("Update End Error: "); |                     Serial.printf("Update End Error: %s\n", Update.errorString()); | ||||||
|                     Update.printError(Serial); |                     if (command == U_SPIFFS) { | ||||||
|  |                         Serial.println("Restoring JSON configs..."); | ||||||
|  |                         restoreJsonConfigs(); | ||||||
|  |                     } | ||||||
|                     String errorMsg = String("Update end failed: ") + Update.errorString(); |                     String errorMsg = String("Update end failed: ") + Update.errorString(); | ||||||
|                     request->send(400, "application/json", "{\"success\":false,\"message\":\"" + errorMsg + "\"}"); |                     request->send(400, "application/json", "{\"success\":false,\"message\":\"" + errorMsg + "\"}"); | ||||||
|                     return; |                     return; | ||||||
|                 } |                 } | ||||||
|                 Serial.printf("\nUpdate Success: %uB\n", index+len); |                 Serial.println("Update Success!"); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     ); |     ); | ||||||
| @@ -442,60 +475,6 @@ void setupWebserver(AsyncWebServer &server) { | |||||||
|     Serial.println("Webserver gestartet"); |     Serial.println("Webserver gestartet"); | ||||||
| } | } | ||||||
|  |  | ||||||
| void handleOTAUpload(AsyncWebServerRequest *request, const String& filename, size_t index, uint8_t *data, size_t len, bool final) { |  | ||||||
|     static bool isSpiffsUpdate = false; |  | ||||||
|     if (!index) { |  | ||||||
|         // Start eines neuen Uploads |  | ||||||
|         Serial.println("Update Start: " + filename); |  | ||||||
|          |  | ||||||
|         // Überprüfe den Dateityp basierend auf dem Dateinamen |  | ||||||
|         bool isFirmware = filename.startsWith("filaman_"); |  | ||||||
|         isSpiffsUpdate = filename.startsWith("webpage_"); |  | ||||||
|          |  | ||||||
|         if (!isFirmware && !isSpiffsUpdate) { |  | ||||||
|             request->send(400, "application/json", "{\"message\":\"Invalid file type. File must start with 'filaman_' or 'webpage_'\"}"); |  | ||||||
|             return; |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         // Wähle den Update-Typ basierend auf dem Dateinamen |  | ||||||
|         if (isSpiffsUpdate) { |  | ||||||
|             if (!Update.begin(SPIFFS.totalBytes(), U_SPIFFS)) { |  | ||||||
|                 Update.printError(Serial); |  | ||||||
|                 request->send(400, "application/json", "{\"message\":\"SPIFFS Update failed: " + String(Update.errorString()) + "\"}"); |  | ||||||
|                 return; |  | ||||||
|             } |  | ||||||
|             // Backup JSON configs before SPIFFS update |  | ||||||
|             backupJsonConfigs(); |  | ||||||
|         } else { |  | ||||||
|             if (!Update.begin(UPDATE_SIZE_UNKNOWN, U_FLASH)) { |  | ||||||
|                 Update.printError(Serial); |  | ||||||
|                 request->send(400, "application/json", "{\"message\":\"Firmware Update failed: " + String(Update.errorString()) + "\"}"); |  | ||||||
|                 return; |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     if (Update.write(data, len) != len) { |  | ||||||
|         Update.printError(Serial); |  | ||||||
|         request->send(400, "application/json", "{\"message\":\"Write failed: " + String(Update.errorString()) + "\"}"); |  | ||||||
|         return; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     if (final) { |  | ||||||
|         if (!Update.end(true)) { |  | ||||||
|             Update.printError(Serial); |  | ||||||
|             request->send(400, "application/json", "{\"message\":\"Update failed: " + String(Update.errorString()) + "\"}"); |  | ||||||
|             return; |  | ||||||
|         } |  | ||||||
|         if (isSpiffsUpdate) { |  | ||||||
|             // Restore JSON configs after SPIFFS update |  | ||||||
|             restoreJsonConfigs(); |  | ||||||
|         } |  | ||||||
|         request->send(200, "application/json", "{\"message\":\"Update successful!\", \"restart\": true}"); |  | ||||||
|         delay(500); |  | ||||||
|         ESP.restart(); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void backupJsonConfigs() { | void backupJsonConfigs() { | ||||||
|     const char* configs[] = {"/bambu_credentials.json", "/spoolman_url.json"}; |     const char* configs[] = {"/bambu_credentials.json", "/spoolman_url.json"}; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user