Merge branch 'main' into recyclingfabrik
This commit is contained in:
		
							
								
								
									
										475
									
								
								src/api.cpp
									
									
									
									
									
								
							
							
						
						
									
										475
									
								
								src/api.cpp
									
									
									
									
									
								
							| @@ -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; | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
| @@ -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) | ||||
|   | ||||
							
								
								
									
										51
									
								
								src/config.h
									
									
									
									
									
								
							
							
						
						
									
										51
									
								
								src/config.h
									
									
									
									
									
								
							| @@ -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; | ||||
|   | ||||
							
								
								
									
										152
									
								
								src/main.cpp
									
									
									
									
									
								
							
							
						
						
									
										152
									
								
								src/main.cpp
									
									
									
									
									
								
							| @@ -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(); | ||||
|   | ||||
							
								
								
									
										39
									
								
								src/nfc.cpp
									
									
									
									
									
								
							
							
						
						
									
										39
									
								
								src/nfc.cpp
									
									
									
									
									
								
							| @@ -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(); | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -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; | ||||
| } | ||||
|   | ||||
| @@ -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; | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user