From b27ada31c63015f996299b743092978d1763f70d Mon Sep 17 00:00:00 2001 From: Shunya Sato Date: Fri, 3 Jan 2020 16:18:44 +0900 Subject: [PATCH] Add Bold clock app, Pedometer and Digital clock widgets Add Bold clock app Add Pedometer widget Add Digital clock widget --- apps.json | 38 +++++++ apps/boldclk/bold_clock-icon.js | 1 + apps/boldclk/bold_clock.js | 146 +++++++++++++++++++++++++++ apps/boldclk/bold_clock.json | 7 ++ apps/boldclk/bold_clock.png | Bin 0 -> 1035 bytes apps/wdclk/digital_clock_widget.js | 39 +++++++ apps/wdclk/digital_clock_widget.json | 5 + apps/wdclk/digital_clock_widget.png | Bin 0 -> 422 bytes apps/wpedom/pedometer_widget.js | 50 +++++++++ apps/wpedom/pedometer_widget.json | 5 + apps/wpedom/pedometer_widget.png | Bin 0 -> 1154 bytes 11 files changed, 291 insertions(+) create mode 100644 apps/boldclk/bold_clock-icon.js create mode 100644 apps/boldclk/bold_clock.js create mode 100644 apps/boldclk/bold_clock.json create mode 100644 apps/boldclk/bold_clock.png create mode 100644 apps/wdclk/digital_clock_widget.js create mode 100644 apps/wdclk/digital_clock_widget.json create mode 100644 apps/wdclk/digital_clock_widget.png create mode 100644 apps/wpedom/pedometer_widget.js create mode 100644 apps/wpedom/pedometer_widget.json create mode 100644 apps/wpedom/pedometer_widget.png diff --git a/apps.json b/apps.json index 2ff7b4edb..39cb4569f 100644 --- a/apps.json +++ b/apps.json @@ -624,6 +624,44 @@ {"name":"*blobclk","url":"clock-blob-icon.js","evaluate":true} ] }, + { "id": "boldclk", + "name": "Bold Clock", + "icon": "bold_clock.png", + "version":"0.01", + "description": "Simple, readable and practical clock", + "tags": "clock", + "type":"clock", + "allow_emulator":true, + "storage": [ + {"name":"+boldclk","url":"bold_clock.json"}, + {"name":"-boldclk","url":"bold_clock.js"}, + {"name":"*boldclk","url":"bold_clock-icon.js","evaluate":true} + ] + }, + { "id": "wdclk", + "name": "Digital clock widget", + "icon": "digital_clock_widget.png", + "version":"0.01", + "description": "A simple digital clock widget", + "tags": "widget,clock", + "type":"widget", + "storage": [ + {"name":"+wdclk","url":"digital_clock_widget.json"}, + {"name":"=wdclk","url":"digital_clock_widget.js"} + ] + }, + { "id": "wpedom", + "name": "Pedometer widget", + "icon": "pedometer_widget.png", + "version":"0.01", + "description": "Daily pedometer widget", + "tags": "widget", + "type":"widget", + "storage": [ + {"name":"+wpedom","url":"pedometer_widget.json"}, + {"name":"=wpedom","url":"pedometer_widget.js"} + ] + }, { "id": "berlinc", "name": "Berlin Clock", "icon": "berlin-clock.png", diff --git a/apps/boldclk/bold_clock-icon.js b/apps/boldclk/bold_clock-icon.js new file mode 100644 index 000000000..52621e318 --- /dev/null +++ b/apps/boldclk/bold_clock-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwkE/4AHmXw+EPh8jBxAAHgch+EwgcPiUwCpszh8RmPzF4M/icR+EzCxXxFAIOCC4IgCkMwj4WI+cigIGDC4YABiEyn4XIgcQBYYXE+cBmAXH+UDkcwCQYXEAgMymEvC4sviIaBKhHyCgMR+QKFLggALiCjFmIXPiarEkBOGABPygS7DkaXIW5JuCmEBC6MATIU/iB3RgXzRoXzUwIAOCAKRCVgwANRQPwiYXTmMP+YXVn8yRqCREkchVQQAR+MSCqYADgBHVgDBCACc/gAABegQAN+AUCC65HYO6ynXa68yI6sj+cTC6cxn/wC6q7B+QXTl4CBgPzgIVPiEviDBCiECC58ggMzegUBSKMQgaqCkYXQ+czL4Q1BAgYAM+RZEmcxC58TLwQACR6KsGiI5BY4IAG+JVBiLSG+UDkcwC4fwAgkDmUwOA/zgcQSYYXEcoMwT5HzkRiEC4hcBkS3J+MPiThDC4UzkPwj7JLh8RmPzC4M/icR+DlOgYoBmEDGwMwWZ//mXwF4MPkYOIA")) \ No newline at end of file diff --git a/apps/boldclk/bold_clock.js b/apps/boldclk/bold_clock.js new file mode 100644 index 000000000..4b110e201 --- /dev/null +++ b/apps/boldclk/bold_clock.js @@ -0,0 +1,146 @@ +(() => { + // https://www.espruino.com/Image+Converter + var hour_hand = { + width : 61, height : 8, bpp : 1, + transparent : 0, + buffer : E.toArrayBuffer(atob("/////////////////////////////////////////////////////////////////////////////////w==")) + }; + var minute_hand = { + width : 110, height : 4, bpp : 1, + transparent : 0, + buffer : E.toArrayBuffer(atob("/////////////////////////////////////////////////////////////////////////w==")) + }; + + //g.fillRect(0,24,239,239); // Apps area + let intervalRef = null; + const p180 = Math.PI/180; + const clock_center = {x:Math.floor((240-1)/2), y:24+Math.floor((239-24)/2)}; + // ={ x: 119, y: 131 } + const radius = Math.floor((239-24+1)/2); // =108 + + let tick0 = Graphics.createArrayBuffer(30,8,1); + tick0.fillRect(0,0,tick0.getWidth()-1, tick0.getHeight()-1); + let tick5 = Graphics.createArrayBuffer(20,6,1); + tick5.fillRect(0,0,tick5.getWidth()-1, tick5.getHeight()-1); + let tick1 = Graphics.createArrayBuffer(8,4,1); + tick1.fillRect(0,0,tick1.getWidth()-1, tick1.getHeight()-1); + + function big_wheel_x(angle){ + return clock_center.x + radius * Math.cos(angle*p180); + } + function big_wheel_y(angle){ + return clock_center.y + radius * Math.sin(angle*p180); + } + function rotate_around_x(center_x, angle, tick){ + return center_x + Math.cos(angle*p180) * tick.getWidth()/2; + } + function rotate_around_y(center_y, angle, tick){ + return center_y + Math.sin(angle*p180) * tick.getWidth()/2; + } + function hour_pos_x(angle){ + return clock_center.x + Math.cos(angle*p180) * hour_hand.width/2; + } + function hour_pos_y(angle){ + return clock_center.y + Math.sin(angle*p180) * hour_hand.width/2; + } + function minute_pos_x(angle){ + return clock_center.x + Math.cos(angle*p180) * minute_hand.width/2; + } + function minute_pos_y(angle){ + return clock_center.y + Math.sin(angle*p180) * minute_hand.width/2; + } + function minute_angle(date){ + //let minutes = date.getMinutes() + date.getSeconds()/60; + let minutes = date.getMinutes(); + return 6*minutes - 90; + } + function hour_angle(date){ + let hours= date.getHours() + date.getMinutes()/60; + return 30*hours - 90; + } + + function draw_clock(){ + //console.log("draw_clock"); + let date = new Date(); + //g.clear(); + g.setBgColor(0,0,0); + g.setColor(0,0,0); + g.fillRect(0,24,239,239); // clear app area + g.setColor(1,1,1); + + // draw cross lines for testing + // g.setColor(1,0,0); + // g.drawLine(clock_center.x - radius, clock_center.y, clock_center.x + radius, clock_center.y); + // g.drawLine(clock_center.x, clock_center.y - radius, clock_center.x, clock_center.y + radius); + + g.setColor(1,1,1); + let ticks = [0, 90, 180, 270]; + ticks.forEach((item)=>{ + let agl = item+180; + g.drawImage(tick0.asImage(), rotate_around_x(big_wheel_x(item), agl, tick0), rotate_around_y(big_wheel_y(item), agl, tick0), {rotate:agl*p180}); + }); + ticks = [30, 60, 120, 150, 210, 240, 300, 330]; + ticks.forEach((item)=>{ + let agl = item+180; + g.drawImage(tick5.asImage(), rotate_around_x(big_wheel_x(item), agl, tick5), rotate_around_y(big_wheel_y(item), agl, tick5), {rotate:agl*p180}); + }); + + let hour_agl = hour_angle(date); + let minute_agl = minute_angle(date); + g.drawImage(hour_hand, hour_pos_x(hour_agl), hour_pos_y(hour_agl), {rotate:hour_agl*p180}); // + g.drawImage(minute_hand, minute_pos_x(minute_agl), minute_pos_y(minute_agl), {rotate:minute_agl*p180}); // + g.setColor(1,1,1); + g.fillCircle(clock_center.x, clock_center.y, 6); + g.setColor(0,0,0); + g.fillCircle(clock_center.x, clock_center.y, 3); + + // draw minute ticks. Takes long time to draw! + g.setColor(1,1,1); + for (var i=0; i<60; i++){ + let agl = i*6+180; + g.drawImage(tick1.asImage(), rotate_around_x(big_wheel_x(i*6), agl, tick1), rotate_around_y(big_wheel_y(i*6), agl, tick1), {rotate:agl*p180}); + } + + g.flip(); + //console.log(date); + } + function clearTimers(){ + //console.log("clearTimers"); + if(intervalRef) { + clearInterval(intervalRef); + intervalRef = null; + //console.log("interval is cleared"); + } + } + function startTimers(){ + //console.log("startTimers"); + if(intervalRef) clearTimers(); + intervalRef = setInterval(draw_clock, 60*1000); + //console.log("interval is set"); + draw_clock(); + } + + Bangle.on('lcdPower', (on) => { + if (on) { + //console.log("lcdPower: on"); + try { if (drawWidgets) { drawWidgets();} } catch(err) {} + startTimers(); + } else { + //console.log("lcdPower: off"); + clearTimers(); + } + }); + Bangle.on('faceUp',function(up){ + //console.log("faceUp: " + up + " LCD: " + Bangle.isLCDOn()); + if (up && !Bangle.isLCDOn()) { + //console.log("faceUp and LCD off"); + clearTimers(); + Bangle.setLCDPower(true); + } + }); + + g.clear(); + //Bangle.setLCDPower(true); + startTimers(); + +})(); diff --git a/apps/boldclk/bold_clock.json b/apps/boldclk/bold_clock.json new file mode 100644 index 000000000..45ceede6b --- /dev/null +++ b/apps/boldclk/bold_clock.json @@ -0,0 +1,7 @@ +{ + "name":"Bold Clock", + "type":"clock", + "icon":"*boldclk", + "src":"-boldclk", + "sortorder":-10 +} \ No newline at end of file diff --git a/apps/boldclk/bold_clock.png b/apps/boldclk/bold_clock.png new file mode 100644 index 0000000000000000000000000000000000000000..5fc8231153d3be46adc1b50ca41b271f66f77b5b GIT binary patch literal 1035 zcmV+m1oZofP)Iut!lUXxB`N_hsF0b&FZUAm}E6_|nAR9=k0 zixC(~Dlr2)BaqT1l{^E#b=g^p2|vTVnC!|JeYVbD$JCq!YppS+X&NGO&e0lpXqv_t zW34@J!NvX*!?Jz4!C^95eC0{SXJFY1)3@1)T_0YouxFy_Zrh77HN+=bVVF zwL%CC6GB*PiHLJ9gjg&VQcCZAnx<7%&FAyFu8(haREA0^s6z;0j49XnF=ppd7@1|6 z5TYzgB2r2n-R=+}7)qY!L?oqj&h1_0;MtsWQc8&PsCgY)1;;9i0?QReaUP+fC~zb^ zlx2D7Y&+lPdCnMvz#(~9#uCd;z; zzfwwT9XC2c$T`Ot!-R`MYt0zjKH-MjuU4zNuC2A5{PXV+H(IS$d)?j`Lqu)yUKClD z5z%-&Zf}xAlN=6*Pft&bF@&{CODM+M_xE@2J%Y=(gb-ojoM)$@Q&AKJ9FQ>4GMOxw%j*Wl(P;Gg`uh3# znOJLKLsv{4v3lg3-$*GLW7Fxhs;VopnNFvSF)8IAx1UTV*P_zK7Y$f_yFd#eoN*yM z6=4lb%Cc;uKx>z&7GVsw=@iu@=fT!VV6 zWu0?cYwQ~%^MCk_vU)HW^qD~Fx_)?gczJo5&1O+K*S|`mc^a{i?FWNFS(Z}D(P(sO z@r*_zn8#o+XusbegdjN_4!0He&-)>9qi { + let intervalRef = null; + var width = 5 * 6*2 + var xpos = WIDGETPOS.tr - width; + WIDGETPOS.tr -= (width + 2); + + function draw() { + // Widget (0,0,239,23) + let date = new Date(); + var dateArray = date.toString().split(" "); + g.setColor(1,1,1); + g.setFont("6x8", 2); + g.setFontAlign(-1, 0); + g.drawString(dateArray[4].substr(0, 5), xpos, 11, true); // 5 * 6*2 = 60 + g.flip(); + } + function clearTimers(){ + if(intervalRef) { + clearInterval(intervalRef); + intervalRef = null; + } + } + function startTimers(){ + if(intervalRef) clearTimers(); + intervalRef = setInterval(draw, 60*1000); + draw(); + } + Bangle.on('lcdPower', (on) => { + if (on) { + // startTimers(); // comment out as it is called by app anyway + } else { + clearTimers(); + } + }); + + // add your widget + WIDGETS["wdclk"]={draw:startTimers}; + +})() \ No newline at end of file diff --git a/apps/wdclk/digital_clock_widget.json b/apps/wdclk/digital_clock_widget.json new file mode 100644 index 000000000..5d73e70e5 --- /dev/null +++ b/apps/wdclk/digital_clock_widget.json @@ -0,0 +1,5 @@ +{ + "name":"Digital Clock Widget", "type":"widget", + "src":"=wdclk" + } + \ No newline at end of file diff --git a/apps/wdclk/digital_clock_widget.png b/apps/wdclk/digital_clock_widget.png new file mode 100644 index 0000000000000000000000000000000000000000..5714ce274af7bdc62b8d8a9165fc9bc8a93bd820 GIT binary patch literal 422 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezr3(Fy?x?IEG|2zMbyh*JL2lF29*I z^f4z#gsP-MizbYNwW%YJF$eqy!$H(>ZPc)I$ztaD0e0sxq! ByZ- { + + // add the width + // WIDGETPOS.tr is originally 208 without any widgets + var xpos = WIDGETPOS.tr; // draw string with right alignment + var width = 48; + WIDGETPOS.tr -= (width + 2); + + let lastUpdate = new Date(); + let stp_today = 0; + + function erase() { + g.clearRect(xpos-width, 0, xpos, 23); + } + + // draw your widget at xpos + function draw() { + // Widget (0,0,239,23) + if (stp_today > 99999){ + stp_today = stp_today % 100000; // cap to five digits + comma = 6 characters + erase(); + } + let stps = stp_today.toString(); + if (stps.length > 3){ + stps = stps.slice(0,-3) + "," + stps.slice(-3); + } + g.setColor(1,1,1); + g.setFont("4x6", 2); + g.setFontAlign(1, 0); // align to x: right, y: center + g.drawString(stps, xpos, 11, true); // 6 * 4*2 = 48 + g.flip(); + } + + Bangle.on('step', (up) => { + let date = new Date(); + if (lastUpdate.getDate() == date.getDate()){ + stp_today += 1; + } else { + stp_today = 1; + erase(); + } + lastUpdate = date; + //console.log("up: " + up + " stp: " + stp_today + " " + date.toString()); + draw(); + }); + + // add your widget + WIDGETS["wpedom"]={draw:draw}; + +})() diff --git a/apps/wpedom/pedometer_widget.json b/apps/wpedom/pedometer_widget.json new file mode 100644 index 000000000..18703a2de --- /dev/null +++ b/apps/wpedom/pedometer_widget.json @@ -0,0 +1,5 @@ +{ + "name":"Pedometer Widget", "type":"widget", + "src":"=wpedom" + } + \ No newline at end of file diff --git a/apps/wpedom/pedometer_widget.png b/apps/wpedom/pedometer_widget.png new file mode 100644 index 0000000000000000000000000000000000000000..e4c07085297b98324733821450192569d2a1b778 GIT binary patch literal 1154 zcmV-|1bzF7P))Dx%axxUVh!r=&pUXyY~0)eb(M4&d|i6a4-C zAvrl2a&vRR$H#}#6@yH`*Vh;H_4UF0{Jh2Io}QjiUtbSVQBf4`6r8BOXmoVc>fn*5 zrzhy_?1cOKdn%U<5&;hn4=^z?LDug#kO4UgG|8c>MBf4O<8<~Gw}BI zM&*iwL;w!1zrWw=b6i?$Yiks)G>{0GnVEsRyF0~pa?*aSwb_w{M8Nd)G-n3|1!?-s z&d#zV$KeEE>_0m@Q*2*fUyGR+COoaJt#ER3BI}YvTENA{1!v>ANZbd^Twh;9Lqh|M zjg4tStzM)BJU>5kHqL-8USD6KtE&r|nwm)V2WbH=E-svn0~9GQFW1b<&dv@rHa0>} zPmffHl@=i80+=?6WMySRTU#3h2M2Rca2a7P-QM1=+rP8`amirvZi$411nB7KfRd6D z&8*3!nbHEhyu3KungGPj%?&ClDwvSO#6+b%Jw08wf1~cd{KnPQmHnb0A0Mm%1^iUN z3JVK^mX;P+UtecIAT>2rw|{8?NO*X-a)|Tu^J6jpC-9|K&w^e^cH*k4Du|DdXK5vV zK0ZF?o{OQD67t$8Qdd{UZB!VA%F4?AL;z_%0N*E5H7Ep&y?^jKF~|iR9UXCleSd$4 z^Ye3;Hj)f!v;ei4VRLl#mKoT3X_4JpaVT#ws?RRPhSRAq8OM5hG1fQW9ijWN>Y^ZgKQL zCSY-K5iTz;72Dg}o9)bLX=z-)?d@&H6M!$O7$!3_Gr`%}ndJa@J~DH9dI~QuFBEPW zBmyugxw^ViY)o>pv$GXjeKUzm4Mk8PEdZ--;>BHlem=WaH4_pN!aY}ul|@PbMwQ;) zUhe3C^?y9PsS)c$l=oy(0tN;KSgFJeCN|a8)tUqzZ|l`KgaFKA#jsggS_+||p_;y8 z-b{Jfty{q0;2>vXc7>7066z=fzr2?H3Ecu7A0L&^_`+6JR$A>VE+KUxSQgy^3JVL_ zn#aM{*4Elg07*qoM6N<$g0+qjh5!Hn literal 0 HcmV?d00001