grunig-nodes
Version:
Grünig Nodes Library
217 lines (199 loc) • 9.7 kB
JavaScript
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);
};