JS in the binary now uses jspExecuteJSFunctionCode which helps to skip a parsing step

JS modules that are included are now pretokenised
This commit is contained in:
Gordon Williams 2024-10-24 12:17:35 +01:00
parent 617e1a2975
commit b8634fd8e0
44 changed files with 170 additions and 113 deletions

View File

@ -63,6 +63,9 @@
Fix lexing of regex at the start of a if/loop (#2529)
ESP32: remove interrupt on/off code as it just causes a crash
ESP32: jshPinWatch now returns correct value (event ID vs pin number)
JS in the binary now uses jspExecuteJSFunctionCode which helps to skip a parsing step
JS modules that are included are now pretokenised
2v23 : Fix XON/OFF thresholds to be based off the correct buffer size
Bangle.js2: Added BANGLE2_IFLASH target for firmware using internal flash for js files (currently only partially working)

View File

@ -4537,14 +4537,14 @@ bool jswrap_banglejs_idle() {
JsVar *arr = jswrap_array_slice(v,0,0); // clone, so it's not referencing all of Tensorflow!
jsvUnLock2(v,tf);
//jsiConsolePrintf("TF queue\n");
JsVar *gesture = jspExecuteJSFunction("(function(a) {"
JsVar *gesture = jspExecuteJSFunctionCode("a",
"var m=0,g;"
"for (var i in a) if (a[i]>m) { m=a[i];g=i; }"
"if (g!==undefined) {"
"var n=require('Storage').read('.tfnames');"
"if (n) g=n.split(',')[g];"
"}"
"return g;})",NULL,1,&arr);
"return g;",0,NULL,1,&arr);
JsVar *args[2] = {gesture,arr};
jsiQueueObjectCallbacks(bangle, JS_EVENT_PREFIX"aiGesture", args, 2);
jsvUnLock2(gesture,arr);
@ -5815,7 +5815,7 @@ Load the Bangle.js clock - this has the same effect as calling `Bangle.load()`.
"type" : "staticmethod",
"class" : "Bangle",
"name" : "showRecoveryMenu",
"generate_js" : "libs/js/banglejs/Bangle_showRecoveryMenu.js",
"generate_js" : "libs/js/banglejs/Bangle_showRecoveryMenu.min.js",
"ifdef" : "BANGLEJS"
}
Show a 'recovery' menu that allows you to perform certain tasks on your Bangle.
@ -5833,7 +5833,7 @@ You can also enter this menu by restarting your Bangle while holding down the bu
"type" : "staticmethod",
"class" : "Bangle",
"name" : "showTestScreen",
"generate_js" : "libs/js/banglejs/Bangle_showTestScreen.js",
"generate_js" : "libs/js/banglejs/Bangle_showTestScreen.min.js",
"ifdef" : "BANGLEJS2"
}
(2v20 and later) Show a test screen that lights green when each sensor on the Bangle

View File

@ -148,7 +148,7 @@ JsVar *jswrap_crypto_SHAx(JsVar *message, int shaNum) {
#ifdef USE_SHA1_JS
if (shaNum==1) {
// (c) 2016 Rhys Williams, @jumjum. https://github.com/espruino/EspruinoDocs/blob/master/modules/crypto.js
return jspExecuteJSFunction("(function(b){function n(a){for(d=3;0<=d;d--)g.push(a>>8*d&255)}var d,a;b=E.toString(b)+'\\x80';var v=new Int32Array([1518500249,1859775393,2400959708,3395469782]);var k=Math.ceil((b.length/4+2)/16);var g=Array(k);b=E.toUint8Array(b);for(d=0;d<k;d++){var f=d<<6;var e=new Int32Array(16);for(a=0;16>a;a++){var c=f+(a<<2);e[a]=b[c]<<24|b[c+1]<<16|b[c+2]<<8|b[c+3]}g[d]=e}g[k-1][14]=8*(b.length-1)/Math.pow(2,32);g[k-1][14]=Math.floor(g[k-1][14]);g[k-1][15]=8*(b.length-1)&4294967295;b=1732584193;var p=4023233417;var q=2562383102;var r=271733878;var t=3285377520;var l=new Int32Array(80);for(d=0;d<k;d++){for(a=0;16>a;a++)l[a]=g[d][a];for(a=16;80>a;a++)f=l[a-3]^l[a-8]^l[a-14]^l[a-16],l[a]=f<<1|f>>>31;f=b;c=p;e=q;var h=r;var u=t;for(a=0;80>a;a++){var m=Math.floor(a/20);var w=f<<5|f>>>27;var x=0===m?c&e^~c&h:1===m?c^e^h:2===m?c&e^c&h^e&h:c^e^h;m=w+x+u+v[m]+l[a]&4294967295;u=h;h=e;e=c<<30|c>>>2;c=f;f=m}b=b+f&4294967295;p=p+c&4294967295;q=q+e&4294967295;r=r+h&4294967295;t=t+u&4294967295}g=[];n(b);n(p);n(q);n(r);n(t);return E.toUint8Array(g).buffer})",0,1,&message);
return jspExecuteJSFunctionCode("b","function n(a){for(d=3;0<=d;d--)g.push(a>>8*d&255)}var d,a;b=E.toString(b)+'\\x80';var v=new Int32Array([1518500249,1859775393,2400959708,3395469782]);var k=Math.ceil((b.length/4+2)/16);var g=Array(k);b=E.toUint8Array(b);for(d=0;d<k;d++){var f=d<<6;var e=new Int32Array(16);for(a=0;16>a;a++){var c=f+(a<<2);e[a]=b[c]<<24|b[c+1]<<16|b[c+2]<<8|b[c+3]}g[d]=e}g[k-1][14]=8*(b.length-1)/Math.pow(2,32);g[k-1][14]=Math.floor(g[k-1][14]);g[k-1][15]=8*(b.length-1)&4294967295;b=1732584193;var p=4023233417;var q=2562383102;var r=271733878;var t=3285377520;var l=new Int32Array(80);for(d=0;d<k;d++){for(a=0;16>a;a++)l[a]=g[d][a];for(a=16;80>a;a++)f=l[a-3]^l[a-8]^l[a-14]^l[a-16],l[a]=f<<1|f>>>31;f=b;c=p;e=q;var h=r;var u=t;for(a=0;80>a;a++){var m=Math.floor(a/20);var w=f<<5|f>>>27;var x=0===m?c&e^~c&h:1===m?c^e^h:2===m?c&e^c&h^e&h:c^e^h;m=w+x+u+v[m]+l[a]&4294967295;u=h;h=e;e=c<<30|c>>>2;c=f;f=m}b=b+f&4294967295;p=p+c&4294967295;q=q+e&4294967295;r=r+h&4294967295;t=t+u&4294967295}g=[];n(b);n(p);n(q);n(r);n(t);return E.toUint8Array(g).buffer",0,1,&message);
}
#endif

View File

@ -1 +1 @@
(function(){if(global.WIDGETS){var d=g.getWidth(),e=g.getHeight(),c={tl:{x:28,y:0,r:0,c:0},tr:{x:d-28,y:0,r:1,c:0},bl:{x:24,y:e-24,r:0,c:0},br:{x:d-24,y:e-24,r:1,c:0}},b,a;for(a of WIDGETS)(b=c[a.area])&&0!=a.width&&(a.x=b.x-b.r*a.width,a.y=b.y,b.x+=a.width*(1-2*b.r),b.c++);g.reset();(c.tl.c||c.tr.c)&&g.clearRect(0,0,d-1,23);(c.bl.c||c.br.c)&&g.clearRect(0,e-24,d-1,e-1);try{for(a of WIDGETS)a.draw(a)}catch(f){print(f)}}})
(ª(){£(global.WIDGETS){¬d=g.getWidth(),e=g.getHeight(),c={tl:{x:28,y:0,r:0,c:0},tr:{x:d-28,y:0,r:1,c:0},bl:{x:24,y:e-24,r:0,c:0},br:{x:d-24,y:e-24,r:1,c:0}},b,a;§(WIDGETS)(b=c[a.area])ž0Œa.widthž(a.x=b.x-b.r*a.width,a.y=b.y,b.xa.width*(1-2*b.r),b.c˜);g.reset();(c.tl.c c.tr.c)žg.clearRect(0,0,d-1,23);(c.bl.c c.br.c)žg.clearRect(0,e-24,d-1,e-1);±{§(WIDGETS)a.draw(a)}catch(f){print(f)}}})

View File

@ -1 +1 @@
(function(){if(global.WIDGETS){var d=g.getWidth(),e=g.getHeight(),c={tl:{x:0,y:0,r:0,c:0},tr:{x:d-1,y:0,r:1,c:0},bl:{x:0,y:e-24,r:0,c:0},br:{x:d-1,y:e-24,r:1,c:0}},b,a;for(a of WIDGETS)(b=c[a.area])&&0!=a.width&&(a.x=b.x-b.r*a.width,a.y=b.y,b.x+=a.width*(1-2*b.r),b.c++);g.reset();(c.tl.c||c.tr.c)&&g.clearRect(0,0,d-1,23);(c.bl.c||c.br.c)&&g.clearRect(0,e-24,d-1,e-1);try{for(a of WIDGETS)a.draw(a)}catch(f){print(f)}}})
(ª(){£(global.WIDGETS){¬d=g.getWidth(),e=g.getHeight(),c={tl:{x:0,y:0,r:0,c:0},tr:{x:d-1,y:0,r:1,c:0},bl:{x:0,y:e-24,r:0,c:0},br:{x:d-1,y:e-24,r:1,c:0}},b,a;§(WIDGETS)(b=c[a.area])ž0Œa.widthž(a.x=b.x-b.r*a.width,a.y=b.y,b.xa.width*(1-2*b.r),b.c˜);g.reset();(c.tl.c c.tr.c)žg.clearRect(0,0,d-1,23);(c.bl.c c.br.c)žg.clearRect(0,e-24,d-1,e-1);±{§(WIDGETS)a.draw(a)}catch(f){print(f)}}})

View File

@ -1 +1 @@
(function(a){Bangle.uiRemove?(Bangle.setUI(),(__FILE__=a)||(a=".bootcde"),setTimeout(eval,0,require("Storage").read(a))):load(".bootcde"!=a?a:void 0)})
(Ş(a){Bangle.uiRemove?(Bangle.setUI(),(__FILE__=a) (a=Ń.bootcde),setTimeout(eval,0,require(ŃStorage).read(a))):load(Ń.bootcdeŚa?a:Ŕ0)})

View File

@ -1 +1 @@
(function(){if(!global.WIDGETS){global.WIDGETS={};require("Storage").list(/\.wid\.js$/).forEach(a=>{try{eval(require("Storage").read(a))}catch(c){print(a,c)}});var b=WIDGETS;WIDGETS={};Object.keys(b).sort((a,c)=>(0|b[c].sortorder)-(0|b[a].sortorder)).forEach(a=>WIDGETS[a]=b[a])}})
(ª(){£(!global.WIDGETS){global.WIDGETS={};require(ÑStorage).list(/\.wid\.js$/).forEach(a¢{±{eval(require(ÑStorage).read(a))}catch(c){print(a,c)}});¬b=WIDGETS;WIDGETS={};Object.keys(b).sort((a,c)¢(0|b[c].sortorder)-(0|b[a].sortorder)).forEach(a¢WIDGETS[a]=b[a])}})

Binary file not shown.

Binary file not shown.

View File

@ -1 +1 @@
(function(){Bangle.load(".bootcde")})
(ª(){Bangle.load(Ñ.bootcde)})

View File

@ -1,2 +1 @@
(function(){let b=require("Storage").readJSON("setting.json",1)||{},c=require("Storage").read(b.launcher);if(!c){c=void 0;let d=require("Storage").list(/\.info$/).map(a=>{if((a=require("Storage").readJSON(a,1))&&"launch"==a.type)return a}).filter(a=>a).sort((a,e)=>a.sortorder-e.sortorder)[0];d&&(b.launcher=d.src,require("Storage").writeJSON("setting.json",b),c=require("Storage").read(d.src))}c?Bangle.load(b.launcher):eval('E.showMessage("No Launcher Found");setWatch(()=>{load();}, global.BTN2||BTN, {repeat:false,edge:"falling"});');
delete b;delete c})
(ª(){­b=require(ÑStorage).readJSON(Ñ setting.json,1) {},c=require(ÑStorage).read(b.launcher);£(!c){c=À0;­d=require(ÑStorage).list(/\.info$/).map(a¢{£((a=require(ÑStorage).readJSON(a,1))žÑlaunchŠa.type)«a}).filter(a¢a).sort((a,e)¢a.sortorder-e.sortorder)[0];(b.launcher=d.src,require(ÑStorage).writeJSON(Ñ setting.json,b),c=require(ÑStorage).read(d.src))}c?Bangle.load(b.launcher):eval(ÑlE.showMessage("No Launcher Found");setWatch(()=>{load();}, global.BTN2||BTN, {repeat:false,edge:"falling"}););¾b;¾c})

View File

@ -0,0 +1,6 @@
(ª(){Bangle.setUI();clearTimeout();clearInterval();clearWatch();Bangle.removeAllListeners();E.removeAllListeners();NRF.removeAllListeners();Bangle.setLCDBrightness(1);­a={"":{title:ÑRecovery},Ñ
Clean Boot:()¢{reset()},Reboot:()¢{E.reboot()},ÑTurn Off:()¢{Bangle.off()}};Ñ BANGLEJS2Šprocess.env.BOARDžObject.assign(a,{Test:Bangle.showTestScreen});Object.assign(a,{Ñ Factory Reset:()¢{E.showPrompt(Ñ(Are you sure?
This will remove all data.,{title:Ñ Factory Reset}).then(b¢{£(!b)«Bangle.showRecoveryMenu();E.showMessage(Ñ Resetting);Bangle.setLCDTimeout(0);NRF.getSecurityStatus().connected Terminal.setConsole();Bangle.factoryReset()})},Exit:()¢{0<require(ÑStorage).list().length?(E.showMessage(Ñ
Loading...),NRF.getSecurityStatus().connected Terminal.setConsole(),load()):E.reboot()},ÑAttempt Compact:()¢{E.showMessage(ÑCompacting...
May take
5 min.);NRF.getSecurityStatus().connected Terminal.setConsole();require(ÑStorage).compact();E.reboot()},ÑRewrite Bootloader:()¢{setTimeout(load,1E3);eval(require(ÑStorage).read(Ñ bootupdate.js))}});E.showMenu(a)})

View File

@ -1,2 +1,6 @@
(function(){Bangle.setUI();clearTimeout();clearInterval();clearWatch();Bangle.removeAllListeners();E.removeAllListeners();NRF.removeAllListeners();Bangle.setLCDBrightness(1);E.showMenu({"":{title:"Recovery"},"Clean Boot":()=>{reset()},Reboot:()=>{E.reboot()},"Turn Off":()=>{Bangle.off()},"Factory Reset":()=>{E.showPrompt("Are you sure?\nThis will remove all data.",{title:"Factory Reset"}).then(a=>{if(!a)return Bangle.showRecoveryMenu();E.showMessage("Resetting");Bangle.setLCDTimeout(0);
NRF.getSecurityStatus().connected||Terminal.setConsole();Bangle.factoryReset()})},Exit:()=>{0<require("Storage").list().length?(E.showMessage("Loading..."),NRF.getSecurityStatus().connected||Terminal.setConsole(),load()):E.reboot()},"Attempt Compact":()=>{E.showMessage("Compacting...\nMay take\n5 min.");NRF.getSecurityStatus().connected||Terminal.setConsole();require("Storage").compact();E.reboot()},"Rewrite Bootloader":()=>{setTimeout(load,1E3);eval(require("Storage").read("bootupdate.js"))}})})
(ª(){Bangle.setUI();clearTimeout();clearInterval();clearWatch();Bangle.removeAllListeners();E.removeAllListeners();NRF.removeAllListeners();Bangle.setLCDBrightness(1);E.showMenu({"":{title:ÑRecovery},Ñ
Clean Boot:()¢{reset()},Reboot:()¢{E.reboot()},ÑTurn Off:()¢{Bangle.off()},Ñ Factory Reset:()¢{E.showPrompt(Ñ(Are you sure?
This will remove all data.,{title:Ñ Factory Reset}).then(a¢{£(!a)«Bangle.showRecoveryMenu();E.showMessage(Ñ Resetting);Bangle.setLCDTimeout(0);NRF.getSecurityStatus().connected Terminal.setConsole();Bangle.factoryReset()})},Exit:()¢{0<require(ÑStorage).list().length?(E.showMessage(Ñ
Loading...),NRF.getSecurityStatus().connected Terminal.setConsole(),load()):E.reboot()},ÑAttempt Compact:()¢{E.showMessage(ÑCompacting...
May take
5 min.);NRF.getSecurityStatus().connected Terminal.setConsole();require(ÑStorage).compact();E.reboot()},ÑRewrite Bootloader:()¢{setTimeout(load,1E3);eval(require(ÑStorage).read(Ñ bootupdate.js))}})})

View File

@ -0,0 +1,2 @@
(ª(){ªc(a,b,e,d){k[a]=d;aš19;g.reset().clearRect(48,a,175,a+19).setFont(Ñ6x8:1x2);g.setBgColor(d?Ñ#0f0:Ñ#f00).clearRect(0,a,48,a+19);g.setFontAlign(0,0).drawString(b,24,a+10);g.setFontAlign(-1,0).drawString(e,52,a+10)}Bangle.setUI();clearInterval();clearWatch();g.clear(1);Bangle.removeAllListeners();E.removeAllListeners();Bangle.setBarometerPower(1,Ñapp);Bangle.setCompassPower(1,Ñapp);Bangle.setGPSPower(1,Ñapp);Bangle.setHRMPower(1,Ñapp);Bangle.setLCDPower(1);Bangle.setLocked(0);Bangle.setLCDTimeout(0);¬k=[];®f=Math.abs;Ñ"TS GPS HRM Baro Mag Acc Btn FW Chg.split(Ñ ).forEach((a,b)¢c(b,a,"",!1));Bangle.on(Ñtouch,(a,b)¢c(0,ÑTS,b.x+Ñ,+b.y,-25<b.-25<b.yž200>b.xž200>b.y));Bangle.on(ÑGPS,a¢c(1,ÑGPS,a.time?require(Ñlocale).time(a.time,1):Ñ--,!0));Bangle.on(ÑHRM-raw,a¢c(2,ÑHRM,a.vcPPG,0Ža.vcPPGž5E3a.vcPPG));Bangle.on(Ñpressure,a¢c(3,ÑBaro,Math.round(a.pressure),900<a.pressurež1100>a.pressure));Bangle.on(Ñmag,a¢c(4,ÑMag,a.x+Ñ,+a.y+Ñ,+a.z,5E3>f(a.x)ž5E3>Math.abs(a.y)ž5E3>Math.abs(a.z)));Bangle.on(Ñaccel,a¢c(5,ÑAcc,a.x.toFixed(1)+Ñ,+a.y.toFixed(1)+Ñ,+a.z.toFixed(1),.5>f(a.x)ž.5>f(a.y)ž-.8>a.z));setWatch(a¢c(6,ÑBtn,a.state?ÑPress:ÑReleased,!0),BTN,{edge:0,repeat:1});¬l=require(ÑStorage).read(Ñ.bootcde);c(7,ÑFW,Ñboot +(require(ÑStorage).readJSON(Ñ boot.info,1) {}).version ÑNONE,lžl.includes(ÑclockHasWidgets));setTimeout(ª(){¬a=(1E-4+analogRead(D3)+analogRead(D3)+analogRead(D3))/3,b=0,e=0;setInterval(ª(){¬d=analogRead(D3),h=13.359*d;eŸBangle.isCharging();d>(b=1);c(8,ÑChg,h.toFixed(2)+Ñv +(Bangle.isCharging()?Ñcharge:Ñ discharge),ežbž2<hž4.4>h)},500)},1E3);Bangle.on(Ñswipe,a¢{k.every(b¢b)ž(Bangle.removeAllListeners(),clearInterval(),clearWatch(),NRF.sleep(),Bangle.setBarometerPower(0,Ñapp),Bangle.setCompassPower(0,Ñapp),Bangle.setGPSPower(0,Ñapp),Bangle.setHRMPower(0,Ñapp),Bangle.setBacklight(0),Bangle.setLocked(1),g.clear(1).setFont(Ñ12x20:2).setFontAlign(0,0).drawString(Ñ TEST
PASS,88,88),require(ÑStorage).writeJSON(Ñ welcome.json,{welcomed:!1}),Bangle.setPollInterval(800),setTimeout(ª(){Bangle.off()},36E5))})})

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1,2 +1,3 @@
(function(e,a){"string"==typeof a&&(a={title:a});a=a||{};g.reset().clearRect(Bangle.appRect);g.setFont("6x8",128<g.getWidth()?2:1).setFontAlign(0,-1);var c=Bangle.appRect.y,b=g.getWidth(),d=g.getHeight()-c,k=g.getFontHeight(),f=g.wrapString(a.title,b-2);e=g.wrapString(e||"",b-2);d=c+(d+(f.length-e.length)*k)/2;if(a.img){var h=g.imageMetrics(a.img);g.drawImage(a.img,(b-h.width)/2,d-h.height/2);d+=4+h.height/2}g.drawString(e.join("\n"),b/2,d);a.title&&g.setColor(g.theme.fgH).setBgColor(g.theme.bgH).clearRect(0,
c,b-1,c+4+f.length*k).drawString(f.join("\n"),b/2,c+2);g.flip();Bangle.setLCDPower(1)})
(ª(e,a){ÑstringŠ¿(a={title:a});a=a {};g.reset().clearRect(Bangle.appRect);g.setFont(Ñ6x8,128<g.getWidth()?2:1).setFontAlign(0,-1);¬c=Bangle.appRect.y,b=g.getWidth(),d=g.getHeight()-c,k=g.getFontHeight(),f=g.wrapString(a.title,b-2);e=g.wrapString(e "",b-2);d=c+(d+(f.length-e.length)*k)/2;£(a.img){¬h=g.imageMetrics(a.img);g.drawImage(a.img,(b-h.width)/2,d-h.height/2);d4+h.height/2}g.drawString(e.join(Ñ
),b/2,d);a.titležg.setColor(g.theme.fgH).setBgColor(g.theme.bgH).clearRect(0,c,b-1,c+4+f.length*k).drawString(f.join(Ñ
),b/2,c+2);g.flip();Bangle.setLCDPower(1)})

View File

@ -1,3 +1,3 @@
(function(u,a){function n(){g.reset().setFont("6x8",2).setFontAlign(0,-1);var f=Bangle.appRect.y,e=g.getWidth(),k=g.getHeight()-f,q=g.getFontHeight(),p=g.wrapString(a.title,e-2),r=g.wrapString(u||"",e-2),b=f+(k+(p.length-r.length)*q)/2-24;a.img&&(k=g.imageMetrics(a.img),g.drawImage(a.img,(e-k.width)/2,b-k.height/2),b+=4+k.height/2);p&&g.setColor(g.theme.fgH).setBgColor(g.theme.bgH).clearRect(0,f,e-1,f+4+p.length*q).drawString(p.join("\n"),e/2,f+2);g.setColor(g.theme.fg).setBgColor(g.theme.bg).drawString(r.join("\n"),
e/2,b);b+=r.length*q+32;var l=0;g.setFontAlign(0,0);m.forEach(h=>l+=16+g.stringWidth(h));l>e&&(g.setFont("6x8"),l=0,m.forEach(h=>l+=16+g.stringWidth(h)));var c=(e-l)/2;m.forEach((h,v)=>{var t=g.stringWidth(h);c+=(16+t)/2;var d=2+t/2;d=[c-d,b-12,c+d,b-12,c+d+4,b-8,c+d+4,b+8,c+d,b+12,c-d,b+12,c-d-4,b+8,c-d-4,b-8,c-d,b-12];g.setColor(v==a.selected?g.theme.bgH:g.theme.bg).fillPoly(d).setColor(v==a.selected?g.theme.fgH:g.theme.fg).drawPoly(d).drawString(h,c,b+1);c+=(16+t)/2});Bangle.setLCDPower(1)}a||
(a={});a.buttons||(a.buttons={Yes:!0,No:!1});var m=Object.keys(a.buttons);a.selected||(a.selected=0);g.reset().clearRect(Bangle.appRect);if(!u)return Bangle.setUI(),Promise.resolve();n();return new Promise(f=>{Bangle.setUI({mode:"leftright",remove:a.remove,redraw:n,back:a.back},e=>{0>e?0<a.selected&&(a.selected--,n()):0<e?a.selected<m.length-1&&(a.selected++,n()):(E.showPrompt(),f(a.buttons[m[a.selected]]))})})})
(ª(u,a){ªn(){g.reset().setFont(Ñ6x8,2).setFontAlign(0,-1);¬f=Bangle.appRect.y,e=g.getWidth(),k=g.getHeight()-f,q=g.getFontHeight(),p=g.wrapString(a.title,e-2),r=g.wrapString(u "",e-2),b=f+(k+(p.length-r.length)*q)/2-24;a.imgž(k=g.imageMetrics(a.img),g.drawImage(a.img,(e-k.width)/2,b-k.height/2),b4+k.height/2);g.setColor(g.theme.fgH).setBgColor(g.theme.bgH).clearRect(0,f,e-1,f+4+p.length*q).drawString(p.join(Ñ
),e/2,f+2);g.setColor(g.theme.fg).setBgColor(g.theme.bg).drawString(r.join(Ñ
),e/2,b);br.length*q+32;¬l=0;g.setFontAlign(0,0);m.forEach(h¢l16+g.stringWidth(h));l>(g.setFont(Ñ6x8),l=0,m.forEach(h¢l16+g.stringWidth(h)));¬c=(e-l)/2;m.forEach((h,v)¢{¬t=g.stringWidth(h);c(16+t)/2;¬d=2+t/2;d=[c-d,b-12,c+d,b-12,c+d+4,b-8,c+d+4,b+8,c+d,b+12,c-d,b+12,c-d-4,b+8,c-d-4,b-8,c-d,b-12];g.setColor(vŠa.selected?g.theme.bgH:g.theme.bg).fillPoly(d).setColor(vŠa.selected?g.theme.fgH:g.theme.fg).drawPoly(d).drawString(h,c,b+1);c(16+t)/2});Bangle.setLCDPower(1)}a (a={});a.buttons (a.buttons={Yes:!0,No:!1});¬m=Object.keys(a.buttons);a.selected (a.selected=0);g.reset().clearRect(Bangle.appRect);£(!u)«Bangle.setUI(),Promise.resolve();n();«¸Promise(f¢{Bangle.setUI({mode:Ñ leftright,remove:a.remove,redraw:n,back:a.back},e¢{0>e?0<a.selectedž(a.selected,n()):0<e?a.selected<m.length-1ž(a.selected˜,n()):(E.showPrompt(),f(a.buttons[m[a.selected]]))})})})

View File

@ -1,3 +1,3 @@
(function(x,d){function r(n){g.reset().setFont("6x8:2").setFontAlign(0,-1);var h=Bangle.appRect.y,c=g.getWidth(),f=g.getHeight()-h,k=g.getFontHeight(),p=g.wrapString(d.title,c-2),t=g.wrapString(x||"",c-2),a=h+(f+(p.length-t.length)*k)/2-24;d.img&&(f=g.imageMetrics(d.img),g.drawImage(d.img,(c-f.width)/2,a-f.height/2),a+=4+f.height/2);p&&g.setColor(g.theme.fgH).setBgColor(g.theme.bgH).clearRect(0,h,c-1,h+4+p.length*k).drawString(p.join("\n"),c/2,h+2);g.setColor(g.theme.fg).setBgColor(g.theme.bg).drawString(t.join("\n"),
c/2,a);a+=t.length*k+32;var m=0;g.setFontAlign(0,0);q.forEach(l=>m+=24+g.stringWidth(l));m>c&&(g.setFont("6x8"),m=0,q.forEach(l=>m+=24+g.stringWidth(l)));var b=(c-m)/2;u=[];q.forEach((l,y)=>{var v=g.stringWidth(l);b+=(24+v)/2;var e=6+v/2,w=[b-e,a-16,b+e,a-16,b+e+4,a-12,b+e+4,a+12,b+e,a+16,b-e,a+16,b-e-4,a+12,b-e-4,a-12,b-e,a-16];u.push({x1:b-e-12,x2:b+e+12,y1:a-30,y2:a+30,poly:w});g.setColor(y===n?g.theme.bgH:g.theme.bg2).fillPoly(w).setColor(y===n?g.theme.fgH:g.theme.fg2).drawPoly(w).drawString(l,
b,a+1);b+=(24+v)/2});Bangle.setLCDPower(1)}d||(d={});d.buttons||(d.buttons={Yes:!0,No:!1});var q=Object.keys(d.buttons),u;g.reset().clearRect(Bangle.appRect);if(!x)return Bangle.setUI(),Promise.resolve();r();return new Promise(n=>{Bangle.setUI({mode:"custom",remove:d.remove,redraw:r,back:d.back,touch:(h,c)=>{u.forEach((f,k)=>{c.x>f.x1&&c.x<f.x2&&c.y>f.y1&&c.y<f.y2&&(r(k),g.flip(),E.showPrompt(),n(d.buttons[q[k]]))})}})})})
(ª(x,d){ªr(n){g.reset().setFont(Ñ6x8:2).setFontAlign(0,-1);¬h=Bangle.appRect.y,c=g.getWidth(),f=g.getHeight()-h,k=g.getFontHeight(),p=g.wrapString(d.title,c-2),t=g.wrapString(x "",c-2),a=h+(f+(p.length-t.length)*k)/2-24;d.imgž(f=g.imageMetrics(d.img),g.drawImage(d.img,(c-f.width)/2,a-f.height/2),a4+f.height/2);g.setColor(g.theme.fgH).setBgColor(g.theme.bgH).clearRect(0,h,c-1,h+4+p.length*k).drawString(p.join(Ñ
),c/2,h+2);g.setColor(g.theme.fg).setBgColor(g.theme.bg).drawString(t.join(Ñ
),c/2,a);at.length*k+32;¬m=0;g.setFontAlign(0,0);q.forEach(l¢m24+g.stringWidth(l));m>(g.setFont(Ñ6x8),m=0,q.forEach(l¢m24+g.stringWidth(l)));¬b=(c-m)/2;u=[];q.forEach((l,y)¢{¬v=g.stringWidth(l);b(24+v)/2;¬e=6+v/2,w=[b-e,a-16,b+e,a-16,b+e+4,a-12,b+e+4,a+12,b+e,a+16,b-e,a+16,b-e-4,a+12,b-e-4,a-12,b-e,a-16];u.push({x1:b-e-12,x2:b+e+12,y1:a-30,y2:a+30,poly:w});g.setColor(yn?g.theme.bgH:g.theme.bg2).fillPoly(w).setColor(yn?g.theme.fgH:g.theme.fg2).drawPoly(w).drawString(l,b,a+1);b(24+v)/2});Bangle.setLCDPower(1)}d (d={});d.buttons (d.buttons={Yes:!0,No:!1});¬q=Object.keys(d.buttons),u;g.reset().clearRect(Bangle.appRect);£(!x)«Bangle.setUI(),Promise.resolve();r();«¸Promise(n¢{Bangle.setUI({mode:Ñcustom,remove:d.remove,redraw:r,back:d.back,touch:(h,c)¢{u.forEach((f,k)¢{c.x>f.x1žc.x<f.x2žc.y>f.y1žc.y<f.y2ž(r(k),g.flip(),E.showPrompt(),n(d.buttons[q[k]]))})}})})})

View File

@ -1,3 +1 @@
(function(a){if(!a)return Bangle.setUI();var p=function(f){g.reset();var b=Math.floor((h-a.h)/2)-c.scroll*a.h,k=b+a.c*a.h;k<=h&&(b+=h-k);0<b&&(b=0);k=b;for(var l=0;l<a.c;l++)(void 0===f||f===l)&&b>-a.h+1&&b<h&&(g.setColor(l==c.scroll?g.theme.fgH:g.theme.fg).setBgColor(l==c.scroll?g.theme.bgH:g.theme.bg).setClipRect(d,e+Math.max(0,b),d+m-1,e+Math.min(h,b+a.h)-1),a.draw(l,{x:d,y:e+b,w:m,h:a.h},l==c.scroll)||l==c.scroll&&g.setColor(g.theme.fgH).drawRect(d,e+b,d+m-1,e+b+a.h-1).drawRect(d+
1,e+b+1,d+m-2,e+b+a.h-2)),b+=a.h;g.setClipRect(d,e,d+m-1,e+h-1);f=m/2;0>k&&(k=[d+f,e,d+f-14,e+14,d+f+14,e+14],g.setColor(g.theme.fg).fillPoly(k).setColor(g.theme.bg).drawPoly(k,!0));b>h&&(k=[d+f,e+h,d+f-14,e+h-14,d+f+14,e+h-14],g.setColor(g.theme.fg).fillPoly(k).setColor(g.theme.bg).drawPoly(k,!0))};Bangle.setUI({mode:"updown",back:a.back,remove:a.remove,redraw:p},f=>{f?(c.scroll+=f,0>c.scroll&&(c.scroll=a.c-1),c.scroll>=a.c&&(c.scroll=0),c.draw()):a.select(c.scroll)});var n=Bangle.appRect,m=n.w,
h=n.h,d=n.x,e=n.y,c={scroll:0|a.scroll,draw:p,drawItem:f=>p(f),isActive:()=>Bangle.uiRedraw==p};g.reset().clearRect(n);c.draw();return c})
(ª(a){£(!a)«Bangle.setUI();¬p=ª(f){g.reset();¬b=Math.floor((h-a.h)/2)-c.scroll*a.h,k=b+a.c*a.h;kŽhž(bh-k);0<(b=0);k=b;§(¬l=0;l<a.c;l˜)(À0f fl)žb>-a.h+1žb<(g.setColor(lŠc.scroll?g.theme.fgH:g.theme.fg).setBgColor(lŠc.scroll?g.theme.bgH:g.theme.bg).setClipRect(d,e+Math.max(0,b),d+m-1,e+Math.min(h,b+a.h)-1),a.draw(l,{x:d,y:e+b,w:m,h:a.h},lŠc.scroll) lŠc.scrollžg.setColor(g.theme.fgH).drawRect(d,e+b,d+m-1,e+b+a.h-1).drawRect(d+1,e+b+1,d+m-2,e+b+a.h-2)),ba.h;g.setClipRect(d,e,d+m-1,e+h-1);f=m/2;0>(k=[d+f,e,d+f-14,e+14,d+f+14,e+14],g.setColor(g.theme.fg).fillPoly(k).setColor(g.theme.bg).drawPoly(k,!0));b>(k=[d+f,e+h,d+f-14,e+h-14,d+f+14,e+h-14],g.setColor(g.theme.fg).fillPoly(k).setColor(g.theme.bg).drawPoly(k,!0))};Bangle.setUI({mode:Ñupdown,back:a.back,remove:a.remove,redraw:p},f¢{f?(c.scrollf,0>c.scrollž(c.scroll=a.c-1),c.scrolla.(c.scroll=0),c.draw()):a.select(c.scroll)});¬n=Bangle.appRect,m=n.w,h=n.h,d=n.x,e=n.y,c={scroll:0|a.scroll,draw:p,drawItem:f¢p(f),isActive:()¢Bangle.uiRedrawŠp};g.reset().clearRect(n);c.draw();«c})

View File

@ -1,3 +1 @@
(function(d){function k(a){return a*d.h+b.y-f}function l(a){return Math.floor((a+f-b.y)/d.h)}if(!d)return Bangle.setUI();var n=()=>{g.reset().clearRect(b).setClipRect(b.x,b.y,b.x2,b.y2);for(var a=l(b.y),c=Math.min(l(b.y2),d.c-1);a<=c;a++)d.draw(a,{x:b.x,y:k(a),w:b.w,h:d.h});g.setClipRect(0,0,g.getWidth()-1,g.getHeight()-1)};Bangle.setUI({mode:"custom",back:d.back,remove:d.remove,redraw:n,drag:a=>{var c=a.dy;e.scroll-c>m&&(c=e.scroll-m);e.scroll-c<h&&(c=e.scroll-h);e.scroll-=
c;c=f;f=e.scroll&-2;if(c-=f){g.reset().setClipRect(b.x,b.y,b.x2,b.y2).scroll(0,c);a=a.dy;if(0>a)for(a=Math.max(b.y2-(1-a),b.y),g.setClipRect(b.x,a,b.x2,b.y2),c=l(a),a=k(c);a<b.y2;)d.draw(c,{x:b.x,y:a,w:b.w,h:d.h}),c++,a+=d.h;else for(a=Math.min(b.y+a,b.y2),g.setClipRect(b.x,b.y,b.x2,a),c=l(a),a=k(c);a>b.y-d.h;)d.draw(c,{x:b.x,y:a,w:b.w,h:d.h}),a-=d.h,c--;g.setClipRect(0,0,g.getWidth()-1,g.getHeight()-1)}},touch:(a,c)=>{if(!(c.y<b.y-4)){a=l(c.y);var p=c.y+f-b.y-a*d.h;163<c.y&&163<k(a)&&(a--,p=d.h-
1);(0>h||0<=a)&&a<d.c&&d.select(a,{x:c.x,y:p,type:c.type})}}});var b=Bangle.appRect,h=0|d.scrollMin,m=d.h*d.c-b.h;m<h&&(m=h);var e={scroll:E.clip(0|d.scroll,h,m),draw:n,drawItem:a=>{var c=k(a);g.reset().setClipRect(b.x,Math.max(c,b.y),b.x2,Math.min(c+d.h,b.y2));d.draw(a,{x:b.x,y:c,w:b.w,h:d.h});g.setClipRect(0,0,g.getWidth()-1,g.getHeight()-1)},isActive:()=>Bangle.uiRedraw==n},f=e.scroll&-2;e.draw();g.flip();return e})
(ª(d){ªk(a){«a*d.h+b.y-f}ªl(a){«Math.floor((a+f-b.y)/d.h)}£(!d)«Bangle.setUI();¬n=()¢{g.reset().clearRect(b).setClipRect(b.x,b.y,b.x2,b.y2);§(¬a=l(b.y),c=Math.min(l(b.y2),d.c-1);aŽc;a˜)d.draw(a,{x:b.x,y:k(a),w:b.w,h:d.h});g.setClipRect(0,0,g.getWidth()-1,g.getHeight()-1)};Bangle.setUI({mode:Ñcustom,back:d.back,remove:d.remove,redraw:n,drag:a¢{¬c=a.dy;e.scroll-c>(c=e.scroll-m);e.scroll-c<(c=e.scroll-h);e.scrollc;c=f;f=e.scroll&-2;£(cf){g.reset().setClipRect(b.x,b.y,b.x2,b.y2).scroll(0,c);a=a.dy;£(0>a)§(a=Math.max(b.y2-(1-a),b.y),g.setClipRect(b.x,a,b.x2,b.y2),c=l(a),a=k(c);a<b.y2;)d.draw(c,{x:b.x,y:a,w:b.w,h:d.h}),c˜,ad.h;¤§(a=Math.min(b.y+a,b.y2),g.setClipRect(b.x,b.y,b.x2,a),c=l(a),a=k(c);a>b.y-d.h;)d.draw(c,{x:b.x,y:a,w:b.w,h:d.h}),ad.h,c;g.setClipRect(0,0,g.getWidth()-1,g.getHeight()-1)}},touch:(a,c)¢{£(!(c.y<b.y-4)){a=l(c.y);¬p=c.y+f-b.y-a*d.h;163<c.yž163<k(a)ž(a,p=d.h-1);(0>h 0Ža)ža<d.cžd.select(a,{x:c.x,y:p,type:c.type})}}});¬b=Bangle.appRect,h=0|d.scrollMin,m=d.h*d.c-b.h;m<(m=h);¬e={scroll:E.clip(0|d.scroll,h,m),draw:n,drawItem:a¢{¬c=k(a);g.reset().setClipRect(b.x,Math.max(c,b.y),b.x2,Math.min(c+d.h,b.y2));d.draw(a,{x:b.x,y:c,w:b.w,h:d.h});g.setClipRect(0,0,g.getWidth()-1,g.getHeight()-1)},isActive:()¢Bangle.uiRedrawŠn},f=e.scroll&-2;e.draw();g.flip();«e})

View File

@ -1 +1 @@
(function(){return{_v:!1,read:function(){return this._v},set:function(){this.write(1)},reset:function(){this.write(0)},write:function(a){g.setColor((this._v=!!a)?"#f00":g.theme.bg).fillCircle((g.getWidth()-20)/2,5,5);Bangle.setLCDPower(1)},toggle:function(){this.write(!this._v)}}})
(ª(){«{_v:!1,read:ª(){«¯._v},set:ª(){¯.write(1)},reset:ª(){¯.write(0)},write:ª(a){g.setColor((¯._v=!!a)?Ñ#f00:g.theme.bg).fillCircle((g.getWidth()-20)/2,5,5);Bangle.setLCDPower(1)},toggle:ª(){¯.write(!¯._v)}}})

View File

@ -1 +1 @@
(function(){return{_v:!1,read:function(){return this._v},set:function(){this.write(1)},reset:function(){this.write(0)},write:function(a){g.setColor((this._v=!!a)?"#0f0":g.theme.bg).fillCircle((g.getWidth()+20)/2,5,5);Bangle.setLCDPower(1)},toggle:function(){this.write(!this._v)}}})
(ª(){«{_v:!1,read:ª(){«¯._v},set:ª(){¯.write(1)},reset:ª(){¯.write(0)},write:ª(a){g.setColor((¯._v=!!a)?Ñ#0f0:g.theme.bg).fillCircle((g.getWidth()+20)/2,5,5);Bangle.setLCDPower(1)},toggle:ª(){¯.write(!¯._v)}}})

View File

@ -1,3 +1 @@
function e(a,b){void 0===b&&(b=1);return a.toFixed(Math.min(b,b-Math.floor(Math.log(a)/Math.log(10))))}function f(){void 0===g&&(g=(require("Storage").readJSON("setting.json",1)||{})["12hour"]);return g}var g;exports={name:"system",currencySym:"\xa3",translate:a=>a,date:(a,b)=>b?("0"+a.getDate()).substr(-2)+"/"+("0"+(a.getMonth()+1)).substr(-2)+"/"+a.getFullYear():a.toString().substr(4,11).trim(),time:(a,b)=>{var c=a.getHours(),d=a.getMinutes();f()&&(c=0==c%12?12:c%12);
return(" "+c).substr(-2)+":"+("0"+d).substr(-2)+(b?"":"."+("0"+a.getSeconds()).substr(-2))},dow:(a,b)=>"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" ")[a.getDay()].substr(0,b?3:10),month:(a,b)=>"January February March April May June July August September October November December".split(" ")[a.getMonth()].substr(0,b?3:10),number:(a,b)=>{null==b&&(b=2);var c=a.toFixed(b),d=c|0;a=0>a?1:0;b=(""+Math.abs(c-d).toFixed(b)).substr(2,b);d=""+d;c=d.length;for(var h="";(c-=3)>a;)h=","+
d.substr(c,3)+h;return d.substr(0,c+3)+h+(b?"."+b:"")},currency:a=>{console.log("Warning: Currency information is deprecated");return"\xa3"+a.toFixed(2)},distance:(a,b)=>1E3>a?e(a,b)+"m":e(a/1E3,b)+"km",speed:(a,b)=>e(a/1.60934,b)+"mph",temp:(a,b)=>e(a,b)+"'C",meridian:(a,b)=>b||f()?12>=a.getHours()?"am":"pm":"",is12Hours:f}
ªe(a,b){À0(b=1);«a.toFixed(Math.min(b,b-Math.floor(Math.log(a)/Math.log(10))))}ªf(){À0(g=(require(ÑStorage).readJSON(Ñ setting.json,1) {})[Ñ12hour]);«g}¬g;exports={name:Ñsystem,currencySym:Ñ£,translate:a¢a,date:(a,b)¢b?(Ñ0+a.getDate()).substr(-2)+Ñ/+(Ñ0+(a.getMonth()+1)).substr(-2)+Ñ/+a.getFullYear():a.toString().substr(4,11).trim(),time:(a,b)¢{¬c=a.getHours(),d=a.getMinutes();f()ž(c=0Šc%12?12:c%12);«(Ñ +c).substr(-2)+Ñ:+(Ñ0+d).substr(-2)+(b?"":Ñ.+(Ñ0+a.getSeconds()).substr(-2))},dow:(a,b)¢Ñ8Sunday Monday Tuesday Wednesday Thursday Friday Saturday.split(Ñ )[a.getDay()].substr(0,b?3:10),month:(a,b)¢ÑUJanuary February March April May June July August September October November December.split(Ñ )[a.getMonth()].substr(0,b?3:10),number:(a,b)¢{Šbž(b=2);¬c=a.toFixed(b),d=c|0;a=0>a?1:0;b=(""+Math.abs(c-d).toFixed(b)).substr(2,b);d=""+d;c=d.length;§(¬h="";(c3)>a;)h=Ñ,+d.substr(c,3)+h;«d.substr(0,c+3)+h+(b?Ñ.+b:"")},currency:a¢{console.log(Ñ+Warning: Currency information is deprecated);«Ñ£+a.toFixed(2)},distance:(a,b)¢1E3>a?e(a,b)+Ñm:e(a/1E3,b)+Ñkm,speed:(a,b)¢e(a/1.60934,b)+Ñmph,temp:(a,b)¢e(a,b)+Ñ'C,meridian:(a,b)¢b f()?12a.getHours()?Ñam:Ñpm:"",is12Hours:f}

View File

@ -1 +1 @@
(function(){if(global.WIDGETS){var b=-4,a;for(a of WIDGETS)b+=a.width+4;b=119-b/2;g.reset();for(a of WIDGETS)a.x=b,a.y=26,b+=a.width+4,a.draw(a);g.reset()}})
(ª(){£(global.WIDGETS){¬b=-4,a;§(aÆWIDGETS)ba.width+4;b=119-b/2;g.reset();§(WIDGETS)a.x=b,a.y=26,ba.width+4,a.draw(a);g.reset()}})

View File

@ -1 +1 @@
(function(b,c){Bangle.btnWatches&&(Bangle.btnWatches.forEach(a=>{try{clearWatch(a)}catch(d){}}),delete Bangle.btnWatches)})
(ª(b,c){Bangle.btnWatchesž(Bangle.btnWatches.forEach(a¢{±{clearWatch(a)}catch(d){}}),¾Bangle.btnWatches)})

Binary file not shown.

View File

@ -1,2 +1,2 @@
(function(a,b,c){g.clear(1).setColor("#305080");g.fillArc(.285*-Math.PI,.285*Math.PI,96);g.fillArc(Math.PI*(1-.285),1.285*Math.PI,96);g.fillRect(41,62,195,62);g.fillRect(41,175,195,175);g.setColor(-1);var d=require("locale"),e=g.getWidth(),f=g.getHeight();b&&(b=d.translate(b),g.setFontGrotesk16().setFontAlign(0,-1,0).setBgColor("#305080").drawString(E.decodeUTF8(b),119,42).setBgColor(0));c&&g.setBgColor(cBorderBg).drawImage(c.img,c.x,c.y);g.setFontGrotesk20().setFontAlign(0,0,0);a=a.split("\n");
var h=11+(f-22*a.length)/2;a.forEach((k,l)=>g.drawString(E.decodeUTF8(d.translate(k)),e/2,h+22*l));g.flip()})
(Ş(a,c,b){g.clear(1).setColor(Ń#305080);g.fillArc(.285*-Math.PI,.285*Math.PI,96);g.fillArc(Math.PI*(1-.285),1.285*Math.PI,96);g.fillRect(41,62,195,62);g.fillRect(41,175,195,175);g.setColor(-1);¬d=g.getWidth(),e=g.getHeight();g.setFontGrotesk16().setFontAlign(0,-1,0).setBgColor(Ń#305080).drawString(E.decodeUTF8(c),119,42).setBgColor(0);g.setBgColor(cBorderBg).drawImage(b.img,b.x,b.y);g.setFontGrotesk20().setFontAlign(0,0,0);a=a.split(Ń
);¬f=11+(e-22*a.length)/2;a.forEach((h,k)˘g.drawString(E.decodeUTF8(h),d/2,f+22*k));g.flip()})

View File

@ -1,4 +1,2 @@
(function(r,a){function q(){g.reset();g.setColor("#305080");g.fillArc(.285*-Math.PI,.285*Math.PI,96);g.fillArc(Math.PI*(1-.285),1.285*Math.PI,96);g.fillRect(41,62,195,62);g.fillRect(41,175,195,175);g.setColor(-1);var n=g.getWidth();g.getHeight();var e=a.title;e&&(e=l.translate(e),g.setFontGrotesk16().setFontAlign(0,-1,0).setBgColor("#305080").drawString(e,119,42).setBgColor(0));(e=a.icon)&&g.setBgColor("#305080").drawImage(e.img,e.x,e.y);g.setFontGrotesk16().setFontAlign(0,
0,0);e=r.split("\n");var u=105-16*e.length/2;e.forEach((c,m)=>g.drawString(l.translate(c),n/2,u+16*m));var t=0,p,f,h;if(a.vstack){var b=120;var d=172-18*k.length;k.forEach((c,m)=>{c=l.translate(c);f=50;h=[b-f-4,d-9,b+f+4,d-9,b+f+4,d+9,b-f-4,d+9];g.setColor(m==a.selected?"#304060":0).fillPoly(h).setColor(-1).drawPoly(h,1).setFontGrotesk14().drawString(c,b,d+1);d+=18})}else k.forEach(c=>t+=16+g.stringWidth(l.translate(c))),b=(n-t)/2,d=150,k.forEach((c,m)=>{c=l.translate(c);p=g.stringWidth(c);b+=(16+
p)/2;f=2+p/2;h=[b-f-4,d-10,b+f+4,d-10,b+f+4,d+10,b-f-4,d+10];g.setColor(m==a.selected?"#304060":0).fillPoly(h).setColor(-1).drawPoly(h,1).drawString(c,b,d+1);b+=(16+p)/2});g.setColor(-1).flip()}global.Dickens||(Dickens={});a||(a={});a.buttons||(a.buttons={Yes:!0,No:!1});var l=require("locale"),k=Object.keys(a.buttons);a.selected||(a.selected=0);void 0===a.vstack&&(a.vstack=1);Bangle.setUI();g.clear(1);Dickens.buttonIcons=["select",null,"down","up"];if(!r)return Promise.resolve();q();Dickens.loadSurround&&
Dickens.loadSurround();return new Promise(n=>{Bangle.btnWatches=[setWatch(function(){0<a.selected&&(a.selected--,q())},BTN4,{repeat:1}),setWatch(function(){a.selected<k.length-1&&(a.selected++,q())},BTN3,{repeat:1}),setWatch(function(){E.showPrompt();Bangle.setUI();n(a.buttons[k[a.selected]])},BTN1,{repeat:1})]})})
(Ş(q,a){Şp(){g.reset();g.setColor(Ń#305080);g.fillArc(.285*-Math.PI,.285*Math.PI,96);g.fillArc(Math.PI*(1-.285),1.285*Math.PI,96);g.fillRect(41,62,195,62);g.fillRect(41,175,195,175);g.setColor(-1);¬m=g.getWidth();g.getHeight();¬e=a.title;ežg.setFontGrotesk16().setFontAlign(0,-1,0).setBgColor(Ń#305080).drawString(e,119,42).setBgColor(0);(e=a.icon)žg.setBgColor(Ń#305080).drawImage(e.img,e.x,e.y);g.setFontGrotesk16().setFontAlign(0,0,0);e=q.split(Ń
);¬t=105-16*e.length/2;e.forEach((f,l)˘g.drawString(f,m/2,t+16*l));¬r=0,n,d,h;Ł(a.vstack){¬b=120;¬c=172-18*k.length;k.forEach((f,l)˘{d=50;h=[b-d-4,c-9,b+d+4,c-9,b+d+4,c+9,b-d-4,c+9];g.setColor(lŠa.selected?Ń#304060:0).fillPoly(h).setColor(-1).drawPoly(h,1).setFontGrotesk14().drawString(f,b,c+1);c18})}¤k.forEach(f˘r16+g.stringWidth(f)),b=(m-r)/2,c=150,k.forEach((f,l)˘{n=g.stringWidth(f);b(16+n)/2;d=2+n/2;h=[b-d-4,c-10,b+d+4,c-10,b+d+4,c+10,b-d-4,c+10];g.setColor(lŠa.selected?Ń#304060:0).fillPoly(h).setColor(-1).drawPoly(h,1).drawString(f,b,c+1);b(16+n)/2});g.setColor(-1).flip()}global.Dickens (Dickens={});a (a={});a.buttons (a.buttons={Yes:!0,No:!1});¬k=Object.keys(a.buttons);a.selected (a.selected=0);Ŕ0a.vstackž(a.vstack=1);Bangle.setUI();g.clear(1);Dickens.buttonIcons=[Ńselect,,Ńdown,Ńup];Ł(!q)«Promise.resolve();p();Dickens.loadSurroundžDickens.loadSurround();«¸Promise(m˘{Bangle.btnWatches=[setWatch(Ş(){0<a.selectedž(a.selected,p())},BTN4,{repeat:1}),setWatch(Ş(){a.selected<k.length-1ž(a.selected<EFBFBD>,p())},BTN3,{repeat:1}),setWatch(Ş(){E.showPrompt();Bangle.setUI();m(a.buttons[k[a.selected]])},BTN1,{repeat:1})]})})

View File

@ -1,10 +1,3 @@
var p=V8,z=D6,q=V9,r=D25,t=D26,u=V10,v=V11,A=V12,B=D22,w=[V13,V14,V15],x=D23,C=D24,D=D17,F=D28,y=V4,g=D27,k=D29,c=new I2C;c.setup({sda:7,scl:8,bitrate:4E5});exports.I2C=c;var l=new I2C;l.setup({sda:14,scl:15,bitrate:4E5});exports.I2CE=l;exports.onAcceleration=function(a){a?(this.accel||(this.accel=require("LIS2DH12").connectI2C(l)),this.accel.callback=a,this.accel.setPowerMode("low")):(this.accel&&this.accel.setPowerMode("powerdown"),this.accel=void 0)};exports.getAcceleration=
function(a){this.accel?this.accel.readXYZ(a):require("LIS2DH12").connectI2C(l).readXYZ(a)};exports.onMPU=function(a){a?this.mpu?this.mpu.callback=a:(p.set(),this.mpu=require("MPU9250").connectI2C(c),this.mpu.samplerate=10,this.mpu.callback=a,this.mpu.watch=setWatch(function(){this.mpu.callback(this.mpu.read())}.bind(this),z,{repeat:1,edge:"rising"}),setTimeout(this.mpu.initMPU9250.bind(this.mpu),10)):(this.mpu&&clearWatch(this.mpu.watch),p.reset(),this.mpu=void 0)};exports.getMPU=function(a){if(this.mpu)a(this.mpu.read());
else this.onMPU(function(b){this.onMPU();a(b)}.bind(this))};exports.onPressure=function(a){a?(this.pressure||(this.pressure=require("LPS22HB").connectI2C(c,{int:x}),this.pressure.on("data",function(b){this.pressureCallback(b)}.bind(this))),this.pressureCallback=a):(this.pressure&&this.pressure.stop(),this.pressureCallback=this.pressure=void 0)};exports.getPressure=function(a){if(this.pressure)this.pressure.read(a);else{var b=require("LPS22HB").connectI2C(c,{int:x});b.read(function(d){b.stop();a(d)})}};
exports.onHumidity=function(a){a?(this.humidity||(this.humidity=require("HTS221").connect(c,{int:C}),this.humidity.on("data",function(b){this.humidityCallback(b)}.bind(this))),this.humidityCallback=a):(this.humidity&&this.humidity.stop(),this.humidityCallback=this.humidity=void 0)};exports.getHumidity=function(a){if(this.humidity)this.humidity.read(a);else this.onHumidity(function(b){this.onHumidity();a(b)}.bind(this))};exports.onGas=function(a){a?(this.gas||(u.set(),v.set(),A.reset(),this.gas=require("CCS811").connectI2C(c,
{int:B}),this.gas.on("data",function(b){this.gasCallback(b)}.bind(this))),this.gasCallback=a):(this.gas&&(this.gas.stop(),v.reset(),u.reset()),this.gasCallback=this.gas=void 0)};exports.getGas=function(a){if(this.gas)a(this.gas.get());else this.onGas(function(b){this.onGas();a(b)}.bind(this))};exports.onColor=function(a){a?(this.color||(digitalWrite(w,0),this.color=require("BH1745").connectI2C(c),this.colorInt=setInterval(function(){this.colorCallback(this.color.read())}.bind(this),200)),this.colorCallback=
a):(this.color&&(clearInterval(this.colorInt),this.color.stop(),digitalWrite(w,7)),this.colorCallback=this.colorInt=this.color=void 0)};exports.getColor=function(a){if(this.color)a(this.color.read());else this.onColor(function(b){this.onColor();a(b)}.bind(this))};exports.getBattery=function(a){y.set();var b={charging:D.read(),voltage:E.getAnalogVRef()*analogRead(F)*1500/180};y.reset();a&&a(b);return b};exports.sound=function(a,b,d){this.sounds||(this.sounds=0);if(2<this.sounds)throw Error("Too many sounds playing at once");
var e=new Waveform(a.length);e.buffer.set(a);e.on("finish",function(h){this.sounds--;this.sounds||(k.reset(),digitalWrite(g,0));d&&d()}.bind(this));this.sounds||(analogWrite(g,.5,{freq:4E4}),k.set());this.sounds++;e.startOutput(g,b)};exports.beep=function(a,b){b=0<b?b:250;analogWrite(g,.5,{freq:0<a?a:500});k.set();this.beepTimeout&&clearTimeout(this.beepTimeout);this.beepTimeout=setTimeout(function(){delete this.beepTimeout;k.reset();digitalWrite(g,0)}.bind(this),b)};exports.record=function(a,b){function d(){clearInterval(G);
poke8(1073860612,1);poke8(1073861888,0);poke32(1073861952,4294967295);poke32(1073861956,4294967295);q.reset();E.mapInPlace(f,f,function(H){return H+128});b&&setTimeout(b,0,f)}var e=new ArrayBuffer(2049),h=E.getAddressOf(e,!0);if(!h)throw Error("Unable to create a buffer");var f=new Uint8Array(a),n=0,m=0;q.set();t.mode("output");r.mode("input");poke32(1073861892,138412032);poke32(1073861896,1);poke32(1073861912,72);poke32(1073861916,72);poke32(1073861952,t.getInfo().num);poke32(1073861956,r.getInfo().num);
poke32(1073861984,h);poke32(1073861988,512);poke32(1073861888,1);poke8(1073860864,0);poke8(1073860868,0);poke8(1073860872,0);poke8(1073860608,1);poke32(1073861984,h+1024);var G=setInterval(function(){peek8(1073860872)&&(poke8(1073860872,0),poke32(1073861984,h+1024*m),f.set(new Uint32Array(e,1+1024*m,256),n),m=1-m,n+=256,n>=f.length&&d())},5);return f};E.on("init",function(){if(exports.accel&&exports.accel.callback){var a=exports.accel.callback;exports.accel=void 0;exports.onAcceleration(a)}exports.pressureCallback&&
(exports.pressure=void 0,exports.onPressure(exports.pressureCallback));exports.humidityCallback&&(exports.humidity=void 0,exports.onHumidity(exports.humidityCallback));exports.gasCallback&&(exports.gas=void 0,exports.onGas(exports.gasCallback));exports.colorCallback&&(exports.color=void 0,exports.onColor(exports.colorCallback))})
¬p=V8,z=D6,q=V9,r=D25,t=D26,u=V10,v=V11,A=V12,B=D22,w=[V13,V14,V15],x=D23,C=D24,D=D17,F=D28,y=V4,g=D27,k=D29,c=¸I2C;c.setup({sda:7,scl:8,bitrate:4E5});exports.I2C=c;¬l=¸I2C;l.setup({sda:14,scl:15,bitrate:4E5});exports.I2CE=l;exports.onAcceleration=ª(a){a?(¯.accel (¯.accel=require(ÑLIS2DH12).connectI2C(l)),¯.accel.callback=a,¯.accel.setPowerMode(Ñlow)):(¯.accelž¯.accel.setPowerMode(Ñ powerdown),¯.accel=À0)};exports.getAcceleration=
ª(a){¯.accel?¯.accel.readXYZ(a):require(ÑLIS2DH12).connectI2C(l).readXYZ(a)};exports.onMPU=ª(a){a?¯.mpu?¯.mpu.callback=a:(p.set(),¯.mpu=require(ÑMPU9250).connectI2C(c),¯.mpu.samplerate=10,¯.mpu.callback=a,¯.mpu.watch=setWatch(ª(){¯.mpu.callback(¯.mpu.read())}.bind(¯),z,{repeat:1,edge:Ñrising}),setTimeout(¯.mpu.initMPU9250.bind(¯.mpu),10)):(¯.mpužclearWatch(¯.mpu.watch),p.reset(),¯.mpu=À0)};exports.getMPU=ª(a){£(¯.mpu)a(¯.mpu.read());¤¯.onMPU(ª(b){¯.onMPU();a(b)}.bind(¯))};exports.onPressure=ª(a){a?(¯.pressure (¯.pressure=require(ÑLPS22HB).connectI2C(c,{int:x}),¯.pressure.on(Ñdata,ª(b){¯.pressureCallback(b)}.bind(¯))),¯.pressureCallback=a):(¯.pressurež¯.pressure.stop(),¯.pressureCallback=¯.pressure=À0)};exports.getPressure=ª(a){£(¯.pressure)¯.pressure.read(a);¤{¬b=require(ÑLPS22HB).connectI2C(c,{int:x});b.read(ª(d){b.stop();a(d)})}};
exports.onHumidity=ª(a){a?(¯.humidity (¯.humidity=require(ÑHTS221).connect(c,{int:C}),¯.humidity.on(Ñdata,ª(b){¯.humidityCallback(b)}.bind(¯))),¯.humidityCallback=a):(¯.humidityž¯.humidity.stop(),¯.humidityCallback=¯.humidity=À0)};exports.getHumidity=ª(a){£(¯.humidity)¯.humidity.read(a);¤¯.onHumidity(ª(b){¯.onHumidity();a(b)}.bind(¯))};exports.onGas=ª(a){a?(¯.gas (u.set(),v.set(),A.reset(),¯.gas=require(ÑCCS811).connectI2C(c,{int:B}),¯.gas.on(Ñdata,ª(b){¯.gasCallback(b)}.bind(¯))),¯.gasCallback=a):(¯.gasž(¯.gas.stop(),v.reset(),u.reset()),¯.gasCallback=¯.gas=À0)};exports.getGas=ª(a){£(¯.gas)a(¯.gas.get());¤¯.onGas(ª(b){¯.onGas();a(b)}.bind(¯))};exports.onColor=ª(a){a?(¯.color (digitalWrite(w,0),¯.color=require(ÑBH1745).connectI2C(c),¯.colorInt=setInterval(ª(){¯.colorCallback(¯.color.read())}.bind(¯),200)),¯.colorCallback=a):(¯.colorž(clearInterval(¯.colorInt),¯.color.stop(),digitalWrite(w,7)),¯.colorCallback=¯.colorInt=¯.color=À0)};exports.getColor=ª(a){£(¯.color)a(¯.color.read());¤¯.onColor(ª(b){¯.onColor();a(b)}.bind(¯))};exports.getBattery=ª(a){y.set();¬b={charging:D.read(),voltage:E.getAnalogVRef()*analogRead(F)*1500/180};y.reset();aža(b);«b};exports.sound=ª(a,b,d){¯.sounds (¯.sounds=0);£(2<¯.sounds)°Error(ÑToo many sounds playing at once);¬e=¸Waveform(a.length);e.buffer.set(a);e.on(Ñfinish,ª(h){¯.sounds;¯.sounds (k.reset(),digitalWrite(g,0));džd()}.bind(¯));¯.sounds (analogWrite(g,.5,{freq:4E4}),k.set());¯.sounds˜;e.startOutput(g,b)};exports.beep=ª(a,b){b=0<b?b:250;analogWrite(g,.5,{freq:0<a?a:500});k.set();¯.beepTimeoutžclearTimeout(¯.beepTimeout);¯.beepTimeout=setTimeout(ª(){¾¯.beepTimeout;k.reset();digitalWrite(g,0)}.bind(¯),b)};exports.record=ª(a,b){ªd(){clearInterval(G);poke8(1073860612,1);poke8(1073861888,0);poke32(1073861952,4294967295);poke32(1073861956,4294967295);q.reset();E.mapInPlace(f,f,ª(H){«H+128});bžsetTimeout(b,0,f)}¬e=¸ArrayBuffer(2049),h=E.getAddressOf(e,!0);£(!h)°Error(ÑUnable to create a buffer);¬f=¸Uint8Array(a),n=0,m=0;q.set();t.mode(Ñoutput);r.mode(Ñinput);poke32(1073861892,138412032);poke32(1073861896,1);poke32(1073861912,72);poke32(1073861916,72);poke32(1073861952,t.getInfo().num);poke32(1073861956,r.getInfo().num);poke32(1073861984,h);poke32(1073861988,512);poke32(1073861888,1);poke8(1073860864,0);poke8(1073860868,0);poke8(1073860872,0);poke8(1073860608,1);poke32(1073861984,h+1024);¬G=setInterval(ª(){peek8(1073860872)ž(poke8(1073860872,0),poke32(1073861984,h+1024*m),f.set(¸Uint32Array(e,1+1024*m,256),n),m=1-m,n256,nf.lengthžd())},5);«f};E.on(Ñinit,ª(){£(exports.accelžexports.accel.callback){¬a=exports.accel.callback;exports.accel=À0;exports.onAcceleration(a)}exports.pressureCallbackž(exports.pressure=À0,exports.onPressure(exports.pressureCallback));exports.humidityCallbackž(exports.humidity=À0,exports.onHumidity(exports.humidityCallback));exports.gasCallbackž(exports.gas=À0,exports.onGas(exports.gasCallback));exports.colorCallbackž(exports.color=À0,exports.onColor(exports.colorCallback))})

View File

@ -1 +1 @@
(function(a,b){return E.showPrompt(a,{title:b,buttons:{Ok:1}})})
(Ş(a,b){ŤE.showPrompt(a,{title:b,buttons:{Ok:1}})})

View File

@ -1,2 +1 @@
(function(a){Pixl.btnWatches&&(Pixl.btnWatches.forEach(clearWatch),Pixl.btnWatches=void 0);g.clear();g.flip();if(a){a[""]||(a[""]={});g.setFontBitmap();g.setFontAlign(-1,-1,0);var c=g.getWidth()-9,d=g.getHeight();a[""].x=9;a[""].x2=c-2;a[""].preflip=function(){g.drawImage(E.toString(8,8,1,16,56,124,254,16,16,16,16),0,4);g.drawImage(E.toString(8,8,1,16,16,16,16,254,124,56,16),0,d-12);g.drawImage(E.toString(8,8,1,0,8,12,14,255,14,12,8),c+1,d-12)};var b=require("graphical_menu").list(g,
a);Pixl.btnWatches=[setWatch(function(){b.move(-1)},BTN1,{repeat:1}),setWatch(function(){b.move(1)},BTN4,{repeat:1}),setWatch(function(){b.select()},BTN3,{repeat:1})];return b}})
(ª(a){Pixl.btnWatchesž(Pixl.btnWatches.forEach(clearWatch),Pixl.btnWatches=À0);g.clear();g.flip();£(a){a[""] (a[""]={});g.setFontBitmap();g.setFontAlign(-1,-1,0);¬c=g.getWidth()-9,d=g.getHeight();a[""].x=9;a[""].x2=c-2;a[""].preflip=ª(){g.drawImage(E.toString(8,8,1,16,56,124,254,16,16,16,16),0,4);g.drawImage(E.toString(8,8,1,16,16,16,16,254,124,56,16),0,d-12);g.drawImage(E.toString(8,8,1,0,8,12,14,255,14,12,8),c+1,d-12)};¬b=require(Ñgraphical_menu).list(g,a);Pixl.btnWatches=[setWatch(ª(){b.move(-1)},BTN1,{repeat:1}),setWatch(ª(){b.move(1)},BTN4,{repeat:1}),setWatch(ª(){b.select()},BTN3,{repeat:1})];«b}})

View File

@ -1 +1,2 @@
(function(b,a){g.clear(1);g.setFont("4x6");g.setFontAlign(0,0);var c=g.getWidth(),d=g.getHeight();a&&(g.drawString(a,c/2,6),a=(g.stringWidth(a)+8)/2,g.fillRect(c/2-a,10,c/2+a,10));b=b.split("\n");var e=(d+10-7*b.length)/2;b.forEach((f,h)=>g.drawString(f,c/2,e+7*h));g.flip()})
(ª(b,a){g.clear(1);g.setFont(Ñ4x6);g.setFontAlign(0,0);¬c=g.getWidth(),d=g.getHeight();(g.drawString(a,c/2,6),a=(g.stringWidth(a)+8)/2,g.fillRect(c/2-a,10,c/2+a,10));b=b.split(Ñ
);¬e=(d+10-7*b.length)/2;b.forEach((f,h)¢g.drawString(f,c/2,e+7*h));g.flip()})

View File

@ -1,3 +1,2 @@
(function(q,a){function m(){g.clear(1);g.setFontAlign(0,0);var e=g.getWidth(),k=g.getHeight();if(a.title){g.drawString(a.title,e/2,4);var h=(g.stringWidth(a.title)+16)/2;g.fillRect(e/2-h,8,e/2+h,8)}h=q.split("\n");var t=(k-6*h.length)/2;h.forEach((f,n)=>g.drawString(f,e/2,t+6*n));var r=0;l.forEach(f=>r+=10+g.stringWidth(f));var b=(e-r)/2,d=k-7;l.forEach((f,n)=>{var p=g.stringWidth(f);b+=(10+p)/2;var c=2+p/2;c=[b-c,d-6,b+c,d-6,b+c+2,d-4,b+c+2,d+4,b+c,d+6,b-c,d+6,b-c-2,d+4,
b-c-2,d-4,b-c,d-6];g.drawPoly(c);n==a.selected&&(g.setColor(1),g.fillPoly(c),g.setColor(0));g.drawString(f,b,d+1);g.setColor(1);b+=(10+p)/2});g.setColor(1);g.drawImage(E.toString(8,8,1,16,48,112,254,112,48,16,16),0,4);g.drawImage(E.toString(8,8,1,16,24,28,30,254,28,24,16),0,k-12);g.drawImage(E.toString(16,8,1,103,160,148,32,132,32,103,32,20,32,148,32,103,188,0,0),e-16,k-8);g.flip()}a||(a={});a.buttons||(a.buttons={Yes:!0,No:!1});var l=Object.keys(a.buttons);a.selected||(a.selected=0);Pixl.btnWatches&&
(Pixl.btnWatches.forEach(clearWatch),Pixl.btnWatches=void 0);if(!q)return g.clear(1),g.flip(),Promise.resolve();m();return new Promise(e=>{Pixl.btnWatches=[setWatch(function(){0<a.selected&&(a.selected--,m())},BTN1,{repeat:1}),setWatch(function(){a.selected<l.length-1&&(a.selected++,m())},BTN4,{repeat:1}),setWatch(function(){E.showPrompt();e(a.buttons[l[a.selected]])},BTN3,{repeat:1})]})})
(ª(q,a){ªm(){g.clear(1);g.setFontAlign(0,0);¬e=g.getWidth(),k=g.getHeight();£(a.title){g.drawString(a.title,e/2,4);¬h=(g.stringWidth(a.title)+16)/2;g.fillRect(e/2-h,8,e/2+h,8)}h=q.split(Ñ
);¬t=(k-6*h.length)/2;h.forEach((f,n)¢g.drawString(f,e/2,t+6*n));¬r=0;l.forEach(f¢r10+g.stringWidth(f));¬b=(e-r)/2,d=k-7;l.forEach((f,n)¢{¬p=g.stringWidth(f);b(10+p)/2;¬c=2+p/2;c=[b-c,d-6,b+c,d-6,b+c+2,d-4,b+c+2,d+4,b+c,d+6,b-c,d+6,b-c-2,d+4,b-c-2,d-4,b-c,d-6];g.drawPoly(c);nŠa.selectedž(g.setColor(1),g.fillPoly(c),g.setColor(0));g.drawString(f,b,d+1);g.setColor(1);b(10+p)/2});g.setColor(1);g.drawImage(E.toString(8,8,1,16,48,112,254,112,48,16,16),0,4);g.drawImage(E.toString(8,8,1,16,24,28,30,254,28,24,16),0,k-12);g.drawImage(E.toString(16,8,1,103,160,148,32,132,32,103,32,20,32,148,32,103,188,0,0),e-16,k-8);g.flip()}a (a={});a.buttons (a.buttons={Yes:!0,No:!1});¬l=Object.keys(a.buttons);a.selected (a.selected=0);Pixl.btnWatchesž(Pixl.btnWatches.forEach(clearWatch),Pixl.btnWatches=À0);£(!q)«g.clear(1),g.flip(),Promise.resolve();m();«¸Promise(e¢{Pixl.btnWatches=[setWatch(ª(){0<a.selectedž(a.selected,m())},BTN1,{repeat:1}),setWatch(ª(){a.selected<l.length-1ž(a.selected˜,m())},BTN4,{repeat:1}),setWatch(ª(){E.showPrompt();e(a.buttons[l[a.selected]])},BTN3,{repeat:1})]})})

View File

@ -1,5 +1 @@
var k=D2,l=D3,m=D4,n=D5,d=D6,p=D8,q=D9,f=D10,r=D11,g=D12,t=D13,e=D15,u=D16,v=D17,w=D18,x=D19,h=D20,y=D26,z=D22,A=D23,B=D25;exports.setGPSOn=function(a,b){Serial1.removeAllListeners();delete this.GPS;if(a)return Serial1.setup(9600,{tx:p,rx:q}),f.set(),this.GPS=require("GPS").connect(Serial1,b);f.reset()};exports.setEnvOn=function(a,b){this.BME280&&this.BME280.setPower(!1);delete this.BME280;if(a)return a=new SPI,a.setup({miso:n,mosi:l,sck:m}),b&&setTimeout(b,100,this.BME280),
this.BME280=require("BME280").connectSPI(a,k)};exports.setMagOn=function(a,b){this.LIS2MDL&&this.LIS2MDL.off();delete this.LIS2MDL;if(a)return a=new I2C,a.setup({sda:t,scl:r}),b&&setTimeout(b,100,this.LIS2MDL),this.LIS2MDL=require("LIS2MDL").connectI2C(a,{int:u})};exports.setAccelOn=function(a,b){this.LIS3DH&&this.LIS3DH.off();delete this.LIS3DH;if(a)return a=new I2C,a.setup({sda:x,scl:w}),b&&setTimeout(b,100,this.LIS3DH),this.LIS3DH=require("LIS3DH").connectI2C(a,{int:B})};exports.setOptoOn=function(a,
b){this.OPT3001&&this.OPT3001.off();delete this.OPT3001;if(a)return a=new I2C,a.setup({sda:y,scl:A,bitrate:4E5}),b&&setTimeout(b,1E3,this.OPT3001),this.OPT3001=require("OPT3001").connectI2C(a,{int:z})};exports.setCellOn=function(a,b){if(a)if(this.cellOn)setTimeout(b,10,Serial1);else return(new Promise(function(c){Serial1.removeAllListeners();Serial1.on("data",function(C){});Serial1.setup(115200,{tx:g,rx:h});d.reset();setTimeout(c,200)})).then(function(){d.set();return new Promise(function(c){setTimeout(c,
200)})}).then(function(){e.set();return new Promise(function(c){setTimeout(c,2E3)})}).then(function(){e.reset();return new Promise(function(c){setTimeout(c,5E3)})}).then(function(){this.cellOn=!0;Serial1.removeAllListeners();b&&setTimeout(b,10,Serial1)});else this.cellOn=!1,d.reset(),b&&setTimeout(b,1E3)};exports.setNBCellOn=function(a,b){if(a)if(this.cellOn)setTimeout(b,10,Serial1);else return(new Promise(function(c){Serial1.removeAllListeners();Serial1.on("data",function(C){});Serial1.setup(9600,
{tx:h,rx:g});d.reset();setTimeout(c,200)})).then(function(){d.set();return new Promise(function(c){setTimeout(c,200)})}).then(function(){e.set();return new Promise(function(c){setTimeout(c,2E3)})}).then(function(){e.reset();return new Promise(function(c){setTimeout(c,5E3)})}).then(function(){this.cellOn=!0;Serial1.removeAllListeners();b&&setTimeout(b,10,Serial1)});else this.cellOn=!1,d.reset(),b&&setTimeout(b,1E3)};exports.setCharging=function(a){v.write(!a)}
¬k=D2,l=D3,m=D4,n=D5,d=D6,p=D8,q=D9,f=D10,r=D11,g=D12,t=D13,e=D15,u=D16,v=D17,w=D18,x=D19,h=D20,y=D26,z=D22,A=D23,B=D25;exports.setGPSOn=ª(a,b){Serial1.removeAllListeners();¾¯.GPS;£(a)«Serial1.setup(9600,{tx:p,rx:q}),f.set(),¯.GPS=require(ÑGPS).connect(Serial1,b);f.reset()};exports.setEnvOn=ª(a,b){¯.BME280ž¯.BME280.setPower(!1);¾¯.BME280;£(a)«a=¸SPI,a.setup({miso:n,mosi:l,sck:m}),bžsetTimeout(b,100,¯.BME280),¯.BME280=require(ÑBME280).connectSPI(a,k)};exports.setMagOn=ª(a,b){¯.LIS2MDLž¯.LIS2MDL.off();¾¯.LIS2MDL;£(a)«a=¸I2C,a.setup({sda:t,scl:r}),bžsetTimeout(b,100,¯.LIS2MDL),¯.LIS2MDL=require(ÑLIS2MDL).connectI2C(a,{int:u})};exports.setAccelOn=ª(a,b){¯.LIS3DHž¯.LIS3DH.off();¾¯.LIS3DH;£(a)«a=¸I2C,a.setup({sda:x,scl:w}),bžsetTimeout(b,100,¯.LIS3DH),¯.LIS3DH=require(ÑLIS3DH).connectI2C(a,{int:B})};exports.setOptoOn=ª(a,b){¯.OPT3001ž¯.OPT3001.off();¾¯.OPT3001;£(a)«a=¸I2C,a.setup({sda:y,scl:A,bitrate:4E5}),bžsetTimeout(b,1E3,¯.OPT3001),¯.OPT3001=require(ÑOPT3001).connectI2C(a,{int:z})};exports.setCellOn=ª(a,b){£(a)£(¯.cellOn)setTimeout(b,10,Serial1);¤«(¸Promise(ª(c){Serial1.removeAllListeners();Serial1.on(Ñdata,ª(C){});Serial1.setup(115200,{tx:g,rx:h});d.reset();setTimeout(c,200)})).then(ª(){d.set();«¸Promise(ª(c){setTimeout(c,200)})}).then(ª(){e.set();«¸Promise(ª(c){setTimeout(c,2E3)})}).then(ª(){e.reset();«¸Promise(ª(c){setTimeout(c,5E3)})}).then(ª(){¯.cellOn=!0;Serial1.removeAllListeners();bžsetTimeout(b,10,Serial1)});¤¯.cellOn=!1,d.reset(),bžsetTimeout(b,1E3)};exports.setNBCellOn=ª(a,b){£(a)£(¯.cellOn)setTimeout(b,10,Serial1);¤«(¸Promise(ª(c){Serial1.removeAllListeners();Serial1.on(Ñdata,ª(C){});Serial1.setup(9600,{tx:h,rx:g});d.reset();setTimeout(c,200)})).then(ª(){d.set();«¸Promise(ª(c){setTimeout(c,200)})}).then(ª(){e.set();«¸Promise(ª(c){setTimeout(c,2E3)})}).then(ª(){e.reset();«¸Promise(ª(c){setTimeout(c,5E3)})}).then(ª(){¯.cellOn=!0;Serial1.removeAllListeners();bžsetTimeout(b,10,Serial1)});¤¯.cellOn=!1,d.reset(),bžsetTimeout(b,1E3)};exports.setCharging=ª(a){v.write(!a)}

View File

@ -1,5 +1,4 @@
var p=D2,q=D3,r=D4,t=D5,k=D6,u=D7,v=D9,w=D10,x=D11,y=D13,l=D15,z=D16,m=D17,A=D18,B=D19,C=D26,D=D22,F=D23,G=D25;exports.setEnvOn=function(a,b){this.BME280&&this.BME280.setPower(!1);delete this.BME280;if(a)return a=new SPI,a.setup({miso:t,mosi:q,sck:r}),b&&setTimeout(b,100,this.BME280),this.BME280=require("BME280").connectSPI(a,p)};exports.setMagOn=function(a,b){this.LIS2MDL&&this.LIS2MDL.off();delete this.LIS2MDL;if(a)return a=new I2C,a.setup({sda:y,scl:x}),b&&setTimeout(b,
100,this.LIS2MDL),this.LIS2MDL=require("LIS2MDL").connectI2C(a,{int:z})};exports.setAccelOn=function(a,b){this.LIS3DH&&this.LIS3DH.off();delete this.LIS3DH;if(a)return a=new I2C,a.setup({sda:B,scl:A}),b&&setTimeout(b,100,this.LIS3DH),this.LIS3DH=require("LIS3DH").connectI2C(a,{int:G})};exports.setOptoOn=function(a,b){this.OPT3001&&this.OPT3001.off();delete this.OPT3001;if(a)return a=new I2C,a.setup({sda:C,scl:F,bitrate:4E5}),b&&setTimeout(b,1E3,this.OPT3001),this.OPT3001=require("OPT3001").connectI2C(a,
{int:D})};exports.setCellOn=function(a,b){if(a)if(this.cellOn)setTimeout(b,10,Serial1);else return(new Promise(function(e){Serial1.removeAllListeners();Serial1.on("data",function(f){});Serial1.setup(115200,{tx:v,rx:u,cts:w});k.reset();setTimeout(e,200)})).then(function(){k.set();return new Promise(function(e){setTimeout(e,200)})}).then(function(){l.set();return new Promise(function(e){setTimeout(e,2E3)})}).then(function(){l.reset();return new Promise(function(e){setTimeout(e,5E3)})}).then(function(){this.cellOn=
!0;Serial1.removeAllListeners();b&&setTimeout(b,10,Serial1)});else this.cellOn=!1,k.reset(),b&&setTimeout(b,1E3)};exports.setCharging=function(a){m.write(!a)};exports.setCharging=function(a){m.write(!a)};exports.setGPSOn=function(a,b){a?this.setCellOn(a,function(e){var f=require("AT").connect(e),n={at:f,on:function(d){d=d||function(){};f.cmd("AT+QGPS=1\r\n",1E3,function g(c){if(c&&c.startsWith("AT+"))return g;d("OK"==c?null:c)})},off:function(d){d=d||function(){};f.cmd("AT+QGPSEND\r\n",1E3,function g(c){if(c&&
c.startsWith("AT+"))return g;d("OK"==c?null:c)})},get:function(d){d=d||function(){};f.cmd("AT+QGPSLOC=2\r\n",1E3,function g(c){if(c){if(c.startsWith("AT+"))return g;if(c.startsWith("+CME ERROR:"))d({error:c.substr(5)});else if(c.startsWith("+QGPSLOC:")){c=c.substr(9).trim();var h=c.split(",");d({raw:c,UTC:h[0],lat:+h[1],lon:+h[2],alt:+h[4]})}else d({error:c})}else d({error:"Timeout"})})}};n.on(function(d){b(d,d?void 0:n)})}):this.setCellOn(!1,b)}
¬p=D2,q=D3,r=D4,t=D5,k=D6,u=D7,v=D9,w=D10,x=D11,y=D13,l=D15,z=D16,m=D17,A=D18,B=D19,C=D26,D=D22,F=D23,G=D25;exports.setEnvOn=ª(a,b){¯.BME280ž¯.BME280.setPower(!1);¾¯.BME280;£(a)«a=¸SPI,a.setup({miso:t,mosi:q,sck:r}),bžsetTimeout(b,100,¯.BME280),¯.BME280=require(ÑBME280).connectSPI(a,p)};exports.setMagOn=ª(a,b){¯.LIS2MDLž¯.LIS2MDL.off();¾¯.LIS2MDL;£(a)«a=¸I2C,a.setup({sda:y,scl:x}),bžsetTimeout(b,100,¯.LIS2MDL),¯.LIS2MDL=require(ÑLIS2MDL).connectI2C(a,{int:z})};exports.setAccelOn=ª(a,b){¯.LIS3DHž¯.LIS3DH.off();¾¯.LIS3DH;£(a)«a=¸I2C,a.setup({sda:B,scl:A}),bžsetTimeout(b,100,¯.LIS3DH),¯.LIS3DH=require(ÑLIS3DH).connectI2C(a,{int:G})};exports.setOptoOn=ª(a,b){¯.OPT3001ž¯.OPT3001.off();¾¯.OPT3001;£(a)«a=¸I2C,a.setup({sda:C,scl:F,bitrate:4E5}),bžsetTimeout(b,1E3,¯.OPT3001),¯.OPT3001=require(ÑOPT3001).connectI2C(a,{int:D})};exports.setCellOn=ª(a,b){£(a)£(¯.cellOn)setTimeout(b,10,Serial1);¤«(¸Promise(ª(e){Serial1.removeAllListeners();Serial1.on(Ñdata,ª(f){});Serial1.setup(115200,{tx:v,rx:u,cts:w});k.reset();setTimeout(e,200)})).then(ª(){k.set();«¸Promise(ª(e){setTimeout(e,200)})}).then(ª(){l.set();«¸Promise(ª(e){setTimeout(e,2E3)})}).then(ª(){l.reset();«¸Promise(ª(e){setTimeout(e,5E3)})}).then(ª(){¯.cellOn=!0;Serial1.removeAllListeners();bžsetTimeout(b,10,Serial1)});¤¯.cellOn=!1,k.reset(),bžsetTimeout(b,1E3)};exports.setCharging=ª(a){m.write(!a)};exports.setCharging=ª(a){m.write(!a)};exports.setGPSOn=ª(a,b){a?¯.setCellOn(a,ª(e){¬f=require(ÑAT).connect(e),n={at:f,on:ª(d){d=d ª(){};f.cmd(Ñ AT+QGPS=1
,1E3,ªg(c){£(cžc.startsWith(ÑAT+))«g;d(ÑOKŠc?:c)})},off:ª(d){d=d ª(){};f.cmd(Ñ AT+QGPSEND
,1E3,ªg(c){£(cžc.startsWith(ÑAT+))«g;d(ÑOKŠc?:c)})},get:ª(d){d=d ª(){};f.cmd(ÑAT+QGPSLOC=2
,1E3,ªg(c){£(c){£(c.startsWith(ÑAT+))«g;£(c.startsWith(Ñ +CME ERROR:))d({error:c.substr(5)});¤£(c.startsWith(Ñ +QGPSLOC:)){c=c.substr(9).trim();¬h=c.split(Ñ,);d({raw:c,UTC:h[0],lat:+h[1],lon:+h[2],alt:+h[4]})}¤d({error:c})}¤d({error:ÑTimeout})})}};n.on(ª(d){b(d,d?À0:n)})}):¯.setCellOn(!1,b)}

View File

@ -22,42 +22,42 @@ wget https://www.espruino.com/modules/BH1745.min.js -O BH1745.min.js
wget https://www.espruino.com/modules/SHT3C.min.js -O SHT3C.min.js
#wget https://www.espruino.com/modules/PCA9685.min.js -O PCA9685.min.js
#wget https://www.espruino.com/modules/Smartibot.min.js -O Smartibot.min.js
wget https://www.espruino.com/modules/EspruinoWiFi.min.js -O espruino_wifi/Wifi.min.js
# Other libs
wget https://www.espruino.com/modules/EspruinoWiFi.min.js -O espruino_wifi/Wifi.min.js
node ../../../EspruinoDocs/bin/minify.js nordic/Thingy.js nordic/Thingy.min.js
node ../../../EspruinoDocs/bin/minify.js rak/RAK8211.js rak/RAK8211.min.js
node ../../../EspruinoDocs/bin/minify.js rak/RAK8212.js rak/RAK8212.min.js
node ../../../EspruinoDocs/bin/minify.js nordic/Thingy.js nordic/Thingy.min.js
node ../../../EspruinoDocs/bin/minify.js --pretokenise nordic/Thingy.js nordic/Thingy.min.js
node ../../../EspruinoDocs/bin/minify.js --pretokenise rak/RAK8211.js rak/RAK8211.min.js
node ../../../EspruinoDocs/bin/minify.js --pretokenise rak/RAK8212.js rak/RAK8212.min.js
node ../../../EspruinoDocs/bin/minify.js --pretokenise pixljs/E_showMenu.js pixljs/E_showMenu.min.js
node ../../../EspruinoDocs/bin/minify.js --pretokenise pixljs/E_showMessage.js pixljs/E_showMessage.min.js
node ../../../EspruinoDocs/bin/minify.js --pretokenise pixljs/E_showPrompt.js pixljs/E_showPrompt.min.js
node ../../../EspruinoDocs/bin/minify.js --pretokenise pixljs/E_showAlert.js pixljs/E_showAlert.min.js
node ../../../EspruinoDocs/bin/minify.js --pretokenise banglejs/E_showMenu_F18.js banglejs/E_showMenu_F18.min.js
node ../../../EspruinoDocs/bin/minify.js --pretokenise banglejs/E_showMenu_Q3.js banglejs/E_showMenu_Q3.min.js
node ../../../EspruinoDocs/bin/minify.js --pretokenise banglejs/E_showMessage.js banglejs/E_showMessage.min.js
node ../../../EspruinoDocs/bin/minify.js --pretokenise banglejs/E_showPrompt.js banglejs/E_showPrompt.min.js
node ../../../EspruinoDocs/bin/minify.js --pretokenise banglejs/E_showPrompt_Q3.js banglejs/E_showPrompt_Q3.min.js
node ../../../EspruinoDocs/bin/minify.js --pretokenise banglejs/E_showAlert.js banglejs/E_showAlert.min.js
node ../../../EspruinoDocs/bin/minify.js --pretokenise banglejs/E_showScroller.js banglejs/E_showScroller.min.js
node ../../../EspruinoDocs/bin/minify.js --pretokenise banglejs/E_showScroller_Q3.js banglejs/E_showScroller_Q3.min.js
node ../../../EspruinoDocs/bin/minify.js --pretokenise banglejs/LED1.js banglejs/LED1.min.js
node ../../../EspruinoDocs/bin/minify.js --pretokenise banglejs/LED2.js banglejs/LED2.min.js
node ../../../EspruinoDocs/bin/minify.js --pretokenise banglejs/Bangle_drawWidgets.js banglejs/Bangle_drawWidgets.min.js
node ../../../EspruinoDocs/bin/minify.js --pretokenise banglejs/Bangle_drawWidgets_Q3.js banglejs/Bangle_drawWidgets_Q3.min.js
node ../../../EspruinoDocs/bin/minify.js --pretokenise banglejs/Bangle_loadWidgets.js banglejs/Bangle_loadWidgets.min.js
node ../../../EspruinoDocs/bin/minify.js --pretokenise banglejs/Bangle_showLauncher.js banglejs/Bangle_showLauncher.min.js
node ../../../EspruinoDocs/bin/minify.js --pretokenise banglejs/Bangle_showClock.js banglejs/Bangle_showClock.min.js
node ../../../EspruinoDocs/bin/minify.js --pretokenise banglejs/Bangle_load.js banglejs/Bangle_load.min.js
node ../../../EspruinoDocs/bin/minify.js --pretokenise banglejs/Bangle_setUI_F18.js banglejs/Bangle_setUI_F18.min.js
node ../../../EspruinoDocs/bin/minify.js --pretokenise banglejs/Bangle_setUI_Q3.js banglejs/Bangle_setUI_Q3.min.js
node ../../../EspruinoDocs/bin/minify.js --pretokenise banglejs/Bangle_showRecoveryMenu_F18.js banglejs/Bangle_showRecoveryMenu_F18.min.js
node ../../../EspruinoDocs/bin/minify.js --pretokenise banglejs/Bangle_showRecoveryMenu.js banglejs/Bangle_showRecoveryMenu.min.js
node ../../../EspruinoDocs/bin/minify.js --pretokenise banglejs/Bangle_showTestScreen.js banglejs/Bangle_showTestScreen.min.js
node ../../../EspruinoDocs/bin/minify.js --pretokenise banglejs/locale.js banglejs/locale.min.js
node ../../../EspruinoDocs/bin/minify.js pixljs/E_showMenu.js pixljs/E_showMenu.min.js
node ../../../EspruinoDocs/bin/minify.js pixljs/E_showMessage.js pixljs/E_showMessage.min.js
node ../../../EspruinoDocs/bin/minify.js pixljs/E_showPrompt.js pixljs/E_showPrompt.min.js
node ../../../EspruinoDocs/bin/minify.js pixljs/E_showAlert.js pixljs/E_showAlert.min.js
node ../../../EspruinoDocs/bin/minify.js banglejs/E_showMenu_F18.js banglejs/E_showMenu_F18.min.js
node ../../../EspruinoDocs/bin/minify.js banglejs/E_showMenu_Q3.js banglejs/E_showMenu_Q3.min.js
node ../../../EspruinoDocs/bin/minify.js banglejs/E_showMessage.js banglejs/E_showMessage.min.js
node ../../../EspruinoDocs/bin/minify.js banglejs/E_showPrompt.js banglejs/E_showPrompt.min.js
node ../../../EspruinoDocs/bin/minify.js banglejs/E_showPrompt_Q3.js banglejs/E_showPrompt_Q3.min.js
node ../../../EspruinoDocs/bin/minify.js banglejs/E_showAlert.js banglejs/E_showAlert.min.js
node ../../../EspruinoDocs/bin/minify.js banglejs/E_showScroller.js banglejs/E_showScroller.min.js
node ../../../EspruinoDocs/bin/minify.js banglejs/E_showScroller_Q3.js banglejs/E_showScroller_Q3.min.js
node ../../../EspruinoDocs/bin/minify.js banglejs/LED1.js banglejs/LED1.min.js
node ../../../EspruinoDocs/bin/minify.js banglejs/LED2.js banglejs/LED2.min.js
node ../../../EspruinoDocs/bin/minify.js banglejs/Bangle_drawWidgets.js banglejs/Bangle_drawWidgets.min.js
node ../../../EspruinoDocs/bin/minify.js banglejs/Bangle_drawWidgets_Q3.js banglejs/Bangle_drawWidgets_Q3.min.js
node ../../../EspruinoDocs/bin/minify.js banglejs/Bangle_loadWidgets.js banglejs/Bangle_loadWidgets.min.js
node ../../../EspruinoDocs/bin/minify.js banglejs/Bangle_showLauncher.js banglejs/Bangle_showLauncher.min.js
node ../../../EspruinoDocs/bin/minify.js banglejs/Bangle_showClock.js banglejs/Bangle_showClock.min.js
node ../../../EspruinoDocs/bin/minify.js banglejs/Bangle_load.js banglejs/Bangle_load.min.js
node ../../../EspruinoDocs/bin/minify.js banglejs/Bangle_setUI_F18.js banglejs/Bangle_setUI_F18.min.js
node ../../../EspruinoDocs/bin/minify.js banglejs/Bangle_setUI_Q3.js banglejs/Bangle_setUI_Q3.min.js
node ../../../EspruinoDocs/bin/minify.js banglejs/Bangle_showRecoveryMenu_F18.js banglejs/Bangle_showRecoveryMenu_F18.min.js
node ../../../EspruinoDocs/bin/minify.js banglejs/locale.js banglejs/locale.min.js
node ../../../EspruinoDocs/bin/minify.js dickens/Bangle_setUI_DICKENS.js dickens/Bangle_setUI_DICKENS.min.js
node ../../../EspruinoDocs/bin/minify.js dickens/Bangle_drawWidgets_DICKENS.js dickens/Bangle_drawWidgets_DICKENS.min.js
node ../../../EspruinoDocs/bin/minify.js dickens/E_showMenu_DICKENS.js dickens/E_showMenu_DICKENS.min.js
node ../../../EspruinoDocs/bin/minify.js dickens/E_showPrompt_DICKENS.js dickens/E_showPrompt_DICKENS.min.js
node ../../../EspruinoDocs/bin/minify.js dickens/E_showMessage_DICKENS.js dickens/E_showMessage_DICKENS.min.js
node ../../../EspruinoDocs/bin/minify.js --pretokenise dickens/Bangle_setUI_DICKENS.js dickens/Bangle_setUI_DICKENS.min.js
node ../../../EspruinoDocs/bin/minify.js --pretokenise dickens/Bangle_drawWidgets_DICKENS.js dickens/Bangle_drawWidgets_DICKENS.min.js
node ../../../EspruinoDocs/bin/minify.js --pretokenise dickens/E_showMenu_DICKENS.js dickens/E_showMenu_DICKENS.min.js
node ../../../EspruinoDocs/bin/minify.js --pretokenise dickens/E_showPrompt_DICKENS.js dickens/E_showPrompt_DICKENS.min.js
node ../../../EspruinoDocs/bin/minify.js --pretokenise dickens/E_showMessage_DICKENS.js dickens/E_showMessage_DICKENS.min.js

View File

@ -57,7 +57,8 @@ for i in range(1,len(sys.argv)):
modulename = arg.rsplit('/',1)[1][:-3]
if modulename[-4:]==".min": modulename=modulename[:-4]
print("Loading JS module: "+arg+" -> "+modulename)
jscode = open(arg, "r").read()
# Can't open(...encoding='latin-1') here because Python will still replace line endings!
jscode = open(arg, "rb").read().decode(encoding='latin-1').strip()
if modulename=="_":
jsbootcode = jscode
else:
@ -75,7 +76,7 @@ def codeOut(s):
wrapperFile.write(s+"\n");
def FATAL_ERROR(s):
sys.stderr.write("ERROR: "+s)
sys.stderr.write("ERROR: "+s+"\n")
exit(1)
# ------------------------------------------------------------------------------------------------------
@ -372,9 +373,22 @@ for jsondata in jsondatas:
s.append(toCType(param[1])+" "+param[0]);
js = "";
with open(basedir+jsondata["generate_js"], 'r') as file:
js = file.read().strip()
statement = "jspExecuteJSFunction("+json.dumps(js)
# Can't open(...encoding='latin-1') here because Python will still replace line endings!
js = open(basedir+jsondata["generate_js"], 'rb').read().decode(encoding='latin-1').strip()
if not js.endswith("})"):
print(common.as_c_string(js)+"\n")
FATAL_ERROR("generate_js function doesn't end in })")
fnMatch = re.match(r"^\((function|\252)\(([^\)]*)\)", js);
if fnMatch:
fnKeyword, fnArgs = fnMatch.groups()
fnCode = js[len(fnKeyword)+len(fnArgs)+4:-2]
statement = "jspExecuteJSFunctionCode("+common.as_c_string(fnArgs)+", "+common.as_c_string(fnCode)+", "+str(len(fnCode))
else:
print(common.as_c_string(js)+"\n")
FATAL_ERROR("generate_js function not in the correct format")
if hasThis(jsondata): statement = statement + ", parent"
else: statement = statement + ", NULL"
@ -713,7 +727,7 @@ codeOut('')
codeOut("/** Tasks to run on Initialisation (eg boot/load/reset/after save/etc) */")
codeOut('void jswInit() {')
if jsbootcode!=False:
codeOut(' jsvUnLock(jspEvaluate('+json.dumps(jsbootcode)+', true/*static*/));')
codeOut(' jsvUnLock(jspEvaluate('+common.as_c_string(jsbootcode)+', true/*static*/));')
for jsondata in jsondatas:
if "type" in jsondata and jsondata["type"]=="init":
codeOut(" "+jsondata["generate"]+"();")
@ -752,7 +766,7 @@ codeOut("/** If we have a built-in module with the given name, return the module
codeOut('const char *jswGetBuiltInJSLibrary(const char *name) {')
codeOut(' NOT_USED(name);')
for modulename in jsmodules:
codeOut(" if (!strcmp(name,\""+modulename+"\")) return "+json.dumps(jsmodules[modulename])+";")
codeOut(" if (!strcmp(name,\""+modulename+"\")) return "+common.as_c_string(jsmodules[modulename])+";")
codeOut(' return 0;')
codeOut('}')

View File

@ -526,3 +526,19 @@ def get_espruino_binary_address(board):
def get_board_binary_name(board):
return board.info["binary_name"].replace("%v", get_version());
# Quote a normal string such that C can read it
def as_c_string(s):
#We can't do this because amazingly "\xabc" in C is NOT "\xab"+"c"
#return re.sub(r"\\u00([0-9a-fA-F]{2})", r"\\x\1", json.dumps(s));
r = '"';
for i in range(len(s)):
ch = ord(s[i])
if ch == 34: # quote
r = r + '\\"'
elif (ch>=32) and (ch<128):
r = r + s[i]
else:
r = r + "\\"+oct(ch)[2:].zfill(3)
return r + '"';

View File

@ -3343,6 +3343,36 @@ JsVar *jspExecuteJSFunction(const char *jsCode, JsVar *thisArg, int argCount, Js
return result;
}
JsVar *jspExecuteJSFunctionCode(const char *argNames, const char *jsCode, int jsCodeLen, JsVar *thisArg, int argCount, JsVar **argPtr) {
if (jsCodeLen==0) jsCodeLen = strlen(jsCode);
JsVar *fn = jsvNewWithFlags(JSV_FUNCTION);
if (!fn) return 0;
// split `argNames` up and add each name
if (argNames && *argNames) {
char name[10], nameLen;
name[0] = 0xFF;
while (*argNames) {
const char *argEnd = argNames;
nameLen = 1;
while (*argEnd && *argEnd!=',') {
name[nameLen++] = *argEnd;
argEnd++;
}
name[nameLen]=0;
JsVar *paramName = jsvNewNameFromString(name);
jsvAddFunctionParameter(fn, paramName, 0);
// paramName is unlocked by jsvAddFunctionParameter
argNames = (*argEnd)?argEnd+1:argEnd;
}
}
// add the function code
jsvObjectSetChildAndUnLock(fn, JSPARSE_FUNCTION_CODE_NAME, jsvNewNativeString((char*)jsCode, jsCodeLen));
// execute!
JsVar *result = jspExecuteFunction(fn,thisArg,argCount,argPtr);
jsvUnLock(fn);
return result;
}
JsVar *jspExecuteFunction(JsVar *func, JsVar *thisArg, int argCount, JsVar **argPtr) {
JsExecInfo oldExecInfo = execInfo;
execInfo.scopesVar = 0;

View File

@ -72,6 +72,9 @@ JsVar *jspEvaluateVar(JsVar *str, JsVar *scope, uint16_t lineNumberOffset);
JsVar *jspEvaluate(const char *str, bool stringIsStatic);
/// Execute a JS function with the given arguments. usage: jspExecuteJSFunction("(function() { print('hi'); })",0,0,0)
JsVar *jspExecuteJSFunction(const char *jsCode, JsVar *thisArg, int argCount, JsVar **argPtr);
/** Execute JS function code with the given arguments. usage: jspExecuteJSFunctionCode("a,b","print('hi',a,b);",0, NULL, 2,&arrayOfJsVar)
jsCodeLen is supplied so we can reference code that contains 0 */
JsVar *jspExecuteJSFunctionCode(const char *argNames, const char *jsCode, int jsCodeLen, JsVar *thisArg, int argCount, JsVar **argPtr);
/// Execute a function with the given arguments
JsVar *jspExecuteFunction(JsVar *func, JsVar *thisArg, int argCount, JsVar **argPtr);

View File

@ -2191,7 +2191,7 @@ JsVar *jswrap_espruino_memoryMap(JsVar *baseAddress, JsVar *registers) {
/* Do this in JS - it's safer and more readable, and doesn't
* have to be super fast. */
JsVar *args[2] = {baseAddress, registers};
return jspExecuteJSFunction("(function(base,j) {"
return jspExecuteJSFunctionCode("base,j",
"var o={},addr;"
"for (var reg in j) {"
"addr=base+j[reg];"
@ -2201,7 +2201,7 @@ JsVar *jswrap_espruino_memoryMap(JsVar *baseAddress, JsVar *registers) {
"});"
"}"
"return o;"
"})",0,2,args);
,0,NULL,2,args);
}
/*JSON{

View File

@ -258,7 +258,7 @@ void jswrap_pipe(JsVar* source, JsVar* dest, JsVar* options) {
JsVar *arr = pipeGetArray(true);
if (pipe && arr) {// out of memory?
if (jsvIsString(source)) { // Single-line 'StringStream' object to add ability to stream from Strings
JsVar *stream = jspExecuteJSFunction("(function(s){var p=0;return{read:function(l){return s.substring(p,p+=l)||undefined;}}})",NULL,1,&source);
JsVar *stream = jspExecuteJSFunctionCode("s","var p=0;return{read:function(l){return s.substring(p,p+=l)||undefined;}}",0,NULL,1,&source);
jsvUnLock(source);
source = stream;
}