UNPKG

grunig-nodes

Version:

Grünig Nodes Library

217 lines (199 loc) 9.7 kB
module.exports = function(RED) { function MagazinePosition(config) { RED.nodes.createNode(this, config); var node = this; node.dirty = true; var lastValue; node.magWasLocked = false; node.valueNotSet = true; var messageQueue = []; // Warteschlange für Nachrichten var timeoutActive = false; // Status des Timeout-Intervalls // Nachrichtenverarbeitungsfunktion node.on('input', function(msg) { // Nachricht in die Warteschlange einreihen messageQueue.push(msg); // Wenn kein Timeout aktiv ist, senden Sie die Nachricht if (!timeoutActive) { sendNextMessage(); } }); // Funktion zum Senden der nächsten Nachricht in der Warteschlange function sendNextMessage() { // Wenn keine Nachrichten in der Warteschlange sind, beende die Funktion if (messageQueue.length === 0) { return; } // Nachricht aus der Warteschlange holen var msg = messageQueue.shift(); var machineNameSVG = msg.payload.MachineNameSVG; var mag1Pos = msg.payload.Mag1Pos; var mag2Pos = msg.payload.Mag2Pos; var mag1Locked = msg.payload.Mag1Locked; var mag2Locked = msg.payload.Mag2Locked; var mag1PosInverted = msg.payload.Mag1PosInverted; var mag2PosInverted = msg.payload.Mag2PosInverted; var posTextOnly = config.posTextOnly; var magSelect = config.magSelect; var magType = parseInt(config.magType); var invertDirection = config.invertDirection; var magLoadingPos = parseInt(config.magLoadingPos); var magLoadingTime = parseInt(config.magLoadingTime); var magMoveTime = parseInt(config.magMoveTime); var magFormat = config.magFormat; var forceIncrementValue = config.forceIncrementValue; var incrementValue = parseInt(config.incrementValue); var invertedIncrementValue = parseInt(config.invertedIncrementValue); var value = 0; var magLocked; if (magSelect === "Mag2") { dataMsg = { payload: [ { "command": "update_text", selector: machineNameSVG + "_Mag2PosValue", textContent: mag2Pos }], topic: "Mag2PosText" }; } else if (magSelect === "Mag1") { dataMsg = { payload: [ { "command": "update_text", selector: machineNameSVG + "_Mag1PosValue", textContent: mag1Pos }], topic: "Mag1PosText" }; } node.send(dataMsg); if (posTextOnly === false) { // Auswertung der Magazinauswahl if (magSelect === "Mag1") { value = mag1Pos; magLocked = mag1Locked; invertDirection = mag1PosInverted; } else { value = mag2Pos; magLocked = mag2Locked; invertDirection = mag2PosInverted; } var fromValue, toValue; /*(Einstellungen)***************************/ // Incrementwert generieren var increment, invertincrement; if (forceIncrementValue === true) { increment = incrementValue; // Der Inkrementwert invertincrement = invertedIncrementValue; // Der invertierte Inkrementwert } else { increment = 1.42; invertincrement = 1.42; } var magSize = magType + 1; var invertLockValue = magSize - 2 * magLoadingPos; /*******************************************/ var duration = magLoadingTime; var attributeValueFrom, attributeValueTo; if (magFormat !== "width" && magFormat !== "height") { node.warn("Kein gültiges Format: " + magFormat); } if (invertDirection === true) { var invertValue = magSize - value; var invertLastValue = magSize - lastValue; if (magLocked === "visible") { fromValue = invertLastValue * invertincrement - invertincrement; toValue = magLoadingPos * invertincrement - invertincrement; // Aktualisieren der letzten Wertvariable lastValue = magLoadingPos + invertLockValue; duration = magLoadingTime; node.magWasLocked = true; } else { // Aktualisieren der letzten Wertvariable lastValue = value; if (node.magWasLocked === true) { if (node.valueNotSet === true) { fromValue = invertLastValue * increment - increment; toValue = invertValue * increment - increment; node.valueNotSet = false; } duration = magLoadingTime; setTimeout(() => { node.magWasLocked = false; }, magLoadingTime * 1000) } else { duration = magMoveTime; fromValue = invertLastValue * increment - increment; toValue = invertValue * increment - increment; node.valueNotSet = true; } } } else { var usedValue = value; var usedLastValue = lastValue; if (magLocked === "visible") { fromValue = usedLastValue * increment - increment; toValue = magLoadingPos * increment - increment; // Aktualisieren der letzten Wertvariable lastValue = magLoadingPos; duration = magLoadingTime; node.magWasLocked = true; } else { // Aktualisieren der letzten Wertvariable lastValue = value; if (node.magWasLocked === true) { if (node.valueNotSet === true) { fromValue = usedLastValue * increment - increment; toValue = usedValue * increment - increment; node.valueNotSet = false; } duration = magLoadingPos; setTimeout(() => { node.magWasLocked = false; }, magLoadingPos * 1000) } else { duration = magMoveTime; fromValue = usedLastValue * increment - increment; toValue = usedValue * increment - increment; node.valueNotSet = true; } } } if (magFormat === "width") { attributeValueFrom = `${fromValue},0`; attributeValueTo = `${toValue},0`; } else if (magFormat === "height") { attributeValueFrom = `0,${fromValue}`; attributeValueTo = `0,${toValue}`; } dataMsg = { payload: { "command": "animation", "selector": machineNameSVG + "_" + magSelect + "ScreenMove", "attributeValueFrom": attributeValueFrom, "attributeValueTo": attributeValueTo, "duration": duration }, topic: "MagazinePosition" }; node.send(dataMsg); timeoutActive = true; if (magLocked === "visible" || node.magWasLocked === true) { setTimeout(() => { // Timeout abgelaufen, Timeout-Status auf false setzen und nächste Nachricht senden timeoutActive = false; sendNextMessage(); }, magLoadingTime * 1000); } else { setTimeout(() => { // Timeout abgelaufen, Timeout-Status auf false setzen und nächste Nachricht senden timeoutActive = false; sendNextMessage(); }, magMoveTime * 1000); } } } } // Node-Typ registrieren RED.nodes.registerType("Magazine-Position", MagazinePosition); };