BangleApps/apps/widhid/wid.js

189 lines
5.7 KiB
JavaScript
Raw Normal View History

2023-05-08 12:04:30 +00:00
(function () {
2023-05-08 14:02:54 +00:00
var settings = require("Storage").readJSON("setting.json", true) || { HID: false };
2023-05-08 12:04:30 +00:00
if (settings.HID !== "kbmedia") {
console.log("widhid: can't enable, HID setting isn't \"kbmedia\"");
return;
}
2023-05-10 07:05:29 +00:00
delete settings;
2023-05-08 14:02:54 +00:00
var anchor = { x: 0, y: 0 };
var start = { x: 0, y: 0 };
2023-05-08 12:04:30 +00:00
var dragging = false;
var activeTimeout;
2023-05-08 14:02:54 +00:00
var waitForRelease = true;
var menuShown = 0;
var origShowMenu = E.showMenu;
E.showMenu = (function (menu) {
menuShown++;
var origSetUI = Bangle.setUI;
Bangle.setUI = (function (mode, cb) {
menuShown--;
Bangle.setUI = origSetUI;
return origSetUI(mode, cb);
});
return origShowMenu(menu);
});
var onSwipe = (function (_lr, ud) {
2023-05-08 19:44:21 +00:00
if (Bangle.CLKINFO_FOCUS)
return;
if (menuShown)
return;
2023-05-08 14:02:54 +00:00
if (!activeTimeout && ud > 0) {
2023-05-08 12:04:30 +00:00
listen();
2023-05-08 14:02:54 +00:00
Bangle.buzz(20);
2023-05-08 12:04:30 +00:00
}
});
2023-05-08 14:02:54 +00:00
var onDrag = (function (e) {
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)
2023-05-08 12:04:30 +00:00
return;
2023-05-08 14:02:54 +00:00
if (e.b && !dragging) {
2023-05-08 12:04:30 +00:00
dragging = true;
2023-05-08 14:02:54 +00:00
setStart(e);
Object.assign(anchor, start);
2023-05-08 12:04:30 +00:00
return;
}
2023-05-08 14:02:54 +00:00
var dx = e.x - start.x;
var dy = e.y - start.y;
if (Math.abs(dy) > 25 && Math.abs(dx) > 25) {
setStart(e);
2023-05-08 12:04:30 +00:00
return;
}
2023-05-08 14:02:54 +00:00
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);
}
2023-05-08 12:04:30 +00:00
});
2023-05-08 14:02:54 +00:00
var setStart = function (_a) {
var x = _a.x, y = _a.y;
start.x = x;
start.y = y;
};
var onEvent = function () {
Bangle.buzz(20);
listen();
};
2023-05-08 12:04:30 +00:00
var listen = function () {
var wasActive = !!activeTimeout;
2023-05-08 14:02:54 +00:00
if (!wasActive) {
suspendOthers();
waitForRelease = true;
Bangle.on("drag", onDrag);
redraw();
}
if (activeTimeout)
clearTimeout(activeTimeout);
2023-05-08 12:04:30 +00:00
activeTimeout = setTimeout(function () {
activeTimeout = undefined;
2023-05-08 14:02:54 +00:00
Bangle.removeListener("drag", onDrag);
2023-05-08 12:04:30 +00:00
resumeOthers();
redraw();
2023-05-08 14:02:54 +00:00
}, 3000);
2023-05-08 12:04:30 +00:00
};
var redraw = function () { return setTimeout(Bangle.drawWidgets, 50); };
var connected = NRF.getSecurityStatus().connected;
2023-05-08 12:04:30 +00:00
WIDGETS["hid"] = {
area: "tr",
sortorder: -20,
draw: function () {
if (this.width === 0)
return;
2023-05-08 12:04:30 +00:00
g.drawImage(activeTimeout
2023-05-08 14:02:54 +00:00
? require("heatshrink").decompress(atob("jEYxH+AEfH44XXAAYXXDKIXZDYp3pC/6KHUMwWHC/4XvUy4YGdqoA/AFoA=="))
: require("heatshrink").decompress(atob("jEYxH+AEcdjoXXAAYXXDKIXZDYp3pC/6KHUMwWHC/4XvUy4YGdqoA/AFoA==")), this.x + 2, this.y + 2);
2023-05-08 12:04:30 +00:00
},
width: connected ? 24 : 0,
2023-05-08 12:04:30 +00:00
};
if (connected)
Bangle.on("swipe", onSwipe);
2023-05-10 07:05:29 +00:00
delete connected;
2023-05-08 12:04:30 +00:00
NRF.on("connect", function () {
WIDGETS["hid"].width = 24;
Bangle.on("swipe", onSwipe);
2023-05-08 12:04:30 +00:00
redraw();
});
NRF.on("disconnect", function () {
WIDGETS["hid"].width = 0;
Bangle.removeListener("swipe", onSwipe);
2023-05-08 12:04:30 +00:00
redraw();
});
var sendHid = function (code) {
NRF.sendHIDReport([1, code], function () { return NRF.sendHIDReport([1, 0]); });
};
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); };
var touchEvents = {
tap: null,
gesture: null,
aiGesture: null,
swipe: null,
touch: null,
drag: null,
stroke: null,
};
2023-05-08 12:04:30 +00:00
var suspendOthers = function () {
for (var event in touchEvents) {
var handlers = Bangle["#on".concat(event)];
if (!handlers)
continue;
var newEvents = void 0;
if (handlers instanceof Array)
newEvents = handlers.slice();
else
newEvents = [handlers];
for (var _i = 0, newEvents_1 = newEvents; _i < newEvents_1.length; _i++) {
var handler = newEvents_1[_i];
Bangle.removeListener(event, handler);
}
touchEvents[event] = newEvents;
}
2023-05-08 12:04:30 +00:00
};
var resumeOthers = function () {
for (var event in touchEvents) {
var handlers = touchEvents[event];
touchEvents[event] = null;
if (handlers)
for (var _i = 0, handlers_1 = handlers; _i < handlers_1.length; _i++) {
var handler = handlers_1[_i];
2023-05-08 21:06:10 +00:00
try {
Bangle.on(event, handler);
}
catch (e) {
console.log("couldn't restore \"".concat(event, "\" handler:"), e);
}
}
}
2023-05-08 12:04:30 +00:00
};
})();