Compare commits

...

37 Commits

Author SHA1 Message Date
17b188626a docs: update changelog for version 1.3.8
All checks were successful
Release Workflow / route (push) Successful in 7s
Release Workflow / verify-provider (push) Successful in 2s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m35s
2025-02-21 20:56:07 +01:00
a534c5f872 docs: update webpages for version v1.3.8 2025-02-21 20:56:07 +01:00
93f7582790 feat: add Gitea and GitHub release workflows 2025-02-21 20:56:02 +01:00
46acc63756 docs: update changelog for version 1.3.7
Some checks failed
Release Workflow / route (push) Successful in 7s
Release Workflow / verify-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Has been cancelled
2025-02-21 20:54:16 +01:00
67a9e1bdce docs: update webpages for version v1.3.7 2025-02-21 20:54:16 +01:00
2b75b64b4a feat: add GitHub and Gitea release workflows 2025-02-21 20:54:11 +01:00
8d003295e7 docs: update changelog for version 1.3.6
Some checks failed
Release Workflow / route (push) Successful in 7s
Release Workflow / verify-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 2m46s
2025-02-21 20:45:33 +01:00
f89500946a docs: update webpages for version v1.3.6 2025-02-21 20:45:33 +01:00
14e745ff06 fix: update GitHub token reference and correct file path in release workflow 2025-02-21 20:45:25 +01:00
d058397fa2 docs: update changelog for version 1.3.5
Some checks failed
Release Workflow / route (push) Successful in 6s
Release Workflow / verify-provider (push) Successful in 2s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 2m24s
2025-02-21 20:22:03 +01:00
622f5403a7 docs: update webpages for version v1.3.5 2025-02-21 20:22:03 +01:00
92b78a86dd feat: enhance release workflow to support Gitea alongside GitHub 2025-02-21 20:21:57 +01:00
ec399390e8 docs: update changelog for version 1.3.4
Some checks failed
Release Workflow / route (push) Successful in 7s
Release Workflow / verify-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 2m22s
2025-02-21 20:04:05 +01:00
909c4e9b5e docs: update webpages for version v1.3.4 2025-02-21 20:04:05 +01:00
f4b20bfffd Merge branch 'old' 2025-02-21 20:03:45 +01:00
78464215a9 feat: add Gitea and GitHub release workflows 2025-02-21 20:03:21 +01:00
4365f0463a docs: update changelog for version 1.3.3
Some checks failed
Release Workflow / route (push) Successful in 7s
Release Workflow / verify-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 2m42s
2025-02-21 19:48:48 +01:00
727bc0e760 docs: update webpages for version v1.3.3 2025-02-21 19:48:48 +01:00
04604013eb fix: correct directory path in GitHub workflows for SPIFFS binary 2025-02-21 19:48:45 +01:00
cf5fc5f6f1 docs: update changelog for version 1.3.2
Some checks failed
Release Workflow / route (push) Successful in 6s
Release Workflow / verify-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 2m35s
2025-02-21 19:33:26 +01:00
945a4ccce6 docs: update webpages for version v1.3.2 2025-02-21 19:33:26 +01:00
7cf9e2d145 fix: add missing conditional exit in release workflow 2025-02-21 19:33:24 +01:00
9db4e338ea docs: update changelog for version 1.3.1
Some checks failed
Release Workflow / route (push) Successful in 6s
Release Workflow / verify-provider (push) Failing after 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Has been skipped
2025-02-21 19:10:52 +01:00
dea6ca2c66 docs: update webpages for version v1.3.1 2025-02-21 19:10:52 +01:00
e224e72e41 feat: enhance GitHub and Gitea release workflows with Python setup and binary preparation 2025-02-21 19:10:48 +01:00
306c517da7 docs: update changelog for version 1.3.0
All checks were successful
Release Workflow / route (push) Successful in 6s
Release Workflow / verify-provider (push) Successful in 2s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m40s
2025-02-21 18:58:35 +01:00
0337bbabe0 bump version to 1.3.0 in platformio.ini 2025-02-21 18:58:32 +01:00
bde14e50e0 docs: update changelog for version 1.2.102
All checks were successful
Release Workflow / route (push) Successful in 7s
Release Workflow / verify-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 3m1s
2025-02-21 18:28:20 +01:00
9c656a9bd0 docs: update webpages for version v1.2.102 2025-02-21 18:28:20 +01:00
eae552017d fix: adjust bootloader offset in binary merge for Gitea and GitHub workflows 2025-02-21 18:28:16 +01:00
a77918da41 docs: update changelog for version 1.2.101
Some checks failed
Release Workflow / route (push) Successful in 6s
Release Workflow / verify-provider (push) Successful in 2s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Failing after 2m38s
2025-02-21 18:07:47 +01:00
262dad38a6 docs: update webpages for version v1.2.101 2025-02-21 18:07:46 +01:00
cfc9f103cf refactor: always create SPIFFS binary in release workflows 2025-02-21 18:07:43 +01:00
0117302672 refactor: migrate calibration value storage from EEPROM to NVS 2025-02-21 18:04:05 +01:00
1de283b62f docs: update changelog for version 1.2.100
All checks were successful
Release Workflow / route (push) Successful in 7s
Release Workflow / verify-provider (push) Successful in 3s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 2m41s
2025-02-21 17:49:32 +01:00
f1eb78eb38 docs: update webpages for version v1.2.100 2025-02-21 17:49:32 +01:00
8a65b86475 refactor: remove OTA handling and JSON backup/restore functions 2025-02-21 17:47:25 +01:00
9 changed files with 126 additions and 326 deletions

View File

@ -74,21 +74,18 @@ jobs:
# Copy firmware binary
cp .pio/build/esp32dev/firmware.bin .pio/build/esp32dev/filaman_${VERSION}.bin
# Copy SPIFFS binary if SPIFFS changed
if [[ "${{ steps.check_spiffs.outputs.SPIFFS_CHANGED }}" == "true" ]]; then
echo "SPIFFS changes detected, copying SPIFFS binary..."
cp .pio/build/esp32dev/spiffs.bin .pio/build/esp32dev/webpage_${VERSION}.bin
fi
# Always create SPIFFS binary
cp .pio/build/esp32dev/spiffs.bin .pio/build/esp32dev/webpage_${VERSION}.bin
# Create full binary (always)
(cd .pio/build/esp32dev && \
(cd .pio/build/esp32dev &&
esptool.py --chip esp32 merge_bin \
--fill-flash-size 4MB \
--flash_mode dio \
--flash_freq 40m \
--flash_size 4MB \
-o filaman_full_${VERSION}.bin \
0x0000 bootloader.bin \
0x1000 bootloader.bin \
0x8000 partitions.bin \
0x10000 firmware.bin \
0x390000 spiffs.bin)

View File

@ -60,31 +60,22 @@ jobs:
# Copy firmware binary
cp .pio/build/esp32dev/firmware.bin .pio/build/esp32dev/filaman_${VERSION}.bin
# Copy SPIFFS binary if SPIFFS changed
if [[ "${{ steps.check_spiffs.outputs.SPIFFS_CHANGED }}" == "true" ]]; then
echo "SPIFFS changes detected, copying SPIFFS binary..."
cp .pio/build/esp32dev/spiffs.bin .pio/build/esp32dev/webpage_${VERSION}.bin
fi
# Always create SPIFFS binary
cp .pio/build/esp32dev/spiffs.bin .pio/build/esp32dev/webpage_${VERSION}.bin
# Create full binary (always)
(cd .pio/build/esp32dev && \
(cd .pio/build/esp32dev &&
esptool.py --chip esp32 merge_bin \
--fill-flash-size 4MB \
--flash_mode dio \
--flash_freq 40m \
--flash_size 4MB \
-o filaman_full_${VERSION}.bin \
0x0000 bootloader.bin \
0x1000 bootloader.bin \
0x8000 partitions.bin \
0x10000 firmware.bin \
0x390000 spiffs.bin)
# Only copy SPIFFS binary if data changed
if [[ "${{ steps.check_data.outputs.DATA_CHANGED }}" == "true" ]]; then
echo "Data changes detected, copying SPIFFS binary..."
cp .pio/build/esp32dev/spiffs.bin .pio/build/esp32dev/webpage_${VERSION}.bin
fi
# Verify file sizes
echo "File sizes:"
(cd .pio/build/esp32dev && ls -lh *.bin)

View File

@ -56,12 +56,12 @@ jobs:
github-release:
needs: [route, verify-provider]
if: needs.route.outputs.provider == 'github'
uses: ./.github/workflows/providers/github-release.yml
uses: ./.github/workflows/github-release.yml
gitea-release:
needs: [route, verify-provider]
if: needs.route.outputs.provider == 'gitea'
uses: ./.github/workflows/providers/gitea-release.yml
uses: ./.github/workflows/gitea-release.yml
with:
gitea_ref_name: ${{ needs.route.outputs.gitea_ref_name }}
gitea_server_url: ${{ needs.route.outputs.gitea_server_url }}

View File

@ -1,5 +1,96 @@
# Changelog
## [1.3.8] - 2025-02-21
### Added
- add Gitea and GitHub release workflows
### Changed
- update webpages for version v1.3.8
## [1.3.7] - 2025-02-21
### Added
- add GitHub and Gitea release workflows
### Changed
- update webpages for version v1.3.7
## [1.3.6] - 2025-02-21
### Changed
- update webpages for version v1.3.6
### Fixed
- update GitHub token reference and correct file path in release workflow
## [1.3.5] - 2025-02-21
### Added
- enhance release workflow to support Gitea alongside GitHub
### Changed
- update webpages for version v1.3.5
## [1.3.4] - 2025-02-21
### Added
- add Gitea and GitHub release workflows
### Changed
- update webpages for version v1.3.4
- Merge branch 'old'
## [1.3.3] - 2025-02-21
### Changed
- update webpages for version v1.3.3
### Fixed
- correct directory path in GitHub workflows for SPIFFS binary
## [1.3.2] - 2025-02-21
### Added
- add missing conditional exit in release workflow
### Changed
- update webpages for version v1.3.2
## [1.3.1] - 2025-02-21
### Added
- enhance GitHub and Gitea release workflows with Python setup and binary preparation
### Changed
- update webpages for version v1.3.1
## [1.3.0] - 2025-02-21
### Changed
- bump version to 1.3.0 in platformio.ini
## [1.2.102] - 2025-02-21
### Changed
- update webpages for version v1.2.102
### Fixed
- adjust bootloader offset in binary merge for Gitea and GitHub workflows
## [1.2.101] - 2025-02-21
### Changed
- update webpages for version v1.2.101
- always create SPIFFS binary in release workflows
- migrate calibration value storage from EEPROM to NVS
## [1.2.100] - 2025-02-21
### Changed
- update webpages for version v1.2.100
- remove OTA handling and JSON backup/restore functions
## [1.2.99] - 2025-02-21
### Added
- add SPIFFS change detection and binary copying to release workflows

View File

@ -9,7 +9,7 @@
; https://docs.platformio.org/page/projectconf.html
[common]
version = "1.2.99"
version = "1.3.8"
[env:esp32dev]
platform = espressif32

View File

@ -1,269 +0,0 @@
#include <Arduino.h>
#include "ota.h"
#include <Update.h>
#include <SPIFFS.h>
#include "commonFS.h"
#include "bambu.h"
#include "scale.h"
#include "nfc.h"
#define UPLOAD_TIMEOUT_MS 60000 // 60 Sekunden Timeout für den gesamten Upload
#define CHUNK_RESPONSE_TIMEOUT_MS 10000 // 10 Sekunden Timeout pro Chunk
#define MAX_FAILED_CHUNKS 3 // Maximale Anzahl fehlgeschlagener Chunks bevor Abbruch
#define MAX_FILE_SIZE 4194304 // 4MB Limit
static bool tasksAreStopped = false;
static uint32_t lastChunkTime = 0;
static size_t failedChunks = 0;
static size_t expectedOffset = 0;
static size_t totalSize = 0;
void stopAllTasks() {
Serial.println("Stopping RFID Reader");
if (RfidReaderTask) vTaskSuspend(RfidReaderTask);
Serial.println("Stopping Bambu");
if (BambuMqttTask) vTaskSuspend(BambuMqttTask);
Serial.println("Stopping Scale");
if (ScaleTask) vTaskSuspend(ScaleTask);
vTaskDelay(100 / portTICK_PERIOD_MS);
Serial.println("All tasks stopped");
}
void backupJsonConfigs() {
const char* configs[] = {"/bambu_credentials.json", "/spoolman_url.json"};
for (const char* config : configs) {
if (SPIFFS.exists(config)) {
String backupPath = String(config) + ".bak";
SPIFFS.remove(backupPath);
SPIFFS.rename(config, backupPath);
}
}
}
void restoreJsonConfigs() {
const char* configs[] = {"/bambu_credentials.json", "/spoolman_url.json"};
for (const char* config : configs) {
String backupPath = String(config) + ".bak";
if (SPIFFS.exists(backupPath)) {
SPIFFS.remove(config);
SPIFFS.rename(backupPath, config);
}
}
}
void performStageTwo() {
if (!SPIFFS.begin(true)) {
Serial.println("Error: Could not mount SPIFFS for stage 2");
return;
}
// Backup JSON configs before update
backupJsonConfigs();
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
// Restore JSON configs after update
restoreJsonConfigs();
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) {
static File stagingFile;
static uint32_t uploadStartTime = 0;
if (!index) {
// Überprüfe Gesamtgröße im Header
if (request->hasHeader("X-Total-Size")) {
totalSize = request->header("X-Total-Size").toInt();
if (totalSize > MAX_FILE_SIZE) {
request->send(413, "application/json",
"{\"status\":\"error\",\"message\":\"File too large\"}");
return;
}
}
uploadStartTime = millis();
lastChunkTime = millis();
expectedOffset = 0;
failedChunks = 0;
bool isSpiffsUpdate = filename.endsWith("_spiffs.bin");
Serial.printf("Update Start: %s (type: %s)\n", filename.c_str(), isSpiffsUpdate ? "SPIFFS" : "OTA");
Serial.printf("Total size: %u bytes\n", totalSize);
// Überprüfe Header für Chunk-Informationen
if (request->hasHeader("X-Chunk-Offset")) {
String offsetStr = request->header("X-Chunk-Offset");
expectedOffset = offsetStr.toInt();
}
if (request->contentLength() == 0) {
request->send(400, "application/json", "{\"status\":\"error\",\"message\":\"Invalid file size\"}");
return;
}
if (!tasksAreStopped) {
stopAllTasks();
tasksAreStopped = true;
}
if (isSpiffsUpdate) {
if (!SPIFFS.begin(true)) {
request->send(400, "application/json",
"{\"status\":\"error\",\"message\":\"Could not mount SPIFFS\"}");
return;
}
if (!Update.begin(totalSize > 0 ? totalSize : request->contentLength(), U_SPIFFS)) {
Update.printError(Serial);
request->send(400, "application/json",
"{\"status\":\"error\",\"message\":\"SPIFFS update initialization failed\"}");
return;
}
} else {
stagingFile = SPIFFS.open("/firmware.bin", "w");
if (!stagingFile) {
request->send(400, "application/json",
"{\"status\":\"error\",\"message\":\"Could not create staging file\"}");
return;
}
}
}
// Chunk Validierung
if (request->hasHeader("X-Chunk-Offset")) {
size_t chunkOffset = request->header("X-Chunk-Offset").toInt();
if (chunkOffset != expectedOffset) {
failedChunks++;
if (failedChunks >= MAX_FAILED_CHUNKS) {
if (stagingFile) {
stagingFile.close();
SPIFFS.remove("/firmware.bin");
}
Update.abort();
request->send(400, "application/json",
"{\"status\":\"error\",\"message\":\"Too many failed chunks\"}");
return;
}
request->send(400, "application/json",
"{\"status\":\"error\",\"message\":\"Invalid chunk offset\"}");
return;
}
}
// Timeout Überprüfungen
uint32_t currentTime = millis();
if (currentTime - uploadStartTime > UPLOAD_TIMEOUT_MS) {
if (stagingFile) {
stagingFile.close();
SPIFFS.remove("/firmware.bin");
}
Update.abort();
request->send(408, "application/json", "{\"status\":\"error\",\"message\":\"Upload timeout\"}");
return;
}
if (currentTime - lastChunkTime > CHUNK_RESPONSE_TIMEOUT_MS) {
if (stagingFile) {
stagingFile.close();
SPIFFS.remove("/firmware.bin");
}
Update.abort();
request->send(408, "application/json", "{\"status\":\"error\",\"message\":\"Chunk timeout\"}");
return;
}
lastChunkTime = currentTime;
if (stagingFile) {
size_t written = stagingFile.write(data, len);
if (written != len) {
stagingFile.close();
SPIFFS.remove("/firmware.bin");
request->send(400, "application/json",
"{\"status\":\"error\",\"message\":\"Write to SPIFFS failed\"}");
return;
}
} else {
if (Update.write(data, len) != len) {
Update.printError(Serial);
request->send(400, "application/json",
"{\"status\":\"error\",\"message\":\"Write failed\"}");
return;
}
}
expectedOffset += len;
if (final) {
if (stagingFile) {
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...\"}");
delay(100);
performStageTwo();
} else {
if (!Update.end(true)) {
Update.printError(Serial);
request->send(400, "application/json",
"{\"status\":\"error\",\"message\":\"Update failed\"}");
return;
}
Serial.println("SPIFFS update successful, restarting...");
request->send(200, "application/json",
"{\"status\":\"success\",\"message\":\"SPIFFS update successful! Device will restart...\",\"restart\":true}");
delay(500);
ESP.restart();
}
}
}

View File

@ -1,18 +0,0 @@
#ifndef OTA_H
#define OTA_H
#include <ESPAsyncWebServer.h>
// Update size unknown constant, falls nicht bereits definiert
#ifndef UPDATE_SIZE_UNKNOWN
#define UPDATE_SIZE_UNKNOWN 0xFFFFFFFF
#endif
void handleOTAUpload(AsyncWebServerRequest *request, const String& filename, size_t index, uint8_t *data, size_t len, bool final);
void checkForStagedUpdate();
void performStageTwo();
void stopAllTasks();
void backupJsonConfigs();
void restoreJsonConfigs();
#endif

View File

@ -3,9 +3,9 @@
#include <ArduinoJson.h>
#include "config.h"
#include "HX711.h"
#include <EEPROM.h>
#include "display.h"
#include "esp_task_wdt.h"
#include <Preferences.h>
HX711 scale;
@ -17,6 +17,10 @@ uint8_t weigthCouterToApi = 0;
uint8_t scale_tare_counter = 0;
uint8_t pauseMainTask = 0;
Preferences preferences;
const char* NVS_NAMESPACE = "scale";
const char* NVS_KEY_CALIBRATION = "cal_value";
// ##### Funktionen für Waage #####
uint8_t tareScale() {
Serial.println("Tare scale");
@ -48,13 +52,12 @@ void scale_loop(void * parameter) {
void start_scale() {
Serial.println("Prüfe Calibration Value");
long calibrationValue; // calibration value (see example file "Calibration.ino")
//calibrationValue = 696.0; // uncomment this if you want to set the calibration value in the sketch
long calibrationValue;
EEPROM.begin(512);
EEPROM.get(calVal_eepromAdress, calibrationValue); // uncomment this if you want to fetch the calibration value from eeprom
//calibrationValue = EEPROM.read(calVal_eepromAdress);
// NVS
preferences.begin(NVS_NAMESPACE, true); // true = readonly
calibrationValue = preferences.getLong(NVS_KEY_CALIBRATION, defaultScaleCalibrationValue);
preferences.end();
Serial.print("Read Scale Calibration Value ");
Serial.println(calibrationValue);
@ -137,18 +140,19 @@ uint8_t calibrate_scale() {
{
Serial.print("New calibration value has been set to: ");
Serial.println(newCalibrationValue);
Serial.print("Save this value to EEPROM adress ");
Serial.println(calVal_eepromAdress);
//EEPROM.put(calVal_eepromAdress, newCalibrationValue);
EEPROM.put(calVal_eepromAdress, newCalibrationValue);
EEPROM.commit();
// Speichern mit NVS
preferences.begin(NVS_NAMESPACE, false); // false = readwrite
preferences.putLong(NVS_KEY_CALIBRATION, newCalibrationValue);
preferences.end();
EEPROM.get(calVal_eepromAdress, newCalibrationValue);
//newCalibrationValue = EEPROM.read(calVal_eepromAdress);
// Verifizieren
preferences.begin(NVS_NAMESPACE, true);
long verifyValue = preferences.getLong(NVS_KEY_CALIBRATION, 0);
preferences.end();
Serial.print("Read Value ");
Serial.println(newCalibrationValue);
Serial.print("Verified stored value: ");
Serial.println(verifyValue);
Serial.println("End calibration, revome weight");

View File

@ -29,4 +29,8 @@ void sendNfcData(AsyncWebSocketClient *client);
void foundNfcTag(AsyncWebSocketClient *client, uint8_t success);
void sendWriteResult(AsyncWebSocketClient *client, uint8_t success);
// Upgrade-Funktionen
void backupJsonConfigs();
void restoreJsonConfigs();
#endif