Compare commits

..

2 Commits

19 changed files with 653 additions and 2715 deletions

1
.gitignore vendored
View File

@@ -32,7 +32,6 @@ test/README
data/* data/*
!data/ !data/
!data/.gitkeep !data/.gitkeep
# important
html/bambu_credentials.json html/bambu_credentials.json
html/spoolman_url.json html/spoolman_url.json
_local/* _local/*

View File

@@ -1,437 +1,5 @@
# Changelog # Changelog
## [2.0.0-beta1] - 2025-08-29
### Changed
- update platformio.ini for beta version v2.0.0-beta1
- update version to 2.0.0 in platformio.ini
## [1.5.12-beta18] - 2025-08-29
### Added
- add display delay for vendor, filament, and spool creation processes
### Changed
- update platformio.ini for beta version v1.5.12-beta18
### Fixed
- replace progress bar with message display for remaining weight in sendToApi function
## [1.5.12-beta17] - 2025-08-29
### Added
- add progress bar updates for vendor and filament creation processes
### Changed
- update platformio.ini for beta version v1.5.12-beta17
- optimize page limit detection and remove redundant verification code
### Fixed
- update vendor check to use shorthand key in payload
## [1.5.12-beta16] - 2025-08-29
### Changed
- update platformio.ini for beta version v1.5.12-beta16
- Refactor NFC interface handling and improve error diagnostics
## [1.5.12-beta15] - 2025-08-29
### Changed
- update platformio.ini for beta version v1.5.12-beta15
- enhance NFC write operation diagnostics and improve error handling
- enhance NFC write operation handling and prevent tag operations during write
## [1.5.12-beta14] - 2025-08-29
### Changed
- update platformio.ini for beta version v1.5.12-beta14
- optimize JSON payload structure and enhance NFC tag validation process
## [1.5.12-beta13] - 2025-08-29
### Changed
- update platformio.ini for beta version v1.5.12-beta13
- reorganize clearUserDataArea function for improved clarity and safety
## [1.5.12-beta12] - 2025-08-29
### Changed
- update platformio.ini for beta version v1.5.12-beta12
### Fixed
- reset NFC state on API send failure to allow retry
- update createdFilamentId reset value to 65535 for better task handling
- update createdVendorId reset value to 65535 for improved API handling
## [1.5.12-beta11] - 2025-08-29
### Changed
- update platformio.ini for beta version v1.5.12-beta11
### Fixed
- update spoolman ID reset values to 65535 for better API response detection
## [1.5.12-beta10] - 2025-08-29
### Changed
- update platformio.ini for beta version v1.5.12-beta10
- streamline task creation in checkVendor and checkFilament functions
## [1.5.12-beta9] - 2025-08-29
### Added
- update vendor and filament ID handling to use NULL and add delays for stability
### Changed
- update platformio.ini for beta version v1.5.12-beta9
## [1.5.12-beta8] - 2025-08-29
### Added
- add delay to ensure proper setting of vendor and filament IDs after API state changes
### Changed
- update platformio.ini for beta version v1.5.12-beta8
### Fixed
- correct color_hex key usage and comment out unused date fields in spool creation
## [1.5.12-beta7] - 2025-08-29
### Changed
- update platformio.ini for beta version v1.5.12-beta7
### Fixed
- improve API state handling and vendor name formatting
## [1.5.12-beta6] - 2025-08-29
### Changed
- update platformio.ini for beta version v1.5.12-beta6
- improve task synchronization in vendor, filament, and spool creation functions
## [1.5.12-beta5] - 2025-08-29
### Added
- enhance NDEF decoding with detailed validation and debugging output
### Changed
- update platformio.ini for beta version v1.5.12-beta5
## [1.5.12-beta4] - 2025-08-29
### Added
- enhance NDEF decoding to validate structure and extract JSON payload
### Changed
- update platformio.ini for beta version v1.5.12-beta4
## [1.5.12-beta3] - 2025-08-29
### Added
- add logging for decoded JSON data in NFC processing
### Changed
- update platformio.ini for beta version v1.5.12-beta3
## [1.5.12-beta2] - 2025-08-29
### Changed
- update platformio.ini for beta version v1.5.12-beta2
### Fixed
- enhance filament creation logic to include dynamic comments based on payload
## [1.5.12-beta1] - 2025-08-28
### Added
- implement filament and spool creation in Spoolman API
- Add JSON structure comments for filament and spool creation
- Add vendor and filament management to API; implement recycling factory handling in NFC
### Changed
- update platformio.ini for beta version v1.5.12-beta1
- Merge branch 'main' into recyclingfabrik
- Merge branch 'main' into recyclingfabrik
## [1.5.12] - 2025-08-28
### Added
- add numbering to update sections in upgrade.html refactor: improve readability of checkSpoolmanInstance function
### Changed
- update platformio.ini for version v1.5.12
- clean up library dependencies in platformio.ini
## [1.5.11-beta4] - 2025-08-28
### Changed
- update platformio.ini for beta version v1.5.11-beta4
### Fixed
- remove debug logging from checkSpoolmanInstance function
## [1.5.11-beta3] - 2025-08-28
### Added
- add logging for spoolman status in checkSpoolmanInstance function
### Changed
- update platformio.ini for beta version v1.5.11-beta3
## [1.5.11-beta2] - 2025-08-28
### Added
- add logging for healthy spoolman instance check
### Changed
- update platformio.ini for beta version v1.5.11-beta2
## [1.5.11-beta1] - 2025-08-28
### Changed
- update platformio.ini for beta version v1.5.11-beta1
### Fixed
- adjust spacing in loop structure and enable tare function in scale loop
## [1.5.11] - 2025-08-27
### Changed
- update platformio.ini for version v1.5.11
## [1.5.10] - 2025-08-27
### Added
- improve weight processing logic and add auto-send feature for Bambu spool ID
- improve weight processing logic and add auto-send feature for Bambu spool ID
- Adds a link to the spool in spoolman when reading a spool tag
- Fixes types and some issues in the new graphics
- Adds ENABLE_HEAP_DEBUGGING define as comment to the build flags
- Adds data directory and further .vscode files to to .gitignore
- Introduces new heap debugging feature and fixes some memory leaks in website feature
- Fixes some issues with the new location tags
- Adds new feature to write and read location tags
- Adds slight debouncing to the scale loop weight logic
- add loadcell desc.
- implement multi-color filament display and styles for dropdown options
- add remaining weight logging for PUT requests and improve error reporting in sendToApi function
- add remaining weight logging and display after successful spool update
- add weight field to update payload in updateSpoolTagId function
- add auto-tare functionality and update scale handling based on touch sensor connection
- add touch sensor connection check and update logic
- add manual tare functionality for scale
- add debounce handling for TTP223 touch sensor
- add TTP223 touch sensor support and wiring configuration
- Renamed states of NFC state machine and introduced new state machine for spoolman API
- add forced cache refresh after removing and saving Bambu credentials
- add functionality to remove Bambu credentials and update API handling
- add rfid_bambu.html and update bambu connection handling
- add error handling for missing vendor IDs in filament data
- add WiFi connection check and restart Bambu if not connected
- added new .step, now with correct individual parts
- added changelog
- Add files via upload
- added .stp files of modifications
- added merged picture
- added pictures of components bought from AliE
- Add files via upload
- added pictures for heat insert location
- added pictures showing heat insert location
- remove unnecessary delay in MQTT setup and add delay before restart
- add new 3D print file for Filaman scale
- added Discord Server
- add support for Spoolman Octoprint Plugin in README files
- add OctoPrint integration with configurable fields and update functionality
- add version comparison function and check for outdated versions before updates
- remove unused version and protocol fields from JSON output; add error message for insufficient memory
### Changed
- update platformio.ini for version v1.5.10
- Merge branch 'main' of https://gitlab.fire-devils.org/3D-Druck/Filaman
- Changed Amazon Link for PN532
- Changed Amazon Link for PN532
- update changelog and header for version v1.5.9
- update platformio.ini for version v1.5.9
- Enhance API to support weight updates after successful spool tag updates
- update changelog and header for version v1.5.8
- update platformio.ini for version v1.5.8
- Merge pull request #45 from janecker/nfc_write_improvements
- Introduces periodic Spoolman Healthcheck
- Improves init - NFC reading now only starts after boot is finished
- Further improvements on NFC writing
- Merge pull request #44 from janecker/graphics_rework
- Graphic rework of the NFC writing process
- Remove unused parameter of sendNfcData()
- Reworks startup graphics and timings
- update changelog and header for version v1.5.7
- update platformio.ini for version v1.5.7
- clean up unused variables and improve .gitignore entries
- update changelog and header for version v1.5.6
- update webpages for version v1.5.6
- update platformio.ini for version v1.5.6
- Merge pull request #42 from janecker/configuration_nvs_storage
- Merge branch 'main' into configuration_nvs_storage
- Changes configuration storage of spoolman and bambu values
- update changelog and header for version v1.5.5
- update platformio.ini for version v1.5.5
- update changelog and header for version v1.5.4
- update platformio.ini for version v1.5.4
- Merge branch 'main' of github.com:ManuelW77/Filaman
- Merge pull request #39 from janecker/location_tags
- Merge pull request #38 from janecker/scale_debouncing
- update changelog and header for version v1.5.3
- update platformio.ini for version v1.5.3
- Affiliate Links
- update changelog and header for version v1.5.2
- update platformio.ini for version v1.5.2
- update changelog and header for version v1.5.1
- update version to 1.5.1 and improve OTA update handling with task management
- update changelog and header for version v1.4.14
- update platformio.ini for version v1.4.14
- update changelog and header for version v1.4.13
- update platformio.ini for version v1.4.13
- update changelog and header for version v1.4.12
- update platformio.ini for version v1.4.12
- update README files to clarify PN532 DIP switch settings
- update changelog and header for version v1.4.11
- update platformio.ini for version v1.4.11
- Merge branch 'main' of github.com:ManuelW77/Filaman
- update changelog and header for version v1.4.10
- update platformio.ini for version v1.4.10
- Merge pull request #31 from janecker/nfc_rework
- Introducing enum for handling the NFC state to improve code readability
- update changelog and header for version v1.4.9
- update platformio.ini for version v1.4.9
- update changelog and header for version v1.4.8
- update platformio.ini for version v1.4.8
- Merge pull request #30 from janecker/main
- Merge branch 'testing' into main
- update changelog and header for version v1.4.7
- update platformio.ini for version v1.4.7
- Merge branch 'testing'
- update remove button for Bambu credentials with red background
- Merge pull request #28 from tugsi/main
- update changelog and header for version v1.4.6
- update platformio.ini for version v1.4.6
- update changelog and header for version v1.4.5
- update platformio.ini for version v1.4.5
- Merge branch 'testing'
- remove unused request_topic subscription and reduce MQTT task stack size
- Merge pull request #26 from tugsi/main
- rename report_topic to topic and update MQTT subscription logic, switched publish topic to request
- update changelog and header for version v1.4.4
- update platformio.ini for version v1.4.4
- update changelog and header for version v1.4.3
- update platformio.ini for version v1.4.3
- update changelog and header for version v1.4.2
- update platformio.ini for version v1.4.2
- increase stack size for BambuMqtt task
- update Discord Link
- update Discord Link
- remove commented-out subscription topic in MQTT setup
- update changelog and header for version v1.4.1
- update platformio.ini for version v1.4.1
- refactor length calculation to convert total length to meters before formatting
- Merge pull request #16 from spitzbirne32/main
- improved housing to show display better
- removed CAD, as they were all duplicates
- typo in AliE link
- Delete usermod/spitzbirne32/STL/README.md
- Update README.md
- moved pictures of parts into dedicated folders
- Update README.md
- Update README.md
- Update README.md
- Delete usermod/spitzbirne32/STL/ScaleTop_Heatinsert_Location_usermod_spitzbirne32_.png
- Delete usermod/spitzbirne32/STL/Housing_Heatinsert_Location_usermod_spitzbirne32_.png
- created folders
- Update README.md
- Update README.md
- Create README.md
- Update README.md
- Update README.md
- Create README.md
- Merge pull request #15 from ManuelW77/main
- Merge pull request #14 from janecker/scale-calibration-rework
- Reworks the scale calibration handling
- remove redundant scale calibration checks and enhance task management
- enhance AMS data handling and streamline spool auto-setting logic
- adjust stack size and improve scale calibration logic
- update labels and input types for better clarity and functionality
- update documentation for clarity and accuracy
- update changelog and header for version v1.4.0
- update NFC tag references to include NTAG213 and clarify storage capacity
- bump version to 1.4.0
- remove unused version and protocol fields from NFC data packet
- sort vendors alphabetically in the dropdown list
- Merge pull request #10 from janecker/nfc-improvements
### Fixed
- Fixes issue that scale not calibrated message was not shown
- Improves NFC writing workaround and removes debug output
- Fixes typos in upgrade page
- Reworks graphics of tag reading and some api fixes
- Replaces usage of String with const char* in heap debug function
- Merge pull request #41 from janecker/memory_leak_fixes
- Fixes compiler warnings in nfc
- Memory leak fixes in api and nfc, location tag fix
- Merge pull request #40 from janecker/location_bambu_fix
- uncomment monitor_port configuration in platformio.ini
- update spool weight conditionally based on NFC ID
- update weight field in update payload to only include values greater than 10
- increase stack size for sendToApi task to improve stability
- adjust tare weight tolerance to ignore deviations of 2g
- improve weight stability check before sending to API
- update touch sensor connection logic to correctly identify connection status
- update TTP223 pin configuration and adjust touch sensor logic
- enhance HTTP method handling in sendToApi function
- improve HTTP client configuration and clear update documents after API calls
- Fixes memory leak in HTTPClient by disabling connection reuse
- update reload logic after removing and saving Bambu credentials for better cache handling
- handle Bambu connection state by introducing bambuDisabled flag
- handle potential undefined value for tray_info_idx in handleSpoolIn function, by @tugsi
- Fix rfid.js-Failure with X1-Series, if you wanna send a Spool to AMS: - Uncaught TypeError: Cannot read properties of undefined (reading 'replace') at handleSpoolIn (rfid.js:493:67) at HTMLButtonElement.onclick ((Index):1:1) handleSpoolIn @ rfid.js:493 onclick @ (Index):1
- increase MQTT buffer size and adjust task stack size
- Fix BufferSize for larger JSONs from X-Series
- adjust weight threshold for tare check to allow negative values
- use unique client ID for MQTT connection to avoid conflicts
- reload page after firmware update completion
- increase WiFi connection timeout from 5 to 10 seconds
- ensure valid URL format and remove trailing slash in setupWebserver
- correct typo in console log for total length
## [1.5.9] - 2025-08-11
### Changed
- update platformio.ini for version v1.5.9
- Enhance API to support weight updates after successful spool tag updates
## [1.5.8] - 2025-08-10
### Added
- Adds a link to the spool in spoolman when reading a spool tag
- Fixes types and some issues in the new graphics
### Changed
- update platformio.ini for version v1.5.8
- Merge pull request #45 from janecker/nfc_write_improvements
- Introduces periodic Spoolman Healthcheck
- Improves init - NFC reading now only starts after boot is finished
- Further improvements on NFC writing
- Merge pull request #44 from janecker/graphics_rework
- Graphic rework of the NFC writing process
- Remove unused parameter of sendNfcData()
- Reworks startup graphics and timings
### Fixed
- Fixes issue that scale not calibrated message was not shown
- Improves NFC writing workaround and removes debug output
- Fixes typos in upgrade page
- Reworks graphics of tag reading and some api fixes
- Replaces usage of String with const char* in heap debug function
## [1.5.7] - 2025-07-28 ## [1.5.7] - 2025-07-28
### Changed ### Changed
- update platformio.ini for version v1.5.7 - update platformio.ini for version v1.5.7

View File

@@ -62,7 +62,7 @@ Discord Server: [https://discord.gg/my7Gvaxj2v](https://discord.gg/my7Gvaxj2v)
- **OLED 0.96 Zoll I2C white/yellow Display:** 128x64 SSD1306. - **OLED 0.96 Zoll I2C white/yellow Display:** 128x64 SSD1306.
[Amazon Link](https://amzn.to/445aaa9) [Amazon Link](https://amzn.to/445aaa9)
- **PN532 NFC NXP RFID-Modul V3:** For NFC tag operations. - **PN532 NFC NXP RFID-Modul V3:** For NFC tag operations.
[Amazon Link](https://amzn.eu/d/gy9vaBX) [Amazon Link](https://amzn.to/4iO6CO4)
- **NFC Tags NTAG213 NTAG215:** RFID Tag - **NFC Tags NTAG213 NTAG215:** RFID Tag
[Amazon Link](https://amzn.to/3E071xO) [Amazon Link](https://amzn.to/3E071xO)
- **TTP223 Touch Sensor (optional):** For reTARE per Button/Touch - **TTP223 Touch Sensor (optional):** For reTARE per Button/Touch

View File

@@ -66,7 +66,7 @@ Discord Server: [https://discord.gg/my7Gvaxj2v](https://discord.gg/my7Gvaxj2v)
- **OLED 0.96 Zoll I2C white/yellow Display:** 128x64 SSD1306. - **OLED 0.96 Zoll I2C white/yellow Display:** 128x64 SSD1306.
[Amazon Link](https://amzn.to/445aaa9) [Amazon Link](https://amzn.to/445aaa9)
- **PN532 NFC NXP RFID-Modul V3:** For NFC tag operations. - **PN532 NFC NXP RFID-Modul V3:** For NFC tag operations.
[Amazon Link](https://amzn.eu/d/gy9vaBX) [Amazon Link](https://amzn.to/4iO6CO4)
- **NFC Tags NTAG213 NTAG215:** RFID Tag - **NFC Tags NTAG213 NTAG215:** RFID Tag
[Amazon Link](https://amzn.to/3E071xO) [Amazon Link](https://amzn.to/3E071xO)
- **TTP223 Touch Sensor (optional):** For reTARE per Button/Touch - **TTP223 Touch Sensor (optional):** For reTARE per Button/Touch

View File

@@ -7,7 +7,6 @@ let heartbeatTimer = null;
let lastHeartbeatResponse = Date.now(); let lastHeartbeatResponse = Date.now();
const HEARTBEAT_TIMEOUT = 20000; const HEARTBEAT_TIMEOUT = 20000;
let reconnectTimer = null; let reconnectTimer = null;
let spoolDetected = false;
// WebSocket Funktionen // WebSocket Funktionen
function startHeartbeat() { function startHeartbeat() {
@@ -509,15 +508,12 @@ function updateNfcStatusIndicator(data) {
if (data.found === 0) { if (data.found === 0) {
// Kein NFC Tag gefunden // Kein NFC Tag gefunden
indicator.className = 'status-circle'; indicator.className = 'status-circle';
spoolDetected = false;
} else if (data.found === 1) { } else if (data.found === 1) {
// NFC Tag erfolgreich gelesen // NFC Tag erfolgreich gelesen
indicator.className = 'status-circle success'; indicator.className = 'status-circle success';
spoolDetected = true;
} else { } else {
// Fehler beim Lesen // Fehler beim Lesen
indicator.className = 'status-circle error'; indicator.className = 'status-circle error';
spoolDetected = true;
} }
} }
@@ -578,7 +574,7 @@ function updateNfcData(data) {
`; `;
// Spoolman ID anzeigen // Spoolman ID anzeigen
html += `<p><strong>Spoolman ID:</strong> ${data.sm_id} (<a href="${spoolmanUrl}/spool/show/${data.sm_id}">Open in Spoolman</a>)</p>`; html += `<p><strong>Spoolman ID:</strong> ${data.sm_id || 'No Spoolman ID'}</p>`;
} }
else if(data.location) else if(data.location)
{ {
@@ -622,7 +618,6 @@ function updateNfcData(data) {
} }
function writeNfcTag() { function writeNfcTag() {
if(!spoolDetected || confirm("Are you sure you want to overwrite the Tag?") == true){
const selectedText = document.getElementById("selected-filament").textContent; const selectedText = document.getElementById("selected-filament").textContent;
if (selectedText === "Please choose...") { if (selectedText === "Please choose...") {
alert('Please select a Spool first.'); alert('Please select a Spool first.');
@@ -671,11 +666,9 @@ function writeNfcTag() {
} else { } else {
alert('Not connected to Server. Please check connection.'); alert('Not connected to Server. Please check connection.');
} }
}
} }
function writeLocationNfcTag() { function writeLocationNfcTag() {
if(!spoolDetected || confirm("Are you sure you want to overwrite the Tag?") == true){
const selectedText = document.getElementById("locationSelect").value; const selectedText = document.getElementById("locationSelect").value;
if (selectedText === "Please choose...") { if (selectedText === "Please choose...") {
alert('Please select a location first.'); alert('Please select a location first.');
@@ -686,7 +679,6 @@ function writeLocationNfcTag() {
location: String(selectedText) location: String(selectedText)
}; };
if (socket?.readyState === WebSocket.OPEN) { if (socket?.readyState === WebSocket.OPEN) {
const writeButton = document.getElementById("writeLocationNfcButton"); const writeButton = document.getElementById("writeLocationNfcButton");
writeButton.classList.add("writing"); writeButton.classList.add("writing");
@@ -699,7 +691,6 @@ function writeLocationNfcTag() {
} else { } else {
alert('Not connected to Server. Please check connection.'); alert('Not connected to Server. Please check connection.');
} }
}
} }
function handleWriteNfcTagResponse(success) { function handleWriteNfcTagResponse(success) {

View File

@@ -56,7 +56,7 @@
<div class="update-options"> <div class="update-options">
<div class="update-section"> <div class="update-section">
<h2>1) Firmware Update</h2> <h2>Firmware Update</h2>
<p>Upload a new firmware file (upgrade_filaman_firmware_*.bin)</p> <p>Upload a new firmware file (upgrade_filaman_firmware_*.bin)</p>
<div class="update-form"> <div class="update-form">
<form id="firmwareForm" enctype='multipart/form-data' data-type="firmware"> <form id="firmwareForm" enctype='multipart/form-data' data-type="firmware">
@@ -67,7 +67,7 @@
</div> </div>
<div class="update-section"> <div class="update-section">
<h2>2) Webpage Update</h2> <h2>Webpage Update</h2>
<p>Upload a new webpage file (upgrade_filaman_website_*.bin)</p> <p>Upload a new webpage file (upgrade_filaman_website_*.bin)</p>
<div class="update-form"> <div class="update-form">
<form id="webpageForm" enctype='multipart/form-data' data-type="webpage"> <form id="webpageForm" enctype='multipart/form-data' data-type="webpage">

View File

@@ -9,8 +9,8 @@
; https://docs.platformio.org/page/projectconf.html ; https://docs.platformio.org/page/projectconf.html
[common] [common]
version = "2.0.0-beta1" version = "1.5.7"
to_old_version = "2.0.0" to_old_version = "1.5.0"
## ##
[env:esp32dev] [env:esp32dev]
@@ -23,7 +23,10 @@ monitor_speed = 115200
lib_deps = lib_deps =
tzapu/WiFiManager @ ^2.0.17 tzapu/WiFiManager @ ^2.0.17
https://github.com/me-no-dev/ESPAsyncWebServer.git#master https://github.com/me-no-dev/ESPAsyncWebServer.git#master
#me-no-dev/AsyncTCP @ ^1.1.1
https://github.com/esphome/AsyncTCP.git https://github.com/esphome/AsyncTCP.git
#mathieucarbou/ESPAsyncWebServer @ ^3.6.0
#esp32async/AsyncTCP @ ^3.3.5
bogde/HX711 @ ^0.7.5 bogde/HX711 @ ^0.7.5
adafruit/Adafruit SSD1306 @ ^2.5.13 adafruit/Adafruit SSD1306 @ ^2.5.13
adafruit/Adafruit GFX Library @ ^1.11.11 adafruit/Adafruit GFX Library @ ^1.11.11
@@ -33,6 +36,7 @@ lib_deps =
digitaldragon/SSLClient @ ^1.3.2 digitaldragon/SSLClient @ ^1.3.2
; Enable SPIFFS upload ; Enable SPIFFS upload
#board_build.filesystem = spiffs
board_build.filesystem = littlefs board_build.filesystem = littlefs
; Update partition settings ; Update partition settings
board_build.partitions = partitions.csv board_build.partitions = partitions.csv

View File

@@ -4,11 +4,8 @@
#include "commonFS.h" #include "commonFS.h"
#include <Preferences.h> #include <Preferences.h>
#include "debug.h" #include "debug.h"
#include "scale.h"
#include "nfc.h"
#include <time.h>
volatile spoolmanApiStateType spoolmanApiState = API_IDLE;
volatile spoolmanApiStateType spoolmanApiState = API_INIT;
//bool spoolman_connected = false; //bool spoolman_connected = false;
String spoolmanUrl = ""; String spoolmanUrl = "";
bool octoEnabled = false; bool octoEnabled = false;
@@ -19,11 +16,7 @@ uint16_t remainingWeight = 0;
uint16_t createdVendorId = 0; // Store ID of newly created vendor uint16_t createdVendorId = 0; // Store ID of newly created vendor
uint16_t foundVendorId = 0; // Store ID of found vendor uint16_t foundVendorId = 0; // Store ID of found vendor
uint16_t foundFilamentId = 0; // Store ID of found filament uint16_t foundFilamentId = 0; // Store ID of found filament
uint16_t createdFilamentId = 0; // Store ID of newly created filament
uint16_t createdSpoolId = 0; // Store ID of newly created spool
bool spoolmanConnected = false; bool spoolmanConnected = false;
bool spoolmanExtraFieldsChecked = false;
TaskHandle_t* apiTask;
struct SendToApiParams { struct SendToApiParams {
SpoolmanApiRequestType requestType; SpoolmanApiRequestType requestType;
@@ -31,10 +24,6 @@ struct SendToApiParams {
String spoolsUrl; String spoolsUrl;
String updatePayload; String updatePayload;
String octoToken; String octoToken;
// Weight update parameters for sequential execution
bool triggerWeightUpdate;
String spoolIdForWeight;
uint16_t weightValue;
}; };
JsonDocument fetchSingleSpoolInfo(int spoolId) { JsonDocument fetchSingleSpoolInfo(int spoolId) {
@@ -108,23 +97,15 @@ JsonDocument fetchSingleSpoolInfo(int spoolId) {
void sendToApi(void *parameter) { void sendToApi(void *parameter) {
HEAP_DEBUG_MESSAGE("sendToApi begin"); HEAP_DEBUG_MESSAGE("sendToApi begin");
// Wait until API is IDLE
while(spoolmanApiState != API_IDLE){
vTaskDelay(100 / portTICK_PERIOD_MS);
yield();
}
spoolmanApiState = API_TRANSMITTING; spoolmanApiState = API_TRANSMITTING;
SendToApiParams* params = (SendToApiParams*)parameter; SendToApiParams* params = (SendToApiParams*)parameter;
// Extract values including weight update parameters // Extrahiere die Werte
SpoolmanApiRequestType requestType = params->requestType; SpoolmanApiRequestType requestType = params->requestType;
String httpType = params->httpType; String httpType = params->httpType;
String spoolsUrl = params->spoolsUrl; String spoolsUrl = params->spoolsUrl;
String updatePayload = params->updatePayload; String updatePayload = params->updatePayload;
String octoToken = params->octoToken; String octoToken = params->octoToken;
bool triggerWeightUpdate = params->triggerWeightUpdate;
String spoolIdForWeight = params->spoolIdForWeight;
uint16_t weightValue = params->weightValue;
HTTPClient http; HTTPClient http;
http.setReuse(false); http.setReuse(false);
@@ -140,7 +121,7 @@ void sendToApi(void *parameter) {
else httpCode = http.PUT(updatePayload); else httpCode = http.PUT(updatePayload);
if (httpCode == HTTP_CODE_OK) { if (httpCode == HTTP_CODE_OK) {
Serial.println("Spoolman Abfrage erfolgreich"); Serial.println("Spoolman erfolgreich aktualisiert");
// Restgewicht der Spule auslesen // Restgewicht der Spule auslesen
String payload = http.getString(); String payload = http.getString();
@@ -158,8 +139,7 @@ void sendToApi(void *parameter) {
//oledShowMessage("Remaining: " + String(remaining_weight) + "g"); //oledShowMessage("Remaining: " + String(remaining_weight) + "g");
if(!octoEnabled){ if(!octoEnabled){
// TBD: Do not use Strings... // TBD: Do not use Strings...
//oledShowProgressBar(1, 1, "Spool Tag", ("Done: " + String(remainingWeight) + " g remain").c_str()); oledShowProgressBar(1, 1, "Spool Tag", ("Done: " + String(remainingWeight) + " g remain").c_str());
oledShowMessage("Remaining: " + String(remainingWeight) + "g");
remainingWeight = 0; remainingWeight = 0;
}else{ }else{
// ocoto is enabled, trigger octo update // ocoto is enabled, trigger octo update
@@ -174,8 +154,7 @@ void sendToApi(void *parameter) {
break; break;
case API_REQUEST_OCTO_SPOOL_UPDATE: case API_REQUEST_OCTO_SPOOL_UPDATE:
// TBD: Do not use Strings... // TBD: Do not use Strings...
//oledShowProgressBar(5, 5, "Spool Tag", ("Done: " + String(remainingWeight) + " g remain").c_str()); oledShowProgressBar(5, 5, "Spool Tag", ("Done: " + String(remainingWeight) + " g remain").c_str());
oledShowMessage("Remaining: " + String(remainingWeight) + "g");
remainingWeight = 0; remainingWeight = 0;
break; break;
case API_REQUEST_VENDOR_CREATE: case API_REQUEST_VENDOR_CREATE:
@@ -205,20 +184,6 @@ void sendToApi(void *parameter) {
Serial.println(foundFilamentId); Serial.println(foundFilamentId);
} }
break; break;
case API_REQUEST_FILAMENT_CREATE:
Serial.println("Filament successfully created!");
createdFilamentId = doc["id"].as<uint16_t>();
Serial.print("Created Filament ID: ");
Serial.println(createdFilamentId);
oledShowProgressBar(1, 1, "Filament", "Created!");
break;
case API_REQUEST_SPOOL_CREATE:
Serial.println("Spool successfully created!");
createdSpoolId = doc["id"].as<uint16_t>();
Serial.print("Created Spool ID: ");
Serial.println(createdSpoolId);
oledShowProgressBar(1, 1, "Spool", "Created!");
break;
} }
} }
doc.clear(); doc.clear();
@@ -241,77 +206,12 @@ void sendToApi(void *parameter) {
Serial.println(createdVendorId); Serial.println(createdVendorId);
oledShowProgressBar(1, 1, "Vendor", "Created!"); oledShowProgressBar(1, 1, "Vendor", "Created!");
break; break;
case API_REQUEST_FILAMENT_CREATE:
Serial.println("Filament successfully created!");
createdFilamentId = doc["id"].as<uint16_t>();
Serial.print("Created Filament ID: ");
Serial.println(createdFilamentId);
oledShowProgressBar(1, 1, "Filament", "Created!");
break;
case API_REQUEST_SPOOL_CREATE:
Serial.println("Spool successfully created!");
createdSpoolId = doc["id"].as<uint16_t>();
Serial.print("Created Spool ID: ");
Serial.println(createdSpoolId);
oledShowProgressBar(1, 1, "Spool", "Created!");
break;
default: default:
// Handle other create operations if needed // Handle other create operations if needed
break; break;
} }
} }
doc.clear(); doc.clear();
// Execute weight update if requested and tag update was successful
if (triggerWeightUpdate && requestType == API_REQUEST_SPOOL_TAG_ID_UPDATE && weightValue > 10) {
Serial.println("Executing weight update after successful tag update");
// Prepare weight update request
String weightUrl = spoolmanUrl + apiUrl + "/spool/" + spoolIdForWeight + "/measure";
JsonDocument weightDoc;
weightDoc["weight"] = weightValue;
String weightPayload;
serializeJson(weightDoc, weightPayload);
Serial.print("Weight update URL: ");
Serial.println(weightUrl);
Serial.print("Weight update payload: ");
Serial.println(weightPayload);
// Execute weight update
http.begin(weightUrl);
http.addHeader("Content-Type", "application/json");
int weightHttpCode = http.PUT(weightPayload);
if (weightHttpCode == HTTP_CODE_OK) {
Serial.println("Weight update successful");
String weightResponse = http.getString();
JsonDocument weightResponseDoc;
DeserializationError weightError = deserializeJson(weightResponseDoc, weightResponse);
if (!weightError) {
remainingWeight = weightResponseDoc["remaining_weight"].as<uint16_t>();
Serial.print("Updated weight: ");
Serial.println(remainingWeight);
if (!octoEnabled) {
oledShowProgressBar(1, 1, "Spool Tag", ("Done: " + String(remainingWeight) + " g remain").c_str());
remainingWeight = 0;
} else {
sendOctoUpdate = true;
}
}
weightResponseDoc.clear();
} else {
Serial.print("Weight update failed with HTTP code: ");
Serial.println(weightHttpCode);
oledShowProgressBar(1, 1, "Failure!", "Weight update");
}
weightDoc.clear();
}
} else { } else {
switch(requestType){ switch(requestType){
case API_REQUEST_SPOOL_WEIGHT_UPDATE: case API_REQUEST_SPOOL_WEIGHT_UPDATE:
@@ -328,16 +228,11 @@ void sendToApi(void *parameter) {
case API_REQUEST_VENDOR_CREATE: case API_REQUEST_VENDOR_CREATE:
oledShowProgressBar(1, 1, "Failure!", "Vendor create"); oledShowProgressBar(1, 1, "Failure!", "Vendor create");
break; break;
case API_REQUEST_FILAMENT_CREATE:
oledShowProgressBar(1, 1, "Failure!", "Filament create");
break;
case API_REQUEST_SPOOL_CREATE:
oledShowProgressBar(1, 1, "Failure!", "Spool create");
break;
} }
Serial.println("Fehler beim Senden an Spoolman! HTTP Code: " + String(httpCode)); Serial.println("Fehler beim Senden an Spoolman! HTTP Code: " + String(httpCode));
// TBD: really required?
vTaskDelay(2000 / portTICK_PERIOD_MS); vTaskDelay(2000 / portTICK_PERIOD_MS);
nfcReaderState = NFC_IDLE; // Reset NFC state to allow retry
} }
http.end(); http.end();
@@ -368,8 +263,7 @@ bool updateSpoolTagId(String uidString, const char* payload) {
return false; return false;
} }
String spoolId = doc["sm_id"].as<String>(); String spoolsUrl = spoolmanUrl + apiUrl + "/spool/" + doc["sm_id"].as<String>();
String spoolsUrl = spoolmanUrl + apiUrl + "/spool/" + spoolId;
Serial.print("Update Spule mit URL: "); Serial.print("Update Spule mit URL: ");
Serial.println(spoolsUrl); Serial.println(spoolsUrl);
@@ -394,25 +288,21 @@ bool updateSpoolTagId(String uidString, const char* payload) {
params->spoolsUrl = spoolsUrl; params->spoolsUrl = spoolsUrl;
params->updatePayload = updatePayload; params->updatePayload = updatePayload;
// Add weight update parameters for sequential execution // Erstelle die Task
params->triggerWeightUpdate = (weight > 10);
params->spoolIdForWeight = spoolId;
params->weightValue = weight;
// Erstelle die Task mit erhöhter Stackgröße für zusätzliche HTTP-Anfrage
BaseType_t result = xTaskCreate( BaseType_t result = xTaskCreate(
sendToApi, // Task-Funktion sendToApi, // Task-Funktion
"SendToApiTask", // Task-Name "SendToApiTask", // Task-Name
8192, // Erhöhte Stackgröße für zusätzliche HTTP-Anfrage 6144, // Stackgröße in Bytes
(void*)params, // Parameter (void*)params, // Parameter
0, // Priorität 0, // Priorität
apiTask // Task-Handle (nicht benötigt) NULL // Task-Handle (nicht benötigt)
); );
updateDoc.clear(); updateDoc.clear();
// Update Spool weight now handled sequentially in sendToApi task // Update Spool weight
// to prevent parallel API access issues //TBD: how to handle this with spool and locatin tags? Also potential parallel access again
//if (weight > 10) updateSpoolWeight(doc["sm_id"].as<String>(), weight);
return true; return true;
} }
@@ -451,7 +341,7 @@ uint8_t updateSpoolWeight(String spoolId, uint16_t weight) {
6144, // Stackgröße in Bytes 6144, // Stackgröße in Bytes
(void*)params, // Parameter (void*)params, // Parameter
0, // Priorität 0, // Priorität
apiTask // Task-Handle (nicht benötigt) NULL // Task-Handle (nicht benötigt)
); );
updateDoc.clear(); updateDoc.clear();
@@ -488,8 +378,7 @@ uint8_t updateSpoolLocation(String spoolId, String location){
params->spoolsUrl = spoolsUrl; params->spoolsUrl = spoolsUrl;
params->updatePayload = updatePayload; params->updatePayload = updatePayload;
if(spoolmanApiState == API_IDLE){
if(apiTask == nullptr){
// Erstelle die Task // Erstelle die Task
BaseType_t result = xTaskCreate( BaseType_t result = xTaskCreate(
sendToApi, // Task-Funktion sendToApi, // Task-Funktion
@@ -497,8 +386,9 @@ uint8_t updateSpoolLocation(String spoolId, String location){
6144, // Stackgröße in Bytes 6144, // Stackgröße in Bytes
(void*)params, // Parameter (void*)params, // Parameter
0, // Priorität 0, // Priorität
apiTask // Task-Handle NULL // Task-Handle (nicht benötigt)
); );
}else{ }else{
Serial.println("Not spawning new task, API still active!"); Serial.println("Not spawning new task, API still active!");
} }
@@ -543,7 +433,7 @@ bool updateSpoolOcto(int spoolId) {
6144, // Stackgröße in Bytes 6144, // Stackgröße in Bytes
(void*)params, // Parameter (void*)params, // Parameter
0, // Priorität 0, // Priorität
apiTask // Task-Handle (nicht benötigt) NULL // Task-Handle (nicht benötigt)
); );
updateDoc.clear(); updateDoc.clear();
@@ -596,20 +486,77 @@ bool updateSpoolBambuData(String payload) {
6144, // Stackgröße in Bytes 6144, // Stackgröße in Bytes
(void*)params, // Parameter (void*)params, // Parameter
0, // Priorität 0, // Priorität
apiTask // Task-Handle (nicht benötigt) NULL // Task-Handle (nicht benötigt)
); );
return true; return true;
} }
// #### Brand Filament // #### Filament Fabrik
uint16_t createVendor(String vendor) { uint16_t checkVendor(String vendor) {
oledShowProgressBar(2, 5, "New Brand", "Create new Vendor"); // Check if vendor exists using task system
foundVendorId = 0; // Reset previous value
String spoolsUrl = spoolmanUrl + apiUrl + "/vendor?name=" + vendor;
Serial.print("Check vendor with URL: ");
Serial.println(spoolsUrl);
SendToApiParams* params = new SendToApiParams();
if (params == nullptr) {
Serial.println("Fehler: Kann Speicher für Task-Parameter nicht allokieren.");
return 0;
}
params->requestType = API_REQUEST_VENDOR_CHECK;
params->httpType = "GET";
params->spoolsUrl = spoolsUrl;
params->updatePayload = ""; // Empty for GET request
// Check if API is idle before creating task
if(spoolmanApiState == API_IDLE){
// Erstelle die Task
BaseType_t result = xTaskCreate(
sendToApi, // Task-Funktion
"SendToApiTask", // Task-Name
6144, // Stackgröße in Bytes
(void*)params, // Parameter
0, // Priorität
NULL // Task-Handle (nicht benötigt)
);
} else {
Serial.println("Not spawning new task, API still active!");
delete params;
return 0;
}
// Wait for task completion
while(spoolmanApiState != API_IDLE) {
vTaskDelay(100 / portTICK_PERIOD_MS);
}
// Check if vendor was found
if (foundVendorId == 0) {
Serial.println("Vendor not found, creating new vendor...");
uint16_t vendorId = createVendor(vendor);
if (vendorId == 0) {
Serial.println("Failed to create vendor, returning 0.");
return 0; // Failed to create vendor
} else {
Serial.println("Vendor created with ID: " + String(vendorId));
checkFilament(vendorId);
return vendorId;
}
} else {
Serial.println("Vendor found: " + vendor);
Serial.print("Vendor ID: ");
Serial.println(foundVendorId);
return foundVendorId;
}
}
uint16_t createVendor(String vendor) {
// Create new vendor in Spoolman database using task system // Create new vendor in Spoolman database using task system
// Note: Due to async nature, the ID will be stored in createdVendorId global variable // Note: Due to async nature, the ID will be stored in createdVendorId global variable
// Note: This function assumes that the caller has already ensured API is IDLE createdVendorId = 0; // Reset previous value
createdVendorId = 65535; // Reset previous value
String spoolsUrl = spoolmanUrl + apiUrl + "/vendor"; String spoolsUrl = spoolmanUrl + apiUrl + "/vendor";
Serial.print("Create vendor with URL: "); Serial.print("Create vendor with URL: ");
@@ -619,6 +566,7 @@ uint16_t createVendor(String vendor) {
JsonDocument vendorDoc; JsonDocument vendorDoc;
vendorDoc["name"] = vendor; vendorDoc["name"] = vendor;
vendorDoc["comment"] = "automatically generated"; vendorDoc["comment"] = "automatically generated";
vendorDoc["empty_spool_weight"] = 180;
vendorDoc["external_id"] = vendor; vendorDoc["external_id"] = vendor;
String vendorPayload; String vendorPayload;
@@ -637,66 +585,8 @@ uint16_t createVendor(String vendor) {
params->spoolsUrl = spoolsUrl; params->spoolsUrl = spoolsUrl;
params->updatePayload = vendorPayload; params->updatePayload = vendorPayload;
// Create task without additional API state check since caller ensures synchronization
BaseType_t result = xTaskCreate(
sendToApi, // Task-Funktion
"SendToApiTask", // Task-Name
6144, // Stackgröße in Bytes
(void*)params, // Parameter
0, // Priorität
NULL // Task-Handle (nicht benötigt)
);
if (result != pdPASS) {
Serial.println("Failed to create vendor task!");
delete params;
vendorDoc.clear();
return 0;
}
vendorDoc.clear();
// Delay for Display Bar
vTaskDelay(1000 / portTICK_PERIOD_MS);
// Wait for task completion and return the created vendor ID
// Note: createdVendorId will be set by sendToApi when response is received
while(createdVendorId == 65535) {
vTaskDelay(50 / portTICK_PERIOD_MS);
}
return createdVendorId;
}
uint16_t checkVendor(String vendor) {
oledShowProgressBar(1, 5, "New Brand", "Check Vendor");
// Check if vendor exists using task system
foundVendorId = 65535; // Reset to invalid value to detect when API response is received
String vendorName = vendor;
vendorName.trim();
vendorName.replace(" ", "+");
String spoolsUrl = spoolmanUrl + apiUrl + "/vendor?name=" + vendorName;
Serial.print("Check vendor with URL: ");
Serial.println(spoolsUrl);
SendToApiParams* params = new SendToApiParams();
if (params == nullptr) {
Serial.println("Fehler: Kann Speicher für Task-Parameter nicht allokieren.");
return 0;
}
params->requestType = API_REQUEST_VENDOR_CHECK;
params->httpType = "GET";
params->spoolsUrl = spoolsUrl;
params->updatePayload = ""; // Empty for GET request
// Check if API is idle before creating task // Check if API is idle before creating task
while (spoolmanApiState != API_IDLE) if(spoolmanApiState == API_IDLE){
{
vTaskDelay(100 / portTICK_PERIOD_MS);
}
// Erstelle die Task // Erstelle die Task
BaseType_t result = xTaskCreate( BaseType_t result = xTaskCreate(
sendToApi, // Task-Funktion sendToApi, // Task-Funktion
@@ -706,130 +596,29 @@ uint16_t checkVendor(String vendor) {
0, // Priorität 0, // Priorität
NULL // Task-Handle (nicht benötigt) NULL // Task-Handle (nicht benötigt)
); );
// Wait until foundVendorId is updated by the API response (not 65535 anymore)
while (foundVendorId == 65535)
{
vTaskDelay(50 / portTICK_PERIOD_MS);
}
// Check if vendor was found
if (foundVendorId == 0) {
Serial.println("Vendor not found, creating new vendor...");
uint16_t vendorId = createVendor(vendor);
if (vendorId == 0) {
Serial.println("Failed to create vendor, returning 0.");
return 0; // Failed to create vendor
} else { } else {
Serial.println("Vendor created with ID: " + String(vendorId)); Serial.println("Not spawning new task, API still active!");
return vendorId;
}
} else {
Serial.println("Vendor found: " + vendor);
Serial.print("Vendor ID: ");
Serial.println(foundVendorId);
return foundVendorId;
}
}
uint16_t createFilament(uint16_t vendorId, const JsonDocument& payload) {
oledShowProgressBar(4, 5, "New Brand", "Create Filament");
// Create new filament in Spoolman database using task system
// Note: Due to async nature, the ID will be stored in createdFilamentId global variable
// Note: This function assumes that the caller has already ensured API is IDLE
createdFilamentId = 65535; // Reset previous value
String spoolsUrl = spoolmanUrl + apiUrl + "/filament";
Serial.print("Create filament with URL: ");
Serial.println(spoolsUrl);
// Create JSON payload for filament creation
JsonDocument filamentDoc;
filamentDoc["name"] = payload["cn"].as<String>();
filamentDoc["vendor_id"] = String(vendorId);
filamentDoc["material"] = payload["t"].as<String>();
filamentDoc["density"] = (payload["de"].is<String>() && payload["de"].as<String>().length() > 0) ? payload["de"].as<String>() : "1.24";
filamentDoc["diameter"] = (payload["di"].is<String>() && payload["di"].as<String>().length() > 0) ? payload["di"].as<String>() : "1.75";
filamentDoc["weight"] = String(weight);
filamentDoc["spool_weight"] = payload["sw"].as<String>();
filamentDoc["article_number"] = payload["an"].as<String>();
filamentDoc["settings_extruder_temp"] = payload["et"].is<String>() ? payload["et"].as<String>() : "";
filamentDoc["settings_bed_temp"] = payload["bt"].is<String>() ? payload["bt"].as<String>() : "";
if (payload["an"].is<String>())
{
filamentDoc["external_id"] = payload["an"].as<String>();
filamentDoc["comment"] = payload["u"].is<String>() ? payload["u"].as<String>() + payload["an"].as<String>() : "automatically generated";
}
else
{
filamentDoc["comment"] = payload["u"].is<String>() ? payload["u"].as<String>() : "automatically generated";
}
if (payload["mc"].is<String>()) {
filamentDoc["multi_color_hexes"] = payload["mc"].as<String>();
filamentDoc["multi_color_direction"] = payload["mcd"].is<String>() ? payload["mcd"].as<String>() : "";
}
else
{
filamentDoc["color_hex"] = (payload["c"].is<String>() && payload["c"].as<String>().length() >= 6) ? payload["c"].as<String>() : "FFFFFF";
}
String filamentPayload;
serializeJson(filamentDoc, filamentPayload);
Serial.print("Filament Payload: ");
Serial.println(filamentPayload);
SendToApiParams* params = new SendToApiParams();
if (params == nullptr) {
Serial.println("Fehler: Kann Speicher für Task-Parameter nicht allokieren.");
filamentDoc.clear();
return 0;
}
params->requestType = API_REQUEST_FILAMENT_CREATE;
params->httpType = "POST";
params->spoolsUrl = spoolsUrl;
params->updatePayload = filamentPayload;
// Create task without additional API state check since caller ensures synchronization
BaseType_t result = xTaskCreate(
sendToApi, // Task-Funktion
"SendToApiTask", // Task-Name
6144, // Stackgröße in Bytes
(void*)params, // Parameter
0, // Priorität
NULL // Task-Handle (nicht benötigt)
);
if (result != pdPASS) {
Serial.println("Failed to create filament task!");
delete params; delete params;
filamentDoc.clear(); vendorDoc.clear();
return 0; return 0;
} }
filamentDoc.clear(); vendorDoc.clear();
// Delay for Display Bar // Wait for task completion and return the created vendor ID
vTaskDelay(1000 / portTICK_PERIOD_MS); // Note: createdVendorId will be set by sendToApi when response is received
while(spoolmanApiState != API_IDLE) {
// Wait for task completion and return the created filament ID vTaskDelay(100 / portTICK_PERIOD_MS);
// Note: createdFilamentId will be set by sendToApi when response is received
while(createdFilamentId == 65535) {
vTaskDelay(50 / portTICK_PERIOD_MS);
} }
return createdFilamentId; return createdVendorId;
} }
uint16_t checkFilament(uint16_t vendorId, const JsonDocument& payload) { uint16_t checkFilament(uint16_t vendorId) {
oledShowProgressBar(3, 5, "New Brand", "Check Filament");
// Check if filament exists using task system // Check if filament exists using task system
foundFilamentId = 65535; // Reset to invalid value to detect when API response is received foundFilamentId = 0; // Reset previous value
String spoolsUrl = spoolmanUrl + apiUrl + "/filament?vendor.id=" + String(vendorId) + "&external_id=" + String(payload["artnr"].as<String>()); String spoolsUrl = spoolmanUrl + apiUrl + "/filament?vendor.id=" + String(vendorId);
Serial.print("Check filament with URL: "); Serial.print("Check filament with URL: ");
Serial.println(spoolsUrl); Serial.println(spoolsUrl);
@@ -843,6 +632,8 @@ uint16_t checkFilament(uint16_t vendorId, const JsonDocument& payload) {
params->spoolsUrl = spoolsUrl; params->spoolsUrl = spoolsUrl;
params->updatePayload = ""; // Empty for GET request params->updatePayload = ""; // Empty for GET request
// Check if API is idle before creating task
if(spoolmanApiState == API_IDLE){
// Erstelle die Task // Erstelle die Task
BaseType_t result = xTaskCreate( BaseType_t result = xTaskCreate(
sendToApi, // Task-Funktion sendToApi, // Task-Funktion
@@ -852,21 +643,27 @@ uint16_t checkFilament(uint16_t vendorId, const JsonDocument& payload) {
0, // Priorität 0, // Priorität
NULL // Task-Handle (nicht benötigt) NULL // Task-Handle (nicht benötigt)
); );
} else {
Serial.println("Not spawning new task, API still active!");
delete params;
return 0;
}
// Wait until foundFilamentId is updated by the API response (not 65535 anymore) // Wait for task completion
while (foundFilamentId == 65535) { while(spoolmanApiState != API_IDLE) {
vTaskDelay(50 / portTICK_PERIOD_MS); vTaskDelay(100 / portTICK_PERIOD_MS);
} }
// Check if filament was found // Check if filament was found
if (foundFilamentId == 0) { if (foundFilamentId == 0) {
Serial.println("Filament not found, creating new filament..."); Serial.println("Filament not found, creating new filament...");
uint16_t filamentId = createFilament(vendorId, payload); uint16_t filamentId = createFilament();
if (filamentId == 0) { if (filamentId == 0) {
Serial.println("Failed to create filament, returning 0."); Serial.println("Failed to create filament, returning 0.");
return 0; // Failed to create filament return 0; // Failed to create filament
} else { } else {
Serial.println("Filament created with ID: " + String(filamentId)); Serial.println("Filament created with ID: " + String(filamentId));
checkSpool();
return filamentId; return filamentId;
} }
} else { } else {
@@ -877,121 +674,58 @@ uint16_t checkFilament(uint16_t vendorId, const JsonDocument& payload) {
} }
} }
uint16_t createSpool(uint16_t vendorId, uint16_t filamentId, JsonDocument& payload, String uidString) { bool createFilament() {
oledShowProgressBar(5, 5, "New Brand", "Create new Spool"); // {
// "name": "PolyTerra Charcoal Black",
// "vendor_id": 0,
// "material": "PLA",
// "price": 20,
// "density": 1.24,
// "diameter": 1.75,
// "weight": 1000,
// "spool_weight": 140,
// "article_number": "PM70820",
// "comment": "automatically generated",
// "settings_extruder_temp": 210,
// "settings_bed_temp": 60,
// "color_hex": "FF0000",
// "multi_color_hexes": "FF0000,00FF00,0000FF",
// "multi_color_direction": "coaxial",
// "external_id": "polymaker_pla_polysonicblack_1000_175",
// "extra": {
// "nozzle_temperature": "string"
// }
// }
// Create new spool in Spoolman database using task system
// Note: Due to async nature, the ID will be stored in createdSpoolId global variable
// Note: This function assumes that the caller has already ensured API is IDLE
createdSpoolId = 65535; // Reset to invalid value to detect when API response is received
String spoolsUrl = spoolmanUrl + apiUrl + "/spool";
Serial.print("Create spool with URL: ");
Serial.println(spoolsUrl);
// Create JSON payload for spool creation
JsonDocument spoolDoc;
spoolDoc["filament_id"] = String(filamentId);
spoolDoc["initial_weight"] = weight > 10 ? String(weight - payload["sw"].as<int>()) : "1000";
spoolDoc["spool_weight"] = (payload["sw"].is<String>() && payload["sw"].as<String>().length() > 0) ? payload["sw"].as<String>() : "180";
spoolDoc["remaining_weight"] = spoolDoc["initial_weight"];
spoolDoc["lot_nr"] = (payload["an"].is<String>() && payload["an"].as<String>().length() > 0) ? payload["an"].as<String>() : "";
spoolDoc["comment"] = "automatically generated";
spoolDoc["extra"]["nfc_id"] = "\"" + uidString + "\"";
String spoolPayload;
serializeJson(spoolDoc, spoolPayload);
Serial.print("Spool Payload: ");
Serial.println(spoolPayload);
spoolDoc.clear();
SendToApiParams* params = new SendToApiParams();
if (params == nullptr) {
Serial.println("Fehler: Kann Speicher für Task-Parameter nicht allokieren.");
spoolDoc.clear();
return 0;
}
params->requestType = API_REQUEST_SPOOL_CREATE;
params->httpType = "POST";
params->spoolsUrl = spoolsUrl;
params->updatePayload = spoolPayload;
// Create task without additional API state check since caller ensures synchronization
BaseType_t result = xTaskCreate(
sendToApi, // Task-Funktion
"SendToApiTask", // Task-Name
6144, // Stackgröße in Bytes
(void*)params, // Parameter
0, // Priorität
NULL // Task-Handle (nicht benötigt)
);
if (result != pdPASS) {
Serial.println("Failed to create spool task!");
delete params;
return 0;
}
// Wait for task completion and return the created spool ID
// Note: createdSpoolId will be set by sendToApi when response is received
while(createdSpoolId == 65535) {
vTaskDelay(50 / portTICK_PERIOD_MS);
}
// Write data to tag with startWriteJsonToTag
// void startWriteJsonToTag(const bool isSpoolTag, const char* payload);
// Create optimized JSON structure with sm_id at the beginning for fast-path detection
JsonDocument optimizedPayload;
optimizedPayload["sm_id"] = String(createdSpoolId); // Place sm_id first for fast scanning
optimizedPayload["b"] = payload["b"].as<String>();
optimizedPayload["cn"] = payload["an"].as<String>();
String payloadString;
serializeJson(optimizedPayload, payloadString);
Serial.println("Optimized JSON with sm_id first:");
Serial.println(payloadString);
optimizedPayload.clear();
nfcReaderState = NFC_IDLE;
// Delay for Display Bar
vTaskDelay(1000 / portTICK_PERIOD_MS);
startWriteJsonToTag(true, payloadString.c_str());
return createdSpoolId;
} }
bool createBrandFilament(JsonDocument& payload, String uidString) { uint16_t checkSpool() {
uint16_t vendorId = checkVendor(payload["b"].as<String>());
if (vendorId == 0) {
Serial.println("ERROR: Failed to create/find vendor");
return false;
}
uint16_t filamentId = checkFilament(vendorId, payload); }
if (filamentId == 0) {
Serial.println("ERROR: Failed to create/find filament");
return false;
}
uint16_t spoolId = createSpool(vendorId, filamentId, payload, uidString); bool createSpool() {
if (spoolId == 0) { // Implement specific handling for Spool creation
Serial.println("ERROR: Failed to create spool"); // {
return false; // "first_used": "2019-08-24T14:15:22Z",
} // "last_used": "2019-08-24T14:15:22Z",
// "filament_id": 0,
Serial.println("SUCCESS: Brand filament created with Spool ID: " + String(spoolId)); // "price": 20,
return true; // "initial_weight": 200,
// "spool_weight": 200,
// "remaining_weight": 800,
// "used_weight": 200,
// "location": "Shelf A",
// "lot_nr": "52342",
// "comment": "",
// "archived": false,
// "extra": {
// "nfc_id": "string"
// }
// }
} }
// #### Spoolman init // #### Spoolman init
bool checkSpoolmanExtraFields() { bool checkSpoolmanExtraFields() {
// Only check extra fields if they have not been checked before
if(!spoolmanExtraFieldsChecked){
HTTPClient http; HTTPClient http;
String checkUrls[] = { String checkUrls[] = {
spoolmanUrl + apiUrl + "/field/spool", spoolmanUrl + apiUrl + "/field/spool",
@@ -1139,23 +873,14 @@ bool checkSpoolmanExtraFields() {
http.end(); http.end();
spoolmanExtraFieldsChecked = true;
return true; return true;
}else{
return true;
}
} }
bool checkSpoolmanInstance() { bool checkSpoolmanInstance(const String& url) {
HTTPClient http; HTTPClient http;
bool returnValue = false; String healthUrl = url + apiUrl + "/health";
// Only do the spoolman instance check if there is no active API request going on Serial.print("Überprüfe Spoolman-Instanz unter: ");
if(spoolmanApiState == API_IDLE){
spoolmanApiState = API_TRANSMITTING;
String healthUrl = spoolmanUrl + apiUrl + "/health";
Serial.print("Checking spoolman instance: ");
Serial.println(healthUrl); Serial.println(healthUrl);
http.begin(healthUrl); http.begin(healthUrl);
@@ -1183,30 +908,16 @@ bool checkSpoolmanInstance() {
spoolmanApiState = API_IDLE; spoolmanApiState = API_IDLE;
oledShowTopRow(); oledShowTopRow();
spoolmanConnected = true; spoolmanConnected = true;
returnValue = strcmp(status, "healthy") == 0; return strcmp(status, "healthy") == 0;
}else{
spoolmanConnected = false;
} }
doc.clear(); doc.clear();
}else{
spoolmanConnected = false;
} }
} else { } else {
spoolmanConnected = false;
Serial.println("Error contacting spoolman instance! HTTP Code: " + String(httpCode)); Serial.println("Error contacting spoolman instance! HTTP Code: " + String(httpCode));
} }
http.end(); http.end();
spoolmanApiState = API_IDLE; return false;
}
else
{
// If the check is skipped, return the previous status
Serial.println("Skipping spoolman healthcheck, API is active.");
returnValue = spoolmanConnected;
}
Serial.println("Healthcheck completed!");
return returnValue;
} }
bool saveSpoolmanUrl(const String& url, bool octoOn, const String& octo_url, const String& octoTk) { bool saveSpoolmanUrl(const String& url, bool octoOn, const String& octo_url, const String& octoTk) {
@@ -1219,13 +930,12 @@ bool saveSpoolmanUrl(const String& url, bool octoOn, const String& octo_url, con
preferences.end(); preferences.end();
//TBD: This could be handled nicer in the future //TBD: This could be handled nicer in the future
spoolmanExtraFieldsChecked = false;
spoolmanUrl = url; spoolmanUrl = url;
octoEnabled = octoOn; octoEnabled = octoOn;
octoUrl = octo_url; octoUrl = octo_url;
octoToken = octoTk; octoToken = octoTk;
return checkSpoolmanInstance(); return true;
} }
String loadSpoolmanUrl() { String loadSpoolmanUrl() {
@@ -1245,10 +955,15 @@ String loadSpoolmanUrl() {
bool initSpoolman() { bool initSpoolman() {
oledShowProgressBar(3, 7, DISPLAY_BOOT_TEXT, "Spoolman init"); oledShowProgressBar(3, 7, DISPLAY_BOOT_TEXT, "Spoolman init");
spoolmanUrl = loadSpoolmanUrl(); spoolmanUrl = loadSpoolmanUrl();
spoolmanUrl.trim();
if (spoolmanUrl == "") {
Serial.println("Keine Spoolman-URL gefunden.");
return false;
}
bool success = checkSpoolmanInstance(); bool success = checkSpoolmanInstance(spoolmanUrl);
if (!success) { if (!success) {
Serial.println("Spoolman not available"); Serial.println("Spoolman nicht erreichbar.");
return false; return false;
} }

View File

@@ -20,9 +20,7 @@ typedef enum {
API_REQUEST_SPOOL_LOCATION_UPDATE, API_REQUEST_SPOOL_LOCATION_UPDATE,
API_REQUEST_VENDOR_CREATE, API_REQUEST_VENDOR_CREATE,
API_REQUEST_VENDOR_CHECK, API_REQUEST_VENDOR_CHECK,
API_REQUEST_FILAMENT_CHECK, API_REQUEST_FILAMENT_CHECK
API_REQUEST_FILAMENT_CREATE,
API_REQUEST_SPOOL_CREATE
} SpoolmanApiRequestType; } SpoolmanApiRequestType;
extern volatile spoolmanApiStateType spoolmanApiState; extern volatile spoolmanApiStateType spoolmanApiState;
@@ -32,9 +30,12 @@ extern bool octoEnabled;
extern bool sendOctoUpdate; extern bool sendOctoUpdate;
extern String octoUrl; extern String octoUrl;
extern String octoToken; extern String octoToken;
extern uint16_t createdVendorId; // ID of newly created vendor
extern uint16_t foundVendorId; // ID of found vendor
extern uint16_t foundFilamentId; // ID of found filament
extern bool spoolmanConnected; extern bool spoolmanConnected;
bool checkSpoolmanInstance(); bool checkSpoolmanInstance(const String& url);
bool saveSpoolmanUrl(const String& url, bool octoOn, const String& octoWh, const String& octoTk); bool saveSpoolmanUrl(const String& url, bool octoOn, const String& octoWh, const String& octoTk);
String loadSpoolmanUrl(); // Neue Funktion zum Laden der URL String loadSpoolmanUrl(); // Neue Funktion zum Laden der URL
bool checkSpoolmanExtraFields(); // Neue Funktion zum Überprüfen der Extrafelder bool checkSpoolmanExtraFields(); // Neue Funktion zum Überprüfen der Extrafelder
@@ -45,6 +46,12 @@ uint8_t updateSpoolLocation(String spoolId, String location);
bool initSpoolman(); // Neue Funktion zum Initialisieren von Spoolman bool initSpoolman(); // Neue Funktion zum Initialisieren von Spoolman
bool updateSpoolBambuData(String payload); // Neue Funktion zum Aktualisieren der Bambu-Daten bool updateSpoolBambuData(String payload); // Neue Funktion zum Aktualisieren der Bambu-Daten
bool updateSpoolOcto(int spoolId); // Neue Funktion zum Aktualisieren der Octo-Daten bool updateSpoolOcto(int spoolId); // Neue Funktion zum Aktualisieren der Octo-Daten
bool createBrandFilament(JsonDocument& payload, String uidString); uint16_t checkVendor(String vendor); // Check if vendor exists, return ID
uint16_t createVendor(String vendor); // Create vendor, return ID
uint16_t checkFilament(); // Check if filament exists, return ID
bool createFilament(); // Create filament
uint16_t checkSpool(); // Check if spool exists, return ID
bool createSpool(); // Create spool
void createFilamentFabrik(JsonDocument payload);
#endif #endif

View File

@@ -33,7 +33,6 @@ AMSData ams_data[MAX_AMS]; // Definition des Arrays;
bool removeBambuCredentials() { bool removeBambuCredentials() {
if (BambuMqttTask) { if (BambuMqttTask) {
vTaskDelete(BambuMqttTask); vTaskDelete(BambuMqttTask);
BambuMqttTask = NULL;
} }
Preferences preferences; Preferences preferences;
@@ -64,7 +63,6 @@ bool removeBambuCredentials() {
bool saveBambuCredentials(const String& ip, const String& serialnr, const String& accesscode, bool autoSend, const String& autoSendTime) { bool saveBambuCredentials(const String& ip, const String& serialnr, const String& accesscode, bool autoSend, const String& autoSendTime) {
if (BambuMqttTask) { if (BambuMqttTask) {
vTaskDelete(BambuMqttTask); vTaskDelete(BambuMqttTask);
BambuMqttTask = NULL;
} }
bambuCredentials.ip = ip.c_str(); bambuCredentials.ip = ip.c_str();
@@ -595,7 +593,6 @@ void reconnect() {
Serial.println("Disable Bambu MQTT Task after 5 retries"); Serial.println("Disable Bambu MQTT Task after 5 retries");
//vTaskSuspend(BambuMqttTask); //vTaskSuspend(BambuMqttTask);
vTaskDelete(BambuMqttTask); vTaskDelete(BambuMqttTask);
BambuMqttTask = NULL;
break; break;
} }
@@ -684,7 +681,6 @@ void bambu_restart() {
if (BambuMqttTask) { if (BambuMqttTask) {
vTaskDelete(BambuMqttTask); vTaskDelete(BambuMqttTask);
BambuMqttTask = NULL;
delay(10); delay(10);
} }
setupMqtt(); setupMqtt();

View File

@@ -16,6 +16,7 @@ const uint8_t LOADCELL_DOUT_PIN = 16; //16;
const uint8_t LOADCELL_SCK_PIN = 17; //17; const uint8_t LOADCELL_SCK_PIN = 17; //17;
const uint8_t calVal_eepromAdress = 0; const uint8_t calVal_eepromAdress = 0;
const uint16_t SCALE_LEVEL_WEIGHT = 500; const uint16_t SCALE_LEVEL_WEIGHT = 500;
uint16_t defaultScaleCalibrationValue = 430;
// ***** HX711 // ***** HX711
// ***** TTP223 (Touch Sensor) // ***** TTP223 (Touch Sensor)

View File

@@ -5,6 +5,7 @@
#define BAMBU_DEFAULT_AUTOSEND_TIME 60 #define BAMBU_DEFAULT_AUTOSEND_TIME 60
#define NVS_NAMESPACE_API "api" #define NVS_NAMESPACE_API "api"
#define NVS_KEY_SPOOLMAN_URL "spoolmanUrl" #define NVS_KEY_SPOOLMAN_URL "spoolmanUrl"
#define NVS_KEY_OCTOPRINT_ENABLED "octoEnabled" #define NVS_KEY_OCTOPRINT_ENABLED "octoEnabled"
@@ -21,7 +22,6 @@
#define NVS_NAMESPACE_SCALE "scale" #define NVS_NAMESPACE_SCALE "scale"
#define NVS_KEY_CALIBRATION "cal_value" #define NVS_KEY_CALIBRATION "cal_value"
#define NVS_KEY_AUTOTARE "auto_tare" #define NVS_KEY_AUTOTARE "auto_tare"
#define SCALE_DEFAULT_CALIBRATION_VALUE 430.0f;
#define BAMBU_USERNAME "bblp" #define BAMBU_USERNAME "bblp"
@@ -33,9 +33,6 @@
#define SCREEN_PROGRESS_BAR_HEIGHT 12U #define SCREEN_PROGRESS_BAR_HEIGHT 12U
#define DISPLAY_BOOT_TEXT "FilaMan" #define DISPLAY_BOOT_TEXT "FilaMan"
#define WIFI_CHECK_INTERVAL 60000U
#define DISPLAY_UPDATE_INTERVAL 1000U
#define SPOOLMAN_HEALTHCHECK_INTERVAL 60000U
extern const uint8_t PN532_IRQ; extern const uint8_t PN532_IRQ;
extern const uint8_t PN532_RESET; extern const uint8_t PN532_RESET;

View File

@@ -235,7 +235,7 @@ void oledShowIcon(const char* icon) {
display.display(); display.display();
} }
void oledShowProgressBar(const uint8_t step, const uint8_t numSteps, const char* largeText, const char* statusMessage) { void oledShowProgressBar(const uint8_t step, const uint8_t numSteps, const char* largeText, const char* statusMessage){
assert(step <= numSteps); assert(step <= numSteps);
// clear data and bar area // clear data and bar area

View File

@@ -97,8 +97,7 @@ int16_t lastWeight = 0;
// WIFI check variables // WIFI check variables
unsigned long lastWifiCheckTime = 0; unsigned long lastWifiCheckTime = 0;
unsigned long lastTopRowUpdateTime = 0; const unsigned long wifiCheckInterval = 60000; // Überprüfe alle 60 Sekunden (60000 ms)
unsigned long lastSpoolmanHealcheckTime = 0;
// Button debounce variables // Button debounce variables
unsigned long lastButtonPress = 0; unsigned long lastButtonPress = 0;
@@ -116,23 +115,17 @@ void loop() {
} }
// Überprüfe regelmäßig die WLAN-Verbindung // Überprüfe regelmäßig die WLAN-Verbindung
if (intervalElapsed(currentMillis, lastWifiCheckTime, WIFI_CHECK_INTERVAL)) if (intervalElapsed(currentMillis, lastWifiCheckTime, wifiCheckInterval))
{ {
checkWiFiConnection(); checkWiFiConnection();
} }
// Periodic display update // Periodic display update
if (intervalElapsed(currentMillis, lastTopRowUpdateTime, DISPLAY_UPDATE_INTERVAL)) if (intervalElapsed(currentMillis, lastWifiCheckTime, 1000))
{ {
oledShowTopRow(); oledShowTopRow();
} }
// Periodic spoolman health check
if (intervalElapsed(currentMillis, lastSpoolmanHealcheckTime, SPOOLMAN_HEALTHCHECK_INTERVAL))
{
checkSpoolmanInstance();
}
// Wenn Bambu auto set Spool aktiv // Wenn Bambu auto set Spool aktiv
if (bambuCredentials.autosend_enable && autoSetToBambuSpoolId > 0) if (bambuCredentials.autosend_enable && autoSetToBambuSpoolId > 0)
{ {
@@ -163,17 +156,17 @@ void loop() {
} }
} }
// If scale is not calibrated, only show a warning // Wenn Waage nicht Kalibriert
if (!scaleCalibrated) if (scaleCalibrated == 3)
{ {
// Do not show the warning if the calibratin process is onging oledShowMessage("Scale not calibrated!");
if(!scaleCalibrationActive){ vTaskDelay(5000 / portTICK_PERIOD_MS);
oledShowMessage("Scale not calibrated"); yield();
vTaskDelay(1000 / portTICK_PERIOD_MS); esp_task_wdt_reset();
return;
} }
}
else
{
// Ausgabe der Waage auf Display // Ausgabe der Waage auf Display
if(pauseMainTask == 0) if(pauseMainTask == 0)
{ {
@@ -227,8 +220,7 @@ void loop() {
lastWeight = weight; lastWeight = weight;
// Wenn ein Tag mit SM id erkannte wurde und der Waage Counter anspricht an SM Senden // Wenn ein Tag mit SM id erkannte wurde und der Waage Counter anspricht an SM Senden
if (activeSpoolId != "" && weigthCouterToApi > 3 && weightSend == 0 && nfcReaderState == NFC_READ_SUCCESS && tagProcessed == false && spoolmanApiState == API_IDLE) if (activeSpoolId != "" && weigthCouterToApi > 3 && weightSend == 0 && nfcReaderState == NFC_READ_SUCCESS && tagProcessed == false && spoolmanApiState == API_IDLE) {
{
// set the current tag as processed to prevent it beeing processed again // set the current tag as processed to prevent it beeing processed again
tagProcessed = true; tagProcessed = true;
@@ -236,11 +228,6 @@ void loop() {
{ {
weightSend = 1; weightSend = 1;
// Set Bambu spool ID for auto-send if enabled
if (bambuCredentials.autosend_enable)
{
autoSetToBambuSpoolId = activeSpoolId.toInt();
}
} }
else else
{ {
@@ -249,11 +236,14 @@ void loop() {
} }
} }
if(octoEnabled && sendOctoUpdate && spoolmanApiState == API_IDLE) if(sendOctoUpdate && spoolmanApiState == API_IDLE){
autoSetToBambuSpoolId = activeSpoolId.toInt();
if(octoEnabled)
{ {
updateSpoolOcto(autoSetToBambuSpoolId); updateSpoolOcto(autoSetToBambuSpoolId);
sendOctoUpdate = false;
} }
sendOctoUpdate = false;
} }
esp_task_wdt_reset(); esp_task_wdt_reset();

File diff suppressed because it is too large Load Diff

View File

@@ -16,7 +16,6 @@ typedef enum{
void startNfc(); void startNfc();
void scanRfidTask(void * parameter); void scanRfidTask(void * parameter);
void startWriteJsonToTag(const bool isSpoolTag, const char* payload); void startWriteJsonToTag(const bool isSpoolTag, const char* payload);
bool quickSpoolIdCheck(String uidString);
extern TaskHandle_t RfidReaderTask; extern TaskHandle_t RfidReaderTask;
extern String nfcJsonData; extern String nfcJsonData;
@@ -24,7 +23,6 @@ extern String activeSpoolId;
extern String lastSpoolId; extern String lastSpoolId;
extern volatile nfcReaderStateType nfcReaderState; extern volatile nfcReaderStateType nfcReaderState;
extern volatile bool pauseBambuMqttTask; extern volatile bool pauseBambuMqttTask;
extern volatile bool nfcWriteInProgress;
extern bool tagProcessed; extern bool tagProcessed;

View File

@@ -17,9 +17,8 @@ uint8_t weigthCouterToApi = 0;
uint8_t scale_tare_counter = 0; uint8_t scale_tare_counter = 0;
bool scaleTareRequest = false; bool scaleTareRequest = false;
uint8_t pauseMainTask = 0; uint8_t pauseMainTask = 0;
bool scaleCalibrated; uint8_t scaleCalibrated = 1;
bool autoTare = true; bool autoTare = true;
bool scaleCalibrationActive = false;
// ##### Funktionen für Waage ##### // ##### Funktionen für Waage #####
uint8_t setAutoTare(bool autoTareValue) { uint8_t setAutoTare(bool autoTareValue) {
@@ -89,13 +88,7 @@ void start_scale(bool touchSensorConnected) {
// NVS lesen // NVS lesen
Preferences preferences; Preferences preferences;
preferences.begin(NVS_NAMESPACE_SCALE, true); // true = readonly preferences.begin(NVS_NAMESPACE_SCALE, true); // true = readonly
if(preferences.isKey(NVS_KEY_CALIBRATION)){ calibrationValue = preferences.getFloat(NVS_KEY_CALIBRATION, defaultScaleCalibrationValue);
calibrationValue = preferences.getFloat(NVS_KEY_CALIBRATION);
scaleCalibrated = true;
}else{
calibrationValue = SCALE_DEFAULT_CALIBRATION_VALUE;
scaleCalibrated = false;
}
// auto Tare // auto Tare
// Wenn Touch Sensor verbunden, dann autoTare auf false setzen // Wenn Touch Sensor verbunden, dann autoTare auf false setzen
@@ -110,6 +103,18 @@ void start_scale(bool touchSensorConnected) {
scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN); scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);
if (isnan(calibrationValue) || calibrationValue < 1) {
calibrationValue = defaultScaleCalibrationValue;
scaleCalibrated = 0;
oledShowMessage("Scale not calibrated!");
for (uint16_t i = 0; i < 50000; i++) {
yield();
vTaskDelay(pdMS_TO_TICKS(1));
esp_task_wdt_reset();
}
}
oledShowProgressBar(6, 7, DISPLAY_BOOT_TEXT, "Tare scale"); oledShowProgressBar(6, 7, DISPLAY_BOOT_TEXT, "Tare scale");
for (uint16_t i = 0; i < 2000; i++) { for (uint16_t i = 0; i < 2000; i++) {
yield(); yield();
@@ -117,12 +122,11 @@ void start_scale(bool touchSensorConnected) {
esp_task_wdt_reset(); esp_task_wdt_reset();
} }
while(!scale.is_ready()) { if (scale.wait_ready_timeout(1000))
vTaskDelay(pdMS_TO_TICKS(5000)); {
}
scale.set_scale(calibrationValue); // this value is obtained by calibrating the scale with known weights; see the README for details scale.set_scale(calibrationValue); // this value is obtained by calibrating the scale with known weights; see the README for details
scale.tare(); scale.tare();
}
// Display Gewicht // Display Gewicht
oledShowWeight(0); oledShowWeight(0);
@@ -148,8 +152,6 @@ uint8_t calibrate_scale() {
uint8_t returnState = 0; uint8_t returnState = 0;
float newCalibrationValue; float newCalibrationValue;
scaleCalibrationActive = true;
vTaskSuspend(RfidReaderTask); vTaskSuspend(RfidReaderTask);
vTaskSuspend(ScaleTask); vTaskSuspend(ScaleTask);
@@ -226,7 +228,6 @@ uint8_t calibrate_scale() {
esp_task_wdt_reset(); esp_task_wdt_reset();
} }
scaleCalibrated = true;
returnState = 1; returnState = 1;
} }
else else
@@ -261,7 +262,6 @@ uint8_t calibrate_scale() {
vTaskResume(ScaleTask); vTaskResume(ScaleTask);
pauseBambuMqttTask = false; pauseBambuMqttTask = false;
pauseMainTask = 0; pauseMainTask = 0;
scaleCalibrationActive = false;
return returnState; return returnState;
} }

View File

@@ -15,9 +15,8 @@ extern uint8_t weigthCouterToApi;
extern uint8_t scale_tare_counter; extern uint8_t scale_tare_counter;
extern uint8_t scaleTareRequest; extern uint8_t scaleTareRequest;
extern uint8_t pauseMainTask; extern uint8_t pauseMainTask;
extern bool scaleCalibrated; extern uint8_t scaleCalibrated;
extern bool autoTare; extern bool autoTare;
extern bool scaleCalibrationActive;
extern TaskHandle_t ScaleTask; extern TaskHandle_t ScaleTask;

View File

@@ -48,15 +48,9 @@ void onWsEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventTyp
} else if (type == WS_EVT_PONG) { } else if (type == WS_EVT_PONG) {
Serial.printf("WebSocket Client #%u pong\n", client->id()); Serial.printf("WebSocket Client #%u pong\n", client->id());
} else if (type == WS_EVT_DATA) { } else if (type == WS_EVT_DATA) {
String message = String((char*)data);
JsonDocument doc; JsonDocument doc;
DeserializationError error = deserializeJson(doc, (char*)data, len); deserializeJson(doc, message);
//String message = String((char*)data);
//deserializeJson(doc, message);
if (error) {
Serial.println("JSON deserialization failed: " + String(error.c_str()));
return;
}
if (doc["type"] == "heartbeat") { if (doc["type"] == "heartbeat") {
// Sende Heartbeat-Antwort // Sende Heartbeat-Antwort