From 9cdf97164c195ea9833f5be6ddcb26a0c73b6d6c Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Mon, 8 May 2023 13:04:30 +0100 Subject: [PATCH 01/19] widhid: new widget --- apps/widhid/icon-active.png | Bin 0 -> 966 bytes apps/widhid/icon.js | 1 + apps/widhid/icon.png | Bin 0 -> 4598 bytes apps/widhid/metadata.json | 14 ++++ apps/widhid/wid.js | 100 ++++++++++++++++++++++++++++ apps/widhid/wid.ts | 117 +++++++++++++++++++++++++++++++++ typescript/types/settings.d.ts | 51 ++++++++++++++ 7 files changed, 283 insertions(+) create mode 100644 apps/widhid/icon-active.png create mode 100644 apps/widhid/icon.js create mode 100644 apps/widhid/icon.png create mode 100644 apps/widhid/metadata.json create mode 100644 apps/widhid/wid.js create mode 100644 apps/widhid/wid.ts create mode 100644 typescript/types/settings.d.ts diff --git a/apps/widhid/icon-active.png b/apps/widhid/icon-active.png new file mode 100644 index 0000000000000000000000000000000000000000..9764fe5118834dcc4439c48a616d96821b19cbb1 GIT binary patch literal 966 zcmV;%13CPOP)EX>4Tx04R}tkv&MmKpe$iQ;S6_B6bjQ2w0u$q9Ts93Pq?8YK2xEOfLO`CJjl7 zi=*ILaPVWX>fqw6tAnc`2!4RLx;QDiNQwVT3N2ziIPS;0dyl(!fKV?p&FYE)nr@q^ zL|n{dSHC`-Nm{=^dvC_t@XllgM#1U1~DPPEV zta9Gstd*;*c~AbrP)=W2<~q$0B(R7jND!f*iW17O5v5fp#X^eq;~o6Nu3sXTLaq`R zITlcX2HEw4|H1EWt^CxamlTQvffvX57z4U@fkw@7zKjJ_!g4Bi4gYhG{7eVjf3Y3eF@0~{Oz z;|0oI@9^$mdvE`qY4-O6SqgHTaxWz*00006VoOIv0RI600RN!9r;`8x010qNS#tmY z3ljhU3ljkVnw%H_00GuXL_t(&-tCt$PZUuUg}?h|gP}6U5==}?W}_9I6tW<)*2Vi&9q~{fq*^kctJh z^dE0CxSEy;pj`(*3)Dhj38Sx_Zm1N@led9Mkjc}pt@8q#vQHro@E-!0d!RGG25^-1 zY5(5Dr;}wFSmyi7fRp|qkO}n91V|0&D>lG+-Cc3Or?X>$-NsE^Fb?i1NWGXj5H5)~ zu?O$~9^m=_WXpl1QAa9Ms2c$W0Z`dPGzPOy7};X}Qtr%!sJ;ej7hb2jg~(_xbD;Y- zkj&T6^bK&U^YXMcpSuTk=0dn+^Tjl=X%?yZ?f{ZT9d(aOJVt{TCC`EMQQ3oRz$Y>M z%oAWgdu#^#`2k1}XRfC1eSQF{YuN#GJ>R`hGXECR@hdjJMYTDWuZh)713#`%=MV{| z^PfW1<~K0Ufy1tv$2=p9z7%7OhEa?J!(iTB!uXqD9uh_|JyN#4`RCauh?zoU1a)`L on%+Y-M%^0KW(zMbFRyE@zqb{M=HZJPTL1t607*qoM6N<$g6u1`;Q#;t literal 0 HcmV?d00001 diff --git a/apps/widhid/icon.js b/apps/widhid/icon.js new file mode 100644 index 000000000..47486854c --- /dev/null +++ b/apps/widhid/icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwxH+AH4A/AH4A/AG9lsovvAAYvvGVIvIGcwvMGMQv/F/4vTGpQvmNJAvqBggvtAEQv/F/4v/F/4nbFIYvlFooAHF1wvgFxwvfFx4v/Fz4v/F/4v/F/4wfFzwvwGBwugGBouiGBYukGJAtnAH4A/AH4A/ACIA==")) diff --git a/apps/widhid/icon.png b/apps/widhid/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..9a4dc025f596fa12a9d66927bdd9724899ed241b GIT binary patch literal 4598 zcmeH~dsGuw9>*t91fs5JrLIbK3|gRdGBbISfgq8fq&A8W1=L-fOeQcjFOrc2Xbxp% ztqQ)t7M5DsLS5L3R_j}81x2x(Be<)(K8l*UKI&^}R|~$1dnX{mY0uf?Iotn8&SYkO z_jf<{_xs-8y(f2d;@sII1rr1i1dY@tXp+Dkq0zNlksrtcQ+IkIKc zA(>tO_dTg1rGISEt2+{=k2u?kXWslxR$$j(=hifYe_eCti>}E(x+fG@3+Idrt*_tN zI&*&4el)c6>x&xXN_*{rjo$}VO+5R<_6*c!&Y?(@8d4|B)eOuKxuJ7o0MrQ(LLps;dlYSYA~Gar4}no}9s(o!<> z-MP`$(|)Tb9~9L;J#p~b&dQ8gYt5!Dk#9}kbSU-ThJ|wd)rhO*Rqt%-XggSEzkIcB z;hj3qyzZlR_2RS}#HrDr?p!r(RS;agPVm{zpqd4t$2BWEODA=c&1lJ-*Hiq8Lx$I? z|9I_T<1?>ozbVUcR3`{4@D^F}i}{D^W4DptTxs5SiQw_u8b0{v59cZx?uOl3yYAH} z{;+)oMR(S{-oY!2YB*gg8ebCXm-)CT-uqMWR}rH|T;_Y0S#9?`n`5A~+i!S=goN;^ zX)V9+a=U8l_vg3mdGdt!-VR6Ims`KR4yrDf0o9eNdz+wa77=N*8EBE)Vh3dhLD4hZ zc9L2~v#^2AV5}-(NBt2Y%otU|6qydw+2iO;CLz~BC+E)9Q@P71rBOH|MiA{L0Kh`C zBY>o^RS1Oe#CPu|#1b86M94kw@5vwzlL-a5-w3Bi$c9yYO zVU9@}Y|B}dPzc)L=kZzWI$a;$>g-hk=z+RPJBo`i)M7#V_i(cD*#OcT&@c9I>cJvK zlW3=Hxr3tPvuP_E+8;4nt4r)7a4BUl7P~JgAl`t%j8vbWeYwNz^D$B=ZKf>%>ICuO z1N>RW^g^rwv2iWFbovJZhU?=G@P3}V&lz~>bcDu6E$0T+YE(ilUczXj7$f0(qz$B; zB=JZ@A;xh;YLY4tB_1h3q?o}VHA+nwC6V_-X{}C{v{E#O0&o!nI7VD57K;^1M26F1 zL`qROLMmwqqL5QE+Cbr$SYhagnCDB2wCjA(0p; z5y~JJ8N~j|#cwX|07CmF3lUb5e4VOns zWKyXdQ_2)#nYbrCA8;YmnVrIs@nkv;y_%(+UpnnZk&H?ygLln;)PUg2|AdD~9%FjB>li^OU2}pNSIf zbLh9tfPOtTuzi8u5bfIzdqv|mo?r3PI~l*?2mn1e$V=%vDA%A|FQvdsIS*FXpj
SB7gIwUalv~mD8aQeVGt8N-fu3>SKOe3s1(ra2LYfnThQGpH zJg8#xZ-LRD)#~E?Z~6rc55h04`er>iPgiO+YJKMAdu1wg==`xOE1k`6tey}&|4w*n z<+hJUHcmd@lwR`CFSAY)N_nR5o#Cwx`gpyDI(Anjm})NAd#&|)%%!OkXRD;NYxDSk zp?qH1$eH|##WA_PafVgjW}LsW&~>V)sSOtIB%7IB>(JzJyxPi&rK zO7@$lPkxwPa(n9e@f-MAXFJMb1G0hw`09qJi;E_1WO!A6JF8*EiRuJ$QH2cdI&z>Y~hs1I`HhqaoKtzgv0WVy-gJD{k6`q$Jnh=v-WDcEyGr zx$rdRc>95W>6W0plqao6*0XFVL( zcFuS!-}}K@R)7zOtC!}bS9}F+uljMpnuCIZSor&z9KL>0;irc_I}C%_gS7E;H9KZ5 H{lk9&mAj$V literal 0 HcmV?d00001 diff --git a/apps/widhid/metadata.json b/apps/widhid/metadata.json new file mode 100644 index 000000000..5acafb2e4 --- /dev/null +++ b/apps/widhid/metadata.json @@ -0,0 +1,14 @@ +{ + "id": "widhid", + "name": "Bluetooth Music Swipe Control Widget", + "shortName": "BLE Swipe Widget", + "version": "0.01", + "description": "Based on Swipe Bluetooth Music Controls (based on Bluetooth Music Controls). Swipe down to enable, then swipe up/down for volume, left/right for previous and next and tap for play/pause. Enable HID in settings, pair with your phone/computer, then use this widget to control music from your watch!", + "icon": "icon.png", + "tags": "widget,bluetooth", + "supports": ["BANGLEJS2"], + "storage": [ + {"name":"widhid.wid.js","url":"wid.js"}, + {"name":"widhid.img","url":"icon.js","evaluate":true} + ] +} diff --git a/apps/widhid/wid.js b/apps/widhid/wid.js new file mode 100644 index 000000000..cdb370842 --- /dev/null +++ b/apps/widhid/wid.js @@ -0,0 +1,100 @@ +(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; + } + var start = { x: 0, y: 0 }, end = { x: 0, y: 0 }; + var dragging = false; + var activeTimeout; + Bangle.on("swipe", function (_lr, ud) { + if (ud > 0) { + listen(); + Bangle.buzz(); + } + }); + Bangle.on('drag', function (e) { + if (!activeTimeout) + return; + if (!dragging) { + dragging = true; + start.x = e.x; + start.y = e.y; + return; + } + var released = e.b === 0; + if (released) { + var dx = end.x - start.x; + var dy = end.y - start.y; + if (Math.abs(dy) < 10) { + if (dx > 40) + next(); + else if (dx < 40) + prev(); + } + else if (Math.abs(dx) < 10) { + if (dy > 40) + down(); + else if (dy < 40) + up(); + } + else if (dx === 0 && dy === 0) { + toggle(); + } + Bangle.buzz(); + listen(); + return; + } + end.x = e.x; + end.y = e.y; + }); + var listen = function () { + suspendOthers(); + var wasActive = !!activeTimeout; + clearTimeout(activeTimeout); + activeTimeout = setTimeout(function () { + activeTimeout = undefined; + resumeOthers(); + redraw(); + }, 5000); + if (!wasActive) + redraw(); + }; + WIDGETS["hid"] = { + area: "tr", + sortorder: -20, + draw: function () { + g.drawImage(activeTimeout + ? require("heatshrink").decompress(atob("mEwxH+AH4A/AH4A/AG8gkAvvAAYvvGVIvIGcwvMGMQv/F/4vTGpQvmNJAvqBggvtAEQv/F/4v/F/4nbFIYvlFooAHF1wvgFxwvfFx4v/Fz4v/F/4v/F/4wfFzwvwGBwugGBouiGBYukGJAtnAH4A/AH4A/ACIA==")) + : require("heatshrink").decompress(atob("mEwxH+AH4A/AH4A/AG9lsovvAAYvvGVIvIGcwvMGMQv/F/4vTGpQvmNJAvqBggvtAEQv/F/4v/F/4nbFIYvlFooAHF1wvgFxwvfFx4v/Fz4v/F/4v/F/4wfFzwvwGBwugGBouiGBYukGJAtnAH4A/AH4A/ACIA==")), this.x + 2, this.y + 2); + }, + width: 24, + }; + var redraw = function () { return setTimeout(Bangle.drawWidgets, 50); }; + NRF.on("connect", function () { + WIDGETS["hid"].width = 24; + redraw(); + }); + NRF.on("disconnect", function () { + WIDGETS["hid"].width = 0; + 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 suspendOthers = function () { + var swipeHandler = Bangle.swipeHandler; + if (swipeHandler) + Bangle.removeListener("swipe", swipeHandler); + }; + var resumeOthers = function () { + var swipeHandler = Bangle.swipeHandler; + if (swipeHandler) + Bangle.on("swipe", swipeHandler); + }; +})(); diff --git a/apps/widhid/wid.ts b/apps/widhid/wid.ts new file mode 100644 index 000000000..cddf67aaf --- /dev/null +++ b/apps/widhid/wid.ts @@ -0,0 +1,117 @@ +(() => { + const settings: Settings = require('Storage').readJSON('setting.json', true) || { HID: false } as Settings; + if (settings.HID !== "kbmedia") { + console.log("widhid: can't enable, HID setting isn't \"kbmedia\""); + return; + } + + let start = {x:0,y:0}, end = {x:0,y:0}; + let dragging = false; + let activeTimeout: number | undefined; + + Bangle.on("swipe", (_lr, ud) => { + if(ud! > 0){ + listen(); + Bangle.buzz(); + } + }); + + Bangle.on('drag', e => { + if(!activeTimeout) return; + + if(!dragging){ + dragging = true; + start.x = e.x; + start.y = e.y; + return; + } + + const released = e.b === 0; + if(released){ + const dx = end.x - start.x; + const dy = end.y - start.y; + + if(Math.abs(dy) < 10){ + if(dx > 40) next(); + else if(dx < 40) prev(); + }else if(Math.abs(dx) < 10){ + if(dy > 40) down(); + else if(dy < 40) up(); + }else if(dx === 0 && dy === 0){ + toggle(); + } + Bangle.buzz(); // feedback event sent + + listen(); // had an event, keep listening for more + return; + } + + end.x = e.x; + end.y = e.y; + }); + + const listen = () => { + suspendOthers(); + + const wasActive = !!activeTimeout; + + clearTimeout(activeTimeout); + activeTimeout = setTimeout(() => { + activeTimeout = undefined; + resumeOthers(); + redraw(); + }, 5000); + + if(!wasActive) redraw(); + }; + + WIDGETS["hid"] = { + area: "tr", + sortorder: -20, + draw: function() { + g.drawImage( + activeTimeout + ? require("heatshrink").decompress(atob("mEwxH+AH4A/AH4A/AG8gkAvvAAYvvGVIvIGcwvMGMQv/F/4vTGpQvmNJAvqBggvtAEQv/F/4v/F/4nbFIYvlFooAHF1wvgFxwvfFx4v/Fz4v/F/4v/F/4wfFzwvwGBwugGBouiGBYukGJAtnAH4A/AH4A/ACIA==")) + : require("heatshrink").decompress(atob("mEwxH+AH4A/AH4A/AG9lsovvAAYvvGVIvIGcwvMGMQv/F/4vTGpQvmNJAvqBggvtAEQv/F/4v/F/4nbFIYvlFooAHF1wvgFxwvfFx4v/Fz4v/F/4v/F/4wfFzwvwGBwugGBouiGBYukGJAtnAH4A/AH4A/ACIA==")), + this.x! + 2, + this.y! + 2 + ); + }, + width: 24, + }; + + const redraw = () => setTimeout(Bangle.drawWidgets, 50); + + NRF.on("connect", () => { + WIDGETS["hid"]!.width = 24; + redraw(); + }); + NRF.on("disconnect", () => { + WIDGETS["hid"]!.width = 0; + redraw(); + }); + + const sendHid = (code: number) => { + NRF.sendHIDReport( + [1, code], + () => NRF.sendHIDReport([1, 0]), + ); + }; + + const next = () => sendHid(0x01); + const prev = () => sendHid(0x02); + const toggle = () => sendHid(0x10); + const up = () => sendHid(0x40); + const down = () => sendHid(0x80); + + const suspendOthers = () => { + const swipeHandler = (Bangle as {swipeHandler?: () => void}).swipeHandler; + if(swipeHandler) + Bangle.removeListener("swipe", swipeHandler); // swiperclocklaunch + }; + const resumeOthers = () => { + const swipeHandler = (Bangle as {swipeHandler?: () => void}).swipeHandler; + if(swipeHandler) + Bangle.on("swipe", swipeHandler); + }; +})() diff --git a/typescript/types/settings.d.ts b/typescript/types/settings.d.ts new file mode 100644 index 000000000..a46b6ace7 --- /dev/null +++ b/typescript/types/settings.d.ts @@ -0,0 +1,51 @@ +type Settings = { + beep: boolean, + vibrate: boolean, + quiet: number, + + ble: boolean, + blerepl: boolean, + HID?: false | "kbmedia" | "kb" | "com" | "joy", + + passkey?: string, + whitelist_disabled?: boolean, + whitelist: string[], + + theme: Theme, + + brightness: number, + timeout: number, + rotate: number, + + options: SettingsOptions, + + timezone: number, + log: number, + + clock: string, + clockHasWidgets: boolean, + launcher: string, +}; + +type SettingsTheme = { + fg: string, + bg: string, + fg2: string, + bg2: string, + fgH: string, + bgH: string, + dark: boolean, +}; + +type SettingsOptions = { + wakeOnBTN1: boolean, + wakeOnBTN2: boolean, + wakeOnBTN3: boolean, + wakeOnFaceUp: boolean, + wakeOnTouch: boolean, + + wakeOnTwist: boolean, + twistThreshold: number, + twistMaxY: number, + twistTimeout: number, +}; From 683b2dff217893ecea36f9f3ec04c4a25a4ccd6d Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Mon, 8 May 2023 14:57:33 +0100 Subject: [PATCH 02/19] widhid: icon size changes --- apps/widhid/icon-active.png | Bin 966 -> 739 bytes apps/widhid/icon.png | Bin 4598 -> 738 bytes apps/widhid/wid.ts | 4 ++-- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/widhid/icon-active.png b/apps/widhid/icon-active.png index 9764fe5118834dcc4439c48a616d96821b19cbb1..74ce4b2a08176183cdcf93ffb604f179e7959440 100644 GIT binary patch delta 656 zcmV;B0&o4s2jc}LiBL{Q4GJ0x0000DNk~Le0000O0000O2nGNE0N{5$_y7O_gOMd4 z8>$Xw5OK&*o$R6_j10C6=2oTNSA-Bo1OpHiX4U3oIR)SGb&mjF?_xa5|JTzXnMuzRi^Ni~i`6b>B~vG!CXQ;lLHR<~ zV~z8F7H7RuXYG6P7e?~N$}-n!jv|RgEJ20@6?K$RfsGig1}PTOw4d+gyR`~alU`CJ0fb&0=VJ`$-33|=$N4^XoYn~td1dO&0V#g~^hrcPR7l6|)ICZ=Q4ogV=Y&+Q zL2O)tAOvowyHH5%+(GJex`cEFOyv^1*m$F*8}J9T)>aYYvG5{MxJkS}m43}|VCKBT zH)jqFEBv+~9wj$OkqY4~bk85_2E>`;JFdQfOhPYvp3QGnbfAR|^l_R;bpn>^psd!h zj}w196(zMxzm8sZiy?+_l(a>gnAQgP2J2>TxTxEr#%HjU3N4DGWJT1+4%TpwaV?vi zU!I~fXUL(vMW3B_nw-II(?eceP&cg#cvw((R~2wP|4WVIYJeCIiZ&CMLO84h2z!$k qA#7uSYrN)hfUTc@{=fdXJ^=6^J@$)J9oh^40000iyL*qjcYshYGtKIX0h(@` zsYG1NWLL%RR|F75FGevSGs~Ehq$E0yuY36TdKcwcozML_`qZ4o0G~)4V}@xHZxGLH z+6L!+;xH@9D)Bk-gh>}9e&o91@f+uY%L2~~o9Wa%ahO;vw6W60tY~V))5H-~(il%@HK9h$To6p`eNq%CHfoRVT$liuU6j{KKwaB9}t0 z5*RraP=N;7^@IPx?{2O9)TEabiUWZc$N3lox_5y_&2heu9j9>u_@99*z2&def!R;e zYb`Bu1oUqM7uPLK*#jMD5y z92^4U13UZusFC{6HumLH50oF-GK~!ko?Uyl66j2m~zx!r` zp)$r2OiWB>qZOSLvLLe7#susQ2@CuZ8oPlFCR8*);}3W);%I589YjqCoj|bB1m9c> zD99Ep%VeDyd?%S=l9{>pdo$;rH{j*v<&~$T=M|FKT`(3A%Sqbe!Qw&L0QB5h3Ty)w zjK$r5_{jZNzsdyAuHT>^kctJh^dE0CxSEy;pj`(*3)Dhj38Sx_Zm1N@led9Mkjc}p zt@8q#vQHro@E-!0d!RGG25^-1Y5(5Dr;}wFSmyi7fRp|qkO}n91V|0&D>lG+-Cc3O zr?X>$-NsE^Fb?i1NWGXj5H5)~u?O$~9^m?a0A$O7q)|sIQ>YsO1_4mnLo^1nP8iu@ z{!;GDg{Zy;Y8PIox`oJSFLR*#H;~NN(DV&(tMl@-HJ`f&cIHC3Wb?%|v1t~m`R)Lc zMjdsJOFTw{7bVYu^ikP^Y``Zm{LB+zKYMHj`}qM#5NEEY?tOj$s%zN+bUoj_P%{5- z7Si!6Horx+IhL=9)lCCGu2AO?38wR(Le=IsFwcR*uA0X@BaFTjV~mDTj0D4A-d)1@ zn_wOiMln57w!Qi1*(ZpZLSzJWcg~vLLp4U-8r5bCFE1~zYpuVx6^Z8IiyB)10000< KMNUMnLSTYsdYD82 diff --git a/apps/widhid/icon.png b/apps/widhid/icon.png index 9a4dc025f596fa12a9d66927bdd9724899ed241b..dfb108060e87ca478531026d185dd01c53e9e2c0 100644 GIT binary patch delta 711 zcmV;&0yzElBjN>riBL{Q4GJ0x0000DNk~Le0000O0000O2nGNE0N{5$_y7O_gK0xU zP)S2WAaHVTW@&6?001bFeUUv#!$2IxUsH=kst#rlamY}e?4lx$wF*V35Nd^19ZW9$ zf+j6Vii@M*T5#}VvFhOBtgC~oAP9bdxVktgx=4xtOA0N2VmvtR$GdxvyLW)ltT5f` zi37S}o9Sdi%H~$3-dBVWMg#*86=v1uWH|-j@pX>?U+-c(%m3V;qhHHg3J z;tk@NO}oZz6+X^tX^MJz#v1Qm6ZQGtyZtp+I;(zKuO@sGHE znOrKl%3$PJKovR^*AM;&zq_>xQ~6(rCX<}= zo#dSPhK>>DRvZ_17-1xZbA$NQwn3`gO5A)I3Kz2YQl-a+2}GdRdcTz%w!#>fZAa932Q#5QqLXq_N;$T%j0e(TJDdD5 ze1!E{WwqqFBTDj#!<%=IcDgQkX^O6BYVbHkci+$;986TD*M|l7M literal 4598 zcmeH~dsGuw9>*t91fs5JrLIbK3|gRdGBbISfgq8fq&A8W1=L-fOeQcjFOrc2Xbxp% ztqQ)t7M5DsLS5L3R_j}81x2x(Be<)(K8l*UKI&^}R|~$1dnX{mY0uf?Iotn8&SYkO z_jf<{_xs-8y(f2d;@sII1rr1i1dY@tXp+Dkq0zNlksrtcQ+IkIKc zA(>tO_dTg1rGISEt2+{=k2u?kXWslxR$$j(=hifYe_eCti>}E(x+fG@3+Idrt*_tN zI&*&4el)c6>x&xXN_*{rjo$}VO+5R<_6*c!&Y?(@8d4|B)eOuKxuJ7o0MrQ(LLps;dlYSYA~Gar4}no}9s(o!<> z-MP`$(|)Tb9~9L;J#p~b&dQ8gYt5!Dk#9}kbSU-ThJ|wd)rhO*Rqt%-XggSEzkIcB z;hj3qyzZlR_2RS}#HrDr?p!r(RS;agPVm{zpqd4t$2BWEODA=c&1lJ-*Hiq8Lx$I? z|9I_T<1?>ozbVUcR3`{4@D^F}i}{D^W4DptTxs5SiQw_u8b0{v59cZx?uOl3yYAH} z{;+)oMR(S{-oY!2YB*gg8ebCXm-)CT-uqMWR}rH|T;_Y0S#9?`n`5A~+i!S=goN;^ zX)V9+a=U8l_vg3mdGdt!-VR6Ims`KR4yrDf0o9eNdz+wa77=N*8EBE)Vh3dhLD4hZ zc9L2~v#^2AV5}-(NBt2Y%otU|6qydw+2iO;CLz~BC+E)9Q@P71rBOH|MiA{L0Kh`C zBY>o^RS1Oe#CPu|#1b86M94kw@5vwzlL-a5-w3Bi$c9yYO zVU9@}Y|B}dPzc)L=kZzWI$a;$>g-hk=z+RPJBo`i)M7#V_i(cD*#OcT&@c9I>cJvK zlW3=Hxr3tPvuP_E+8;4nt4r)7a4BUl7P~JgAl`t%j8vbWeYwNz^D$B=ZKf>%>ICuO z1N>RW^g^rwv2iWFbovJZhU?=G@P3}V&lz~>bcDu6E$0T+YE(ilUczXj7$f0(qz$B; zB=JZ@A;xh;YLY4tB_1h3q?o}VHA+nwC6V_-X{}C{v{E#O0&o!nI7VD57K;^1M26F1 zL`qROLMmwqqL5QE+Cbr$SYhagnCDB2wCjA(0p; z5y~JJ8N~j|#cwX|07CmF3lUb5e4VOns zWKyXdQ_2)#nYbrCA8;YmnVrIs@nkv;y_%(+UpnnZk&H?ygLln;)PUg2|AdD~9%FjB>li^OU2}pNSIf zbLh9tfPOtTuzi8u5bfIzdqv|mo?r3PI~l*?2mn1e$V=%vDA%A|FQvdsIS*FXpj
SB7gIwUalv~mD8aQeVGt8N-fu3>SKOe3s1(ra2LYfnThQGpH zJg8#xZ-LRD)#~E?Z~6rc55h04`er>iPgiO+YJKMAdu1wg==`xOE1k`6tey}&|4w*n z<+hJUHcmd@lwR`CFSAY)N_nR5o#Cwx`gpyDI(Anjm})NAd#&|)%%!OkXRD;NYxDSk zp?qH1$eH|##WA_PafVgjW}LsW&~>V)sSOtIB%7IB>(JzJyxPi&rK zO7@$lPkxwPa(n9e@f-MAXFJMb1G0hw`09qJi;E_1WO!A6JF8*EiRuJ$QH2cdI&z>Y~hs1I`HhqaoKtzgv0WVy-gJD{k6`q$Jnh=v-WDcEyGr zx$rdRc>95W>6W0plqao6*0XFVL( zcFuS!-}}K@R)7zOtC!}bS9}F+uljMpnuCIZSor&z9KL>0;irc_I}C%_gS7E;H9KZ5 H{lk9&mAj$V diff --git a/apps/widhid/wid.ts b/apps/widhid/wid.ts index cddf67aaf..46317ff6f 100644 --- a/apps/widhid/wid.ts +++ b/apps/widhid/wid.ts @@ -71,8 +71,8 @@ draw: function() { g.drawImage( activeTimeout - ? require("heatshrink").decompress(atob("mEwxH+AH4A/AH4A/AG8gkAvvAAYvvGVIvIGcwvMGMQv/F/4vTGpQvmNJAvqBggvtAEQv/F/4v/F/4nbFIYvlFooAHF1wvgFxwvfFx4v/Fz4v/F/4v/F/4wfFzwvwGBwugGBouiGBYukGJAtnAH4A/AH4A/ACIA==")) - : require("heatshrink").decompress(atob("mEwxH+AH4A/AH4A/AG9lsovvAAYvvGVIvIGcwvMGMQv/F/4vTGpQvmNJAvqBggvtAEQv/F/4v/F/4nbFIYvlFooAHF1wvgFxwvfFx4v/Fz4v/F/4v/F/4wfFzwvwGBwugGBouiGBYukGJAtnAH4A/AH4A/ACIA==")), + ? require("heatshrink").decompress(atob("jEYxH+AEfH44XXAAYXXDKIXZDYp3pC/6KHUMwWHC/4XvUy4YGdqoA/AFoA==")) + : require("heatshrink").decompress(atob("jEYxH+AEcdjoXXAAYXXDKIXZDYp3pC/6KHUMwWHC/4XvUy4YGdqoA/AFoA==")), this.x! + 2, this.y! + 2 ); From 4af055dac72089d2a6c45bb130117748ae99a9de Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Mon, 8 May 2023 14:58:08 +0100 Subject: [PATCH 03/19] widhid: formatting --- apps/widhid/wid.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/widhid/wid.ts b/apps/widhid/wid.ts index 46317ff6f..30f32f037 100644 --- a/apps/widhid/wid.ts +++ b/apps/widhid/wid.ts @@ -1,5 +1,5 @@ (() => { - const settings: Settings = require('Storage').readJSON('setting.json', true) || { HID: false } as Settings; + const settings: Settings = require("Storage").readJSON("setting.json", true) || { HID: false } as Settings; if (settings.HID !== "kbmedia") { console.log("widhid: can't enable, HID setting isn't \"kbmedia\""); return; @@ -16,7 +16,7 @@ } }); - Bangle.on('drag', e => { + Bangle.on("drag", e => { if(!activeTimeout) return; if(!dragging){ From d2a989170cc8932598370c46052d2341a98017bc Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Mon, 8 May 2023 14:59:14 +0100 Subject: [PATCH 04/19] widhid: gesture/dragging improvements --- apps/widhid/wid.ts | 101 ++++++++++++++++++++++++++++----------------- 1 file changed, 64 insertions(+), 37 deletions(-) diff --git a/apps/widhid/wid.ts b/apps/widhid/wid.ts index 30f32f037..df5dd4480 100644 --- a/apps/widhid/wid.ts +++ b/apps/widhid/wid.ts @@ -5,64 +5,91 @@ return; } - let start = {x:0,y:0}, end = {x:0,y:0}; + let anchor = {x:0,y:0}; + let start = {x:0,y:0}; let dragging = false; let activeTimeout: number | undefined; + let waitForRelease = true; Bangle.on("swipe", (_lr, ud) => { - if(ud! > 0){ + if(!activeTimeout && ud! > 0){ listen(); - Bangle.buzz(); + Bangle.buzz(20); } }); - Bangle.on("drag", e => { - if(!activeTimeout) return; + const onDrag = (e => { + if(e.b === 0){ + // released + const wasDragging = dragging; + dragging = false; - if(!dragging){ - dragging = true; - start.x = e.x; - start.y = e.y; - return; - } - - const released = e.b === 0; - if(released){ - const dx = end.x - start.x; - const dy = end.y - start.y; - - if(Math.abs(dy) < 10){ - if(dx > 40) next(); - else if(dx < 40) prev(); - }else if(Math.abs(dx) < 10){ - if(dy > 40) down(); - else if(dy < 40) up(); - }else if(dx === 0 && dy === 0){ - toggle(); + if(waitForRelease){ + waitForRelease = false; + return; } - Bangle.buzz(); // feedback event sent - listen(); // had an event, keep listening for more + if(!wasDragging // i.e. tap + || (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; } - end.x = e.x; - end.y = e.y; - }); + const dx = e.x - start.x; + const dy = e.y - start.y; + + if(Math.abs(dy) > 25 && Math.abs(dx) > 25){ + // diagonal, ignore + setStart(e); + return; + } + + // had a drag in a single axis + /**/ 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); } + }) satisfies DragCallback; + + const setStart = ({ x, y }: { x: number, y: number }) => { + start.x = x; + start.y = y; + }; + + const onEvent = () => { + Bangle.buzz(20); // feedback event sent + listen(); // had an event, keep listening for more + }; const listen = () => { - suspendOthers(); - const wasActive = !!activeTimeout; + if(!wasActive){ + suspendOthers(); + waitForRelease = true; // wait for first touch up before accepting gestures + Bangle.on("drag", onDrag); + redraw(); + } - clearTimeout(activeTimeout); + if(activeTimeout) clearTimeout(activeTimeout); activeTimeout = setTimeout(() => { activeTimeout = undefined; - resumeOthers(); - redraw(); - }, 5000); - if(!wasActive) redraw(); + Bangle.removeListener("drag", onDrag); + resumeOthers(); + + redraw(); + }, 3000); }; WIDGETS["hid"] = { From 2fc4fdedacebef4fc87913016c912a8e63bdccfc Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Mon, 8 May 2023 14:59:30 +0100 Subject: [PATCH 05/19] widhid: debug comments --- apps/widhid/wid.ts | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/apps/widhid/wid.ts b/apps/widhid/wid.ts index df5dd4480..5e641938e 100644 --- a/apps/widhid/wid.ts +++ b/apps/widhid/wid.ts @@ -118,18 +118,20 @@ redraw(); }); + //const DEBUG = true; const sendHid = (code: number) => { + //if(DEBUG) return; NRF.sendHIDReport( [1, code], () => NRF.sendHIDReport([1, 0]), ); }; - const next = () => sendHid(0x01); - const prev = () => sendHid(0x02); - const toggle = () => sendHid(0x10); - const up = () => sendHid(0x40); - const down = () => sendHid(0x80); + const next = () => /*DEBUG ? console.log("next") : */ sendHid(0x01); + const prev = () => /*DEBUG ? console.log("prev") : */ sendHid(0x02); + const toggle = () => /*DEBUG ? console.log("toggle") : */ sendHid(0x10); + const up = () => /*DEBUG ? console.log("up") : */ sendHid(0x40); + const down = () => /*DEBUG ? console.log("down") : */ sendHid(0x80); const suspendOthers = () => { const swipeHandler = (Bangle as {swipeHandler?: () => void}).swipeHandler; From 69bfcfeb992de8262b4e3b1d63c6a6ca89402c4a Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Mon, 8 May 2023 15:02:54 +0100 Subject: [PATCH 06/19] widhid: regenerate JS --- apps/widhid/wid.js | 111 ++++++++++++++++++++++++------------- typescript/types/main.d.ts | 11 +++- 2 files changed, 79 insertions(+), 43 deletions(-) diff --git a/apps/widhid/wid.js b/apps/widhid/wid.js index cdb370842..4ebe13b6e 100644 --- a/apps/widhid/wid.js +++ b/apps/widhid/wid.js @@ -1,72 +1,103 @@ (function () { - var settings = require('Storage').readJSON('setting.json', true) || { HID: false }; + 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; } - var start = { x: 0, y: 0 }, end = { x: 0, y: 0 }; + var anchor = { x: 0, y: 0 }; + var start = { x: 0, y: 0 }; var dragging = false; var activeTimeout; + var waitForRelease = true; Bangle.on("swipe", function (_lr, ud) { - if (ud > 0) { + if (!activeTimeout && ud > 0) { listen(); - Bangle.buzz(); + Bangle.buzz(20); } }); - Bangle.on('drag', function (e) { - if (!activeTimeout) - return; - if (!dragging) { - dragging = true; - start.x = e.x; - start.y = e.y; - return; - } - var released = e.b === 0; - if (released) { - var dx = end.x - start.x; - var dy = end.y - start.y; - if (Math.abs(dy) < 10) { - if (dx > 40) - next(); - else if (dx < 40) - prev(); + var onDrag = (function (e) { + if (e.b === 0) { + var wasDragging = dragging; + dragging = false; + if (waitForRelease) { + waitForRelease = false; + return; } - else if (Math.abs(dx) < 10) { - if (dy > 40) - down(); - else if (dy < 40) - up(); - } - else if (dx === 0 && dy === 0) { + if (!wasDragging + || (Math.abs(e.x - anchor.x) < 2 && Math.abs(e.y - anchor.y) < 2)) { toggle(); + onEvent(); + return; } - Bangle.buzz(); - listen(); + } + if (waitForRelease) + return; + if (e.b && !dragging) { + dragging = true; + setStart(e); + Object.assign(anchor, start); return; } - end.x = e.x; - end.y = e.y; + 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 () { - suspendOthers(); var wasActive = !!activeTimeout; - clearTimeout(activeTimeout); + if (!wasActive) { + suspendOthers(); + waitForRelease = true; + Bangle.on("drag", onDrag); + redraw(); + } + if (activeTimeout) + clearTimeout(activeTimeout); activeTimeout = setTimeout(function () { activeTimeout = undefined; + Bangle.removeListener("drag", onDrag); resumeOthers(); redraw(); - }, 5000); - if (!wasActive) - redraw(); + }, 3000); }; WIDGETS["hid"] = { area: "tr", sortorder: -20, draw: function () { g.drawImage(activeTimeout - ? require("heatshrink").decompress(atob("mEwxH+AH4A/AH4A/AG8gkAvvAAYvvGVIvIGcwvMGMQv/F/4vTGpQvmNJAvqBggvtAEQv/F/4v/F/4nbFIYvlFooAHF1wvgFxwvfFx4v/Fz4v/F/4v/F/4wfFzwvwGBwugGBouiGBYukGJAtnAH4A/AH4A/ACIA==")) - : require("heatshrink").decompress(atob("mEwxH+AH4A/AH4A/AG9lsovvAAYvvGVIvIGcwvMGMQv/F/4vTGpQvmNJAvqBggvtAEQv/F/4v/F/4nbFIYvlFooAHF1wvgFxwvfFx4v/Fz4v/F/4v/F/4wfFzwvwGBwugGBouiGBYukGJAtnAH4A/AH4A/ACIA==")), this.x + 2, this.y + 2); + ? 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: 24, }; diff --git a/typescript/types/main.d.ts b/typescript/types/main.d.ts index 29118b7c6..4e4dd224e 100644 --- a/typescript/types/main.d.ts +++ b/typescript/types/main.d.ts @@ -1584,7 +1584,7 @@ declare class NRF { * @param {any} callback - A callback function to be called when the data is sent * @url http://www.espruino.com/Reference#l_NRF_sendHIDReport */ - static sendHIDReport(data: any, callback: any): void; + static sendHIDReport(data: number[], callback?: () => void): void /** * Check if Apple Notification Center Service (ANCS) is currently active on the BLE @@ -3188,8 +3188,10 @@ declare class Puck { * Check out [the Puck.js page on the * accelerometer](http://www.espruino.com/Puck.js#on-board-peripherals) for more * information. + * **Note:** Puck.js cannot currently read every sample from the + * accelerometer at sample rates above 208Hz. * - * @param {number} samplerate - The sample rate in Hz, or undefined + * @param {number} samplerate - The sample rate in Hz, or `undefined` (default is 12.5 Hz) * @url http://www.espruino.com/Reference#l_Puck_accelOn */ static accelOn(samplerate: number): void; @@ -3819,6 +3821,9 @@ declare class Bangle { * and polling rate may not be exact. The algorithm's filtering is tuned for * 20-40ms poll intervals, so higher/lower intervals may effect the reliability * of the BPM reading. + * * `hrmSportMode` - on the newest Bangle.js 2 builds with with the proprietary + * heart rate algorithm, this is the sport mode passed to the algorithm. See `libs/misc/vc31_binary/algo.h` + * for more info. 0 = normal (default), 1 = running, 2 = ... * * `seaLevelPressure` (Bangle.js 2) Normally 1013.25 millibars - this is used for * calculating altitude with the pressure sensor * Where accelerations are used they are in internal units, where `8192 = 1g` @@ -13222,7 +13227,7 @@ declare module "Storage" { * @returns {any} An object containing parsed JSON from the file, or undefined * @url http://www.espruino.com/Reference#l_Storage_readJSON */ - function readJSON(name: string, noExceptions: boolean): any; + function readJSON(name: string, noExceptions: ShortBoolean): any; /** * Read a file from the flash storage area that has been written with From 0192b150e7e552df69a1fe957f14b945e2260034 Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Mon, 8 May 2023 15:07:42 +0100 Subject: [PATCH 07/19] widhid: only draw if width > 0 (i.e. when connected) --- apps/widhid/wid.js | 2 ++ apps/widhid/wid.ts | 1 + 2 files changed, 3 insertions(+) diff --git a/apps/widhid/wid.js b/apps/widhid/wid.js index 4ebe13b6e..0b6b4b33a 100644 --- a/apps/widhid/wid.js +++ b/apps/widhid/wid.js @@ -95,6 +95,8 @@ 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); diff --git a/apps/widhid/wid.ts b/apps/widhid/wid.ts index 5e641938e..5e95c746d 100644 --- a/apps/widhid/wid.ts +++ b/apps/widhid/wid.ts @@ -96,6 +96,7 @@ area: "tr", sortorder: -20, draw: function() { + if(this.width === 0) return; g.drawImage( activeTimeout ? require("heatshrink").decompress(atob("jEYxH+AEfH44XXAAYXXDKIXZDYp3pC/6KHUMwWHC/4XvUy4YGdqoA/AFoA==")) From 02b41cf4ec8271e81cd9e8e2da039988d9b3c723 Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Mon, 8 May 2023 15:15:47 +0100 Subject: [PATCH 08/19] widhid: rename widget icons & add app icon --- apps/widhid/icon.js | 2 +- apps/widhid/icon.png | Bin 738 -> 959 bytes .../{icon-active.png => widget-active.png} | Bin apps/widhid/widget.png | Bin 0 -> 738 bytes 4 files changed, 1 insertion(+), 1 deletion(-) rename apps/widhid/{icon-active.png => widget-active.png} (100%) create mode 100644 apps/widhid/widget.png diff --git a/apps/widhid/icon.js b/apps/widhid/icon.js index 47486854c..9bd94bacf 100644 --- a/apps/widhid/icon.js +++ b/apps/widhid/icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwxH+AH4A/AH4A/AG9lsovvAAYvvGVIvIGcwvMGMQv/F/4vTGpQvmNJAvqBggvtAEQv/F/4v/F/4nbFIYvlFooAHF1wvgFxwvfFx4v/Fz4v/F/4v/F/4wfFzwvwGBwugGBouiGBYukGJAtnAH4A/AH4A/ACIA==")) +require("heatshrink").decompress(atob("mUywkBiIA/AFEQOIRuTRgwvSFoQ0DGCBFEDIRNGA44RBB4wIGEIQgNA4IJFCwMQCIpaHBwIyFDA5JHBwYYNFAQ6HDAhjHU4YJFFQ4nGF4YYNbxBeEDFRHDDCxjPeI6WDDBauHCAQIGDAxRPfKAYpMZKdIFIyVHZ5JCODBJCOMRwYSJLIYUUgIBBJN0BGCxJXGARJWAAJJWC6owCJCowwPP6RiC6oYBC6wA/AEQA=")) diff --git a/apps/widhid/icon.png b/apps/widhid/icon.png index dfb108060e87ca478531026d185dd01c53e9e2c0..d52c359d4edde2d1ea5be357ee3b8134298fb6ef 100644 GIT binary patch literal 959 zcmV;w13>(VP)5I8tAUe1E$|6w2R;JLk{t)u1CvNl1ImFPQrz!T2do0p zNC2h+FQix-a0w^|rU4^ms1b&rmeNmwc?!5(;F;um zeatgnea#q;Y-_WOIZrG@aytAiS90TSkr-?Ryq(sK>^X7Zv}K5wHRzB%%$^X5H1+*! z$@)pwLL69Z8DiYZCQtH4AM*^cHb##O$&CBPoL;~+%fEBAGI>^v?C~+r1obtp>M>Tb zm+>l5Myc2fm$hzalZ(V`^*2g*%(60KTuKzfK<&cK+DDqS5`K)ZYp!ZbwnZ{if5p5+ zi5As*d5I-EBUxcQN|b2PsFxcTLrS%1hc;&a)K1#ft21V*=B2F zbY?XQr1TqQn~Byn(lQ(&6L=-1H!4HDf$f2nOQDx9Ihx&tfK$UGKB1bua`=xD?V z-BUTiXdP;71I(#!B@U5i6@lJS)2za993dUp-yt(S4s+|6@YGlam^-a?s%D+zx>led hQT|7sBuNsw#eW4wQ*FXm()$1a002ovPDHLkV1l6ByoLY( delta 729 zcmV;~0w(>x2jT^PiBL{Q4GJ0x0000DNk~Le0000O0000O2nGNE0N{5$_y7O_gK0xU zP)S2WAaHVTW@&6?001bFeUUv#!$2IxUsH=kst#rlamY}e?4lx$wF*V35Nd^19ZW9$ zf+j6Vii@M*T5#}VvFhOBtgC~oAP9bdxVktgx=4xtOA0N2VmvtR$GdxvyLW)ltT5f` zi37S}o9Sdi%H~$3-dBVWMg#*86=v1uWH|-j@pX>?U+-c(%m3V;qhHHg3J z;tk@NO}oZz6+X^tX^MJz#v1Qm6ZQGtyZtp+I;(zKuO@sGHE znOrKl%3$PJKovR^*AM;&zq_>xQ_|&#Rs@zK4d>INCviMS^ z$A$?+tRlx5DgTYoDVi9pV3%-&=k`0ue|q2A)6_RE*HFlM*HwDIl^nLh7?*8F)OiOp zp+2IMa#2b-wy}%{(qTKB{4sol^;%`M$R4 zRHfNpQ%%XmUfpKmN{IW-3EX>4Tx04R}tkv&MmKpe$iQ;S8a4rUN>$WWc^q9Ts93Pq?8YK2xEOfLO`CM`*d zi=*ILaPVWX>fqw6tAnc`2!4RLx;QDiNQwVT3N2zhIPS;0dyl(!fY7Wk-Rg-0x?!8? zWJ1d3R;Auogb+pq0}vHv)#hY51>f;?j{slqVm!4L_2fw?u3R9C_QX~O{UL5CR4CvhjS`EkfK6aee2@re+u8fYq+5~1lNpEzt z=n*iu4P0DzG<6TS+yRE4YKp12Qjn%lC;;zg^i4Tn=oaW(^LlIV5!HeLLQR zN=2e_qeE0)fJmrmiQL^$5H@1(pX_eMX(p4L^PS|J`G$@W=2jdRcNk$Lg>!@W)V4vY z+)CVh844G&_)?|Eh6zNhBF7mi|BcWoni#BLmvDsV_B+UW-`dmEH!jyu$a>dRdcTz% zw!#>fZAa932Q#5QqLXq_N;$T%j0e(TJDdD5e1!E{WwqqFBTDj#!<%=IcDgQkX^O6B zYVbHkci+$;986TD* Date: Mon, 8 May 2023 20:44:21 +0100 Subject: [PATCH 09/19] widhid: disable if clkinfo is focused --- apps/widhid/wid.js | 4 ++++ apps/widhid/wid.ts | 4 ++++ typescript/types/clock_info.d.ts | 4 ++++ 3 files changed, 12 insertions(+) diff --git a/apps/widhid/wid.js b/apps/widhid/wid.js index 0b6b4b33a..00778500d 100644 --- a/apps/widhid/wid.js +++ b/apps/widhid/wid.js @@ -10,12 +10,16 @@ var activeTimeout; var waitForRelease = true; Bangle.on("swipe", function (_lr, ud) { + if (Bangle.CLKINFO_FOCUS) + return; if (!activeTimeout && ud > 0) { listen(); Bangle.buzz(20); } }); var onDrag = (function (e) { + if (Bangle.CLKINFO_FOCUS) + return; if (e.b === 0) { var wasDragging = dragging; dragging = false; diff --git a/apps/widhid/wid.ts b/apps/widhid/wid.ts index 5e95c746d..fe225339e 100644 --- a/apps/widhid/wid.ts +++ b/apps/widhid/wid.ts @@ -12,6 +12,8 @@ let waitForRelease = true; Bangle.on("swipe", (_lr, ud) => { + if((Bangle as BangleExt).CLKINFO_FOCUS) return; + if(!activeTimeout && ud! > 0){ listen(); Bangle.buzz(20); @@ -19,6 +21,8 @@ }); const onDrag = (e => { + if((Bangle as BangleExt).CLKINFO_FOCUS) return; + if(e.b === 0){ // released const wasDragging = dragging; diff --git a/typescript/types/clock_info.d.ts b/typescript/types/clock_info.d.ts index 06a2d400b..b12732683 100644 --- a/typescript/types/clock_info.d.ts +++ b/typescript/types/clock_info.d.ts @@ -57,3 +57,7 @@ declare module ClockInfo { focus: boolean, }; } + +interface BangleExt { + CLKINFO_FOCUS?: true; +} From a2e9c8db1edf50356a47c12e9dcc8ac9113f104b Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Mon, 8 May 2023 21:46:16 +0100 Subject: [PATCH 10/19] widhid: disable all touch events when active --- apps/widhid/wid.js | 39 +++++++++++++++++++++++++++++++++------ apps/widhid/wid.ts | 46 ++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 73 insertions(+), 12 deletions(-) diff --git a/apps/widhid/wid.js b/apps/widhid/wid.js index 00778500d..7ce273eee 100644 --- a/apps/widhid/wid.js +++ b/apps/widhid/wid.js @@ -124,14 +124,41 @@ 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, + }; var suspendOthers = function () { - var swipeHandler = Bangle.swipeHandler; - if (swipeHandler) - Bangle.removeListener("swipe", swipeHandler); + 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; + } }; var resumeOthers = function () { - var swipeHandler = Bangle.swipeHandler; - if (swipeHandler) - Bangle.on("swipe", swipeHandler); + 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]; + Bangle.on(event, handler); + } + } }; })(); diff --git a/apps/widhid/wid.ts b/apps/widhid/wid.ts index fe225339e..34f41600f 100644 --- a/apps/widhid/wid.ts +++ b/apps/widhid/wid.ts @@ -138,14 +138,48 @@ const up = () => /*DEBUG ? console.log("up") : */ sendHid(0x40); const down = () => /*DEBUG ? console.log("down") : */ sendHid(0x80); + // similarly to the lightswitch app, we tangle with the listener arrays to + // disable event handlers + type Handler = () => void; + const touchEvents: { + [key: string]: null | Handler[] + } = { + tap: null, + gesture: null, + aiGesture: null, + swipe: null, + touch: null, + drag: null, + stroke: null, + }; + const suspendOthers = () => { - const swipeHandler = (Bangle as {swipeHandler?: () => void}).swipeHandler; - if(swipeHandler) - Bangle.removeListener("swipe", swipeHandler); // swiperclocklaunch + for(const event in touchEvents){ + const handlers: Handler[] | Handler | undefined + = (Bangle as any)[`#on${event}`]; + + if(!handlers) continue; + + let newEvents; + if(handlers instanceof Array) + newEvents = handlers.slice(); + else + newEvents = [handlers /* single fn */]; + + for(const handler of newEvents) + Bangle.removeListener(event, handler); + + touchEvents[event] = newEvents; + } }; const resumeOthers = () => { - const swipeHandler = (Bangle as {swipeHandler?: () => void}).swipeHandler; - if(swipeHandler) - Bangle.on("swipe", swipeHandler); + for(const event in touchEvents){ + const handlers = touchEvents[event]; + touchEvents[event] = null; + + if(handlers) + for(const handler of handlers) + Bangle.on(event as any, handler); + } }; })() From 610f4d61a739fc2d15897d3f81bb8d99a9b28c15 Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Mon, 8 May 2023 21:53:20 +0100 Subject: [PATCH 11/19] widhid: initial display based on NRF.connected --- apps/widhid/wid.js | 2 +- apps/widhid/wid.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/widhid/wid.js b/apps/widhid/wid.js index 7ce273eee..1e2097686 100644 --- a/apps/widhid/wid.js +++ b/apps/widhid/wid.js @@ -105,7 +105,7 @@ ? 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: 24, + width: NRF.getSecurityStatus().connected ? 24 : 0, }; var redraw = function () { return setTimeout(Bangle.drawWidgets, 50); }; NRF.on("connect", function () { diff --git a/apps/widhid/wid.ts b/apps/widhid/wid.ts index 34f41600f..38f45c357 100644 --- a/apps/widhid/wid.ts +++ b/apps/widhid/wid.ts @@ -109,7 +109,7 @@ this.y! + 2 ); }, - width: 24, + width: NRF.getSecurityStatus().connected ? 24 : 0, }; const redraw = () => setTimeout(Bangle.drawWidgets, 50); From 4352cd0f29362831ab804a4244e86076635b8fac Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Mon, 8 May 2023 22:05:41 +0100 Subject: [PATCH 12/19] widhid: formatting --- apps/widhid/wid.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/widhid/wid.ts b/apps/widhid/wid.ts index 38f45c357..fa81021e1 100644 --- a/apps/widhid/wid.ts +++ b/apps/widhid/wid.ts @@ -60,9 +60,9 @@ } // had a drag in a single axis - /**/ if(dx > 40) { next(); onEvent(); waitForRelease = true; } + 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){ down(); onEvent(); setStart(e); } else if(dy < -30){ up(); onEvent(); setStart(e); } }) satisfies DragCallback; From c1f8b1e4aa178959f76cdb442fd03d41e5e011cc Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Mon, 8 May 2023 22:06:01 +0100 Subject: [PATCH 13/19] widhid: guard against errors restoring handlers --- apps/widhid/wid.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/apps/widhid/wid.ts b/apps/widhid/wid.ts index fa81021e1..ed6c7b02e 100644 --- a/apps/widhid/wid.ts +++ b/apps/widhid/wid.ts @@ -179,7 +179,11 @@ if(handlers) for(const handler of handlers) - Bangle.on(event as any, handler); + try{ + Bangle.on(event as any, handler); + }catch(e){ + console.log(`couldn't restore "${event}" handler:`, e); + } } }; })() From c62056a0cf9c3c11dca9b2281c4818cdb2335d81 Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Mon, 8 May 2023 22:06:10 +0100 Subject: [PATCH 14/19] widhid: regenerate JS --- apps/widhid/wid.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/apps/widhid/wid.js b/apps/widhid/wid.js index 1e2097686..13ccddd5f 100644 --- a/apps/widhid/wid.js +++ b/apps/widhid/wid.js @@ -157,7 +157,12 @@ if (handlers) for (var _i = 0, handlers_1 = handlers; _i < handlers_1.length; _i++) { var handler = handlers_1[_i]; - Bangle.on(event, handler); + try { + Bangle.on(event, handler); + } + catch (e) { + console.log("couldn't restore \"".concat(event, "\" handler:"), e); + } } } }; From e1c99b167740d8d0015b78f08a3830a3c2fe2dfd Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Mon, 8 May 2023 22:18:05 +0100 Subject: [PATCH 15/19] widhid: add README --- apps/widhid/README.md | 21 +++++++++++++++++++++ apps/widhid/metadata.json | 1 + 2 files changed, 22 insertions(+) create mode 100644 apps/widhid/README.md diff --git a/apps/widhid/README.md b/apps/widhid/README.md new file mode 100644 index 000000000..7651d74eb --- /dev/null +++ b/apps/widhid/README.md @@ -0,0 +1,21 @@ +# Description + +A music control widget based on [Swipe Bluetooth Music Controls] (based on [Bluetooth Music Controls]). +By operating as a widget, you can control music without leaving your current app (e.g. on a run, bike ride or just watching the clock). + + +[Swipe Bluetooth Music Controls]: https://github.com/espruino/BangleApps/tree/master/apps/hidmsicswipe +[Bluetooth Music Controls]: https://github.com/espruino/BangleApps/tree/master/apps/hidmsic + +# Usage + +Swipe down to enable - note the icon changes from blue to orange, indicating it's listening for your instruction. Then drag up/down for volume, left/right for previous and next and tap for play/pause. + +All other watch interaction is disabled for 3 seconds, to prevent clashing taps/drags - this period is extended as you continue to alter the volume, play/pause and jump between tracks. + + +# Setup / Technical details + +Note that HID must be enabled in settings. Then provided you're paired with your phone/computer, the widget icon will appear and you can control music from your clock face! + +The app disables all other drag and tap handlers while this widget is "active" (in a similar manner to [`backswipe`](https://github.com/espruino/BangleApps/pull/2524#issuecomment-1406230564) and [`lightswitch`](https://github.com/espruino/Espruino/issues/2151#issuecomment-1042423211)). diff --git a/apps/widhid/metadata.json b/apps/widhid/metadata.json index 5acafb2e4..4ad6e17d1 100644 --- a/apps/widhid/metadata.json +++ b/apps/widhid/metadata.json @@ -5,6 +5,7 @@ "version": "0.01", "description": "Based on Swipe Bluetooth Music Controls (based on Bluetooth Music Controls). Swipe down to enable, then swipe up/down for volume, left/right for previous and next and tap for play/pause. Enable HID in settings, pair with your phone/computer, then use this widget to control music from your watch!", "icon": "icon.png", + "readme": "README.md", "tags": "widget,bluetooth", "supports": ["BANGLEJS2"], "storage": [ From cd2ea095092cbed5dbde48df53a192d4df246d06 Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Mon, 8 May 2023 22:29:45 +0100 Subject: [PATCH 16/19] widhid: resize app image --- apps/widhid/icon.js | 2 +- apps/widhid/icon.png | Bin 959 -> 2189 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/widhid/icon.js b/apps/widhid/icon.js index 9bd94bacf..a8f9cbdb4 100644 --- a/apps/widhid/icon.js +++ b/apps/widhid/icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mUywkBiIA/AFEQOIRuTRgwvSFoQ0DGCBFEDIRNGA44RBB4wIGEIQgNA4IJFCwMQCIpaHBwIyFDA5JHBwYYNFAQ6HDAhjHU4YJFFQ4nGF4YYNbxBeEDFRHDDCxjPeI6WDDBauHCAQIGDAxRPfKAYpMZKdIFIyVHZ5JCODBJCOMRwYSJLIYUUgIBBJN0BGCxJXGARJWAAJJWC6owCJCowwPP6RiC6oYBC6wA/AEQA=")) +require("heatshrink").decompress(atob("mEwwkBiIA/AEhtDNSSHGCyIbFGJ0QFAowIA48QE4oGBBAomBHAxXHA4IJED5IXJCAcQIAxGGC4YKEI44HCBAxAGO4wXBB4JYGNRBfHC/6HFB4wXHUA6YIC4oOCGA6YGU4quHJ5LXGdJIXNF65fIC5AQFQorHJXxwXJK5xGJC65GsgJG/Iw4uUfgIuUC4QWTIwIusLq4WBFy50tC1YXBCyoA/ADw=")) diff --git a/apps/widhid/icon.png b/apps/widhid/icon.png index d52c359d4edde2d1ea5be357ee3b8134298fb6ef..2ccc888832bc20e4084359e6dbe74c890747f75f 100644 GIT binary patch literal 2189 zcmY*ac|4SB8-B+yhAbu7JB?9xGe%4rdnC#-m^9_fKDIL(GscpAh)PG2bJRzJs1aGS zq%aBfsZ6P4DO+^NzGussDPMix^ZxGlzMlKNuIqm8=b!fi*5R1AsDdZ}0OGbbR?fVv z%MU1o_dX@Cn#@Zen)9(EKxv24IB%0kz}x!S+XI?B3tjWr`Gf>g>46k7jPL8^ zO$nu&z~THxKi7|Q(gXc|bt2QY$Knl$zlw1T2_*13^ZiXx#^0I$ zSKIDmjN~`}pTqo^^m~;zs;Q_k^5?agipskW2?GGc#Ma6J7a;U5D=@|Nq} zLaSO27+lm7Fkt2ql{KrH%k$I~Q)Kdmo&-o5Xs%&B;1efo18i-g*;rB0Ds`Gl-}B=x zPlzZ|u-3f+%5;P~*KQ@+U;3p{?AMR94jPLWUF#kC2BE=I)fsb#?yhhhY990z8;I7I z&^E*FJDfHWC*_Qrv!YzjVW%ZNdNwVRwZ_ri06=w>~-j9B-BE2x!0C0EQ~S+1Z$q>q9)h@q5fn3xx?la*p^SQwl9?d3->e>99F;NE zccK2%T*b6Xu0&!|E(yjybJibG;G|aDn&lf6ub(iBjl4DHf@Ws9l{rnAiE9nvWX;mh@NO2EIZHynRMw-cFE1l|MY3Dvh)14-d7E}AXB>c&L^++IWEd-DEi0)X&CR zcS{bEn&Ka~H6G|&%#a+B#}Y#C-I|<%&B|1oQ7X3BL|oILfl)-8l-pqiL&F9dW8y!s z?6cq(o5oq~gI_ctg){pGb$k^G72f1xwy{7J=-i;HKjOVw-}{1K_7_r~%3Q@K3T&j2 zK`q;FxvnE^vG%xr*TxllW|guu%KCx*ji%JJ^z~@e3t|5j;F0S|I{w;4|NE%K{N!-2 z<$0<3F4hg=Dv*D(_~3!naV^E6kg;p|$~nmM5j(}Bt^3`S1-Q|uT212GgNt0*&t2zY z^dkD|wR*fSok`swj4Z86cO)osZ2u*CxnplxtyaRT;rImwBZveOJG~qIM(%^ph`4Wp z^@vy0j;<#{x${%9#ldQfi3dqXXwL!^v&ELy9Lg>gq`TY-Ljh){3`}J}X{eO8QN~A$ zrbjvW_=)m~6{*Fe4TLfnc|gm-(; zFZVf)i5GU?|9OTP)v7)n**ckaC(tM-y?)jc0T!lvRb~q9URwXOplv7;V@Kkm-%7lU zaVlKkLW6dlRN}C4?-W}q`;NEXl`dT4epDc?lYN%07n(Qg1(dF=f86j3fb3~JS_J22 zy*rfhw1?62Zh!g4Z6WDm+%?Vl)WN4xX{>LoJYg{~bLC4aa%HPtXROvz{)%CWkSFK8 zIday=w@1qTx>NV<@{|ST%TnD+p#3hc9HUfax0S_Lnh&6lz)ms4P)KV@5|`0$0dv z$^kZ+t)Lh7gzDV3@1 l@|W176U5BQp6QU9SWqI_9^JhKf6f0V+a7hWDm~(v@DK1JrvLx| delta 952 zcmV;p14sOg5x)l^iBL{Q4GJ0x0000DNk~Le0000o0000o2nGNE03JVxv5~$Pe*ep$A77nmMyf=3Oy7A1rd>91%WBmZF`6cq7)*f3^F3JMXCoMq6a~% zrywh;r+O&pp@^bIDlLmZB9&I!Y0nl)je-9MgIu}ar}tj(!2Q98&T(eGbG|v}%$X6A zBuNrY`U9(hlRz!-31|mC0?m>ge+SkBlSohl%7GtJ-0xEdtOC+V0Hy*jq*xnp2`C1p z0V8GPWMBhuuM>kF0a-n1#2nzOl&JxxN9dmdYy(;~=AvBA{QetQ5%B$s#BB99N_fn&GGbgx6vII6!p+)8nzRyrjIe92YD>07GE;xWyhMo>)p~h}B|9To zVLVEdXwj&b8y7=LwP=SnX*lL3O0*7S=EWa?RLRy#cGJiBP&7)EXi%<~AG2ijk`?)! zBh=jzrMvXDj>q21f9I?HHbAoIan@L6Op12+hgKGHf)wC^l-?@YW@}?~W;F_=^c!WH ziPkmJG8`cjcqOGbDpqc(eF}%Dl+q0{;*eFco08rMa+K#=b$BY05x;<$IKnV}^>(ew zQk_9eJ0C|#1ujeJ`>I-hsckMQoT0+H11r_Z(XUGKB1bua`=xD?V-BUTiXdP;7 z1I(#!B@U5i6@lJS)2za993dUp-yt(S4s+|6@YGlam^-a?s%D+zx>ledQT|7sBuNsw a#eW4wQ*FXm4$}Jo0000 Date: Mon, 8 May 2023 22:31:13 +0100 Subject: [PATCH 17/19] widhid: fix type, add music tag --- apps/widhid/metadata.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/widhid/metadata.json b/apps/widhid/metadata.json index 4ad6e17d1..10e75fadc 100644 --- a/apps/widhid/metadata.json +++ b/apps/widhid/metadata.json @@ -6,7 +6,8 @@ "description": "Based on Swipe Bluetooth Music Controls (based on Bluetooth Music Controls). Swipe down to enable, then swipe up/down for volume, left/right for previous and next and tap for play/pause. Enable HID in settings, pair with your phone/computer, then use this widget to control music from your watch!", "icon": "icon.png", "readme": "README.md", - "tags": "widget,bluetooth", + "type": "widget", + "tags": "widget,bluetooth,music", "supports": ["BANGLEJS2"], "storage": [ {"name":"widhid.wid.js","url":"wid.js"}, From 6cca01db0b78ff4e56c6143bf9adf581f0fb01ef Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Tue, 9 May 2023 07:38:56 +0100 Subject: [PATCH 18/19] widhid: only register swipe/activation handler when connected --- apps/widhid/wid.js | 11 ++++++++--- apps/widhid/wid.ts | 14 ++++++++++---- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/apps/widhid/wid.js b/apps/widhid/wid.js index 13ccddd5f..68da78906 100644 --- a/apps/widhid/wid.js +++ b/apps/widhid/wid.js @@ -9,7 +9,7 @@ var dragging = false; var activeTimeout; var waitForRelease = true; - Bangle.on("swipe", function (_lr, ud) { + var onSwipe = (function (_lr, ud) { if (Bangle.CLKINFO_FOCUS) return; if (!activeTimeout && ud > 0) { @@ -95,6 +95,8 @@ redraw(); }, 3000); }; + var redraw = function () { return setTimeout(Bangle.drawWidgets, 50); }; + var connected = NRF.getSecurityStatus().connected; WIDGETS["hid"] = { area: "tr", sortorder: -20, @@ -105,15 +107,18 @@ ? 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: NRF.getSecurityStatus().connected ? 24 : 0, + width: connected ? 24 : 0, }; - var redraw = function () { return setTimeout(Bangle.drawWidgets, 50); }; + if (connected) + Bangle.on("swipe", onSwipe); 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) { diff --git a/apps/widhid/wid.ts b/apps/widhid/wid.ts index ed6c7b02e..3235f48b5 100644 --- a/apps/widhid/wid.ts +++ b/apps/widhid/wid.ts @@ -11,14 +11,14 @@ let activeTimeout: number | undefined; let waitForRelease = true; - Bangle.on("swipe", (_lr, ud) => { + const onSwipe = ((_lr, ud) => { if((Bangle as BangleExt).CLKINFO_FOCUS) return; if(!activeTimeout && ud! > 0){ listen(); Bangle.buzz(20); } - }); + }) satisfies SwipeCallback; const onDrag = (e => { if((Bangle as BangleExt).CLKINFO_FOCUS) return; @@ -96,6 +96,9 @@ }, 3000); }; + const redraw = () => setTimeout(Bangle.drawWidgets, 50); + + const connected = NRF.getSecurityStatus().connected; WIDGETS["hid"] = { area: "tr", sortorder: -20, @@ -109,17 +112,20 @@ this.y! + 2 ); }, - width: NRF.getSecurityStatus().connected ? 24 : 0, + width: connected ? 24 : 0, }; - const redraw = () => setTimeout(Bangle.drawWidgets, 50); + if(connected) + Bangle.on("swipe", onSwipe); NRF.on("connect", () => { WIDGETS["hid"]!.width = 24; + Bangle.on("swipe", onSwipe); redraw(); }); NRF.on("disconnect", () => { WIDGETS["hid"]!.width = 0; + Bangle.removeListener("swipe", onSwipe); redraw(); }); From abc57030adc023a66fbc9bcceac592e9acdc6b96 Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Wed, 10 May 2023 08:05:29 +0100 Subject: [PATCH 19/19] widhid: delete unused variables --- apps/widhid/wid.js | 2 ++ apps/widhid/wid.ts | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/apps/widhid/wid.js b/apps/widhid/wid.js index 68da78906..ed1e78e76 100644 --- a/apps/widhid/wid.js +++ b/apps/widhid/wid.js @@ -4,6 +4,7 @@ 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; @@ -111,6 +112,7 @@ }; if (connected) Bangle.on("swipe", onSwipe); + delete connected; NRF.on("connect", function () { WIDGETS["hid"].width = 24; Bangle.on("swipe", onSwipe); diff --git a/apps/widhid/wid.ts b/apps/widhid/wid.ts index 3235f48b5..6b5e38855 100644 --- a/apps/widhid/wid.ts +++ b/apps/widhid/wid.ts @@ -4,6 +4,8 @@ console.log("widhid: can't enable, HID setting isn't \"kbmedia\""); return; } + // @ts-ignore + delete settings; let anchor = {x:0,y:0}; let start = {x:0,y:0}; @@ -117,6 +119,8 @@ if(connected) Bangle.on("swipe", onSwipe); + // @ts-ignore + delete connected; NRF.on("connect", () => { WIDGETS["hid"]!.width = 24;