Compare commits
10 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 2068810386 | |||
| f2bf5e96f0 | |||
| 9a7ba2845d | |||
| f1a9c3c5d4 | |||
| ccca159a10 | |||
| 70c8b7bdc0 | |||
| c574cc964e | |||
| 9262865b56 | |||
| f7c01eb5f0 | |||
| a41ef9e75a |
@@ -1,3 +1,7 @@
|
||||
.pio
|
||||
.vscode
|
||||
.vscode/.browse.c_cpp.db*
|
||||
.vscode/c_cpp_properties.json
|
||||
.vscode/launch.json
|
||||
.vscode/ipch
|
||||
data
|
||||
Vendored
+10
@@ -0,0 +1,10 @@
|
||||
{
|
||||
// See http://go.microsoft.com/fwlink/?LinkId=827846
|
||||
// for the documentation about the extensions.json format
|
||||
"recommendations": [
|
||||
"platformio.platformio-ide"
|
||||
],
|
||||
"unwantedRecommendations": [
|
||||
"ms-vscode.cpptools-extension-pack"
|
||||
]
|
||||
}
|
||||
@@ -141,6 +141,15 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Rechte Spalte -->
|
||||
<div class="column">
|
||||
<div class="feature-box">
|
||||
<h2>Bambu AMS</h2>
|
||||
<div id="amsDataContainer">
|
||||
<div class="amsData" id="amsData">Wait for AMS-Data...</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
+2
-1
@@ -685,4 +685,5 @@ function showNotification(message, isSuccess) {
|
||||
setTimeout(() => {
|
||||
notification.remove();
|
||||
}, 300);
|
||||
}, 3000);}
|
||||
}, 3000);
|
||||
}
|
||||
@@ -1,165 +0,0 @@
|
||||
<!-- head -->
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>FilaMan - Filament Management Tool</title>
|
||||
<link rel="icon" type="image/png" href="/favicon.ico">
|
||||
<link rel="stylesheet" href="style.css">
|
||||
<script>
|
||||
fetch('/api/version')
|
||||
.then(response => response.json())
|
||||
.then(data => {
|
||||
const versionSpan = document.querySelector('.version');
|
||||
if (versionSpan) {
|
||||
versionSpan.textContent = 'v' + data.version;
|
||||
}
|
||||
})
|
||||
.catch(error => console.error('Error fetching version:', error));
|
||||
</script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div class="navbar">
|
||||
<div style="display: flex; align-items: center; gap: 2rem;">
|
||||
<img src="/logo.png" alt="FilaMan Logo" class="logo">
|
||||
<div class="logo-text">
|
||||
<h1>FilaMan<span class="version"></span></h1>
|
||||
<h4>Filament Management Tool</h4>
|
||||
</div>
|
||||
</div>
|
||||
<nav style="display: flex; gap: 1rem;">
|
||||
<a href="/">Start</a>
|
||||
<a href="/waage">Scale</a>
|
||||
<a href="/spoolman">Spoolman/Bambu</a>
|
||||
<a href="/about">About</a>
|
||||
<a href="/upgrade">Upgrade</a>
|
||||
</nav>
|
||||
<div class="status-container">
|
||||
<div class="status-item">
|
||||
<span class="status-dot" id="bambuDot"></span>B
|
||||
</div>
|
||||
<div class="status-item">
|
||||
<span class="status-dot" id="spoolmanDot"></span>S
|
||||
</div>
|
||||
<div class="ram-status" id="ramStatus"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- head -->
|
||||
|
||||
<div class="connection-status hidden">
|
||||
<div class="spinner"></div>
|
||||
<span>Connection lost. Trying to reconnect...</span>
|
||||
</div>
|
||||
<div class="content">
|
||||
<div class="three-column-layout">
|
||||
<!-- Linke Spalte -->
|
||||
<div class="column">
|
||||
<div class="feature-box">
|
||||
<div class="statistics-header">
|
||||
<h2>Statistics</h2>
|
||||
<button id="refreshSpoolman" class="refresh-button">
|
||||
<span>Refresh Spoolman</span>
|
||||
</button>
|
||||
</div>
|
||||
<div class="statistics-column">
|
||||
<h3>Spools</h3>
|
||||
<div class="spool-stat" style="display: flex; justify-content: center; align-items: center;">
|
||||
<span class="stat-label">total:</span>
|
||||
<span class="stat-value" id="totalSpools"></span>
|
||||
<div style="width: auto;"></div>
|
||||
<span class="stat-label">without Tag:</span>
|
||||
<span class="stat-value" id="spoolsWithoutTag"></span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="statistics-grid">
|
||||
<div class="statistics-column">
|
||||
<h3>Overview</h3>
|
||||
<ul class="statistics-list">
|
||||
<li>
|
||||
<span class="stat-label">Manufacturer:</span>
|
||||
<span class="stat-value" id="totalVendors"></span>
|
||||
</li>
|
||||
<li>
|
||||
<span class="stat-label">Weight:</span>
|
||||
<span class="stat-value"><span id="totalWeight"></span></span>
|
||||
</li>
|
||||
<li>
|
||||
<span class="stat-label">Length:</span>
|
||||
<span class="stat-value"><span id="totalLength"></span></span>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="statistics-column">
|
||||
<h3>Materials</h3>
|
||||
<ul class="statistics-list" id="materialsList">
|
||||
<!-- Wird dynamisch befüllt -->
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="feature-box">
|
||||
<div class="nfc-header">
|
||||
<h2>NFC-Tag</h2>
|
||||
<span id="nfcStatusIndicator" class="status-circle"></span>
|
||||
</div>
|
||||
<div class="nfc-status-display"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Mittlere Spalte -->
|
||||
<div class="column">
|
||||
<div class="feature-box">
|
||||
<h2>Spoolman Spools</h2>
|
||||
<label for="vendorSelect">Manufacturer:</label>
|
||||
<div style="display: flex; justify-content: space-between; align-items: center;">
|
||||
<select id="vendorSelect" class="styled-select">
|
||||
<option value="">Please choose...</option>
|
||||
</select>
|
||||
<label style="margin-left: 10px;">
|
||||
<input type="checkbox" id="onlyWithoutSmId" checked onchange="updateFilamentDropdown()">
|
||||
Only Spools without SM ID
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="filamentSection" class="feature-box hidden">
|
||||
<label>Spool / Filament:</label>
|
||||
<div class="custom-dropdown">
|
||||
<div class="dropdown-button" onclick="toggleFilamentDropdown()">
|
||||
<div class="selected-color" id="selected-color"></div>
|
||||
<span id="selected-filament">Please choose...</span>
|
||||
<span class="dropdown-arrow">▼</span>
|
||||
</div>
|
||||
<div class="dropdown-content" id="filament-dropdown-content">
|
||||
<!-- Optionen werden dynamisch hinzugefügt -->
|
||||
</div>
|
||||
</div>
|
||||
<p id="nfcInfo" class="nfc-status"></p>
|
||||
<button id="writeNfcButton" class="btn btn-primary hidden" onclick="writeNfcTag()">Write
|
||||
Tag</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Rechte Spalte -->
|
||||
<div class="column">
|
||||
<div class="feature-box">
|
||||
<h2>Bambu AMS</h2>
|
||||
<div id="amsDataContainer">
|
||||
<div class="amsData" id="amsData">Wait for AMS-Data...</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script src="spoolman.js"></script>
|
||||
<script src="rfid.js"></script>
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -57,31 +57,6 @@
|
||||
toggleOctoFields();
|
||||
};
|
||||
|
||||
function removeBambuCredentials() {
|
||||
fetch('/api/bambu?remove=true')
|
||||
.then(response => response.json())
|
||||
.then(data => {
|
||||
if (data.success) {
|
||||
document.getElementById('bambuIp').value = '';
|
||||
document.getElementById('bambuSerial').value = '';
|
||||
document.getElementById('bambuCode').value = '';
|
||||
document.getElementById('autoSend').checked = false;
|
||||
document.getElementById('autoSendTime').value = '';
|
||||
document.getElementById('bambuStatusMessage').innerText = 'Bambu Credentials removed!';
|
||||
// Reload with forced cache refresh after short delay
|
||||
setTimeout(() => {
|
||||
window.location.reload(true);
|
||||
window.location.href = '/';
|
||||
}, 1500);
|
||||
} else {
|
||||
document.getElementById('bambuStatusMessage').innerText = 'Error while removing Bambu Credentials.';
|
||||
}
|
||||
})
|
||||
.catch(error => {
|
||||
document.getElementById('bambuStatusMessage').innerText = 'Error while removing: ' + error.message;
|
||||
});
|
||||
}
|
||||
|
||||
function checkSpoolmanInstance() {
|
||||
const url = document.getElementById('spoolmanUrl').value;
|
||||
const spoolmanOctoEnabled = document.getElementById('spoolmanOctoEnabled').checked;
|
||||
@@ -114,11 +89,6 @@
|
||||
.then(data => {
|
||||
if (data.healthy) {
|
||||
document.getElementById('bambuStatusMessage').innerText = 'Bambu Credentials saved!';
|
||||
// Reload with forced cache refresh after short delay
|
||||
setTimeout(() => {
|
||||
window.location.reload(true);
|
||||
window.location.href = '/';
|
||||
}, 1500);
|
||||
} else {
|
||||
document.getElementById('bambuStatusMessage').innerText = 'Error while saving Bambu Credentials.';
|
||||
}
|
||||
@@ -192,7 +162,6 @@
|
||||
</div>
|
||||
|
||||
<button style="margin: 0;" onclick="saveBambuCredentials()">Save Bambu Credentials</button>
|
||||
<button style="margin: 0; background-color: red;" onclick="removeBambuCredentials()">Remove Credentials</button>
|
||||
<p id="bambuStatusMessage"></p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
+12
-7
@@ -147,13 +147,6 @@ function updateFilamentDropdown(selectedSmId = null) {
|
||||
|
||||
if (vendorId) {
|
||||
const filteredFilaments = spoolsData.filter(spool => {
|
||||
if (!spool?.filament?.vendor?.id) {
|
||||
console.log('Problem aufgetreten bei: ', spool?.filament?.vendor);
|
||||
console.log('Problematische Spulen:',
|
||||
spoolsData.filter(spool => !spool?.filament?.vendor?.id));
|
||||
return false;
|
||||
}
|
||||
|
||||
const hasValidNfcId = spool.extra &&
|
||||
spool.extra.nfc_id &&
|
||||
spool.extra.nfc_id !== '""' &&
|
||||
@@ -247,6 +240,18 @@ async function fetchSpoolData() {
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
// Exportiere Funktionen
|
||||
window.getSpoolData = () => spoolsData;
|
||||
window.reloadSpoolData = initSpoolman;
|
||||
window.populateVendorDropdown = populateVendorDropdown;
|
||||
window.updateFilamentDropdown = updateFilamentDropdown;
|
||||
window.toggleFilamentDropdown = () => {
|
||||
const content = document.getElementById("filament-dropdown-content");
|
||||
content.classList.toggle("show");
|
||||
};
|
||||
*/
|
||||
|
||||
// Event Listener
|
||||
document.addEventListener('DOMContentLoaded', () => {
|
||||
initSpoolman();
|
||||
|
||||
@@ -129,7 +129,6 @@
|
||||
if (data.status === 'success' || lastReceivedProgress >= 98) {
|
||||
clearTimeout(wsReconnectTimer);
|
||||
setTimeout(() => {
|
||||
window.location.reload(true);
|
||||
window.location.href = '/';
|
||||
}, 30000);
|
||||
}
|
||||
@@ -165,7 +164,6 @@
|
||||
status.className = 'status success';
|
||||
status.style.display = 'block';
|
||||
setTimeout(() => {
|
||||
window.location.reload(true);
|
||||
window.location.href = '/';
|
||||
}, 30000);
|
||||
}
|
||||
|
||||
@@ -55,8 +55,6 @@
|
||||
<h5 class="card-title">Sacle Calibration</h5>
|
||||
<button id="calibrateBtn" class="btn btn-primary">Calibrate Scale</button>
|
||||
<button id="tareBtn" class="btn btn-secondary">Tare Scale</button>
|
||||
Enable Auto-TARE <input type="checkbox" id="autoTareCheckbox" onchange="setAutoTare(this.checked);"
|
||||
{{autoTare}}>
|
||||
<div id="statusMessage" class="mt-3"></div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -141,14 +139,6 @@
|
||||
payload: 'tare'
|
||||
}));
|
||||
});
|
||||
// Add auto-tare function
|
||||
function setAutoTare(enabled) {
|
||||
ws.send(JSON.stringify({
|
||||
type: 'scale',
|
||||
payload: 'setAutoTare',
|
||||
enabled: enabled
|
||||
}));
|
||||
}
|
||||
|
||||
// WebSocket-Verbindung beim Laden der Seite initiieren
|
||||
connectWebSocket();
|
||||
|
||||
+2
-2
@@ -9,8 +9,8 @@
|
||||
; https://docs.platformio.org/page/projectconf.html
|
||||
|
||||
[common]
|
||||
version = "0.2.1"
|
||||
to_old_version = "0.2.0"
|
||||
version = "1.4.1"
|
||||
to_old_version = "1.4.0"
|
||||
|
||||
##
|
||||
[env:esp32dev]
|
||||
|
||||
@@ -14,7 +14,7 @@ def copy_file(input_file, output_file):
|
||||
|
||||
def should_compress(file):
|
||||
# Skip compression for spoolman.html
|
||||
if file == 'spoolman.html' or file == 'waage.html':
|
||||
if file == 'spoolman.html':
|
||||
return False
|
||||
# Komprimiere nur bestimmte Dateitypen
|
||||
return file.endswith(('.js', '.png', '.css', '.html'))
|
||||
|
||||
+5
-16
@@ -3,7 +3,7 @@
|
||||
#include <ArduinoJson.h>
|
||||
#include "commonFS.h"
|
||||
|
||||
volatile spoolmanApiStateType spoolmanApiState = API_INIT;
|
||||
bool spoolman_connected = false;
|
||||
String spoolmanUrl = "";
|
||||
bool octoEnabled = false;
|
||||
String octoUrl = "";
|
||||
@@ -85,8 +85,7 @@ JsonDocument fetchSingleSpoolInfo(int spoolId) {
|
||||
}
|
||||
|
||||
void sendToApi(void *parameter) {
|
||||
spoolmanApiState = API_TRANSMITTING;
|
||||
SendToApiParams *params = (SendToApiParams *)parameter;
|
||||
SendToApiParams* params = (SendToApiParams*)parameter;
|
||||
|
||||
// Extrahiere die Werte
|
||||
String httpType = params->httpType;
|
||||
@@ -95,17 +94,13 @@ void sendToApi(void *parameter) {
|
||||
String octoToken = params->octoToken;
|
||||
|
||||
HTTPClient http;
|
||||
http.setReuse(false);
|
||||
http.begin(spoolsUrl);
|
||||
http.addHeader("Content-Type", "application/json");
|
||||
if (octoEnabled && octoToken != "") http.addHeader("X-Api-Key", octoToken);
|
||||
|
||||
int httpCode;
|
||||
int httpCode = http.PUT(updatePayload);
|
||||
if (httpType == "PATCH") httpCode = http.PATCH(updatePayload);
|
||||
else if (httpType == "POST")
|
||||
httpCode = http.POST(updatePayload);
|
||||
else
|
||||
httpCode = http.PUT(updatePayload);
|
||||
if (httpType == "POST") httpCode = http.POST(updatePayload);
|
||||
|
||||
if (httpCode == HTTP_CODE_OK) {
|
||||
Serial.println("Spoolman erfolgreich aktualisiert");
|
||||
@@ -116,12 +111,10 @@ void sendToApi(void *parameter) {
|
||||
}
|
||||
|
||||
http.end();
|
||||
vTaskDelay(50 / portTICK_PERIOD_MS);
|
||||
|
||||
// Speicher freigeben
|
||||
delete params;
|
||||
vTaskDelete(NULL);
|
||||
spoolmanApiState = API_IDLE;
|
||||
}
|
||||
|
||||
bool updateSpoolTagId(String uidString, const char* payload) {
|
||||
@@ -171,7 +164,6 @@ bool updateSpoolTagId(String uidString, const char* payload) {
|
||||
0, // Priorität
|
||||
NULL // Task-Handle (nicht benötigt)
|
||||
);
|
||||
updateDoc.clear();
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -208,7 +200,6 @@ uint8_t updateSpoolWeight(String spoolId, uint16_t weight) {
|
||||
0, // Priorität
|
||||
NULL // Task-Handle (nicht benötigt)
|
||||
);
|
||||
updateDoc.clear();
|
||||
|
||||
return 1;
|
||||
}
|
||||
@@ -246,7 +237,6 @@ bool updateSpoolOcto(int spoolId) {
|
||||
0, // Priorität
|
||||
NULL // Task-Handle (nicht benötigt)
|
||||
);
|
||||
updateDoc.clear();
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -479,8 +469,7 @@ bool checkSpoolmanInstance(const String& url) {
|
||||
return false;
|
||||
}
|
||||
|
||||
spoolmanApiState = API_IDLE;
|
||||
oledShowTopRow();
|
||||
spoolman_connected = true;
|
||||
return strcmp(status, "healthy") == 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,14 +6,7 @@
|
||||
#include "website.h"
|
||||
#include "display.h"
|
||||
#include <ArduinoJson.h>
|
||||
typedef enum
|
||||
{
|
||||
API_INIT,
|
||||
API_IDLE,
|
||||
API_TRANSMITTING
|
||||
} spoolmanApiStateType;
|
||||
|
||||
extern volatile spoolmanApiStateType spoolmanApiState;
|
||||
extern bool spoolman_connected;
|
||||
extern String spoolmanUrl;
|
||||
extern bool octoEnabled;
|
||||
|
||||
+10
-42
@@ -27,7 +27,6 @@ const char* bambu_serialnr = nullptr;
|
||||
String g_bambu_ip = "";
|
||||
String g_bambu_accesscode = "";
|
||||
String g_bambu_serialnr = "";
|
||||
bool bambuDisabled = false;
|
||||
|
||||
bool bambu_connected = false;
|
||||
bool autoSendToBambu = false;
|
||||
@@ -38,35 +37,6 @@ int ams_count = 0;
|
||||
String amsJsonData; // Speichert das fertige JSON für WebSocket-Clients
|
||||
AMSData ams_data[MAX_AMS]; // Definition des Arrays;
|
||||
|
||||
bool removeBambuCredentials()
|
||||
{
|
||||
if (BambuMqttTask)
|
||||
{
|
||||
vTaskDelete(BambuMqttTask);
|
||||
}
|
||||
|
||||
if (!removeJsonValue("/bambu_credentials.json"))
|
||||
{
|
||||
Serial.println("Fehler beim Löschen der Bambu-Credentials.");
|
||||
return false;
|
||||
}
|
||||
// Löschen der globalen Variablen
|
||||
g_bambu_ip = "";
|
||||
g_bambu_accesscode = "";
|
||||
g_bambu_serialnr = "";
|
||||
bambu_ip = nullptr;
|
||||
bambu_accesscode = nullptr;
|
||||
bambu_serialnr = nullptr;
|
||||
autoSendToBambu = false;
|
||||
autoSetToBambuSpoolId = 0;
|
||||
ams_count = 0;
|
||||
amsJsonData = "";
|
||||
|
||||
bambuDisabled = true;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool saveBambuCredentials(const String& ip, const String& serialnr, const String& accesscode, bool autoSend, const String& autoSendTime) {
|
||||
if (BambuMqttTask) {
|
||||
vTaskDelete(BambuMqttTask);
|
||||
@@ -296,10 +266,8 @@ bool setBambuSpool(String payload) {
|
||||
JsonDocument doc;
|
||||
DeserializationError error = deserializeJson(doc, payload);
|
||||
if (error) {
|
||||
Serial.print("Error parsing setBambuSpool-JSON: ");
|
||||
Serial.print("Error parsing JSON: ");
|
||||
Serial.println(error.c_str());
|
||||
Serial.print("Free Heap-Memory: ");
|
||||
Serial.println(ESP.getFreeHeap());
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -507,9 +475,7 @@ void mqtt_callback(char* topic, byte* payload, unsigned int length) {
|
||||
message = "";
|
||||
if (error)
|
||||
{
|
||||
Serial.print("Free Heap-Memory: ");
|
||||
Serial.println(ESP.getFreeHeap());
|
||||
Serial.print("Error parsing MQTT-JSON: ");
|
||||
Serial.print("Fehler beim Parsen des JSON: ");
|
||||
Serial.println(error.c_str());
|
||||
return;
|
||||
}
|
||||
@@ -716,12 +682,10 @@ void mqtt_loop(void * parameter) {
|
||||
}
|
||||
|
||||
// Periodically check connection status
|
||||
if (now - lastCheck > 60000) { // Check every 60 seconds
|
||||
if (now - lastCheck > 30000) { // Check every 30 seconds
|
||||
Serial.print("MQTT Status Check - Connected: ");
|
||||
Serial.println(client.connected() ? "Yes" : "No");
|
||||
lastCheck = now;
|
||||
Serial.print("Free Heap-Memory: ");
|
||||
Serial.println(ESP.getFreeHeap());
|
||||
}
|
||||
|
||||
client.loop();
|
||||
@@ -736,13 +700,14 @@ bool setupMqtt() {
|
||||
bool success = loadBambuCredentials();
|
||||
|
||||
if (!success) {
|
||||
bambuDisabled = true;
|
||||
Serial.println("Failed to load Bambu credentials");
|
||||
oledShowMessage("Bambu Credentials Missing");
|
||||
vTaskDelay(2000 / portTICK_PERIOD_MS);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (success && bambu_ip != "" && bambu_accesscode != "" && bambu_serialnr != "")
|
||||
{
|
||||
bambuDisabled = false;
|
||||
sslClient.setCACert(root_ca);
|
||||
sslClient.setInsecure();
|
||||
client.setServer(bambu_ip, 8883);
|
||||
@@ -799,7 +764,10 @@ bool setupMqtt() {
|
||||
}
|
||||
else
|
||||
{
|
||||
bambuDisabled = true;
|
||||
Serial.println("Fehler: Keine MQTT-Daten vorhanden");
|
||||
oledShowMessage("Bambu Credentials Missing");
|
||||
oledShowTopRow();
|
||||
vTaskDelay(2000 / portTICK_PERIOD_MS);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
|
||||
@@ -30,9 +30,7 @@ extern int ams_count;
|
||||
extern AMSData ams_data[MAX_AMS];
|
||||
extern bool autoSendToBambu;
|
||||
extern int autoSetToBambuSpoolId;
|
||||
extern bool bambuDisabled;
|
||||
|
||||
bool removeBambuCredentials();
|
||||
bool loadBambuCredentials();
|
||||
bool saveBambuCredentials(const String& bambu_ip, const String& bambu_serialnr, const String& bambu_accesscode, const bool autoSend, const String& autoSendTime);
|
||||
bool setupMqtt();
|
||||
|
||||
@@ -1,23 +1,6 @@
|
||||
#include "commonFS.h"
|
||||
#include <LittleFS.h>
|
||||
|
||||
bool removeJsonValue(const char *filename)
|
||||
{
|
||||
File file = LittleFS.open(filename, "r");
|
||||
if (!file)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
file.close();
|
||||
if (!LittleFS.remove(filename))
|
||||
{
|
||||
Serial.print("Fehler beim Löschen der Datei: ");
|
||||
Serial.println(filename);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool saveJsonValue(const char* filename, const JsonDocument& doc) {
|
||||
File file = LittleFS.open(filename, "w");
|
||||
if (!file) {
|
||||
|
||||
+1
-2
@@ -5,8 +5,7 @@
|
||||
#include <ArduinoJson.h>
|
||||
#include <LittleFS.h>
|
||||
|
||||
bool removeJsonValue(const char *filename);
|
||||
bool saveJsonValue(const char *filename, const JsonDocument &doc);
|
||||
bool saveJsonValue(const char* filename, const JsonDocument& doc);
|
||||
bool loadJsonValue(const char* filename, JsonDocument& doc);
|
||||
void initializeFileSystem();
|
||||
|
||||
|
||||
@@ -6,8 +6,6 @@
|
||||
//#define PN532_MOSI 23
|
||||
//#define PN532_SS 5
|
||||
//#define PN532_MISO 19
|
||||
const uint8_t PN532_IRQ = 32;
|
||||
const uint8_t PN532_RESET = 33;
|
||||
// ***** PN532
|
||||
|
||||
// ***** HX711 (Waage)
|
||||
@@ -19,11 +17,6 @@ const uint16_t SCALE_LEVEL_WEIGHT = 500;
|
||||
uint16_t defaultScaleCalibrationValue = 430;
|
||||
// ***** HX711
|
||||
|
||||
// ***** TTP223 (Touch Sensor)
|
||||
// TTP223 circuit wiring
|
||||
const uint8_t TTP223_PIN = 25;
|
||||
// ***** TTP223
|
||||
|
||||
// ***** Display
|
||||
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
|
||||
// On an ESP32: 21(SDA), 22(SCL)
|
||||
|
||||
+13
-6
@@ -1,16 +1,18 @@
|
||||
#ifndef CONFIG_H
|
||||
#define CONFIG_H
|
||||
#pragma once
|
||||
|
||||
#include <Arduino.h>
|
||||
|
||||
extern const uint8_t PN532_IRQ;
|
||||
extern const uint8_t PN532_RESET;
|
||||
// ***** PN532 (RFID)
|
||||
//#define PN532_SCK 18
|
||||
//#define PN532_MOSI 23
|
||||
//#define PN532_SS 5
|
||||
//#define PN532_MISO 19
|
||||
// ***** PN532
|
||||
|
||||
extern const uint8_t LOADCELL_DOUT_PIN;
|
||||
extern const uint8_t LOADCELL_SCK_PIN;
|
||||
extern const uint8_t calVal_eepromAdress;
|
||||
extern const uint16_t SCALE_LEVEL_WEIGHT;
|
||||
extern const uint8_t TTP223_PIN;
|
||||
|
||||
extern const int8_t OLED_RESET;
|
||||
extern const uint8_t SCREEN_ADDRESS;
|
||||
@@ -48,4 +50,9 @@ extern uint8_t scaleTaskCore;
|
||||
extern uint8_t scaleTaskPrio;
|
||||
|
||||
extern uint16_t defaultScaleCalibrationValue;
|
||||
#endif
|
||||
|
||||
#define PN532_SCK (18)
|
||||
#define PN532_MISO (19)
|
||||
#define PN532_MOSI (23)
|
||||
#define PN532_CS1 (5)
|
||||
#define PN532_CS2 (4)
|
||||
+3
-6
@@ -177,12 +177,9 @@ void oledShowTopRow() {
|
||||
display.drawBitmap(50, 0, bitmap_off , 16, 16, WHITE);
|
||||
}
|
||||
|
||||
if (spoolmanApiState != API_INIT)
|
||||
{
|
||||
display.drawBitmap(80, 0, bitmap_spoolman_on, 16, 16, WHITE);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (spoolman_connected == 1) {
|
||||
display.drawBitmap(80, 0, bitmap_spoolman_on , 16, 16, WHITE);
|
||||
} else {
|
||||
display.drawBitmap(80, 0, bitmap_off , 16, 16, WHITE);
|
||||
}
|
||||
|
||||
|
||||
+19
-38
@@ -15,7 +15,6 @@
|
||||
|
||||
bool mainTaskWasPaused = 0;
|
||||
uint8_t scaleTareCounter = 0;
|
||||
bool touchSensorConnected = false;
|
||||
|
||||
// ##### SETUP #####
|
||||
void setup() {
|
||||
@@ -40,6 +39,7 @@ void setup() {
|
||||
setupWebserver(server);
|
||||
|
||||
// Spoolman API
|
||||
// api.cpp
|
||||
initSpoolman();
|
||||
|
||||
// Bambu MQTT
|
||||
@@ -48,16 +48,7 @@ void setup() {
|
||||
// NFC Reader
|
||||
startNfc();
|
||||
|
||||
// Touch Sensor
|
||||
pinMode(TTP223_PIN, INPUT_PULLUP);
|
||||
if (digitalRead(TTP223_PIN) == LOW)
|
||||
{
|
||||
Serial.println("Touch Sensor is connected");
|
||||
touchSensorConnected = true;
|
||||
}
|
||||
|
||||
// Scale
|
||||
start_scale(touchSensorConnected);
|
||||
start_scale();
|
||||
|
||||
// WDT initialisieren mit 10 Sekunden Timeout
|
||||
bool panic = true; // Wenn true, löst ein WDT-Timeout einen System-Panik aus
|
||||
@@ -93,25 +84,13 @@ uint8_t autoAmsCounter = 0;
|
||||
uint8_t weightSend = 0;
|
||||
int16_t lastWeight = 0;
|
||||
|
||||
// WIFI check variables
|
||||
unsigned long lastWifiCheckTime = 0;
|
||||
const unsigned long wifiCheckInterval = 60000; // Überprüfe alle 60 Sekunden (60000 ms)
|
||||
|
||||
// Button debounce variables
|
||||
unsigned long lastButtonPress = 0;
|
||||
const unsigned long debounceDelay = 500; // 500 ms debounce delay
|
||||
|
||||
// ##### PROGRAM START #####
|
||||
void loop() {
|
||||
unsigned long currentMillis = millis();
|
||||
|
||||
// Überprüfe den Status des Touch Sensors
|
||||
if (touchSensorConnected && digitalRead(TTP223_PIN) == HIGH && currentMillis - lastButtonPress > debounceDelay)
|
||||
{
|
||||
lastButtonPress = currentMillis;
|
||||
scaleTareRequest = true;
|
||||
}
|
||||
|
||||
// Überprüfe regelmäßig die WLAN-Verbindung
|
||||
if (intervalElapsed(currentMillis, lastWifiCheckTime, wifiCheckInterval)) {
|
||||
checkWiFiConnection();
|
||||
@@ -119,14 +98,9 @@ void loop() {
|
||||
|
||||
// Wenn Bambu auto set Spool aktiv
|
||||
if (autoSendToBambu && autoSetToBambuSpoolId > 0) {
|
||||
if (!bambuDisabled && !bambu_connected)
|
||||
|
||||
{
|
||||
bambu_restart();
|
||||
}
|
||||
if (intervalElapsed(currentMillis, lastAutoSetBambuAmsTime, autoSetBambuAmsInterval))
|
||||
{
|
||||
if (nfcReaderState == NFC_IDLE)
|
||||
if (hasReadRfidTag == 0)
|
||||
{
|
||||
lastAutoSetBambuAmsTime = currentMillis;
|
||||
oledShowMessage("Auto Set " + String(autoSetBambuAmsCounter - autoAmsCounter) + "s");
|
||||
@@ -160,7 +134,7 @@ void loop() {
|
||||
// Ausgabe der Waage auf Display
|
||||
if(pauseMainTask == 0)
|
||||
{
|
||||
if (mainTaskWasPaused || (weight != lastWeight && nfcReaderState == NFC_IDLE && (!autoSendToBambu || autoSetToBambuSpoolId == 0)))
|
||||
if (mainTaskWasPaused || (weight != lastWeight && hasReadRfidTag == 0 && (!autoSendToBambu || autoSetToBambuSpoolId == 0)))
|
||||
{
|
||||
(weight < 2) ? ((weight < -2) ? oledShowMessage("!! -0") : oledShowWeight(0)) : oledShowWeight(weight);
|
||||
}
|
||||
@@ -173,18 +147,27 @@ void loop() {
|
||||
|
||||
|
||||
// Wenn Timer abgelaufen und nicht gerade ein RFID-Tag geschrieben wird
|
||||
if (currentMillis - lastWeightReadTime >= weightReadInterval && nfcReaderState < NFC_WRITING)
|
||||
if (currentMillis - lastWeightReadTime >= weightReadInterval && hasReadRfidTag < 3)
|
||||
{
|
||||
lastWeightReadTime = currentMillis;
|
||||
|
||||
// Prüfen ob die Waage korrekt genullt ist
|
||||
if (autoTare && (weight > 0 && weight < 5) || weight < 0)
|
||||
if ((weight > 0 && weight < 5) || weight < 0)
|
||||
{
|
||||
scale_tare_counter++;
|
||||
if(scaleTareCounter < 5)
|
||||
{
|
||||
scaleTareCounter++;
|
||||
}
|
||||
else
|
||||
{
|
||||
scale_tare_counter = 0;
|
||||
scaleTareRequest = true;
|
||||
scaleTareCounter = 0;
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
scaleTareCounter = 0;
|
||||
}
|
||||
|
||||
// Prüfen ob das Gewicht gleich bleibt und dann senden
|
||||
@@ -200,8 +183,7 @@ void loop() {
|
||||
}
|
||||
|
||||
// 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)
|
||||
if (currentMillis - lastWeightReadTime >= weightReadInterval && hasReadRfidTag > 1)
|
||||
{
|
||||
weigthCouterToApi = 0;
|
||||
}
|
||||
@@ -209,8 +191,7 @@ void loop() {
|
||||
lastWeight = weight;
|
||||
|
||||
// Wenn ein Tag mit SM id erkannte wurde und der Waage Counter anspricht an SM Senden
|
||||
if (spoolId != "" && weigthCouterToApi > 3 && weightSend == 0 && nfcReaderState == NFC_READ_SUCCESS)
|
||||
{
|
||||
if (spoolId != "" && weigthCouterToApi > 3 && weightSend == 0 && hasReadRfidTag == 1) {
|
||||
oledShowIcon("loading");
|
||||
if (updateSpoolWeight(spoolId, weight))
|
||||
{
|
||||
|
||||
+37
-69
@@ -32,7 +32,7 @@ String spoolId = "";
|
||||
String nfcJsonData = "";
|
||||
volatile bool pauseBambuMqttTask = false;
|
||||
|
||||
volatile nfcReaderStateType nfcReaderState = NFC_IDLE;
|
||||
volatile uint8_t hasReadRfidTag = 0;
|
||||
// 0 = nicht gelesen
|
||||
// 1 = erfolgreich gelesen
|
||||
// 2 = fehler beim Lesen
|
||||
@@ -185,10 +185,10 @@ void processTag(uint8_t *uid, uint8_t uidLength, uint8_t readerNumber) {
|
||||
void processNfcData(uint8_t *data, String tagId) {
|
||||
// Process the data and send it via WebSocket
|
||||
if (decodeNdefAndReturnJson(data)) {
|
||||
nfcReaderState = NFC_READ_SUCCESS;
|
||||
hasReadRfidTag = 1;
|
||||
sendNfcData(nullptr);
|
||||
} else {
|
||||
nfcReaderState = NFC_READ_ERROR;
|
||||
hasReadRfidTag = 2;
|
||||
oledShowMessage("NFC-Tag unknown");
|
||||
vTaskDelay(2000 / portTICK_PERIOD_MS);
|
||||
}
|
||||
@@ -407,7 +407,7 @@ void writeJsonToTag(void *parameter) {
|
||||
Serial.println("Erstelle NDEF-Message...");
|
||||
Serial.println(payload);
|
||||
|
||||
nfcReaderState = NFC_WRITING;
|
||||
hasReadRfidTag = 3;
|
||||
vTaskSuspend(RfidReaderTask);
|
||||
vTaskDelay(50 / portTICK_PERIOD_MS);
|
||||
|
||||
@@ -462,7 +462,7 @@ void writeJsonToTag(void *parameter) {
|
||||
Serial.println("NDEF-Message erfolgreich auf den Tag geschrieben");
|
||||
oledShowIcon("success");
|
||||
vTaskDelay(1000 / portTICK_PERIOD_MS);
|
||||
nfcReaderState = NFC_WRITE_SUCCESS;
|
||||
hasReadRfidTag = 5;
|
||||
sendNfcData(nullptr);
|
||||
pauseBambuMqttTask = false;
|
||||
|
||||
@@ -481,13 +481,13 @@ void writeJsonToTag(void *parameter) {
|
||||
Serial.println("Fehler beim Schreiben der NDEF-Message auf den Tag");
|
||||
oledShowIcon("failed");
|
||||
vTaskDelay(2000 / portTICK_PERIOD_MS);
|
||||
nfcReaderState = NFC_WRITE_ERROR;
|
||||
hasReadRfidTag = 4;
|
||||
}
|
||||
} else {
|
||||
Serial.println("Fehler: Kein Tag zu schreiben gefunden.");
|
||||
oledShowMessage("No NFC-Tag found");
|
||||
vTaskDelay(2000 / portTICK_PERIOD_MS);
|
||||
nfcReaderState = NFC_IDLE;
|
||||
hasReadRfidTag = 0;
|
||||
}
|
||||
|
||||
sendWriteResult(nullptr, success);
|
||||
@@ -503,7 +503,7 @@ void startWriteJsonToTag(const char* payload) {
|
||||
char* payloadCopy = strdup(payload);
|
||||
|
||||
// Task nicht mehrfach starten
|
||||
if (nfcReaderState != NFC_WRITING) {
|
||||
if (hasReadRfidTag != 3) {
|
||||
// Erstelle die Task
|
||||
xTaskCreate(
|
||||
writeJsonToTag, // Task-Funktion
|
||||
@@ -518,61 +518,51 @@ void startWriteJsonToTag(const char* payload) {
|
||||
|
||||
void scanRfidTask(void * parameter) {
|
||||
Serial.println("RFID Task gestartet");
|
||||
if (nfcReaderState != NFC_WRITING)
|
||||
{
|
||||
for(;;) {
|
||||
if (hasReadRfidTag != 3) {
|
||||
yield();
|
||||
|
||||
uint8_t success = 0;
|
||||
uint8_t uid[] = {0, 0, 0, 0, 0, 0, 0};
|
||||
uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 };
|
||||
uint8_t uidLength;
|
||||
Adafruit_PN532 *activeReader = nullptr;
|
||||
Adafruit_PN532* activeReader = nullptr;
|
||||
|
||||
// Try first reader with increased timeout
|
||||
success = nfc1.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength, 150);
|
||||
if (success)
|
||||
{
|
||||
if (success) {
|
||||
activeReader = &nfc1;
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
delay(50); // Small delay between readers
|
||||
// Try second reader with increased timeout
|
||||
success = nfc2.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength, 150);
|
||||
if (success)
|
||||
{
|
||||
if (success) {
|
||||
activeReader = &nfc2;
|
||||
}
|
||||
}
|
||||
|
||||
foundNfcTag(nullptr, success);
|
||||
|
||||
if (success && nfcReaderState != NFC_READ_SUCCESS && activeReader != nullptr)
|
||||
{
|
||||
if (success && hasReadRfidTag != 1 && activeReader != nullptr) {
|
||||
Serial.println("Found an ISO14443A card");
|
||||
|
||||
nfcReaderState = NFC_READING;
|
||||
hasReadRfidTag = 6;
|
||||
oledShowIcon("transfer");
|
||||
vTaskDelay(500 / portTICK_PERIOD_MS);
|
||||
|
||||
if (uidLength == 7)
|
||||
{
|
||||
if (uidLength == 7) {
|
||||
uint16_t tagSize = readTagSize(*activeReader);
|
||||
if (tagSize > 0)
|
||||
{
|
||||
uint8_t *data = (uint8_t *)malloc(tagSize);
|
||||
if(tagSize > 0) {
|
||||
uint8_t* data = (uint8_t*)malloc(tagSize);
|
||||
memset(data, 0, tagSize);
|
||||
|
||||
Serial.println("Seems to be an NTAG2xx tag (7 byte UID)");
|
||||
|
||||
uint8_t numPages = readTagSize(*activeReader) / 4;
|
||||
for (uint8_t i = 4; i < 4 + numPages; i++)
|
||||
{
|
||||
if (!activeReader->ntag2xx_ReadPage(i, data + (i - 4) * 4))
|
||||
{
|
||||
uint8_t numPages = readTagSize(*activeReader)/4;
|
||||
for (uint8_t i = 4; i < 4+numPages; i++) {
|
||||
if (!activeReader->ntag2xx_ReadPage(i, data+(i-4) * 4)) {
|
||||
break;
|
||||
}
|
||||
if (data[(i - 4) * 4] == 0xFE)
|
||||
{
|
||||
if (data[(i - 4) * 4] == 0xFE) {
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -581,38 +571,29 @@ void scanRfidTask(void * parameter) {
|
||||
vTaskDelay(pdMS_TO_TICKS(5)); // Increased delay between page reads
|
||||
}
|
||||
|
||||
if (!decodeNdefAndReturnJson(data))
|
||||
{
|
||||
if (!decodeNdefAndReturnJson(data)) {
|
||||
oledShowMessage("NFC-Tag unknown");
|
||||
vTaskDelay(2000 / portTICK_PERIOD_MS);
|
||||
nfcReaderState = NFC_READ_ERROR;
|
||||
}
|
||||
else
|
||||
{
|
||||
nfcReaderState = NFC_READ_SUCCESS;
|
||||
hasReadRfidTag = 2;
|
||||
} else {
|
||||
hasReadRfidTag = 1;
|
||||
}
|
||||
|
||||
free(data);
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
oledShowMessage("NFC-Tag read error");
|
||||
nfcReaderState = NFC_READ_ERROR;
|
||||
hasReadRfidTag = 2;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
Serial.println("This doesn't seem to be an NTAG2xx tag (UUID length != 7 bytes)!");
|
||||
}
|
||||
}
|
||||
|
||||
if (!success && nfcReaderState != NFC_IDLE)
|
||||
{
|
||||
nfcReaderState = NFC_IDLE;
|
||||
if (!success && hasReadRfidTag > 0) {
|
||||
hasReadRfidTag = 0;
|
||||
nfcJsonData = "";
|
||||
Serial.println("Tag entfernt");
|
||||
if (!autoSendToBambu)
|
||||
oledShowWeight(weight);
|
||||
if (!autoSendToBambu) oledShowWeight(weight);
|
||||
}
|
||||
|
||||
sendNfcData(nullptr);
|
||||
@@ -620,6 +601,7 @@ void scanRfidTask(void * parameter) {
|
||||
}
|
||||
yield();
|
||||
}
|
||||
}
|
||||
|
||||
void startNfc() {
|
||||
initNfc();
|
||||
@@ -639,20 +621,6 @@ void startNfc() {
|
||||
}
|
||||
}
|
||||
|
||||
String createTagId(uint8_t *uid, uint8_t uidLength)
|
||||
{
|
||||
String tagId = ""; // Initialisieren Sie einen leeren String
|
||||
|
||||
// Erstellen Sie die Tag-ID basierend auf dem UID
|
||||
for (uint8_t i = 0; i < uidLength; i++)
|
||||
{
|
||||
tagId += String(uid[i], HEX); // Konvertieren Sie die UID in einen String
|
||||
if (i < uidLength - 1)
|
||||
{
|
||||
tagId += ":"; // Fügen Sie einen Trennstrich hinzu, wenn es nicht das letzte Element ist
|
||||
}
|
||||
}
|
||||
|
||||
return tagId; // Geben Sie die erstellte Tag-ID zurück
|
||||
Serial.println("tagID:" + tagId);
|
||||
String createTagId(uint8_t *uid, uint8_t uidLength) {
|
||||
// Implementierung der Funktion
|
||||
}
|
||||
@@ -2,16 +2,6 @@
|
||||
|
||||
#include <Arduino.h>
|
||||
#include <Adafruit_PN532.h>
|
||||
typedef enum
|
||||
{
|
||||
NFC_IDLE,
|
||||
NFC_READING,
|
||||
NFC_READ_SUCCESS,
|
||||
NFC_READ_ERROR,
|
||||
NFC_WRITING,
|
||||
NFC_WRITE_SUCCESS,
|
||||
NFC_WRITE_ERROR
|
||||
} nfcReaderStateType;
|
||||
|
||||
void startNfc();
|
||||
void startWriteJsonToTag(const char* payload);
|
||||
@@ -24,7 +14,7 @@ bool decodeNdefAndReturnJson(const byte* encodedMessage);
|
||||
extern TaskHandle_t RfidReaderTask;
|
||||
extern String nfcJsonData;
|
||||
extern String spoolId;
|
||||
extern volatile nfcReaderStateType nfcReaderState;
|
||||
extern volatile uint8_t hasReadRfidTag;
|
||||
extern volatile bool pauseBambuMqttTask;
|
||||
|
||||
// Function declarations
|
||||
|
||||
+3
-41
@@ -14,7 +14,6 @@ TaskHandle_t ScaleTask;
|
||||
int16_t weight = 0;
|
||||
|
||||
uint8_t weigthCouterToApi = 0;
|
||||
uint8_t scale_tare_counter = 0;
|
||||
bool scaleTareRequest = false;
|
||||
uint8_t pauseMainTask = 0;
|
||||
uint8_t scaleCalibrated = 1;
|
||||
@@ -22,26 +21,9 @@ uint8_t scaleCalibrated = 1;
|
||||
Preferences preferences;
|
||||
const char* NVS_NAMESPACE = "scale";
|
||||
const char* NVS_KEY_CALIBRATION = "cal_value";
|
||||
const char *NVS_KEY_AUTOTARE = "auto_tare";
|
||||
bool autoTare = true;
|
||||
|
||||
// ##### Funktionen für Waage #####
|
||||
uint8_t setAutoTare(bool autoTareValue)
|
||||
{
|
||||
Serial.print("Set AutoTare to ");
|
||||
Serial.println(autoTareValue);
|
||||
autoTare = autoTareValue;
|
||||
|
||||
// Speichern mit NVS
|
||||
preferences.begin(NVS_NAMESPACE, false); // false = readwrite
|
||||
preferences.putBool(NVS_KEY_AUTOTARE, autoTare);
|
||||
preferences.end();
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
uint8_t tareScale()
|
||||
{
|
||||
uint8_t tareScale() {
|
||||
Serial.println("Tare scale");
|
||||
scale.tare();
|
||||
|
||||
@@ -56,23 +38,11 @@ void scale_loop(void * parameter) {
|
||||
for(;;) {
|
||||
if (scale.is_ready())
|
||||
{
|
||||
// Waage automatisch Taren, wenn zu lange Abweichung
|
||||
if (autoTare && scale_tare_counter >= 5)
|
||||
{
|
||||
Serial.println("Auto Tare scale");
|
||||
scale.tare();
|
||||
scale_tare_counter = 0;
|
||||
}
|
||||
|
||||
// Waage manuell Taren
|
||||
// Waage nochmal Taren, wenn zu lange Abweichung
|
||||
if (scaleTareRequest == true)
|
||||
{
|
||||
Serial.println("Re-Tare scale");
|
||||
oledShowMessage("TARE Scale");
|
||||
vTaskDelay(pdMS_TO_TICKS(1000));
|
||||
scale.tare();
|
||||
vTaskDelay(pdMS_TO_TICKS(1000));
|
||||
oledShowWeight(0);
|
||||
scaleTareRequest = false;
|
||||
}
|
||||
|
||||
@@ -83,21 +53,13 @@ void scale_loop(void * parameter) {
|
||||
}
|
||||
}
|
||||
|
||||
void start_scale(bool touchSensorConnected)
|
||||
{
|
||||
void start_scale() {
|
||||
Serial.println("Prüfe Calibration Value");
|
||||
float calibrationValue;
|
||||
|
||||
// NVS lesen
|
||||
preferences.begin(NVS_NAMESPACE, true); // true = readonly
|
||||
calibrationValue = preferences.getFloat(NVS_KEY_CALIBRATION, defaultScaleCalibrationValue);
|
||||
|
||||
// auto Tare
|
||||
// Wenn Touch Sensor verbunden, dann autoTare auf false setzen
|
||||
// Danach prüfen was in NVS gespeichert ist
|
||||
autoTare = (touchSensorConnected) ? false : true;
|
||||
autoTare = preferences.getBool(NVS_KEY_AUTOTARE, autoTare);
|
||||
|
||||
preferences.end();
|
||||
|
||||
Serial.print("Read Scale Calibration Value ");
|
||||
|
||||
+2
-4
@@ -4,19 +4,17 @@
|
||||
#include <Arduino.h>
|
||||
#include "HX711.h"
|
||||
|
||||
uint8_t setAutoTare(bool autoTareValue);
|
||||
uint8_t start_scale(bool touchSensorConnected);
|
||||
|
||||
uint8_t start_scale();
|
||||
uint8_t calibrate_scale();
|
||||
uint8_t tareScale();
|
||||
|
||||
extern HX711 scale;
|
||||
extern int16_t weight;
|
||||
extern uint8_t weigthCouterToApi;
|
||||
extern uint8_t scale_tare_counter;
|
||||
extern uint8_t scaleTareRequest;
|
||||
extern uint8_t pauseMainTask;
|
||||
extern uint8_t scaleCalibrated;
|
||||
extern bool autoTare;
|
||||
|
||||
extern TaskHandle_t ScaleTask;
|
||||
|
||||
|
||||
+36
-65
@@ -22,13 +22,14 @@ AsyncWebServer server(webserverPort);
|
||||
AsyncWebSocket ws("/ws");
|
||||
|
||||
uint8_t lastSuccess = 0;
|
||||
nfcReaderStateType lastnfcReaderState = NFC_IDLE;
|
||||
uint8_t lastHasReadRfidTag = 0;
|
||||
|
||||
|
||||
void onWsEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventType type, void *arg, uint8_t *data, size_t len) {
|
||||
if (type == WS_EVT_CONNECT) {
|
||||
Serial.println("Neuer Client verbunden!");
|
||||
// Sende die AMS-Daten an den neuen Client
|
||||
if (!bambuDisabled) sendAmsData(client);
|
||||
sendAmsData(client);
|
||||
sendNfcData(client);
|
||||
foundNfcTag(client, 0);
|
||||
sendWriteResult(client, 3);
|
||||
@@ -42,7 +43,6 @@ void onWsEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventTyp
|
||||
String message = String((char*)data);
|
||||
JsonDocument doc;
|
||||
deserializeJson(doc, message);
|
||||
bool spoolmanConnected = (spoolmanApiState != API_INIT);
|
||||
|
||||
if (doc["type"] == "heartbeat") {
|
||||
// Sende Heartbeat-Antwort
|
||||
@@ -50,7 +50,7 @@ void onWsEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventTyp
|
||||
"\"type\":\"heartbeat\","
|
||||
"\"freeHeap\":" + String(ESP.getFreeHeap()/1024) + ","
|
||||
"\"bambu_connected\":" + String(bambu_connected) + ","
|
||||
"\"spoolman_connected\":" + String(spoolmanConnected) + ""
|
||||
"\"spoolman_connected\":" + String(spoolman_connected) + ""
|
||||
"}");
|
||||
}
|
||||
|
||||
@@ -73,11 +73,6 @@ void onWsEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventTyp
|
||||
success = calibrate_scale();
|
||||
}
|
||||
|
||||
if (doc["payload"] == "setAutoTare")
|
||||
{
|
||||
success = setAutoTare(doc["enabled"].as<bool>());
|
||||
}
|
||||
|
||||
if (success) {
|
||||
ws.textAll("{\"type\":\"scale\",\"payload\":\"success\"}");
|
||||
} else {
|
||||
@@ -144,33 +139,34 @@ void foundNfcTag(AsyncWebSocketClient *client, uint8_t success) {
|
||||
}
|
||||
|
||||
void sendNfcData(AsyncWebSocketClient *client) {
|
||||
if (lastnfcReaderState == nfcReaderState)
|
||||
return;
|
||||
// TBD: Why is there no status for reading the tag?
|
||||
switch (nfcReaderState)
|
||||
{
|
||||
case NFC_IDLE:
|
||||
if (lastHasReadRfidTag == hasReadRfidTag) return;
|
||||
if (hasReadRfidTag == 0) {
|
||||
ws.textAll("{\"type\":\"nfcData\", \"payload\":{}}");
|
||||
break;
|
||||
case NFC_READ_SUCCESS:
|
||||
}
|
||||
else if (hasReadRfidTag == 1) {
|
||||
ws.textAll("{\"type\":\"nfcData\", \"payload\":" + nfcJsonData + "}");
|
||||
break;
|
||||
case NFC_READ_ERROR:
|
||||
}
|
||||
else if (hasReadRfidTag == 2)
|
||||
{
|
||||
ws.textAll("{\"type\":\"nfcData\", \"payload\":{\"error\":\"Empty Tag or Data not readable\"}}");
|
||||
break;
|
||||
case NFC_WRITING:
|
||||
}
|
||||
else if (hasReadRfidTag == 3)
|
||||
{
|
||||
ws.textAll("{\"type\":\"nfcData\", \"payload\":{\"info\":\"Schreibe Tag...\"}}");
|
||||
break;
|
||||
case NFC_WRITE_SUCCESS:
|
||||
ws.textAll("{\"type\":\"nfcData\", \"payload\":{\"info\":\"Tag erfolgreich geschrieben\"}}");
|
||||
break;
|
||||
case NFC_WRITE_ERROR:
|
||||
}
|
||||
else if (hasReadRfidTag == 4)
|
||||
{
|
||||
ws.textAll("{\"type\":\"nfcData\", \"payload\":{\"error\":\"Error writing to Tag\"}}");
|
||||
break;
|
||||
case DEFAULT:
|
||||
}
|
||||
else if (hasReadRfidTag == 5)
|
||||
{
|
||||
ws.textAll("{\"type\":\"nfcData\", \"payload\":{\"info\":\"Tag erfolgreich geschrieben\"}}");
|
||||
}
|
||||
else
|
||||
{
|
||||
ws.textAll("{\"type\":\"nfcData\", \"payload\":{\"error\":\"Something went wrong\"}}");
|
||||
}
|
||||
lastnfcReaderState = nfcReaderState;
|
||||
lastHasReadRfidTag = hasReadRfidTag;
|
||||
}
|
||||
|
||||
void sendAmsData(AsyncWebSocketClient *client) {
|
||||
@@ -206,24 +202,18 @@ void setupWebserver(AsyncWebServer &server) {
|
||||
});
|
||||
|
||||
// Route für Waage
|
||||
server.on("/waage", HTTP_GET, [](AsyncWebServerRequest *request)
|
||||
{
|
||||
server.on("/waage", HTTP_GET, [](AsyncWebServerRequest *request){
|
||||
Serial.println("Anfrage für /waage erhalten");
|
||||
//AsyncWebServerResponse *response = request->beginResponse(LittleFS, "/waage.html.gz", "text/html");
|
||||
//response->addHeader("Content-Encoding", "gzip");
|
||||
//response->addHeader("Cache-Control", CACHE_CONTROL);
|
||||
|
||||
String html = loadHtmlWithHeader("/waage.html");
|
||||
html.replace("{{autoTare}}", (autoTare) ? "checked" : "");
|
||||
|
||||
request->send(200, "text/html", html); });
|
||||
AsyncWebServerResponse *response = request->beginResponse(LittleFS, "/waage.html.gz", "text/html");
|
||||
response->addHeader("Content-Encoding", "gzip");
|
||||
response->addHeader("Cache-Control", CACHE_CONTROL);
|
||||
request->send(response);
|
||||
});
|
||||
|
||||
// Route für RFID
|
||||
server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
|
||||
Serial.println("Anfrage für /rfid erhalten");
|
||||
|
||||
String page = (bambuDisabled) ? "/rfid.html.gz" : "/rfid_bambu.html.gz";
|
||||
AsyncWebServerResponse *response = request->beginResponse(LittleFS, page, "text/html");
|
||||
AsyncWebServerResponse *response = request->beginResponse(LittleFS, "/rfid.html.gz", "text/html");
|
||||
response->addHeader("Content-Encoding", "gzip");
|
||||
response->addHeader("Cache-Control", CACHE_CONTROL);
|
||||
request->send(response);
|
||||
@@ -296,16 +286,6 @@ void setupWebserver(AsyncWebServer &server) {
|
||||
}
|
||||
|
||||
String url = request->getParam("url")->value();
|
||||
if (url.indexOf("http://") == -1 && url.indexOf("https://") == -1)
|
||||
{
|
||||
url = "http://" + url;
|
||||
}
|
||||
// Remove trailing slash if exists
|
||||
if (url.length() > 0 && url.charAt(url.length() - 1) == '/')
|
||||
{
|
||||
url = url.substring(0, url.length() - 1);
|
||||
}
|
||||
|
||||
bool octoEnabled = (request->getParam("octoEnabled")->value() == "true") ? true : false;
|
||||
String octoUrl = request->getParam("octoUrl")->value();
|
||||
String octoToken = (request->getParam("octoToken")->value() != "") ? request->getParam("octoToken")->value() : "";
|
||||
@@ -320,18 +300,8 @@ void setupWebserver(AsyncWebServer &server) {
|
||||
request->send(200, "application/json", jsonResponse);
|
||||
});
|
||||
|
||||
// Route für das Überprüfen der Bambu-Instanz
|
||||
server.on("/api/bambu", HTTP_GET, [](AsyncWebServerRequest *request)
|
||||
{
|
||||
if (request->hasParam("remove")) {
|
||||
if (removeBambuCredentials()) {
|
||||
request->send(200, "application/json", "{\"success\": true}");
|
||||
} else {
|
||||
request->send(500, "application/json", "{\"success\": false, \"error\": \"Fehler beim Löschen der Bambu-Credentials\"}");
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// Route für das Überprüfen der Spoolman-Instanz
|
||||
server.on("/api/bambu", HTTP_GET, [](AsyncWebServerRequest *request){
|
||||
if (!request->hasParam("bambu_ip") || !request->hasParam("bambu_serialnr") || !request->hasParam("bambu_accesscode")) {
|
||||
request->send(400, "application/json", "{\"success\": false, \"error\": \"Missing parameter\"}");
|
||||
return;
|
||||
@@ -355,7 +325,8 @@ void setupWebserver(AsyncWebServer &server) {
|
||||
|
||||
bool success = saveBambuCredentials(bambu_ip, bambu_serialnr, bambu_accesscode, autoSend, autoSendTime);
|
||||
|
||||
request->send(200, "application/json", "{\"healthy\": " + String(success ? "true" : "false") + "}"); });
|
||||
request->send(200, "application/json", "{\"healthy\": " + String(success ? "true" : "false") + "}");
|
||||
});
|
||||
|
||||
// Route für das Überprüfen der Spoolman-Instanz
|
||||
server.on("/reboot", HTTP_GET, [](AsyncWebServerRequest *request){
|
||||
|
||||
+1
-1
@@ -59,7 +59,7 @@ void initWiFi() {
|
||||
if(wm_nonblocking) wm.setConfigPortalBlocking(false);
|
||||
//wm.setConfigPortalTimeout(320); // Portal nach 5min schließen
|
||||
wm.setWiFiAutoReconnect(true);
|
||||
wm.setConnectTimeout(10);
|
||||
wm.setConnectTimeout(5);
|
||||
|
||||
oledShowTopRow();
|
||||
oledShowMessage("WiFi Setup");
|
||||
|
||||
Reference in New Issue
Block a user