-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathOutlets.js
114 lines (91 loc) · 2.01 KB
/
Outlets.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
'use strict';
var EventEmitter = require('events').EventEmitter;
var Gpio = require('onoff').Gpio;
var sleep = require('sleep');
var emitter = new EventEmitter();
var transmitter = new Gpio(22, 'out');
var states = [];
var dependencies = {};
var parents = {};
function sendBitPart(part, duration) {
transmitter.writeSync(part);
sleep.usleep(200 * duration);
}
function sendBit(bit) {
bit = bit ? 1 : 0;
switch (bit) {
case 0:
sendBitPart(1, 1);
sendBitPart(0, 3);
sendBitPart(1, 3);
sendBitPart(0, 1);
break;
case 1:
sendBitPart(1, 1);
sendBitPart(0, 3);
sendBitPart(1, 1);
sendBitPart(0, 3);
break;
}
}
function sendValue(value, bitLength) {
for (var i = bitLength-1; i >= 0; i--) {
sendBit((value >> i) & 1);
}
}
function sendSync() {
sendBitPart(1, 1);
sendBitPart(0, 20);
}
function toggle(number, state) {
state = !!state;
if (getState(number) === state) {
return;
}
states[number] = state;
var parent = dependencies[number];
if (state && parent && !getState(parent)) {
toggle(parent, true);
sleep.sleep(1);
}
for (var i = 0; i < 6; i++) {
sendValue(0x19, 5);
sendValue(number, 5);
sendBit(state);
sendBit(!state);
sendSync();
}
if (!state && parent) {
var siblingsOff = parents[parent].every(function (sibling) {
return !getState(sibling);
});
if (siblingsOff) {
sleep.msleep(200);
toggle(parent, false);
}
}
emitter.emit('stateChanged', number, state);
}
function getState(number) {
return states[number] || false;
}
function setDependencies(d) {
dependencies = d;
for (var number in dependencies) {
var parent = dependencies[number];
parents[parent] = parents[parent] || [];
parents[parent].push(number);
}
}
function exit() {
transmitter.unexport();
}
module.exports = {
toggle: toggle,
getState: getState,
setDependencies: setDependencies,
on: function (name, cb) {
emitter.on(name, cb);
},
exit: exit
};