-
Notifications
You must be signed in to change notification settings - Fork 2
/
analyse.js
94 lines (80 loc) · 7.97 KB
/
analyse.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
var fs = require('fs'),
crc = require('crc-32'),
crypto = require('crypto'),
_ = require('underscore'),
error = "error";
var testVector = ["364", "952", "364", "948", "348", "968", "1008", "296", "364", "948", "1024", "312", "368", "944", "1024", "296", "348", "968", "1004", "312", "352", "968", "1008", "308", "364", "948", "1032", "292", "352", "968", "1008", "308", "364", "948", "352", "952", "364", "968", "1008", "308", "368", "944", "352", "972", "344", "968", "1008", "308", "352", "10144", "356", "948", "364", "952", "364", "948", "1024", "296", "372", "952", "1024", "288", "372", "948", "1024", "312", "344", "952", "1024", "308", "352", "952", "1040", "292", "364", "948", "1024", "296", "364", "952", "1024", "308", "368", "944", "352", "972", "344", "968", "1028", "288", "368", "952", "364", "952", "360", "952", "1024", "308", "352", "10144", "364", "952", "364", "948", "372", "948", "1028", "308", "344", "952", "1024", "308", "352", "968", "1024", "292", "364", "948", "1028", "296", "360", "972", "1024", "288", "372", "944", "1024", "296", "364", "948", "1044", "288", "372", "948", "364", "952", "380", "948", "1024", "292", "352", "968", "364", "948", "364", "952", "1024", "296", "364", "10164", "344", "968", "352", "964", "352", "968", "1008", "308", "364", "952", "1024", "296", "372", "948", "1024", "312", "352", "960", "1016", "296", "364", "968", "1024", "292", "368", "952", "1024", "308", "364", "948", "1024", "300", "360", "952", "364", "968", "348", "968", "1024", "296", "364", "952", "360", "972", "352", "948", "1024", "312", "360", "10164", "348", "948", "372", "948", "364", "968", "1024", "292", "368", "952", "1024", "308", "348", "968", "1024", "292", "368", "952", "1024", "308", "364", "948", "1024", "300", "360", "952", "1040", "292", "368", "948", "1024", "312", "364", "952", "364", "948", "372", "948", "1024", "312", "360", "952", "368", "948", "368", "952", "1028", "292", "364", "10180", "352", "952", "364", "948", "364", "972", "1024", "288", "372", "948", "1024", "312", "344", "968", "1032", "296", "364", "968", "1008", "308", "352", "968", "1028", "288", "364", "952", "1040", "292", "368", "952", "1024", "308", "364", "948", "352", "972", "360", "952", "1024", "308", "372", "944", "368", "972", "344", "968", "1024", "292", "368", "10164", "364", "948", "364", "972", "352", "960", "1024", "300", "360", "952", "1024", "308", "352", "972", "1024", "308", "344", "972", "1004", "308", "372", "948", "1024", "312", "364", "948", "1024", "316", "344", "972", "1024", "308", "352", "968", "352", "972", "344", "972", "1024", "288", "372", "948", "364", "968", "348", "968", "1024", "296", "364", "10184", "344", "968", "380", "944", "352", "968", "1024", "288", "364", "972", "1024", "296", "364", "948", "1024", "308", "372", "944", "1024", "316", "352", "968", "1024", "292", "368", "952", "1024", "308", "364", "952", "1024", "312", "348", "968", "364", "968", "348", "968", "1024", "296", "364", "952", "364", "968", "352", "968", "1024", "292", "364", "10180"];
testVector = ["304", "1008", "292", "1008", "296", "1008", "948", "372", "272", "1008", "952", "368", "280", "1004", "956", "364", "276", "1024", "936", "364", "284", "1024", "936", "364", "292", "1008", "280", "1028", "292", "1004", "936", "368", "292", "1004", "936", "372", "292", "1008", "936", "364", "292", "1008", "300", "1004", "292", "1008", "952", "368", "280", "10100", "316", "1008", "292", "1008", "292", "1008", "952", "364", "280", "1008", "952", "348", "292", "1024", "936", "352", "296", "1004", "956", "364", "292", "1008", "936", "368", "296", "1004", "292", "1008", "292", "1008", "936", "372", "292", "1004", "936", "364", "300", "1008", "948", "352", "292", "1008", "292", "1004", "300", "1008", "952", "364", "276", "10124", "296", "1004", "300", "1008", "292", "1004", "956", "364", "276", "1004", "956", "352", "292", "1008", "952", "364", "284", "1024", "928", "372", "292", "1008", "936", "364", "300", "1004", "296", "1004", "292", "1008", "952", "348", "300", "1004", "956", "344", "292", "1008", "952", "372", "276", "1008", "292", "1004", "312", "1008", "932", "372", "292", "10108", "292", "1028", "272", "1008", "300", "1004", "956", "364", "292", "1008", "936", "364", "300", "1004", "936", "364", "296", "1004", "956", "352", "292", "1008", "952", "344", "296", "1024", "280", "1008", "292", "1024", "936", "368", "292", "1004", "936", "372", "292", "1008", "936", "364", "300", "1004", "296", "1004", "292", "1008", "952", "348", "300", "10100", "316", "1008", "292", "1004", "296", "1004", "956", "352", "292", "1008", "952", "364", "276", "1024", "936", "372", "276", "1004", "956", "364", "300", "1000", "936", "368", "296", "1004", "292", "1008", "300", "1004", "956", "344", "296", "1004", "952", "348", "300", "1004", "956", "344", "296", "1024", "300", "1000", "280", "1008", "952", "364", "292", "10108", "292", "1008", "300", "1004", "292", "1008", "952", "368", "280", "1024", "932", "368", "296", "1004", "936", "364", "300", "1008", "936", "364", "292", "1008", "952", "364", "284", "1004", "956", "364", "276", "1024", "936", "372", "272", "1028", "936", "364", "292", "1008", "936", "368", "936", "368", "932", "368", "952", "348", "952", "352", "292", "10108", "312", "1004", "292", "1008", "300", "1004", "956", "364", "292", "1008", "936", "368", "276", "1028", "936", "364", "292", "1008", "952", "352", "292", "1008", "952", "364", "276", "1008", "952", "352", "296", "1024", "936", "364", "280", "1008", "948", "372", "292", "1004", "936", "368", "932", "372", "936", "364", "936", "368", "952", "344", "300", "10108", "312", "1004", "292", "1008", "292", "1008", "952", "352", "292", "1028", "936", "364", "280", "1008", "948", "372", "292", "1004", "936", "364", "300", "1008", "936", "364", "292", "1008", "952", "348", "296", "1008", "952", "348", "292", "1008", "952", "372", "292", "1008", "936", "364", "936", "364", "952", "356", "932", "368", "952", "364", "276"];
var timingToBit = function (timing) {
if (100 < timing && timing < 500) {
return true
} else if (600 < timing && timing < 1500) {
return false
} else if (8000 < timing && timing < 13000) {
return 'break';
}
console.log("ANALYSIS: UNKNOWN TIMING ERROR: " + timing.toString());
return error;
};
var majority = function (ray) {
_.countBy(ray, function (value) {
return value
})
};
var breakup = function (mem, entry) {
if (entry === 'break') {
mem.push([]);
} else {
mem[mem.length - 1].push(entry);
}
return mem;
};
var majorize = function (ray) {
// error correction: take the most likely value
var grouped = _.groupBy(ray);
var maximized = _.max(grouped, function (groupList) {
return groupList.length;
});
if (ray.length > maximized.length && ray.length > 0) {
console.log("ANALYSIS: Error corrected: ", ray, " => ", maximized[0]);
return maximized[0];
}
if (maximized.length === 0) {
console.log("ANALYSIS: Uncorrectable error detected: ", ray.toString());
return error;
}
return maximized[0];
};
var analyseBits = function (data) {
// parse timings into bits and break them into sequences
var values = _.chain(data)
.map(parseFloat)
//.tap(console.log)
.map(timingToBit)
.reduce(breakup, [[]])
.value();
// filter out incomplete sequences
var max_length = _.max(values, function (value) {
return value.length
}).length;
values = _.filter(values, function (value) {
return value.length === max_length;
});
// democratic values to the core: error correction by majority
values = _.zip.apply(null, values);
values = _.map(values, majorize);
console.log("ANALYSIS: ", values.length, " Bits");
return values;
};
// TODO: Analyse and store signal quality
exports.analyse = function (data) {
data.bits = analyseBits(data.timings);
data.errors = _.contains(data.bits, error);
data.crc = crc.str(data.bits.join());
data.received = new Date();
data.sha1 = crypto.createHash('sha1').update(data.bits.toString()).digest('hex');
data.identity = data.sha1;
data.name = null;
console.log("ANALYSIS: ", data.identity);
return data;
};