-
Notifications
You must be signed in to change notification settings - Fork 0
/
buttoninterpreter.js
114 lines (91 loc) · 3.37 KB
/
buttoninterpreter.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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
module.exports = function(RED) {
function ButtonInterpreterNode(config) {
RED.nodes.createNode(this,config);
this.buttonsettings = this.server = RED.nodes.getNode(config.buttonsettings);
var last_msg_timestamp = 0;
var theButtons = {};
function getButtonInfo( button ) {
if( !theButtons.hasOwnProperty(button)) {
theButtons[button] =
{
timer_id: 0,
click_count: 0,
name: button
};
}
return theButtons[button];
}
var timer_ms = this.buttonsettings.timeout;
function processAction( button, action ) {
var theBtnInfo = getButtonInfo(button);
if( theBtnInfo.timer_id ) {
clearTimeout(theBtnInfo.timer_id);
theBtnInfo.timer_id = 0;
}
if (action === "click" ) {
theBtnInfo.click_count++;
theBtnInfo.timer_id = setTimeout( function() {
var n = {
payload: theBtnInfo.name,
action: "click",
clickcount: theBtnInfo.click_count
};
node.send(n);
theBtnInfo.timer_id = 0;
theBtnInfo.click_count = 0;
}, timer_ms);
}
else if( action === "hold" ) {
var now = Date.now();
last_msg_timestamp = now;
var n = {
payload: theBtnInfo.name,
action: "hold_start",
};
node.send(n);
}
else if( action === "release") {
var now = Date.now();
var delta = now - last_msg_timestamp;
var n = {
payload: theBtnInfo.name,
action: "hold_end",
delta: delta
};
node.send(n);
}
}
var node = this;
node.on('input', function(msg, send, done) {
// For maximum backwards compatibility, check that send exists.
// If this node is installed in Node-RED 0.x, it will need to
// fallback to using `node.send`
send = send || function() { node.send.apply(node,arguments) }
if( msg.payload ) {
var underscore = msg.payload.lastIndexOf("_");
if( underscore < 0 ) {
processAction("toggle", "click");
}
else {
var btnName = msg.payload.substr(0, underscore);
var btnAction = msg.payload.substr(underscore+1);
processAction(btnName, btnAction);
}
}
if (done) {
done();
}
});
node.on('close', function(removed, done) {
for( const theBtnInfo in theButtons) {
if( theBtnInfo.timer_id ) {
clearTimeout(theBtnInfo.timer_id);
}
}
if( done) {
done();
}
});
}
RED.nodes.registerType("buttoninterpreter",ButtonInterpreterNode);
}