Took 1 hour 28 minutes
This commit is contained in:
Tobias Hopp 2022-11-20 18:50:10 +01:00
parent 9d839328f8
commit a4ac8d083b
8 changed files with 98 additions and 52 deletions

View File

@ -27,8 +27,6 @@ export class Settings {
this._json = JSON.parse(file.toString("utf8"));
this._setupDone = this._json["setupDone"];
this._setupDone = false;
}
public static saveSettings() {

View File

@ -4,5 +4,6 @@ export enum WebSocketEvent {
CONTAINERS = "CONTAINERS",
CONFIG = "CONFIG",
TARE = "TARE",
SETUP = "SETUP"
SETUP = "SETUP",
REQUEST = "REQUEST"
}

View File

@ -69,35 +69,30 @@ export class iTender {
log("Measuring containers...");
return new Promise(async resolve => {
for (let c of (await Container.find({enabled: true}))) {
for (let c of (await Container.find({}))) {
try {
if (!c.sensorFilledMax || c.sensorFilledMin) {
c.enabled = false;
await c.save();
continue;
}
let rand = Math.random() * 5;
if (c.sensorType == SensorType.ULTRASOUND) {
let sensor = new HCSR04(c.sensorPin1, c.sensorPin2);
c.rawData = sensor.distance();
c.rawData = rand;
c.filled = c.rawData * c.sensorFilledMin / 100;
} else if (c.sensorType == SensorType.LOADCELL) {
let sensor = new HX711(c.sensorPin1, c.sensorPin2);
c.rawData = sensor.measure();
c.rawData = rand;
}
if (c.sensorFilledMax && c.sensorFilledMin) {
c.filled = c.rawData * c.sensorFilledMax / 100;
}
} catch (e) {
c.filled = -1;
c.rawData = 0;
}
console.log(c);
await c.save();
}
log("Containers measured!");

View File

@ -84,11 +84,11 @@ router.ws('/', async (ws, req, next) => {
} else {
if (Settings.setupDone) {
iTender.setStatus(iTenderStatus.READY);
await WebSocketHandler.sendContainers();
await WebSocketHandler.sendRunningConfig();
}
}
await WebSocketHandler.sendContainers();
}
}
});

View File

@ -3,5 +3,6 @@ export enum Pane {
MENU = "MENU",
SETTINGS = "SETTINGS",
SETUP = "SETUP",
NONE = "NONE"
NONE = "NONE",
CONTAINERS = "CONTAINERS",
}

View File

@ -30,8 +30,7 @@ export class Setup {
}
(document.getElementById("setup_cancelBtn") as HTMLButtonElement).disabled = !payload.data["setupDone"];
if( !payload.data["setupDone"] )
{
if (!payload.data["setupDone"]) {
let modal = new Modal("setup", "Willkommen!");
let txt = document.createElement("p");
txt.innerHTML = `Dieser iTender ist noch nicht eingerichtet.<br>Um ihn zu nutzen, ist eine Grund-Konfiguration (Setup) nötig.<br><br>Das Setup lässt sich später auch jederzeit aus dem Menü erneut aufrufen.<br>Um die Einrichtung des Gerätes abzuschließen, muss mindestens ein Behälter mit Pumpe (optional auch Sensor) hinzugefügt werden.<br><br>`;
@ -48,7 +47,9 @@ Hier lässt sich konfigurieren, ob die Nutzung der Remote-Bedienung erlaubt ist,
<strong>Behälter-Modul</strong><br>
Dort werden die Behälter definiert, welche in den iTender gestellt werden.<br>Dort müssen GPIO-Pins der Pumpe, etwaige Sensoren-Typen und Pins definiert werden.<br>Außerdem wird das Volumen eingestellt.<br><br>`;
btn.innerText = "Einrichtung starten";
btn.onclick= () => {modal.close();}
btn.onclick = () => {
modal.close();
}
}
modal.addContent(btn);
modal.open();
@ -189,7 +190,7 @@ Dort werden die Behälter definiert, welche in den iTender gestellt werden.<br>D
let tareModal = new Modal("tare", "Einmessung Sensoren");
let txt = document.createElement("p");
txt.innerHTML = `Damit alle Sensoren korrekte Werte liefern, sollte eine Einmessung durchgeführt werden.<br>
Während der Einmessung müssen die Behälter je nachdem geleert, gefüllt oder komplett entnommen werden.<br><br>`;
Während der Einmessung müssen die Behälter einmal geleert und gefüllt werden.<br><br>`;
tareModal.addContent(txt);
tareModal.addButton(ButtonType.PRIMARY, "Später", () => {
@ -205,7 +206,7 @@ Während der Einmessung müssen die Behälter je nachdem geleert, gefüllt oder
let txt = document.createElement("p");
txt.innerHTML = `Messung Teil 1<br>
Bitte alle <strong>Behälter entfernen</strong> und Sensoren freilegen.<br>
Bitte den <strong>Inhalt der Behälter entfernen</strong><br>
Die Gewichtssensoren werden beim Bestätigen austariert<br><br>Zum fortfahren Tarieren drücken.<br>`;
modal.addContent(txt);
@ -221,27 +222,12 @@ Die Gewichtssensoren werden beim Bestätigen austariert<br><br>Zum fortfahren Ta
WebWebSocketHandler.send(payload);
txt.innerHTML = `Messung Teil 2<br>
Bitte nun alle <strong>Behälter ohne Inhalt</strong> einsetzen.<br>
Bitte nun alle <strong>Behälter mit Inhalt füllen</strong> und wieder einsetzen.<br>
Die Gewichtssensoren werden beim Bestätigen austariert.<br><br>Zum fortfahren Tarieren drücken.<br>`;
btn.onclick = () => {
let payload = new WebSocketPayload(WebSocketEvent.TARE, false, {tare: 1});
WebWebSocketHandler.send(payload);
txt.innerHTML = `Messung Teil 3<br>
Bitte nun alle <strong>Behälter mit vollständigem Inhalt</strong> einsetzen.<br>
Die Gewichtssensoren werden beim Bestätigen austariert.<br><br>Zum fortfahren Tarieren drücken.<br>`;
btn.onclick = () => {
let payload = new WebSocketPayload(WebSocketEvent.TARE, false, {tare: 2});
WebWebSocketHandler.send(payload);
payload = new WebSocketPayload(WebSocketEvent.TARE, false, {state: false});
WebWebSocketHandler.send(payload);
txt.innerHTML = `Alle Werte wurden erfolgreich gespeichert.<br>Die Einmessung kann jederzeit über die Speichern-Navigation wiederholt werden.<br><br>Das Einmessen sollte nach mehrfachem Benutzen wiederholt werden.<br>`;
btn.innerText = "Schließen";
btn.onclick = () => modal.close();
}
};
};
@ -252,7 +238,7 @@ Die Gewichtssensoren werden beim Bestätigen austariert.<br><br>Zum fortfahren T
tareModal.open();
WebWebSocketHandler.tareContainerUpdates = (payload: WebSocketPayload) => {
WebWebSocketHandler.registerForEvent(WebSocketEvent.CONTAINERS, (payload: WebSocketPayload) => {
if (!ul) return;
ul.innerHTML = "";
@ -261,10 +247,10 @@ Die Gewichtssensoren werden beim Bestätigen austariert.<br><br>Zum fortfahren T
if (c.sensorType == SensorType.NONE) continue;
let li = document.createElement("li");
li.innerText = `Behälter ${c.slot}: ${c.rawData} [${c.sensorType}]`;
li.innerText = `Behälter ${c.slot}: ${c.rawData.toFixed(3)} [${c.sensorType}]`;
ul.append(li);
}
}
});
}
public static addSetupContainer() {

View File

@ -11,6 +11,7 @@ export class WebWebSocketHandler {
private static socket: WebSocket;
private static url = (window.location.protocol == "http:" ? "ws://" : "wss://") + window.location.hostname + ":3005";
public static tareContainerUpdates: (payload: WebSocketPayload) => void;
private static eventRegister: { event: WebSocketEvent, fn: (payload: WebSocketPayload) => void }[] = [];
constructor() {
@ -21,6 +22,10 @@ export class WebWebSocketHandler {
WebWebSocketHandler.socket.onmessage = this.onMessage;
}
public static registerForEvent(event: WebSocketEvent, fn: (payload: WebSocketPayload) => void) {
WebWebSocketHandler.eventRegister.push({event: event, fn: fn});
}
private onMessage(msgEvent: MessageEvent) {
let payload = WebSocketPayload.parseFromBase64Json(msgEvent.data);
if (!payload) {
@ -29,6 +34,11 @@ export class WebWebSocketHandler {
}
console.log("[WS] Received " + payload.event + " Event", payload);
for (let evReg of WebWebSocketHandler.eventRegister) {
if (evReg.event == payload.event)
evReg.fn(payload);
}
switch (payload.event) {
case WebSocketEvent.CONFIG: {
// Incoming WebSocketStatus
@ -82,14 +92,6 @@ export class WebWebSocketHandler {
WebHandler.onDrinkUpdate(payload);
break;
}
case WebSocketEvent.CONTAINERS: {
WebHandler.onContainerUpdate(payload);
if (WebWebSocketHandler.tareContainerUpdates != undefined) {
WebWebSocketHandler.tareContainerUpdates(payload);
}
break;
}
}
}

View File

@ -2,6 +2,9 @@ import {WebWebSocketHandler} from "./WebWebSocketHandler";
import {Modal} from "./Modal";
import {WebHandler} from "./WebHandler";
import {Pane} from "./Pane";
import {WebSocketPayload} from "../WebSocketPayload";
import {WebSocketEvent} from "../WebSocketEvent";
import {ButtonType} from "./ButtonType";
const main = document.getElementById("main");
const time = document.getElementById("right");
@ -23,6 +26,7 @@ document.addEventListener("DOMContentLoaded", () => {
});
function setupOnClickEvents() {
// Menu BTN
const menuBtn = document.getElementById("menuBtn") as HTMLButtonElement;
menuBtn.disabled = true;
@ -37,6 +41,65 @@ function setupOnClickEvents() {
}
menuBtn.onclick = doMenu;
// Menu buttons
const menuContainersBtn = document.getElementById("menu_containers") as HTMLButtonElement;
const menuStatsBtn = document.getElementById("menu_stats") as HTMLButtonElement;
menuContainersBtn.onclick = () => WebHandler.openPane(Pane.CONTAINERS);
menuStatsBtn.onclick = async () => {
let statsModal = new Modal("stats", "Statistiken");
let txt = document.createElement("p");
txt.innerHTML = `Folgende Statistiken wurden erfasst.`;
statsModal.addContent(txt);
let div = document.createElement("div");
div.style.textAlign = "left";
statsModal.addContent(div);
let list = document.createElement("ul");
div.append(list);
statsModal.addContent(document.createElement("br"));
statsModal.addButton(ButtonType.PRIMARY, "Schließen", () => statsModal.close());
WebWebSocketHandler.registerForEvent(WebSocketEvent.REQUEST, (payload) => {
if (payload.data["event"] == "stats") {
let li = document.createElement("li");
li.innerText = "Cocktails ausgegeben: " + payload.data["content"]["drinks_finished"];
list.append(li);
li = document.createElement("li");
li.innerText = "Häufigster Cocktail: " + payload.data["content"]["drink_most"];
list.append(li);
li = document.createElement("li");
li.innerText = "Anzahl Ingredients: " + payload.data["content"]["count_ingredients"];
list.append(li);
li = document.createElement("li");
li.innerText = "Anzahl Cocktails: " + payload.data["content"]["count_cocktails"];
list.append(li);
}
});
let payload = new WebSocketPayload(WebSocketEvent.REQUEST, false, {type: "stats"});
await WebWebSocketHandler.send(payload);
await statsModal.open();
};
const menuSettingsBtn = document.getElementById("menu_settings") as HTMLButtonElement;
const menuSetupBtn = document.getElementById("menu_setup") as HTMLButtonElement;
menuSettingsBtn.onclick = () => WebHandler.openPane(Pane.SETTINGS);
menuSetupBtn.onclick = () => {
let payload = new WebSocketPayload(WebSocketEvent.SETUP, false, true );
WebWebSocketHandler.send(payload);
}
}
function load() {