From 843d1818eff65a6e4d9eb48a6e8b396371ccb77b Mon Sep 17 00:00:00 2001 From: czeppi Date: Sun, 29 Dec 2024 14:18:13 +0100 Subject: [PATCH 01/14] 1st Version - only copy of andark(0.0.8) --- apps/cc_clock24/ChangeLog | 1 + apps/cc_clock24/README.md | 16 +++ apps/cc_clock24/app.js | 178 ++++++++++++++++++++++++++ apps/cc_clock24/app_icon.js | 1 + apps/cc_clock24/cc_clock24_icon.png | Bin 0 -> 4002 bytes apps/cc_clock24/cc_clock24_screen.png | Bin 0 -> 3710 bytes apps/cc_clock24/metadata.json | 18 +++ apps/cc_clock24/settings.js | 28 ++++ 8 files changed, 242 insertions(+) create mode 100644 apps/cc_clock24/ChangeLog create mode 100644 apps/cc_clock24/README.md create mode 100644 apps/cc_clock24/app.js create mode 100644 apps/cc_clock24/app_icon.js create mode 100644 apps/cc_clock24/cc_clock24_icon.png create mode 100644 apps/cc_clock24/cc_clock24_screen.png create mode 100644 apps/cc_clock24/metadata.json create mode 100644 apps/cc_clock24/settings.js diff --git a/apps/cc_clock24/ChangeLog b/apps/cc_clock24/ChangeLog new file mode 100644 index 000000000..531e6c047 --- /dev/null +++ b/apps/cc_clock24/ChangeLog @@ -0,0 +1 @@ +0.01: Copied from andark (V0.08) diff --git a/apps/cc_clock24/README.md b/apps/cc_clock24/README.md new file mode 100644 index 000000000..84b1fa874 --- /dev/null +++ b/apps/cc_clock24/README.md @@ -0,0 +1,16 @@ +# Analog Clock With 24 hour hands + +## Features + +* second hand (only on unlocked screen) +* date +* battery percentage (showing charge status with color) +* turned off or swipeable widgets (choose in settings) + +![logo](cc_clock24_screen.png) + +## Settings + +* whether to load widgets, or not; if widgets are loaded, they are swipeable from the top; if not, NO ACTIONS of widgets are available +* date and battery can be printed both below hands (as if hands were physical) and above (more readable) +* hour hand can be made slighly shorter to improve readability when minute hand is behind a number diff --git a/apps/cc_clock24/app.js b/apps/cc_clock24/app.js new file mode 100644 index 000000000..9049dfdbd --- /dev/null +++ b/apps/cc_clock24/app.js @@ -0,0 +1,178 @@ +{ +const defaultSettings = { + loadWidgets : false, + textAboveHands : false, + shortHrHand : false +}; +const settings = Object.assign(defaultSettings, require('Storage').readJSON('cc_clock24.json',1)||{}); + +const c={"x":g.getWidth()/2,"y":g.getHeight()/2}; + +const zahlpos=(function() { + let z=[]; + let sk=1; + for(let i=-10;i<50;i+=5){ + let win=i*2*Math.PI/60; + let xsk =c.x+2+Math.cos(win)*(c.x-10), + ysk =c.y+2+Math.sin(win)*(c.x-10); + if(sk==3){xsk-=10;} + if(sk==6){ysk-=10;} + if(sk==9){xsk+=10;} + if(sk==12){ysk+=10;} + if(sk==10){xsk+=3;} + z.push([sk,xsk,ysk]); + sk+=1; + } + return z; +})(); + +const zeiger = function(len,dia,tim) { + const x=c.x+ Math.cos(tim)*len/2, + y=c.y + Math.sin(tim)*len/2, + d={"d":3,"x":dia/2*Math.cos(tim+Math.PI/2),"y":dia/2*Math.sin(tim+Math.PI/2)}, + pol=[c.x-d.x,c.y-d.y,c.x+d.x,c.y+d.y,x+d.x,y+d.y,x-d.x,y-d.y]; + return pol; +}; + +const drawHands = function(d) { + let m=d.getMinutes(), h=d.getHours(), s=d.getSeconds(); + g.setColor(1,1,1); + + if(h>12){ + h=h-12; + } + //calculates the position of the minute, second and hour hand + h=2*Math.PI/12*(h+m/60)-Math.PI/2; + //more accurate + //m=2*Math.PI/60*(m+s/60)-Math.PI/2; + m=2*Math.PI/60*(m)-Math.PI/2; + + s=2*Math.PI/60*s-Math.PI/2; + //g.setColor(1,0,0); + const hz = zeiger(settings.shortHrHand?88:100,5,h); + g.fillPoly(hz,true); + //g.setColor(1,1,1); + const minz = zeiger(150,5,m); + g.fillPoly(minz,true); + if (unlock){ + const sekz = zeiger(150,2,s); + g.fillPoly(sekz,true); + } + g.fillCircle(c.x,c.y,4); +}; + +const drawText = function(d) { + g.setFont("Vector",10); + g.setBgColor(0,0,0); + g.setColor(1,1,1); + const dateStr = require("locale").date(d); + g.drawString(dateStr, c.x, c.y+20, true); + const batStr = Math.round(E.getBattery()/5)*5+"%"; + if (Bangle.isCharging()) { + g.setBgColor(1,0,0); + } + g.drawString(batStr, c.x, c.y+40, true); +}; + +const drawNumbers = function() { + //draws the numbers on the screen + g.setFont("Vector",20); + g.setColor(1,1,1); + g.setBgColor(0,0,0); + for(let i = 0;i<12;i++){ + g.drawString(zahlpos[i][0],zahlpos[i][1],zahlpos[i][2],true); + } +}; + +let drawTimeout; +let queueMillis = 1000; +let unlock = true; + +const updateState = function() { + if (Bangle.isLCDOn()) { + if (!Bangle.isLocked()) { + queueMillis = 1000; + unlock = true; + } else { + queueMillis = 60000; + unlock = false; + } + draw(); + } else { + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = undefined; + } +}; + +const queueDraw = function() { + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = setTimeout(function() { + drawTimeout = undefined; + draw(); + }, queueMillis - (Date.now() % queueMillis)); +}; + +const draw = function() { + // draw black rectangle in the middle to clear screen from scale and hands + g.setColor(0,0,0); + g.fillRect(10,10,2*c.x-10,2*c.x-10); + // prepare for drawing the text + g.setFontAlign(0,0); + // do drawing + drawNumbers(); + const d=new Date(); + if (settings.textAboveHands) { + drawHands(d); drawText(d); + } else { + drawText(d); drawHands(d); + } + queueDraw(); +}; + +//draws the scale once the app is startet +const drawScale = function() { + // clear the screen + g.setBgColor(0,0,0); + g.clear(); + // draw the ticks of the scale + for(let i=-14;i<47;i++){ + const win=i*2*Math.PI/60; + let d=2; + if(i%5==0){d=5;} + g.fillPoly(zeiger(300,d,win),true); + g.setColor(0,0,0); + g.fillRect(10,10,2*c.x-10,2*c.x-10); + g.setColor(1,1,1); + } +}; + +//// main running sequence //// + +// Show launcher when middle button pressed, and widgets that we're clock +Bangle.setUI({ + mode: "clock", + remove: function() { + Bangle.removeListener('lcdPower', updateState); + Bangle.removeListener('lock', updateState); + Bangle.removeListener('charging', draw); + // We clear drawTimout after removing all listeners, because they can add one again + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = undefined; + require("widget_utils").show(); + } +}); +// Load widgets if needed, and make them show swipeable +if (settings.loadWidgets) { + Bangle.loadWidgets(); + require("widget_utils").swipeOn(); +} else if (global.WIDGETS) require("widget_utils").hide(); + +// Stop updates when LCD is off, restart when on +Bangle.on('lcdPower', updateState); +Bangle.on('lock', updateState); +Bangle.on('charging', draw); // Immediately redraw when charger (dis)connected + +updateState(); +drawScale(); +draw(); +} diff --git a/apps/cc_clock24/app_icon.js b/apps/cc_clock24/app_icon.js new file mode 100644 index 000000000..b213fe5c8 --- /dev/null +++ b/apps/cc_clock24/app_icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwgIEBoUAiAKCgUCBQUEColEAYUQhAmKCwgeCAAcCgEDjwEBkEAg8TBocNgYFDh8GAYMDxkPjEA8EAwkHJgIcBAoPfAoYWCBYYFIgfvAoX4FYRJEAp9gAomYNAOAArPwAogAC4AFiRoIFJLgIFJuADCg//Q4U//4FDj4FEAAV4Aoi0CSxBsCA==")) \ No newline at end of file diff --git a/apps/cc_clock24/cc_clock24_icon.png b/apps/cc_clock24/cc_clock24_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..cded02071d3610f442f0ce327f01943a2c915753 GIT binary patch literal 4002 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 literal 0 HcmV?d00001 diff --git a/apps/cc_clock24/metadata.json b/apps/cc_clock24/metadata.json new file mode 100644 index 000000000..e450893b7 --- /dev/null +++ b/apps/cc_clock24/metadata.json @@ -0,0 +1,18 @@ +{ "id": "cc_clock24", + "name": "CC Clock 24", + "shortName":"CC-Clock24", + "version":"0.01", + "description": "analog clock face with 24 hour pointer", + "icon": "cc_clock24_icon.png", + "type": "clock", + "tags": "clock", + "supports" : ["BANGLEJS2"], + "screenshots": [{"url":"cc_clock24_screen.png"}], + "readme": "README.md", + "storage": [ + {"name":"cc_clock24.app.js","url":"app.js"}, + {"name":"cc_clock24.settings.js","url":"settings.js"}, + {"name":"cc_clock24.img","url":"app_icon.js","evaluate":true} + ], + "data": [{"name":"cc_clock24.json"}] +} diff --git a/apps/cc_clock24/settings.js b/apps/cc_clock24/settings.js new file mode 100644 index 000000000..46401e526 --- /dev/null +++ b/apps/cc_clock24/settings.js @@ -0,0 +1,28 @@ +(function(back) { + const defaultSettings = { + loadWidgets : false, + textAboveHands : false, + shortHrHand : false + } + let settings = Object.assign(defaultSettings, require('Storage').readJSON('cc_clock24.json',1)||{}); + + const save = () => require('Storage').write('cc_clock24.json', settings); + + const appMenu = { + '': {title: 'cc_clock24'}, '< Back': back, + /*LANG*/'Load widgets': { + value : !!settings.loadWidgets, + onchange : v => { settings.loadWidgets=v; save();} + }, + /*LANG*/'Text above hands': { + value : !!settings.textAboveHands, + onchange : v => { settings.textAboveHands=v; save();} + }, + /*LANG*/'Short hour hand': { + value : !!settings.shortHrHand, + onchange : v => { settings.shortHrHand=v; save();} + }, + }; + + E.showMenu(appMenu); +}) From 99854df4df8b735751d1cb190811531af63843de Mon Sep 17 00:00:00 2001 From: czeppi Date: Tue, 31 Dec 2024 11:05:47 +0100 Subject: [PATCH 02/14] add 24 hour mode --- apps/cc_clock24/app.js | 20 ++++++++++++++------ apps/cc_clock24/settings.js | 7 ++++++- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/apps/cc_clock24/app.js b/apps/cc_clock24/app.js index 9049dfdbd..b54692660 100644 --- a/apps/cc_clock24/app.js +++ b/apps/cc_clock24/app.js @@ -2,7 +2,8 @@ const defaultSettings = { loadWidgets : false, textAboveHands : false, - shortHrHand : false + shortHrHand : false, + show24HourMode : true }; const settings = Object.assign(defaultSettings, require('Storage').readJSON('cc_clock24.json',1)||{}); @@ -37,12 +38,15 @@ const zeiger = function(len,dia,tim) { const drawHands = function(d) { let m=d.getMinutes(), h=d.getHours(), s=d.getSeconds(); g.setColor(1,1,1); - - if(h>12){ - h=h-12; + + let numHoursForHourHand = settings.show24HourMode? 24 : 12; + + if(h>numHoursForHourHand){ + h=h-numHoursForHourHand; } + //calculates the position of the minute, second and hour hand - h=2*Math.PI/12*(h+m/60)-Math.PI/2; + h=2*Math.PI/numHoursForHourHand*(h+m/60)-Math.PI/2; //more accurate //m=2*Math.PI/60*(m+s/60)-Math.PI/2; m=2*Math.PI/60*(m)-Math.PI/2; @@ -80,7 +84,11 @@ const drawNumbers = function() { g.setColor(1,1,1); g.setBgColor(0,0,0); for(let i = 0;i<12;i++){ - g.drawString(zahlpos[i][0],zahlpos[i][1],zahlpos[i][2],true); + hour = zahlpos[i][0] + if (settings.show24HourMode){ + hour *= 2; + } + g.drawString(hour,zahlpos[i][1],zahlpos[i][2],true); } }; diff --git a/apps/cc_clock24/settings.js b/apps/cc_clock24/settings.js index 46401e526..4695baee8 100644 --- a/apps/cc_clock24/settings.js +++ b/apps/cc_clock24/settings.js @@ -2,7 +2,8 @@ const defaultSettings = { loadWidgets : false, textAboveHands : false, - shortHrHand : false + shortHrHand : false, + show24HourMode : true } let settings = Object.assign(defaultSettings, require('Storage').readJSON('cc_clock24.json',1)||{}); @@ -22,6 +23,10 @@ value : !!settings.shortHrHand, onchange : v => { settings.shortHrHand=v; save();} }, + /*LANG*/'Show 24 hour mode': { + value : !!settings.show24HourMode, + onchange : v => { settings.show24HourMode=v; save();} + }, }; E.showMenu(appMenu); From ed58557824f17afb0b53971d5fa7ba4ac3c813cd Mon Sep 17 00:00:00 2001 From: czeppi Date: Tue, 31 Dec 2024 13:24:17 +0100 Subject: [PATCH 03/14] increase readability by adding some spaces --- apps/cc_clock24/app.js | 155 ++++++++++++++++++++---------------- apps/cc_clock24/settings.js | 4 +- 2 files changed, 90 insertions(+), 69 deletions(-) diff --git a/apps/cc_clock24/app.js b/apps/cc_clock24/app.js index b54692660..8dd7feb1e 100644 --- a/apps/cc_clock24/app.js +++ b/apps/cc_clock24/app.js @@ -1,94 +1,110 @@ { + const defaultSettings = { loadWidgets : false, textAboveHands : false, shortHrHand : false, - show24HourMode : true + show24HourMode : false }; -const settings = Object.assign(defaultSettings, require('Storage').readJSON('cc_clock24.json',1)||{}); -const c={"x":g.getWidth()/2,"y":g.getHeight()/2}; +const settings = Object.assign(defaultSettings, require('Storage').readJSON('cc_clock24.json', 1) || {}); -const zahlpos=(function() { - let z=[]; - let sk=1; - for(let i=-10;i<50;i+=5){ - let win=i*2*Math.PI/60; - let xsk =c.x+2+Math.cos(win)*(c.x-10), - ysk =c.y+2+Math.sin(win)*(c.x-10); - if(sk==3){xsk-=10;} - if(sk==6){ysk-=10;} - if(sk==9){xsk+=10;} - if(sk==12){ysk+=10;} - if(sk==10){xsk+=3;} - z.push([sk,xsk,ysk]); - sk+=1; +const c = { + "x": g.getWidth()/2, + "y": g.getHeight()/2 +}; + +const zahlpos = (function() { + let z = []; + let sk = 1; + for (let i = -10; i < 50; i += 5){ + let win = i * 2 * Math.PI / 60; + let xsk = c.x + 2 + Math.cos(win) * (c.x - 10), + ysk = c.y + 2 + Math.sin(win) * (c.x - 10); + if (sk==3){ xsk -=10; } + if (sk==6){ ysk -=10; } + if (sk==9){ xsk +=10; } + if (sk==12){ ysk +=10; } + if (sk==10){ xsk +=3; } + z.push([sk, xsk, ysk]); + sk += 1; } return z; })(); -const zeiger = function(len,dia,tim) { - const x=c.x+ Math.cos(tim)*len/2, - y=c.y + Math.sin(tim)*len/2, - d={"d":3,"x":dia/2*Math.cos(tim+Math.PI/2),"y":dia/2*Math.sin(tim+Math.PI/2)}, - pol=[c.x-d.x,c.y-d.y,c.x+d.x,c.y+d.y,x+d.x,y+d.y,x-d.x,y-d.y]; +const zeiger = function(len, dia, tim) { + const x = c.x + Math.cos(tim) * len/2, + y = c.y + Math.sin(tim) * len/2, + d = { + "d": 3, + "x": dia/2 * Math.cos(tim + Math.PI/2), + "y": dia/2 * Math.sin(tim + Math.PI/2) + }, + pol = [ + c.x - d.x, + c.y - d.y, + c.x + d.x, + c.y + d.y, + x + d.x, + y + d.y, + x - d.x, + y - d.y + ]; return pol; }; const drawHands = function(d) { - let m=d.getMinutes(), h=d.getHours(), s=d.getSeconds(); - g.setColor(1,1,1); + let m = d.getMinutes(), h = d.getHours(), s = d.getSeconds(); + g.setColor(1, 1, 1); let numHoursForHourHand = settings.show24HourMode? 24 : 12; - if(h>numHoursForHourHand){ - h=h-numHoursForHourHand; + if(h > numHoursForHourHand){ + h = h - numHoursForHourHand; } - //calculates the position of the minute, second and hour hand - h=2*Math.PI/numHoursForHourHand*(h+m/60)-Math.PI/2; - //more accurate - //m=2*Math.PI/60*(m+s/60)-Math.PI/2; - m=2*Math.PI/60*(m)-Math.PI/2; - - s=2*Math.PI/60*s-Math.PI/2; + // calculates the position of the minute, second and hour hand + h = 2 * Math.PI / numHoursForHourHand * (h + m/60) - Math.PI/2; + m = 2 * Math.PI / 60 * m - Math.PI/2; + s = 2 * Math.PI / 60 * s - Math.PI/2; + //g.setColor(1,0,0); - const hz = zeiger(settings.shortHrHand?88:100,5,h); - g.fillPoly(hz,true); - //g.setColor(1,1,1); - const minz = zeiger(150,5,m); - g.fillPoly(minz,true); + const hz = zeiger(settings.shortHrHand? 88 : 100, 5, h); + g.fillPoly(hz, true); + //g.setColor(1, 1, 1); + const minz = zeiger(150, 5, m); + g.fillPoly(minz, true); if (unlock){ - const sekz = zeiger(150,2,s); - g.fillPoly(sekz,true); + const sekz = zeiger(150, 2, s); + g.fillPoly(sekz, true); } - g.fillCircle(c.x,c.y,4); + g.fillCircle(c.x, c.y, 4); }; const drawText = function(d) { - g.setFont("Vector",10); - g.setBgColor(0,0,0); - g.setColor(1,1,1); + g.setFont("Vector", 10); + g.setBgColor(0, 0, 0); + g.setColor(1, 1, 1); const dateStr = require("locale").date(d); - g.drawString(dateStr, c.x, c.y+20, true); - const batStr = Math.round(E.getBattery()/5)*5+"%"; + g.drawString(dateStr, c.x, c.y + 20, true); + const batStr = Math.round(E.getBattery()/5) * 5 + "%"; if (Bangle.isCharging()) { - g.setBgColor(1,0,0); + g.setBgColor(1, 0, 0); } - g.drawString(batStr, c.x, c.y+40, true); + g.drawString(batStr, c.x, c.y + 40, true); }; const drawNumbers = function() { //draws the numbers on the screen - g.setFont("Vector",20); - g.setColor(1,1,1); - g.setBgColor(0,0,0); - for(let i = 0;i<12;i++){ + g.setFont("Vector", 20); + g.setColor(1, 1, 1); + g.setBgColor(0, 0, 0); + for(let i = 0; i < 12; i++){ hour = zahlpos[i][0] if (settings.show24HourMode){ hour *= 2; } - g.drawString(hour,zahlpos[i][1],zahlpos[i][2],true); + g.drawString(hour, zahlpos[i][1], zahlpos[i][2], true); } }; @@ -122,13 +138,13 @@ const queueDraw = function() { const draw = function() { // draw black rectangle in the middle to clear screen from scale and hands - g.setColor(0,0,0); - g.fillRect(10,10,2*c.x-10,2*c.x-10); + g.setColor(0, 0, 0); + g.fillRect(10, 10, 2 * c.x - 10, 2 * c.x - 10); // prepare for drawing the text - g.setFontAlign(0,0); + g.setFontAlign(0, 0); // do drawing drawNumbers(); - const d=new Date(); + const d = new Date(); if (settings.textAboveHands) { drawHands(d); drawText(d); } else { @@ -140,17 +156,17 @@ const draw = function() { //draws the scale once the app is startet const drawScale = function() { // clear the screen - g.setBgColor(0,0,0); + g.setBgColor(0, 0, 0); g.clear(); // draw the ticks of the scale - for(let i=-14;i<47;i++){ - const win=i*2*Math.PI/60; - let d=2; - if(i%5==0){d=5;} - g.fillPoly(zeiger(300,d,win),true); - g.setColor(0,0,0); - g.fillRect(10,10,2*c.x-10,2*c.x-10); - g.setColor(1,1,1); + for (let i = -14; i < 47; i++){ + const win= i * 2 * Math.PI/60; + let d = 2; + if (i % 5==0){ d =5; } + g.fillPoly(zeiger(300, d, win), true); + g.setColor(0, 0, 0); + g.fillRect(10, 10, 2 * c.x - 10, 2 * c.x - 10); + g.setColor(1, 1, 1); } }; @@ -163,17 +179,21 @@ Bangle.setUI({ Bangle.removeListener('lcdPower', updateState); Bangle.removeListener('lock', updateState); Bangle.removeListener('charging', draw); + // We clear drawTimout after removing all listeners, because they can add one again if (drawTimeout) clearTimeout(drawTimeout); drawTimeout = undefined; require("widget_utils").show(); } }); + // Load widgets if needed, and make them show swipeable if (settings.loadWidgets) { Bangle.loadWidgets(); require("widget_utils").swipeOn(); -} else if (global.WIDGETS) require("widget_utils").hide(); +} else if (global.WIDGETS) { + require("widget_utils").hide(); +} // Stop updates when LCD is off, restart when on Bangle.on('lcdPower', updateState); @@ -183,4 +203,5 @@ Bangle.on('charging', draw); // Immediately redraw when charger (dis)connected updateState(); drawScale(); draw(); + } diff --git a/apps/cc_clock24/settings.js b/apps/cc_clock24/settings.js index 4695baee8..4aa19215d 100644 --- a/apps/cc_clock24/settings.js +++ b/apps/cc_clock24/settings.js @@ -3,9 +3,9 @@ loadWidgets : false, textAboveHands : false, shortHrHand : false, - show24HourMode : true + show24HourMode : false } - let settings = Object.assign(defaultSettings, require('Storage').readJSON('cc_clock24.json',1)||{}); + let settings = Object.assign(defaultSettings, require('Storage').readJSON('cc_clock24.json',1) || {}); const save = () => require('Storage').write('cc_clock24.json', settings); From 0625b4c8c180b4047174c0fbf635bf866fb31881 Mon Sep 17 00:00:00 2001 From: czeppi Date: Tue, 31 Dec 2024 16:13:22 +0100 Subject: [PATCH 04/14] improve names (and translate german names) --- apps/cc_clock24/app.js | 116 +++++++++++++++++++++++------------------ 1 file changed, 64 insertions(+), 52 deletions(-) diff --git a/apps/cc_clock24/app.js b/apps/cc_clock24/app.js index 8dd7feb1e..3c3ad17a0 100644 --- a/apps/cc_clock24/app.js +++ b/apps/cc_clock24/app.js @@ -9,57 +9,58 @@ const defaultSettings = { const settings = Object.assign(defaultSettings, require('Storage').readJSON('cc_clock24.json', 1) || {}); -const c = { +const center = { "x": g.getWidth()/2, "y": g.getHeight()/2 }; -const zahlpos = (function() { +const hourNumberPositions = (function() { let z = []; let sk = 1; for (let i = -10; i < 50; i += 5){ - let win = i * 2 * Math.PI / 60; - let xsk = c.x + 2 + Math.cos(win) * (c.x - 10), - ysk = c.y + 2 + Math.sin(win) * (c.x - 10); - if (sk==3){ xsk -=10; } - if (sk==6){ ysk -=10; } - if (sk==9){ xsk +=10; } - if (sk==12){ ysk +=10; } - if (sk==10){ xsk +=3; } + let alpha = i * 2 * Math.PI / 60; + let xsk = center.x + 2 + Math.cos(alpha) * (center.x - 10), + ysk = center.y + 2 + Math.sin(alpha) * (center.x - 10); + if (sk==3){ xsk -= 10; } + if (sk==6){ ysk -= 10; } + if (sk==9){ xsk += 10; } + if (sk==12){ ysk += 10; } + if (sk==10){ xsk += 3; } z.push([sk, xsk, ysk]); sk += 1; } return z; })(); -const zeiger = function(len, dia, tim) { - const x = c.x + Math.cos(tim) * len/2, - y = c.y + Math.sin(tim) * len/2, +const calcHandPolygon = function(len, dia, alpha) { + const x = center.x + Math.cos(alpha) * len/2, + y = center.y + Math.sin(alpha) * len/2, d = { "d": 3, - "x": dia/2 * Math.cos(tim + Math.PI/2), - "y": dia/2 * Math.sin(tim + Math.PI/2) + "x": dia/2 * Math.cos(alpha + Math.PI/2), + "y": dia/2 * Math.sin(alpha + Math.PI/2) }, - pol = [ - c.x - d.x, - c.y - d.y, - c.x + d.x, - c.y + d.y, - x + d.x, - y + d.y, - x - d.x, - y - d.y - ]; - return pol; + return [ + center.x - d.x, + center.y - d.y, + center.x + d.x, + center.y + d.y, + x + d.x, + y + d.y, + x - d.x, + y - d.y + ]; }; -const drawHands = function(d) { - let m = d.getMinutes(), h = d.getHours(), s = d.getSeconds(); +const drawHands = function(date) { + let m = date.getMinutes(), + h = date.getHours(), + s = date.getSeconds(); g.setColor(1, 1, 1); let numHoursForHourHand = settings.show24HourMode? 24 : 12; - if(h > numHoursForHourHand){ + if (h > numHoursForHourHand){ h = h - numHoursForHourHand; } @@ -69,29 +70,32 @@ const drawHands = function(d) { s = 2 * Math.PI / 60 * s - Math.PI/2; //g.setColor(1,0,0); - const hz = zeiger(settings.shortHrHand? 88 : 100, 5, h); - g.fillPoly(hz, true); + const hourPolygon = calcHandPolygon(settings.shortHrHand? 88 : 100, 5, h); + g.fillPoly(hourPolygon, true); //g.setColor(1, 1, 1); - const minz = zeiger(150, 5, m); - g.fillPoly(minz, true); + const minutePolygon = calcHandPolygon(150, 5, m); + g.fillPoly(minutePolygon, true); if (unlock){ - const sekz = zeiger(150, 2, s); - g.fillPoly(sekz, true); + const secondPolygon = calcHandPolygon(150, 2, s); + g.fillPoly(secondPolygon, true); } - g.fillCircle(c.x, c.y, 4); + g.fillCircle(center.x, center.y, 4); }; -const drawText = function(d) { +const drawText = function(date) { g.setFont("Vector", 10); g.setBgColor(0, 0, 0); g.setColor(1, 1, 1); - const dateStr = require("locale").date(d); - g.drawString(dateStr, c.x, c.y + 20, true); - const batStr = Math.round(E.getBattery()/5) * 5 + "%"; + + const dateStr = require("locale").date(date); + g.drawString(dateStr, center.x, center.y + 20, true); + + const batteryStr = Math.round(E.getBattery()/5) * 5 + "%"; + if (Bangle.isCharging()) { g.setBgColor(1, 0, 0); } - g.drawString(batStr, c.x, c.y + 40, true); + g.drawString(batteryStr, center.x, center.y + 40, true); }; const drawNumbers = function() { @@ -100,11 +104,11 @@ const drawNumbers = function() { g.setColor(1, 1, 1); g.setBgColor(0, 0, 0); for(let i = 0; i < 12; i++){ - hour = zahlpos[i][0] + hour = hourNumberPositions[i][0] if (settings.show24HourMode){ hour *= 2; } - g.drawString(hour, zahlpos[i][1], zahlpos[i][2], true); + g.drawString(hour, hourNumberPositions[i][1], hourNumberPositions[i][2], true); } }; @@ -139,16 +143,18 @@ const queueDraw = function() { const draw = function() { // draw black rectangle in the middle to clear screen from scale and hands g.setColor(0, 0, 0); - g.fillRect(10, 10, 2 * c.x - 10, 2 * c.x - 10); + g.fillRect(10, 10, 2 * center.x - 10, 2 * center.x - 10); // prepare for drawing the text g.setFontAlign(0, 0); // do drawing drawNumbers(); - const d = new Date(); + const date = new Date(); if (settings.textAboveHands) { - drawHands(d); drawText(d); + drawHands(date); + drawText(date); } else { - drawText(d); drawHands(d); + drawText(date); + drawHands(date); } queueDraw(); }; @@ -158,14 +164,17 @@ const drawScale = function() { // clear the screen g.setBgColor(0, 0, 0); g.clear(); + // draw the ticks of the scale for (let i = -14; i < 47; i++){ - const win= i * 2 * Math.PI/60; + const alpha = i * 2 * Math.PI/60; let d = 2; - if (i % 5==0){ d =5; } - g.fillPoly(zeiger(300, d, win), true); + if (i % 5 == 0) { + d = 5; + } + g.fillPoly(calcHandPolygon(300, d, alpha), true); g.setColor(0, 0, 0); - g.fillRect(10, 10, 2 * c.x - 10, 2 * c.x - 10); + g.fillRect(10, 10, 2 * center.x - 10, 2 * center.x - 10); g.setColor(1, 1, 1); } }; @@ -181,7 +190,10 @@ Bangle.setUI({ Bangle.removeListener('charging', draw); // We clear drawTimout after removing all listeners, because they can add one again - if (drawTimeout) clearTimeout(drawTimeout); + if (drawTimeout) { + clearTimeout(drawTimeout); + } + drawTimeout = undefined; require("widget_utils").show(); } From e6606979ee4540102eadd6728d362ba8ae9196e1 Mon Sep 17 00:00:00 2001 From: czeppi Date: Sat, 25 Jan 2025 10:43:07 +0100 Subject: [PATCH 05/14] small refactoring --- apps/cc_clock24/app.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/cc_clock24/app.js b/apps/cc_clock24/app.js index 3c3ad17a0..945a1c4b4 100644 --- a/apps/cc_clock24/app.js +++ b/apps/cc_clock24/app.js @@ -168,11 +168,11 @@ const drawScale = function() { // draw the ticks of the scale for (let i = -14; i < 47; i++){ const alpha = i * 2 * Math.PI/60; - let d = 2; + let thickness = 2; if (i % 5 == 0) { - d = 5; + thickness = 5; } - g.fillPoly(calcHandPolygon(300, d, alpha), true); + g.fillPoly(calcHandPolygon(300, thickness, alpha), true); g.setColor(0, 0, 0); g.fillRect(10, 10, 2 * center.x - 10, 2 * center.x - 10); g.setColor(1, 1, 1); From 7eb6faa25d99645d7e85d17ce2b41bc21525488e Mon Sep 17 00:00:00 2001 From: czeppi Date: Mon, 3 Mar 2025 07:50:30 +0100 Subject: [PATCH 06/14] fix two small syntax errors --- apps/cc_clock24/app.js | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/apps/cc_clock24/app.js b/apps/cc_clock24/app.js index 945a1c4b4..b1a4dd3f8 100644 --- a/apps/cc_clock24/app.js +++ b/apps/cc_clock24/app.js @@ -40,16 +40,17 @@ const calcHandPolygon = function(len, dia, alpha) { "x": dia/2 * Math.cos(alpha + Math.PI/2), "y": dia/2 * Math.sin(alpha + Math.PI/2) }, - return [ - center.x - d.x, - center.y - d.y, - center.x + d.x, - center.y + d.y, - x + d.x, - y + d.y, - x - d.x, - y - d.y - ]; + polygon = [ + center.x - d.x, + center.y - d.y, + center.x + d.x, + center.y + d.y, + x + d.x, + y + d.y, + x - d.x, + y - d.y + ]; + return polygon; }; const drawHands = function(date) { @@ -104,7 +105,7 @@ const drawNumbers = function() { g.setColor(1, 1, 1); g.setBgColor(0, 0, 0); for(let i = 0; i < 12; i++){ - hour = hourNumberPositions[i][0] + hour = hourNumberPositions[i][0]; if (settings.show24HourMode){ hour *= 2; } @@ -142,7 +143,7 @@ const queueDraw = function() { const draw = function() { // draw black rectangle in the middle to clear screen from scale and hands - g.setColor(0, 0, 0); + g.setColor(0, 1, 1); g.fillRect(10, 10, 2 * center.x - 10, 2 * center.x - 10); // prepare for drawing the text g.setFontAlign(0, 0); From a55cf416ede034d1aa933687fa38d8526f13d913 Mon Sep 17 00:00:00 2001 From: czeppi Date: Mon, 3 Mar 2025 09:13:47 +0100 Subject: [PATCH 07/14] change background color back to black again --- apps/cc_clock24/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/cc_clock24/app.js b/apps/cc_clock24/app.js index b1a4dd3f8..7c7931c0e 100644 --- a/apps/cc_clock24/app.js +++ b/apps/cc_clock24/app.js @@ -143,7 +143,7 @@ const queueDraw = function() { const draw = function() { // draw black rectangle in the middle to clear screen from scale and hands - g.setColor(0, 1, 1); + g.setColor(0, 0, 0); g.fillRect(10, 10, 2 * center.x - 10, 2 * center.x - 10); // prepare for drawing the text g.setFontAlign(0, 0); From e8e52a5e9c55645217b36a4647aadfa06b2cbc21 Mon Sep 17 00:00:00 2001 From: czeppi Date: Thu, 6 Mar 2025 07:27:41 +0100 Subject: [PATCH 08/14] draw text red, if battery is low --- apps/cc_clock24/app.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/apps/cc_clock24/app.js b/apps/cc_clock24/app.js index 7c7931c0e..b075a41b6 100644 --- a/apps/cc_clock24/app.js +++ b/apps/cc_clock24/app.js @@ -86,12 +86,19 @@ const drawHands = function(date) { const drawText = function(date) { g.setFont("Vector", 10); g.setBgColor(0, 0, 0); - g.setColor(1, 1, 1); + + const batteryState = E.getBattery(); + if (batteryState < 20){ + g.setColor(1, 0, 0); // draw in red, if battery is low + } else { + g.setColor(1, 1, 1); + } const dateStr = require("locale").date(date); g.drawString(dateStr, center.x, center.y + 20, true); - const batteryStr = Math.round(E.getBattery()/5) * 5 + "%"; + + const batteryStr = batteryState + "%"; if (Bangle.isCharging()) { g.setBgColor(1, 0, 0); From 27d0b043e35e179f75b001c4fe10e455c4defae2 Mon Sep 17 00:00:00 2001 From: czeppi Date: Thu, 6 Mar 2025 08:13:16 +0100 Subject: [PATCH 09/14] - sort functions - draw numbers red, if battery low --- apps/cc_clock24/app.js | 206 +++++++++++++++++++++++------------------ 1 file changed, 114 insertions(+), 92 deletions(-) diff --git a/apps/cc_clock24/app.js b/apps/cc_clock24/app.js index b075a41b6..1f94da318 100644 --- a/apps/cc_clock24/app.js +++ b/apps/cc_clock24/app.js @@ -1,4 +1,6 @@ { + +// ----- const ----- const defaultSettings = { loadWidgets : false, @@ -21,17 +23,67 @@ const hourNumberPositions = (function() { let alpha = i * 2 * Math.PI / 60; let xsk = center.x + 2 + Math.cos(alpha) * (center.x - 10), ysk = center.y + 2 + Math.sin(alpha) * (center.x - 10); + if (sk==3){ xsk -= 10; } if (sk==6){ ysk -= 10; } if (sk==9){ xsk += 10; } if (sk==12){ ysk += 10; } if (sk==10){ xsk += 3; } + z.push([sk, xsk, ysk]); sk += 1; } return z; })(); + +// ----- global vars ----- + +let drawTimeout; +let queueMillis = 1000; +let unlock = true; + + +// ----- functions ----- + +const updateState = function() { + if (Bangle.isLCDOn()) { + if (!Bangle.isLocked()) { + queueMillis = 1000; + unlock = true; + } + else { + queueMillis = 60000; + unlock = false; + } + draw(); + } + else { + if (drawTimeout) + clearTimeout(drawTimeout); + drawTimeout = undefined; + } +}; + +const drawScale = function() { // draws the scale once the app is startet + // clear the screen + g.setBgColor(0, 0, 0); + g.clear(); + + // draw the ticks of the scale + for (let i = -14; i < 47; i++){ + const alpha = i * 2 * Math.PI/60; + let thickness = 2; + if (i % 5 == 0) { + thickness = 5; + } + g.fillPoly(calcHandPolygon(300, thickness, alpha), true); + g.setColor(0, 0, 0); + g.fillRect(10, 10, 2 * center.x - 10, 2 * center.x - 10); + g.setColor(1, 1, 1); + } +}; + const calcHandPolygon = function(len, dia, alpha) { const x = center.x + Math.cos(alpha) * len/2, y = center.y + Math.sin(alpha) * len/2, @@ -53,6 +105,50 @@ const calcHandPolygon = function(len, dia, alpha) { return polygon; }; + +// ----- draw ---- + +const draw = function() { + // draw black rectangle in the middle to clear screen from scale and hands + g.setColor(0, 0, 0); + g.fillRect(10, 10, 2 * center.x - 10, 2 * center.x - 10); + // prepare for drawing the text + g.setFontAlign(0, 0); + // do drawing + drawNumbers(); + + const date = new Date(); + if (settings.textAboveHands) { + drawHands(date); + drawText(date); + } + else { + drawText(date); + drawHands(date); + } + queueDraw(); +}; + + +const drawNumbers = function() { + g.setFont("Vector", 20); + + const batteryState = E.getBattery(); + if (batteryState < 20) + g.setColor(1, 0, 0); // draw in red, if battery is low + else + g.setColor(1, 1, 1); + + g.setBgColor(0, 0, 0); + for(let i = 0; i < 12; i++){ + let hour = hourNumberPositions[i][0]; + if (settings.show24HourMode) + hour *= 2; + + g.drawString(hour, hourNumberPositions[i][1], hourNumberPositions[i][2], true); + } +}; + const drawHands = function(date) { let m = date.getMinutes(), h = date.getHours(), @@ -65,40 +161,35 @@ const drawHands = function(date) { h = h - numHoursForHourHand; } - // calculates the position of the minute, second and hour hand - h = 2 * Math.PI / numHoursForHourHand * (h + m/60) - Math.PI/2; - m = 2 * Math.PI / 60 * m - Math.PI/2; - s = 2 * Math.PI / 60 * s - Math.PI/2; + const hour_angle = 2 * Math.PI / numHoursForHourHand * (h + m/60) - Math.PI/2, + minute_angle = 2 * Math.PI / 60 * m - Math.PI/2, + second_angle = 2 * Math.PI / 60 * s - Math.PI/2; - //g.setColor(1,0,0); - const hourPolygon = calcHandPolygon(settings.shortHrHand? 88 : 100, 5, h); + const hourPolygon = calcHandPolygon(settings.shortHrHand? 88 : 100, 5, hour_angle); g.fillPoly(hourPolygon, true); - //g.setColor(1, 1, 1); - const minutePolygon = calcHandPolygon(150, 5, m); + + const minutePolygon = calcHandPolygon(150, 5, minute_angle); g.fillPoly(minutePolygon, true); + if (unlock){ - const secondPolygon = calcHandPolygon(150, 2, s); + const secondPolygon = calcHandPolygon(150, 2, second_angle); g.fillPoly(secondPolygon, true); } g.fillCircle(center.x, center.y, 4); }; const drawText = function(date) { + if (!unlock) + return + g.setFont("Vector", 10); g.setBgColor(0, 0, 0); - - const batteryState = E.getBattery(); - if (batteryState < 20){ - g.setColor(1, 0, 0); // draw in red, if battery is low - } else { - g.setColor(1, 1, 1); - } + g.setColor(1, 1, 1); const dateStr = require("locale").date(date); g.drawString(dateStr, center.x, center.y + 20, true); - - const batteryStr = batteryState + "%"; + const batteryStr = E.getBattery() + "%"; if (Bangle.isCharging()) { g.setBgColor(1, 0, 0); @@ -106,86 +197,16 @@ const drawText = function(date) { g.drawString(batteryStr, center.x, center.y + 40, true); }; -const drawNumbers = function() { - //draws the numbers on the screen - g.setFont("Vector", 20); - g.setColor(1, 1, 1); - g.setBgColor(0, 0, 0); - for(let i = 0; i < 12; i++){ - hour = hourNumberPositions[i][0]; - if (settings.show24HourMode){ - hour *= 2; - } - g.drawString(hour, hourNumberPositions[i][1], hourNumberPositions[i][2], true); - } -}; - -let drawTimeout; -let queueMillis = 1000; -let unlock = true; - -const updateState = function() { - if (Bangle.isLCDOn()) { - if (!Bangle.isLocked()) { - queueMillis = 1000; - unlock = true; - } else { - queueMillis = 60000; - unlock = false; - } - draw(); - } else { - if (drawTimeout) clearTimeout(drawTimeout); - drawTimeout = undefined; - } -}; - const queueDraw = function() { - if (drawTimeout) clearTimeout(drawTimeout); + if (drawTimeout) + clearTimeout(drawTimeout); + drawTimeout = setTimeout(function() { drawTimeout = undefined; draw(); }, queueMillis - (Date.now() % queueMillis)); }; -const draw = function() { - // draw black rectangle in the middle to clear screen from scale and hands - g.setColor(0, 0, 0); - g.fillRect(10, 10, 2 * center.x - 10, 2 * center.x - 10); - // prepare for drawing the text - g.setFontAlign(0, 0); - // do drawing - drawNumbers(); - const date = new Date(); - if (settings.textAboveHands) { - drawHands(date); - drawText(date); - } else { - drawText(date); - drawHands(date); - } - queueDraw(); -}; - -//draws the scale once the app is startet -const drawScale = function() { - // clear the screen - g.setBgColor(0, 0, 0); - g.clear(); - - // draw the ticks of the scale - for (let i = -14; i < 47; i++){ - const alpha = i * 2 * Math.PI/60; - let thickness = 2; - if (i % 5 == 0) { - thickness = 5; - } - g.fillPoly(calcHandPolygon(300, thickness, alpha), true); - g.setColor(0, 0, 0); - g.fillRect(10, 10, 2 * center.x - 10, 2 * center.x - 10); - g.setColor(1, 1, 1); - } -}; //// main running sequence //// @@ -211,7 +232,8 @@ Bangle.setUI({ if (settings.loadWidgets) { Bangle.loadWidgets(); require("widget_utils").swipeOn(); -} else if (global.WIDGETS) { +} +else if (global.WIDGETS) { require("widget_utils").hide(); } From 567b37d948d572cecfd44f72ee77c486b0cf83fd Mon Sep 17 00:00:00 2001 From: czeppi Date: Sat, 15 Mar 2025 12:35:58 +0100 Subject: [PATCH 10/14] more refactoring add orange color if battery is between 20 and 40% change date format --- apps/cc_clock24/ChangeLog | 4 +- apps/cc_clock24/app.js | 200 ++++++++++++++++++++++---------------- 2 files changed, 117 insertions(+), 87 deletions(-) diff --git a/apps/cc_clock24/ChangeLog b/apps/cc_clock24/ChangeLog index 531e6c047..c807c40a0 100644 --- a/apps/cc_clock24/ChangeLog +++ b/apps/cc_clock24/ChangeLog @@ -1 +1,3 @@ -0.01: Copied from andark (V0.08) +0.01: copied from andark (V0.08) + refactored + add 24 hour mode diff --git a/apps/cc_clock24/app.js b/apps/cc_clock24/app.js index 1f94da318..82487a5dd 100644 --- a/apps/cc_clock24/app.js +++ b/apps/cc_clock24/app.js @@ -1,5 +1,3 @@ -{ - // ----- const ----- const defaultSettings = { @@ -17,23 +15,23 @@ const center = { }; const hourNumberPositions = (function() { - let z = []; - let sk = 1; - for (let i = -10; i < 50; i += 5){ - let alpha = i * 2 * Math.PI / 60; - let xsk = center.x + 2 + Math.cos(alpha) * (center.x - 10), - ysk = center.y + 2 + Math.sin(alpha) * (center.x - 10); - - if (sk==3){ xsk -= 10; } - if (sk==6){ ysk -= 10; } - if (sk==9){ xsk += 10; } - if (sk==12){ ysk += 10; } - if (sk==10){ xsk += 3; } - - z.push([sk, xsk, ysk]); - sk += 1; + let positions = []; + + for (let hour = 1; hour <= 12; hour += 1) { + let phi = 30 * (hour - 3) * (Math.PI / 180); + let x = center.x + 2 + Math.cos(phi) * (center.x - 10); + let y = center.y + 2 + Math.sin(phi) * (center.x - 10); + + // fix positions, which are not on a circle + if (hour == 3){ x -= 10; } + else if (hour == 6){ y -= 10; } + else if (hour == 9){ x += 10; } + else if (hour == 12){ y += 10; } + else if (hour == 10){ x += 3; } + + positions.push([hour, x, y]); } - return z; + return positions; })(); @@ -42,11 +40,14 @@ const hourNumberPositions = (function() { let drawTimeout; let queueMillis = 1000; let unlock = true; +let lastBatteryStates = [E.getBattery()]; // ----- functions ----- -const updateState = function() { +function updateState() { + updateBatteryStates(); + if (Bangle.isLCDOn()) { if (!Bangle.isLocked()) { queueMillis = 1000; @@ -57,40 +58,47 @@ const updateState = function() { unlock = false; } draw(); - } + } else { - if (drawTimeout) + if (drawTimeout) clearTimeout(drawTimeout); drawTimeout = undefined; } -}; +} -const drawScale = function() { // draws the scale once the app is startet - // clear the screen + +function updateBatteryStates() { + lastBatteryStates.push(E.getBattery()); + if (lastBatteryStates.length > 5) + lastBatteryStates.shift(); // remove 1st item +} + +function drawTicks() { // draws the scale once the app is startet + // clear screen g.setBgColor(0, 0, 0); g.clear(); - - // draw the ticks of the scale - for (let i = -14; i < 47; i++){ - const alpha = i * 2 * Math.PI/60; + + // draw ticks + for (let i = 1; i <= 60; i++){ + const phi = 6 * i * (Math.PI / 180); let thickness = 2; - if (i % 5 == 0) { + if (i % 5 == 0) thickness = 5; - } - g.fillPoly(calcHandPolygon(300, thickness, alpha), true); + + g.fillPoly(calcHandPolygon(300, thickness, phi), true); g.setColor(0, 0, 0); g.fillRect(10, 10, 2 * center.x - 10, 2 * center.x - 10); g.setColor(1, 1, 1); } -}; +} -const calcHandPolygon = function(len, dia, alpha) { - const x = center.x + Math.cos(alpha) * len/2, - y = center.y + Math.sin(alpha) * len/2, +function calcHandPolygon(len, thickness, phi) { + const x = center.x + Math.cos(phi) * len/2, + y = center.y + Math.sin(phi) * len/2, d = { "d": 3, - "x": dia/2 * Math.cos(alpha + Math.PI/2), - "y": dia/2 * Math.sin(alpha + Math.PI/2) + "x": thickness/2 * Math.cos(phi + Math.PI/2), + "y": thickness/2 * Math.sin(phi + Math.PI/2) }, polygon = [ center.x - d.x, @@ -103,20 +111,19 @@ const calcHandPolygon = function(len, dia, alpha) { y - d.y ]; return polygon; -}; +} // ----- draw ---- -const draw = function() { +function draw() { // draw black rectangle in the middle to clear screen from scale and hands g.setColor(0, 0, 0); g.fillRect(10, 10, 2 * center.x - 10, 2 * center.x - 10); - // prepare for drawing the text + g.setFontAlign(0, 0); - // do drawing drawNumbers(); - + const date = new Date(); if (settings.textAboveHands) { drawHands(date); @@ -127,77 +134,101 @@ const draw = function() { drawHands(date); } queueDraw(); -}; +} -const drawNumbers = function() { +function drawNumbers() { g.setFont("Vector", 20); - - const batteryState = E.getBattery(); + + const batteryState = calcAvgBatteryState(); if (batteryState < 20) g.setColor(1, 0, 0); // draw in red, if battery is low + else if (batteryState < 40) + g.setColor(1, 1, 0); else g.setColor(1, 1, 1); - + g.setBgColor(0, 0, 0); - for(let i = 0; i < 12; i++){ + for(let i = 0; i < 12; i++) { let hour = hourNumberPositions[i][0]; if (settings.show24HourMode) hour *= 2; - + g.drawString(hour, hourNumberPositions[i][1], hourNumberPositions[i][2], true); } -}; +} -const drawHands = function(date) { +function calcAvgBatteryState() { + const n = lastBatteryStates.length; + if (n == 0) + return 100; + + let sum = lastBatteryStates.reduce((acc, value) => acc + value, 0); + return Math.round(sum / n); +} + +function drawHands(date) { let m = date.getMinutes(), h = date.getHours(), s = date.getSeconds(); + g.setColor(1, 1, 1); - + let numHoursForHourHand = settings.show24HourMode? 24 : 12; - - if (h > numHoursForHourHand){ + + if (h > numHoursForHourHand) h = h - numHoursForHourHand; - } - + + const hour_angle = 2 * Math.PI / numHoursForHourHand * (h + m/60) - Math.PI/2, minute_angle = 2 * Math.PI / 60 * m - Math.PI/2, second_angle = 2 * Math.PI / 60 * s - Math.PI/2; - - const hourPolygon = calcHandPolygon(settings.shortHrHand? 88 : 100, 5, hour_angle); + + const hourPolygon = calcHandPolygon(settings.shortHrHand ? 88 : 100, 5, hour_angle); g.fillPoly(hourPolygon, true); - + const minutePolygon = calcHandPolygon(150, 5, minute_angle); g.fillPoly(minutePolygon, true); - - if (unlock){ + + if (unlock) { const secondPolygon = calcHandPolygon(150, 2, second_angle); g.fillPoly(secondPolygon, true); } g.fillCircle(center.x, center.y, 4); -}; +} -const drawText = function(date) { +function drawText(date) { if (!unlock) - return + return; - g.setFont("Vector", 10); g.setBgColor(0, 0, 0); - g.setColor(1, 1, 1); - - const dateStr = require("locale").date(date); - g.drawString(dateStr, center.x, center.y + 20, true); - - const batteryStr = E.getBattery() + "%"; - - if (Bangle.isCharging()) { - g.setBgColor(1, 0, 0); - } - g.drawString(batteryStr, center.x, center.y + 40, true); -}; + g.setColor(1, 1, 1); -const queueDraw = function() { + const today = new Date(); + const dateStr = formatDate(today); + g.setFont("Vector", 16); + g.drawString(dateStr, center.x + 5, center.y - 30, true); + + const batteryStr = calcAvgBatteryState() + "%"; + + if (Bangle.isCharging()) + g.setBgColor(1, 0, 0); + + g.setFont("Vector", 24); + g.drawString(batteryStr, center.x, center.y + 30, true); +} + +function formatDate(date) { + const weekdays = ["So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"]; + const month_names = ["Jan", "Feb", "Mär", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez"]; + const day = date.getDate(); + const month_name = month_names[date.getMonth()]; + const weekday = weekdays[date.getDay()]; + + return weekday + " " + day + ". " + month_name; +} + +function queueDraw() { if (drawTimeout) clearTimeout(drawTimeout); @@ -205,7 +236,7 @@ const queueDraw = function() { drawTimeout = undefined; draw(); }, queueMillis - (Date.now() % queueMillis)); -}; +} //// main running sequence //// @@ -217,12 +248,11 @@ Bangle.setUI({ Bangle.removeListener('lcdPower', updateState); Bangle.removeListener('lock', updateState); Bangle.removeListener('charging', draw); - + // We clear drawTimout after removing all listeners, because they can add one again - if (drawTimeout) { + if (drawTimeout) clearTimeout(drawTimeout); - } - + drawTimeout = undefined; require("widget_utils").show(); } @@ -243,7 +273,5 @@ Bangle.on('lock', updateState); Bangle.on('charging', draw); // Immediately redraw when charger (dis)connected updateState(); -drawScale(); +drawTicks(); draw(); - -} From 10334a0e3987526fab4356a14a4307d3554ef940 Mon Sep 17 00:00:00 2001 From: nujw Date: Tue, 18 Mar 2025 16:15:44 +1300 Subject: [PATCH 11/14] Update metadata.json --- apps/slomoclock/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/slomoclock/metadata.json b/apps/slomoclock/metadata.json index a59d82c3b..95fdc723b 100644 --- a/apps/slomoclock/metadata.json +++ b/apps/slomoclock/metadata.json @@ -2,7 +2,7 @@ "id": "slomoclock", "name": "SloMo Clock", "shortName": "SloMo Clock", - "version": "0.11", + "version": "0.20", "description": "Simple 24h clock face with large digits, hour above minute. Uses Layout library.", "icon": "watch.png", "type": "clock", From 95d60d9390bb72119bb6ad6f22b5ef80e4a894f7 Mon Sep 17 00:00:00 2001 From: nujw Date: Tue, 18 Mar 2025 16:25:29 +1300 Subject: [PATCH 12/14] Update app.js Add day of week to the display --- apps/slomoclock/app.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/apps/slomoclock/app.js b/apps/slomoclock/app.js index 6ffc08bdb..b7a270d45 100644 --- a/apps/slomoclock/app.js +++ b/apps/slomoclock/app.js @@ -3,6 +3,7 @@ Simple watch [slomoclock] Mike Bennett mike[at]kereru.com 0.01 : Initial 0.03 : Use Layout library +0.20 : Add day of week display */ //var v='0.10'; @@ -54,7 +55,8 @@ var layout = new Layout( { {type:"txt", font:"40%", label:"", id:"hour", valign:1}, {type:"txt", font:"40%", label:"", id:"min", valign:-1}, ]}, - {type:"v", c: [ + {type:"v", c: [ + {type:"txt", font:"10%", label:"", id:"dow", col:0xEFE0, halign:1}, {type:"txt", font:"10%", label:"", id:"day", col:0xEFE0, halign:1}, {type:"txt", font:"10%", label:"", id:"mon", col:0xEFE0, halign:1}, ]} @@ -82,6 +84,8 @@ function draw() { layout.min.col = cfg.colour==0 ? colH[hh] : cfg.colour==1 ? colH[colNum] :col[cfg.colour]; // Update date + var dayOfWeek = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]; + layout.dow.label = dayOfWeek[date.getDay()]; layout.day.label = date.getDate(); layout.mon.label = require("locale").month(date,1); From c0a0c4c2cb8d7d6fbf375787d8469d2e403ccf2d Mon Sep 17 00:00:00 2001 From: nujw Date: Tue, 18 Mar 2025 16:30:17 +1300 Subject: [PATCH 13/14] Update ChangeLog --- apps/slomoclock/ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/slomoclock/ChangeLog b/apps/slomoclock/ChangeLog index 28fd26391..cfec61ae0 100644 --- a/apps/slomoclock/ChangeLog +++ b/apps/slomoclock/ChangeLog @@ -1,3 +1,4 @@ 0.01: Created app 0.10: Different colour schemes selectable in SloMo Clock settings. 0.11: Minor code improvements +0.20: Add day of week to display From 710e8d7bb4330623d2904ab2a349bb24a5bd7397 Mon Sep 17 00:00:00 2001 From: Mo Abrahams Date: Sun, 16 Mar 2025 00:06:00 +0000 Subject: [PATCH 14/14] Enable Fast Loading for 93Dub watchface This commit enables fast loading by following the example at https://www.espruino.com/Bangle.js+Fast+Load. --- apps/93dub/ChangeLog | 1 + apps/93dub/app.js | 286 +++++++++++++++++++++------------------ apps/93dub/metadata.json | 2 +- 3 files changed, 153 insertions(+), 136 deletions(-) diff --git a/apps/93dub/ChangeLog b/apps/93dub/ChangeLog index 712a52a37..9a07b38ad 100644 --- a/apps/93dub/ChangeLog +++ b/apps/93dub/ChangeLog @@ -5,3 +5,4 @@ 0.05: Display time, even on Thursday 0.06: Fix light theme issue, where widgets would end up on a light strip 0.07: Minor code improvements +0.08: Support Fast Loading diff --git a/apps/93dub/app.js b/apps/93dub/app.js index c9f670993..dbf8ec907 100644 --- a/apps/93dub/app.js +++ b/apps/93dub/app.js @@ -1,146 +1,162 @@ -// get 12 hour status, code from barclock -const is12Hour = (require("Storage").readJSON("setting.json", 1) || {})["12hour"]; +{ + // get 12 hour status, code from barclock + const is12Hour = (require("Storage").readJSON("setting.json", 1) || {})["12hour"]; -// define background -var imgBg = require("heatshrink").decompress(atob("2GwgJC/AH4A/AH4A/AH4A/AH4A/ACcGAhAV/Cp3gvdug+Gj0AgeABYMBAQMIggVEg/w/9/h/Gn8As3ACpk559zznmseAs0B13nq/Rie+uodCIIUZw9hzFmv+AgcCmco7MRilow1ACpN8gFhwMilFRCoMowgVEIIVhIINhwFg4GiCpfw/dhx/mn4uBCoXRhWktAVFTIVhw9mj8YseDkUnqPEoeuugVEAAlgSgICBACAVC8AUQCQQVSAEsD/4ASeYgA/ACkHNiK5Cj4VR/AVBng+RCQVwCqMOAQPhIKOHgEB44VR8YVBx4VR+eAgOfCqPxwEDCqX5CoKvS/PAgc/YqQVU/gV/Cv4V/Cv4V/Cv4V/Cv4V/Cv4V/Cv4V/Cv4V/Cv4V/Cv4V/Cv4V/Cv4V/Cv4V/Cv4V/CsMfCqP4CoOfCqP54EBx4VR+OAgPPCqPzwEA44VR4cAgHhCqMHCoNwAQIAPjwCBngVRvgCBV6XwCoMHCqPAHyIA/AEigEf4IAOkAEDoAPJWAtA+PHv+Al6uPCofAGAgALoHz51/8AVT+IVS+4VPpMR73woH27n/8Eh8+ZmadIqsoyGICofAkMUktJFZAVBzgVBv34YgMhi8RkIVJnGQIIN8/H34FB8kJiIVIkVEyGQkF8/Pj4GBkhBKCoOexEQvHx8fBgMXzMxTJkICoXCVx8AggDGABsD/4AB/AVQAH4APA")); + // define background + const imgBg = require("heatshrink").decompress(atob("2GwgJC/AH4A/AH4A/AH4A/AH4A/ACcGAhAV/Cp3gvdug+Gj0AgeABYMBAQMIggVEg/w/9/h/Gn8As3ACpk559zznmseAs0B13nq/Rie+uodCIIUZw9hzFmv+AgcCmco7MRilow1ACpN8gFhwMilFRCoMowgVEIIVhIINhwFg4GiCpfw/dhx/mn4uBCoXRhWktAVFTIVhw9mj8YseDkUnqPEoeuugVEAAlgSgICBACAVC8AUQCQQVSAEsD/4ASeYgA/ACkHNiK5Cj4VR/AVBng+RCQVwCqMOAQPhIKOHgEB44VR8YVBx4VR+eAgOfCqPxwEDCqX5CoKvS/PAgc/YqQVU/gV/Cv4V/Cv4V/Cv4V/Cv4V/Cv4V/Cv4V/Cv4V/Cv4V/Cv4V/Cv4V/Cv4V/Cv4V/Cv4V/CsMfCqP4CoOfCqP54EBx4VR+OAgPPCqPzwEA44VR4cAgHhCqMHCoNwAQIAPjwCBngVRvgCBV6XwCoMHCqPAHyIA/AEigEf4IAOkAEDoAPJWAtA+PHv+Al6uPCofAGAgALoHz51/8AVT+IVS+4VPpMR73woH27n/8Eh8+ZmadIqsoyGICofAkMUktJFZAVBzgVBv34YgMhi8RkIVJnGQIIN8/H34FB8kJiIVIkVEyGQkF8/Pj4GBkhBKCoOexEQvHx8fBgMXzMxTJkICoXCVx8AggDGABsD/4AB/AVQAH4APA")); -// define fonts -// reg number first char 48 28 by 41 -var fontNum = atob("AAAAAAAAAAAAAA//8D//g//8P/+I//8//44//w//j4//A/+P4/8A/4/4AAAAD/4AAAAP/wAAAAf/gAAAA//AAAAB/+AAAAD/8AAAAH/4AAAAP/wAAAAf/gAAAA//AAAAB/+AAAAD/8AAAAH/wAAAAH/H/gH/H8f/gf/Hx//h//HH//n//Ef/+H//B//4H//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/wB/4AP/4H/4A//4f/4D//5//4P//h//4//+B//4AAAAAAAAAAAAAAAAAf/+AAAB//4gAAD//jgAAD/+PgABj/4/gAHj/j/gAfgAP/gA/AA//AB+AB/+AD8AD/8AH4AH/4APwAP/wAfgAf/gA/AA//AB+AB/+AD8AD/8AH4AH/4APwAP/wAfgAf/AA/AAf8f88AAfx/8wAAfH/8AAAcf/8AAAR//4AAAH//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAA4AAAAAD4AAYAAP4AD8AA/4AH4AD/4APwAP/wAfgAf/gA/AA//AB+AB/+AD8AD/8AH4AH/4APwAP/wAfgAf/gA/AA//AB+AB/+AD8AD/8AH4AH/wAHgAH/H/GH/H8f/gf/Hx//h//HH//n//Ef/+H//B//4H//AAAAAAAAAAAAAAP//AAAAP//AAAAP//AAAAP/8AAAAP/2AAAAP/eAAAAAB+AAAAAD8AAAAAH4AAAAAPwAAAAAfgAAAAA/AAAAAB+AAAAAD8AAAAAH4AAAAAPwAAAAAfgAAAAA/AAAAAB+AAAAAD8AAAB/7x/4AH/7H/4Af/4f/4B//5//4H//h//4f/+B//4AAAAAAAAAAAAAD//wAAAD//wAAAj//gAADj/+AAAPj/5gAA/j/ngAD/gAfgAP/gA/AA//AB+AB/+AD8AD/8AH4AH/4APwAP/wAfgAf/gA/AA//AB+AB/+AD8AD/8AH4AH/4APwAP/wAfgAf/AA/AAf8AA8f8fwAAx/8fAAAH/8cAAAf/8QAAA//8AAAA//8AAAAAAAAAAAAAA//8D//g//8P/+I//8//44//0//j4//Y/+P4/94/4/4AH4AD/4APwAP/wAfgAf/gA/AA//AB+AB/+AD8AD/8AH4AH/4APwAP/wAfgAf/gA/AA//AB+AB/+AD8AD/8AH4AH/wAPwAH/AAPH/H8AAMf/HwAAB//HAAAH//EAAAH//AAAAH//AAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAGAAAAAAOAAAAAAeAAAAAA+AAAAAB+AAAAAD8AAAAAH4AAAAAPwAAAAAfgAAAAA/AAAAAB+AAAAAD8AAAAAH4AAAAAPwAAAAAfgAAAAA/AAAAAB8AAAAADx/4B/4HH/4H/4Mf/4f/4R//5//4H//h//4f/+B//4AAAAAAAAAAAAAD//wP/+D//w//4j//z//jj//T/+Pj/9j/4/j/3j/j/gAfgAP/gA/AA//AB+AB/+AD8AD/8AH4AH/4APwAP/wAfgAf/gA/AA//AB+AB/+AD8AD/8AH4AH/4APwAP/wAfgAf/AA/AAf8f+8f8fx/+x/8fH/+H/8cf/+f/8R//4f/8H//gf/8AAAAAAAAAAAAAA//8AAAA//8AAAI//8AAA4//0AAD4//YAAP4/94AA/4AH4AD/4APwAP/wAfgAf/gA/AA//AB+AB/+AD8AD/8AH4AH/4APwAP/wAfgAf/gA/AA//AB+AB/+AD8AD/8AH4AH/wAPwAH/H/vH/H8f/sf/Hx//h//HH//n//Ef/+H//B//4H//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"); -// tiny font for percentage first char 48 6 by 8 -//var fontTiny = atob("AH6BgYF+ACFB/wEBAGGDhYlxAEKBkZFuAAx0hP8EAPqRkZGOAH6RkZFOAICHmKDAAG6RkZFuAHKJiYl+AAAAAAAAAAAAAAAA"); -// date font first char 48 12 by 15 -var fontDate = atob("AAAAAfv149wAeADwAeADwAeADvHr9+AAAAAAAAAAAAAAAAAAAAAAAAAPHn9/AAAAAAP0A9wweGDwweGDwweGDvAL8AAAAAAAAAAAgwOGDwweGDwweGDvHp98AAAAA/gB6AAwAGAAwAGAAwAGAPHj9/AAAAAfgF6BwweGDwweGDwweGDgHoB+AAAAAfv169wweGDwweGDwweGDgHoB+AAAAAAAAAAgAGAAwAGAAwAGAAvHh9/AAAAAfv169wweGDwweGDwweGDvHr9+AAAAAfgF6BwweGDwweGDwweGDvHr9+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"); + // define fonts + // reg number first char 48 28 by 41 + const fontNum = atob("AAAAAAAAAAAAAA//8D//g//8P/+I//8//44//w//j4//A/+P4/8A/4/4AAAAD/4AAAAP/wAAAAf/gAAAA//AAAAB/+AAAAD/8AAAAH/4AAAAP/wAAAAf/gAAAA//AAAAB/+AAAAD/8AAAAH/wAAAAH/H/gH/H8f/gf/Hx//h//HH//n//Ef/+H//B//4H//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/wB/4AP/4H/4A//4f/4D//5//4P//h//4//+B//4AAAAAAAAAAAAAAAAAf/+AAAB//4gAAD//jgAAD/+PgABj/4/gAHj/j/gAfgAP/gA/AA//AB+AB/+AD8AD/8AH4AH/4APwAP/wAfgAf/gA/AA//AB+AB/+AD8AD/8AH4AH/4APwAP/wAfgAf/AA/AAf8f88AAfx/8wAAfH/8AAAcf/8AAAR//4AAAH//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAA4AAAAAD4AAYAAP4AD8AA/4AH4AD/4APwAP/wAfgAf/gA/AA//AB+AB/+AD8AD/8AH4AH/4APwAP/wAfgAf/gA/AA//AB+AB/+AD8AD/8AH4AH/wAHgAH/H/GH/H8f/gf/Hx//h//HH//n//Ef/+H//B//4H//AAAAAAAAAAAAAAP//AAAAP//AAAAP//AAAAP/8AAAAP/2AAAAP/eAAAAAB+AAAAAD8AAAAAH4AAAAAPwAAAAAfgAAAAA/AAAAAB+AAAAAD8AAAAAH4AAAAAPwAAAAAfgAAAAA/AAAAAB+AAAAAD8AAAB/7x/4AH/7H/4Af/4f/4B//5//4H//h//4f/+B//4AAAAAAAAAAAAAD//wAAAD//wAAAj//gAADj/+AAAPj/5gAA/j/ngAD/gAfgAP/gA/AA//AB+AB/+AD8AD/8AH4AH/4APwAP/wAfgAf/gA/AA//AB+AB/+AD8AD/8AH4AH/4APwAP/wAfgAf/AA/AAf8AA8f8fwAAx/8fAAAH/8cAAAf/8QAAA//8AAAA//8AAAAAAAAAAAAAA//8D//g//8P/+I//8//44//0//j4//Y/+P4/94/4/4AH4AD/4APwAP/wAfgAf/gA/AA//AB+AB/+AD8AD/8AH4AH/4APwAP/wAfgAf/gA/AA//AB+AB/+AD8AD/8AH4AH/wAPwAH/AAPH/H8AAMf/HwAAB//HAAAH//EAAAH//AAAAH//AAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAGAAAAAAOAAAAAAeAAAAAA+AAAAAB+AAAAAD8AAAAAH4AAAAAPwAAAAAfgAAAAA/AAAAAB+AAAAAD8AAAAAH4AAAAAPwAAAAAfgAAAAA/AAAAAB8AAAAADx/4B/4HH/4H/4Mf/4f/4R//5//4H//h//4f/+B//4AAAAAAAAAAAAAD//wP/+D//w//4j//z//jj//T/+Pj/9j/4/j/3j/j/gAfgAP/gA/AA//AB+AB/+AD8AD/8AH4AH/4APwAP/wAfgAf/gA/AA//AB+AB/+AD8AD/8AH4AH/4APwAP/wAfgAf/AA/AAf8f+8f8fx/+x/8fH/+H/8cf/+f/8R//4f/8H//gf/8AAAAAAAAAAAAAA//8AAAA//8AAAI//8AAA4//0AAD4//YAAP4/94AA/4AH4AD/4APwAP/wAfgAf/gA/AA//AB+AB/+AD8AD/8AH4AH/4APwAP/wAfgAf/gA/AA//AB+AB/+AD8AD/8AH4AH/wAPwAH/H/vH/H8f/sf/Hx//h//HH//n//Ef/+H//B//4H//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"); + // tiny font for percentage first char 48 6 by 8 + //var fontTiny = atob("AH6BgYF+ACFB/wEBAGGDhYlxAEKBkZFuAAx0hP8EAPqRkZGOAH6RkZFOAICHmKDAAG6RkZFuAHKJiYl+AAAAAAAAAAAAAAAA"); + // date font first char 48 12 by 15 + const fontDate = atob("AAAAAfv149wAeADwAeADwAeADvHr9+AAAAAAAAAAAAAAAAAAAAAAAAAPHn9/AAAAAAP0A9wweGDwweGDwweGDvAL8AAAAAAAAAAAgwOGDwweGDwweGDvHp98AAAAA/gB6AAwAGAAwAGAAwAGAPHj9/AAAAAfgF6BwweGDwweGDwweGDgHoB+AAAAAfv169wweGDwweGDwweGDgHoB+AAAAAAAAAAgAGAAwAGAAwAGAAvHh9/AAAAAfv169wweGDwweGDwweGDvHr9+AAAAAfgF6BwweGDwweGDwweGDvHr9+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"); -// define days of the week images -var imgMon = E.toArrayBuffer(atob("Ig8BgHwfD5AvB8HD8z8wMPzPzMQzM/M/DMz8z8c7f7f7z////3Oz+3+PzPzPw/M/M/D8z8z8PzPzPw/vB8/n/8H3/A==")); -var imgTue = E.toArrayBuffer(atob("Ig8BwDv9wDAOfmgf/5+Z///n5n/5+fmf/n5+Z//fv9oH////Af37/b/+fn5n/5+fmf/n5+Z/+fn5n/5/g+gfn+D8AA==")); -var imgWed = E.toArrayBuffer(atob("Ig8Bf7gHgM/NA9Az8z/z8PzP/Pw/M/8/D8z/z8c7QPf7z+A//3O3/3+MzP/PwzM/8/D8z/z8PzP/PxAtA9A4B4B4DA==")); -var imgThu = E.toArrayBuffer(atob("Ig8BgHf7f6Ac/M/P/z8z8//PzPzz8/M/PPz8z8+/QLf7/+A///v3+3+8/PzPzz8/M/PPz8z88/PzPzz8/vB/P3/8HA==")); -var imgFri = E.toArrayBuffer(atob("Ig8B/wDwP7+geg/P5/5+c/n/n5z+f+fnP5/5+c/oHoF7/AfAf/7/7/+/n/k/z+f+R/P5/5j8/n/nHz+/++PP7//8+A==")); -var imgSat = E.toArrayBuffer(atob("Ig8B4DwDwDgOgXAJ/5+f/n/n5/+f+fn55/5+fnoHoF/fAfAf//+b/f3/5n5+f/mfn5/+Z+fn//n5+eAef358B7//nA==")); -var imgSun = E.toArrayBuffer(atob("Ig8BwHf7D7Ac/MHD/z8wMP/PzMQ/8/M/D/z8z8QPf7f6A/////83+3+/zPzPz/M/M/P8z8z8//PzPwA/B8/oD8H3/A==")); + // define days of the week images + const imgMon = E.toArrayBuffer(atob("Ig8BgHwfD5AvB8HD8z8wMPzPzMQzM/M/DMz8z8c7f7f7z////3Oz+3+PzPzPw/M/M/D8z8z8PzPzPw/vB8/n/8H3/A==")); + const imgTue = E.toArrayBuffer(atob("Ig8BwDv9wDAOfmgf/5+Z///n5n/5+fmf/n5+Z//fv9oH////Af37/b/+fn5n/5+fmf/n5+Z/+fn5n/5/g+gfn+D8AA==")); + const imgWed = E.toArrayBuffer(atob("Ig8Bf7gHgM/NA9Az8z/z8PzP/Pw/M/8/D8z/z8c7QPf7z+A//3O3/3+MzP/PwzM/8/D8z/z8PzP/PxAtA9A4B4B4DA==")); + const imgThu = E.toArrayBuffer(atob("Ig8BgHf7f6Ac/M/P/z8z8//PzPzz8/M/PPz8z8+/QLf7/+A///v3+3+8/PzPzz8/M/PPz8z88/PzPzz8/vB/P3/8HA==")); + const imgFri = E.toArrayBuffer(atob("Ig8B/wDwP7+geg/P5/5+c/n/n5z+f+fnP5/5+c/oHoF7/AfAf/7/7/+/n/k/z+f+R/P5/5j8/n/nHz+/++PP7//8+A==")); + const imgSat = E.toArrayBuffer(atob("Ig8B4DwDwDgOgXAJ/5+f/n/n5/+f+fn55/5+fnoHoF/fAfAf//+b/f3/5n5+f/mfn5/+Z+fn//n5+eAef358B7//nA==")); + const imgSun = E.toArrayBuffer(atob("Ig8BwHf7D7Ac/MHD/z8wMP/PzMQ/8/M/D/z8z8QPf7f6A/////83+3+/zPzPz/M/M/P8z8z8//PzPwA/B8/oD8H3/A==")); -// define icons -var imgSep = E.toArrayBuffer(atob("BhsBAAAAAA///////////////AAAAAAA")); -//var imgPercent = E.toArrayBuffer(atob("BwcBuq7ffbqugA==")); -var img24hr = E.toArrayBuffer(atob("EwgBj7vO53na73tcDtu9uDev7vA93g==")); -var imgPM = E.toArrayBuffer(atob("EwgB+HOfdnPu1X3ar4dV9+q+/bfftg==")); + // define icons + const imgSep = E.toArrayBuffer(atob("BhsBAAAAAA///////////////AAAAAAA")); + //var imgPercent = E.toArrayBuffer(atob("BwcBuq7ffbqugA==")); + const img24hr = E.toArrayBuffer(atob("EwgBj7vO53na73tcDtu9uDev7vA93g==")); + const imgPM = E.toArrayBuffer(atob("EwgB+HOfdnPu1X3ar4dV9+q+/bfftg==")); -//vars -var separator = true; -var is24hr = !is12Hour; -var leadingZero = true; + //vars + let separator = true; + let is24hr = !is12Hour; + let leadingZero = true; -//the following 2 sections are used from waveclk to schedule minutely updates -// timeout used to update every minute -var drawTimeout; + //the following 2 sections are used from waveclk to schedule minutely updates + // timeout used to update every minute + let drawTimeout; -// schedule a draw for the next minute -function queueDraw() { - if (drawTimeout) clearTimeout(drawTimeout); - drawTimeout = setTimeout(function() { - drawTimeout = undefined; - draw(); - }, 60000 - (Date.now() % 60000)); -} - -function drawBackground() { - g.setBgColor(0,0,0); - g.setColor(1,1,1); - g.clear(); - g.drawImage(imgBg,0,0); - g.reset(); -} - -function draw(){ - drawBackground(); - var date = new Date(); - var h = date.getHours(), m = date.getMinutes(); - var d = date.getDate(), w = date.getDay(); - g.reset(); - g.setBgColor(0,0,0); - g.setColor(1,1,1); - - //draw 24 hr indicator and 12 hr specific behavior - if (is24hr){ - g.drawImage(img24hr,32, 65); - if (leadingZero){ - h = ("0"+h).substr(-2); - } - } else if (h > 12) { - g.drawImage(imgPM,40, 70); - h = h - 12; - if (leadingZero){ - h = ("0"+h).substr(-2); - } else { - h = " " + h; - } - } else if (h === 0) { - // display 12:00 instead of 00:00 for 12 hr mode - h = "12"; - } - - //draw separator - if (separator){ - g.drawImage(imgSep, 85,98);} - - //draw day of week - var imgW = null; - if (w == 0) {imgW = imgSun;} - if (w == 1) {imgW = imgMon;} - if (w == 2) {imgW = imgTue;} - if (w == 3) {imgW = imgWed;} - if (w == 4) {imgW = imgThu;} - if (w == 5) {imgW = imgFri;} - if (w == 6) {imgW = imgSat;} - g.drawImage(imgW, 85, 63); - - - // draw nums - // draw time - g.setColor(0,0,0); - g.setBgColor(1,1,1); - g.setFontCustom(fontNum, 48, 28, 41); - if (h<10) { - if (leadingZero) { - h = ("0"+h).substr(-2); - } else { - h = " " + h; - } - } - g.drawString(h, 25, 90, true); - g.drawString(("0"+m).substr(-2), 92, 90, true); - // draw date - g.setFontCustom(fontDate, 48, 12, 15); - g.drawString(("0"+d).substr(-2), 123,63, true); - - // widget redraw - Bangle.drawWidgets(); - queueDraw(); -} - -/** - * This watch is mostly dark, it does not make sense to respect the - * light theme as you end up with a white strip at the top for the - * widgets and black watch. So set the colours to the dark theme. - * - */ -g.setTheme({bg:"#000",fg:"#fff",dark:true}).clear(); -draw(); - -//the following section is also from waveclk -Bangle.on('lcdPower',on=>{ - if (on) { - draw(); // draw immediately, queue redraw - } else { // stop draw timer + // schedule a draw for the next minute + let queueDraw = function() { if (drawTimeout) clearTimeout(drawTimeout); - drawTimeout = undefined; - } -}); + drawTimeout = setTimeout(function() { + drawTimeout = undefined; + draw(); + }, 60000 - (Date.now() % 60000)); + }; -Bangle.setUI("clock"); -Bangle.loadWidgets(); -Bangle.drawWidgets(); + let drawBackground = function() { + g.setBgColor(0, 0, 0); + g.setColor(1, 1, 1); + g.clear(); + g.drawImage(imgBg, 0, 0); + g.reset(); + }; + + let draw = function() { + drawBackground(); + let date = new Date(); + let h = date.getHours(), + m = date.getMinutes(); + let d = date.getDate(), + w = date.getDay(); + g.reset(); + g.setBgColor(0, 0, 0); + g.setColor(1, 1, 1); + + //draw 24 hr indicator and 12 hr specific behavior + if (is24hr){ + g.drawImage(img24hr,32, 65); + if (leadingZero){ + h = ("0"+h).substr(-2); + } + } else if (h > 12) { + g.drawImage(imgPM,40, 70); + h = h - 12; + if (leadingZero){ + h = ("0"+h).substr(-2); + } else { + h = " " + h; + } + } else if (h === 0) { + // display 12:00 instead of 00:00 for 12 hr mode + h = "12"; + } + + //draw separator + if (separator) { + g.drawImage(imgSep, 85, 98); + } + + //draw day of week + let imgW = null; + if (w == 0) {imgW = imgSun;} + if (w == 1) {imgW = imgMon;} + if (w == 2) {imgW = imgTue;} + if (w == 3) {imgW = imgWed;} + if (w == 4) {imgW = imgThu;} + if (w == 5) {imgW = imgFri;} + if (w == 6) {imgW = imgSat;} + g.drawImage(imgW, 85, 63); + + + // draw nums + // draw time + g.setColor(0, 0, 0); + g.setBgColor(1, 1, 1); + g.setFontCustom(fontNum, 48, 28, 41); + if (h < 10) { + if (leadingZero) { + h = ("0" + h).substr(-2); + } else { + h = " " + h; + } + } + g.drawString(h, 25, 90, true); + g.drawString(("0" + m).substr(-2), 92, 90, true); + // draw date + g.setFontCustom(fontDate, 48, 12, 15); + g.drawString(("0" + d).substr(-2), 123, 63, true); + + // widget redraw + Bangle.drawWidgets(); + queueDraw(); + }; + + /** + * This watch is mostly dark, it does not make sense to respect the + * light theme as you end up with a white strip at the top for the + * widgets and black watch. So set the colours to the dark theme. + * + */ + g.setTheme({ + bg: "#000", + fg: "#fff", + dark: true + }).clear(); + draw(); + + //the following section is also from waveclk + let onLCDPower = on => { + if (on) { + draw(); // draw immediately, queue redraw + } else { // stop draw timer + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = undefined; + } + }; + Bangle.on('lcdPower', onLCDPower); + + Bangle.setUI({ + mode: "clock", + remove: function() { + if (drawTimeout) clearTimeout(drawTimeout); + Bangle.removeListener('lcdPower', onLCDPower); + } + }); + Bangle.loadWidgets(); + Bangle.drawWidgets(); +} diff --git a/apps/93dub/metadata.json b/apps/93dub/metadata.json index 4b0b7bd21..97b771902 100644 --- a/apps/93dub/metadata.json +++ b/apps/93dub/metadata.json @@ -3,7 +3,7 @@ "shortName":"93 Dub", "icon": "93dub.png", "screenshots": [{"url":"screenshot.png"}], - "version": "0.07", + "version": "0.08", "description": "Fan recreation of orviwan's 91 Dub app for the Pebble smartwatch. Uses assets from his 91-Dub-v2.0 repo", "tags": "clock", "type": "clock",