-
Notifications
You must be signed in to change notification settings - Fork 1
/
wand.js
99 lines (91 loc) · 2.74 KB
/
wand.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
const fs = require('fs');
const readline = require('readline');
const util = require('util');
var spawn = require('child_process').spawn;
var irdata = spawn('/usr/bin/ir-ctl', ['-r']);
console.log("Started");
var ir_counter = 0;
var ir_current_nibble = '';
var ir_total_counter = 0;
var ir_current_reading = '';
var ir_last_space_time = 0;
var ir_last_duty_cycle = 0;
const ir_duration_cutoff = 0.3481;
irdata.stdout.on('data', function(data) {
var str = data.toString();
var lines = str.split(/\n/g);
for (var i=0; i < lines.length; i++) {
handleLine(lines[i]);
}
});
function handleLine(line) {
var m;
if (m = line.match(/(pulse|space|timeout) (\d+)/)) {
var what = m[1];
var timing = parseInt(m[2]);
//console.log('What: ' + what + ' -> ' + timing);
switch(what) {
case 'pulse':
ir_counter++;
ir_total_counter++;
if (ir_last_space_time > 0) {
var duty_cycle = ir_last_duty_cycle = ir_last_space_time + timing;
var duration = timing/duty_cycle;
if (duration < ir_duration_cutoff) {
ir_current_nibble += 0;
} else {
ir_current_nibble += 1;
}
} else {
// First pulse in the reading, so assume 0
ir_current_nibble += 0;
}
//console.log(ir_counter + ' ' + ir_total_counter + ' ' + ir_current_nibble + ' ' + timing + ' ' + duty_cycle);
break;
case 'space':
ir_last_space_time = timing
break;
case 'timeout':
if ((ir_total_counter > 0) && (ir_total_counter < 56)) {
console.log("Reading was short: " + ir_total_counter + " bits");
} else if (ir_total_counter > 56) {
console.log("Reading was too long: " + ir_total_counter + " bits");
}
ir_counter = ir_total_counter = 0;
ir_current_nibble = ir_current_reading = '';
break;
}
if (ir_counter == 4) {
nibble = parseInt(ir_current_nibble, 2).toString(16);
ir_current_reading += nibble;
ir_current_nibble = '';
ir_counter = 0;
}
if (ir_total_counter == 56) {
var result = ir_current_reading;
ir_current_reading = '';
ir_total_counter = 0;
handleResult(result);
}
}
}
function handleResult(reading) {
console.log('Raw reading: ' + reading);
if (m = reading.match(/(..)(......)(......)/)) {
var zeroes = m[1];
var id = m[2];
var motion = m[3];
if (zeroes != '00') {
console.log('Reading did not start with 00');
return;
}
console.log('ID: ' + id);
return id;
}
}
irdata.stderr.on('data', function(data) {
console.log('stderr: ' + data.toString());
});
irdata.on('exit', function (code) {
console.log('child process exited with code ' + code);
});