/
Hover.js
120 lines (96 loc) · 2.34 KB
/
Hover.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
115
116
117
118
119
120
var Gpio = require('onoff').Gpio;
var i2c = require('i2c-bus');
var i2cAddress = null,
i2cBus = 0,
pinTs = null,
pinReset = null,
bus = null,
defaultRate = 10,
buffer = new Buffer(18);
const hoverGestureEvents = {
'2': 'swipe-right',
'4': 'swipe-left',
'8': 'swipe-up',
'16': 'swipe-down'
};
var hoverTapEvents = {
'1': 'tap-south',
'2': 'tap-west',
'4': 'tap-north',
'8': 'tap-east',
'16': 'tap-center'
};
function Hover(address, tsPin, resetPin, i2cBusToUse) {
this.debug = false;
i2cAddress = address;
i2cBus = i2cBusToUse;
pinTs = new Gpio(tsPin, 'in');
pinReset = new Gpio(resetPin, 'out');
}
Hover.prototype.init = function(handlerCallback) {
var vm = this;
return new Promise(function(resolve, reject) {
bus = i2c.open(1, {}, function(err) {
if(err) {
if(vm.debug) {
console.error(err);
}
reject(err);
}else{
setTimeout(function() {
pinReset.write(true);
pinReset.setDirection('in');
setTimeout(function() {
if(this.debug) {
console.log('Hover ready');
}
resolve();
}, 500);
}, 500);
}
});
});
};
Hover.prototype.listen = function(callback, rate) {
var vm = this;
if(!rate) {
rate = defaultRate;
}
setInterval(function() {
pinTs.read(function(err, value) {
if(value === 0) {
pinTs.setDirection('out');
pinTs.setActiveLow(false);
try {
bus.readI2cBlockSync(i2cAddress, 0, 18, buffer);
var guestureEvent = buffer[10];
var touchEvent = (((buffer[14] & 0b11100000) >> 5) | ((buffer[15] & 0b00000011) << 3));
if(guestureEvent) {
var eventValue = (1 << (buffer[10] - 1)).toString();
if(hoverGestureEvents[eventValue] !== undefined) {
if(vm.debug) {
console.log(hoverGestureEvents[eventValue]);
}
callback(hoverGestureEvents[eventValue]);
}
}
if(touchEvent) {
var eventValue = touchEvent.toString();
if(hoverTapEvents[eventValue] !== undefined) {
if(vm.debug) {
console.log(hoverTapEvents[eventValue]);
}
callback(hoverTapEvents[eventValue]);
}
}
} catch(e){
console.error(e);
console.error('Continuing to listen anyway');
}
pinTs.writeSync(1);
pinTs.setDirection('in');
}
});
}, rate);
};
module.exports = Hover;