diff --git a/src/Settings.ts b/src/Settings.ts
index 3ef08c1..3b61876 100644
--- a/src/Settings.ts
+++ b/src/Settings.ts
@@ -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() {
diff --git a/src/WebSocketEvent.ts b/src/WebSocketEvent.ts
index 6124e5a..c5a082e 100644
--- a/src/WebSocketEvent.ts
+++ b/src/WebSocketEvent.ts
@@ -4,5 +4,6 @@ export enum WebSocketEvent {
CONTAINERS = "CONTAINERS",
CONFIG = "CONFIG",
TARE = "TARE",
- SETUP = "SETUP"
+ SETUP = "SETUP",
+ REQUEST = "REQUEST"
}
\ No newline at end of file
diff --git a/src/iTender.ts b/src/iTender.ts
index 973d6ad..6714ffe 100644
--- a/src/iTender.ts
+++ b/src/iTender.ts
@@ -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!");
diff --git a/src/routes/ws/websocketRoute.ts b/src/routes/ws/websocketRoute.ts
index 0f49bc8..70b49fc 100644
--- a/src/routes/ws/websocketRoute.ts
+++ b/src/routes/ws/websocketRoute.ts
@@ -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();
}
}
});
diff --git a/src/web/Pane.ts b/src/web/Pane.ts
index 1702d61..a3a624f 100644
--- a/src/web/Pane.ts
+++ b/src/web/Pane.ts
@@ -3,5 +3,6 @@ export enum Pane {
MENU = "MENU",
SETTINGS = "SETTINGS",
SETUP = "SETUP",
- NONE = "NONE"
+ NONE = "NONE",
+ CONTAINERS = "CONTAINERS",
}
\ No newline at end of file
diff --git a/src/web/Setup.ts b/src/web/Setup.ts
index b1e45f9..bd21fe4 100644
--- a/src/web/Setup.ts
+++ b/src/web/Setup.ts
@@ -30,14 +30,13 @@ 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.
Um ihn zu nutzen, ist eine Grund-Konfiguration (Setup) nötig.
Das Setup lässt sich später auch jederzeit aus dem Menü erneut aufrufen.
Um die Einrichtung des Gerätes abzuschließen, muss mindestens ein Behälter mit Pumpe (optional auch Sensor) hinzugefügt werden.
`;
modal.addContent(txt);
let btn = document.createElement("button");
- btn.classList.add("btn","btn-primary");
+ btn.classList.add("btn", "btn-primary");
btn.innerText = "Weiter";
btn.onclick = () => {
txt.innerHTML = `Auf der folgenden Seite können nun verschiedene Module eingerichtet werden.
@@ -48,7 +47,9 @@ Hier lässt sich konfigurieren, ob die Nutzung der Remote-Bedienung erlaubt ist,
Behälter-Modul
Dort werden die Behälter definiert, welche in den iTender gestellt werden.
Dort müssen GPIO-Pins der Pumpe, etwaige Sensoren-Typen und Pins definiert werden.
Außerdem wird das Volumen eingestellt.
`;
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.
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.
-Während der Einmessung müssen die Behälter je nachdem geleert, gefüllt oder komplett entnommen werden.
`;
+Während der Einmessung müssen die Behälter einmal geleert und gefüllt werden.
`;
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
-Bitte alle Behälter entfernen und Sensoren freilegen.
+Bitte den Inhalt der Behälter entfernen
Die Gewichtssensoren werden beim Bestätigen austariert
Zum fortfahren Tarieren drücken.
`;
modal.addContent(txt);
@@ -221,27 +222,12 @@ Die Gewichtssensoren werden beim Bestätigen austariert
Zum fortfahren Ta
WebWebSocketHandler.send(payload);
txt.innerHTML = `Messung Teil 2
-Bitte nun alle Behälter ohne Inhalt einsetzen.
+Bitte nun alle Behälter mit Inhalt füllen und wieder einsetzen.
Die Gewichtssensoren werden beim Bestätigen austariert.
Zum fortfahren Tarieren drücken.
`;
btn.onclick = () => {
let payload = new WebSocketPayload(WebSocketEvent.TARE, false, {tare: 1});
WebWebSocketHandler.send(payload);
-
- txt.innerHTML = `Messung Teil 3
-Bitte nun alle Behälter mit vollständigem Inhalt einsetzen.
-Die Gewichtssensoren werden beim Bestätigen austariert.
Zum fortfahren Tarieren drücken.
`;
-
- 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.
Die Einmessung kann jederzeit über die Speichern-Navigation wiederholt werden.
Das Einmessen sollte nach mehrfachem Benutzen wiederholt werden.
`;
- btn.innerText = "Schließen";
- btn.onclick = () => modal.close();
- }
-
+ btn.onclick = () => modal.close();
};
};
@@ -252,7 +238,7 @@ Die Gewichtssensoren werden beim Bestätigen austariert.
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.
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() {
@@ -290,7 +276,7 @@ Die Gewichtssensoren werden beim Bestätigen austariert.
Zum fortfahren T
selectPin.append(noSel.cloneNode(true));
selectPin.selectedIndex = 0;
// 3,5,7,8,10,11,12,13,15,16,18,19,21,22,23,24,26,29,31,32,33,35,36,37,38,40
- const pins = [3,7,8,10,11,12,13,15,16,18,19,21,22,23,24,26,29,31,32,33,35,36,37,38];
+ const pins = [3, 7, 8, 10, 11, 12, 13, 15, 16, 18, 19, 21, 22, 23, 24, 26, 29, 31, 32, 33, 35, 36, 37, 38];
for (let pin of pins) {
let pinEle = document.createElement("option") as HTMLOptionElement;
pinEle.innerText = "" + pin;
diff --git a/src/web/WebWebSocketHandler.ts b/src/web/WebWebSocketHandler.ts
index 27115ca..bc33496 100644
--- a/src/web/WebWebSocketHandler.ts
+++ b/src/web/WebWebSocketHandler.ts
@@ -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;
- }
}
}
@@ -170,7 +172,7 @@ export class WebWebSocketHandler {
}
public static send(payload: WebSocketPayload): Promise {
- console.log("[WS] Sending " + payload.event + " Event",payload);
+ console.log("[WS] Sending " + payload.event + " Event", payload);
return new Promise(async (resolve, reject) => {
try {
if (this.socket && this.socket.readyState == 1) {
diff --git a/src/web/main.ts b/src/web/main.ts
index a14d325..28a9703 100644
--- a/src/web/main.ts
+++ b/src/web/main.ts
@@ -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() {