const util = require("util") , EventEmitter = require("events").EventEmitter; //const slotToPoint = s => ({xi:s.xi, yi:s.yi, xf:s.x, yf:s.y}); const slotToPoint = s => ({ i:{x:s.xi, y:s.yi}, f:{x:s.x, y:s.y}, m:{x:(s.xi+s.x)/2, y:(s.yi+s.y)/2} }); function Motion(device, longTime) { this.device = device; this.slotsActive = 0; this.slots = []; this.points = []; this.longed = false; this.longTime = longTime || 600; device.on("EV_ABS", e => this.doABS(e)); device.on("EV_SYN", e => this.doSYN(e)); device.on("error", e => this.emit("error", "Device Error: "+e)); this.addSlot(); } util.inherits(Motion, EventEmitter); Motion.prototype.addSlot = function() { this.slots.push({id: -1, xi: -1, yi: -1, x: 0, y: 0}); }; Motion.prototype.emitLong = function() { this.slots.forEach(s => { if (s.id >= 0) this.points.push(slotToPoint(s)); }); this.emit("long", this.points); this.points = []; this.longed = true; }; Motion.prototype.doABS = function(e) { switch (e.code) { case "ABS_MT_SLOT": for (let i=this.slots.length-1; i= 0) { this.currentSlot.id = e.value; if (this.slotsActive++ === 0) { this.longTimeout = setTimeout(() => this.emitLong(), this.longTime); } } else { if (!this.longed && this.currentSlot.xi >= 0) this.points.push(slotToPoint(this.currentSlot)); this.currentSlot.id = -1; this.currentSlot.xi = -1; this.currentSlot.yi = -1; this.currentSlot.x = 0; this.currentSlot.y = 0; if (--this.slotsActive === 0) { clearTimeout(this.longTimeout); } } break; case "ABS_MT_POSITION_X": if (this.currentSlot === undefined) return; if (this.currentSlot.id < 0) return; if (this.currentSlot.xi < 0) this.currentSlot.xi = e.value; this.currentSlot.x = e.value; break; case "ABS_MT_POSITION_Y": if (this.currentSlot === undefined) return; if (this.currentSlot.id < 0) return; if (this.currentSlot.yi < 0) this.currentSlot.yi = e.value; this.currentSlot.y = e.value; break; //default: // console.log(e.code, e.value); }}; Motion.prototype.doSYN = function(e) { if (e.code === "SYN_REPORT") { //console.log("SYN", this.slotsActive, this.points.length); if (this.slotsActive <= 0) { this.slotsActive = 0; if (this.longed) { this.longed = false; } else if (this.points.length > 0) { this.emit("short", this.points); this.points = []; } } } }; module.exports = Motion;