Compare commits
	
		
			22 Commits
		
	
	
		
			v1.3.40
			...
			e564c6eeae
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| e564c6eeae | |||
| 4288dd0cd4 | |||
| 37d43b2d7d | |||
| adb354ddcd | |||
| 15d5e5edce | |||
| c6edf30245 | |||
| 65ac207f36 | |||
| 698abbd669 | |||
| 04a7c2cce3 | |||
| 78f54b72fd | |||
| f4eee9af91 | |||
| cad14b3bc2 | |||
| 312f75fc5f | |||
| b8714e93e2 | |||
| cd9da0fe4f | |||
| 2b620ef5ed | |||
| 3f63a01b8b | |||
| 22bb16b6a4 | |||
| 53ceee7816 | |||
| d48b002806 | |||
| dd905b6c6e | |||
| 77b9eda110 | 
							
								
								
									
										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 (chip version set to max supported) |         # 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' && 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 2>/dev/null |  | ||||||
|          |          | ||||||
|         # 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 (chip version set to max supported) |         # 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 2>/dev/null |  | ||||||
|          |          | ||||||
|         # Create full binary (always) |         # Create full binary (always) | ||||||
|         (cd .pio/build/esp32dev &&  |         (cd .pio/build/esp32dev &&  | ||||||
|   | |||||||
							
								
								
									
										47
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										47
									
								
								CHANGELOG.md
									
									
									
									
									
								
							| @@ -1,5 +1,52 @@ | |||||||
| # Changelog | # Changelog | ||||||
|  |  | ||||||
|  | ## [1.3.47] - 2025-02-22 | ||||||
|  | ### Changed | ||||||
|  | - update webpages for version v1.3.47 | ||||||
|  | - workflow: optimize firmware and SPIFFS update process, improve progress handling and logging | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ## [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 | ## [1.3.40] - 2025-02-22 | ||||||
| ### Changed | ### Changed | ||||||
| - update webpages for version v1.3.40 | - update webpages for version v1.3.40 | ||||||
|   | |||||||
| @@ -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;"> | ||||||
|   | |||||||
| @@ -189,13 +189,6 @@ | |||||||
|  |  | ||||||
|             const xhr = new XMLHttpRequest(); |             const xhr = new XMLHttpRequest(); | ||||||
|             xhr.open('POST', '/update', true); |             xhr.open('POST', '/update', true); | ||||||
|             xhr.upload.onprogress = (e) => { |  | ||||||
|                 if (e.lengthComputable) { |  | ||||||
|                     const percentComplete = (e.loaded / e.total) * 100; |  | ||||||
|                     progress.style.width = percentComplete + '%'; |  | ||||||
|                     progress.textContent = Math.round(percentComplete) + '%'; |  | ||||||
|                 } |  | ||||||
|             }; |  | ||||||
|  |  | ||||||
|             xhr.onload = function() { |             xhr.onload = function() { | ||||||
|                 try { |                 try { | ||||||
| @@ -203,41 +196,27 @@ | |||||||
|                     try { |                     try { | ||||||
|                         const jsonResponse = JSON.parse(response); |                         const jsonResponse = JSON.parse(response); | ||||||
|                          |                          | ||||||
|                         // Handle progress updates |                         // Zeige finale Nachricht | ||||||
|                         if (jsonResponse.progress !== undefined) { |                         status.textContent = jsonResponse.message || "Update complete"; | ||||||
|                             const percent = jsonResponse.progress; |                         status.classList.add(jsonResponse.success ? 'success' : 'error'); | ||||||
|                             progress.style.width = percent + '%'; |                         status.style.display = 'block'; | ||||||
|                             progress.textContent = Math.round(percent) + '%'; |  | ||||||
|                             return; |  | ||||||
|                         } |  | ||||||
|                          |                          | ||||||
|                         // Handle success/error messages |                         if (jsonResponse.success) { | ||||||
|                         response = jsonResponse.message; |                             progress.style.width = '100%'; | ||||||
|  |                             progress.textContent = '100%'; | ||||||
|                              |                              | ||||||
|                         if (jsonResponse.restart) { |                             // Automatischer Neustart nach erfolgreicher Aktualisierung | ||||||
|                             status.textContent = response + " Redirecting in 20 seconds..."; |                             status.textContent = "Update successful! Restarting device..."; | ||||||
|                             let countdown = 20; |                             setTimeout(() => { | ||||||
|                             const timer = setInterval(() => { |                                 window.location.reload(); | ||||||
|                                 countdown--; |                             }, 5000); | ||||||
|                                 if (countdown <= 0) { |  | ||||||
|                                     clearInterval(timer); |  | ||||||
|                                     window.location.href = '/'; |  | ||||||
|                         } else { |                         } else { | ||||||
|                                     status.textContent = response + ` Redirecting in ${countdown} seconds...`; |                             document.querySelectorAll('form input[type=submit]').forEach(btn => btn.disabled = false); | ||||||
|                                 } |  | ||||||
|                             }, 1000); |  | ||||||
|                         } |                         } | ||||||
|                     } catch (e) { |                     } catch (e) { | ||||||
|                         console.error('JSON parse error:', e); |                         console.error('JSON parse error:', e); | ||||||
|                         status.textContent = 'Update failed: Invalid response from server'; |                         status.textContent = 'Update failed: Invalid response from server'; | ||||||
|                         status.classList.add('error'); |                         status.classList.add('error'); | ||||||
|                     } |  | ||||||
|                      |  | ||||||
|                     status.textContent = response; |  | ||||||
|                     status.classList.add(xhr.status === 200 ? 'success' : 'error'); |  | ||||||
|                     status.style.display = 'block'; |  | ||||||
|                      |  | ||||||
|                     if (xhr.status !== 200) { |  | ||||||
|                         document.querySelectorAll('form input[type=submit]').forEach(btn => btn.disabled = false); |                         document.querySelectorAll('form input[type=submit]').forEach(btn => btn.disabled = false); | ||||||
|                     } |                     } | ||||||
|                 } catch (error) { |                 } catch (error) { | ||||||
|   | |||||||
| @@ -9,7 +9,7 @@ | |||||||
| ; https://docs.platformio.org/page/projectconf.html | ; https://docs.platformio.org/page/projectconf.html | ||||||
|  |  | ||||||
| [common] | [common] | ||||||
| version = "1.3.40" | version = "1.3.47" | ||||||
|  |  | ||||||
| #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(); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -7,6 +7,7 @@ | |||||||
| #include "nfc.h" | #include "nfc.h" | ||||||
| #include "scale.h" | #include "scale.h" | ||||||
| #include "esp_task_wdt.h" | #include "esp_task_wdt.h" | ||||||
|  | #include "esp_log.h" | ||||||
| #include <Update.h> | #include <Update.h> | ||||||
| #include "display.h" | #include "display.h" | ||||||
|  |  | ||||||
| @@ -368,11 +369,11 @@ 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); | ||||||
| @@ -392,32 +393,40 @@ void setupWebserver(AsyncWebServer &server) { | |||||||
|  |  | ||||||
|             oledShowMessage("Upgrade please wait"); |             oledShowMessage("Upgrade please wait"); | ||||||
|  |  | ||||||
|             // TODO: Backup |  | ||||||
|  |  | ||||||
|             if (!index) { |             if (!index) { | ||||||
|  |                 // Reduziere Debug-Level während des Updates | ||||||
|  |                 esp_log_level_set("*", ESP_LOG_ERROR); | ||||||
|  |                  | ||||||
|                 updateSize = request->contentLength(); |                 updateSize = request->contentLength(); | ||||||
|                 command = (filename.indexOf("spiffs") > -1) ? U_SPIFFS : U_FLASH; |                 command = (filename.indexOf("spiffs") > -1) ? U_SPIFFS : U_FLASH; | ||||||
|                  |                  | ||||||
|                 if (command == U_SPIFFS) { |                 if (command == U_SPIFFS) { | ||||||
|                     // Backup JSON config files before SPIFFS update |                     oledShowMessage("SPIFFS Update..."); | ||||||
|                     backupJsonConfigs(); |                     backupJsonConfigs(); | ||||||
|                 } |  | ||||||
|                      |                      | ||||||
|                     if (!Update.begin(updateSize, command)) { |                     if (!Update.begin(updateSize, command)) { | ||||||
|                     if (command == U_SPIFFS) { |  | ||||||
|                         // Restore JSON config files if update fails at start |  | ||||||
|                         restoreJsonConfigs(); |                         restoreJsonConfigs(); | ||||||
|                     } |  | ||||||
|                         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 + "\"}"); | ||||||
|  |                         // Stelle Debug-Level wieder her | ||||||
|  |                         esp_log_level_set("*", ESP_LOG_INFO); | ||||||
|                         return; |                         return; | ||||||
|                     } |                     } | ||||||
|  |                 } else { | ||||||
|  |                     oledShowMessage("Firmware Update..."); | ||||||
|  |                     if (!Update.begin(updateSize, command)) { | ||||||
|  |                         String errorMsg = String("Update begin failed: ") + Update.errorString(); | ||||||
|  |                         request->send(400, "application/json", "{\"success\":false,\"message\":\"" + errorMsg + "\"}"); | ||||||
|  |                         // Stelle Debug-Level wieder her | ||||||
|  |                         esp_log_level_set("*", ESP_LOG_INFO); | ||||||
|  |                         return; | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             if (len) { |             if (len) { | ||||||
|                 if (Update.write(data, len) != len) { |                 if (Update.write(data, len) != len) { | ||||||
|                     if (command == U_SPIFFS) { |                     if (command == U_SPIFFS) { | ||||||
|                         // Restore JSON config files if update fails during write |  | ||||||
|                         restoreJsonConfigs(); |                         restoreJsonConfigs(); | ||||||
|                     } |                     } | ||||||
|                     String errorMsg = String("Write failed: ") + Update.errorString(); |                     String errorMsg = String("Write failed: ") + Update.errorString(); | ||||||
| @@ -425,21 +434,28 @@ void setupWebserver(AsyncWebServer &server) { | |||||||
|                     return; |                     return; | ||||||
|                 } |                 } | ||||||
|                  |                  | ||||||
|                 // Sende den Fortschritt als JSON, um unerwünschte Zeilenumbrüche zu vermeiden |                 // Update OLED Display alle 25% | ||||||
|                 String progress = "{\"progress\":" + String((index + len) * 100 / updateSize) + "}"; |                 static int lastProgress = -1; | ||||||
|                 request->send(200, "application/json", progress); |                 int currentProgress = (index + len) * 100 / updateSize; | ||||||
|  |                 if (currentProgress % 25 == 0 && currentProgress != lastProgress) { | ||||||
|  |                     lastProgress = currentProgress; | ||||||
|  |                     oledShowMessage(String(currentProgress) + "% complete"); | ||||||
|  |                 } | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             if (final) { |             if (final) { | ||||||
|                 if (!Update.end(true)) { |                 if (!Update.end(true)) { | ||||||
|                     if (command == U_SPIFFS) { |                     if (command == U_SPIFFS) { | ||||||
|                         // Restore JSON config files if update fails at end |  | ||||||
|                         restoreJsonConfigs(); |                         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 + "\"}"); | ||||||
|  |                     // Stelle Debug-Level wieder her | ||||||
|  |                     esp_log_level_set("*", ESP_LOG_INFO); | ||||||
|                     return; |                     return; | ||||||
|                 } |                 } | ||||||
|  |                 // Stelle Debug-Level wieder her | ||||||
|  |                 esp_log_level_set("*", ESP_LOG_INFO); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     ); |     ); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user