BangleApps/apps/widhid/wid.js

139 lines
4.2 KiB
JavaScript

(function () {
var settings = require("Storage").readJSON("setting.json", true) || { HID: false };
if (settings.HID !== "kbmedia") {
console.log("widhid: can't enable, HID setting isn't \"kbmedia\"");
return;
}
delete settings;
var anchor = { x: 0, y: 0 };
var start = { x: 0, y: 0 };
var dragging = false;
var activeTimeout;
var waitForRelease = true;
var onSwipe = (function (_lr, ud) {
if (ud > 0 && !activeTimeout && !Bangle.CLKINFO_FOCUS) {
listen();
Bangle.buzz(20);
}
});
var onDrag = (function (e) {
E.stopEventPropagation && E.stopEventPropagation();
if (e.b === 0) {
var wasDragging = dragging;
dragging = false;
if (waitForRelease) {
waitForRelease = false;
return;
}
if (!wasDragging
|| (Math.abs(e.x - anchor.x) < 2 && Math.abs(e.y - anchor.y) < 2)) {
toggle();
onEvent();
return;
}
}
if (waitForRelease)
return;
if (e.b && !dragging) {
dragging = true;
setStart(e);
Object.assign(anchor, start);
return;
}
var dx = e.x - start.x;
var dy = e.y - start.y;
if (Math.abs(dy) > 25 && Math.abs(dx) > 25) {
setStart(e);
return;
}
if (dx > 40) {
next();
onEvent();
waitForRelease = true;
}
else if (dx < -40) {
prev();
onEvent();
waitForRelease = true;
}
else if (dy > 30) {
down();
onEvent();
setStart(e);
}
else if (dy < -30) {
up();
onEvent();
setStart(e);
}
});
var setStart = function (_a) {
var x = _a.x, y = _a.y;
start.x = x;
start.y = y;
};
var onEvent = function () {
Bangle.buzz(20);
listen();
};
var listen = function () {
var wasActive = !!activeTimeout;
if (!wasActive) {
waitForRelease = true;
Bangle.on("drag", onDrag);
var dragHandlers = Bangle["#ondrag"];
if (dragHandlers && typeof dragHandlers !== "function") {
Bangle["#ondrag"] = [onDrag].concat(dragHandlers.filter(function (f) { return f !== onDrag; }));
}
redraw();
}
if (activeTimeout)
clearTimeout(activeTimeout);
activeTimeout = setTimeout(function () {
activeTimeout = undefined;
Bangle.removeListener("drag", onDrag);
redraw();
}, 3000);
};
var redraw = function () { return setTimeout(Bangle.drawWidgets, 50); };
var connected = NRF.getSecurityStatus().connected;
WIDGETS["hid"] = {
area: "tr",
sortorder: -20,
draw: function () {
if (this.width === 0)
return;
g.drawImage(activeTimeout
? require("heatshrink").decompress(atob("jEYxH+AEfH44XXAAYXXDKIXZDYp3pC/6KHUMwWHC/4XvUy4YGdqoA/AFoA=="))
: require("heatshrink").decompress(atob("jEYxH+AEcdjoXXAAYXXDKIXZDYp3pC/6KHUMwWHC/4XvUy4YGdqoA/AFoA==")), this.x + 2, this.y + 2);
},
width: connected ? 24 : 0,
};
if (connected)
Bangle.on("swipe", onSwipe);
delete connected;
NRF.on("connect", function () {
WIDGETS["hid"].width = 24;
Bangle.on("swipe", onSwipe);
redraw();
});
NRF.on("disconnect", function () {
WIDGETS["hid"].width = 0;
Bangle.removeListener("swipe", onSwipe);
redraw();
});
var sendHid = function (code) {
try {
NRF.sendHIDReport([1, code], function () { return NRF.sendHIDReport([1, 0]); });
}
catch (e) {
console.log("sendHIDReport:", e);
}
};
var next = function () { return sendHid(0x01); };
var prev = function () { return sendHid(0x02); };
var toggle = function () { return sendHid(0x10); };
var up = function () { return sendHid(0x40); };
var down = function () { return sendHid(0x80); };
})();