-
Notifications
You must be signed in to change notification settings - Fork 4
/
sacn-config.js
98 lines (86 loc) · 3.61 KB
/
sacn-config.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
const e131 = require('e131')
module.exports = function (RED) {
function sACNConfigNode(n) {
RED.nodes.createNode(this, n);
var node = this
node.hostOrUniverse = n.hostOrUniverse;
node.port = n.port;
node.flowContext = node.context().global
var hostOrUniverseHex =
Number.isInteger(Number(node.hostOrUniverse))
? Number(node.hostOrUniverse)
: node.hostOrUniverse
node.client = new e131.Client(hostOrUniverseHex, node.port)
node.packet = node.flowContext.get("packet") || []
node.getUniverse = function (universe) {
if (!node.packet[universe]) {
node.packet[universe] = node.client.createPacket(512)
node.packet[universe].setUniverse(universe)
}
return node.packet[universe].getSlotsData()
}
node.getChannel = function (universe, channel) {
return node.getUniverse(universe)[channel - 1]
}
node.setChannel = function (universe, channel, value) {
var slotsData = node.getUniverse(universe)
slotsData[channel - 1] = value
node.packet[universe].setSlotsData(slotsData)
}
node.setChannels = function (universe, values) {
var slotsData = node.getUniverse(universe)
for (i = 0; i < values.length; i++) {
slotsData[i] = values[i]
}
node.packet[universe].setSlotsData(slotsData)
}
node.sendPacket = function (universe) {
node.client.send(node.packet[universe])
}
node.transition = function (universe, channel, currentValue, targetValue, delay) {
if (currentValue >= 0
&& currentValue <= 255
&& targetValue >= 0
&& targetValue <= 255
&& currentValue != targetValue
) {
var newValue = currentValue < targetValue
? currentValue + 1
: currentValue - 1
node.setChannel(universe, channel, newValue)
node.sendPacket(universe)
setTimeout(function () { node.transition(universe, channel, newValue, targetValue, delay) }, delay)
}
}
node.set = function (universe, channel, value, transition) {
if (transition[0] == "rate" || transition[0] == "time") {
var oldValue = node.getChannel(universe, channel)
if (oldValue == value) { return; }
if (transition[0] == "rate") {
node.transition(universe, channel, oldValue, value, transition[1])
} else {
var steps = oldValue < value
? value - oldValue
: oldValue - value
var delay = Math.round(transition[1] / steps)
node.transition(universe, channel, oldValue, value, delay)
}
} else {
node.setChannel(parseInt(universe), parseInt(channel), parseInt(value))
node.sendPacket(parseInt(universe))
}
}
node.setArray = function (universe, values) {
node.setChannels(parseInt(universe), values)
node.sendPacket(parseInt(universe))
}
node.savePacketToContext = function () {
node.flowContext.set("packet", node.packet)
}
node.on("close", function () {
node.savePacketToContext()
node.client = null
})
}
RED.nodes.registerType("sacn-config", sACNConfigNode);
}