refactor: update Gitea and GitHub release workflows to improve binary preparation and verification
fix: correct version number in HTML files and platformio.ini to v1.2.76 enhance: streamline OTA update handling by removing unnecessary magic byte checks
This commit is contained in:
parent
c374069f36
commit
8a93cccfce
46
.github/workflows/providers/gitea-release.yml
vendored
46
.github/workflows/providers/gitea-release.yml
vendored
@ -30,33 +30,51 @@ jobs:
|
|||||||
- name: Install PlatformIO
|
- name: Install PlatformIO
|
||||||
run: |
|
run: |
|
||||||
python -m pip install --upgrade pip
|
python -m pip install --upgrade pip
|
||||||
pip install --upgrade platformio
|
pip install --upgrade platformio esptool
|
||||||
|
|
||||||
- name: Build Firmware
|
- name: Build Firmware
|
||||||
run: |
|
run: |
|
||||||
pio run -t buildfs # Build SPIFFS
|
pio run -t buildfs # Build SPIFFS
|
||||||
pio run # Build firmware
|
pio run # Build firmware
|
||||||
|
|
||||||
- name: Install esptool
|
- name: Prepare binaries
|
||||||
run: |
|
run: |
|
||||||
pip install esptool
|
cd .pio/build/esp32dev
|
||||||
|
|
||||||
- name: Merge firmware and SPIFFS
|
# Debug: Show all generated files
|
||||||
run: |
|
echo "Files in build directory:"
|
||||||
|
ls -la
|
||||||
|
|
||||||
|
# Create OTA binary (already has correct magic byte)
|
||||||
|
cp firmware.bin filaman_ota.bin
|
||||||
|
|
||||||
|
# Create a magic byte prepended binary for the bootloader
|
||||||
|
echo -ne '\xE9' > bootloader_with_magic.bin
|
||||||
|
cat bootloader.bin >> bootloader_with_magic.bin
|
||||||
|
|
||||||
|
echo "Creating full binary with magic byte..."
|
||||||
esptool.py --chip esp32 merge_bin \
|
esptool.py --chip esp32 merge_bin \
|
||||||
|
--fill-flash-size 4MB \
|
||||||
--flash_mode dio \
|
--flash_mode dio \
|
||||||
--flash_freq 40m \
|
--flash_freq 40m \
|
||||||
--flash_size 4MB \
|
--flash_size 4MB \
|
||||||
-o .pio/build/esp32dev/filaman_full.bin \
|
-o filaman_full.bin \
|
||||||
0x1000 .pio/build/esp32dev/bootloader.bin \
|
0x0000 bootloader_with_magic.bin \
|
||||||
0x8000 .pio/build/esp32dev/partitions.bin \
|
0x8000 partitions.bin \
|
||||||
0x10000 .pio/build/esp32dev/firmware.bin \
|
0x10000 firmware.bin \
|
||||||
0x3D0000 .pio/build/esp32dev/spiffs.bin
|
0x3D0000 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
|
||||||
|
echo "File sizes:"
|
||||||
|
ls -lh *.bin
|
||||||
|
|
||||||
- name: Prepare OTA firmware
|
|
||||||
run: |
|
|
||||||
cp .pio/build/esp32dev/firmware.bin .pio/build/esp32dev/filaman_ota.bin
|
|
||||||
|
|
||||||
- name: Create Release
|
- name: Create Release
|
||||||
env:
|
env:
|
||||||
TOKEN: ${{ secrets.GITEA_TOKEN }}
|
TOKEN: ${{ secrets.GITEA_TOKEN }}
|
||||||
|
46
.github/workflows/providers/github-release.yml
vendored
46
.github/workflows/providers/github-release.yml
vendored
@ -19,32 +19,50 @@ jobs:
|
|||||||
- name: Install PlatformIO
|
- name: Install PlatformIO
|
||||||
run: |
|
run: |
|
||||||
python -m pip install --upgrade pip
|
python -m pip install --upgrade pip
|
||||||
pip install --upgrade platformio
|
pip install --upgrade platformio esptool
|
||||||
|
|
||||||
- name: Build Firmware
|
- name: Build Firmware
|
||||||
run: |
|
run: |
|
||||||
pio run -t buildfs # Build SPIFFS
|
pio run -t buildfs # Build SPIFFS
|
||||||
pio run # Build firmware
|
pio run # Build firmware
|
||||||
|
|
||||||
- name: Install esptool
|
- name: Prepare binaries
|
||||||
run: |
|
run: |
|
||||||
pip install esptool
|
cd .pio/build/esp32dev
|
||||||
|
|
||||||
- name: Merge firmware and SPIFFS
|
# Debug: Show all generated files
|
||||||
run: |
|
echo "Files in build directory:"
|
||||||
|
ls -la
|
||||||
|
|
||||||
|
# Create OTA binary (already has correct magic byte)
|
||||||
|
cp firmware.bin filaman_ota.bin
|
||||||
|
|
||||||
|
# Create a magic byte prepended binary for the bootloader
|
||||||
|
echo -ne '\xE9' > bootloader_with_magic.bin
|
||||||
|
cat bootloader.bin >> bootloader_with_magic.bin
|
||||||
|
|
||||||
|
echo "Creating full binary with magic byte..."
|
||||||
esptool.py --chip esp32 merge_bin \
|
esptool.py --chip esp32 merge_bin \
|
||||||
|
--fill-flash-size 4MB \
|
||||||
--flash_mode dio \
|
--flash_mode dio \
|
||||||
--flash_freq 40m \
|
--flash_freq 40m \
|
||||||
--flash_size 4MB \
|
--flash_size 4MB \
|
||||||
-o .pio/build/esp32dev/filaman_full.bin \
|
-o filaman_full.bin \
|
||||||
0x1000 .pio/build/esp32dev/bootloader.bin \
|
0x0000 bootloader_with_magic.bin \
|
||||||
0x8000 .pio/build/esp32dev/partitions.bin \
|
0x8000 partitions.bin \
|
||||||
0x10000 .pio/build/esp32dev/firmware.bin \
|
0x10000 firmware.bin \
|
||||||
0x3D0000 .pio/build/esp32dev/spiffs.bin
|
0x3D0000 spiffs.bin
|
||||||
|
|
||||||
- name: Prepare OTA firmware
|
# Verify magic bytes
|
||||||
run: |
|
echo "Checking magic bytes:"
|
||||||
cp .pio/build/esp32dev/firmware.bin .pio/build/esp32dev/filaman_ota.bin
|
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
|
||||||
|
echo "File sizes:"
|
||||||
|
ls -lh *.bin
|
||||||
|
|
||||||
- name: Get version from tag
|
- name: Get version from tag
|
||||||
id: get_version
|
id: get_version
|
||||||
|
@ -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.77</span></h1>
|
<h1>FilaMan<span class="version">v1.2.76</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.77</span></h1>
|
<h1>FilaMan<span class="version">v1.2.76</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.77</span></h1>
|
<h1>FilaMan<span class="version">v1.2.76</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.77</span></h1>
|
<h1>FilaMan<span class="version">v1.2.76</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.77</span></h1>
|
<h1>FilaMan<span class="version">v1.2.76</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.77</span></h1>
|
<h1>FilaMan<span class="version">v1.2.76</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.77</span></h1>
|
<h1>FilaMan<span class="version">v1.2.76</span></h1>
|
||||||
<h4>Filament Management Tool</h4>
|
<h4>Filament Management Tool</h4>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
; https://docs.platformio.org/page/projectconf.html
|
; https://docs.platformio.org/page/projectconf.html
|
||||||
|
|
||||||
[common]
|
[common]
|
||||||
version = "1.2.77"
|
version = "1.2.76"
|
||||||
|
|
||||||
[env:esp32dev]
|
[env:esp32dev]
|
||||||
platform = espressif32
|
platform = espressif32
|
||||||
|
31
src/ota.cpp
31
src/ota.cpp
@ -21,52 +21,37 @@ void stopAllTasks() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
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 size_t contentLength = 0;
|
|
||||||
|
|
||||||
if (!index) {
|
if (!index) {
|
||||||
contentLength = request->contentLength();
|
Serial.printf("Update Start: %s\n", filename.c_str());
|
||||||
Serial.printf("Update Start: %s (size: %u bytes)\n", filename.c_str(), contentLength);
|
if (request->contentLength() == 0) {
|
||||||
|
|
||||||
if (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;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Stoppe alle Tasks vor dem Update
|
|
||||||
if (!tasksAreStopped && (RfidReaderTask || BambuMqttTask || ScaleTask)) {
|
if (!tasksAreStopped && (RfidReaderTask || BambuMqttTask || ScaleTask)) {
|
||||||
stopAllTasks();
|
stopAllTasks();
|
||||||
tasksAreStopped = true;
|
tasksAreStopped = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Für full.bin keine Magic Byte Prüfung
|
// Da die full.bin jetzt das korrekte Magic Byte hat,
|
||||||
bool isFullImage = (contentLength > 0x300000);
|
// können wir ein normales Update ohne spezielle Flags starten
|
||||||
if (!isFullImage && data[0] != 0xE9) {
|
if (!Update.begin()) {
|
||||||
Serial.printf("Wrong magic byte: 0x%02X (expected 0xE9)\n", data[0]);
|
|
||||||
request->send(400, "application/json", "{\"status\":\"error\",\"message\":\"Invalid firmware format\"}");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Bei full.bin UPDATE_SIZE_UNKNOWN verwenden
|
|
||||||
if (!Update.begin(isFullImage ? UPDATE_SIZE_UNKNOWN : contentLength)) {
|
|
||||||
Update.printError(Serial);
|
Update.printError(Serial);
|
||||||
request->send(400, "application/json", "{\"status\":\"error\",\"message\":\"OTA could not begin\"}");
|
request->send(400, "application/json", "{\"status\":\"error\",\"message\":\"Update start failed\"}");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Serial.printf("Starting %s update\n", isFullImage ? "full" : "firmware");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Schreibe Update-Daten
|
|
||||||
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\":\"OTA write failed\"}");
|
request->send(400, "application/json", "{\"status\":\"error\",\"message\":\"Write failed\"}");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update abschließen
|
|
||||||
if (final) {
|
if (final) {
|
||||||
if (!Update.end(true)) {
|
if (!Update.end(true)) {
|
||||||
Update.printError(Serial);
|
Update.printError(Serial);
|
||||||
request->send(400, "application/json", "{\"status\":\"error\",\"message\":\"OTA end failed\"}");
|
request->send(400, "application/json", "{\"status\":\"error\",\"message\":\"Update failed\"}");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Serial.println("Update successful, restarting...");
|
Serial.println("Update successful, restarting...");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user