parent
de1a2641f7
commit
f4da186fb7
@ -11,6 +11,7 @@ import {MyGPIO} from "./MyGPIO";
|
|||||||
import {ContainerHelper} from "./ContainerHelper";
|
import {ContainerHelper} from "./ContainerHelper";
|
||||||
import {Mixer} from "./Mixer";
|
import {Mixer} from "./Mixer";
|
||||||
import {ArduinoProxy} from "./ArduinoProxy";
|
import {ArduinoProxy} from "./ArduinoProxy";
|
||||||
|
import path from "path";
|
||||||
|
|
||||||
const log = debug("itender:server");
|
const log = debug("itender:server");
|
||||||
|
|
||||||
@ -18,6 +19,8 @@ const app = new App();
|
|||||||
const wsApp = new WebsocketApp();
|
const wsApp = new WebsocketApp();
|
||||||
|
|
||||||
|
|
||||||
|
global.appRoot = path.resolve(__dirname);
|
||||||
|
|
||||||
(async () => {
|
(async () => {
|
||||||
try {
|
try {
|
||||||
log("Starting...");
|
log("Starting...");
|
||||||
|
@ -18,6 +18,7 @@ import {ContainerHelper} from "../../ContainerHelper";
|
|||||||
import * as os from "os";
|
import * as os from "os";
|
||||||
import {promisify} from "util";
|
import {promisify} from "util";
|
||||||
import Drink from "../../database/Drink";
|
import Drink from "../../database/Drink";
|
||||||
|
import path from "path";
|
||||||
|
|
||||||
const exec = promisify(require('child_process').exec)
|
const exec = promisify(require('child_process').exec)
|
||||||
|
|
||||||
@ -57,14 +58,13 @@ router.ws('/', async (ws, req, next) => {
|
|||||||
|
|
||||||
let i = 0;
|
let i = 0;
|
||||||
for (let c of data) {
|
for (let c of data) {
|
||||||
let container : IContainer | null = null;
|
let container: IContainer | null = null;
|
||||||
|
|
||||||
if( c.id )
|
if (c.id) {
|
||||||
{
|
container = await Container.findOne({_id: c.id});
|
||||||
container = await Container.findOne( {_id: c.id } );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if( !container )
|
if (!container)
|
||||||
container = new Container();
|
container = new Container();
|
||||||
|
|
||||||
|
|
||||||
@ -80,14 +80,13 @@ router.ws('/', async (ws, req, next) => {
|
|||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
|
||||||
let containers : IContainer[] = await Container.find();
|
let containers: IContainer[] = await Container.find();
|
||||||
for( let c of containers )
|
for (let c of containers) {
|
||||||
{
|
let find = data.find((e) => {
|
||||||
let find = data.find( (e) => {
|
|
||||||
return c._id == e.id;
|
return c._id == e.id;
|
||||||
} );
|
});
|
||||||
if( !find )
|
if (!find)
|
||||||
await Container.deleteOne({_id: c._id });
|
await Container.deleteOne({_id: c._id});
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
@ -215,8 +214,7 @@ router.ws('/', async (ws, req, next) => {
|
|||||||
if (conf["arduino_proxy_enabled"]) {
|
if (conf["arduino_proxy_enabled"]) {
|
||||||
try {
|
try {
|
||||||
await ArduinoProxy.disconnect();
|
await ArduinoProxy.disconnect();
|
||||||
} catch( e )
|
} catch (e) {
|
||||||
{
|
|
||||||
|
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
@ -246,7 +244,7 @@ router.ws('/', async (ws, req, next) => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return WebSocketHandler.answerRequest(msg.data["type"] as RequestType, content);
|
WebSocketHandler.answerRequest(msg.data["type"] as RequestType, content);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case RequestType.TARE: {
|
case RequestType.TARE: {
|
||||||
@ -272,7 +270,6 @@ router.ws('/', async (ws, req, next) => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
// { success: boolean, msg: string }
|
|
||||||
WebSocketHandler.answerRequest(type, {success: false, msg: e});
|
WebSocketHandler.answerRequest(type, {success: false, msg: e});
|
||||||
success = false;
|
success = false;
|
||||||
for (let t of timeouts)
|
for (let t of timeouts)
|
||||||
@ -301,45 +298,49 @@ router.ws('/', async (ws, req, next) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
case RequestType.UPDATE: {
|
case RequestType.UPDATE: {
|
||||||
if( !iTender.internetConnection )
|
if (!iTender.internetConnection)
|
||||||
return WebSocketHandler.answerRequest(msg.data["type"] as RequestType, false);
|
return WebSocketHandler.answerRequest(msg.data["type"] as RequestType, false);
|
||||||
WebSocketHandler.answerRequest(msg.data["type"] as RequestType, true);
|
WebSocketHandler.answerRequest(msg.data["type"] as RequestType, true);
|
||||||
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
let result = await exec("/home/itender/itender/update.sh");
|
let result = await exec(path.join(global.appRoot, "/update.sh"));
|
||||||
if( result.stderr )
|
if (result.stderr)
|
||||||
await WebSocketHandler.send(new WebSocketPayload(WebSocketEvent.ERROR, "Der iTender konnte das Update nicht installieren.<br>Möglicherweise ist die Internetverbindung nicht ausreichend oder das Update enthält Fehler.<br>"));
|
await WebSocketHandler.send(new WebSocketPayload(WebSocketEvent.ERROR, "Der iTender konnte das Update nicht installieren.<br>Möglicherweise ist die Internetverbindung nicht ausreichend oder das Update enthält Fehler.<br>"));
|
||||||
} catch( e )
|
} catch (e ) {
|
||||||
{
|
console.error(e);
|
||||||
await WebSocketHandler.send(new WebSocketPayload(WebSocketEvent.ERROR, "Der iTender konnte das Update nicht installieren.<br>Möglicherweise ist die Internetverbindung nicht ausreichend oder das Update enthält Fehler.<br>"));
|
let error = e as {code: number, killed: boolean, cmd: string};
|
||||||
}
|
|
||||||
|
|
||||||
|
let msg = "";
|
||||||
|
if(error.code == 127 )
|
||||||
|
msg = "Beim Ausführen ist ein unbekanntes Problem aufgetreten.";
|
||||||
|
else if ( error.code == 1 )
|
||||||
|
msg = "Die Internetverbindung ist nicht ausreichend, um iTender zu aktualisieren.";
|
||||||
|
|
||||||
|
await WebSocketHandler.send(new WebSocketPayload(WebSocketEvent.ERROR, "Der iTender konnte das Update nicht installieren.<br><br>" + msg ));
|
||||||
|
log("Could not execute update.sh" );
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case RequestType.INFO: {
|
case RequestType.INFO: {
|
||||||
let nets = os.networkInterfaces();
|
let nets = os.networkInterfaces();
|
||||||
let net = nets["wlan0"];
|
let net = nets["wlan0"];
|
||||||
if(!net)
|
if (!net)
|
||||||
net = nets["wlp0s20f3"];
|
net = nets["wlp0s20f3"];
|
||||||
let ipAddr : string = "";
|
let ipAddr: string = "";
|
||||||
if( net )
|
if (net)
|
||||||
for( let addr of net )
|
for (let addr of net) {
|
||||||
{
|
if (addr.family == "IPv4" && addr.address && addr.address !== "127.0.0.1")
|
||||||
if( addr.family == "IPv4" && addr.address && addr.address !== "127.0.0.1" )
|
|
||||||
ipAddr = addr.address;
|
ipAddr = addr.address;
|
||||||
}
|
}
|
||||||
|
|
||||||
let packageJson = require('../../../package.json');
|
let packageJson = require('../../../package.json');
|
||||||
|
|
||||||
let wifi = (await exec("iwgetid")).stdout
|
let wifi = (await exec("iwgetid")).stdout
|
||||||
|
|
||||||
|
|
||||||
let data = {
|
let data = {
|
||||||
"internet": iTender.internetConnection,
|
"internet": iTender.internetConnection,
|
||||||
"ip": ipAddr,
|
"ip": ipAddr,
|
||||||
"network": wifi.substring(wifi.indexOf('"')+1,wifi.length-2),
|
"network": wifi.substring(wifi.indexOf('"') + 1, wifi.length - 2),
|
||||||
"uptime": (await exec("uptime -p")).stdout.substring(3),
|
"uptime": (await exec("uptime -p")).stdout.substring(3),
|
||||||
"version": packageJson.version,
|
"version": packageJson.version,
|
||||||
"author": "Tobias Hopp",
|
"author": "Tobias Hopp",
|
||||||
@ -353,8 +354,7 @@ router.ws('/', async (ws, req, next) => {
|
|||||||
case RequestType.CLEAR_DB: {
|
case RequestType.CLEAR_DB: {
|
||||||
await Drink.deleteMany({});
|
await Drink.deleteMany({});
|
||||||
await Ingredient.deleteMany({});
|
await Ingredient.deleteMany({});
|
||||||
for( let c of (await Container.find()) )
|
for (let c of (await Container.find())) {
|
||||||
{
|
|
||||||
c.content = undefined;
|
c.content = undefined;
|
||||||
c.save();
|
c.save();
|
||||||
}
|
}
|
||||||
@ -373,7 +373,6 @@ router.ws('/', async (ws, req, next) => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
module.exports = router;
|
module.exports = router;
|
||||||
|
@ -8,9 +8,15 @@ export class Settings {
|
|||||||
// Settings Btns
|
// Settings Btns
|
||||||
const downloadDrinks = document.getElementById("settings_refreshDrinks") as HTMLButtonElement;
|
const downloadDrinks = document.getElementById("settings_refreshDrinks") as HTMLButtonElement;
|
||||||
downloadDrinks.onclick = () => this.onClickRefreshDrinks();
|
downloadDrinks.onclick = () => this.onClickRefreshDrinks();
|
||||||
|
|
||||||
|
const deleteDrinks = document.getElementById("settings_deleteDrinks") as HTMLButtonElement;
|
||||||
|
deleteDrinks.onclick = () => this.onClickDelete();
|
||||||
|
|
||||||
|
|
||||||
const getInfo = document.getElementById("settings_getInfo") as HTMLButtonElement;
|
const getInfo = document.getElementById("settings_getInfo") as HTMLButtonElement;
|
||||||
getInfo.onclick = () => this.onClickInfo();
|
getInfo.onclick = () => this.onClickInfo();
|
||||||
|
|
||||||
|
|
||||||
const reload = document.getElementById("settings_reload") as HTMLButtonElement;
|
const reload = document.getElementById("settings_reload") as HTMLButtonElement;
|
||||||
reload.onclick = () => window.location.reload();
|
reload.onclick = () => window.location.reload();
|
||||||
|
|
||||||
@ -74,8 +80,7 @@ export class Settings {
|
|||||||
WebWebSocketHandler.request(RequestType.UPDATE, null).then((payload) => {
|
WebWebSocketHandler.request(RequestType.UPDATE, null).then((payload) => {
|
||||||
let modal = new Modal("info", "System-Update");
|
let modal = new Modal("info", "System-Update");
|
||||||
let txt = document.createElement("p");
|
let txt = document.createElement("p");
|
||||||
if (payload.data as boolean) {
|
if (!!payload.data) {
|
||||||
|
|
||||||
txt.innerHTML = `Der iTender wird nun aktualisiert!<br><br>
|
txt.innerHTML = `Der iTender wird nun aktualisiert!<br><br>
|
||||||
Sobald das Update installiert ist, wird das System neu gestartet.<br>Die dadurch hergehende Verbindungswarnung kann ignoriert werden.<br>Der iTender stellt die Verbindung automatisch wieder her.<br><br><span style="color:red;font-weight: bold">Schalten Sie das System nicht aus und entfernen Sie nicht das Netzkabel!</span>`;
|
Sobald das Update installiert ist, wird das System neu gestartet.<br>Die dadurch hergehende Verbindungswarnung kann ignoriert werden.<br>Der iTender stellt die Verbindung automatisch wieder her.<br><br><span style="color:red;font-weight: bold">Schalten Sie das System nicht aus und entfernen Sie nicht das Netzkabel!</span>`;
|
||||||
modal.addContent(txt);
|
modal.addContent(txt);
|
||||||
@ -88,4 +93,22 @@ Sobald das Update installiert ist, wird das System neu gestartet.<br>Die dadurch
|
|||||||
modal.open();
|
modal.open();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static onClickDelete() {
|
||||||
|
WebWebSocketHandler.request(RequestType.CLEAR_DB, null).then((payload) => {
|
||||||
|
let modal = new Modal("delete", "Datenbank leeren");
|
||||||
|
let txt = document.createElement("p");
|
||||||
|
if (payload.data as boolean) {
|
||||||
|
|
||||||
|
txt.innerHTML = `Die Datenbank des iTender's wurde geleert.<br>Um nun Cocktails auszugeben, muss die Datenbank aktualisiert werden.<br><br>Wähle dazu bitte <strong>Getränke herunterladen</strong> in den Einstellungen.<br><br>`;
|
||||||
|
modal.addContent(txt);
|
||||||
|
} else {
|
||||||
|
txt.innerHTML = `Die Datenbank des iTenders konnte aus einem unbekannten Grund nicht geleert werden.<br>Bitte versuche es zu einem späteren Zeitpunkt erneut.<br><br>`;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
modal.addButton(ButtonType.PRIMARY, "Schließen", () => modal.close());
|
||||||
|
modal.open();
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
@ -12,7 +12,6 @@ import {Fill} from "./Fill";
|
|||||||
export class WebWebSocketHandler {
|
export class WebWebSocketHandler {
|
||||||
private static socket: WebSocket;
|
private static socket: WebSocket;
|
||||||
private static url = (window.location.protocol == "http:" ? "ws://" : "wss://") + window.location.hostname + ":3005";
|
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 }[] = [];
|
private static eventRegister: { event: WebSocketEvent, fn: (payload: WebSocketPayload) => void }[] = [];
|
||||||
|
|
||||||
|
|
||||||
@ -39,176 +38,6 @@ export class WebWebSocketHandler {
|
|||||||
WebWebSocketHandler.eventRegister.push({event: event, fn: fn});
|
WebWebSocketHandler.eventRegister.push({event: event, fn: fn});
|
||||||
}
|
}
|
||||||
|
|
||||||
private onMessage(msgEvent: MessageEvent) {
|
|
||||||
let payload = WebSocketPayload.parseFromBase64Json(msgEvent.data);
|
|
||||||
if (!payload) {
|
|
||||||
console.log("[WS] Could not parse message: ", msgEvent);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
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: {
|
|
||||||
Setup.onConfigUpdate(payload);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case WebSocketEvent.DRINKS: {
|
|
||||||
WebHandler.onDrinkUpdate(payload);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case WebSocketEvent.ERROR: {
|
|
||||||
let modal = new Modal("error", "Aww crap!");
|
|
||||||
let txt = document.createElement("p");
|
|
||||||
txt.innerHTML = payload.data;
|
|
||||||
modal.addContent(txt);
|
|
||||||
modal.addContent(document.createElement("br"));
|
|
||||||
modal.addButton(ButtonType.PRIMARY, "Schließen", () => modal.close() );
|
|
||||||
modal.open();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Incoming WebSocketStatus
|
|
||||||
case WebSocketEvent.STATUS: {
|
|
||||||
let statusElement = document.getElementById("status");
|
|
||||||
if (statusElement)
|
|
||||||
statusElement.innerText = payload.data.status;
|
|
||||||
|
|
||||||
let status: iTenderStatus = payload.data.status;
|
|
||||||
|
|
||||||
switch (status) {
|
|
||||||
case iTenderStatus.READY: {
|
|
||||||
Modal.close("start");
|
|
||||||
Modal.close("setup");
|
|
||||||
Modal.close("fill");
|
|
||||||
Modal.close("download");
|
|
||||||
if (WebHandler.currentPane != Pane.MENU)
|
|
||||||
WebHandler.openPane(Pane.MAIN);
|
|
||||||
(document.getElementById("menuBtn") as HTMLButtonElement).disabled = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case iTenderStatus.STARTING: {
|
|
||||||
let modal = new Modal("start", "Willkommen!");
|
|
||||||
let txt = document.createElement("p");
|
|
||||||
txt.innerHTML = `Einen Augenblick bitte<br>iTender startet...`;
|
|
||||||
modal.addContent(txt);
|
|
||||||
modal.loader = true;
|
|
||||||
modal.open();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case iTenderStatus.DOWNLOADING: {
|
|
||||||
let modal = new Modal("download", "Aktualisieren");
|
|
||||||
let txt = document.createElement("p");
|
|
||||||
txt.innerHTML = `Einen Augenblick bitte<br>iTender aktualisiert die Getränke vom Server...`;
|
|
||||||
modal.addContent(txt);
|
|
||||||
modal.loader = true;
|
|
||||||
modal.open();
|
|
||||||
setTimeout( () => {
|
|
||||||
if( txt )
|
|
||||||
{
|
|
||||||
txt.innerHTML = txt.innerHTML + "<br><br>Der Vorgang dauert länger als gewöhnlich.<br>Überprüfe deine Internetverbindung!"
|
|
||||||
}
|
|
||||||
}, 1000 * 15 )
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case iTenderStatus.SETUP: {
|
|
||||||
Modal.close("start");
|
|
||||||
Setup.openSetup();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case iTenderStatus.FILLING: {
|
|
||||||
Fill.onFillEvent(payload);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default: {
|
|
||||||
console.log("Unknown to handle " + status);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private onOpen(event) {
|
|
||||||
console.log("[WS] Connected", event);
|
|
||||||
|
|
||||||
const blockPanel = document.getElementById("blockPanel") as HTMLDivElement;
|
|
||||||
blockPanel.classList.add("opacityOutDisplayNone");
|
|
||||||
}
|
|
||||||
|
|
||||||
private onClose(event) {
|
|
||||||
console.error("[WS] Closed!", event);
|
|
||||||
if (event.wasClean) {
|
|
||||||
let modal = new Modal("socketClosed", "Sitzung beendet!");
|
|
||||||
let txt = document.createElement("p");
|
|
||||||
txt.innerHTML = `Diese Sitzung wurde beendet, da der iTender nun an einem anderen Gerät bzw. an dem Hauptgerät gesteuert wird.<br><br>`;
|
|
||||||
modal.addContent(txt);
|
|
||||||
modal.addButton(ButtonType.PRIMARY, "Sitzung wiederherstellen", () => {
|
|
||||||
window.location.reload();
|
|
||||||
});
|
|
||||||
modal.open();
|
|
||||||
} else {
|
|
||||||
let modal = new Modal("socketClosed", "Verbindungsproblem!");
|
|
||||||
let txt = document.createElement("p");
|
|
||||||
txt.innerHTML = `Die Benutzeroberfläche hat die Verbindung mit dem Gerät verloren.<br>Die Verbindung wird wiederhergestellt...<br>`;
|
|
||||||
modal.addContent(txt);
|
|
||||||
modal.loader = true;
|
|
||||||
modal.open();
|
|
||||||
setInterval(async () => {
|
|
||||||
if ((await WebWebSocketHandler.checkConnection()))
|
|
||||||
window.location.reload();
|
|
||||||
}, 2000);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* let connectionElement = document.getElementById("right");
|
|
||||||
if (connectionElement) {
|
|
||||||
connectionElement.innerText = "Getrennt";
|
|
||||||
connectionElement.style.color = "red";
|
|
||||||
}*/
|
|
||||||
}
|
|
||||||
|
|
||||||
private static checkConnection(): Promise<boolean> {
|
|
||||||
return new Promise(async resolve => {
|
|
||||||
const xhr = new XMLHttpRequest();
|
|
||||||
xhr.open("GET", '/status', true);
|
|
||||||
|
|
||||||
//Send the proper header information along with the request
|
|
||||||
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
|
|
||||||
|
|
||||||
xhr.onreadystatechange = () => { // Call a function when the state changes.
|
|
||||||
if (xhr.readyState === XMLHttpRequest.DONE && xhr.status === 200) {
|
|
||||||
resolve(true);
|
|
||||||
} else if (xhr.readyState == XMLHttpRequest.DONE) {
|
|
||||||
resolve(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
await xhr.send();
|
|
||||||
} catch (e) {
|
|
||||||
resolve(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
private onError(event) {
|
|
||||||
console.error("[WS] Error", event);
|
|
||||||
/*let connectionElement = document.getElementById("right");
|
|
||||||
if (connectionElement)
|
|
||||||
connectionElement.innerText = "Fehler";*/
|
|
||||||
//openModal("Einen Augenblick...", `Es wurde ein kritischer Fehler festgestellt.\nBitte warten Sie, während der Prozess neu gestartet wird...` );
|
|
||||||
//window.location.reload();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return Promise<WebSocketPayload>
|
* @return Promise<WebSocketPayload>
|
||||||
* @param type
|
* @param type
|
||||||
@ -248,5 +77,173 @@ export class WebWebSocketHandler {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static checkConnection(): Promise<boolean> {
|
||||||
|
return new Promise(async resolve => {
|
||||||
|
const xhr = new XMLHttpRequest();
|
||||||
|
xhr.open("GET", '/status', true);
|
||||||
|
|
||||||
|
//Send the proper header information along with the request
|
||||||
|
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
|
||||||
|
|
||||||
|
xhr.onreadystatechange = () => { // Call a function when the state changes.
|
||||||
|
if (xhr.readyState === XMLHttpRequest.DONE && xhr.status === 200) {
|
||||||
|
resolve(true);
|
||||||
|
} else if (xhr.readyState == XMLHttpRequest.DONE) {
|
||||||
|
resolve(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
await xhr.send();
|
||||||
|
} catch (e) {
|
||||||
|
resolve(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
private onMessage(msgEvent: MessageEvent) {
|
||||||
|
let payload = WebSocketPayload.parseFromBase64Json(msgEvent.data);
|
||||||
|
if (!payload) {
|
||||||
|
console.log("[WS] Could not parse message: ", msgEvent);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
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: {
|
||||||
|
Setup.onConfigUpdate(payload);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case WebSocketEvent.DRINKS: {
|
||||||
|
WebHandler.onDrinkUpdate(payload);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case WebSocketEvent.ERROR: {
|
||||||
|
let modal = new Modal("error", "Aww crap!");
|
||||||
|
let txt = document.createElement("p");
|
||||||
|
txt.innerHTML = payload.data;
|
||||||
|
modal.addContent(txt);
|
||||||
|
modal.addContent(document.createElement("br"));
|
||||||
|
modal.addButton(ButtonType.PRIMARY, "Schließen", () => modal.close());
|
||||||
|
modal.open();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Incoming WebSocketStatus
|
||||||
|
case WebSocketEvent.STATUS: {
|
||||||
|
let statusElement = document.getElementById("status");
|
||||||
|
if (statusElement)
|
||||||
|
statusElement.innerText = payload.data.status;
|
||||||
|
|
||||||
|
let status: iTenderStatus = payload.data.status;
|
||||||
|
|
||||||
|
switch (status) {
|
||||||
|
case iTenderStatus.READY: {
|
||||||
|
Modal.close("start");
|
||||||
|
Modal.close("setup");
|
||||||
|
Modal.close("fill");
|
||||||
|
Modal.close("download");
|
||||||
|
if (WebHandler.currentPane != Pane.MENU)
|
||||||
|
WebHandler.openPane(Pane.MAIN);
|
||||||
|
(document.getElementById("menuBtn") as HTMLButtonElement).disabled = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case iTenderStatus.STARTING: {
|
||||||
|
let modal = new Modal("start", "Willkommen!");
|
||||||
|
let txt = document.createElement("p");
|
||||||
|
txt.innerHTML = `Einen Augenblick bitte<br>iTender startet...`;
|
||||||
|
modal.addContent(txt);
|
||||||
|
modal.loader = true;
|
||||||
|
modal.open();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case iTenderStatus.DOWNLOADING: {
|
||||||
|
let modal = new Modal("download", "Aktualisieren");
|
||||||
|
let txt = document.createElement("p");
|
||||||
|
txt.innerHTML = `Einen Augenblick bitte<br>iTender synchronisiert die Datenbank mit der Cloud...`;
|
||||||
|
modal.addContent(txt);
|
||||||
|
modal.loader = true;
|
||||||
|
modal.open();
|
||||||
|
setTimeout(() => {
|
||||||
|
if (txt) {
|
||||||
|
txt.innerHTML = txt.innerHTML + "<br><br>Der Vorgang dauert länger als gewöhnlich.<br>Überprüfe deine Internetverbindung!"
|
||||||
|
}
|
||||||
|
}, 1000 * 15)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case iTenderStatus.SETUP: {
|
||||||
|
Modal.close("start");
|
||||||
|
Setup.openSetup();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case iTenderStatus.FILLING: {
|
||||||
|
Fill.onFillEvent(payload);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: {
|
||||||
|
console.log("Unknown to handle " + status);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private onOpen(event) {
|
||||||
|
console.log("[WS] Connected", event);
|
||||||
|
|
||||||
|
const blockPanel = document.getElementById("blockPanel") as HTMLDivElement;
|
||||||
|
blockPanel.classList.add("opacityOutDisplayNone");
|
||||||
|
}
|
||||||
|
|
||||||
|
private onClose(event) {
|
||||||
|
console.error("[WS] Closed!", event);
|
||||||
|
if (event.wasClean) {
|
||||||
|
let modal = new Modal("socketClosed", "Sitzung beendet!");
|
||||||
|
let txt = document.createElement("p");
|
||||||
|
txt.innerHTML = `Diese Sitzung wurde beendet, da der iTender nun an einem anderen Gerät bzw. an dem Hauptgerät gesteuert wird.<br><br>`;
|
||||||
|
modal.addContent(txt);
|
||||||
|
modal.addButton(ButtonType.PRIMARY, "Sitzung wiederherstellen", () => {
|
||||||
|
window.location.reload();
|
||||||
|
});
|
||||||
|
modal.open();
|
||||||
|
} else {
|
||||||
|
let modal = new Modal("socketClosed", "Verbindungsproblem!");
|
||||||
|
let txt = document.createElement("p");
|
||||||
|
txt.innerHTML = `Die Benutzeroberfläche hat die Verbindung mit dem Gerät verloren.<br>Die Verbindung wird wiederhergestellt...<br>`;
|
||||||
|
modal.addContent(txt);
|
||||||
|
modal.loader = true;
|
||||||
|
modal.open();
|
||||||
|
setInterval(async () => {
|
||||||
|
if ((await WebWebSocketHandler.checkConnection()))
|
||||||
|
window.location.reload();
|
||||||
|
}, 2000);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* let connectionElement = document.getElementById("right");
|
||||||
|
if (connectionElement) {
|
||||||
|
connectionElement.innerText = "Getrennt";
|
||||||
|
connectionElement.style.color = "red";
|
||||||
|
}*/
|
||||||
|
}
|
||||||
|
|
||||||
|
private onError(event) {
|
||||||
|
console.error("[WS] Error", event);
|
||||||
|
/*let connectionElement = document.getElementById("right");
|
||||||
|
if (connectionElement)
|
||||||
|
connectionElement.innerText = "Fehler";*/
|
||||||
|
//openModal("Einen Augenblick...", `Es wurde ein kritischer Fehler festgestellt.\nBitte warten Sie, während der Prozess neu gestartet wird...` );
|
||||||
|
//window.location.reload();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
@ -3,9 +3,9 @@ cd /home/itender/itender || exit -1
|
|||||||
git pull "https://tobiash:!IwedwrimmVeudiweN!@git.gaminggeneration.de/tobiash/itender.git" --quiet
|
git pull "https://tobiash:!IwedwrimmVeudiweN!@git.gaminggeneration.de/tobiash/itender.git" --quiet
|
||||||
yarn
|
yarn
|
||||||
yarn run compile
|
yarn run compile
|
||||||
sudo systemctl stop itender
|
|
||||||
cd ./arduino/itender/
|
cd ./arduino/itender/
|
||||||
arduino-cli compile --fqbn arduino:avr:mega itender.ino || true
|
arduino-cli compile --fqbn arduino:avr:mega itender.ino || true
|
||||||
|
sudo systemctl stop itender
|
||||||
arduino-cli upload --port /dev/ACM0 --fqbn arduino:avr:mega itender.ino || true
|
arduino-cli upload --port /dev/ACM0 --fqbn arduino:avr:mega itender.ino || true
|
||||||
sudo systemctl start itender
|
sudo systemctl start itender
|
||||||
exit 0
|
exit 0
|
@ -54,8 +54,8 @@ block menu
|
|||||||
|
|
||||||
block settings
|
block settings
|
||||||
// Settings
|
// Settings
|
||||||
button.btn.btn-primary#settings_refreshDrinks Getränke aktualisieren
|
button.btn.btn-primary#settings_refreshDrinks Datenbank aktualisieren
|
||||||
button.btn.btn-primary#settings_deleteDrinks(disabled="disabled") Getränke-DB löschen
|
button.btn.btn-primary#settings_deleteDrinks Datenbank leeren
|
||||||
button.btn.btn-primary#settings_reload Oberfläche neu starten
|
button.btn.btn-primary#settings_reload Oberfläche neu starten
|
||||||
button.btn.btn-primary#settings_getInfo Systeminformationen
|
button.btn.btn-primary#settings_getInfo Systeminformationen
|
||||||
button.btn.btn-primary#settings_update System aktualisieren
|
button.btn.btn-primary#settings_update System aktualisieren
|
||||||
|
Loading…
x
Reference in New Issue
Block a user