Compare commits

..

2 Commits

11 changed files with 729 additions and 552 deletions

View File

@@ -1,35 +1,5 @@
# Changelog # Changelog
## [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

@@ -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

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

View File

@@ -4,9 +4,8 @@
#include "commonFS.h" #include "commonFS.h"
#include <Preferences.h> #include <Preferences.h>
#include "debug.h" #include "debug.h"
#include "scale.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;
@@ -14,9 +13,10 @@ bool sendOctoUpdate = false;
String octoUrl = ""; String octoUrl = "";
String octoToken = ""; String octoToken = "";
uint16_t remainingWeight = 0; uint16_t remainingWeight = 0;
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 spoolmanConnected = false;
bool spoolmanExtraFieldsChecked = false;
TaskHandle_t* apiTask;
struct SendToApiParams { struct SendToApiParams {
SpoolmanApiRequestType requestType; SpoolmanApiRequestType requestType;
@@ -24,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) {
@@ -101,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){
Serial.println("Waiting!");
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);
@@ -129,6 +117,7 @@ void sendToApi(void *parameter) {
int httpCode; int httpCode;
if (httpType == "PATCH") httpCode = http.PATCH(updatePayload); if (httpType == "PATCH") httpCode = http.PATCH(updatePayload);
else if (httpType == "POST") httpCode = http.POST(updatePayload); else if (httpType == "POST") httpCode = http.POST(updatePayload);
else if (httpType == "GET") httpCode = http.GET();
else httpCode = http.PUT(updatePayload); else httpCode = http.PUT(updatePayload);
if (httpCode == HTTP_CODE_OK) { if (httpCode == HTTP_CODE_OK) {
@@ -168,60 +157,61 @@ void sendToApi(void *parameter) {
oledShowProgressBar(5, 5, "Spool Tag", ("Done: " + String(remainingWeight) + " g remain").c_str()); oledShowProgressBar(5, 5, "Spool Tag", ("Done: " + String(remainingWeight) + " g remain").c_str());
remainingWeight = 0; remainingWeight = 0;
break; break;
case API_REQUEST_VENDOR_CREATE:
Serial.println("Vendor successfully created!");
createdVendorId = doc["id"].as<uint16_t>();
Serial.print("Created Vendor ID: ");
Serial.println(createdVendorId);
oledShowProgressBar(1, 1, "Vendor", "Created!");
break;
case API_REQUEST_VENDOR_CHECK:
if (doc.isNull() || doc.size() == 0) {
Serial.println("Vendor not found in response");
foundVendorId = 0;
} else {
foundVendorId = doc[0]["id"].as<uint16_t>();
Serial.print("Found Vendor ID: ");
Serial.println(foundVendorId);
}
break;
case API_REQUEST_FILAMENT_CHECK:
if (doc.isNull() || doc.size() == 0) {
Serial.println("Filament not found in response");
foundFilamentId = 0;
} else {
foundFilamentId = doc[0]["id"].as<uint16_t>();
Serial.print("Found Filament ID: ");
Serial.println(foundFilamentId);
}
break;
} }
} }
doc.clear(); doc.clear();
} else if (httpCode == HTTP_CODE_CREATED) {
Serial.println("Spoolman erfolgreich erstellt");
// Execute weight update if requested and tag update was successful // Parse response for created resources
if (triggerWeightUpdate && requestType == API_REQUEST_SPOOL_TAG_ID_UPDATE && weightValue > 10) { String payload = http.getString();
Serial.println("Executing weight update after successful tag update"); JsonDocument doc;
DeserializationError error = deserializeJson(doc, payload);
// Prepare weight update request if (error) {
String weightUrl = spoolmanUrl + apiUrl + "/spool/" + spoolIdForWeight + "/measure"; Serial.print("Fehler beim Parsen der JSON-Antwort: ");
JsonDocument weightDoc; Serial.println(error.c_str());
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 { } else {
sendOctoUpdate = true; switch(requestType){
case API_REQUEST_VENDOR_CREATE:
Serial.println("Vendor successfully created!");
createdVendorId = doc["id"].as<uint16_t>();
Serial.print("Created Vendor ID: ");
Serial.println(createdVendorId);
oledShowProgressBar(1, 1, "Vendor", "Created!");
break;
default:
// Handle other create operations if needed
break;
} }
} }
weightResponseDoc.clear(); doc.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:
@@ -235,6 +225,9 @@ void sendToApi(void *parameter) {
case API_REQUEST_BAMBU_UPDATE: case API_REQUEST_BAMBU_UPDATE:
oledShowProgressBar(1, 1, "Failure!", "Bambu update"); oledShowProgressBar(1, 1, "Failure!", "Bambu update");
break; break;
case API_REQUEST_VENDOR_CREATE:
oledShowProgressBar(1, 1, "Failure!", "Vendor create");
break;
} }
Serial.println("Fehler beim Senden an Spoolman! HTTP Code: " + String(httpCode)); Serial.println("Fehler beim Senden an Spoolman! HTTP Code: " + String(httpCode));
@@ -270,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);
@@ -296,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;
} }
@@ -353,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();
@@ -390,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
@@ -399,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!");
} }
@@ -445,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();
@@ -498,16 +486,246 @@ 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;
} }
// #### Filament Fabrik
uint16_t checkVendor(String 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
// Note: Due to async nature, the ID will be stored in createdVendorId global variable
createdVendorId = 0; // Reset previous value
String spoolsUrl = spoolmanUrl + apiUrl + "/vendor";
Serial.print("Create vendor with URL: ");
Serial.println(spoolsUrl);
// Create JSON payload for vendor creation
JsonDocument vendorDoc;
vendorDoc["name"] = vendor;
vendorDoc["comment"] = "automatically generated";
vendorDoc["empty_spool_weight"] = 180;
vendorDoc["external_id"] = vendor;
String vendorPayload;
serializeJson(vendorDoc, vendorPayload);
Serial.print("Vendor Payload: ");
Serial.println(vendorPayload);
SendToApiParams* params = new SendToApiParams();
if (params == nullptr) {
Serial.println("Fehler: Kann Speicher für Task-Parameter nicht allokieren.");
vendorDoc.clear();
return 0;
}
params->requestType = API_REQUEST_VENDOR_CREATE;
params->httpType = "POST";
params->spoolsUrl = spoolsUrl;
params->updatePayload = vendorPayload;
// 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;
vendorDoc.clear();
return 0;
}
vendorDoc.clear();
// Wait for task completion and return the created vendor ID
// Note: createdVendorId will be set by sendToApi when response is received
while(spoolmanApiState != API_IDLE) {
vTaskDelay(100 / portTICK_PERIOD_MS);
}
return createdVendorId;
}
uint16_t checkFilament(uint16_t vendorId) {
// Check if filament exists using task system
foundFilamentId = 0; // Reset previous value
String spoolsUrl = spoolmanUrl + apiUrl + "/filament?vendor.id=" + String(vendorId);
Serial.print("Check filament 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_FILAMENT_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 filament was found
if (foundFilamentId == 0) {
Serial.println("Filament not found, creating new filament...");
uint16_t filamentId = createFilament();
if (filamentId == 0) {
Serial.println("Failed to create filament, returning 0.");
return 0; // Failed to create filament
} else {
Serial.println("Filament created with ID: " + String(filamentId));
checkSpool();
return filamentId;
}
} else {
Serial.println("Filament found for vendor ID: " + String(vendorId));
Serial.print("Filament ID: ");
Serial.println(foundFilamentId);
return foundFilamentId;
}
}
bool createFilament() {
// {
// "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"
// }
// }
}
uint16_t checkSpool() {
}
bool createSpool() {
// Implement specific handling for Spool creation
// {
// "first_used": "2019-08-24T14:15:22Z",
// "last_used": "2019-08-24T14:15:22Z",
// "filament_id": 0,
// "price": 20,
// "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",
@@ -655,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);
@@ -699,29 +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();
returnValue = false; return false;
spoolmanApiState = API_IDLE;
}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) {
@@ -734,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() {
@@ -760,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

@@ -17,7 +17,10 @@ typedef enum {
API_REQUEST_BAMBU_UPDATE, API_REQUEST_BAMBU_UPDATE,
API_REQUEST_SPOOL_TAG_ID_UPDATE, API_REQUEST_SPOOL_TAG_ID_UPDATE,
API_REQUEST_SPOOL_WEIGHT_UPDATE, API_REQUEST_SPOOL_WEIGHT_UPDATE,
API_REQUEST_SPOOL_LOCATION_UPDATE API_REQUEST_SPOOL_LOCATION_UPDATE,
API_REQUEST_VENDOR_CREATE,
API_REQUEST_VENDOR_CHECK,
API_REQUEST_FILAMENT_CHECK
} SpoolmanApiRequestType; } SpoolmanApiRequestType;
extern volatile spoolmanApiStateType spoolmanApiState; extern volatile spoolmanApiStateType spoolmanApiState;
@@ -27,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
@@ -40,5 +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
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

@@ -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

@@ -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,15 +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)
{ {
@@ -250,7 +245,6 @@ void loop() {
} }
sendOctoUpdate = false; sendOctoUpdate = false;
} }
}
esp_task_wdt_reset(); esp_task_wdt_reset();
} }

View File

@@ -8,7 +8,6 @@
#include "esp_task_wdt.h" #include "esp_task_wdt.h"
#include "scale.h" #include "scale.h"
#include "bambu.h" #include "bambu.h"
#include "main.h"
//Adafruit_PN532 nfc(PN532_SCK, PN532_MISO, PN532_MOSI, PN532_SS); //Adafruit_PN532 nfc(PN532_SCK, PN532_MISO, PN532_MOSI, PN532_SS);
Adafruit_PN532 nfc(PN532_IRQ, PN532_RESET); Adafruit_PN532 nfc(PN532_IRQ, PN532_RESET);
@@ -21,8 +20,6 @@ String lastSpoolId = "";
String nfcJsonData = ""; String nfcJsonData = "";
bool tagProcessed = false; bool tagProcessed = false;
volatile bool pauseBambuMqttTask = false; volatile bool pauseBambuMqttTask = false;
volatile bool nfcReadingTaskSuspendRequest = false;
volatile bool nfcReadingTaskSuspendState = false;
struct NfcWriteParameterType { struct NfcWriteParameterType {
bool tagType; bool tagType;
@@ -40,6 +37,11 @@ volatile nfcReaderStateType nfcReaderState = NFC_IDLE;
// ***** PN532 // ***** PN532
// ##### Recycling Fabrik #####
bool isRecyclingFabrik(const char* brand) {
return strcmp(brand, "Recycling Fabrik") == 0;
}
// ##### Funktionen für RFID ##### // ##### Funktionen für RFID #####
void payloadToJson(uint8_t *data) { void payloadToJson(uint8_t *data) {
const char* startJson = strchr((char*)data, '{'); const char* startJson = strchr((char*)data, '{');
@@ -61,6 +63,12 @@ void payloadToJson(uint8_t *data) {
int max_temp = doc["max_temp"]; int max_temp = doc["max_temp"];
const char* brand = doc["brand"]; const char* brand = doc["brand"];
// Recycling Fabrik
if (isRecyclingFabrik(brand)) {
// TODO: Implement specific handling for Recycling Fabrik
Serial.println("Recycling Fabrik erkannt.");
}
Serial.println(); Serial.println();
Serial.println("-----------------"); Serial.println("-----------------");
Serial.println("JSON-Parsed Data:"); Serial.println("JSON-Parsed Data:");
@@ -218,7 +226,7 @@ bool decodeNdefAndReturnJson(const byte* encodedMessage) {
} }
// JSON-Dokument verarbeiten // JSON-Dokument verarbeiten
JsonDocument doc; // Passen Sie die Größe an den JSON-Inhalt an JsonDocument doc;
DeserializationError error = deserializeJson(doc, nfcJsonData); DeserializationError error = deserializeJson(doc, nfcJsonData);
if (error) if (error)
{ {
@@ -235,12 +243,14 @@ bool decodeNdefAndReturnJson(const byte* encodedMessage) {
// Sende die aktualisierten AMS-Daten an alle WebSocket-Clients // Sende die aktualisierten AMS-Daten an alle WebSocket-Clients
Serial.println("JSON-Dokument erfolgreich verarbeitet"); Serial.println("JSON-Dokument erfolgreich verarbeitet");
Serial.println(doc.as<String>()); Serial.println(doc.as<String>());
if (doc["sm_id"].is<String>() && doc["sm_id"] != "") if (doc["sm_id"].is<String>() && doc["sm_id"] != "" && doc["sm_id"] != "0")
{ {
oledShowProgressBar(2, octoEnabled?5:4, "Spool Tag", "Weighing"); oledShowProgressBar(2, octoEnabled?5:4, "Spool Tag", "Weighing");
Serial.println("SPOOL-ID gefunden: " + doc["sm_id"].as<String>()); Serial.println("SPOOL-ID gefunden: " + doc["sm_id"].as<String>());
activeSpoolId = doc["sm_id"].as<String>(); activeSpoolId = doc["sm_id"].as<String>();
lastSpoolId = activeSpoolId; lastSpoolId = activeSpoolId;
Serial.println("Api state: " + String(spoolmanApiState));
} }
else if(doc["location"].is<String>() && doc["location"] != "") else if(doc["location"].is<String>() && doc["location"] != "")
{ {
@@ -255,6 +265,13 @@ bool decodeNdefAndReturnJson(const byte* encodedMessage) {
oledShowProgressBar(1, 1, "Failure", "Scan spool first"); oledShowProgressBar(1, 1, "Failure", "Scan spool first");
} }
} }
// Recycling Fabrik
else if (isRecyclingFabrik(doc["type"].as<String>().c_str())) {
// If no sm_id is present but the brand is Recycling Fabrik then
// create a new spool, maybe brand too, in Spoolman
Serial.println("Recycling Fabrik Tag found!");
createFilamentFabrik(doc);
}
else else
{ {
Serial.println("Keine SPOOL-ID gefunden."); Serial.println("Keine SPOOL-ID gefunden.");
@@ -279,21 +296,19 @@ void writeJsonToTag(void *parameter) {
Serial.println(params->payload); Serial.println(params->payload);
nfcReaderState = NFC_WRITING; nfcReaderState = NFC_WRITING;
vTaskSuspend(RfidReaderTask);
// First request the reading task to be suspended and than wait until it responds vTaskDelay(50 / portTICK_PERIOD_MS);
nfcReadingTaskSuspendRequest = true;
while(nfcReadingTaskSuspendState == false){
vTaskDelay(100 / portTICK_PERIOD_MS);
}
//pauseBambuMqttTask = true; //pauseBambuMqttTask = true;
// aktualisieren der Website wenn sich der Status ändert // aktualisieren der Website wenn sich der Status ändert
sendNfcData(); sendNfcData();
vTaskDelay(100 / portTICK_PERIOD_MS); vTaskDelay(100 / portTICK_PERIOD_MS);
Serial.println("CP 1");
// Wait 10sec for tag // Wait 10sec for tag
uint8_t success = 0; uint8_t success = 0;
String uidString = ""; String uidString = "";
for (uint16_t i = 0; i < 20; i++) { 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 uid[] = { 0, 0, 0, 0, 0, 0, 0 }; // Buffer to store the returned UID
uint8_t uidLength; uint8_t uidLength;
// yield before potentially waiting for 400ms // yield before potentially waiting for 400ms
@@ -301,6 +316,7 @@ void writeJsonToTag(void *parameter) {
esp_task_wdt_reset(); esp_task_wdt_reset();
success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength, 400); success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength, 400);
if (success) { if (success) {
Serial.println("CP 3.1");
for (uint8_t i = 0; i < uidLength; i++) { for (uint8_t i = 0; i < uidLength; i++) {
//TBD: Rework to remove all the string operations //TBD: Rework to remove all the string operations
uidString += String(uid[i], HEX); uidString += String(uid[i], HEX);
@@ -310,6 +326,8 @@ void writeJsonToTag(void *parameter) {
} }
foundNfcTag(nullptr, success); foundNfcTag(nullptr, success);
break; break;
}else{
Serial.println("CP 3.2");
} }
yield(); yield();
@@ -372,7 +390,7 @@ void writeJsonToTag(void *parameter) {
sendWriteResult(nullptr, success); sendWriteResult(nullptr, success);
sendNfcData(); sendNfcData();
nfcReadingTaskSuspendRequest = false; vTaskResume(RfidReaderTask);
pauseBambuMqttTask = false; pauseBambuMqttTask = false;
vTaskDelete(NULL); vTaskDelete(NULL);
@@ -384,7 +402,7 @@ void startWriteJsonToTag(const bool isSpoolTag, const char* payload) {
parameters->payload = strdup(payload); parameters->payload = strdup(payload);
// Task nicht mehrfach starten // Task nicht mehrfach starten
if (nfcReaderState == NFC_IDLE || nfcReaderState == NFC_READ_ERROR || nfcReaderState == NFC_READ_SUCCESS) { if (nfcReaderState == NFC_IDLE) {
oledShowProgressBar(0, 1, "Write Tag", "Place tag now"); oledShowProgressBar(0, 1, "Write Tag", "Place tag now");
// Erstelle die Task // Erstelle die Task
xTaskCreate( xTaskCreate(
@@ -405,16 +423,15 @@ void scanRfidTask(void * parameter) {
Serial.println("RFID Task gestartet"); Serial.println("RFID Task gestartet");
for(;;) { for(;;) {
// Wenn geschrieben wird Schleife aussetzen // Wenn geschrieben wird Schleife aussetzen
if (nfcReaderState != NFC_WRITING && !nfcReadingTaskSuspendRequest && !booting) if (nfcReaderState != NFC_WRITING)
{ {
nfcReadingTaskSuspendState = false;
yield(); yield();
uint8_t success; uint8_t success;
uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 }; // Buffer to store the returned UID uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 }; // Buffer to store the returned UID
uint8_t uidLength; uint8_t uidLength;
success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength, 500); success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength, 1000);
foundNfcTag(nullptr, success); foundNfcTag(nullptr, success);
@@ -431,7 +448,7 @@ void scanRfidTask(void * parameter) {
oledShowProgressBar(0, octoEnabled?5:4, "Reading", "Detecting tag"); oledShowProgressBar(0, octoEnabled?5:4, "Reading", "Detecting tag");
//vTaskDelay(500 / portTICK_PERIOD_MS); vTaskDelay(500 / portTICK_PERIOD_MS);
if (uidLength == 7) if (uidLength == 7)
{ {
@@ -488,7 +505,7 @@ void scanRfidTask(void * parameter) {
} }
} }
if (!success && nfcReaderState != NFC_IDLE && !nfcReadingTaskSuspendRequest) if (!success && nfcReaderState != NFC_IDLE)
{ {
nfcReaderState = NFC_IDLE; nfcReaderState = NFC_IDLE;
//uidString = ""; //uidString = "";
@@ -501,12 +518,6 @@ void scanRfidTask(void * parameter) {
// aktualisieren der Website wenn sich der Status ändert // aktualisieren der Website wenn sich der Status ändert
sendNfcData(); sendNfcData();
} }
else
{
nfcReadingTaskSuspendState = true;
Serial.println("NFC Reading disabled");
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
yield(); yield();
} }
} }

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();
@@ -147,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);
@@ -225,7 +228,6 @@ uint8_t calibrate_scale() {
esp_task_wdt_reset(); esp_task_wdt_reset();
} }
scaleCalibrated = true;
returnState = 1; returnState = 1;
} }
else else
@@ -260,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;