Merge branch 'main' into recyclingfabrik

This commit is contained in:
2025-08-27 17:54:32 +02:00
15 changed files with 742 additions and 387 deletions

1
.gitignore vendored
View File

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

View File

@@ -1,5 +1,241 @@
# Changelog
## [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
### Changed
- 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.
[Amazon Link](https://amzn.to/445aaa9)
- **PN532 NFC NXP RFID-Modul V3:** For NFC tag operations.
[Amazon Link](https://amzn.to/4iO6CO4)
[Amazon Link](https://amzn.eu/d/gy9vaBX)
- **NFC Tags NTAG213 NTAG215:** RFID Tag
[Amazon Link](https://amzn.to/3E071xO)
- **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.
[Amazon Link](https://amzn.to/445aaa9)
- **PN532 NFC NXP RFID-Modul V3:** For NFC tag operations.
[Amazon Link](https://amzn.to/4iO6CO4)
[Amazon Link](https://amzn.eu/d/gy9vaBX)
- **NFC Tags NTAG213 NTAG215:** RFID Tag
[Amazon Link](https://amzn.to/3E071xO)
- **TTP223 Touch Sensor (optional):** For reTARE per Button/Touch

View File

@@ -0,0 +1 @@
{"bambu_ip": "192.168.1.14", "bambu_accesscode": "22772584", "bambu_serialnr": "01P00C492600230","autoSendToBambu":true,"autoSendTime": 60}

View File

@@ -7,6 +7,7 @@ let heartbeatTimer = null;
let lastHeartbeatResponse = Date.now();
const HEARTBEAT_TIMEOUT = 20000;
let reconnectTimer = null;
let spoolDetected = false;
// WebSocket Funktionen
function startHeartbeat() {
@@ -508,12 +509,15 @@ function updateNfcStatusIndicator(data) {
if (data.found === 0) {
// Kein NFC Tag gefunden
indicator.className = 'status-circle';
spoolDetected = false;
} else if (data.found === 1) {
// NFC Tag erfolgreich gelesen
indicator.className = 'status-circle success';
spoolDetected = true;
} else {
// Fehler beim Lesen
indicator.className = 'status-circle error';
spoolDetected = true;
}
}
@@ -574,7 +578,7 @@ function updateNfcData(data) {
`;
// Spoolman ID anzeigen
html += `<p><strong>Spoolman ID:</strong> ${data.sm_id || 'No Spoolman ID'}</p>`;
html += `<p><strong>Spoolman ID:</strong> ${data.sm_id} (<a href="${spoolmanUrl}/spool/show/${data.sm_id}">Open in Spoolman</a>)</p>`;
}
else if(data.location)
{
@@ -618,78 +622,83 @@ function updateNfcData(data) {
}
function writeNfcTag() {
const selectedText = document.getElementById("selected-filament").textContent;
if (selectedText === "Please choose...") {
alert('Please select a Spool first.');
return;
}
if(!spoolDetected || confirm("Are you sure you want to overwrite the Tag?") == true){
const selectedText = document.getElementById("selected-filament").textContent;
if (selectedText === "Please choose...") {
alert('Please select a Spool first.');
return;
}
const spoolsData = window.getSpoolData();
const selectedSpool = spoolsData.find(spool =>
`${spool.id} | ${spool.filament.name} (${spool.filament.material})` === selectedText
);
const spoolsData = window.getSpoolData();
const selectedSpool = spoolsData.find(spool =>
`${spool.id} | ${spool.filament.name} (${spool.filament.material})` === selectedText
);
if (!selectedSpool) {
alert('Ausgewählte Spule konnte nicht gefunden werden.');
return;
}
if (!selectedSpool) {
alert('Ausgewählte Spule konnte nicht gefunden werden.');
return;
}
// Temperaturwerte korrekt extrahieren
let minTemp = "175";
let maxTemp = "275";
if (Array.isArray(selectedSpool.filament.nozzle_temperature) &&
selectedSpool.filament.nozzle_temperature.length >= 2) {
minTemp = String(selectedSpool.filament.nozzle_temperature[0]);
maxTemp = String(selectedSpool.filament.nozzle_temperature[1]);
}
// Temperaturwerte korrekt extrahieren
let minTemp = "175";
let maxTemp = "275";
if (Array.isArray(selectedSpool.filament.nozzle_temperature) &&
selectedSpool.filament.nozzle_temperature.length >= 2) {
minTemp = String(selectedSpool.filament.nozzle_temperature[0]);
maxTemp = String(selectedSpool.filament.nozzle_temperature[1]);
}
// Erstelle das NFC-Datenpaket mit korrekten Datentypen
const nfcData = {
color_hex: selectedSpool.filament.color_hex || "FFFFFF",
type: selectedSpool.filament.material,
min_temp: minTemp,
max_temp: maxTemp,
brand: selectedSpool.filament.vendor.name,
sm_id: String(selectedSpool.id) // Konvertiere zu String
};
// Erstelle das NFC-Datenpaket mit korrekten Datentypen
const nfcData = {
color_hex: selectedSpool.filament.color_hex || "FFFFFF",
type: selectedSpool.filament.material,
min_temp: minTemp,
max_temp: maxTemp,
brand: selectedSpool.filament.vendor.name,
sm_id: String(selectedSpool.id) // Konvertiere zu String
};
if (socket?.readyState === WebSocket.OPEN) {
const writeButton = document.getElementById("writeNfcButton");
writeButton.classList.add("writing");
writeButton.textContent = "Writing";
socket.send(JSON.stringify({
type: 'writeNfcTag',
tagType: 'spool',
payload: nfcData
}));
} else {
alert('Not connected to Server. Please check connection.');
if (socket?.readyState === WebSocket.OPEN) {
const writeButton = document.getElementById("writeNfcButton");
writeButton.classList.add("writing");
writeButton.textContent = "Writing";
socket.send(JSON.stringify({
type: 'writeNfcTag',
tagType: 'spool',
payload: nfcData
}));
} else {
alert('Not connected to Server. Please check connection.');
}
}
}
function writeLocationNfcTag() {
const selectedText = document.getElementById("locationSelect").value;
if (selectedText === "Please choose...") {
alert('Please select a location first.');
return;
}
// Erstelle das NFC-Datenpaket mit korrekten Datentypen
const nfcData = {
location: String(selectedText)
};
if(!spoolDetected || confirm("Are you sure you want to overwrite the Tag?") == true){
const selectedText = document.getElementById("locationSelect").value;
if (selectedText === "Please choose...") {
alert('Please select a location first.');
return;
}
// Erstelle das NFC-Datenpaket mit korrekten Datentypen
const nfcData = {
location: String(selectedText)
};
if (socket?.readyState === WebSocket.OPEN) {
const writeButton = document.getElementById("writeLocationNfcButton");
writeButton.classList.add("writing");
writeButton.textContent = "Writing";
socket.send(JSON.stringify({
type: 'writeNfcTag',
tagType: 'location',
payload: nfcData
}));
} else {
alert('Not connected to Server. Please check connection.');
if (socket?.readyState === WebSocket.OPEN) {
const writeButton = document.getElementById("writeLocationNfcButton");
writeButton.classList.add("writing");
writeButton.textContent = "Writing";
socket.send(JSON.stringify({
type: 'writeNfcTag',
tagType: 'location',
payload: nfcData
}));
} else {
alert('Not connected to Server. Please check connection.');
}
}
}

View File

@@ -9,7 +9,7 @@
; https://docs.platformio.org/page/projectconf.html
[common]
version = "1.5.7"
version = "1.5.11"
to_old_version = "1.5.0"
##

View File

@@ -4,8 +4,9 @@
#include "commonFS.h"
#include <Preferences.h>
#include "debug.h"
#include "scale.h"
volatile spoolmanApiStateType spoolmanApiState = API_INIT;
volatile spoolmanApiStateType spoolmanApiState = API_IDLE;
//bool spoolman_connected = false;
String spoolmanUrl = "";
bool octoEnabled = false;
@@ -17,6 +18,8 @@ uint16_t createdVendorId = 0; // Store ID of newly created vendor
uint16_t foundVendorId = 0; // Store ID of found vendor
uint16_t foundFilamentId = 0; // Store ID of found filament
bool spoolmanConnected = false;
bool spoolmanExtraFieldsChecked = false;
TaskHandle_t* apiTask;
struct SendToApiParams {
SpoolmanApiRequestType requestType;
@@ -24,6 +27,10 @@ struct SendToApiParams {
String spoolsUrl;
String updatePayload;
String octoToken;
// Weight update parameters for sequential execution
bool triggerWeightUpdate;
String spoolIdForWeight;
uint16_t weightValue;
};
JsonDocument fetchSingleSpoolInfo(int spoolId) {
@@ -97,15 +104,23 @@ JsonDocument fetchSingleSpoolInfo(int spoolId) {
void sendToApi(void *parameter) {
HEAP_DEBUG_MESSAGE("sendToApi begin");
// Wait until API is IDLE
while(spoolmanApiState != API_IDLE){
Serial.println("Waiting!");
yield();
}
spoolmanApiState = API_TRANSMITTING;
SendToApiParams* params = (SendToApiParams*)parameter;
// Extrahiere die Werte
// Extract values including weight update parameters
SpoolmanApiRequestType requestType = params->requestType;
String httpType = params->httpType;
String spoolsUrl = params->spoolsUrl;
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;
http.setReuse(false);
@@ -212,6 +227,57 @@ void sendToApi(void *parameter) {
}
}
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 {
switch(requestType){
case API_REQUEST_SPOOL_WEIGHT_UPDATE:
@@ -263,7 +329,8 @@ bool updateSpoolTagId(String uidString, const char* payload) {
return false;
}
String spoolsUrl = spoolmanUrl + apiUrl + "/spool/" + doc["sm_id"].as<String>();
String spoolId = doc["sm_id"].as<String>();
String spoolsUrl = spoolmanUrl + apiUrl + "/spool/" + spoolId;
Serial.print("Update Spule mit URL: ");
Serial.println(spoolsUrl);
@@ -287,22 +354,26 @@ bool updateSpoolTagId(String uidString, const char* payload) {
params->httpType = "PATCH";
params->spoolsUrl = spoolsUrl;
params->updatePayload = updatePayload;
// Add weight update parameters for sequential execution
params->triggerWeightUpdate = (weight > 10);
params->spoolIdForWeight = spoolId;
params->weightValue = weight;
// Erstelle die Task
// Erstelle die Task mit erhöhter Stackgröße für zusätzliche HTTP-Anfrage
BaseType_t result = xTaskCreate(
sendToApi, // Task-Funktion
"SendToApiTask", // Task-Name
6144, // Stackgröße in Bytes
8192, // Erhöhte Stackgröße für zusätzliche HTTP-Anfrage
(void*)params, // Parameter
0, // Priorität
NULL // Task-Handle (nicht benötigt)
apiTask // Task-Handle (nicht benötigt)
);
updateDoc.clear();
// Update Spool weight
//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);
// Update Spool weight now handled sequentially in sendToApi task
// to prevent parallel API access issues
return true;
}
@@ -341,7 +412,7 @@ uint8_t updateSpoolWeight(String spoolId, uint16_t weight) {
6144, // Stackgröße in Bytes
(void*)params, // Parameter
0, // Priorität
NULL // Task-Handle (nicht benötigt)
apiTask // Task-Handle (nicht benötigt)
);
updateDoc.clear();
@@ -378,17 +449,17 @@ uint8_t updateSpoolLocation(String spoolId, String location){
params->spoolsUrl = spoolsUrl;
params->updatePayload = updatePayload;
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)
);
if(apiTask == nullptr){
// Erstelle die Task
BaseType_t result = xTaskCreate(
sendToApi, // Task-Funktion
"SendToApiTask", // Task-Name
6144, // Stackgröße in Bytes
(void*)params, // Parameter
0, // Priorität
apiTask // Task-Handle
);
}else{
Serial.println("Not spawning new task, API still active!");
}
@@ -433,7 +504,7 @@ bool updateSpoolOcto(int spoolId) {
6144, // Stackgröße in Bytes
(void*)params, // Parameter
0, // Priorität
NULL // Task-Handle (nicht benötigt)
apiTask // Task-Handle (nicht benötigt)
);
updateDoc.clear();
@@ -486,7 +557,7 @@ bool updateSpoolBambuData(String payload) {
6144, // Stackgröße in Bytes
(void*)params, // Parameter
0, // Priorität
NULL // Task-Handle (nicht benötigt)
apiTask // Task-Handle (nicht benötigt)
);
return true;
@@ -726,198 +797,222 @@ bool createSpool() {
// #### Spoolman init
bool checkSpoolmanExtraFields() {
HTTPClient http;
String checkUrls[] = {
spoolmanUrl + apiUrl + "/field/spool",
spoolmanUrl + apiUrl + "/field/filament"
};
// Only check extra fields if they have not been checked before
if(!spoolmanExtraFieldsChecked){
HTTPClient http;
String checkUrls[] = {
spoolmanUrl + apiUrl + "/field/spool",
spoolmanUrl + apiUrl + "/field/filament"
};
String spoolExtra[] = {
"nfc_id"
};
String spoolExtra[] = {
"nfc_id"
};
String filamentExtra[] = {
"nozzle_temperature",
"price_meter",
"price_gramm",
"bambu_setting_id",
"bambu_cali_id",
"bambu_idx",
"bambu_k",
"bambu_flow_ratio",
"bambu_max_volspeed"
};
String filamentExtra[] = {
"nozzle_temperature",
"price_meter",
"price_gramm",
"bambu_setting_id",
"bambu_cali_id",
"bambu_idx",
"bambu_k",
"bambu_flow_ratio",
"bambu_max_volspeed"
};
String spoolExtraFields[] = {
"{\"name\": \"NFC ID\","
"\"key\": \"nfc_id\","
"\"field_type\": \"text\"}"
};
String spoolExtraFields[] = {
"{\"name\": \"NFC ID\","
"\"key\": \"nfc_id\","
"\"field_type\": \"text\"}"
};
String filamentExtraFields[] = {
"{\"name\": \"Nozzle Temp\","
"\"unit\": \"°C\","
"\"field_type\": \"integer_range\","
"\"default_value\": \"[190,230]\","
"\"key\": \"nozzle_temperature\"}",
String filamentExtraFields[] = {
"{\"name\": \"Nozzle Temp\","
"\"unit\": \"°C\","
"\"field_type\": \"integer_range\","
"\"default_value\": \"[190,230]\","
"\"key\": \"nozzle_temperature\"}",
"{\"name\": \"Price/m\","
"\"unit\": \"\","
"\"field_type\": \"float\","
"\"key\": \"price_meter\"}",
"{\"name\": \"Price/m\","
"\"unit\": \"\","
"\"field_type\": \"float\","
"\"key\": \"price_meter\"}",
"{\"name\": \"Price/g\","
"\"unit\": \"\","
"\"field_type\": \"float\","
"\"key\": \"price_gramm\"}",
"{\"name\": \"Bambu Setting ID\","
"\"field_type\": \"text\","
"\"key\": \"bambu_setting_id\"}",
"{\"name\": \"Bambu Cali ID\","
"\"field_type\": \"text\","
"\"key\": \"bambu_cali_id\"}",
"{\"name\": \"Bambu Filament IDX\","
"\"field_type\": \"text\","
"\"key\": \"bambu_idx\"}",
"{\"name\": \"Bambu k\","
"\"field_type\": \"float\","
"\"key\": \"bambu_k\"}",
"{\"name\": \"Bambu Flow Ratio\","
"\"field_type\": \"float\","
"\"key\": \"bambu_flow_ratio\"}",
"{\"name\": \"Bambu Max Vol. Speed\","
"\"unit\": \"mm3/s\","
"\"field_type\": \"integer\","
"\"default_value\": \"12\","
"\"key\": \"bambu_max_volspeed\"}"
};
Serial.println("Überprüfe Extrafelder...");
int urlLength = sizeof(checkUrls) / sizeof(checkUrls[0]);
for (uint8_t i = 0; i < urlLength; i++) {
Serial.println();
Serial.println("-------- Prüfe Felder für "+checkUrls[i]+" --------");
http.begin(checkUrls[i]);
int httpCode = http.GET();
"{\"name\": \"Price/g\","
"\"unit\": \"\","
"\"field_type\": \"float\","
"\"key\": \"price_gramm\"}",
if (httpCode == HTTP_CODE_OK) {
String payload = http.getString();
JsonDocument doc;
DeserializationError error = deserializeJson(doc, payload);
if (!error) {
String* extraFields;
String* extraFieldData;
u16_t extraLength;
"{\"name\": \"Bambu Setting ID\","
"\"field_type\": \"text\","
"\"key\": \"bambu_setting_id\"}",
"{\"name\": \"Bambu Cali ID\","
"\"field_type\": \"text\","
"\"key\": \"bambu_cali_id\"}",
"{\"name\": \"Bambu Filament IDX\","
"\"field_type\": \"text\","
"\"key\": \"bambu_idx\"}",
"{\"name\": \"Bambu k\","
"\"field_type\": \"float\","
"\"key\": \"bambu_k\"}",
"{\"name\": \"Bambu Flow Ratio\","
"\"field_type\": \"float\","
"\"key\": \"bambu_flow_ratio\"}",
"{\"name\": \"Bambu Max Vol. Speed\","
"\"unit\": \"mm3/s\","
"\"field_type\": \"integer\","
"\"default_value\": \"12\","
"\"key\": \"bambu_max_volspeed\"}"
};
Serial.println("Überprüfe Extrafelder...");
int urlLength = sizeof(checkUrls) / sizeof(checkUrls[0]);
for (uint8_t i = 0; i < urlLength; i++) {
Serial.println();
Serial.println("-------- Prüfe Felder für "+checkUrls[i]+" --------");
http.begin(checkUrls[i]);
int httpCode = http.GET();
if (httpCode == HTTP_CODE_OK) {
String payload = http.getString();
JsonDocument doc;
DeserializationError error = deserializeJson(doc, payload);
if (!error) {
String* extraFields;
String* extraFieldData;
u16_t extraLength;
if (i == 0) {
extraFields = spoolExtra;
extraFieldData = spoolExtraFields;
extraLength = sizeof(spoolExtra) / sizeof(spoolExtra[0]);
} else {
extraFields = filamentExtra;
extraFieldData = filamentExtraFields;
extraLength = sizeof(filamentExtra) / sizeof(filamentExtra[0]);
}
for (uint8_t s = 0; s < extraLength; s++) {
bool found = false;
for (JsonObject field : doc.as<JsonArray>()) {
if (field["key"].is<String>() && field["key"] == extraFields[s]) {
Serial.println("Feld gefunden: " + extraFields[s]);
found = true;
break;
}
if (i == 0) {
extraFields = spoolExtra;
extraFieldData = spoolExtraFields;
extraLength = sizeof(spoolExtra) / sizeof(spoolExtra[0]);
} else {
extraFields = filamentExtra;
extraFieldData = filamentExtraFields;
extraLength = sizeof(filamentExtra) / sizeof(filamentExtra[0]);
}
if (!found) {
Serial.println("Feld nicht gefunden: " + extraFields[s]);
// Extrafeld hinzufügen
http.begin(checkUrls[i] + "/" + extraFields[s]);
http.addHeader("Content-Type", "application/json");
int httpCode = http.POST(extraFieldData[s]);
for (uint8_t s = 0; s < extraLength; s++) {
bool found = false;
for (JsonObject field : doc.as<JsonArray>()) {
if (field["key"].is<String>() && field["key"] == extraFields[s]) {
Serial.println("Feld gefunden: " + extraFields[s]);
found = true;
break;
}
}
if (!found) {
Serial.println("Feld nicht gefunden: " + extraFields[s]);
if (httpCode > 0) {
// Antwortscode und -nachricht abrufen
String response = http.getString();
//Serial.println("HTTP-Code: " + String(httpCode));
//Serial.println("Antwort: " + response);
if (httpCode != HTTP_CODE_OK) {
// Extrafeld hinzufügen
http.begin(checkUrls[i] + "/" + extraFields[s]);
http.addHeader("Content-Type", "application/json");
int httpCode = http.POST(extraFieldData[s]);
if (httpCode > 0) {
// Antwortscode und -nachricht abrufen
String response = http.getString();
//Serial.println("HTTP-Code: " + String(httpCode));
//Serial.println("Antwort: " + response);
if (httpCode != HTTP_CODE_OK) {
return false;
}
} else {
// Fehler beim Senden der Anfrage
Serial.println("Fehler beim Senden der Anfrage: " + String(http.errorToString(httpCode)));
return false;
}
} else {
// Fehler beim Senden der Anfrage
Serial.println("Fehler beim Senden der Anfrage: " + String(http.errorToString(httpCode)));
return false;
//http.end();
}
//http.end();
yield();
vTaskDelay(100 / portTICK_PERIOD_MS);
}
yield();
vTaskDelay(100 / portTICK_PERIOD_MS);
}
doc.clear();
}
doc.clear();
}
Serial.println("-------- ENDE Prüfe Felder --------");
Serial.println();
http.end();
spoolmanExtraFieldsChecked = true;
return true;
}else{
return true;
}
Serial.println("-------- ENDE Prüfe Felder --------");
Serial.println();
http.end();
return true;
}
bool checkSpoolmanInstance(const String& url) {
bool checkSpoolmanInstance() {
HTTPClient http;
String healthUrl = url + apiUrl + "/health";
bool returnValue = false;
Serial.print("Überprüfe Spoolman-Instanz unter: ");
Serial.println(healthUrl);
// Only do the spoolman instance check if there is no active API request going on
if(spoolmanApiState == API_IDLE){
spoolmanApiState = API_TRANSMITTING;
String healthUrl = spoolmanUrl + apiUrl + "/health";
http.begin(healthUrl);
int httpCode = http.GET();
Serial.print("Checking spoolman instance: ");
Serial.println(healthUrl);
if (httpCode > 0) {
if (httpCode == HTTP_CODE_OK) {
String payload = http.getString();
JsonDocument doc;
DeserializationError error = deserializeJson(doc, payload);
if (!error && doc["status"].is<String>()) {
const char* status = doc["status"];
http.end();
http.begin(healthUrl);
int httpCode = http.GET();
if (!checkSpoolmanExtraFields()) {
Serial.println("Fehler beim Überprüfen der Extrafelder.");
if (httpCode > 0) {
if (httpCode == HTTP_CODE_OK) {
String payload = http.getString();
JsonDocument doc;
DeserializationError error = deserializeJson(doc, payload);
if (!error && doc["status"].is<String>()) {
const char* status = doc["status"];
http.end();
// TBD
oledShowMessage("Spoolman Error creating Extrafields");
vTaskDelay(2000 / portTICK_PERIOD_MS);
return false;
if (!checkSpoolmanExtraFields()) {
Serial.println("Fehler beim Überprüfen der Extrafelder.");
// TBD
oledShowMessage("Spoolman Error creating Extrafields");
vTaskDelay(2000 / portTICK_PERIOD_MS);
return false;
}
spoolmanApiState = API_IDLE;
oledShowTopRow();
spoolmanConnected = true;
returnValue = strcmp(status, "healthy") == 0;
}else{
spoolmanConnected = false;
}
spoolmanApiState = API_IDLE;
oledShowTopRow();
spoolmanConnected = true;
return strcmp(status, "healthy") == 0;
doc.clear();
}else{
spoolmanConnected = false;
}
doc.clear();
} else {
spoolmanConnected = false;
Serial.println("Error contacting spoolman instance! HTTP Code: " + String(httpCode));
}
} else {
Serial.println("Error contacting spoolman instance! HTTP Code: " + String(httpCode));
http.end();
returnValue = false;
spoolmanApiState = API_IDLE;
}else{
// If the check is skipped, return the previous status
Serial.println("Skipping spoolman healthcheck, API is active.");
returnValue = spoolmanConnected;
}
http.end();
return false;
Serial.println("Healthcheck completed!");
return returnValue;
}
bool saveSpoolmanUrl(const String& url, bool octoOn, const String& octo_url, const String& octoTk) {
@@ -930,12 +1025,13 @@ bool saveSpoolmanUrl(const String& url, bool octoOn, const String& octo_url, con
preferences.end();
//TBD: This could be handled nicer in the future
spoolmanExtraFieldsChecked = false;
spoolmanUrl = url;
octoEnabled = octoOn;
octoUrl = octo_url;
octoToken = octoTk;
return true;
return checkSpoolmanInstance();
}
String loadSpoolmanUrl() {
@@ -955,15 +1051,10 @@ String loadSpoolmanUrl() {
bool initSpoolman() {
oledShowProgressBar(3, 7, DISPLAY_BOOT_TEXT, "Spoolman init");
spoolmanUrl = loadSpoolmanUrl();
spoolmanUrl.trim();
if (spoolmanUrl == "") {
Serial.println("Keine Spoolman-URL gefunden.");
return false;
}
bool success = checkSpoolmanInstance(spoolmanUrl);
bool success = checkSpoolmanInstance();
if (!success) {
Serial.println("Spoolman nicht erreichbar.");
Serial.println("Spoolman not available");
return false;
}

View File

@@ -35,7 +35,7 @@ extern uint16_t foundVendorId; // ID of found vendor
extern uint16_t foundFilamentId; // ID of found filament
extern bool spoolmanConnected;
bool checkSpoolmanInstance(const String& url);
bool checkSpoolmanInstance();
bool saveSpoolmanUrl(const String& url, bool octoOn, const String& octoWh, const String& octoTk);
String loadSpoolmanUrl(); // Neue Funktion zum Laden der URL
bool checkSpoolmanExtraFields(); // Neue Funktion zum Überprüfen der Extrafelder

View File

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

View File

@@ -3,36 +3,39 @@
#include <Arduino.h>
#define BAMBU_DEFAULT_AUTOSEND_TIME 60
#define BAMBU_DEFAULT_AUTOSEND_TIME 60
#define NVS_NAMESPACE_API "api"
#define NVS_KEY_SPOOLMAN_URL "spoolmanUrl"
#define NVS_KEY_OCTOPRINT_ENABLED "octoEnabled"
#define NVS_KEY_OCTOPRINT_URL "octoUrl"
#define NVS_KEY_OCTOPRINT_TOKEN "octoToken"
#define NVS_NAMESPACE_API "api"
#define NVS_KEY_SPOOLMAN_URL "spoolmanUrl"
#define NVS_KEY_OCTOPRINT_ENABLED "octoEnabled"
#define NVS_KEY_OCTOPRINT_URL "octoUrl"
#define NVS_KEY_OCTOPRINT_TOKEN "octoToken"
#define NVS_NAMESPACE_BAMBU "bambu"
#define NVS_KEY_BAMBU_IP "bambuIp"
#define NVS_KEY_BAMBU_ACCESSCODE "bambuCode"
#define NVS_KEY_BAMBU_SERIAL "bambuSerial"
#define NVS_KEY_BAMBU_AUTOSEND_ENABLE "autosendEnable"
#define NVS_KEY_BAMBU_AUTOSEND_TIME "autosendTime"
#define NVS_NAMESPACE_BAMBU "bambu"
#define NVS_KEY_BAMBU_IP "bambuIp"
#define NVS_KEY_BAMBU_ACCESSCODE "bambuCode"
#define NVS_KEY_BAMBU_SERIAL "bambuSerial"
#define NVS_KEY_BAMBU_AUTOSEND_ENABLE "autosendEnable"
#define NVS_KEY_BAMBU_AUTOSEND_TIME "autosendTime"
#define NVS_NAMESPACE_SCALE "scale"
#define NVS_KEY_CALIBRATION "cal_value"
#define NVS_KEY_AUTOTARE "auto_tare"
#define SCALE_DEFAULT_CALIBRATION_VALUE 430.0f;
#define NVS_NAMESPACE_SCALE "scale"
#define NVS_KEY_CALIBRATION "cal_value"
#define NVS_KEY_AUTOTARE "auto_tare"
#define BAMBU_USERNAME "bblp"
#define BAMBU_USERNAME "bblp"
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3CU // See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
#define SCREEN_WIDTH 128U
#define SCREEN_HEIGHT 64U
#define SCREEN_TOP_BAR_HEIGHT 16U
#define SCREEN_PROGRESS_BAR_HEIGHT 12U
#define DISPLAY_BOOT_TEXT "FilaMan"
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3CU // See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
#define SCREEN_WIDTH 128U
#define SCREEN_HEIGHT 64U
#define SCREEN_TOP_BAR_HEIGHT 16U
#define SCREEN_PROGRESS_BAR_HEIGHT 12U
#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_RESET;

View File

@@ -97,7 +97,8 @@ int16_t lastWeight = 0;
// WIFI check variables
unsigned long lastWifiCheckTime = 0;
const unsigned long wifiCheckInterval = 60000; // Überprüfe alle 60 Sekunden (60000 ms)
unsigned long lastTopRowUpdateTime = 0;
unsigned long lastSpoolmanHealcheckTime = 0;
// Button debounce variables
unsigned long lastButtonPress = 0;
@@ -115,17 +116,23 @@ void loop() {
}
// Überprüfe regelmäßig die WLAN-Verbindung
if (intervalElapsed(currentMillis, lastWifiCheckTime, wifiCheckInterval))
if (intervalElapsed(currentMillis, lastWifiCheckTime, WIFI_CHECK_INTERVAL))
{
checkWiFiConnection();
}
// Periodic display update
if (intervalElapsed(currentMillis, lastWifiCheckTime, 1000))
if (intervalElapsed(currentMillis, lastTopRowUpdateTime, DISPLAY_UPDATE_INTERVAL))
{
oledShowTopRow();
}
// Periodic spoolman health check
if (intervalElapsed(currentMillis, lastSpoolmanHealcheckTime, SPOOLMAN_HEALTHCHECK_INTERVAL))
{
checkSpoolmanInstance();
}
// Wenn Bambu auto set Spool aktiv
if (bambuCredentials.autosend_enable && autoSetToBambuSpoolId > 0)
{
@@ -156,94 +163,95 @@ void loop() {
}
}
// Wenn Waage nicht Kalibriert
if (scaleCalibrated == 3)
// If scale is not calibrated, only show a warning
if (!scaleCalibrated)
{
oledShowMessage("Scale not calibrated!");
vTaskDelay(5000 / portTICK_PERIOD_MS);
yield();
esp_task_wdt_reset();
return;
}
// Ausgabe der Waage auf Display
if(pauseMainTask == 0)
{
if (mainTaskWasPaused || (weight != lastWeight && nfcReaderState == NFC_IDLE && (!bambuCredentials.autosend_enable || autoSetToBambuSpoolId == 0)))
{
(weight < 2) ? ((weight < -2) ? oledShowMessage("!! -0") : oledShowWeight(0)) : oledShowWeight(weight);
// Do not show the warning if the calibratin process is onging
if(!scaleCalibrationActive){
oledShowMessage("Scale not calibrated");
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
mainTaskWasPaused = false;
}
else
{
mainTaskWasPaused = true;
}
// Wenn Timer abgelaufen und nicht gerade ein RFID-Tag geschrieben wird
if (currentMillis - lastWeightReadTime >= weightReadInterval && nfcReaderState < NFC_WRITING)
{
lastWeightReadTime = currentMillis;
// Prüfen ob die Waage korrekt genullt ist
// Abweichung von 2g ignorieren
if (autoTare && (weight > 2 && weight < 7) || weight < -2)
}else{
// Ausgabe der Waage auf Display
if(pauseMainTask == 0)
{
scale_tare_counter++;
if (mainTaskWasPaused || (weight != lastWeight && nfcReaderState == NFC_IDLE && (!bambuCredentials.autosend_enable || autoSetToBambuSpoolId == 0)))
{
(weight < 2) ? ((weight < -2) ? oledShowMessage("!! -0") : oledShowWeight(0)) : oledShowWeight(weight);
}
mainTaskWasPaused = false;
}
else
{
scale_tare_counter = 0;
mainTaskWasPaused = true;
}
// Prüfen ob das Gewicht gleich bleibt und dann senden
if (abs(weight - lastWeight) <= 2 && weight > 5)
// Wenn Timer abgelaufen und nicht gerade ein RFID-Tag geschrieben wird
if (currentMillis - lastWeightReadTime >= weightReadInterval && nfcReaderState < NFC_WRITING)
{
weigthCouterToApi++;
}
else
lastWeightReadTime = currentMillis;
// Prüfen ob die Waage korrekt genullt ist
// Abweichung von 2g ignorieren
if (autoTare && (weight > 2 && weight < 7) || weight < -2)
{
scale_tare_counter++;
}
else
{
scale_tare_counter = 0;
}
// Prüfen ob das Gewicht gleich bleibt und dann senden
if (abs(weight - lastWeight) <= 2 && weight > 5)
{
weigthCouterToApi++;
}
else
{
weigthCouterToApi = 0;
weightSend = 0;
}
}
// reset weight counter after writing tag
// TBD: what exactly is the logic behind this?
if (currentMillis - lastWeightReadTime >= weightReadInterval && nfcReaderState != NFC_IDLE && nfcReaderState != NFC_READ_SUCCESS)
{
weigthCouterToApi = 0;
weightSend = 0;
}
}
lastWeight = weight;
// reset weight counter after writing tag
// TBD: what exactly is the logic behind this?
if (currentMillis - lastWeightReadTime >= weightReadInterval && nfcReaderState != NFC_IDLE && nfcReaderState != NFC_READ_SUCCESS)
{
weigthCouterToApi = 0;
}
lastWeight = weight;
// 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) {
// set the current tag as processed to prevent it beeing processed again
tagProcessed = true;
if (updateSpoolWeight(activeSpoolId, weight))
// 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)
{
weightSend = 1;
}
else
{
oledShowIcon("failed");
vTaskDelay(2000 / portTICK_PERIOD_MS);
}
}
// set the current tag as processed to prevent it beeing processed again
tagProcessed = true;
if(sendOctoUpdate && spoolmanApiState == API_IDLE){
autoSetToBambuSpoolId = activeSpoolId.toInt();
if (updateSpoolWeight(activeSpoolId, weight))
{
weightSend = 1;
// Set Bambu spool ID for auto-send if enabled
if (bambuCredentials.autosend_enable)
{
autoSetToBambuSpoolId = activeSpoolId.toInt();
}
}
else
{
oledShowIcon("failed");
vTaskDelay(2000 / portTICK_PERIOD_MS);
}
}
if(octoEnabled)
if(octoEnabled && sendOctoUpdate && spoolmanApiState == API_IDLE)
{
updateSpoolOcto(autoSetToBambuSpoolId);
sendOctoUpdate = false;
}
sendOctoUpdate = false;
}
esp_task_wdt_reset();

View File

@@ -8,6 +8,7 @@
#include "esp_task_wdt.h"
#include "scale.h"
#include "bambu.h"
#include "main.h"
//Adafruit_PN532 nfc(PN532_SCK, PN532_MISO, PN532_MOSI, PN532_SS);
Adafruit_PN532 nfc(PN532_IRQ, PN532_RESET);
@@ -20,6 +21,8 @@ String lastSpoolId = "";
String nfcJsonData = "";
bool tagProcessed = false;
volatile bool pauseBambuMqttTask = false;
volatile bool nfcReadingTaskSuspendRequest = false;
volatile bool nfcReadingTaskSuspendState = false;
struct NfcWriteParameterType {
bool tagType;
@@ -249,8 +252,6 @@ bool decodeNdefAndReturnJson(const byte* encodedMessage) {
Serial.println("SPOOL-ID gefunden: " + doc["sm_id"].as<String>());
activeSpoolId = doc["sm_id"].as<String>();
lastSpoolId = activeSpoolId;
Serial.println("Api state: " + String(spoolmanApiState));
}
else if(doc["location"].is<String>() && doc["location"] != "")
{
@@ -296,19 +297,21 @@ void writeJsonToTag(void *parameter) {
Serial.println(params->payload);
nfcReaderState = NFC_WRITING;
vTaskSuspend(RfidReaderTask);
vTaskDelay(50 / portTICK_PERIOD_MS);
// First request the reading task to be suspended and than wait until it responds
nfcReadingTaskSuspendRequest = true;
while(nfcReadingTaskSuspendState == false){
vTaskDelay(100 / portTICK_PERIOD_MS);
}
//pauseBambuMqttTask = true;
// aktualisieren der Website wenn sich der Status ändert
sendNfcData();
vTaskDelay(100 / portTICK_PERIOD_MS);
Serial.println("CP 1");
// Wait 10sec for tag
uint8_t success = 0;
String uidString = "";
for (uint16_t i = 0; i < 20; i++) {
Serial.println("CP 2");
uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 }; // Buffer to store the returned UID
uint8_t uidLength;
// yield before potentially waiting for 400ms
@@ -316,7 +319,6 @@ void writeJsonToTag(void *parameter) {
esp_task_wdt_reset();
success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength, 400);
if (success) {
Serial.println("CP 3.1");
for (uint8_t i = 0; i < uidLength; i++) {
//TBD: Rework to remove all the string operations
uidString += String(uid[i], HEX);
@@ -326,8 +328,6 @@ void writeJsonToTag(void *parameter) {
}
foundNfcTag(nullptr, success);
break;
}else{
Serial.println("CP 3.2");
}
yield();
@@ -390,7 +390,7 @@ void writeJsonToTag(void *parameter) {
sendWriteResult(nullptr, success);
sendNfcData();
vTaskResume(RfidReaderTask);
nfcReadingTaskSuspendRequest = false;
pauseBambuMqttTask = false;
vTaskDelete(NULL);
@@ -402,7 +402,7 @@ void startWriteJsonToTag(const bool isSpoolTag, const char* payload) {
parameters->payload = strdup(payload);
// Task nicht mehrfach starten
if (nfcReaderState == NFC_IDLE) {
if (nfcReaderState == NFC_IDLE || nfcReaderState == NFC_READ_ERROR || nfcReaderState == NFC_READ_SUCCESS) {
oledShowProgressBar(0, 1, "Write Tag", "Place tag now");
// Erstelle die Task
xTaskCreate(
@@ -423,15 +423,16 @@ void scanRfidTask(void * parameter) {
Serial.println("RFID Task gestartet");
for(;;) {
// Wenn geschrieben wird Schleife aussetzen
if (nfcReaderState != NFC_WRITING)
if (nfcReaderState != NFC_WRITING && !nfcReadingTaskSuspendRequest && !booting)
{
nfcReadingTaskSuspendState = false;
yield();
uint8_t success;
uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 }; // Buffer to store the returned UID
uint8_t uidLength;
success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength, 1000);
success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength, 500);
foundNfcTag(nullptr, success);
@@ -448,8 +449,8 @@ void scanRfidTask(void * parameter) {
oledShowProgressBar(0, octoEnabled?5:4, "Reading", "Detecting tag");
vTaskDelay(500 / portTICK_PERIOD_MS);
//vTaskDelay(500 / portTICK_PERIOD_MS);
if (uidLength == 7)
{
uint16_t tagSize = readTagSize();
@@ -505,7 +506,7 @@ void scanRfidTask(void * parameter) {
}
}
if (!success && nfcReaderState != NFC_IDLE)
if (!success && nfcReaderState != NFC_IDLE && !nfcReadingTaskSuspendRequest)
{
nfcReaderState = NFC_IDLE;
//uidString = "";
@@ -518,6 +519,12 @@ void scanRfidTask(void * parameter) {
// aktualisieren der Website wenn sich der Status ändert
sendNfcData();
}
else
{
nfcReadingTaskSuspendState = true;
Serial.println("NFC Reading disabled");
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
yield();
}
}

View File

@@ -17,8 +17,9 @@ uint8_t weigthCouterToApi = 0;
uint8_t scale_tare_counter = 0;
bool scaleTareRequest = false;
uint8_t pauseMainTask = 0;
uint8_t scaleCalibrated = 1;
bool scaleCalibrated;
bool autoTare = true;
bool scaleCalibrationActive = false;
// ##### Funktionen für Waage #####
uint8_t setAutoTare(bool autoTareValue) {
@@ -88,7 +89,13 @@ void start_scale(bool touchSensorConnected) {
// NVS lesen
Preferences preferences;
preferences.begin(NVS_NAMESPACE_SCALE, true); // true = readonly
calibrationValue = preferences.getFloat(NVS_KEY_CALIBRATION, defaultScaleCalibrationValue);
if(preferences.isKey(NVS_KEY_CALIBRATION)){
calibrationValue = preferences.getFloat(NVS_KEY_CALIBRATION);
scaleCalibrated = true;
}else{
calibrationValue = SCALE_DEFAULT_CALIBRATION_VALUE;
scaleCalibrated = false;
}
// auto Tare
// Wenn Touch Sensor verbunden, dann autoTare auf false setzen
@@ -103,18 +110,6 @@ void start_scale(bool touchSensorConnected) {
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");
for (uint16_t i = 0; i < 2000; i++) {
yield();
@@ -152,6 +147,8 @@ uint8_t calibrate_scale() {
uint8_t returnState = 0;
float newCalibrationValue;
scaleCalibrationActive = true;
vTaskSuspend(RfidReaderTask);
vTaskSuspend(ScaleTask);
@@ -228,6 +225,7 @@ uint8_t calibrate_scale() {
esp_task_wdt_reset();
}
scaleCalibrated = true;
returnState = 1;
}
else
@@ -262,6 +260,7 @@ uint8_t calibrate_scale() {
vTaskResume(ScaleTask);
pauseBambuMqttTask = false;
pauseMainTask = 0;
scaleCalibrationActive = false;
return returnState;
}

View File

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