diff --git a/html/rfid.js b/html/rfid.js index ccc9097..cece33f 100644 --- a/html/rfid.js +++ b/html/rfid.js @@ -150,6 +150,13 @@ function initWebSocket() { ramStatus.textContent = `${data.freeHeap}k`; } } + else if (data.type === 'setSpoolmanSettings') { + if (data.payload == 'success') { + showNotification(`Spoolman Settings set successfully`, true); + } else { + showNotification(`Error setting Spoolman Settings`, false); + } + } }; } catch (error) { isConnected = false; @@ -285,6 +292,14 @@ function displayAmsData(amsData) { Spool In `; + const spoolmanButtonHtml = ` + `; + if (!hasAnyContent) { return `
@@ -348,6 +363,7 @@ function displayAmsData(amsData) { ${trayDetails} ${tempHTML} ${(ams.ams_id === 255 && tray.tray_type !== '') ? outButtonHtml : ''} + ${(tray.setting_id != "" && tray.setting_id != "null") ? spoolmanButtonHtml : ''}
`; @@ -373,6 +389,36 @@ function updateSpoolButtons(show) { }); } +function handleSpoolmanSettings(tray_info_idx, setting_id, cali_idx, nozzle_temp_min, nozzle_temp_max) { + // Hole das ausgewählte Filament + const selectedText = document.getElementById("selected-filament").textContent; + + // Finde die ausgewählte Spule in den Daten + const selectedSpool = spoolsData.find(spool => + `${spool.id} | ${spool.filament.name} (${spool.filament.material})` === selectedText + ); + + const payload = { + type: 'setSpoolmanSettings', + payload: { + filament_id: selectedSpool.filament.id, + tray_info_idx: tray_info_idx, + setting_id: setting_id, + cali_idx: cali_idx, + temp_min: nozzle_temp_min, + temp_max: nozzle_temp_max + } + }; + + try { + socket.send(JSON.stringify(payload)); + showNotification(`Setting send to Spoolman`, true); + } catch (error) { + console.error("Error while sending settings to Spoolman:", error); + showNotification("Error while sending!", false); + } +} + function handleSpoolOut() { // Erstelle Payload const payload = { diff --git a/html/set_spoolman.png b/html/set_spoolman.png new file mode 100644 index 0000000..2ec6c22 Binary files /dev/null and b/html/set_spoolman.png differ diff --git a/html/style.css b/html/style.css index 51eb00e..e974f54 100644 --- a/html/style.css +++ b/html/style.css @@ -761,17 +761,19 @@ a:hover { right: 20px; padding: 15px 25px; border-radius: 4px; - color: white; + color: black; z-index: 1000; animation: slideIn 0.3s ease-out; } .notification.success { background-color: #28a745; + color: black !important; } .notification.error { background-color: #dc3545; + color: white !important; } .notification.fade-out { @@ -1013,6 +1015,7 @@ input[type="submit"]:disabled, color: #000; vertical-align: middle; margin-left: 0.5rem; + text-shadow: 0 !important; } .progress-container { diff --git a/src/api.cpp b/src/api.cpp index 5289f32..a1a6fd3 100644 --- a/src/api.cpp +++ b/src/api.cpp @@ -122,9 +122,9 @@ void sendToApi(void *parameter) { if (httpType == "PATCH") httpCode = http.PATCH(updatePayload); if (httpCode == HTTP_CODE_OK) { - Serial.println("Gewicht der Spule erfolgreich aktualisiert"); + Serial.println("Spoolman erfolgreich aktualisiert"); } else { - Serial.println("Fehler beim Aktualisieren des Gewichts der Spule"); + Serial.println("Fehler beim Senden an Spoolman!"); oledShowMessage("Spoolman update failed"); vTaskDelay(2000 / portTICK_PERIOD_MS); } @@ -223,6 +223,52 @@ uint8_t updateSpoolWeight(String spoolId, uint16_t weight) { return 1; } +bool updateSpoolBambuData(String payload) { + JsonDocument doc; + DeserializationError error = deserializeJson(doc, payload); + if (error) { + Serial.print("Fehler beim JSON-Parsing: "); + Serial.println(error.c_str()); + return false; + } + + String spoolsUrl = spoolmanUrl + apiUrl + "/filament/" + doc["filament_id"].as(); + Serial.print("Update Spule mit URL: "); + Serial.println(spoolsUrl); + + JsonDocument updateDoc; + updateDoc["extra"]["bambu_setting_id"] = "\"" + doc["setting_id"].as() + "\""; + updateDoc["extra"]["bambu_cali_id"] = "\"" + doc["cali_idx"].as() + "\""; + updateDoc["extra"]["bambu_idx"] = "\"" + doc["tray_info_idx"].as() + "\""; + updateDoc["extra"]["nozzle_temperature"] = "[" + doc["temp_min"].as() + "," + doc["temp_max"].as() + "]"; + + String updatePayload; + serializeJson(updateDoc, updatePayload); + Serial.print("Update Payload: "); + Serial.println(updatePayload); + + SendToApiParams* params = new SendToApiParams(); + if (params == nullptr) { + Serial.println("Fehler: Kann Speicher für Task-Parameter nicht allokieren."); + return false; + } + params->httpType = "PATCH"; + params->spoolsUrl = spoolsUrl; + params->updatePayload = updatePayload; + + // Erstelle die Task + BaseType_t result = xTaskCreate( + sendToApi, // Task-Funktion + "SendToApiTask", // Task-Name + 4096, // Stackgröße in Bytes + (void*)params, // Parameter + 0, // Priorität + NULL // Task-Handle (nicht benötigt) + ); + + return true; +} + // #### Spoolman init bool checkSpoolmanExtraFields() { HTTPClient http; diff --git a/src/api.h b/src/api.h index 4132b0a..da9562a 100644 --- a/src/api.h +++ b/src/api.h @@ -18,5 +18,6 @@ JsonDocument fetchSingleSpoolInfo(int spoolId); // API-Funktion für die Webseit bool updateSpoolTagId(String uidString, const char* payload); // Neue Funktion zum Aktualisieren eines Spools uint8_t updateSpoolWeight(String spoolId, uint16_t weight); // Neue Funktion zum Aktualisieren des Gewichts bool initSpoolman(); // Neue Funktion zum Initialisieren von Spoolman +bool updateSpoolBambuData(String payload); // Neue Funktion zum Aktualisieren der Bambu-Daten #endif diff --git a/src/website.cpp b/src/website.cpp index 296bdaa..5098394 100644 --- a/src/website.cpp +++ b/src/website.cpp @@ -95,6 +95,15 @@ void onWsEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventTyp setBambuSpool(doc["payload"]); } + else if (doc["type"] == "setSpoolmanSettings") { + Serial.println(doc["payload"].as()); + if (updateSpoolBambuData(doc["payload"].as())) { + ws.textAll("{\"type\":\"setSpoolmanSettings\",\"payload\":\"success\"}"); + } else { + ws.textAll("{\"type\":\"setSpoolmanSettings\",\"payload\":\"error\"}"); + } + } + else { Serial.println("Unbekannter WebSocket-Typ: " + doc["type"].as()); } @@ -346,6 +355,15 @@ void setupWebserver(AsyncWebServer &server) { Serial.println("spool_in.png gesendet"); }); + // Route für set_spoolman.png + server.on("/set_spoolman.png", HTTP_GET, [](AsyncWebServerRequest *request){ + AsyncWebServerResponse *response = request->beginResponse(SPIFFS, "/set_spoolman.png.gz", "image/png"); + response->addHeader("Content-Encoding", "gzip"); + response->addHeader("Cache-Control", CACHE_CONTROL); + request->send(response); + Serial.println("set_spoolman.png gesendet"); + }); + // Route für JavaScript Dateien server.on("/spoolman.js", HTTP_GET, [](AsyncWebServerRequest *request){ Serial.println("Anfrage für /spoolman.js erhalten");