update
Took 1 hour 28 minutes
This commit is contained in:
parent
9d839328f8
commit
a4ac8d083b
@ -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() {
|
||||
|
@ -4,5 +4,6 @@ export enum WebSocketEvent {
|
||||
CONTAINERS = "CONTAINERS",
|
||||
CONFIG = "CONFIG",
|
||||
TARE = "TARE",
|
||||
SETUP = "SETUP"
|
||||
SETUP = "SETUP",
|
||||
REQUEST = "REQUEST"
|
||||
}
|
@ -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!");
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
@ -3,5 +3,6 @@ export enum Pane {
|
||||
MENU = "MENU",
|
||||
SETTINGS = "SETTINGS",
|
||||
SETUP = "SETUP",
|
||||
NONE = "NONE"
|
||||
NONE = "NONE",
|
||||
CONTAINERS = "CONTAINERS",
|
||||
}
|
@ -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() {
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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() {
|
||||
|
Loading…
x
Reference in New Issue
Block a user