Compare commits
	
		
			24 Commits
		
	
	
		
			v1.2.82
			...
			cefa81030b
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| cefa81030b | |||
| 62052927d2 | |||
| 933a84f8ce | |||
| db3c19ff2e | |||
| ae9eb4cc6b | |||
| 89d40832c5 | |||
| c161216c04 | |||
| 6a016b6ac4 | |||
| 44dd485e17 | |||
| d41f0f3e67 | |||
| 484058515e | |||
| f552b492cf | |||
| c3040b3c29 | |||
| d7ba67085d | |||
| 48efb9e21a | |||
| e983ba6e44 | |||
| 37171d6eca | |||
| ebb08a7a66 | |||
| b5330af351 | |||
| 4919d34484 | |||
| 2da641d604 | |||
| ce413965c7 | |||
| 3fafed930e | |||
| e1c604ee8d | 
							
								
								
									
										51
									
								
								.github/workflows/providers/gitea-release.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										51
									
								
								.github/workflows/providers/gitea-release.yml
									
									
									
									
										vendored
									
									
								
							@@ -32,42 +32,49 @@ jobs:
 | 
				
			|||||||
        python -m pip install --upgrade pip
 | 
					        python -m pip install --upgrade pip
 | 
				
			||||||
        pip install --upgrade platformio esptool
 | 
					        pip install --upgrade platformio esptool
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					    - name: Install xxd
 | 
				
			||||||
 | 
					      run: |
 | 
				
			||||||
 | 
					        sudo apt-get update
 | 
				
			||||||
 | 
					        sudo apt-get install xxd
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
    - name: Build Firmware
 | 
					    - name: Build Firmware
 | 
				
			||||||
      run: |
 | 
					      run: |
 | 
				
			||||||
        pio run -e esp32dev_ota -t buildfs  # Build SPIFFS
 | 
					        pio run -e esp32dev -t buildfs  # Build SPIFFS
 | 
				
			||||||
        pio run -e esp32dev_ota            # Build firmware
 | 
					        pio run -e esp32dev            # Build firmware
 | 
				
			||||||
        cp .pio/build/esp32dev_ota/firmware.bin .pio/build/esp32dev_ota/filaman.bin
 | 
					        cp .pio/build/esp32dev/firmware.bin .pio/build/esp32dev/filaman.bin
 | 
				
			||||||
        cp .pio/build/esp32dev_ota/spiffs.bin .pio/build/esp32dev_ota/filaman_spiffs.bin
 | 
					        cp .pio/build/esp32dev/spiffs.bin .pio/build/esp32dev/filaman_spiffs.bin
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
    - name: Prepare binaries
 | 
					    - name: Prepare binaries
 | 
				
			||||||
      run: |
 | 
					      run: |
 | 
				
			||||||
        cd .pio/build/esp32dev_ota
 | 
					        # Ensure we're in the project root
 | 
				
			||||||
 | 
					        cd $GITHUB_WORKSPACE
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        # Create OTA binary (already has correct magic byte)
 | 
					        # Create SPIFFS directory if it doesn't exist
 | 
				
			||||||
        cp firmware.bin filaman_ota.bin
 | 
					        mkdir -p .pio/build/esp32dev/spiffs
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        # Create a magic byte prepended binary for the bootloader
 | 
					        # Copy firmware to SPIFFS directory
 | 
				
			||||||
        echo -ne '\xE9' > bootloader_with_magic.bin
 | 
					        cp .pio/build/esp32dev/firmware.bin .pio/build/esp32dev/spiffs/firmware.bin
 | 
				
			||||||
        cat bootloader.bin >> bootloader_with_magic.bin
 | 
					 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        echo "Creating full binary with magic byte..."
 | 
					        # Build new SPIFFS image with firmware included
 | 
				
			||||||
 | 
					        pio run -t buildfs
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        cd .pio/build/esp32dev
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        # Create release files
 | 
				
			||||||
 | 
					        cp spiffs.bin filaman_spiffs.bin
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        # Create full binary
 | 
				
			||||||
 | 
					        echo "Creating full binary..."
 | 
				
			||||||
        esptool.py --chip esp32 merge_bin \
 | 
					        esptool.py --chip esp32 merge_bin \
 | 
				
			||||||
          --fill-flash-size 4MB \
 | 
					          --fill-flash-size 4MB \
 | 
				
			||||||
          --flash_mode dio \
 | 
					          --flash_mode dio \
 | 
				
			||||||
          --flash_freq 40m \
 | 
					          --flash_freq 40m \
 | 
				
			||||||
          --flash_size 4MB \
 | 
					          --flash_size 4MB \
 | 
				
			||||||
          -o filaman_full.bin \
 | 
					          -o filaman_full.bin \
 | 
				
			||||||
          0x0000 bootloader_with_magic.bin \
 | 
					          0x0000 bootloader.bin \
 | 
				
			||||||
          0x8000 partitions.bin \
 | 
					          0x8000 partitions.bin \
 | 
				
			||||||
          0x10000 firmware.bin \
 | 
					          0x10000 firmware.bin \
 | 
				
			||||||
          0x3D0000 spiffs.bin
 | 
					          0x390000 spiffs.bin
 | 
				
			||||||
        
 | 
					 | 
				
			||||||
        # Verify magic bytes
 | 
					 | 
				
			||||||
        echo "Checking magic bytes:"
 | 
					 | 
				
			||||||
        echo "OTA binary first bytes:"
 | 
					 | 
				
			||||||
        hexdump -C -n 16 filaman_ota.bin
 | 
					 | 
				
			||||||
        echo "Full binary first bytes:"
 | 
					 | 
				
			||||||
        hexdump -C -n 16 filaman_full.bin
 | 
					 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        # Verify file sizes
 | 
					        # Verify file sizes
 | 
				
			||||||
        echo "File sizes:"
 | 
					        echo "File sizes:"
 | 
				
			||||||
@@ -99,8 +106,8 @@ jobs:
 | 
				
			|||||||
          echo "Release created with ID: $RELEASE_ID"
 | 
					          echo "Release created with ID: $RELEASE_ID"
 | 
				
			||||||
          
 | 
					          
 | 
				
			||||||
          # Upload binaries
 | 
					          # Upload binaries
 | 
				
			||||||
          cd .pio/build/esp32dev_ota
 | 
					          cd .pio/build/esp32dev
 | 
				
			||||||
          for file in filaman_full.bin filaman_ota.bin filaman.bin filaman_spiffs.bin; do
 | 
					          for file in filaman_ota.bin filaman_spiffs.bin filaman_full.bin; do
 | 
				
			||||||
            echo "Uploading $file..."
 | 
					            echo "Uploading $file..."
 | 
				
			||||||
            curl -k -s \
 | 
					            curl -k -s \
 | 
				
			||||||
              -X POST \
 | 
					              -X POST \
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										52
									
								
								.github/workflows/providers/github-release.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										52
									
								
								.github/workflows/providers/github-release.yml
									
									
									
									
										vendored
									
									
								
							@@ -21,42 +21,49 @@ jobs:
 | 
				
			|||||||
        python -m pip install --upgrade pip
 | 
					        python -m pip install --upgrade pip
 | 
				
			||||||
        pip install --upgrade platformio esptool
 | 
					        pip install --upgrade platformio esptool
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					    - name: Install xxd
 | 
				
			||||||
 | 
					      run: |
 | 
				
			||||||
 | 
					        sudo apt-get update
 | 
				
			||||||
 | 
					        sudo apt-get install xxd
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
    - name: Build Firmware
 | 
					    - name: Build Firmware
 | 
				
			||||||
      run: |
 | 
					      run: |
 | 
				
			||||||
        pio run -e esp32dev_ota -t buildfs  # Build SPIFFS
 | 
					        pio run -e esp32dev -t buildfs  # Build SPIFFS
 | 
				
			||||||
        pio run -e esp32dev_ota            # Build firmware
 | 
					        pio run -e esp32dev            # Build firmware
 | 
				
			||||||
        cp .pio/build/esp32dev_ota/firmware.bin .pio/build/esp32dev_ota/filaman.bin
 | 
					        cp .pio/build/esp32dev/firmware.bin .pio/build/esp32dev/filaman.bin
 | 
				
			||||||
        cp .pio/build/esp32dev_ota/spiffs.bin .pio/build/esp32dev_ota/filaman_spiffs.bin
 | 
					        cp .pio/build/esp32dev/spiffs.bin .pio/build/esp32dev/filaman_spiffs.bin
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
    - name: Prepare binaries
 | 
					    - name: Prepare binaries
 | 
				
			||||||
      run: |
 | 
					      run: |
 | 
				
			||||||
        cd .pio/build/esp32dev_ota
 | 
					        # Ensure we're in the project root
 | 
				
			||||||
 | 
					        cd $GITHUB_WORKSPACE
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        # Create OTA binary (already has correct magic byte)
 | 
					        # Create SPIFFS directory if it doesn't exist
 | 
				
			||||||
        cp firmware.bin filaman_ota.bin
 | 
					        mkdir -p .pio/build/esp32dev/spiffs
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        # Create a magic byte prepended binary for the bootloader
 | 
					        # Copy firmware to SPIFFS directory
 | 
				
			||||||
        echo -ne '\xE9' > bootloader_with_magic.bin
 | 
					        cp .pio/build/esp32dev/firmware.bin .pio/build/esp32dev/spiffs/firmware.bin
 | 
				
			||||||
        cat bootloader.bin >> bootloader_with_magic.bin
 | 
					 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        echo "Creating full binary with magic byte..."
 | 
					        # Build new SPIFFS image with firmware included
 | 
				
			||||||
 | 
					        pio run -t buildfs
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        cd .pio/build/esp32dev
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        # Create release files
 | 
				
			||||||
 | 
					        cp spiffs.bin filaman_spiffs.bin
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        # Create full binary
 | 
				
			||||||
 | 
					        echo "Creating full binary..."
 | 
				
			||||||
        esptool.py --chip esp32 merge_bin \
 | 
					        esptool.py --chip esp32 merge_bin \
 | 
				
			||||||
          --fill-flash-size 4MB \
 | 
					          --fill-flash-size 4MB \
 | 
				
			||||||
          --flash_mode dio \
 | 
					          --flash_mode dio \
 | 
				
			||||||
          --flash_freq 40m \
 | 
					          --flash_freq 40m \
 | 
				
			||||||
          --flash_size 4MB \
 | 
					          --flash_size 4MB \
 | 
				
			||||||
          -o filaman_full.bin \
 | 
					          -o filaman_full.bin \
 | 
				
			||||||
          0x0000 bootloader_with_magic.bin \
 | 
					          0x0000 bootloader.bin \
 | 
				
			||||||
          0x8000 partitions.bin \
 | 
					          0x8000 partitions.bin \
 | 
				
			||||||
          0x10000 firmware.bin \
 | 
					          0x10000 firmware.bin \
 | 
				
			||||||
          0x3D0000 spiffs.bin
 | 
					          0x390000 spiffs.bin
 | 
				
			||||||
        
 | 
					 | 
				
			||||||
        # Verify magic bytes
 | 
					 | 
				
			||||||
        echo "Checking magic bytes:"
 | 
					 | 
				
			||||||
        echo "OTA binary first bytes:"
 | 
					 | 
				
			||||||
        hexdump -C -n 16 filaman_ota.bin
 | 
					 | 
				
			||||||
        echo "Full binary first bytes:"
 | 
					 | 
				
			||||||
        hexdump -C -n 16 filaman_full.bin
 | 
					 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        # Verify file sizes
 | 
					        # Verify file sizes
 | 
				
			||||||
        echo "File sizes:"
 | 
					        echo "File sizes:"
 | 
				
			||||||
@@ -83,7 +90,4 @@ jobs:
 | 
				
			|||||||
        gh release create "${{ github.ref_name }}" \
 | 
					        gh release create "${{ github.ref_name }}" \
 | 
				
			||||||
          --title "Release ${{ steps.get_version.outputs.VERSION }}" \
 | 
					          --title "Release ${{ steps.get_version.outputs.VERSION }}" \
 | 
				
			||||||
          --notes "${{ steps.changelog.outputs.CHANGES }}" \
 | 
					          --notes "${{ steps.changelog.outputs.CHANGES }}" \
 | 
				
			||||||
          .pio/build/esp32dev_ota/filaman_full.bin \
 | 
					          .pio/build/esp32dev/filaman_full.bin
 | 
				
			||||||
          .pio/build/esp32dev_ota/filaman_ota.bin \
 | 
					 | 
				
			||||||
          .pio/build/esp32dev_ota/filaman.bin \
 | 
					 | 
				
			||||||
          .pio/build/esp32dev_ota/filaman_spiffs.bin
 | 
					 | 
				
			||||||
							
								
								
									
										56
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										56
									
								
								CHANGELOG.md
									
									
									
									
									
								
							@@ -1,5 +1,61 @@
 | 
				
			|||||||
# Changelog
 | 
					# Changelog
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## [1.2.90] - 2025-02-20
 | 
				
			||||||
 | 
					### Changed
 | 
				
			||||||
 | 
					- update webpages for version v1.2.90
 | 
				
			||||||
 | 
					- update Gitea and GitHub release workflows to include SPIFFS directory creation and firmware copying
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## [1.2.89] - 2025-02-20
 | 
				
			||||||
 | 
					### Changed
 | 
				
			||||||
 | 
					- update webpages for version v1.2.89
 | 
				
			||||||
 | 
					- enhance OTA update process with SPIFFS support and improved error handling
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## [1.2.88] - 2025-02-20
 | 
				
			||||||
 | 
					### Changed
 | 
				
			||||||
 | 
					- update webpages for version v1.2.88
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Fixed
 | 
				
			||||||
 | 
					- improve OTA update handling and logging for better error reporting
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## [1.2.87] - 2025-02-20
 | 
				
			||||||
 | 
					### Changed
 | 
				
			||||||
 | 
					- update webpages for version v1.2.87
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Fixed
 | 
				
			||||||
 | 
					- update firmware build process and remove unused OTA environment
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## [1.2.86] - 2025-02-20
 | 
				
			||||||
 | 
					### Changed
 | 
				
			||||||
 | 
					- update webpages for version v1.2.86
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Fixed
 | 
				
			||||||
 | 
					- update SPIFFS offset and size in release workflows and partitions.csv
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## [1.2.85] - 2025-02-20
 | 
				
			||||||
 | 
					### Added
 | 
				
			||||||
 | 
					- ci: streamline release workflows by removing unnecessary binary uploads and adding SPIFFS formatting
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Changed
 | 
				
			||||||
 | 
					- update webpages for version v1.2.85
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## [1.2.84] - 2025-02-20
 | 
				
			||||||
 | 
					### Changed
 | 
				
			||||||
 | 
					- update webpages for version v1.2.84
 | 
				
			||||||
 | 
					- ci: update installation steps for xxd to include package list update
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## [1.2.83] - 2025-02-20
 | 
				
			||||||
 | 
					### Changed
 | 
				
			||||||
 | 
					- update webpages for version v1.2.83
 | 
				
			||||||
 | 
					- replace hexdump with xxd for magic byte verification in release workflows
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## [1.2.82] - 2025-02-20
 | 
					## [1.2.82] - 2025-02-20
 | 
				
			||||||
### Changed
 | 
					### Changed
 | 
				
			||||||
- update webpages for version v1.2.82
 | 
					- update webpages for version v1.2.82
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -12,7 +12,7 @@
 | 
				
			|||||||
        <div style="display: flex; align-items: center; gap: 2rem;">
 | 
					        <div style="display: flex; align-items: center; gap: 2rem;">
 | 
				
			||||||
            <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">v1.2.82</span></h1>
 | 
					                <h1>FilaMan<span class="version">v1.2.90</span></h1>
 | 
				
			||||||
                <h4>Filament Management Tool</h4>
 | 
					                <h4>Filament Management Tool</h4>
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -12,7 +12,7 @@
 | 
				
			|||||||
        <div style="display: flex; align-items: center; gap: 2rem;">
 | 
					        <div style="display: flex; align-items: center; gap: 2rem;">
 | 
				
			||||||
            <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">v1.2.82</span></h1>
 | 
					                <h1>FilaMan<span class="version">v1.2.90</span></h1>
 | 
				
			||||||
                <h4>Filament Management Tool</h4>
 | 
					                <h4>Filament Management Tool</h4>
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -12,7 +12,7 @@
 | 
				
			|||||||
        <div style="display: flex; align-items: center; gap: 2rem;">
 | 
					        <div style="display: flex; align-items: center; gap: 2rem;">
 | 
				
			||||||
            <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">v1.2.82</span></h1>
 | 
					                <h1>FilaMan<span class="version">v1.2.90</span></h1>
 | 
				
			||||||
                <h4>Filament Management Tool</h4>
 | 
					                <h4>Filament Management Tool</h4>
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -12,7 +12,7 @@
 | 
				
			|||||||
        <div style="display: flex; align-items: center; gap: 2rem;">
 | 
					        <div style="display: flex; align-items: center; gap: 2rem;">
 | 
				
			||||||
            <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">v1.2.82</span></h1>
 | 
					                <h1>FilaMan<span class="version">v1.2.90</span></h1>
 | 
				
			||||||
                <h4>Filament Management Tool</h4>
 | 
					                <h4>Filament Management Tool</h4>
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -12,7 +12,7 @@
 | 
				
			|||||||
        <div style="display: flex; align-items: center; gap: 2rem;">
 | 
					        <div style="display: flex; align-items: center; gap: 2rem;">
 | 
				
			||||||
            <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">v1.2.82</span></h1>
 | 
					                <h1>FilaMan<span class="version">v1.2.90</span></h1>
 | 
				
			||||||
                <h4>Filament Management Tool</h4>
 | 
					                <h4>Filament Management Tool</h4>
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -12,7 +12,7 @@
 | 
				
			|||||||
        <div style="display: flex; align-items: center; gap: 2rem;">
 | 
					        <div style="display: flex; align-items: center; gap: 2rem;">
 | 
				
			||||||
            <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">v1.2.82</span></h1>
 | 
					                <h1>FilaMan<span class="version">v1.2.90</span></h1>
 | 
				
			||||||
                <h4>Filament Management Tool</h4>
 | 
					                <h4>Filament Management Tool</h4>
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -12,7 +12,7 @@
 | 
				
			|||||||
        <div style="display: flex; align-items: center; gap: 2rem;">
 | 
					        <div style="display: flex; align-items: center; gap: 2rem;">
 | 
				
			||||||
            <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">v1.2.82</span></h1>
 | 
					                <h1>FilaMan<span class="version">v1.2.90</span></h1>
 | 
				
			||||||
                <h4>Filament Management Tool</h4>
 | 
					                <h4>Filament Management Tool</h4>
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
# Name,   Type, SubType,    Offset,   Size,     Flags
 | 
					# Name,   Type, SubType,    Offset,   Size,     Flags
 | 
				
			||||||
nvs,      data, nvs,       0x9000,   0x5000,
 | 
					nvs,      data, nvs,       0x9000,   0x5000,
 | 
				
			||||||
otadata,  data, ota,       0xe000,   0x2000,
 | 
					otadata,  data, ota,       0xe000,   0x2000,
 | 
				
			||||||
app0,     app,  ota_0,     0x10000,  0x1E0000,
 | 
					app0,     app,  ota_0,     0x10000,  0x1C0000,
 | 
				
			||||||
app1,     app,  ota_1,     0x1F0000, 0x1E0000,
 | 
					app1,     app,  ota_1,     0x1D0000, 0x1C0000,
 | 
				
			||||||
spiffs,   data, spiffs,    0x3D0000, 0x30000,
 | 
					spiffs,   data, spiffs,    0x390000, 0x60000,
 | 
				
			||||||
		
		
			
  | 
@@ -9,7 +9,7 @@
 | 
				
			|||||||
; https://docs.platformio.org/page/projectconf.html
 | 
					; https://docs.platformio.org/page/projectconf.html
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[common]
 | 
					[common]
 | 
				
			||||||
version = "1.2.82"
 | 
					version = "1.2.90"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[env:esp32dev]
 | 
					[env:esp32dev]
 | 
				
			||||||
platform = espressif32
 | 
					platform = espressif32
 | 
				
			||||||
@@ -45,74 +45,7 @@ build_flags =
 | 
				
			|||||||
    -mtext-section-literals
 | 
					    -mtext-section-literals
 | 
				
			||||||
    '-D VERSION="${common.version}"'
 | 
					    '-D VERSION="${common.version}"'
 | 
				
			||||||
    -DASYNCWEBSERVER_REGEX
 | 
					    -DASYNCWEBSERVER_REGEX
 | 
				
			||||||
    -DCORE_DEBUG_LEVEL=1
 | 
					    -DCORE_DEBUG_LEVEL=3
 | 
				
			||||||
    -DCONFIG_ARDUHAL_LOG_COLORS=1
 | 
					 | 
				
			||||||
    -DOTA_DEBUG=1
 | 
					 | 
				
			||||||
    -DARDUINO_RUNNING_CORE=1
 | 
					 | 
				
			||||||
    -DARDUINO_EVENT_RUNNING_CORE=1
 | 
					 | 
				
			||||||
    -DCONFIG_OPTIMIZATION_LEVEL_DEBUG=1
 | 
					 | 
				
			||||||
    -DCONFIG_ESP32_PANIC_PRINT_REBOOT
 | 
					 | 
				
			||||||
    -DCONFIG_ARDUINO_OTA_READSIZE=1024
 | 
					 | 
				
			||||||
    -DCONFIG_ASYNC_TCP_RUNNING_CORE=1
 | 
					 | 
				
			||||||
    -DCONFIG_ASYNC_TCP_USE_WDT=0
 | 
					 | 
				
			||||||
    -DCONFIG_LWIP_TCP_MSS=1460
 | 
					 | 
				
			||||||
    -DOTA_PARTITION_SUBTYPE=0x10
 | 
					 | 
				
			||||||
    -DPARTITION_TABLE_OFFSET=0x8000
 | 
					 | 
				
			||||||
    -DPARTITION_TABLE_SIZE=0x1000
 | 
					 | 
				
			||||||
    -DCONFIG_BOOTLOADER_APP_ROLLBACK_ENABLE=1
 | 
					 | 
				
			||||||
    -DCONFIG_BOOTLOADER_SKIP_VALIDATE_IN_DEEP_SLEEP=1
 | 
					 | 
				
			||||||
    -DCONFIG_BOOTLOADER_SKIP_VALIDATE_ON_POWER_ON=1
 | 
					 | 
				
			||||||
    -DCONFIG_BOOTLOADER_RESERVE_RTC_SIZE=0x1000
 | 
					 | 
				
			||||||
    -DCONFIG_PARTITION_TABLE_OFFSET=0x8000
 | 
					 | 
				
			||||||
    -DCONFIG_PARTITION_TABLE_MD5=y
 | 
					 | 
				
			||||||
    -DBOOT_APP_PARTITION_OTA_0=1
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
extra_scripts = 
 | 
					 | 
				
			||||||
    scripts/extra_script.py
 | 
					 | 
				
			||||||
    pre:scripts/pre_build.py     ; wird zuerst ausgeführt
 | 
					 | 
				
			||||||
    pre:scripts/pre_spiffs.py    ; wird als zweites ausgeführt
 | 
					 | 
				
			||||||
    pre:scripts/combine_html.py  ; wird als drittes ausgeführt
 | 
					 | 
				
			||||||
    scripts/gzip_files.py
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
; Remove or comment out the targets line
 | 
					 | 
				
			||||||
;targets = buildfs, build
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
; Add a custom target to build both
 | 
					 | 
				
			||||||
[env:esp32dev_ota]
 | 
					 | 
				
			||||||
platform = espressif32
 | 
					 | 
				
			||||||
board = esp32dev
 | 
					 | 
				
			||||||
framework = arduino
 | 
					 | 
				
			||||||
monitor_speed = 115200
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
lib_deps =
 | 
					 | 
				
			||||||
    tzapu/WiFiManager @ ^2.0.17
 | 
					 | 
				
			||||||
    https://github.com/me-no-dev/ESPAsyncWebServer.git#master
 | 
					 | 
				
			||||||
    me-no-dev/AsyncTCP @ ^1.1.1
 | 
					 | 
				
			||||||
    bogde/HX711 @ ^0.7.5
 | 
					 | 
				
			||||||
    adafruit/Adafruit SSD1306 @ ^2.5.13
 | 
					 | 
				
			||||||
    adafruit/Adafruit GFX Library @ ^1.11.11
 | 
					 | 
				
			||||||
    adafruit/Adafruit PN532 @ ^1.3.3
 | 
					 | 
				
			||||||
    bblanchon/ArduinoJson @ ^7.3.0
 | 
					 | 
				
			||||||
    knolleary/PubSubClient @ ^2.8
 | 
					 | 
				
			||||||
    digitaldragon/SSLClient @ ^1.3.2
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
; Enable SPIFFS upload
 | 
					 | 
				
			||||||
board_build.filesystem = spiffs
 | 
					 | 
				
			||||||
; Update partition settings
 | 
					 | 
				
			||||||
board_build.partitions = partitions.csv
 | 
					 | 
				
			||||||
board_upload.flash_size = 4MB
 | 
					 | 
				
			||||||
board_build.flash_mode = dio
 | 
					 | 
				
			||||||
board_upload.flash_freq = "40m"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
build_flags = 
 | 
					 | 
				
			||||||
    -Os
 | 
					 | 
				
			||||||
    -ffunction-sections
 | 
					 | 
				
			||||||
    -fdata-sections
 | 
					 | 
				
			||||||
    -DNDEBUG
 | 
					 | 
				
			||||||
    -mtext-section-literals
 | 
					 | 
				
			||||||
    '-D VERSION="${common.version}"'
 | 
					 | 
				
			||||||
    -DASYNCWEBSERVER_REGEX
 | 
					 | 
				
			||||||
    -DCORE_DEBUG_LEVEL=1
 | 
					 | 
				
			||||||
    -DCONFIG_ARDUHAL_LOG_COLORS=1
 | 
					    -DCONFIG_ARDUHAL_LOG_COLORS=1
 | 
				
			||||||
    -DOTA_DEBUG=1
 | 
					    -DOTA_DEBUG=1
 | 
				
			||||||
    -DARDUINO_RUNNING_CORE=1
 | 
					    -DARDUINO_RUNNING_CORE=1
 | 
				
			||||||
@@ -133,6 +66,7 @@ build_flags =
 | 
				
			|||||||
    -DCONFIG_PARTITION_TABLE_OFFSET=0x8000
 | 
					    -DCONFIG_PARTITION_TABLE_OFFSET=0x8000
 | 
				
			||||||
    -DCONFIG_PARTITION_TABLE_MD5=y
 | 
					    -DCONFIG_PARTITION_TABLE_MD5=y
 | 
				
			||||||
    -DBOOT_APP_PARTITION_OTA_0=1
 | 
					    -DBOOT_APP_PARTITION_OTA_0=1
 | 
				
			||||||
 | 
					    -DCONFIG_LOG_DEFAULT_LEVEL=3
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
extra_scripts = 
 | 
					extra_scripts = 
 | 
				
			||||||
    scripts/extra_script.py
 | 
					    scripts/extra_script.py
 | 
				
			||||||
@@ -146,5 +80,5 @@ extra_scripts =
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
; Add a custom target to build both
 | 
					; Add a custom target to build both
 | 
				
			||||||
[platformio]
 | 
					[platformio]
 | 
				
			||||||
default_envs = esp32dev, esp32dev_ota
 | 
					default_envs = esp32dev
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,3 +5,17 @@ exec(open("./scripts/pre_build.py").read())
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
# Bind to SPIFFS build
 | 
					# Bind to SPIFFS build
 | 
				
			||||||
env.AddPreAction("buildfs", replace_version)
 | 
					env.AddPreAction("buildfs", replace_version)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import os
 | 
				
			||||||
 | 
					import shutil
 | 
				
			||||||
 | 
					from SCons.Script import DefaultEnvironment
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					env = DefaultEnvironment()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Format SPIFFS partition before uploading new files
 | 
				
			||||||
 | 
					spiffs_dir = os.path.join(env.subst("$BUILD_DIR"), "spiffs")
 | 
				
			||||||
 | 
					if os.path.exists(spiffs_dir):
 | 
				
			||||||
 | 
					    shutil.rmtree(spiffs_dir)
 | 
				
			||||||
 | 
					os.makedirs(spiffs_dir)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					print("SPIFFS partition formatted.")
 | 
				
			||||||
							
								
								
									
										130
									
								
								src/ota.cpp
									
									
									
									
									
								
							
							
						
						
									
										130
									
								
								src/ota.cpp
									
									
									
									
									
								
							@@ -20,58 +20,150 @@ void stopAllTasks() {
 | 
				
			|||||||
    Serial.println("All tasks stopped");
 | 
					    Serial.println("All tasks stopped");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void performStageTwo() {
 | 
				
			||||||
 | 
					    if (!SPIFFS.begin(true)) {
 | 
				
			||||||
 | 
					        Serial.println("Error: Could not mount SPIFFS for stage 2");
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    File firmwareFile = SPIFFS.open("/firmware.bin", "r");
 | 
				
			||||||
 | 
					    if (!firmwareFile) {
 | 
				
			||||||
 | 
					        Serial.println("Error: Could not open firmware.bin from SPIFFS");
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    size_t firmwareSize = firmwareFile.size();
 | 
				
			||||||
 | 
					    size_t maxAppSpace = (ESP.getFreeSketchSpace() - 0x1000) & 0xFFFFF000;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Serial.printf("Stage 2 - Firmware size: %u bytes\n", firmwareSize);
 | 
				
			||||||
 | 
					    Serial.printf("Available space: %u bytes\n", maxAppSpace);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (firmwareSize > maxAppSpace) {
 | 
				
			||||||
 | 
					        Serial.printf("Error: Not enough space for firmware. Need %u bytes but only have %u bytes\n", 
 | 
				
			||||||
 | 
					                    firmwareSize, maxAppSpace);
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (!Update.begin(firmwareSize)) {
 | 
				
			||||||
 | 
					        Update.printError(Serial);
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    size_t written = Update.writeStream(firmwareFile);
 | 
				
			||||||
 | 
					    if (written != firmwareSize) {
 | 
				
			||||||
 | 
					        Update.printError(Serial);
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (!Update.end(true)) {
 | 
				
			||||||
 | 
					        Update.printError(Serial);
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    firmwareFile.close();
 | 
				
			||||||
 | 
					    SPIFFS.remove("/firmware.bin"); // Cleanup
 | 
				
			||||||
 | 
					    Serial.println("Stage 2 update successful, restarting...");
 | 
				
			||||||
 | 
					    delay(500);
 | 
				
			||||||
 | 
					    ESP.restart();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void checkForStagedUpdate() {
 | 
				
			||||||
 | 
					    if (!SPIFFS.begin(true)) {
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (SPIFFS.exists("/firmware.bin")) {
 | 
				
			||||||
 | 
					        Serial.println("Found staged firmware update, initiating stage 2...");
 | 
				
			||||||
 | 
					        performStageTwo();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void handleOTAUpload(AsyncWebServerRequest *request, String filename, size_t index, uint8_t *data, size_t len, bool final) {
 | 
					void handleOTAUpload(AsyncWebServerRequest *request, String filename, size_t index, uint8_t *data, size_t len, bool final) {
 | 
				
			||||||
 | 
					    static File stagingFile;
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
    if (!index) {
 | 
					    if (!index) {
 | 
				
			||||||
        bool isFullImage = filename.endsWith("full.bin");
 | 
					        bool isSpiffsUpdate = filename.endsWith("_spiffs.bin");
 | 
				
			||||||
        Serial.printf("Update Start: %s (type: %s)\n", filename.c_str(), isFullImage ? "full" : "OTA");
 | 
					        Serial.printf("Update Start: %s (type: %s)\n", filename.c_str(), isSpiffsUpdate ? "SPIFFS" : "OTA");
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        if (request->contentLength() == 0) {
 | 
					        if (request->contentLength() == 0) {
 | 
				
			||||||
            request->send(400, "application/json", "{\"status\":\"error\",\"message\":\"Invalid file size\"}");
 | 
					            request->send(400, "application/json", "{\"status\":\"error\",\"message\":\"Invalid file size\"}");
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Stop tasks before update
 | 
				
			||||||
        if (!tasksAreStopped && (RfidReaderTask || BambuMqttTask || ScaleTask)) {
 | 
					        if (!tasksAreStopped && (RfidReaderTask || BambuMqttTask || ScaleTask)) {
 | 
				
			||||||
            stopAllTasks();
 | 
					            stopAllTasks();
 | 
				
			||||||
            tasksAreStopped = true;
 | 
					            tasksAreStopped = true;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        bool success;
 | 
					        size_t updateSize = request->contentLength();
 | 
				
			||||||
        if (isFullImage) {
 | 
					        
 | 
				
			||||||
            // Full image update ohne Magic Byte Check, aber mit U_FLASH
 | 
					        if (isSpiffsUpdate) {
 | 
				
			||||||
            success = Update.begin(UPDATE_SIZE_UNKNOWN, U_FLASH);
 | 
					            if (!SPIFFS.begin(true)) {
 | 
				
			||||||
        } else {
 | 
					                request->send(400, "application/json", 
 | 
				
			||||||
            // Normales OTA update mit Magic Byte Check
 | 
					                            "{\"status\":\"error\",\"message\":\"Could not mount SPIFFS\"}");
 | 
				
			||||||
            if (data[0] != 0xE9) {
 | 
					 | 
				
			||||||
                Serial.printf("Wrong magic byte: 0x%02X (expected 0xE9)\n", data[0]);
 | 
					 | 
				
			||||||
                request->send(400, "application/json", "{\"status\":\"error\",\"message\":\"Invalid firmware format\"}");
 | 
					 | 
				
			||||||
                return;
 | 
					                return;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            success = Update.begin(request->contentLength());
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
            
 | 
					            
 | 
				
			||||||
        if (!success) {
 | 
					            // Start SPIFFS update
 | 
				
			||||||
 | 
					            if (!Update.begin(updateSize, U_SPIFFS)) {
 | 
				
			||||||
                Update.printError(Serial);
 | 
					                Update.printError(Serial);
 | 
				
			||||||
            request->send(400, "application/json", "{\"status\":\"error\",\"message\":\"Update start failed\"}");
 | 
					                request->send(400, "application/json", 
 | 
				
			||||||
 | 
					                            "{\"status\":\"error\",\"message\":\"SPIFFS update initialization failed\"}");
 | 
				
			||||||
 | 
					                return;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            // Regular OTA update
 | 
				
			||||||
 | 
					            stagingFile = SPIFFS.open("/firmware.bin", "w");
 | 
				
			||||||
 | 
					            if (!stagingFile) {
 | 
				
			||||||
 | 
					                request->send(400, "application/json", 
 | 
				
			||||||
 | 
					                            "{\"status\":\"error\",\"message\":\"Could not create staging file\"}");
 | 
				
			||||||
                return;
 | 
					                return;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (stagingFile) {
 | 
				
			||||||
 | 
					        // Stage 1: Write to SPIFFS
 | 
				
			||||||
 | 
					        if (stagingFile.write(data, len) != len) {
 | 
				
			||||||
 | 
					            stagingFile.close();
 | 
				
			||||||
 | 
					            SPIFFS.remove("/firmware.bin");
 | 
				
			||||||
 | 
					            request->send(400, "application/json", 
 | 
				
			||||||
 | 
					                        "{\"status\":\"error\",\"message\":\"Write to SPIFFS failed\"}");
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        // Direct SPIFFS update
 | 
				
			||||||
        if (Update.write(data, len) != len) {
 | 
					        if (Update.write(data, len) != len) {
 | 
				
			||||||
            Update.printError(Serial);
 | 
					            Update.printError(Serial);
 | 
				
			||||||
        request->send(400, "application/json", "{\"status\":\"error\",\"message\":\"Write failed\"}");
 | 
					            request->send(400, "application/json", 
 | 
				
			||||||
 | 
					                        "{\"status\":\"error\",\"message\":\"Write failed\"}");
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (final) {
 | 
					    if (final) {
 | 
				
			||||||
 | 
					        if (stagingFile) {
 | 
				
			||||||
 | 
					            // Finish Stage 1
 | 
				
			||||||
 | 
					            stagingFile.close();
 | 
				
			||||||
 | 
					            Serial.println("Stage 1 complete - firmware staged in SPIFFS");
 | 
				
			||||||
 | 
					            request->send(200, "application/json", 
 | 
				
			||||||
 | 
					                        "{\"status\":\"success\",\"message\":\"Update staged successfully! Starting stage 2...\"}");
 | 
				
			||||||
 | 
					            performStageTwo();
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            // Finish direct SPIFFS update
 | 
				
			||||||
            if (!Update.end(true)) {
 | 
					            if (!Update.end(true)) {
 | 
				
			||||||
                Update.printError(Serial);
 | 
					                Update.printError(Serial);
 | 
				
			||||||
            request->send(400, "application/json", "{\"status\":\"error\",\"message\":\"Update failed\"}");
 | 
					                request->send(400, "application/json", 
 | 
				
			||||||
 | 
					                            "{\"status\":\"error\",\"message\":\"Update failed\"}");
 | 
				
			||||||
                return;
 | 
					                return;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        Serial.println("Update successful, restarting...");
 | 
					            Serial.println("SPIFFS update successful, restarting...");
 | 
				
			||||||
        request->send(200, "application/json", "{\"status\":\"success\",\"message\":\"Update successful! Device will restart...\",\"restart\":true}");
 | 
					            request->send(200, "application/json", 
 | 
				
			||||||
 | 
					                        "{\"status\":\"success\",\"message\":\"SPIFFS update successful! Device will restart...\",\"restart\":true}");
 | 
				
			||||||
            delay(500);
 | 
					            delay(500);
 | 
				
			||||||
            ESP.restart();
 | 
					            ESP.restart();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user