From ab737fa3b610695a667de464b496c8bd7cdc875d Mon Sep 17 00:00:00 2001 From: pkkpp <52079346+pkkpp@users.noreply.github.com> Date: Fri, 4 Feb 2022 14:45:20 +0100 Subject: [PATCH 01/99] Create 7x7dotsclock.app.js Initial version A Clock with Big 7x7 Dots Font --- apps/7x7dotsclock/7x7dotsclock.app.js | 350 ++++++++++++++++++++++++++ 1 file changed, 350 insertions(+) create mode 100644 apps/7x7dotsclock/7x7dotsclock.app.js diff --git a/apps/7x7dotsclock/7x7dotsclock.app.js b/apps/7x7dotsclock/7x7dotsclock.app.js new file mode 100644 index 000000000..4c8a36777 --- /dev/null +++ b/apps/7x7dotsclock/7x7dotsclock.app.js @@ -0,0 +1,350 @@ +/* +7x7DotsClock + +by Peter Kuppelwieser + +*/ +// position on screen +var Xs = 0, Ys = 30,Xe = 175, Ye=175; +//const Xs = 0, Ys = 0,Xe = 175, Ye=175; +var SegH = (Ye-Ys)/2,SegW = (Xe-Xs)/2; +var Dx = SegW/14, Dy = SegH/16; + +const hColor = [1,1,1]; +const mColor = [0.3,0.3,1]; +const bColor = [0.2,0.2,0.2]; + +const Font = [ + [ + [1,1,1,1,1,1,1], + [1,1,1,1,1,1,1], + [1,1,0,0,0,1,1], + [1,1,0,0,0,1,1], + [1,1,0,0,0,1,1], + [1,1,1,1,1,1,1], + [1,1,1,1,1,1,1] + ], + [ + [0,0,0,1,1,0,0], + [0,0,0,1,1,0,0], + [0,0,0,1,1,0,0], + [0,0,0,1,1,0,0], + [0,0,0,1,1,0,0], + [0,0,0,1,1,0,0], + [0,0,0,1,1,0,0], + ], + [ + [1,1,1,1,1,1,1], + [1,1,1,1,1,1,1], + [0,0,0,0,0,1,1], + [1,1,1,1,1,1,1], + [1,1,0,0,0,0,0], + [1,1,1,1,1,1,1], + [1,1,1,1,1,1,1] + ], + [ + [1,1,1,1,1,1,1], + [1,1,1,1,1,1,1], + [0,0,0,0,0,1,1], + [0,0,0,1,1,1,1], + [0,0,0,0,0,1,1], + [1,1,1,1,1,1,1], + [1,1,1,1,1,1,1] + ], + [ + [1,1,0,0,0,0,0], + [1,1,0,0,0,0,0], + [1,1,0,1,1,0,0], + [1,1,1,1,1,1,1], + [1,1,1,1,1,1,1], + [0,0,0,1,1,0,0], + [0,0,0,1,1,0,0] + ], + [ + [1,1,1,1,1,1,1], + [1,1,1,1,1,1,1], + [1,1,0,0,0,0,0], + [1,1,1,1,1,1,1], + [0,0,0,0,0,1,1], + [1,1,1,1,1,1,1], + [1,1,1,1,1,1,1] + ], + [ + [1,1,0,0,0,0,0], + [1,1,0,0,0,0,0], + [1,1,0,0,0,0,0], + [1,1,1,1,1,1,1], + [1,1,0,0,0,1,1], + [1,1,1,1,1,1,1], + [1,1,1,1,1,1,1] + ], + [ + [1,1,1,1,1,1,1], + [1,1,1,1,1,1,1], + [0,0,0,0,0,1,1], + [0,0,0,0,0,1,1], + [0,0,0,0,0,1,1], + [0,0,0,0,0,1,1], + [0,0,0,0,0,1,1] + ], + [ + [1,1,1,1,1,1,1], + [1,1,1,1,1,1,1], + [1,1,0,0,0,1,1], + [1,1,1,1,1,1,1], + [1,1,0,0,0,1,1], + [1,1,1,1,1,1,1], + [1,1,1,1,1,1,1] + ], + [ + [1,1,1,1,1,1,1], + [1,1,1,1,1,1,1], + [1,1,0,0,0,1,1], + [1,1,1,1,1,1,1], + [1,1,1,1,1,1,1], + [0,0,0,0,0,1,1], + [0,0,0,0,0,1,1] + ], + ]; + +// Global Vars +var dho = -1, eho = -1, dmo = -1, emo = -1; + + +function drawHSeg(x1,y1,x2,y2,Num,dColor,Size) { + g.setColor(0,0,0); + g.fillRect(x1, y1, x2, y2); + for (let i = 1; i < 8; i++) { + for (let j = 1; j < 8; j++) { + if (Font[Num][j-1][i-1] == 1) { + g.setColor(dColor[0],dColor[1],dColor[2]); + g.fillCircle(x1+Dx+(i-1)*(x2-x1)/7,y1+Dy+(j-1)*(y2-y1)/7,Size); + } else { + g.setColor(bColor[0],bColor[1],bColor[2]); + g.fillCircle(x1+Dx+(i-1)*(x2-x1)/7,y1+Dy+(j-1)*(y2-y1)/7,1); + } + } + } +} + + +function drawSSeg(x1,y1,x2,y2,Num,dColor,Size) { + for (let i = 1; i < 8; i++) { + for (let j = 1; j < 8; j++) { + if (Font[Num][j-1][i-1] == 1) { + g.setColor(dColor[0],dColor[1],dColor[2]); + g.fillCircle(x1+(i-1)*(x2-x1)/7,y1+(j-1)*(y2-y1)/7,Size); + } + } + } +} + + +function ShowSecons() { + g.setColor(1,1,1); + g.fillRect((Xe-Xs) / 2 - 14 + Xs -3, + (Ye-Ys) / 2 - 7 + Ys -3, + (Xe-Xs) / 2 + 14 + Xs +1, + (Ye-Ys) / 2 + 7 + Ys +1); + + + drawSSeg( (Xe-Xs) / 2 - 14 + Xs -1, + (Ye-Ys) / 2 - 7 + Ys , + (Xe-Xs) / 2 + Xs -1, + (Ye-Ys) / 2 + 7 + Ys, + ds,mColor,1); + + drawSSeg( (Xe-Xs) / 2 + Xs +1, + (Ye-Ys) / 2 - 7 + Ys, + (Xe-Xs) / 2 + 14 + Xs +1, + (Ye-Ys) / 2 + 7 + Ys, + es,mColor,1); + +} + +function draw() { + // work out how to display the current time + var d = new Date(); + var h = d.getHours(), m = d.getMinutes(), s = d.getSeconds(); + + + dh = Math.floor(h/10); + eh = h - dh * 10; + + dm = Math.floor(m/10); + em = m - dm * 10; + + ds = Math.floor(s/10); + es = s - ds * 10; + + + // Reset the state of the graphics library + g.reset(); + if (dh != dho) { + g.setColor(1,1,1); + drawHSeg(Xs, Ys, Xs+SegW, Ys+SegH,dh,hColor,4); + dho = dh; + } + + if (eh != eho) { + g.setColor(1,1,1); + drawHSeg(Xs+SegW+Dx, Ys, Xs+SegW*2, Ys+SegH,eh,hColor,4); + eho = eh; + } + + if (dm != dmo) { + g.setColor(0.3,0.3,1); + drawHSeg(Xs, Ys+SegH+Dy, Xs+SegW, Ys+SegH*2,dm,mColor,4); + dmo = dm; + } + + if (em != emo) { + g.setColor(0.3,0.3,1); + drawHSeg(Xs+SegW+Dx, Ys+SegH+Dy, Xs+SegW*2, Ys+SegH*2,em,mColor,4); + emo = em; + } + + if (!Bangle.isLocked()) ShowSecons(); + +} + + +function actions(v){ + if(BTN1.read() === true) { + print("BTN pressed"); + Bangle.showLauncher(); + } + + if(v==-1){ + print("up swipe event"); + load("qrcode.app.js"); + } else if(v==1) { + print("down swipe event"); + load("hrm.app.js"); + print(apps[0].src); + } else { + print("touch event"); + } +} + +// Get Messages status +var messages = require("Storage").readJSON("messages.json",1)||[]; + +//var BTconnected = NRF.getSecurityStatus().connected; +//NRF.on('connect',BTconnected = NRF.getSecurityStatus().connected); +//NRF.on('disconnect',BTconnected = NRF.getSecurityStatus().connected); + + +function drawWidgeds() { + + //Bluetooth + //print(BluetoothDevice.connected); + var x1Bt = 160; + var y1Bt = 0; + var x2Bt = x1Bt + 30; + var y2Bt = y2Bt; + + if (NRF.getSecurityStatus().connected) + g.setColor((g.getBPP()>8) ? "#07f" : (g.theme.dark ? "#0ff" : "#00f")); + else + g.setColor(g.theme.dark ? "#666" : "#999"); + g.drawImage(atob("CxQBBgDgFgJgR4jZMawfAcA4D4NYybEYIwTAsBwDAA=="),x1Bt,y1Bt); + + + //Battery + //print(E.getBattery()); + //print(Bangle.isCharging()); + + var x1B = 130; + var y1B = 2; + var x2B = x1B + 20; + var y2B = y1B + 15; + + g.setColor(g.theme.bg); + g.clearRect(x1B,y1B,x2B,y2B); + + g.setColor(g.theme.fg); + g.drawRect(x1B,y1B,x2B,y2B); + g.fillRect(x1B,y1B,x1B+(E.getBattery()*(x2B-x1B)/100),y2B); + g.fillRect(x2B,y1B+(y2B-y1B)/2-3,x2B+4,y1B+(y2B-y1B)/2+3); + + + + //Messages + + var x1M = 100; + var y1M = y1B; + var x2M = x1M + 30; + var y2M = y2B; + + if (messages.some(m=>m.new)) { + g.setColor(g.theme.fg); + g.fillRect(x1M,y1M,x2M,y2M); + g.setColor(g.theme.bg); + g.drawLine(x1M,y1M,x1M+(x2M-x1M)/2,y1M+(y2M-y1M)/2); + g.drawLine(x1M+(x2M-x1M)/2,y1M+(y2M-y1M)/2,x2M,y1M); + } + + var strDow = ['Sun','Mon','Tue','Wed','Thu','Fri','Sat']; + var d = new Date(); + var dow = d.getDay(),day = d.getDate(), month = d.getMonth() + 1, year = d.getFullYear(); + + print(strDow[dow] + ' ' + day + '.' + month + ' ' + year); + + g.setFontAlign(-1, -1,0); + g.setFont("Vector", 20); + g.drawString(strDow[dow] + ' ' + day, 0, 0, true); + +} + + + + +function SetFull(on) { + dho = -1; eho = -1; dmo = -1; emo = -1; + g.clear(); + + if (on === true) { + Ys = 0; + Bangle.setUI("clock"); + Bangle.on('swipe', function(direction) { }); + + } else { + Ys = 30; + Bangle.setUI("updown",actions); + Bangle.on('swipe', function(direction) { + switch (direction) { + case 1: + print("swipe left event"); + load("gbmusic.app.js"); + break; + case -1: + load("messages.app.js"); + print("swipe right event"); + break; + default: + print("swipe undefined event"); + } + }); + } + + SegH = (Ye-Ys)/2; + Dy = SegH/16; + + draw(); + + if (on != true) { + //Bangle.loadWidgets(); + //Bangle.drawWidgets(); + drawWidgeds(); + } +} + +Bangle.on('lock', function(on) { + SetFull(on); +}); + + +SetFull(Bangle.isLocked()); + +var secondInterval = setInterval(draw, 1000); From 500baf3b36f61ec7789be90901cd2ac8e314a038 Mon Sep 17 00:00:00 2001 From: pkkpp <52079346+pkkpp@users.noreply.github.com> Date: Fri, 4 Feb 2022 16:54:00 +0100 Subject: [PATCH 02/99] Create 7x7dotsclock.img.js --- apps/7x7dotsclock.img.js | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 apps/7x7dotsclock.img.js diff --git a/apps/7x7dotsclock.img.js b/apps/7x7dotsclock.img.js new file mode 100644 index 000000000..46c793905 --- /dev/null +++ b/apps/7x7dotsclock.img.js @@ -0,0 +1,5 @@ +{ + width : 48, height : 48, bpp : 8, + transparent : 254, + buffer : require("heatshrink").decompress(atob("AH4A/AH4A/AH4APlYABAYYAFBIwUEERgQJ64AB1gCEAAYGKFxQUGF5AAUDQVWAQOBAQVWF44PBqwCBLgpRDMxhNGL44RJL7oCDR5AMBlYCBF7TiCF4aPKF4RpCwICCAwOsAwVWAwQQCEISPKWQzKCACZ9GL4YRNII51CPI0rAwQDBX6CPhBISPYd7RfUF7S/UNgqMBQ4KMB1krAQOBBIQGDF5oiDR5jvEAYYCFBIQIER6g8DBIIKBAQkrBIorCR7g2GAxAdGR5ShGd7SMCEgWBR5R6CLBIJFAw7veF6b7GX5AMBBYKPwbwwGFwIJFAwaPKDYwNFgWBq8Aq4CBqwGBlYGCAQMsCAssLwQEBllXKIILBEQ0tBAIXCwYABrACBwQGCAAQGDrIGFFwISFABAlCAA1ZAAIFRKIIXVGwVYAogDBCIIGBC4gQDgB5BFJQiFBYQkCCIYFFRYQKHL4MtF5YiFCIwAUR4QAUlwCBJIODq7iBrAgCqwGCd48BBYSDBwQLCRIQbCd40Aq0AgErAYWBAQNWAwVWlZfHBYQVEwMrBAYXBF40sq9XlVXrErAwMtCINXQgIABboq/BBYUsloCBDAQiCDYRiCYobvMIYIKEF4gfBDhr1PApwvHAp7PFawVZawuCboyxBDwb7ED4YFKAAkBq8BgEsa4MBq0BAQQJDL4QAEgTpBCIj1BAwIXDF4xOBEIMrqoDCAQoJCF5EqCIgFBgAUBC4RgCbwVYdIQGBRAQJDAwhLBWYgVCVAgFBUga0Ed9ovvAwQJDABAXEaActCpYYDB5wAOd44APlw4Blo6BluCZQhTCrAQBAwkAgQECDAOCDA4lDBAVYA")) +} From a3a8956dda21fd535fc2a1643afcae15994e4d14 Mon Sep 17 00:00:00 2001 From: pkkpp <52079346+pkkpp@users.noreply.github.com> Date: Fri, 4 Feb 2022 16:56:59 +0100 Subject: [PATCH 03/99] Create 7x7dotsclock.img.js --- apps/7x7dotsclock/7x7dotsclock.img.js | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 apps/7x7dotsclock/7x7dotsclock.img.js diff --git a/apps/7x7dotsclock/7x7dotsclock.img.js b/apps/7x7dotsclock/7x7dotsclock.img.js new file mode 100644 index 000000000..46c793905 --- /dev/null +++ b/apps/7x7dotsclock/7x7dotsclock.img.js @@ -0,0 +1,5 @@ +{ + width : 48, height : 48, bpp : 8, + transparent : 254, + buffer : require("heatshrink").decompress(atob("AH4A/AH4A/AH4APlYABAYYAFBIwUEERgQJ64AB1gCEAAYGKFxQUGF5AAUDQVWAQOBAQVWF44PBqwCBLgpRDMxhNGL44RJL7oCDR5AMBlYCBF7TiCF4aPKF4RpCwICCAwOsAwVWAwQQCEISPKWQzKCACZ9GL4YRNII51CPI0rAwQDBX6CPhBISPYd7RfUF7S/UNgqMBQ4KMB1krAQOBBIQGDF5oiDR5jvEAYYCFBIQIER6g8DBIIKBAQkrBIorCR7g2GAxAdGR5ShGd7SMCEgWBR5R6CLBIJFAw7veF6b7GX5AMBBYKPwbwwGFwIJFAwaPKDYwNFgWBq8Aq4CBqwGBlYGCAQMsCAssLwQEBllXKIILBEQ0tBAIXCwYABrACBwQGCAAQGDrIGFFwISFABAlCAA1ZAAIFRKIIXVGwVYAogDBCIIGBC4gQDgB5BFJQiFBYQkCCIYFFRYQKHL4MtF5YiFCIwAUR4QAUlwCBJIODq7iBrAgCqwGCd48BBYSDBwQLCRIQbCd40Aq0AgErAYWBAQNWAwVWlZfHBYQVEwMrBAYXBF40sq9XlVXrErAwMtCINXQgIABboq/BBYUsloCBDAQiCDYRiCYobvMIYIKEF4gfBDhr1PApwvHAp7PFawVZawuCboyxBDwb7ED4YFKAAkBq8BgEsa4MBq0BAQQJDL4QAEgTpBCIj1BAwIXDF4xOBEIMrqoDCAQoJCF5EqCIgFBgAUBC4RgCbwVYdIQGBRAQJDAwhLBWYgVCVAgFBUga0Ed9ovvAwQJDABAXEaActCpYYDB5wAOd44APlw4Blo6BluCZQhTCrAQBAwkAgQECDAOCDA4lDBAVYA")) +} From 16a9b110959751e5eb6346682fd631e7aa2b7cac Mon Sep 17 00:00:00 2001 From: pkkpp <52079346+pkkpp@users.noreply.github.com> Date: Fri, 4 Feb 2022 16:57:19 +0100 Subject: [PATCH 04/99] Delete 7x7dotsclock.img.js --- apps/7x7dotsclock.img.js | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 apps/7x7dotsclock.img.js diff --git a/apps/7x7dotsclock.img.js b/apps/7x7dotsclock.img.js deleted file mode 100644 index 46c793905..000000000 --- a/apps/7x7dotsclock.img.js +++ /dev/null @@ -1,5 +0,0 @@ -{ - width : 48, height : 48, bpp : 8, - transparent : 254, - buffer : require("heatshrink").decompress(atob("AH4A/AH4A/AH4APlYABAYYAFBIwUEERgQJ64AB1gCEAAYGKFxQUGF5AAUDQVWAQOBAQVWF44PBqwCBLgpRDMxhNGL44RJL7oCDR5AMBlYCBF7TiCF4aPKF4RpCwICCAwOsAwVWAwQQCEISPKWQzKCACZ9GL4YRNII51CPI0rAwQDBX6CPhBISPYd7RfUF7S/UNgqMBQ4KMB1krAQOBBIQGDF5oiDR5jvEAYYCFBIQIER6g8DBIIKBAQkrBIorCR7g2GAxAdGR5ShGd7SMCEgWBR5R6CLBIJFAw7veF6b7GX5AMBBYKPwbwwGFwIJFAwaPKDYwNFgWBq8Aq4CBqwGBlYGCAQMsCAssLwQEBllXKIILBEQ0tBAIXCwYABrACBwQGCAAQGDrIGFFwISFABAlCAA1ZAAIFRKIIXVGwVYAogDBCIIGBC4gQDgB5BFJQiFBYQkCCIYFFRYQKHL4MtF5YiFCIwAUR4QAUlwCBJIODq7iBrAgCqwGCd48BBYSDBwQLCRIQbCd40Aq0AgErAYWBAQNWAwVWlZfHBYQVEwMrBAYXBF40sq9XlVXrErAwMtCINXQgIABboq/BBYUsloCBDAQiCDYRiCYobvMIYIKEF4gfBDhr1PApwvHAp7PFawVZawuCboyxBDwb7ED4YFKAAkBq8BgEsa4MBq0BAQQJDL4QAEgTpBCIj1BAwIXDF4xOBEIMrqoDCAQoJCF5EqCIgFBgAUBC4RgCbwVYdIQGBRAQJDAwhLBWYgVCVAgFBUga0Ed9ovvAwQJDABAXEaActCpYYDB5wAOd44APlw4Blo6BluCZQhTCrAQBAwkAgQECDAOCDA4lDBAVYA")) -} From 5b383f51e7a855ff7fb06c69446dc99706f50486 Mon Sep 17 00:00:00 2001 From: Peter Kuppelwieser Date: Fri, 4 Feb 2022 17:00:40 +0100 Subject: [PATCH 05/99] initial version --- apps/7x7dotsclock/7x7dotsclock.info | 15 ++++++++ apps/7x7dotsclock/7x7dotsclock.settings.js | 41 ++++++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 apps/7x7dotsclock/7x7dotsclock.info create mode 100644 apps/7x7dotsclock/7x7dotsclock.settings.js diff --git a/apps/7x7dotsclock/7x7dotsclock.info b/apps/7x7dotsclock/7x7dotsclock.info new file mode 100644 index 000000000..9a90aac67 --- /dev/null +++ b/apps/7x7dotsclock/7x7dotsclock.info @@ -0,0 +1,15 @@ +{ "id": "7x7dotsclock", + "name": "7x7 dots clock", + "shortName":"7x7 dots clock", + "type":"clock", + "version":"0.01", + "description": "A clock with a big 7x7 dots font", + "icon": "7x7dotsclock.img", + "tags": "", + "supports" : ["BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"7x7dotsclock.app.js","url":"7x7dotsclock.app.js"}, + {"name":"7x7dotsclock.img","url":"7x7dotsclock-icon.js","evaluate":true} + ] +} \ No newline at end of file diff --git a/apps/7x7dotsclock/7x7dotsclock.settings.js b/apps/7x7dotsclock/7x7dotsclock.settings.js new file mode 100644 index 000000000..94273e419 --- /dev/null +++ b/apps/7x7dotsclock/7x7dotsclock.settings.js @@ -0,0 +1,41 @@ +(function(back) { + function updateSettings() { + storage.write('numerals.json', numeralsSettings); + } + function resetSettings() { + numeralsSettings = { + color:0, + drawMode:"fill", + showDate:0 + }; + updateSettings(); + } + let numeralsSettings = storage.readJSON('numerals.json',1); + if (!numeralsSettings) resetSettings(); + let dm = ["fill","frame","framefill","thickframe","thickfill"]; + let col = process.env.HWVERSION==1?["rnd","r/g","y/w","o/c","b/y"]:["rnd","r/g","g/b","r/c","m/g"]; + let btn = [[24,"BTN1"],[22,"BTN2"],[23,"BTN3"],[11,"BTN4"],[16,"BTN5"]]; + var menu={ + "" : { "title":"Numerals"}, + "Colors": { + value: 0|numeralsSettings.color, + min:0,max:col.length-1, + format: v=>col[v], + onchange: v=> { numeralsSettings.color=v; updateSettings();} + }, + "Draw": { + value: 0|dm.indexOf(numeralsSettings.drawMode), + min:0,max:dm.length-1, + format: v=>dm[v], + onchange: v=> { numeralsSettings.drawMode=dm[v]; updateSettings();} + }, + "Date on touch": { + value: 0|numeralsSettings.showDate, + min:0,max:1, + format: v=>v?"On":"Off", + onchange: v=> { numeralsSettings.showDate=v; updateSettings();} + }, + "< back": back + }; + E.showMenu(menu); +}) \ No newline at end of file From ef4ac921d39cb348253d42d9837fb04f4cbc411e Mon Sep 17 00:00:00 2001 From: Stiralbios Date: Sun, 13 Feb 2022 16:07:23 +0100 Subject: [PATCH 06/99] adding terminal clock app --- apps/terminal_clock/ChangeLog | 1 + apps/terminal_clock/README.md | 3 + apps/terminal_clock/app-icon.js | 1 + apps/terminal_clock/app.js | 140 ++++++++++++++++++++++++++++ apps/terminal_clock/icon.png | Bin 0 -> 1022 bytes apps/terminal_clock/metadata.json | 21 +++++ apps/terminal_clock/screenshot1.png | Bin 0 -> 3190 bytes apps/terminal_clock/screenshot2.png | Bin 0 -> 2628 bytes apps/terminal_clock/settings.js | 61 ++++++++++++ 9 files changed, 227 insertions(+) create mode 100644 apps/terminal_clock/ChangeLog create mode 100644 apps/terminal_clock/README.md create mode 100644 apps/terminal_clock/app-icon.js create mode 100644 apps/terminal_clock/app.js create mode 100644 apps/terminal_clock/icon.png create mode 100644 apps/terminal_clock/metadata.json create mode 100644 apps/terminal_clock/screenshot1.png create mode 100644 apps/terminal_clock/screenshot2.png create mode 100644 apps/terminal_clock/settings.js diff --git a/apps/terminal_clock/ChangeLog b/apps/terminal_clock/ChangeLog new file mode 100644 index 000000000..5560f00bc --- /dev/null +++ b/apps/terminal_clock/ChangeLog @@ -0,0 +1 @@ +0.01: New App! diff --git a/apps/terminal_clock/README.md b/apps/terminal_clock/README.md new file mode 100644 index 000000000..d27fc4cfc --- /dev/null +++ b/apps/terminal_clock/README.md @@ -0,0 +1,3 @@ +# Terminal clock + +A clock displayed as a terminal cli. It can display the time, date, hrm, activity and steps diff --git a/apps/terminal_clock/app-icon.js b/apps/terminal_clock/app-icon.js new file mode 100644 index 000000000..dd5bd596e --- /dev/null +++ b/apps/terminal_clock/app-icon.js @@ -0,0 +1 @@ +E.toArrayBuffer(atob("MDCEAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAd3d3AAAAAAAAAAAAAAAAAAAAAAAAAAAAd3d3AAAAAAAAAAAAAAAAAAAAAAAAAAAAd3d3AAAAAAAAAAAAAAAAAAAAAAAAAAAAd3d3AAAAAAAAAAAAAAAAAAAAAAAAAAAAd3d3AAAAAAAAAAAAAAAAAAAAAAAAAAAAd3d3d3d2AAAAAAAAAAAAAAAAAAAAAAAAAAAHd3d2AAAAAAAAAAAAAAAAAAAAAAAAAAAHd3d2AAAAAAAAAAAAAAAAAAAAAAAAAAAHd3d2AAAAAAAAAAAAAAAAAAAAAAAAAAAHd3d2AAAAAAAAAAAAAAAAAAAAAAAAAAAHd3d3ZmZgAAAAAAAAAAAAAAAAAAAAAAAGZmZ3d3dwAAAAAAAAAAAAAAAAAAAAAAAAAABnd3dwAAAAAAAAAAAAAAAAAAAAAAAAAABnd3dwAAAAAAAAAAAAAAAAAAAAAAAAAABnd3dwAAAAAAAAAAAAAAAAAAAAAAAAAABnd3dwAAAAAAAAAAAAAAAAAAAAAAAAAABnd3d3d3cAAAAAAAAAAAAAAAAAAAAAAAAAAAB3d3cAAAAAAAAAAAAAAAAAAAAAAAAAAAB3d3cAAAAAAAAAAAAAAAAAAAAAAAAAAAB3d3cAAAAAAAAAAAAAAAAAAAAAAAAAAAB3d3cAAAAAAAAAAAAAAAAAAAAAAABnd3d3d3cAAAAAAAAAAAAAAAAAAAAAAABnd3dwAAAAAAAAAAAAAAAAAAAAAAAAAABnd3dwAAAAAAAAAAAAAAAAAAAAAAAAAABnd3dwAAAAAAAAAAAAAAAAAAAAAAAAAABnd3dwAAAAAAAAAAAAAAAAAAAAAAAGZmZ3d3dwAAAAAAAAAAAAAAAAAAAAAAAHd3d3ZmZgAAAAAAAAAAAAAAAAAAAAAAAHd3d2AAAAAAAAAAAAAAAAAAAAAAAAAAAHd3d2AAAAAAAAAAAAAAAAAAAAAAAAAAAHd3d2AAAAAAAAAAAAAAAAAAAAAAAAAAAHd3d2AAAAAAAAAAAAAAAAAAAAAAAAd3d3d3d2AAAAAAAAAAAAAAAAAAAAAAAAd3d3AAAAAAAAAAAAAAAAAAAAAAAAAAAAd3d3AAAAAAAAAAAAAAAAAAAAAAAAAAAAd3d3AAAAAAAAAAAAAAAAAAAAAAAAAAAAd3d3AAAAAAAAAAAAAAAAAAAAAAAAAAAAd3d3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==")) diff --git a/apps/terminal_clock/app.js b/apps/terminal_clock/app.js new file mode 100644 index 000000000..2ce4dda99 --- /dev/null +++ b/apps/terminal_clock/app.js @@ -0,0 +1,140 @@ +var locale = require("locale"); +var fontColor = "#00FF00"; +var startY = 30; +var paddingY = 2; +var font6x8At4Size = 32; +var font6x8At2Size = 18; +var heartRate = 0; + + +function setFontSize(pos){ + if(pos == 1) + g.setFont("6x8", 4); + else + g.setFont("6x8", 2); +} + +function clearField(pos){ + var yStartPos = startY + + paddingY * (pos - 1) + + font6x8At4Size * Math.min(1, pos-1) + + font6x8At2Size * Math.max(0, pos-2); + var yEndPos = startY + + paddingY * (pos - 1) + + font6x8At4Size * Math.min(1, pos) + + font6x8At2Size * Math.max(0, pos-1); + g.clearRect(0, yStartPos, 240, yEndPos); +} + +function clearWatchIfNeeded(now){ + if(now.getMinutes() % 10 == 0) + g.clearRect(0, 0, 240, 240); +} + +function drawLine(line, pos){ + setFontSize(pos); + var yPos = startY + + paddingY * (pos - 1) + + font6x8At4Size * Math.min(1, pos-1) + + font6x8At2Size * Math.max(0, pos-2); + g.drawString(line, 5, yPos, true); +} + +function drawTime(now, pos){ + var h = now.getHours(); + var m = now.getMinutes(); + var time = ">" + (""+h).substr(-2) + ":" + ("0"+m).substr(-2); + drawLine(time, pos); +} + +function drawDate(now, pos){ + var dow = locale.dow(now, 1); + var date = locale.date(now, 1).substr(0,6) + locale.date(now, 1).substr(-2); + var locale_date = ">" + dow + " " + date; + drawLine(locale_date, pos); +} + +function drawInput(now, pos){ + clearField(pos); + drawLine(">", pos); +} + +function drawStepCount(pos){ + var health = Bangle.getHealthStatus("day"); + var steps_formated = ">Steps: " + health.steps; + drawLine(steps_formated, pos); +} + +function drawHRM(pos){ + clearField(pos); + if(heartRate != 0) + drawLine(">HR: " + parseInt(heartRate), pos); + else + drawLine(">HR: unknown", pos); +} + +function drawActivity(pos){ + clearField(pos); + var health = Bangle.getHealthStatus('last'); + var steps_formated = ">Activity: " + parseInt(health.movement/10); + drawLine(steps_formated, pos); +} + + +function draw(){ + // console.log("in draw"); + // console.log(settings); + var curPos = 1; + g.reset(); + g.setFontAlign(-1, -1); + g.setColor(fontColor); + var now = new Date(); + clearWatchIfNeeded(now); // mostly to not have issues when changing days + drawTime(now, curPos); + curPos++; + if(settings.showDate == "Yes"){ + drawDate(now, curPos); + curPos++; + } + if(settings.showHRM == "Yes"){ + drawHRM(curPos); + curPos++; + } + if(settings.showActivity == "Yes"){ + drawActivity(curPos); + curPos++; + } + if(settings.showStepCount == "Yes"){ + drawStepCount(curPos); + curPos++; + } + drawInput(now, curPos); +} + + +Bangle.on('HRM',function(hrmInfo) { + if(hrmInfo.confidence >= settings.HRMinConfidence) + heartRate = hrmInfo.bpm; +}); + + +// Clear the screen once, at startup +g.clear(); +// load the settings +var settings = Object.assign({ + // default values + HRMinConfidence: 40, + showDate: "Yes", + showHRM: "Yes", + showActivity: "Yes", + showStepCount: "Yes", +}, require('Storage').readJSON("terminal_clock.json", true) || {}); +// draw immediately at first +draw(); +// Show launcher when middle button pressed +Bangle.setUI("clock"); +// Load widgets +Bangle.loadWidgets(); +Bangle.drawWidgets(); + +var secondInterval = setInterval(draw, 10000); diff --git a/apps/terminal_clock/icon.png b/apps/terminal_clock/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..5d4507ead49ee014025a0fa2b84dbcad8c84ffde GIT binary patch literal 1022 zcmVEX>4Tx04R}tkv&MmKpe$iQ;Q;12Rn#3WT@g`K~%(1t5Adrp;l;qmz@OipZjz4s5y%P0g-r?8KzCVK|H-_ z8=UuvBdjQ^#OK6gCS8#Dk?V@bZ=4G*3p_Jorc?985n{2>#!4HrqNx#25l2-`r+gvf zvC4UivsSLM<~{if!#RCrnd>x%kia6AAVGwJDoQBBMvPXS6bmWZkNfxsUB5&wg0*#vEd>=bb;{*sk16O*>U#SB#pQP7X zTJ#9$+XgPKTbi;5TYmFU@LfSVzh$kB@)AYh`V?0RU1Y%RvpmaQ7*&~%&a=HHorcK#jM+0OErmul7? z)L|ct{Iq~aSQZb+Pc^F!XV3%!GjQPT_#a&Eo&sA5ukT sR_^}LCi*77Ku?kO+iVN(Y-f4x69vDfv1!0RQ2+n{07*qoM6N<$f^#X*z5oCK literal 0 HcmV?d00001 diff --git a/apps/terminal_clock/metadata.json b/apps/terminal_clock/metadata.json new file mode 100644 index 000000000..4e957edce --- /dev/null +++ b/apps/terminal_clock/metadata.json @@ -0,0 +1,21 @@ +{ "id": "terminal_clock", + "name": "Terminal Clock", + "shortName":"Terminal Clock", + "icon": "icon.png", + "version":"0.01", + "type": "clock", + "supports": ["BANGLEJS","BANGLEJS2"], + "description": "A terminal clock displaying multiple informations", + "storage": [ + {"name": "terminal_clock.app.js","url": "app.js"}, + {"name": "terminal_clock.settings.js", "url": "settings.js"}, + {"name": "terminal_clock.img","url": "app-icon.js","evaluate": true} + ], + "data": [ + {"name": "terminal_clock.json"}, + ], + "screenshots": [ + {"url": "screenshot1.png"}, + {"url": "screenshot2.png"} + ] +} diff --git a/apps/terminal_clock/screenshot1.png b/apps/terminal_clock/screenshot1.png new file mode 100644 index 0000000000000000000000000000000000000000..874114483fbe5c9523f428938bae8928020c3aa0 GIT binary patch literal 3190 zcmds4`Crmm7sl^=OSBw8({s95Ckx{TD6G`SE>bNRFL zR_y4usZ~r0%{YBQAwZ%JwDjJ809W0C z(2M|}NC(!MvXD!M(8Q2`xx-fi8%JP))HG-_LQv_$!$0ykF>X48Nv)_md%JvZlfkCY8r5>kpQUv`sglf z$T1Ep2WlGE*p~trwno*lty@%M_B9$)RNS9lrRV_!bOW z%@eTt#=6Jgs`k%B$Je|u3}ww^iwh+Y+@0K62|Z099@qb}T{zg_gsu_nqX`2gQ>vAX zuG7u>%#psyinCdt8bQxk?W`7a(V9s9GFPM)spwTYuo6BBB_8kw1Gf-~K7e5fpAbR( zq;jPZSSdKn_z;j!yfsY~k%PTQ`Z$OUF?DCwmsKisNT^nGEbL%p4uTHX#E$Wl@?(uV zAGy$Uj!0Z|54tVg%YJ(~HFU*t9tMC}hsy00WgwI)>Shb<^}l zrC(55De3oD#`9Ad?DX0({7{lB*I3v-^Wf zT2JZcbAvO8OA8JAj=zMtS1J0Z zyy~T>Gk$TeycE`32wx*1JT%;tVZW_n+dr9ox1WN2|FjwfBu*!kq zRU%10eX%~dCB%=~R*&oGftk-6)o833_sQNu>H&$XtiUCj#A;>Q4TZZJtt)|RTHnK9K^B zj$%S2{B-0C{W1n0RIevlz*~oFV*0C!Wxv|TfU{mXeC11asCzMX*5aMd=t*aQV`x4< zy~6+nU|{Br3)lzyv;ddDve)n_tK>z`G)ES0HEzZdoz)ykjFOoJ+v|#XP&u(WsrRyAnniU{k`xK#kb?chKmnpGbyF( zByzOEzl+n?T+p5W>Bp71@m;HydH9W+NvZC5ldcFq)=7UVN0G?Vq$emO_$k9Uc^PNG z1B>4M;=qX3!wp0;gI4#`KKRsK^zy}g-(x%#r5Zd~iw8xmYyoG+jOjSda$q27y!3{C zcII6O4M&s=o{bk2fJJnC&n^SvGF7ZH``~Gv+|<~N8X4xyQsGgZl3K&b~@k%PL#|dL6459Rdt5@d5rDhB{Ompl58S0V@%a3 z>y*5qykuTOHKKrbcnXY4(cV38o3#feC>=N?qTkEZgAb!|*O8r7nM({}WrBzJ;Bo`> z@l1VG@VPPWuaiXU{)IYC!1o}uE}z>*k_0c5tc6q)ZR8$lcK-%D1;xa7MFNx5!#XNc zAouR?@@_VaJpS2$JTBb>kI+1&!9!g@3v33Vb-Q5+M{@W@zgVYgoXr|X(g_fv2lj8? zlM43l!b+U}Mwrlk(do@B3dxk6(N?>5hL%}xFBl!L#7dT~ETDG++)}31+4hMOuVlxS zx(czw%I!X4ht%aYulr*}&|*=V^Y~zrfY5iR===6@4MSfzOrIt5k~Tp*N^Llsizzp6 z+rO@bh*Q|if709$E-SQ*0}&!Bd#sP%f?zE77?{r!&iijNm7yYkHYA^-jUZ13O7O+F zEeG0m70!;AQzm4cm$nhM1*I}FiSKrvVJ|U}EcqRcDDP16d4C2-27QyzQ5w-I%w8nF zotx@M$^H`2QIT)L82BE7NmrLwsFkW@8SJlca})UroUX2=T45!&PX$j{3PfW2iLf~f zUJ#duz7Se1ZKcEoGaVzMPB{$9pR^;jfb7a*ev6&7YEOcOwK&Jn7jUQJGCyG@+qD3@ zO(4QhqeJIAun#Sh2>|%pRbstNqes-$Z4nZthNAiho0^9-Xp)_{NF!q4} z#{KCs%Xy2h1OtF!I?(;Q_bN}k>Nd}%V{rgDTXJBZ<$Qq#jlU)p7;Oc<*QDp?MEEwq zRnsa&#}4LS4QcY0?9`kFeUb<}_yaaD20gb!T9nVJQtf358lv$k-vGU1tX)rAV&Fu5D&ssGzjgs_P@Nl`#)$<|Cd)-`^xgw WcOKbI6JP!lkO03x-v;lPYySl!2HfNT literal 0 HcmV?d00001 diff --git a/apps/terminal_clock/screenshot2.png b/apps/terminal_clock/screenshot2.png new file mode 100644 index 0000000000000000000000000000000000000000..6d1b5f040316615a683e5ef1e0fbc332908fa7eb GIT binary patch literal 2628 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 back(), + 'HR confidence': { + value: 40|settings.HRMinConfidence, // 0| converts undefined to 0 + min: 0, max: 100, + onchange: v => { + settings.HRMinConfidence = v; + writeSettings(); + } + }, + 'Show date': { + value: !!settings.showDate, + format: v => v?"Yes":"No", + onchange: v => { + settings.showDate = v; + writeSettings(); + } + }, + 'Show HRM': { + value: !!settings.showHRM, + format: v => v?"Yes":"No", + onchange: v => { + settings.showHRM = v; + writeSettings(); + } + }, + 'Show Activity': { + value: !!settings.showActivity, + format: v => v?"Yes":"No", + onchange: v => { + settings.showActivity = v; + writeSettings(); + } + }, + 'Show Steps': { + value: !!settings.showStepCount, + format: v => v?"Yes":"No", + onchange: v => { + settings.showStepCount = v; + writeSettings(); + } + } + }); +}) From fdbfccda481c2fe4538d977f336dd08c6f347fca Mon Sep 17 00:00:00 2001 From: Stiralbios Date: Sun, 13 Feb 2022 16:21:46 +0100 Subject: [PATCH 07/99] Trying to fix the banglejs app store after breaking it with the terminalclock app --- apps/terminal_clock/metadata.json | 21 --------------- .../ChangeLog | 0 .../README.md | 0 .../app-icon.js | 0 apps/{terminal_clock => terminalclock}/app.js | 2 +- .../icon.png => terminalclock/app.png} | Bin apps/terminalclock/metadata.json | 24 ++++++++++++++++++ .../screenshot1.png | Bin .../screenshot2.png | Bin .../settings.js | 2 +- 10 files changed, 26 insertions(+), 23 deletions(-) delete mode 100644 apps/terminal_clock/metadata.json rename apps/{terminal_clock => terminalclock}/ChangeLog (100%) rename apps/{terminal_clock => terminalclock}/README.md (100%) rename apps/{terminal_clock => terminalclock}/app-icon.js (100%) rename apps/{terminal_clock => terminalclock}/app.js (97%) rename apps/{terminal_clock/icon.png => terminalclock/app.png} (100%) create mode 100644 apps/terminalclock/metadata.json rename apps/{terminal_clock => terminalclock}/screenshot1.png (100%) rename apps/{terminal_clock => terminalclock}/screenshot2.png (100%) rename apps/{terminal_clock => terminalclock}/settings.js (97%) diff --git a/apps/terminal_clock/metadata.json b/apps/terminal_clock/metadata.json deleted file mode 100644 index 4e957edce..000000000 --- a/apps/terminal_clock/metadata.json +++ /dev/null @@ -1,21 +0,0 @@ -{ "id": "terminal_clock", - "name": "Terminal Clock", - "shortName":"Terminal Clock", - "icon": "icon.png", - "version":"0.01", - "type": "clock", - "supports": ["BANGLEJS","BANGLEJS2"], - "description": "A terminal clock displaying multiple informations", - "storage": [ - {"name": "terminal_clock.app.js","url": "app.js"}, - {"name": "terminal_clock.settings.js", "url": "settings.js"}, - {"name": "terminal_clock.img","url": "app-icon.js","evaluate": true} - ], - "data": [ - {"name": "terminal_clock.json"}, - ], - "screenshots": [ - {"url": "screenshot1.png"}, - {"url": "screenshot2.png"} - ] -} diff --git a/apps/terminal_clock/ChangeLog b/apps/terminalclock/ChangeLog similarity index 100% rename from apps/terminal_clock/ChangeLog rename to apps/terminalclock/ChangeLog diff --git a/apps/terminal_clock/README.md b/apps/terminalclock/README.md similarity index 100% rename from apps/terminal_clock/README.md rename to apps/terminalclock/README.md diff --git a/apps/terminal_clock/app-icon.js b/apps/terminalclock/app-icon.js similarity index 100% rename from apps/terminal_clock/app-icon.js rename to apps/terminalclock/app-icon.js diff --git a/apps/terminal_clock/app.js b/apps/terminalclock/app.js similarity index 97% rename from apps/terminal_clock/app.js rename to apps/terminalclock/app.js index 2ce4dda99..8729deace 100644 --- a/apps/terminal_clock/app.js +++ b/apps/terminalclock/app.js @@ -128,7 +128,7 @@ var settings = Object.assign({ showHRM: "Yes", showActivity: "Yes", showStepCount: "Yes", -}, require('Storage').readJSON("terminal_clock.json", true) || {}); +}, require('Storage').readJSON("terminalclock.json", true) || {}); // draw immediately at first draw(); // Show launcher when middle button pressed diff --git a/apps/terminal_clock/icon.png b/apps/terminalclock/app.png similarity index 100% rename from apps/terminal_clock/icon.png rename to apps/terminalclock/app.png diff --git a/apps/terminalclock/metadata.json b/apps/terminalclock/metadata.json new file mode 100644 index 000000000..4a5948159 --- /dev/null +++ b/apps/terminalclock/metadata.json @@ -0,0 +1,24 @@ +{ + "id": "terminalclock", + "name": "Terminal Clock", + "shortName":"TerminalClock", + "icon": "app.png", + "version":"0.01", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS","BANGLEJS2"], + "description": "A terminal cli like clock displaying multiple sensor data", + "readme": "README.md", + "storage": [ + {"name": "terminalclock.app.js","url": "app.js"}, + {"name": "terminalclock.settings.js","url": "settings.js"}, + {"name": "terminalclock.img","url": "app-icon.js","evaluate": true} + ], + "data": [ + {"name": "terminalclock.json"}, + ], + "screenshots": [ + {"url": "screenshot1.png"}, + {"url": "screenshot2.png"} + ] +} diff --git a/apps/terminal_clock/screenshot1.png b/apps/terminalclock/screenshot1.png similarity index 100% rename from apps/terminal_clock/screenshot1.png rename to apps/terminalclock/screenshot1.png diff --git a/apps/terminal_clock/screenshot2.png b/apps/terminalclock/screenshot2.png similarity index 100% rename from apps/terminal_clock/screenshot2.png rename to apps/terminalclock/screenshot2.png diff --git a/apps/terminal_clock/settings.js b/apps/terminalclock/settings.js similarity index 97% rename from apps/terminal_clock/settings.js rename to apps/terminalclock/settings.js index 8f6aa9467..b4fa1a464 100644 --- a/apps/terminal_clock/settings.js +++ b/apps/terminalclock/settings.js @@ -1,5 +1,5 @@ (function(back) { - var FILE = "terminal_clock.json"; + var FILE = "terminalclock.json"; // Load settings var settings = Object.assign({ HRMinConfidence: 40, From 6455e0db319bd436a23d19c614068b835c7b3e2a Mon Sep 17 00:00:00 2001 From: Stiralbios Date: Sun, 13 Feb 2022 16:46:49 +0100 Subject: [PATCH 08/99] use the compression on the image for the terminalclock app --- apps/terminalclock/app-icon.js | 2 +- apps/terminalclock/metadata.json | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/terminalclock/app-icon.js b/apps/terminalclock/app-icon.js index dd5bd596e..5e57a4b7c 100644 --- a/apps/terminalclock/app-icon.js +++ b/apps/terminalclock/app-icon.js @@ -1 +1 @@ -E.toArrayBuffer(atob("MDCEAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAd3d3AAAAAAAAAAAAAAAAAAAAAAAAAAAAd3d3AAAAAAAAAAAAAAAAAAAAAAAAAAAAd3d3AAAAAAAAAAAAAAAAAAAAAAAAAAAAd3d3AAAAAAAAAAAAAAAAAAAAAAAAAAAAd3d3AAAAAAAAAAAAAAAAAAAAAAAAAAAAd3d3d3d2AAAAAAAAAAAAAAAAAAAAAAAAAAAHd3d2AAAAAAAAAAAAAAAAAAAAAAAAAAAHd3d2AAAAAAAAAAAAAAAAAAAAAAAAAAAHd3d2AAAAAAAAAAAAAAAAAAAAAAAAAAAHd3d2AAAAAAAAAAAAAAAAAAAAAAAAAAAHd3d3ZmZgAAAAAAAAAAAAAAAAAAAAAAAGZmZ3d3dwAAAAAAAAAAAAAAAAAAAAAAAAAABnd3dwAAAAAAAAAAAAAAAAAAAAAAAAAABnd3dwAAAAAAAAAAAAAAAAAAAAAAAAAABnd3dwAAAAAAAAAAAAAAAAAAAAAAAAAABnd3dwAAAAAAAAAAAAAAAAAAAAAAAAAABnd3d3d3cAAAAAAAAAAAAAAAAAAAAAAAAAAAB3d3cAAAAAAAAAAAAAAAAAAAAAAAAAAAB3d3cAAAAAAAAAAAAAAAAAAAAAAAAAAAB3d3cAAAAAAAAAAAAAAAAAAAAAAAAAAAB3d3cAAAAAAAAAAAAAAAAAAAAAAABnd3d3d3cAAAAAAAAAAAAAAAAAAAAAAABnd3dwAAAAAAAAAAAAAAAAAAAAAAAAAABnd3dwAAAAAAAAAAAAAAAAAAAAAAAAAABnd3dwAAAAAAAAAAAAAAAAAAAAAAAAAABnd3dwAAAAAAAAAAAAAAAAAAAAAAAGZmZ3d3dwAAAAAAAAAAAAAAAAAAAAAAAHd3d3ZmZgAAAAAAAAAAAAAAAAAAAAAAAHd3d2AAAAAAAAAAAAAAAAAAAAAAAAAAAHd3d2AAAAAAAAAAAAAAAAAAAAAAAAAAAHd3d2AAAAAAAAAAAAAAAAAAAAAAAAAAAHd3d2AAAAAAAAAAAAAAAAAAAAAAAAd3d3d3d2AAAAAAAAAAAAAAAAAAAAAAAAd3d3AAAAAAAAAAAAAAAAAAAAAAAAAAAAd3d3AAAAAAAAAAAAAAAAAAAAAAAAAAAAd3d3AAAAAAAAAAAAAAAAAAAAAAAAAAAAd3d3AAAAAAAAAAAAAAAAAAAAAAAAAAAAd3d3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==")) +require("heatshrink").decompress(atob("mEwghC/AHsHu93uAX/C+wACsAaTC/4Xiu1mswXRCYNnDQQxTgwX/C8QABuAaTg4X/C7Z3Xa/4Xds1ms4XUCgV2DYIXUsBdTC/4AEg4VCC61wIiYX/C74A/AGIA==")) diff --git a/apps/terminalclock/metadata.json b/apps/terminalclock/metadata.json index 4a5948159..93578148c 100644 --- a/apps/terminalclock/metadata.json +++ b/apps/terminalclock/metadata.json @@ -1,13 +1,13 @@ { "id": "terminalclock", "name": "Terminal Clock", - "shortName":"TerminalClock", - "icon": "app.png", + "shortName":"Terminal Clock", + "description": "A terminal cli like clock displaying multiple sensor data", "version":"0.01", + "icon": "app.png", "type": "clock", "tags": "clock", "supports": ["BANGLEJS","BANGLEJS2"], - "description": "A terminal cli like clock displaying multiple sensor data", "readme": "README.md", "storage": [ {"name": "terminalclock.app.js","url": "app.js"}, @@ -20,5 +20,5 @@ "screenshots": [ {"url": "screenshot1.png"}, {"url": "screenshot2.png"} - ] + ] } From 189141c976c1555b56defc9c87e5b9e085d7b4b9 Mon Sep 17 00:00:00 2001 From: Stiralbios Date: Sun, 13 Feb 2022 16:53:54 +0100 Subject: [PATCH 09/99] Remove the trailing comma making the metadata.json invalid for the terminalclock app --- apps/terminalclock/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/terminalclock/metadata.json b/apps/terminalclock/metadata.json index 93578148c..43f923d2f 100644 --- a/apps/terminalclock/metadata.json +++ b/apps/terminalclock/metadata.json @@ -15,7 +15,7 @@ {"name": "terminalclock.img","url": "app-icon.js","evaluate": true} ], "data": [ - {"name": "terminalclock.json"}, + {"name": "terminalclock.json"} ], "screenshots": [ {"url": "screenshot1.png"}, From 1446533c1d67deb30b6d2151f49ca05ead27ae57 Mon Sep 17 00:00:00 2001 From: Stiralbios Date: Sun, 13 Feb 2022 17:06:07 +0100 Subject: [PATCH 10/99] fix the settings reading for terminalclock app --- apps/terminalclock/app.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/apps/terminalclock/app.js b/apps/terminalclock/app.js index 8729deace..f999593d7 100644 --- a/apps/terminalclock/app.js +++ b/apps/terminalclock/app.js @@ -92,19 +92,19 @@ function draw(){ clearWatchIfNeeded(now); // mostly to not have issues when changing days drawTime(now, curPos); curPos++; - if(settings.showDate == "Yes"){ + if(settings.showDate){ drawDate(now, curPos); curPos++; } - if(settings.showHRM == "Yes"){ + if(settings.showHRM){ drawHRM(curPos); curPos++; } - if(settings.showActivity == "Yes"){ + if(settings.showActivity){ drawActivity(curPos); curPos++; } - if(settings.showStepCount == "Yes"){ + if(settings.showStepCount){ drawStepCount(curPos); curPos++; } @@ -124,10 +124,10 @@ g.clear(); var settings = Object.assign({ // default values HRMinConfidence: 40, - showDate: "Yes", - showHRM: "Yes", - showActivity: "Yes", - showStepCount: "Yes", + showDate: true, + showHRM: true, + showActivity: true, + showStepCount: true, }, require('Storage').readJSON("terminalclock.json", true) || {}); // draw immediately at first draw(); From 3aafe3a3b364aaedb499e94670e2980eafef5809 Mon Sep 17 00:00:00 2001 From: pkkpp <52079346+pkkpp@users.noreply.github.com> Date: Tue, 15 Feb 2022 11:28:18 +0100 Subject: [PATCH 11/99] Add files via upload --- apps/7x7dotsclock/dotfontclock.png | Bin 0 -> 16937 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/7x7dotsclock/dotfontclock.png diff --git a/apps/7x7dotsclock/dotfontclock.png b/apps/7x7dotsclock/dotfontclock.png new file mode 100644 index 0000000000000000000000000000000000000000..c11d7708ed45a5b06ec6153839e3c050fcdc241f GIT binary patch literal 16937 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 Date: Tue, 15 Feb 2022 11:35:26 +0100 Subject: [PATCH 12/99] Update 7x7dotsclock.info --- apps/7x7dotsclock/7x7dotsclock.info | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/apps/7x7dotsclock/7x7dotsclock.info b/apps/7x7dotsclock/7x7dotsclock.info index 9a90aac67..46d719749 100644 --- a/apps/7x7dotsclock/7x7dotsclock.info +++ b/apps/7x7dotsclock/7x7dotsclock.info @@ -1,15 +1,7 @@ -{ "id": "7x7dotsclock", - "name": "7x7 dots clock", - "shortName":"7x7 dots clock", +{ + "id":"7x7dotsclock", + "name":"7x7 dots clock", "type":"clock", - "version":"0.01", - "description": "A clock with a big 7x7 dots font", - "icon": "7x7dotsclock.img", - "tags": "", - "supports" : ["BANGLEJS2"], - "readme": "README.md", - "storage": [ - {"name":"7x7dotsclock.app.js","url":"7x7dotsclock.app.js"}, - {"name":"7x7dotsclock.img","url":"7x7dotsclock-icon.js","evaluate":true} - ] -} \ No newline at end of file + "src":"dotfontclock.app.js", + "icon":"dotfontclock.img" +} From 467e20019942acafb267168740049864b6c0efe9 Mon Sep 17 00:00:00 2001 From: pkkpp <52079346+pkkpp@users.noreply.github.com> Date: Tue, 15 Feb 2022 11:36:37 +0100 Subject: [PATCH 13/99] Create metadata.json --- apps/7x7dotsclock/7x7dotsclock/metadata.json | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 apps/7x7dotsclock/7x7dotsclock/metadata.json diff --git a/apps/7x7dotsclock/7x7dotsclock/metadata.json b/apps/7x7dotsclock/7x7dotsclock/metadata.json new file mode 100644 index 000000000..74cb7605c --- /dev/null +++ b/apps/7x7dotsclock/7x7dotsclock/metadata.json @@ -0,0 +1,16 @@ +{ "id": "7y7dotsclock", + "name": "7x7 dots Clock", + "shortName":"7x7 dots Clock", + "version":"0.01", + "description": "A clock with a big 7x7 dots Font", + "icon": "dotfontclock.png", + "tags": "clock", + "type": "clock", + "supports" : ["BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"7x7dotsclock.app.js","url":"7x7dotsclock.app.js"}, + {"name":"7x7dotsclock.info","url":"7x7dotsclock.info"}, + {"name":"7x7dotsclock.img","url":"7x7dotsclock.img.js","evaluate":true} + ] +} From 835d80036ed7f1c0ecb228155cfcce5b8e4382dd Mon Sep 17 00:00:00 2001 From: pkkpp <52079346+pkkpp@users.noreply.github.com> Date: Tue, 15 Feb 2022 11:38:11 +0100 Subject: [PATCH 14/99] Create metadata.json --- apps/7x7dotsclock/metadata.json | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 apps/7x7dotsclock/metadata.json diff --git a/apps/7x7dotsclock/metadata.json b/apps/7x7dotsclock/metadata.json new file mode 100644 index 000000000..74cb7605c --- /dev/null +++ b/apps/7x7dotsclock/metadata.json @@ -0,0 +1,16 @@ +{ "id": "7y7dotsclock", + "name": "7x7 dots Clock", + "shortName":"7x7 dots Clock", + "version":"0.01", + "description": "A clock with a big 7x7 dots Font", + "icon": "dotfontclock.png", + "tags": "clock", + "type": "clock", + "supports" : ["BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"7x7dotsclock.app.js","url":"7x7dotsclock.app.js"}, + {"name":"7x7dotsclock.info","url":"7x7dotsclock.info"}, + {"name":"7x7dotsclock.img","url":"7x7dotsclock.img.js","evaluate":true} + ] +} From 2ae84804be6eab3fa9872947d8463d7fd502414f Mon Sep 17 00:00:00 2001 From: pkkpp <52079346+pkkpp@users.noreply.github.com> Date: Tue, 15 Feb 2022 11:38:31 +0100 Subject: [PATCH 15/99] Delete apps/7x7dotsclock/7x7dotsclock directory --- apps/7x7dotsclock/7x7dotsclock/metadata.json | 16 ---------------- 1 file changed, 16 deletions(-) delete mode 100644 apps/7x7dotsclock/7x7dotsclock/metadata.json diff --git a/apps/7x7dotsclock/7x7dotsclock/metadata.json b/apps/7x7dotsclock/7x7dotsclock/metadata.json deleted file mode 100644 index 74cb7605c..000000000 --- a/apps/7x7dotsclock/7x7dotsclock/metadata.json +++ /dev/null @@ -1,16 +0,0 @@ -{ "id": "7y7dotsclock", - "name": "7x7 dots Clock", - "shortName":"7x7 dots Clock", - "version":"0.01", - "description": "A clock with a big 7x7 dots Font", - "icon": "dotfontclock.png", - "tags": "clock", - "type": "clock", - "supports" : ["BANGLEJS2"], - "readme": "README.md", - "storage": [ - {"name":"7x7dotsclock.app.js","url":"7x7dotsclock.app.js"}, - {"name":"7x7dotsclock.info","url":"7x7dotsclock.info"}, - {"name":"7x7dotsclock.img","url":"7x7dotsclock.img.js","evaluate":true} - ] -} From 0c3c9e9977bb2516a7437c18c010e737a404575f Mon Sep 17 00:00:00 2001 From: pkkpp <52079346+pkkpp@users.noreply.github.com> Date: Tue, 15 Feb 2022 11:41:31 +0100 Subject: [PATCH 16/99] Update metadata.json --- apps/7x7dotsclock/metadata.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/7x7dotsclock/metadata.json b/apps/7x7dotsclock/metadata.json index 74cb7605c..2a9b48bbb 100644 --- a/apps/7x7dotsclock/metadata.json +++ b/apps/7x7dotsclock/metadata.json @@ -1,9 +1,9 @@ -{ "id": "7y7dotsclock", +{ "id": "7x7dotsclock", "name": "7x7 dots Clock", "shortName":"7x7 dots Clock", "version":"0.01", "description": "A clock with a big 7x7 dots Font", - "icon": "dotfontclock.png", + "icon": "dotsfontclock.png", "tags": "clock", "type": "clock", "supports" : ["BANGLEJS2"], From 09657a7d1e67c52349007c928630676f751c4903 Mon Sep 17 00:00:00 2001 From: pkkpp <52079346+pkkpp@users.noreply.github.com> Date: Tue, 15 Feb 2022 11:42:11 +0100 Subject: [PATCH 17/99] Add files via upload --- apps/7x7dotsclock/dotsfontclock.png | Bin 0 -> 16937 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/7x7dotsclock/dotsfontclock.png diff --git a/apps/7x7dotsclock/dotsfontclock.png b/apps/7x7dotsclock/dotsfontclock.png new file mode 100644 index 0000000000000000000000000000000000000000..c11d7708ed45a5b06ec6153839e3c050fcdc241f GIT binary patch literal 16937 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 Date: Tue, 15 Feb 2022 11:45:00 +0100 Subject: [PATCH 18/99] Create ChangeLog --- apps/7x7dotsclock/ChangeLog | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/7x7dotsclock/ChangeLog diff --git a/apps/7x7dotsclock/ChangeLog b/apps/7x7dotsclock/ChangeLog new file mode 100644 index 000000000..50c5eca4a --- /dev/null +++ b/apps/7x7dotsclock/ChangeLog @@ -0,0 +1 @@ +0.01: Initial version for upload From 49a042502ed5c16091faac11aae3e8374c2b60fa Mon Sep 17 00:00:00 2001 From: pkkpp <52079346+pkkpp@users.noreply.github.com> Date: Tue, 15 Feb 2022 11:49:33 +0100 Subject: [PATCH 19/99] Create README.md --- apps/7x7dotsclock/README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 apps/7x7dotsclock/README.md diff --git a/apps/7x7dotsclock/README.md b/apps/7x7dotsclock/README.md new file mode 100644 index 000000000..85d93cdb3 --- /dev/null +++ b/apps/7x7dotsclock/README.md @@ -0,0 +1,11 @@ +# 7x7 dots clock + +![](dotsfontclock.png) + +A Clock with big numbers made of 7x7 dots +system widgeds ar not (yet) supported +when screen is locked it shows a full screen mode +by swiping you can open cusomizable apps + +Contributors: +* pkkpp From 0bdf42954b175da32f77fe1d5e5e8612e1e1dd9b Mon Sep 17 00:00:00 2001 From: pkkpp <52079346+pkkpp@users.noreply.github.com> Date: Tue, 15 Feb 2022 11:49:55 +0100 Subject: [PATCH 20/99] Update README.md --- apps/7x7dotsclock/README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/7x7dotsclock/README.md b/apps/7x7dotsclock/README.md index 85d93cdb3..8e51f46da 100644 --- a/apps/7x7dotsclock/README.md +++ b/apps/7x7dotsclock/README.md @@ -2,10 +2,10 @@ ![](dotsfontclock.png) -A Clock with big numbers made of 7x7 dots -system widgeds ar not (yet) supported -when screen is locked it shows a full screen mode -by swiping you can open cusomizable apps +* A Clock with big numbers made of 7x7 dots +* system widgeds ar not (yet) supported +* when screen is locked it shows a full screen mode +* by swiping you can open cusomizable apps Contributors: * pkkpp From 9d4b2d57e1d5c8bccd526cf0d0975700413ddc18 Mon Sep 17 00:00:00 2001 From: pkkpp <52079346+pkkpp@users.noreply.github.com> Date: Tue, 15 Feb 2022 11:54:35 +0100 Subject: [PATCH 21/99] Update metadata.json --- apps/7x7dotsclock/metadata.json | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/7x7dotsclock/metadata.json b/apps/7x7dotsclock/metadata.json index 2a9b48bbb..5c64ed6f4 100644 --- a/apps/7x7dotsclock/metadata.json +++ b/apps/7x7dotsclock/metadata.json @@ -10,7 +10,6 @@ "readme": "README.md", "storage": [ {"name":"7x7dotsclock.app.js","url":"7x7dotsclock.app.js"}, - {"name":"7x7dotsclock.info","url":"7x7dotsclock.info"}, {"name":"7x7dotsclock.img","url":"7x7dotsclock.img.js","evaluate":true} ] } From 1a3272025c23dc03138fc0b55210f8c53a51a940 Mon Sep 17 00:00:00 2001 From: pkkpp <52079346+pkkpp@users.noreply.github.com> Date: Tue, 15 Feb 2022 12:03:35 +0100 Subject: [PATCH 22/99] Delete dotfontclock.png --- apps/7x7dotsclock/dotfontclock.png | Bin 16937 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 apps/7x7dotsclock/dotfontclock.png diff --git a/apps/7x7dotsclock/dotfontclock.png b/apps/7x7dotsclock/dotfontclock.png deleted file mode 100644 index c11d7708ed45a5b06ec6153839e3c050fcdc241f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16937 zcmV)QK(xP!P) zaB^>EX>4U6ba`-PAZ2)IW&i+q+SQy}mL@rloZq>MS%ULUE{E51v;!?)pTRvcv#NS# z)RJD5*`1jc@rOH|01RdT=fBGlc zpY|($-{Qaj@^$y?8-Xvy-=D1G`~2YR`S%a}+{4eme%-b2JE46S`o8gV!Kgb2{;~gD zBwr8j*M0gf)X)2m(p&v=sWZHPukVAll<)ts+NFP8ME~vn{6ebi($0J;hH#>fkNw%+ z6-52t$HD&te}-7X&sTD6&c5Wom9QaydAy&$pXbjF`pYK&{LB4)_kaECZ<`;+_x1R< zy)54z@sEG`4WIw@=Gzwk)g8VSg};7d$FTqLIN$&8-R<7|B^fP>L zvgOf!tnjAHH7Lt``9qhVC5mEFtLEoIcydgQY2bj z4K3*2{7m)s*^omC`ZCyrA#yCSVw)ZZ#!4yUKQ%RcXylkv&bj28o69|q5=$z%lv0a8 zZq!&)&9&58TkUnU*iy@_wAxzhZS>G17?^wMwYT2;7{Lv0G`QB_^MkL-Q4u|ZG3IpW$;UP{JQMBK6lSOt12d78FdX@WaM?Z zb#EuuhC9zWPti)^KEp0Tc8HZl5Ni=v(3j2~@gARV$~f75;#@I4drdOkE#u(HA@*M4 z&0e2R>)>kqM4Go%$IsSVbJn-!o%Rs|B@yajtU6L&iRaGwgmq$E-EIbau82#AXEpw~ zD?1*y<+}MEi%6`QIN`H+^Wb@P*?xX5KL@*B&ofv7DZTlsPq79*;`q!J{~B`9TJnCz z8GLGO(qw|uoTuv(&!`Eql6N{S^SuUqRKM&V`$+WhX7Vb<$=#J+hqG71Lr->CvyX58;DltmPubX|HE2GCdHcB8*L_W1MI&E3=1CKj>dwB^oYE=sP) zUuuRX5ir4PC3;E=(Yn)oSDtxnE*bB1whcu6{vsNj$n40IiGi}oBgFz}@{_M)$*mMW zefyNf(6jyRe*VGVdCt5e#-9y*_u~G3mb-8m*62sg++^<+Qw<p1Fw$5a z{IP-_#}9Ibez9!{nt4fZKz;WD{*>b0&n0l>!vVh7ew)huX{)iTA91fdQ}cea>wn#u z9KW5JKRfe#W8BZqthEz%YS^hCFs92)6HF|IK=DH$`Az-HS_G{Ct237!dz~H$rUW1B z{zO~K8o$?)|8Awf8_BhCYR%`8+K)d8pCfw6==ydpaR?}e`E?2A#+DEG=kxs?`Pl}~ zKC$n`juxoMVh2gvW0zZqu>~z4Tth0cj~SDA2lhEiCtM~>OD3lvcy@Lf1e(5$Ju)sx zy!N~*!JpUAqdbKl$~+Gwq>IzW)jYn$C2?`Fev%CmZ#sF7ZzYE{xXRhO3K+qrBv@`+ zEc0kFBpXBoJPJa!3^|FijakAeiUJ4T2{I8yC+r5T<3N0*vjq6 zSqAbW@q|l|H=$Z57PQe+1hjS$LPzPT5FPA0z^kARyTa>O04~sTTJAKz5o2-JnbSie zY}zGoSfL4eU|pUM!u5cqIf#+rG28+p>#BIt5HBE$WWU29F-)w@M$0y2tdj$b>~aOr zw~WjVv7*X@B<*(h=zP2_XNcO)fPcrL-khjfdVSId4}Ry{`UJ*G#-M$A^6gBylK5tn zsO$O^wrU4_a0F`Tr0{`3D*jfqto_WzudV8dUxbY(A5A^@f_uXf;==UUA%YoQilsQ1 zE9sLU>-Cv1RY?b*$7;vrRquE zwPk((fQuw6gjp{qcffGo$P@Uc^TOvyR`T@a z@(poz?4Klw>Ry(#E8tXjfvTkhkx3xA^nxk_Sdd_Tl5ip_fu|8y_HKaCXI7kDhFFLg zRSjeZ2{cT@otuC*@Mp8f-aQ!*QECxw0M0NITw*|tKwxePdCj;)f})|Wk_t>< z=g%@nEyhNDcO?ZW9dJ+Ezr<2=>nEseLl8nF1EDu0!Wy_9j$n!Ox!ZGfSwb4u$jfo- z6sjN{DwaXUr90UdbGk!h>$!WNMb8qZYb}n zeO^NE`hx20IB`lZeJ1xBzZIb05!fZZv{7c;)v#59NchNTd3_5`R(tV1&PSzydJPy7czV#d!`3^6e=Wa_vBRz+7Z@OTK%Pe+*R0hL^7m$?6 z_c#{$&6SfP;lCl0<3wWuETG_B`zXe}g4B{hU1E&rBw~+mg2f&;XP4NHmX&D%T?i!? zeu11DDNS4=pOsvbxQm&I{HBV}Bab$|ljRCw65N5%3(*$#=s z&cWy)K~m%$?}um+jf)$c4Vp@*fo8B;h{5I|Ncjrb2B}Vv>!j!&4;~3?s-%a|JDdg3 zbW6zwnoq`IyL|Rqxd)v{QT+dngbRSO$9}T(39ujt!KIBahSsL)PoB-j`b0S}MJBok zDKy&s{G|c+q9&I_l0_JJ2w3(=k|zXvY;Ty1Ron>zBvO8aH-gP4o~+=-rweJC@FuDA zH#>T8zw0*+2GvZXpyWhMRUO&Kkr+N9^rPZNGrSnLD(W!XpmX-SGhO>e8JDIG7BI~aveZ`iam2G?(xV-(4T{Ef+LS3 zKVHD0oRUG)s^o)Z3X3dAtomXeSVrOv6T*u23$U&Vjy8cWUSiD4Db`^QP^LZ~qGACj zz>h5*rqH0S&{yp!Oa7@RYydxZAy6UrA^-3r1T#$V!yrsopdT69@}_^e2w8cSs`SsY z;2JB(0XbTJ{h9q;(*B11{U9EGltp15&tQez8Jd<6X&0!!^^vj_6hll}#2Onq4O1J< z#lPm&wdTlKDP>pj65SahAx?&=jcS3F{o8Dwmw-e0 zjI~Mkdvmpyr56A4&)BF0=$}!0t_08Y=Qv1)%e)Bmk!) ziv|+B!bJJi#W%@wNFqRQFBbQtDU}d#)?h&%9p-`USzaVZVNFSKzdORxUylc*h2k4L zG(rh4u0-h~pK+7R$MfOYyjMvBs&hKo2||E!;L&ifz9x?;pulFM-E+tbSOdE>6<@#9 zNa_jsO^n_3`jZ&t?2tVrZb2`*9|gTo?f6#Q@~I06<6}mPv03H9+JZC|9M?tIjLBTw zc3ax7rf(7ZQ8k}7#kMa(-V@NF4$HDr#X;Z;I*7{(bKO8Plm}4d>A})^yRzYgigjq? zmkO02zC>s=Q26}3(M?=0Vp{d1j2X5#5*8af5`cIWxujcJfiKActF-+69D@X-S_AP0 z=D=RT=-@zByy8uU!88Gzo4EzKzfAc7Y%+$lellSL$e@v+;!)Cx>hc zq?mx3N399eUk5Rf8!%#{{osMa_oTBUM3W>DB_=^rP#B5bp;d1wgT0z+GIXs-V2rr; z5hld1pazL|7J1#jT3}~MsYD{1d1qu$K}(43c6EUvh!$u4-5n{^oymqoHe{5Ye#MH{ zazQS&IZh!iRJb6mMinkFVz4^MGk!`U^@`oY%wSx8&yk9fj%)AS(m| zsX0mb1ZjgPY~dss9F5+RAW@Cr@^R*qhTO|1kPvp+OO3IZ!FtTsigRlPtlafw%_N&?m{ zbW2Tq*-`_SJEOu#tY!yGe{?|tf*^3P2jbk4WBVgHiupEaKR%dMc~dDwbRG9-Nka*I zF5MEy0F4VKx8Dy|JfgfGBuJo%`k=zfK3GBj_s&V~`QBKL*X_nQ-s9fj#zV0pjz}`L zT-)Vs&~7#vej8U(t%zj1@A#c;pFfhVdl~usrA_}&rK$U^O`B?O85%-7wYQo`CIe3q z6CpO-#hR5WRH-+p28Zw()2~7Fs~GbLFo@TlRcItb02yFxR01aKN>HIu(-Lc*kkwYq zUYs>)IU-WoUxyVVo`cii7AhPhTosK|@E#0#ua{5bizpTt%~dvh2t^fFgJtF*#uFS& z=7AisIQ%CV^ks|>DM279wO@=Bhyw7UwZewv+gSnE#}a$IgsT*{6L<`N*$uzu^CXIr z-_}ZoTJ~kpCKtsO2^$axC4%)u0I)W&ibJ=~9wj}BSDkE_76i#bA~<~tk6I8UE0&RB zIZAxuPaqaN9?~OMfY>IS&B>+(RGhd=c+^`7hSPiJt70P214mEwAXUUj5RwQoem(i< zSrBZE1%cV08Z5|YKo~|8N!L(OR*aZlD)sH763!?p;Utn^P=~5FJptLYS?SJ^7)Bg^ z#Ya__!879pMHGUhvsJTGDY8bAepSm3Ns6o?{H?JJDpl31iGK1|$6tu8#kwC8wfI>* z!MGH3QdLe;tC5Z|qGBczP&Ez`L^0BIZ*}X_@X$*ycY|GeltyGLkUHeB+9TTw6(NX_ zk{eB%paX%-+X&c#gg*C9cdgH=`h~59?@aAGpXQ!5FXe3skU(}oPtG`?=@N!0B0PA< z94atHh=j)Wl=hb-BYLbX|W2M(o!o{78@lry(HLzzPfN>8s-8p*!Vib5PL$}s2vnK zR6C<(+JV8S>j{kXZhdh;M(x;_jIIpXfki=umQvO~3%!N3y09g%{%4^V)ZA8_@c>Cl z?m0LXaNhVs#OzCuI2l(JWHxYmq35_Je24^Uh2SQliza-38V2Un3Cl+9;junzOW+(2 z8C9$S7dU@bWZ!};sL1`);vu!*iIKE%>fS2=XBVE z>tYGw^=RJ(Gk!YY)?T|Q`p9@F-MRP*ZUim9JCV}xxuyXCyhrU*pjLBgC~Gkdz^uS! zx$gv)KqGahWoU8E!2TRkU&thyVqGug8Sib5;4}w|B7$;>-N2%aX{oU#l~@|eDF7{dpN?K$xax5dL7sI= zge$sdA+#h5f<2n*mPh3ba%+e5l6=|Pw?Zmov~Zi!Z*XV=HD?!056>wr1SL7>y*i(! zuyWSa0~bcjq==WRpNnLL##9j=X_}gyt^1BgRZO_;mlR9Q8d8{{C6!WnsEx-IqnF@8 z2RuM!k|!RtV4BGF{+2^KAvJYp#63okjKBu0pkdW^zl~a<*W+RMkf66t(RZ{Cbhpm& z!indFErBHDcQaTW|~=8b~_Sz1@LxJv?*)}d_1_Kvfr_VMg$`?5FY>`JP&Y$ z%Hbg>HGW?74g-?z%iH>$r)z2~t1wP>o@F?%<}m04_ko98lBU9`tKy+z!XatY*YBVn z%O2QDIj@q_Ku__4E~iGTrDRRKWI2Y`_n6&w`lR{M@W81gUL=CDxF#73`}g(;H8J4) ze+9(<4G!B6!mOby-VvzEoT=~!;ao{NBu=m+1T3s39*ON15xOPmrNNi&x9X|>an z71WIOXfO5_u-?Hx<^B`M!`fU!qb&={1%oEjR(z&zB-_ZQbRRXI(l02tdhL(WMqQ)m zdMP|@_L{ZAPgBzc9LXsQ@R3glNH+b9R}qV8yquTW2br7& zDxNHOaIt)FNK5K!HmmlP6)cb6Fh^vwNu)l6Y$QPQ16K+} zoljL=;Dqs=Y$FvMHxP(HD2J?onI+|W*l72F1yq@j5|}ATKsF2-0X`fsJhO_@Wwn`g z_3J7EZ3Gn#RF>R*bO2DmeTK%GBBl`nrV!NfdZgM-7@?0n2&5)5%no3?!=?tL_RCt& z;d))pIMiqz>om!=Z?b`P0ZBXvPlX4A?V7%CWQP-7&Pvd__5>G_Hl@ENM-YaXwcw<} z6{%eTa^-Rp1rzy!w2tp>DuP|qBX$$=LH#@R^MFTqJ=6zP5R5ZE@#AKi6$50gf`Izb z!Xy~xb~TGLqeoPe4VvMA?phBnsBi%ENJAiwW`D~_N)Z|+&_FEyw%XfDbMGkOV2>pd zAQ~tH7I%|o*P2?T@IW-;)2eMZ@cXLQ8#RqbmW8)sBMqOjOB>mbNY|iKBu2PDo_t$S zRf((^%S8$ZKHsUo1d%5;2o+^|v_|s|w>VNrw!i|XY1JNNH+BYv6*S(Y!Wh2MG;7gM zRbVa~^lCdp-7)!g0?j7whi61Zc9JB13n4+Q?5OOt>rvhIqLDARn`%cWz#o?vihTqh@dcG8`f^m`9_2o5_!vA4 zf{_JeLThY5N6jMv(A9ha#_bOP2_>wG6K{=bCRngb00tE8Ca~JkRh_N*_mO&2emp#JdDV_*rsz*hYu3qB;k>PCUSPgfv zd-pAe^ARYhWR`kuKr~=^-{~rkp0|wWFW=N22s9zh5TZ9a`)^~LqstGrht5uFY z+!FafXn}-xfJd6`mgcz~kGFbu1R9QK8|Kv9>KR_87tIIYO0CVhwojE%GO2vnSIx0q ze5RMPY?)On!E4kL(NJ#En8DK2RZS=)?nl<1BuAEpO4|FITsX&Bsc+&;s*ShC4zVo5 zKdU}AO=K;$igm#mW4>@GI4&Zt79=&|ReLxeVfKz1GMEUc3LU}r>I(8z&CUZU8bpce zL6mMRoTmZoC#0!FdB{78r2_-jlAl2Xuj;?`o95<=s`8;aSY04T6AM4e=cj@{fH$1C zV9eniOoqKs#fq&b2Nxh1P{|O02aMBX9OeNI&a7IsbOWnqKLU3gs$lO(usWs58j-GV zg=%V=)j#YFJR?si1!1qQa!c08Q-W9PJK^-!Ro2W6lpchX!iRGcJN-a0$r*YE7>`C3 z{O98U!h`>AX(quLR2rI#+}LGX)uB2S^JfENZ7<&{4XO}u??R_lLy*h1zFUuB z668KgHp6SVoF-GZcjJYDY{Sy*_fVBm6@jg>l+|7xB6ewgDR4+xlmE2{mIA~ExaUG5 z04O+Ktm=Za$udyHP*V_Vs82s&DVrw^q?KXCOG4r+U8-RN%hAk%g9cR%;U4%FOU4Lr zA?q$bZ)b;m2lf$Kxj;5D3f0i~fK@h*gdgKp&9UHCiISc+nKagUE}UKGnI5aS?y}a~ zW^BNLs-i{m&g$>IrFk^_V@&eR}VA2VOM}39%CPy-XX3uq~4?G%s_P0~pZA_jeu>V3kxl~Vr zM4aBw)CDjS8*0k&l-;(Vby9I+v$N`z;P(T|yW}a%lspP0SyM7|X<`=OYZzlkkws00~E{&yIRf*Pa(oms+t zNv_t{X;xX8Tp!~-o`*r%fqHnQXA_oY8XmCCrLR4y!AcgMTO3!sP~!~TLtb$96lelUT~prB_GZjbb**>U>!8$OWJEnQMw$?wn~9Fc zGDcEAGO2HEsu$|6b0GW>a^9w03f!Fv%b@ zA`yVj$7X@{cNPLL>hIAPc#(|<&ho{ahF`%Dz|c4?{K-bzSycHIl`>9K%0^eA_`4XX zZ1JxAkUj9zpRVy6Sy5Y;kZA^iEM~} zB&*t{)2g%l*Mjn-7si%NeIO74M>v=yj&-)Z7V3#^g>Q0_tPAFcWSvE{DciAB?l&Wj z954kwBR~wqlxoX5T&X&_diGN#<}h;4j;!o8mIwSJU3{OSU*fD78Z_piu1+r=6((K^ zkCrqS-~tQbqwkZ<+}6Btg0Ftt>aUebqt zJ48@WwW=9U(?H`pMS!rVSEvC~CW9PZJ?fT0Bk_T_Q~zCKne{qgwh7E-a2_A=Nn+AT z$DlUBQ2iGa?mAARMT8N2c^i81T2RBiO4z~OLvn@#W#~hE&8eqg&FwYjQq8{NeWJv2 z#}JczfzU+asy5g*oX8m&>GBS*)1=xG&GM5=Rc^8WN}AprTzo>Td)3sX=5IU@sdKF1 zu|uc7hR|D1pHE&rCUgT$Yd+bmpN)$_v%T-c19Z!J#>D?mf5W{Ov3n~VWkbjyVgzuJ z7m8@Y)!IfO*n>nH!vSB-*IP;IVA^q^&NIdT+|208*UUkKvNi&q4&ukAAbBVw!A`42#kK}uUtmt==Oh6Zwp1rqfs5hjGUH_)aZ9ja(L#qyLT zt@sQzEu@Cj?brNA5q@Ei@OIHd$vko4AJ*ycUxj`+bQvU}N@gEn`p|Jo**L=OhMLaW zdA?~+U9T*JFy%2oPq7v?2_YR$`4B4t##aA*QIN6nyV!Y|;B>**1U@xUUu zvk7fAitvXbF;WB#py!aN+sQ#IvQPZ!ce8)<=dASwvGZv7`aQ{#RWFwmO5&~KDgjl<1J)G;aNGVTpuSp0{amLoT`Nobgi)fumot1@E;!ipy z#zPaNv1N4f^xEcCZH&1`*GN~1*a1Se4UbqWYyAv3kklk8q1E#ekUHFdD}RHZdu^39 zi3#}DaLD;oY|goYIIt@O+-aKehNM+wG-0nAun(jEv~7aMIcmQho*ZE>M*T=HV$Mg? z4aV)O61D~t(QUQ>!it9>lMFSJ{+c`Nu%rrk09#ju2L;nKNg6^yrh$W4MRhwOu2~)I zA;Da5W;7Ck$}foK$`_LwBv)s%%Kg0sK|rjr6RT5^=NojA&90yZTc_qEw+osX*XUaT zC^dACVvc~nKj;c{!cgHK7X*$q%1|_AHln5_btKKOAB~J|;3s)PP^O6g#piACsh!cp zHIJQuDL0~9_G6nfq%j3QiB_kB!JjQpZ~b*hLZ!9B?bTo>GfFsPrS zBY=tydvAj;@KH8cdPBV_9bQ>B(ujobY_1!s%pwtp(gOd`S*3z^6TLc{#6NZ7^pKAZ zS&vQ8Y<eX8FdR0ZNRTVVsxO6&F$H8>2PeUX_RrYlOPj+92&z-7( z7<;ID(1(V%h>MLWwCv{{MmT88H4$?qT&reC)x)S1N8oSSWYfNSOOK7D z6KO+Jt4C%hhwr4r4pHMC84U)dOzHu2of`~Z^Sf|gAJiXs&mQksq?Fh(6&?!@tD4I< zJ8Nx17#qo5pO1kPOD`u@vqx9+67C7jJ#QY?%Hg(WHQ$CL?ysL$7pL zIt>wQ>^4Iqo+$SuNe%GmrN+=!+ydt5f;z!4R=k-nz#Y-T8ne*Q=&1E2$ZbQd5cEJ1 z$+n_i)j(cXQgzx1#o~UB6g*H8ugRIm@&pgAdBwetj;BSdHRF^TU{I-9rSPFrIRAKb zGI+SHej!u|GKI^DTxJYExQ8zb-Wh;wN!k=94y;=oGGRhcNVEBOIQcvNjov=uvP$#cj z$Y)D-L)X9A()5Vs7}3?yJrbb?>LH*dev)`OqL9l7$Y90vp5g*=V%5! z`=0{i)(g2?CYuV>e3&4m3E4t?#3tK!&hGNi{hUkYe>^uh%`1vh_kJ>0iP7+p)A&z>=U* z*hN(X0LOw?+6HI@`=d%Y=r@o`Q!z1mcj2~MgtggdC68~aCY&{NzWxRkVq<$*hR#gs z)Sq6-$6Bm8p|UkJ)BRLqp=44C8m@!0TrlR_d@x&m%PBeQI}hPC8hiC_79vaaVMI~s z4*GGu>7u5&sJE&Q;SsOYOsd@hIr;A{z-ZGBfO!E)| zL41DWjznx%hKZevPyUs1ay*T z$PBV|3IIeEI>L_*@ku1dKX_TyS-}IV%}{rbd$CvQp|MjK-PM(}>r+YWX!y8qX+w$E z>q*i|32c>m$2ENCjq++Hz43AJLmi|kj?BPU^j;hfWnveK=@!+>Rp&1#M}()22V{}2 z`<@RF|IztviBiaA>A*-Dn&mt=j7Vv2b^umIHl9G%m2E8G~j+<$UN;y0~OBp@L zYI?g4H{zyf_MJ6d0df(7YuNCZ!czHKmE51}FHKdzRfuZ6N@wTeY#Oy^>$$*6IEkJre9H@j2XGOJ!W=bUgKyrbQeH7Hn+j;u{3pj#o z4a~lzeyFZ`9XUUot^q!AIKBBs2e;lg-<0u@IB&1yLUBAQXoIjSeOJ3S`Bv{Csg7OO z8y@XlN#V7CI9tV95o(BGy*gK3MJ4rDN`8l~+M}s2o1sxHf1x0Ca=73Z+TBv#Qa?}~ zq~|nphROr>t{PZaRwcEF`w+bTo%10}K*SwMAnR;yR^No&K=JkaXv^K@~0@U^cvLeGK+9{i%A(<<{FSmpt407o+c$p3T#H2{X|s zy-06|2$|4dMG{m^FBgbuxcBG6F{}MG&Qv_qacR9{u1O*29ayl+ z_^wj(S{fRA8w5_>x2zi<09cXxYxEC?cTGiocG?vShrrshl0>MzOE>^nn*e$nAMKf z>mk!OW}zB!JtVU?t#7^CA+r{>zKd!DI=q~11l-yz;{1htadm#!#t(F84lV=@&p>px zX-Sw(%NKxZ-U~dO?7P!DR#mfJ_SO&6 zLviRFIRuMq%!E@2ZvC?M-CN9hoBB6m9p8&;+|U}ML~!FcF`f===Vwk$OzRDqPw2p; z(lX>K+nZ+eI&H3$90K=aE$Yx;wLI%A;d7Sis7;5W5!?Hx~E@7gMMK=3i{ z_gJ-8hY+sjg|0@5CQ@%ljJcd5NhOI#?+VgKA00D$) zLqkwWLqi~Na&Km7Y-Iodc$|HaJxIeq9K~N-MUjew8Kj70s7@9{MRe0D6rn<>6nNgNw7S4z7YA_yOYP=A`H%CH^ldw21NGxF7HCJ?`EC!Fri# zR>v5i>9(0l#KlZ@RqT327!e4V!H~=>V@{Hi@Eu?G2=MhT#Yo++5=)I703EEd{WX=7G2HR4I) zsH*9dAIx~Ha^B*sm8-0IPyWJiPG4E(I?X{Ou!to{5TT%o63VacI3T>9v*?Jp%f+fs5;wrtATiJHWt`A)B%*g=hxzdEotwz9|dz-vT{rUT@8PoIU_) z>MD5y92^281=rG;(2-i000JJOGiWi{{a60|De66lK=n! z32;bRa{vGf6951U69E94oEQKA00(qQO+^Rg3>p+V6(dqhRR91D^GQTORA}Dqn0s(k zRi4K`_vYSyq?7Irc@Rjz@HPS?6tg}`XEb6KQ*jV2sMJcijLIk}##u+K*)4U}b*yrx z#$sniMjhF*W_Bq-M9>29fd(vLw{Q$gfCSBpNJ5?+Nc!Ek@6A2?M|U5(HL&j1I<;1L zs&4h~{?6}w&$+*I&i8yzD}dk|TvWc{<=YSV_5;5CfNyxw7A{=Kv}w~&6ouyIW|l2m z20(XrHzg${_=i?MB+g9i^%TU(0| zg2BN-+S=N_@?e%OT`F-pJ3CphU;zN9PMuL2gb+g5 zwk?K-hh^RA)2D@P+d>E-;_&7z^9;gT3#U0nhYk38~-0K~d=>%V@xccl$he-K zp2@Q|$uoEETsg}V6BFXI&pwkl`}gm^blc28gb>0sO=-tsv79Vq$3-F$Y1_6fEX$Jb z(P%UWFT1l}!%kqn3Ieq%H0L1Fms|6rxYiq^YwQB_+R9)9E z?r2Suw%hH_*(=#`9*;-bilUI0mnYxz^YbUg127Cj+VOZ?+KEI0UDr_*Wzx1zr!%L$ zX_^X6^CEAD5Xsdi3a5UP7v>N&+xVQ@s85+Y;x67hbqr+gy;# zF~wxhwbx#oGxe8SLYKq7@x~i3yM!(^9u=Ujt}bV)ues(LX>Z)PQQ9>%HPqMF%lBJv zy%o3Hoip{9TSBW=tpY#@!KO`{q<_PP4HOp_Uv>!zAy~b7H2}4>wX9vc_Wy1P_4fA4 z4ZVH)_AhO|ukz&Q=Zn6+K8bVu_;HEz+H0>}y6s=`9Jm|{-Eqeqm&EAq?!F`o{Y7c? z>(~QYe}6w!RaF4Ax3{x!;X(jfT3TptZ)e%EW%Tv+ap1rK)~{brB9Wl6v5}{qdWsn{ zW^nA-F(Q!&H{Em-7cN}jo_p?L=gyrJ6cq60n{Q4kUs4m3TZV>)2m}I@m6c)JHr?Ib zQVaF;^i0|&12$+7X``|Y<&yQZc_G&D4PDO=g`*|_)Lf4^9{ za^-(3B{F?y<7#`V0d_#nwlD1E*ERotl^z^-eK|L#e~CQ0M@Ko zLseB3i9~`#B0+U^HGaRJ9XobVRaHevNePPKE)WR(kM0ARdxdS=Id_wfKKkg=Cviq70TdP% z=A5V*0jH{Jj=1xBy{M`xMV`aqkiyRI_kT%*Wy+j6b0iC8pY}_ZEWzb+<=|us#{B$z zgb>W1KOcaZGiP$uRad3P=Jk4IpwH)%c3D}O`~XE!a_TB8E9J4T>w1oS$dJGn69RDa z%{NQCp`k(Aciwp?m6esaT&_vSl1a)fx7-52b=O_TiWMu!@V#6nhYlT*)As)R@5^Zn zg+k)!(W7#DckS9GLZOhnhGs51i9|x|+__UOuM;OueC17CRaGUry1FFJ;lqdJShj83 zcFA_y(xp%H^wW3K-af*%ZH@foC$Caap!3W#jof|r-!Omv_vq;8*AdXkco*)%mB zrMkL|Idf*y+j|sMjZs{D3z5hm*I)lDHg3Evjq@arJ@zt@h{xF?N2il%8Lgu`H2;BZVQ z5&>NYk7p*qV9Fnjs+i_fGM6$~StnHDT7 zn65LitWFu%)pZctHZe_zMuVI?HisBA8|}jTOW+FSa$! z@hqHniPO>1Ci^zc(HwlOw6p?U2StI>(gkQ*Y6eP57NG0ytov{kx}K^lExi^^)6sQs zI=yIGLAp+*q~v-sS7cqU1faTlk&K4|iKA&=6r~{TSJ8EU7S0@rQ(C$p9S@39B3FX0 zSD?+9kpi|Xm^o9!FjC-NubaHQls|QmPQ?`#LUFN&WHPl3oK6LYBM*-!)q&fcPbiei zmeZNKRn41MfX9=HH%%mtrYTrfUK&5!4{o<6ai&bsB>u(mfYYg??%Vekx^6H&KF&Mu zYy}cH97*1L@Arg4C(ty5SgenMfmhM>Bo0S}x88c3XtWPqH|Xy_MK~OhGdDioj;4`* z&I9n9-)xcb0|Tds#rn`RgHY%Mk;q{*%>V*)b$ycd2YBzjKjCmBfduXC%~_b)&nSwj zB7XeijXd|<^MK0LS6{)RMc?I>S6&AMfB3`mY}k;x7eDa8y|~>4{O)%tCE3{cBR=`0 zgVn1)l$lGhMkYh>v!7kO=QcL}h!c;)*TU_EIV;dYC=?UPec+q`3G7 zY+I$M=pHOx;SiTwOREDOfRgD8p*O#`PhKwe%EilPw=f?)*lczhHTfMJ}&>8vCY z0n@Zllq5c1KAHxhP(M(CX@a7JdG=W^ci;UhuDa^))A4p%nkWciF)@+EF!Iy!6Zm|2 zXc{CEAq>NdWq}Yu{QlIq;&BVp)Y9=GwEX-+$wK-0KDn9P?ov5rZZ~L}PcnhaRf%Ph zW&;gf*JPc~S3xuiLV(km(n19V)8rmWu}y}BG%QQQwll1fm&G>TEWa$UKB!0C)KF=0|z2+3p+=t$!jK(EBH?IU=-;PpZ>`5}J)1b#nQ zR%aIe3AFO^S!Di0nl^1A$zXVll}L7$8i}u&ri!9uPBsP0BK@uc z{TN0sa0&p+`V3Xg+zXClSw5gM&CBh;v2@($m}UeRPQU9|7V^pTmr~?5$>iq zg`;3ut?9lM;24%Q1sKl3SAP1_c2Q9=AInO~hbdE*pzB~5|Bj|j#qXa>fB$(#Mw*#F ze+7kw7N<^aW%1$$!r@|Ku`ZIy2o)7e(Dew-&3|Ivy!8Rz0U`b*lP-e6BRv27_o%5^ zOThh!!b@?o)<+?)9evL*Ynd1GAcERqS)xVg|0i&D)Iu!RKq3L<<+<7;qgBSn zU`lF?#A1+4!qlm$j)#U)*~*-h0O!uZ)mJmA=9vuti#TIr7x8no5NH(@ZplIw6>iBw zMMZw;*EA3!Uuux)(@QYTjObGF`5dyYynG7baEhljEp^Ae^2%cJ@-jHtT1EvNllY;$ z+%0i3W6T{7Xqp>!`}V__CY(DLXV Date: Tue, 15 Feb 2022 12:05:58 +0100 Subject: [PATCH 23/99] Update 7x7dotsclock.img.js --- apps/7x7dotsclock/7x7dotsclock.img.js | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/apps/7x7dotsclock/7x7dotsclock.img.js b/apps/7x7dotsclock/7x7dotsclock.img.js index 46c793905..eb66b813e 100644 --- a/apps/7x7dotsclock/7x7dotsclock.img.js +++ b/apps/7x7dotsclock/7x7dotsclock.img.js @@ -1,5 +1 @@ -{ - width : 48, height : 48, bpp : 8, - transparent : 254, - buffer : require("heatshrink").decompress(atob("AH4A/AH4A/AH4APlYABAYYAFBIwUEERgQJ64AB1gCEAAYGKFxQUGF5AAUDQVWAQOBAQVWF44PBqwCBLgpRDMxhNGL44RJL7oCDR5AMBlYCBF7TiCF4aPKF4RpCwICCAwOsAwVWAwQQCEISPKWQzKCACZ9GL4YRNII51CPI0rAwQDBX6CPhBISPYd7RfUF7S/UNgqMBQ4KMB1krAQOBBIQGDF5oiDR5jvEAYYCFBIQIER6g8DBIIKBAQkrBIorCR7g2GAxAdGR5ShGd7SMCEgWBR5R6CLBIJFAw7veF6b7GX5AMBBYKPwbwwGFwIJFAwaPKDYwNFgWBq8Aq4CBqwGBlYGCAQMsCAssLwQEBllXKIILBEQ0tBAIXCwYABrACBwQGCAAQGDrIGFFwISFABAlCAA1ZAAIFRKIIXVGwVYAogDBCIIGBC4gQDgB5BFJQiFBYQkCCIYFFRYQKHL4MtF5YiFCIwAUR4QAUlwCBJIODq7iBrAgCqwGCd48BBYSDBwQLCRIQbCd40Aq0AgErAYWBAQNWAwVWlZfHBYQVEwMrBAYXBF40sq9XlVXrErAwMtCINXQgIABboq/BBYUsloCBDAQiCDYRiCYobvMIYIKEF4gfBDhr1PApwvHAp7PFawVZawuCboyxBDwb7ED4YFKAAkBq8BgEsa4MBq0BAQQJDL4QAEgTpBCIj1BAwIXDF4xOBEIMrqoDCAQoJCF5EqCIgFBgAUBC4RgCbwVYdIQGBRAQJDAwhLBWYgVCVAgFBUga0Ed9ovvAwQJDABAXEaActCpYYDB5wAOd44APlw4Blo6BluCZQhTCrAQBAwkAgQECDAOCDA4lDBAVYA")) -} +require("heatshrink").decompress(atob("AH4A/AH4A/AH4APlYABAYYAFBIwUEERgQJ64AB1gCEAAYGKFxQUGF5AAUDQVWAQOBAQVWF44PBqwCBLgpRDMxhNGL44RJL7oCDR5AMBlYCBF7TiCF4aPKF4RpCwICCAwOsAwVWAwQQCEISPKWQzKCACZ9GL4YRNII51CPI0rAwQDBX6CPhBISPYd7RfUF7S/UNgqMBQ4KMB1krAQOBBIQGDF5oiDR5jvEAYYCFBIQIER6g8DBIIKBAQkrBIorCR7g2GAxAdGR5ShGd7SMCEgWBR5R6CLBIJFAw7veF6b7GX5AMBBYKPwbwwGFwIJFAwaPKDYwNFgWBq8Aq4CBqwGBlYGCAQMsCAssLwQEBllXKIILBEQ0tBAIXCwYABrACBwQGCAAQGDrIGFFwISFABAlCAA1ZAAIFRKIIXVGwVYAogDBCIIGBC4gQDgB5BFJQiFBYQkCCIYFFRYQKHL4MtF5YiFCIwAUR4QAUlwCBJIODq7iBrAgCqwGCd48BBYSDBwQLCRIQbCd40Aq0AgErAYWBAQNWAwVWlZfHBYQVEwMrBAYXBF40sq9XlVXrErAwMtCINXQgIABboq/BBYUsloCBDAQiCDYRiCYobvMIYIKEF4gfBDhr1PApwvHAp7PFawVZawuCboyxBDwb7ED4YFKAAkBq8BgEsa4MBq0BAQQJDL4QAEgTpBCIj1BAwIXDF4xOBEIMrqoDCAQoJCF5EqCIgFBgAUBC4RgCbwVYdIQGBRAQJDAwhLBWYgVCVAgFBUga0Ed9ovvAwQJDABAXEaActCpYYDB5wAOd44APlw4Blo6BluCZQhTCrAQBAwkAgQECDAOCDA4lDBAVYA")) From 94e61fb1d8b9741f14b99658a1926ef3ae1e417a Mon Sep 17 00:00:00 2001 From: pkkpp <52079346+pkkpp@users.noreply.github.com> Date: Tue, 15 Feb 2022 13:30:11 +0100 Subject: [PATCH 24/99] Add files via upload --- apps/7x7dotsclock/dotsfontclock.png | Bin 16937 -> 26349 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/apps/7x7dotsclock/dotsfontclock.png b/apps/7x7dotsclock/dotsfontclock.png index c11d7708ed45a5b06ec6153839e3c050fcdc241f..af8fa61bafa5395c9e4bbb66e3b076f1a350fa8e 100644 GIT binary patch literal 26349 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 YhZN0^0eJbJANVNpGD_0rlEy**4>3ZR?f?J) literal 16937 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 Date: Tue, 15 Feb 2022 13:38:48 +0100 Subject: [PATCH 25/99] Update 7x7dotsclock.img.js --- apps/7x7dotsclock/7x7dotsclock.img.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/7x7dotsclock/7x7dotsclock.img.js b/apps/7x7dotsclock/7x7dotsclock.img.js index eb66b813e..5b6657415 100644 --- a/apps/7x7dotsclock/7x7dotsclock.img.js +++ b/apps/7x7dotsclock/7x7dotsclock.img.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("AH4A/AH4A/AH4APlYABAYYAFBIwUEERgQJ64AB1gCEAAYGKFxQUGF5AAUDQVWAQOBAQVWF44PBqwCBLgpRDMxhNGL44RJL7oCDR5AMBlYCBF7TiCF4aPKF4RpCwICCAwOsAwVWAwQQCEISPKWQzKCACZ9GL4YRNII51CPI0rAwQDBX6CPhBISPYd7RfUF7S/UNgqMBQ4KMB1krAQOBBIQGDF5oiDR5jvEAYYCFBIQIER6g8DBIIKBAQkrBIorCR7g2GAxAdGR5ShGd7SMCEgWBR5R6CLBIJFAw7veF6b7GX5AMBBYKPwbwwGFwIJFAwaPKDYwNFgWBq8Aq4CBqwGBlYGCAQMsCAssLwQEBllXKIILBEQ0tBAIXCwYABrACBwQGCAAQGDrIGFFwISFABAlCAA1ZAAIFRKIIXVGwVYAogDBCIIGBC4gQDgB5BFJQiFBYQkCCIYFFRYQKHL4MtF5YiFCIwAUR4QAUlwCBJIODq7iBrAgCqwGCd48BBYSDBwQLCRIQbCd40Aq0AgErAYWBAQNWAwVWlZfHBYQVEwMrBAYXBF40sq9XlVXrErAwMtCINXQgIABboq/BBYUsloCBDAQiCDYRiCYobvMIYIKEF4gfBDhr1PApwvHAp7PFawVZawuCboyxBDwb7ED4YFKAAkBq8BgEsa4MBq0BAQQJDL4QAEgTpBCIj1BAwIXDF4xOBEIMrqoDCAQoJCF5EqCIgFBgAUBC4RgCbwVYdIQGBRAQJDAwhLBWYgVCVAgFBUga0Ed9ovvAwQJDABAXEaActCpYYDB5wAOd44APlw4Blo6BluCZQhTCrAQBAwkAgQECDAOCDA4lDBAVYA")) +require("heatshrink").decompress(atob("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")) From cbb607e7b41cafbbbd4fd66531adae1856959ecc Mon Sep 17 00:00:00 2001 From: pkkpp <52079346+pkkpp@users.noreply.github.com> Date: Tue, 15 Feb 2022 13:43:29 +0100 Subject: [PATCH 26/99] Update 7x7dotsclock.img.js --- apps/7x7dotsclock/7x7dotsclock.img.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/7x7dotsclock/7x7dotsclock.img.js b/apps/7x7dotsclock/7x7dotsclock.img.js index 5b6657415..2335bbdff 100644 --- a/apps/7x7dotsclock/7x7dotsclock.img.js +++ b/apps/7x7dotsclock/7x7dotsclock.img.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("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")) +require("heatshrink").decompress(atob("AAkTmEzkAHDmcjmQBBmcTmICCgMAiMAkE/+P/mEQgMQgH/n/zAIP/l/yA4QvXC4kDkEjFgIACkcSmMTkMyBoQHBI4kvI6wXBn8wA4c/mfzl8y+cfEoIaBUS5HBAAMQF4UgIoIBBBgJNBAwQ3BkfygSnJSQIUBkECiBoCL48DmCPFAA6PCX40jX4hYEU4LNBX4JHIkBHCBgJHBianKj8wO4IvHgSnBmJ3CHYqGCABcRcYTXLAA5KCFAJfCC4KnDX4anNgUgiSnMkQQBO5hvCl8yO4pHEd4oyBH4QBBU5TXHkcimUTkLXFL44HEiTbBO4MhBoQHBI4KECR45HGBoIFBU4y/BC4c/mYXGMQJHFiBHLEAIHCf5gAKhWg1UB0IEBjUA0MB0EAjQKCiANCCQOg0cxmcSmWjU4MqmcDmSnDBASkBmejCQIXFmYXEmYXHicyhRLC0AEBAIJFBAIIFCBAYHDF65fXR66vImUCnS8IkeinUBgERgEgcIMBgRHDBgLvCBYMQmcjBYIAHfwL7JiQLBichkcSnUSO4MhI4MxI5MSmMjPgMinCnCkRHGIgJHFiUgkUalUCAgMRkUCkIvIkUSkMC0EiBxAAI0UKkBHCkCPDgA+CI5Z3BmYPBAB53CV4MSEgcSiCnOR4cyR5JQEgBHCC4I0BC4UjC4MCxQXGF4IlBxRHB0UAlUK0BMBkIEBI5ILB0ZHBF4czlTXHI4mjCQIXOH4KnDC4MKgGqgGgAgIBBIoJHJBoQA==")) From 19c9bf406ccff573d18ef3534560a19416a8fbb3 Mon Sep 17 00:00:00 2001 From: pkkpp <52079346+pkkpp@users.noreply.github.com> Date: Tue, 15 Feb 2022 13:52:15 +0100 Subject: [PATCH 27/99] Update 7x7dotsclock.img.js --- apps/7x7dotsclock/7x7dotsclock.img.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/7x7dotsclock/7x7dotsclock.img.js b/apps/7x7dotsclock/7x7dotsclock.img.js index 2335bbdff..63d39c6fe 100644 --- a/apps/7x7dotsclock/7x7dotsclock.img.js +++ b/apps/7x7dotsclock/7x7dotsclock.img.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("AAkTmEzkAHDmcjmQBBmcTmICCgMAiMAkE/+P/mEQgMQgH/n/zAIP/l/yA4QvXC4kDkEjFgIACkcSmMTkMyBoQHBI4kvI6wXBn8wA4c/mfzl8y+cfEoIaBUS5HBAAMQF4UgIoIBBBgJNBAwQ3BkfygSnJSQIUBkECiBoCL48DmCPFAA6PCX40jX4hYEU4LNBX4JHIkBHCBgJHBianKj8wO4IvHgSnBmJ3CHYqGCABcRcYTXLAA5KCFAJfCC4KnDX4anNgUgiSnMkQQBO5hvCl8yO4pHEd4oyBH4QBBU5TXHkcimUTkLXFL44HEiTbBO4MhBoQHBI4KECR45HGBoIFBU4y/BC4c/mYXGMQJHFiBHLEAIHCf5gAKhWg1UB0IEBjUA0MB0EAjQKCiANCCQOg0cxmcSmWjU4MqmcDmSnDBASkBmejCQIXFmYXEmYXHicyhRLC0AEBAIJFBAIIFCBAYHDF65fXR66vImUCnS8IkeinUBgERgEgcIMBgRHDBgLvCBYMQmcjBYIAHfwL7JiQLBichkcSnUSO4MhI4MxI5MSmMjPgMinCnCkRHGIgJHFiUgkUalUCAgMRkUCkIvIkUSkMC0EiBxAAI0UKkBHCkCPDgA+CI5Z3BmYPBAB53CV4MSEgcSiCnOR4cyR5JQEgBHCC4I0BC4UjC4MCxQXGF4IlBxRHB0UAlUK0BMBkIEBI5ILB0ZHBF4czlTXHI4mjCQIXOH4KnDC4MKgGqgGgAgIBBIoJHJBoQA==")) +require("heatshrink").decompress(atob("mEwxH+BpMWj0diMHj0ZB5ALCAQUYj0cAQUUjsdiccj0XAQUAhAZBiUVAYMYgEb///ise/8dG4IMBioUCgALCAQUd/8PAQUaDYMYAQMcAQRfwABMHjRlBjhdCAAwLCAQUUjkZAQQbBjcAjMciQCCR5kUR45GDR5CGBh8ZR4kHR5kYh8eiYdBg4PIBYQCCIoMeXgKGBh8PbYUZAQSPKAEqRBgERAYUUL4cSjsPU4IMCiUTDIwVBgETiIREAoMeSoICCgCqCibDCdYK/COYS/BCAUIZoIACBAQVBcwI7BCIYFBXgS/MiMcXYMZjrpDACsbjsUAQQPJikdHgMajpZEABsXjsbVAJ3BfoMWAQS2BFIRUCW4KPHCAUXUwIACBAQVBIQJHB/8PjQbBjCPPi8ejsSjkeWIQAPcwJWBj0eGwMejACCC5UUaYMSiq+YgETXYICCIxR2BiZ6BOBQAOVYMaAQUAhAJBKoZoBUYUUX4bSBgEVaAQABBATLDiQREAoMP/8HAQRAKjTlBi8bOJYANjD8BAQTvZBYQCCdgTvNNgSPFjaPBiqPHUgSvCDwICBaIMPAQSrCjACBjgCCL5JABBgMajqxCTw4LBAQUXjsbAQUSG4MAg5lBAQSQKjJsCjTXBAA4LCBwcaNYICCDYUXVQICCR5JzBh8UR4YMCR5SDBh4CCRgUXh//jYCBg8ADQQvFjIWBia/RFgMeg4CBF4MPhAvEjaPKjAlBikYiLPJBYIODjBMBAQUXi5HBVwTdJAFGAwACD5OA5AJF2IGFMwQLC5GA5MSD4oCHiOBnM4wE4nGYhM4hIGC2ACBhIJBnEAAQOZF4ILEBwYCCzACBDwM5wIXCzAvBioPCjI2DnIvCjIQCgACBzQvDjIRBjIDBDgIOBF4QlBnIICC4No2EA2ACBAw2wtAJFAwQEDBwwbIAQRfvX975G5OA5AJF2JxBAwWBiIvBBYXIwHJiQfFAQeYC4oAOIgRaCwIXQCgJfDC4MIBIMSioDBjACBiwKCiwWCnIvCX4QLCCocXiQIDioFBC4LLCC4YAOeIJjBXwQAQzEZC4bzCfIM4hAGBzHJRAUaIAIJBjaPXeoWBzT8EjEJnEJwAGB2ACBA4IXBF4RgDR5yMCC4XIAQMREQMSFgMB2MJOAIRBwAQBUYOYhPIL6OZnHIC4RSBPQIGBVyQAQwJ+BwEJ2EZewI4BnBZBPIUVO4QCFisIEAaPOFAMZSQWYqDvCnIfEAD04qDvDIQI9BzJGCjOwSwOYgEIjBHBjI8BwLuDAB8WEoIXCeYUIAQMYeQMJeQKgBAQIHBNoJKBnAwDiqMCAQMIIIIICigFBRgQXCMYUWAwQvIhIQCDQRqBAAIiBEwICBicRBAcSAoIUCC4eawCID2EJtEAwCcBwMJDYMJAwOAFwYAPwGaC4eBnM4LAQ5BnJfCnJfDhIQBPQaPFbAUXR4kVR4U5wIXCzFQnEVBIIvCGwM5qAvBGwOYF4QCBF4cWF44ICF4dQDQQXBtGwAQKLBAwgCB2AJFAwYAQCgQCC")) From e2cee362141960aa08d51ba8e636563bcc304546 Mon Sep 17 00:00:00 2001 From: pkkpp <52079346+pkkpp@users.noreply.github.com> Date: Tue, 15 Feb 2022 13:59:22 +0100 Subject: [PATCH 28/99] Update 7x7dotsclock.img.js --- apps/7x7dotsclock/7x7dotsclock.img.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/7x7dotsclock/7x7dotsclock.img.js b/apps/7x7dotsclock/7x7dotsclock.img.js index 63d39c6fe..b1f91c0bb 100644 --- a/apps/7x7dotsclock/7x7dotsclock.img.js +++ b/apps/7x7dotsclock/7x7dotsclock.img.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwxH+BpMWj0diMHj0ZB5ALCAQUYj0cAQUUjsdiccj0XAQUAhAZBiUVAYMYgEb///ise/8dG4IMBioUCgALCAQUd/8PAQUaDYMYAQMcAQRfwABMHjRlBjhdCAAwLCAQUUjkZAQQbBjcAjMciQCCR5kUR45GDR5CGBh8ZR4kHR5kYh8eiYdBg4PIBYQCCIoMeXgKGBh8PbYUZAQSPKAEqRBgERAYUUL4cSjsPU4IMCiUTDIwVBgETiIREAoMeSoICCgCqCibDCdYK/COYS/BCAUIZoIACBAQVBcwI7BCIYFBXgS/MiMcXYMZjrpDACsbjsUAQQPJikdHgMajpZEABsXjsbVAJ3BfoMWAQS2BFIRUCW4KPHCAUXUwIACBAQVBIQJHB/8PjQbBjCPPi8ejsSjkeWIQAPcwJWBj0eGwMejACCC5UUaYMSiq+YgETXYICCIxR2BiZ6BOBQAOVYMaAQUAhAJBKoZoBUYUUX4bSBgEVaAQABBATLDiQREAoMP/8HAQRAKjTlBi8bOJYANjD8BAQTvZBYQCCdgTvNNgSPFjaPBiqPHUgSvCDwICBaIMPAQSrCjACBjgCCL5JABBgMajqxCTw4LBAQUXjsbAQUSG4MAg5lBAQSQKjJsCjTXBAA4LCBwcaNYICCDYUXVQICCR5JzBh8UR4YMCR5SDBh4CCRgUXh//jYCBg8ADQQvFjIWBia/RFgMeg4CBF4MPhAvEjaPKjAlBikYiLPJBYIODjBMBAQUXi5HBVwTdJAFGAwACD5OA5AJF2IGFMwQLC5GA5MSD4oCHiOBnM4wE4nGYhM4hIGC2ACBhIJBnEAAQOZF4ILEBwYCCzACBDwM5wIXCzAvBioPCjI2DnIvCjIQCgACBzQvDjIRBjIDBDgIOBF4QlBnIICC4No2EA2ACBAw2wtAJFAwQEDBwwbIAQRfvX975G5OA5AJF2JxBAwWBiIvBBYXIwHJiQfFAQeYC4oAOIgRaCwIXQCgJfDC4MIBIMSioDBjACBiwKCiwWCnIvCX4QLCCocXiQIDioFBC4LLCC4YAOeIJjBXwQAQzEZC4bzCfIM4hAGBzHJRAUaIAIJBjaPXeoWBzT8EjEJnEJwAGB2ACBA4IXBF4RgDR5yMCC4XIAQMREQMSFgMB2MJOAIRBwAQBUYOYhPIL6OZnHIC4RSBPQIGBVyQAQwJ+BwEJ2EZewI4BnBZBPIUVO4QCFisIEAaPOFAMZSQWYqDvCnIfEAD04qDvDIQI9BzJGCjOwSwOYgEIjBHBjI8BwLuDAB8WEoIXCeYUIAQMYeQMJeQKgBAQIHBNoJKBnAwDiqMCAQMIIIIICigFBRgQXCMYUWAwQvIhIQCDQRqBAAIiBEwICBicRBAcSAoIUCC4eawCID2EJtEAwCcBwMJDYMJAwOAFwYAPwGaC4eBnM4LAQ5BnJfCnJfDhIQBPQaPFbAUXR4kVR4U5wIXCzFQnEVBIIvCGwM5qAvBGwOYF4QCBF4cWF44ICF4dQDQQXBtGwAQKLBAwgCB2AJFAwYAQCgQCC")) +require("heatshrink").decompress(atob("mEwwkEBAkTmEzkAHDmcjmQBBmcTmICCgMAiMAkE/+P/mEQgMQgH/n/zAIP/l/yA4QvXC4kDkEjFgIACkcSmMTkMyBoQHBI4kvI6wXBn8wA4c/mfzl8y+cfEoIaBVa5HBAAMQF4UgIoIBBBgJNBAwQ3BkfygSnJSQIUBkECiBoCL48DmCPFAA6PCX40jX4hYEU4LNBX4JHIkBHCBgJHBianKj8wO4IvHgSnBmJ3CHYqGCABcRcYTXLAA5KCFAJfCC4KnDX4anNgUgiSnMkQQBO5hvCl8yO4pHEd4oyBH4QBBU5TXHkcimUTkLXFL44HEiTbBO4MhBoQHBI4KECR45HGBoIFBU4y/BC4c/mYXGMQJHFiBHLEAIHCf5gAKhWg1UB0IEBjUA0MB0EAjQKCiANCCQOg0cxmcSmWjU4MqmcDmSnDBASkBmejCQIXFmYXEmYXHicyhRLC0AEBAIJFBAIIFCBAYHDF65fXR66vImUCnS8IkeinUBgERgEgcIMBgRHDBgLvCBYMQmcjBYIAHfwL7JiQLBichkcSnUSO4MhI4MxI5MSmMjPgMinCnCkRHGIgJHFiUgkUalUCAgMRkUCkIvIkUSkMC0EiBxAAI0UKkBHCkCPDgA+CI5Z3BmYPBAB53CV4MSEgcSiCnOR4cyR5JQEgBHCC4I0BC4UjC4MCxQXGF4IlBxRHB0UAlUK0BMBkIEBI5ILB0ZHBF4czlTXHI4mjCQIXOH4KnDC4MKgGqgGgAgIBBIoJHJBoQ=")) From f9ed2829325d862f1915353b774aa5cc3d014293 Mon Sep 17 00:00:00 2001 From: pkkpp <52079346+pkkpp@users.noreply.github.com> Date: Tue, 15 Feb 2022 14:02:13 +0100 Subject: [PATCH 29/99] Update metadata.json --- apps/7x7dotsclock/metadata.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/7x7dotsclock/metadata.json b/apps/7x7dotsclock/metadata.json index 5c64ed6f4..b11ceba0f 100644 --- a/apps/7x7dotsclock/metadata.json +++ b/apps/7x7dotsclock/metadata.json @@ -1,6 +1,6 @@ { "id": "7x7dotsclock", - "name": "7x7 dots Clock", - "shortName":"7x7 dots Clock", + "name": "7x7 Dots Clock", + "shortName":"7x7 Dots Clock", "version":"0.01", "description": "A clock with a big 7x7 dots Font", "icon": "dotsfontclock.png", From 28dc0d008414eba9ec6fed40e24309f0a7957e9c Mon Sep 17 00:00:00 2001 From: pkkpp <52079346+pkkpp@users.noreply.github.com> Date: Tue, 15 Feb 2022 14:06:09 +0100 Subject: [PATCH 30/99] Add files via upload --- apps/7x7dotsclock/dotsfontclock-scr1.png | Bin 0 -> 3874 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/7x7dotsclock/dotsfontclock-scr1.png diff --git a/apps/7x7dotsclock/dotsfontclock-scr1.png b/apps/7x7dotsclock/dotsfontclock-scr1.png new file mode 100644 index 0000000000000000000000000000000000000000..dc86396c0606f0a4c5ea4895bc17543f2e51024a GIT binary patch literal 3874 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 literal 0 HcmV?d00001 From 7bdfb8365f5b6f2980bbd558c419c2084dc50877 Mon Sep 17 00:00:00 2001 From: pkkpp <52079346+pkkpp@users.noreply.github.com> Date: Tue, 15 Feb 2022 14:06:36 +0100 Subject: [PATCH 31/99] Update README.md --- apps/7x7dotsclock/README.md | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/apps/7x7dotsclock/README.md b/apps/7x7dotsclock/README.md index 8e51f46da..a08a9f354 100644 --- a/apps/7x7dotsclock/README.md +++ b/apps/7x7dotsclock/README.md @@ -2,10 +2,16 @@ ![](dotsfontclock.png) + * A Clock with big numbers made of 7x7 dots * system widgeds ar not (yet) supported -* when screen is locked it shows a full screen mode -* by swiping you can open cusomizable apps +* when screen is locked it shows hours and minutes in full screen mode + +![](dotsfontclock-scr1.png) + +* when screen is unlocked it shows additional info: bluetooth, battery, new message, date and seconds +* by swiping you can open customizable apps +* button press opens launcher Contributors: * pkkpp From 4cf203ed6902d013e8277d6b6de48e62dda18e70 Mon Sep 17 00:00:00 2001 From: pkkpp <52079346+pkkpp@users.noreply.github.com> Date: Tue, 15 Feb 2022 14:07:17 +0100 Subject: [PATCH 32/99] Update README.md --- apps/7x7dotsclock/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/7x7dotsclock/README.md b/apps/7x7dotsclock/README.md index a08a9f354..6f285ceaf 100644 --- a/apps/7x7dotsclock/README.md +++ b/apps/7x7dotsclock/README.md @@ -2,6 +2,7 @@ ![](dotsfontclock.png) +best look in dark theme so far * A Clock with big numbers made of 7x7 dots * system widgeds ar not (yet) supported From 8e15f4f96f7575d94af1d4234cd22e5b309b084e Mon Sep 17 00:00:00 2001 From: pkkpp <52079346+pkkpp@users.noreply.github.com> Date: Tue, 15 Feb 2022 14:07:39 +0100 Subject: [PATCH 33/99] Update README.md --- apps/7x7dotsclock/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/7x7dotsclock/README.md b/apps/7x7dotsclock/README.md index 6f285ceaf..37734911f 100644 --- a/apps/7x7dotsclock/README.md +++ b/apps/7x7dotsclock/README.md @@ -2,7 +2,7 @@ ![](dotsfontclock.png) -best look in dark theme so far +looks best with dark theme so far * A Clock with big numbers made of 7x7 dots * system widgeds ar not (yet) supported From a31c1d53ad030d374fd1e445f73fd2b580956a8c Mon Sep 17 00:00:00 2001 From: pkkpp <52079346+pkkpp@users.noreply.github.com> Date: Tue, 15 Feb 2022 14:38:58 +0100 Subject: [PATCH 34/99] Update metadata.json --- apps/7x7dotsclock/metadata.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/7x7dotsclock/metadata.json b/apps/7x7dotsclock/metadata.json index b11ceba0f..6d973182b 100644 --- a/apps/7x7dotsclock/metadata.json +++ b/apps/7x7dotsclock/metadata.json @@ -11,5 +11,6 @@ "storage": [ {"name":"7x7dotsclock.app.js","url":"7x7dotsclock.app.js"}, {"name":"7x7dotsclock.img","url":"7x7dotsclock.img.js","evaluate":true} - ] + ], + "data": [{"name":"7x7dotsclock.json"}], } From 1961ed2a1a39ef991791198665e7003e08c64870 Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Tue, 15 Feb 2022 14:48:25 +0100 Subject: [PATCH 35/99] Update app.js --- apps/contourclock/app.js | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/contourclock/app.js b/apps/contourclock/app.js index a5440845d..85692da60 100644 --- a/apps/contourclock/app.js +++ b/apps/contourclock/app.js @@ -10,6 +10,7 @@ if (settings.fontIndex==undefined) { function draw() { var date = new Date(); // Draw day of the week + g.setColor(g.theme.fg); g.setFont("Teletext10x18Ascii"); g.clearRect(0,138,g.getWidth()-1,176); g.setFontAlign(0,1).drawString(require("locale").dow(date).toUpperCase(),g.getWidth()/2,g.getHeight()-18); From 55430e713516df4225ea4c5967a460de5209dc3c Mon Sep 17 00:00:00 2001 From: Stiralbios Date: Tue, 15 Feb 2022 18:34:43 +0100 Subject: [PATCH 36/99] Bug fixes on the terminalclock app --- apps/terminalclock/app.js | 4 ++-- apps/terminalclock/metadata.json | 2 +- apps/terminalclock/screenshot1.png | Bin 3190 -> 19618 bytes apps/terminalclock/screenshot2.png | Bin 2628 -> 2569 bytes apps/terminalclock/settings.js | 4 ++-- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/terminalclock/app.js b/apps/terminalclock/app.js index f999593d7..af6ff8472 100644 --- a/apps/terminalclock/app.js +++ b/apps/terminalclock/app.js @@ -28,7 +28,7 @@ function clearField(pos){ function clearWatchIfNeeded(now){ if(now.getMinutes() % 10 == 0) - g.clearRect(0, 0, 240, 240); + g.clearRect(0, startY, 240, 240); } function drawLine(line, pos){ @@ -123,7 +123,7 @@ g.clear(); // load the settings var settings = Object.assign({ // default values - HRMinConfidence: 40, + HRMinConfidence: 50, showDate: true, showHRM: true, showActivity: true, diff --git a/apps/terminalclock/metadata.json b/apps/terminalclock/metadata.json index 43f923d2f..6907da84d 100644 --- a/apps/terminalclock/metadata.json +++ b/apps/terminalclock/metadata.json @@ -7,7 +7,7 @@ "icon": "app.png", "type": "clock", "tags": "clock", - "supports": ["BANGLEJS","BANGLEJS2"], + "supports": ["BANGLEJS2"], "readme": "README.md", "storage": [ {"name": "terminalclock.app.js","url": "app.js"}, diff --git a/apps/terminalclock/screenshot1.png b/apps/terminalclock/screenshot1.png index 874114483fbe5c9523f428938bae8928020c3aa0..bfbb9039b7ec94990efcfc11154e714f051ef7b7 100644 GIT binary patch literal 19618 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 literal 3190 zcmds4`Crmm7sl^=OSBw8({s95Ckx{TD6G`SE>bNRFL zR_y4usZ~r0%{YBQAwZ%JwDjJ809W0C z(2M|}NC(!MvXD!M(8Q2`xx-fi8%JP))HG-_LQv_$!$0ykF>X48Nv)_md%JvZlfkCY8r5>kpQUv`sglf z$T1Ep2WlGE*p~trwno*lty@%M_B9$)RNS9lrRV_!bOW z%@eTt#=6Jgs`k%B$Je|u3}ww^iwh+Y+@0K62|Z099@qb}T{zg_gsu_nqX`2gQ>vAX zuG7u>%#psyinCdt8bQxk?W`7a(V9s9GFPM)spwTYuo6BBB_8kw1Gf-~K7e5fpAbR( zq;jPZSSdKn_z;j!yfsY~k%PTQ`Z$OUF?DCwmsKisNT^nGEbL%p4uTHX#E$Wl@?(uV zAGy$Uj!0Z|54tVg%YJ(~HFU*t9tMC}hsy00WgwI)>Shb<^}l zrC(55De3oD#`9Ad?DX0({7{lB*I3v-^Wf zT2JZcbAvO8OA8JAj=zMtS1J0Z zyy~T>Gk$TeycE`32wx*1JT%;tVZW_n+dr9ox1WN2|FjwfBu*!kq zRU%10eX%~dCB%=~R*&oGftk-6)o833_sQNu>H&$XtiUCj#A;>Q4TZZJtt)|RTHnK9K^B zj$%S2{B-0C{W1n0RIevlz*~oFV*0C!Wxv|TfU{mXeC11asCzMX*5aMd=t*aQV`x4< zy~6+nU|{Br3)lzyv;ddDve)n_tK>z`G)ES0HEzZdoz)ykjFOoJ+v|#XP&u(WsrRyAnniU{k`xK#kb?chKmnpGbyF( zByzOEzl+n?T+p5W>Bp71@m;HydH9W+NvZC5ldcFq)=7UVN0G?Vq$emO_$k9Uc^PNG z1B>4M;=qX3!wp0;gI4#`KKRsK^zy}g-(x%#r5Zd~iw8xmYyoG+jOjSda$q27y!3{C zcII6O4M&s=o{bk2fJJnC&n^SvGF7ZH``~Gv+|<~N8X4xyQsGgZl3K&b~@k%PL#|dL6459Rdt5@d5rDhB{Ompl58S0V@%a3 z>y*5qykuTOHKKrbcnXY4(cV38o3#feC>=N?qTkEZgAb!|*O8r7nM({}WrBzJ;Bo`> z@l1VG@VPPWuaiXU{)IYC!1o}uE}z>*k_0c5tc6q)ZR8$lcK-%D1;xa7MFNx5!#XNc zAouR?@@_VaJpS2$JTBb>kI+1&!9!g@3v33Vb-Q5+M{@W@zgVYgoXr|X(g_fv2lj8? zlM43l!b+U}Mwrlk(do@B3dxk6(N?>5hL%}xFBl!L#7dT~ETDG++)}31+4hMOuVlxS zx(czw%I!X4ht%aYulr*}&|*=V^Y~zrfY5iR===6@4MSfzOrIt5k~Tp*N^Llsizzp6 z+rO@bh*Q|if709$E-SQ*0}&!Bd#sP%f?zE77?{r!&iijNm7yYkHYA^-jUZ13O7O+F zEeG0m70!;AQzm4cm$nhM1*I}FiSKrvVJ|U}EcqRcDDP16d4C2-27QyzQ5w-I%w8nF zotx@M$^H`2QIT)L82BE7NmrLwsFkW@8SJlca})UroUX2=T45!&PX$j{3PfW2iLf~f zUJ#duz7Se1ZKcEoGaVzMPB{$9pR^;jfb7a*ev6&7YEOcOwK&Jn7jUQJGCyG@+qD3@ zO(4QhqeJIAun#Sh2>|%pRbstNqes-$Z4nZthNAiho0^9-Xp)_{NF!q4} z#{KCs%Xy2h1OtF!I?(;Q_bN}k>Nd}%V{rgDTXJBZ<$Qq#jlU)p7;Oc<*QDp?MEEwq zRnsa&#}4LS4QcY0?9`kFeUb<}_yaaD20gb!T9nVJQtf358lv$k-vGU1tX)rAV&Fu5D&ssGzjgs_P@Nl`#)$<|Cd)-`^xgw WcOKbI6JP!lkO03x-v;lPYySl!2HfNT diff --git a/apps/terminalclock/screenshot2.png b/apps/terminalclock/screenshot2.png index 6d1b5f040316615a683e5ef1e0fbc332908fa7eb..27bd6d68d4a7068e01c7f07c4799a631815463ac 100644 GIT binary patch literal 2569 zcmc&$eLT~98~*<03@y@w9dXLbk&aS1QO8T(5*8w_n@por3YlofY|L-z zY8$2_bjEDGcy>-HC8I-|9m`2(80LMPJOkd0#mDuyE4O_uaWj0my0_EW9HK^<*f}26xi1Ql~^;{XWf=G806Spmi|u zVr5%=*YH;%A(WRvfbA|n0r{=2Y_b(Dwa(}F2;-$KT!I=aH+nt($Q>MT_M1ZN?0P$p zohj6jJ}tH6Kqy$GT~HW1WWqz#^a#s44`yTIuu_VFL#yM_={zIF_{a=F9ie__chn}E ziPX`n`GRf^iX>j6=!RDaAUl`+MGE)BXcH0Mj722`VZ50}1U=R-SKOPHbl-NAuE zYz$VMaTznev6Ifb#D;3sOxp3%S+mUiKn=bItk`CA&xatIy}}ffR}8y+#K6Lu+`QO= zbbF$Tv7AH9(K*=8cuAF=Yz&t%)7Z4v=qQ^??GR|@y4J+vUD~i{YM4>xoH%6RUSXVI zC?ym#&YJgQ7Q?-#3wuX0x_c^+=enMwj&t~uWrphcgSBj=92r257f(LS5(VALd*0^> z*i{dd4n?A235BQ4I%Dk2QnS!ZrySCyG4T;5xsV%0#8PFC7LH21$pw*T$*)9t8LdpE z?nGT(-T@V-kNT<>S4oJAaQgx^Z90KGq)OPepWclhE9m43!_`e*E`)=AUt|SB%K3(w zetBp7?)N3mL@!obbBxHs>P3ldPR@@nDZTmv4I$I=s~T1KC!Si>jeW-Tehh~jRWuq> zX3zCF*WwXXm%GB-Wr_iO>=zn#jlhXSK{g|fi=z*Icb)Vt^U|?Hn|TXlxq;4yvZ$ld z1Bor=cUszw4*xN2WIEDiXgXKYH>TZ@qV$QBBZz=8K@ApK(KDA*CC{X8uDriL#p!rkeS%LlTO!l`|B-&-@)xrKO8ZHbBWuO_!-&xa#t2na)a`WJI|>;|2NP4o zW1#+9ztVD$@_N5&WvgSK>mG*Phj)dc_8k}*4yQ+4F>5)!3pm&7G$Bri%j=@owhF3s zoXcRt{R$V}kYrx*ni!!z)U@`c1+k5wwpIn%rS61micLb$MYy%1*qt={hiqBse5On} zV!`a((U(i94OH_2&KQh})1u@S&E`Dnsd1l%l+15oR+Gl8ViS*4z;tz(;t!09gMHD1R!D+xQ^=gufZ3iWJQ{0h+fX$+3OT$Dr~0Xw z5MLu>{xd+|D@4ma^`s)+ z>_UNwU0lZzOO5u6i_fGNAV5~ZSib8%dLV=q?#WH7EPtkn)WhkXR*ea zD}{!r7p{lM@x4$~dBdmB$yYV=i#KbrX4u$ZIklC?32Hjp_~+q9-*zX8TT;yK9xZ9PU8v=Kh3L8u z#IufKA8~-P461u=N&XSkUwU5BjF}lok3Ti`c60N^aT1U=O#-(#12?l|Wb(MTgX^0O z3yx6DSMqH*1qDZIJid~X%t(M7xX;FO za4rhdSuriNK3k>JT=o~lGkx?o=VW-T1pkN0!|b>pYM=t2Jh>@xGQ13x${ z%|4#&RgBx}7$CsL%ZR-eHVOV^&T?BIAhj<2x?jUi@@9{#1;+kbsi<<@pR3?i(wvN} z+?-q!e266r01UcPU4^;=N)(UFNHVgtN;K2 literal 2628 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 back(), 'HR confidence': { - value: 40|settings.HRMinConfidence, // 0| converts undefined to 0 + value: 50|settings.HRMinConfidence, // 0| converts undefined to 0 min: 0, max: 100, onchange: v => { settings.HRMinConfidence = v; From 0398ffd855e3c75cb4ca6389a1886028401a5034 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 16 Feb 2022 16:30:40 +0000 Subject: [PATCH 37/99] new core --- core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core b/core index bd894bfdc..bf29f5697 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit bd894bfdcee8293c97763de2b4d105a6b6e5415e +Subproject commit bf29f5697445686255a785476e6b1ed6a13ff697 From d6da125df7927dec535c9c8c7c3dea5e145d88c8 Mon Sep 17 00:00:00 2001 From: David Peer Date: Wed, 16 Feb 2022 17:54:12 +0100 Subject: [PATCH 38/99] Added optinoal fullscreen mode. --- apps/neonx/ChangeLog | 1 + apps/neonx/README.md | 8 +++++-- apps/neonx/metadata.json | 2 +- apps/neonx/neonx.app.js | 45 ++++++++++++++++++++++++------------ apps/neonx/neonx.settings.js | 13 +++++++++-- 5 files changed, 49 insertions(+), 20 deletions(-) diff --git a/apps/neonx/ChangeLog b/apps/neonx/ChangeLog index af7f83942..7ac033fe8 100644 --- a/apps/neonx/ChangeLog +++ b/apps/neonx/ChangeLog @@ -1 +1,2 @@ 0.01: Initial release +0.02: Optional fullscreen mode \ No newline at end of file diff --git a/apps/neonx/README.md b/apps/neonx/README.md index d836dfab3..c3926c4b6 100644 --- a/apps/neonx/README.md +++ b/apps/neonx/README.md @@ -4,8 +4,8 @@ |---------------------------------|--------------------------------------| |
Neon X
|
Neon IO X
| -This is a clock based on Pebble's Neon X and Neon IO X watchfaces by Sam Jerichow. -Can be switched between in the Settings menu, which can be accessed through +This is a clock based on Pebble's Neon X and Neon IO X watchfaces by Sam Jerichow. +Can be switched between in the Settings menu, which can be accessed through the app/widget settings menu of the Bangle.js ## Settings @@ -18,3 +18,7 @@ The thickness of watch lines, from 1 to 5. ### Date on touch Shows the current date as DD MM on touch and reverts back to time after 5 seconds or with another touch. + +### Fullscreen +Shows the watchface in fullscreen mode. +Note: In fullscreen mode, widgets are hidden, but still loaded. \ No newline at end of file diff --git a/apps/neonx/metadata.json b/apps/neonx/metadata.json index 41b16d11b..ffa4d1b8e 100644 --- a/apps/neonx/metadata.json +++ b/apps/neonx/metadata.json @@ -2,7 +2,7 @@ "id": "neonx", "name": "Neon X & IO X Clock", "shortName": "Neon X Clock", - "version": "0.01", + "version": "0.02", "description": "Pebble Neon X & Neon IO X for Bangle.js", "icon": "neonx.png", "type": "clock", diff --git a/apps/neonx/neonx.app.js b/apps/neonx/neonx.app.js index 967fc8582..d3521b1db 100644 --- a/apps/neonx/neonx.app.js +++ b/apps/neonx/neonx.app.js @@ -34,6 +34,7 @@ const colors = { const is12hour = (require("Storage").readJSON("setting.json",1)||{})["12hour"]||false; const screenWidth = g.getWidth(); +const screenHeight = g.getHeight(); const halfWidth = screenWidth / 2; const scale = screenWidth / 240; const REFRESH_RATE = 10E3; @@ -58,16 +59,19 @@ function drawLine(poly, thickness){ } } -let settings = require('Storage').readJSON('neonx.json', 1); - -if (!settings) { - settings = { - thickness: 4, - io: 0, - showDate: 1 - }; +let settings = { + thickness: 4, + io: 0, + showDate: 1, + fullscreen: false, +}; +let saved_settings = require('Storage').readJSON('neonx.json', 1) || settings; +for (const key in saved_settings) { + settings[key] = saved_settings[key] } + + function drawClock(num){ let tx, ty; @@ -79,13 +83,15 @@ function drawClock(num){ g.setColor(colors[settings.io ? 'io' : 'x'][y][x]); if (!settings.io) { - tx = (x * 100 + 18) * newScale; - ty = (y * 100 + 32) * newScale; + newScale *= settings.fullscreen ? 1.18 : 1.0; + let dx = settings.fullscreen ? 0 : 18 + tx = (x * 100 + dx) * newScale; + ty = (y * 100 + dx*2) * newScale; } else { - newScale = 0.33 + current * 0.4; + newScale = 0.33 + current * (settings.fullscreen ? 0.48 : 0.4); - tx = (halfWidth - 139) * newScale + halfWidth; - ty = (halfWidth - 139) * newScale + halfWidth + 12; + tx = (halfWidth - 139) * newScale + halfWidth + (settings.fullscreen ? 2 : 0); + ty = (halfWidth - 139) * newScale + halfWidth + (settings.fullscreen ? 1 : 12); } for (let i = 0; i < digits[num[y][x]].length; i++) { @@ -116,7 +122,11 @@ function draw(date){ l2 = ('0' + d.getMinutes()).substr(-2); } - g.clearRect(0,24,240,240); + if(settings.fullscreen){ + g.clearRect(0,0,screenWidth,screenHeight); + } else { + g.clearRect(0,24,240,240); + } drawClock([l1, l2]); } @@ -150,4 +160,9 @@ Bangle.on('lcdPower', function(on){ }); Bangle.loadWidgets(); -Bangle.drawWidgets(); + +if(settings.fullscreen){ + for (let wd of WIDGETS) {wd.draw=()=>{};wd.area="";} +} else { + Bangle.drawWidgets(); +} \ No newline at end of file diff --git a/apps/neonx/neonx.settings.js b/apps/neonx/neonx.settings.js index 0e205e03b..b4b481baf 100644 --- a/apps/neonx/neonx.settings.js +++ b/apps/neonx/neonx.settings.js @@ -7,7 +7,8 @@ neonXSettings = { thickness: 4, io: 0, - showDate: 1 + showDate: 1, + fullscreen: false, }; updateSettings(); @@ -48,7 +49,15 @@ neonXSettings.showDate = v; updateSettings(); } - } + }, + 'Fullscreen': { + value: false | neonXSettings.fullscreen, + format: () => (neonXSettings.fullscreen ? 'Yes' : 'No'), + onchange: () => { + neonXSettings.fullscreen = !neonXSettings.fullscreen; + updateSettings(); + }, + }, }; E.showMenu(menu); }) From 08af40ff9aeed52acebbfe523659dd5a641f9bb2 Mon Sep 17 00:00:00 2001 From: David Peer Date: Wed, 16 Feb 2022 18:05:22 +0100 Subject: [PATCH 39/99] Allow a thickness of 6 - looks nice in fullscreen mode. --- apps/neonx/README.md | 2 +- apps/neonx/neonx.settings.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/neonx/README.md b/apps/neonx/README.md index c3926c4b6..f205b702f 100644 --- a/apps/neonx/README.md +++ b/apps/neonx/README.md @@ -14,7 +14,7 @@ the app/widget settings menu of the Bangle.js Activate the Neon IO X clock look, a bit hard to read until one gets used to it. ### Thickness -The thickness of watch lines, from 1 to 5. +The thickness of watch lines, from 1 to 6. ### Date on touch Shows the current date as DD MM on touch and reverts back to time after 5 seconds or with another touch. diff --git a/apps/neonx/neonx.settings.js b/apps/neonx/neonx.settings.js index b4b481baf..3af2e0fa5 100644 --- a/apps/neonx/neonx.settings.js +++ b/apps/neonx/neonx.settings.js @@ -18,7 +18,7 @@ if (!neonXSettings) resetSettings(); - let thicknesses = [1, 2, 3, 4, 5]; + let thicknesses = [1, 2, 3, 4, 5, 6]; const menu = { "" : { "title":"Neon X & IO"}, From 307527386e7f75959514fec2ee99d1b6f790a6ab Mon Sep 17 00:00:00 2001 From: David Peer Date: Wed, 16 Feb 2022 18:07:15 +0100 Subject: [PATCH 40/99] Minor position fix --- apps/neonx/neonx.app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/neonx/neonx.app.js b/apps/neonx/neonx.app.js index d3521b1db..4ef0986fe 100644 --- a/apps/neonx/neonx.app.js +++ b/apps/neonx/neonx.app.js @@ -91,7 +91,7 @@ function drawClock(num){ newScale = 0.33 + current * (settings.fullscreen ? 0.48 : 0.4); tx = (halfWidth - 139) * newScale + halfWidth + (settings.fullscreen ? 2 : 0); - ty = (halfWidth - 139) * newScale + halfWidth + (settings.fullscreen ? 1 : 12); + ty = (halfWidth - 139) * newScale + halfWidth + (settings.fullscreen ? 2 : 12); } for (let i = 0; i < digits[num[y][x]].length; i++) { From 88e9fca8e46e265b3c855de9ae80b50de1c6e06d Mon Sep 17 00:00:00 2001 From: David Peer Date: Wed, 16 Feb 2022 19:57:22 +0100 Subject: [PATCH 41/99] Add simple info app --- apps/info/ChangeLog | 1 + apps/info/README.md | 17 +++++++ apps/info/info.app.js | 106 ++++++++++++++++++++++++++++++++++++++++ apps/info/info.icon.js | 1 + apps/info/info.png | Bin 0 -> 1548 bytes apps/info/metadata.json | 18 +++++++ 6 files changed, 143 insertions(+) create mode 100644 apps/info/ChangeLog create mode 100644 apps/info/README.md create mode 100644 apps/info/info.app.js create mode 100644 apps/info/info.icon.js create mode 100644 apps/info/info.png create mode 100644 apps/info/metadata.json diff --git a/apps/info/ChangeLog b/apps/info/ChangeLog new file mode 100644 index 000000000..07afedd21 --- /dev/null +++ b/apps/info/ChangeLog @@ -0,0 +1 @@ +0.01: Release \ No newline at end of file diff --git a/apps/info/README.md b/apps/info/README.md new file mode 100644 index 000000000..007a9794e --- /dev/null +++ b/apps/info/README.md @@ -0,0 +1,17 @@ +# Info + +A very simple app that shows information on 3 different screens. +Go to the next screen via tab right, go to the previous screen +via tab left and reload the data via tab in the middle of the +screen. Very useful if combined with pattern launcher ;) + +![](screenshot_1.png) +![](screenshot_2.png) +![](screenshot_2.png) + + +## Contributors +- [David Peer](https://github.com/peerdavid). + +## Thanks To +Info icons created by Freepik - Flaticon diff --git a/apps/info/info.app.js b/apps/info/info.app.js new file mode 100644 index 000000000..b241907f3 --- /dev/null +++ b/apps/info/info.app.js @@ -0,0 +1,106 @@ +var s = require("Storage"); +const locale = require('locale'); +var ENV = process.env; +var W = g.getWidth(), H = g.getHeight(); +var screen = 0; + +function getVersion(file) { + var j = s.readJSON(file,1); + var v = ("object"==typeof j)?j.version:false; + return v?((v?"v"+v:"Unknown")):"NO "; +} + + +function drawData(name, value, y){ + g.drawString(name, 5, y); + g.drawString(value, 100, y); +} + +function getSteps(){ + try{ + return Bangle.getHealthStatus("day").steps; + } catch(e) { + return ">= 2v12"; + } +} + +function getBpm(){ + try{ + return Math.round(Bangle.getHealthStatus("day").bpm) + " bpm"; + } catch(e) { + return ">= 2v12"; + } +} + +function drawInfo() { + g.reset().clearRect(Bangle.appRect); + var h=18, y = h;//-h; + + // Header + g.setFont("Vector", h+2).setFontAlign(0,-1); + g.drawString("--==|| INFO ||==--", W/2, 0); + g.setFont("Vector",h).setFontAlign(-1,-1); + + // Dynamic data + if(screen == 0){ + drawData("Steps", getSteps(), y+=h); + drawData("HRM", getBpm(), y+=h); + drawData("Battery", E.getBattery() + "%", y+=h); + drawData("Voltage", E.getAnalogVRef().toFixed(2) + "V", y+=h); + drawData("IntTemp.", locale.temp(parseInt(E.getTemperature())), y+=h); + } + + if(screen == 1){ + drawData("Charging?", Bangle.isCharging() ? "Yes" : "No", y+=h); + drawData("Bluetooth", NRF.getSecurityStatus().connected ? "Conn." : "Disconn.", y+=h); + drawData("GPS", Bangle.isGPSOn() ? "On" : "Off", y+=h); + drawData("Compass", Bangle.isCompassOn() ? "On" : "Off", y+=h); + drawData("HRM", Bangle.isHRMOn() ? "On" : "Off", y+=h); + } + + // Static data + if(screen == 2){ + drawData("Firmw.", ENV.VERSION, y+=h); + drawData("Boot.", getVersion("boot.info"), y+=h); + drawData("Settings", getVersion("setting.info"), y+=h); + drawData("Storage", "", y+=h); + drawData(" Total", ENV.STORAGE>>10, y+=h); + drawData(" Free", require("Storage").getFree()>>10, y+=h); + } + + if(Bangle.isLocked()){ + g.setFont("Vector",h-2).setFontAlign(-1,-1); + g.drawString("Locked", 0, H-h+2); + } + + g.setFont("Vector",h-2).setFontAlign(1,-1); + g.drawString((screen+1) + "/3", W, H-h+2); +} + +drawInfo(); +setWatch(_=>load(), BTN1); + +Bangle.on('touch', function(btn, e){ + var left = parseInt(g.getWidth() * 0.3); + var right = g.getWidth() - left; + var isLeft = e.x < left; + var isRight = e.x > right; + + if(isRight){ + screen = (screen + 1) % 3; + } + + if(isLeft){ + screen = Math.max(0, (screen - 1)); + } + + drawInfo(); +}); + +Bangle.on('lock', function(isLocked) { + drawInfo(); +}); + +Bangle.loadWidgets(); +for (let wd of WIDGETS) {wd.draw=()=>{};wd.area="";} +// Bangle.drawWidgets(); \ No newline at end of file diff --git a/apps/info/info.icon.js b/apps/info/info.icon.js new file mode 100644 index 000000000..8dbab8357 --- /dev/null +++ b/apps/info/info.icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwcBkmSpICDBwcJBYwCDpAhFggRJGg8SCI+ABgU//gSDCI4JBj//AAX4JRAIBg4QDAAPgBIJWGgIQFAAI+BLglAgEPCI/wEgJoEgYQHAAPANwhWFAApcBCIWQgAQJAAMAgSMDCJiSCwB6GQA6eCn5TFL4q5BUgIRF/wuBv4RGkCeGO4IREUgMBCJCVGCISwIWw0BYRLIICLBHHCJRrGCIQIFR44I5LIoRaPpARcdIwRJfYMBCJuACKUkgE/a5f8gEJCJD7FCIeAg78FAAvggFJCIMACJZOBCIOQCJsCCIOSgEfCBP4gESCIZTFOIwRDoDIGaguSCIVIgCkFTwcAggRDpIYBQAx6BgAOCAQYIBLghWBTwQRFFgIABXIIFDBwgCDBYQAENAYCFLgIAEKwpKIIhA=")) diff --git a/apps/info/info.png b/apps/info/info.png new file mode 100644 index 0000000000000000000000000000000000000000..c73813025950aaccc31b7476b67ceb6326b5f915 GIT binary patch literal 1548 zcmV+n2J`ueP)&f>~B9rWa~T zO&bJa&{8T~N=wOnsPP9`P{G7MVAx;4pjMrUnq>u3O-u&aq>I5{OcTJi(H~mE+Gfk` zhf%z{UZL%^)V-5S?s@KcKA+d;p68x>?s-lCJcJM`j>qHsVzJmqkw`=t2n3XO?%er& zqdID}dak;<`dMXVI(xU#bHT_6xR>G%8PGcz;NZ0s~N zG%U$vvRR2l;wmpMzr`nzv}L#3NMqE?>U9sV}3^`177Udj^Y&ihNF|^Y3){HkHX_ z>Vgz^uDQ9Hx_I#-m8nKXMyO-Qj-_l7v)OE$oSZD;4S)Ld>7i6kawUyM!)d>>vvV|S zaD>nY27_UO%kb3HRL)j5ALy~a-T<{$o9eDw#%WO6$1)vYg-1N(D?XxQV}@xNctk%xpOD4x1`Z%WTd51>G=A70zybg5X4iUO_JPhH?K*TTrQtZ z*gACR5bxP2olT`u`I44a);1UZ7t1PreSKQaX432RZhAqp*<5ILiX=$}yjH9Aq+IBA zI2@m`qdkBAe8J$kmKLp6>o;^}##Cb4wr%rg&YbC|=bbxu4z6Fn&KYn%b^G>huvjdN zyzcJqA4*C}o^DtXA%v|hWiukba^*@v?|fTZ+fN&=OtW?3#EB`kkyEEmJs? z`0?YvWVFEn05C8xP@~i79fFvXm(BVxnoIvU-OZ#@ss601s~g(Ad-pw(B>zgcUe-T*L?RK@^73+r z-|zp@>-A=}prlkPU&~~&=TfP3yrQCFGMk@0c+C*ky4LTko@l5yPs}U y=jhR+zwg?$YqqMY>dE%)+keAx+{foHm45-pmUCXlaFiAR0000 Date: Wed, 16 Feb 2022 20:00:33 +0100 Subject: [PATCH 42/99] Added screenshots --- apps/info/screenshot_1.png | Bin 0 -> 3552 bytes apps/info/screenshot_2.png | Bin 0 -> 3334 bytes apps/info/screenshot_3.png | Bin 0 -> 3455 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/info/screenshot_1.png create mode 100644 apps/info/screenshot_2.png create mode 100644 apps/info/screenshot_3.png diff --git a/apps/info/screenshot_1.png b/apps/info/screenshot_1.png new file mode 100644 index 0000000000000000000000000000000000000000..97d42a89636e01437a6397075db1dc453ca22fe8 GIT binary patch literal 3552 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 literal 0 HcmV?d00001 diff --git a/apps/info/screenshot_2.png b/apps/info/screenshot_2.png new file mode 100644 index 0000000000000000000000000000000000000000..2d25dd4e6ce4166d5a6b48ad7f50231bf643cc95 GIT binary patch literal 3334 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 literal 0 HcmV?d00001 diff --git a/apps/info/screenshot_3.png b/apps/info/screenshot_3.png new file mode 100644 index 0000000000000000000000000000000000000000..782e4a1952f1dc3205f20852edf88e9493edd6d8 GIT binary patch literal 3455 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 Xk+%_!CsMW>72tTx)$W-M?(+Wt^h|>m literal 0 HcmV?d00001 From 88ea3bd0b11f3f946939647a7647cecca94663f4 Mon Sep 17 00:00:00 2001 From: David Peer Date: Wed, 16 Feb 2022 20:02:20 +0100 Subject: [PATCH 43/99] Added README to metadata --- apps/info/metadata.json | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/info/metadata.json b/apps/info/metadata.json index 9b82acb4e..f05f0e134 100644 --- a/apps/info/metadata.json +++ b/apps/info/metadata.json @@ -6,6 +6,7 @@ "icon": "info.png", "type": "app", "tags": "tool", + "readme": "README.md", "supports": ["BANGLEJS2"], "screenshots": [ {"url":"screenshot_1.png"}, From 50f973b3d3779ef883aab748bbbf3fca39ca2184 Mon Sep 17 00:00:00 2001 From: David Peer Date: Wed, 16 Feb 2022 20:44:35 +0100 Subject: [PATCH 44/99] Pagination bugfix. --- apps/info/info.app.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/apps/info/info.app.js b/apps/info/info.app.js index b241907f3..bce9d4cff 100644 --- a/apps/info/info.app.js +++ b/apps/info/info.app.js @@ -3,6 +3,7 @@ const locale = require('locale'); var ENV = process.env; var W = g.getWidth(), H = g.getHeight(); var screen = 0; +const maxScreen = 2; function getVersion(file) { var j = s.readJSON(file,1); @@ -87,11 +88,12 @@ Bangle.on('touch', function(btn, e){ var isRight = e.x > right; if(isRight){ - screen = (screen + 1) % 3; + screen = (screen + 1) % (maxScreen+1); } if(isLeft){ - screen = Math.max(0, (screen - 1)); + screen -= 1; + screen = screen < 0 ? maxScreen : screen; } drawInfo(); From 9dd3e9b06925b848d89eadd9ec46d7ada4085a0a Mon Sep 17 00:00:00 2001 From: hughbarney Date: Wed, 16 Feb 2022 20:02:56 +0000 Subject: [PATCH 45/99] Pastel: make new boolean setting work --- apps/pastel/ChangeLog | 1 + apps/pastel/metadata.json | 2 +- apps/pastel/pastel.settings.js | 32 +++++++++++--------------------- 3 files changed, 13 insertions(+), 22 deletions(-) diff --git a/apps/pastel/ChangeLog b/apps/pastel/ChangeLog index d133697b3..a77fa758f 100644 --- a/apps/pastel/ChangeLog +++ b/apps/pastel/ChangeLog @@ -16,3 +16,4 @@ 0.14: incorporated lazybones idle timer, configuration settings to come 0.15: fixed tendancy for mylocation to default to London added setting to enable/disable idle timer warning +0.16: make check_idle boolean setting work properly with new B2 menu diff --git a/apps/pastel/metadata.json b/apps/pastel/metadata.json index da3c18eae..f04a7ae54 100644 --- a/apps/pastel/metadata.json +++ b/apps/pastel/metadata.json @@ -2,7 +2,7 @@ "id": "pastel", "name": "Pastel Clock", "shortName": "Pastel", - "version": "0.15", + "version": "0.16", "description": "A Configurable clock with custom fonts, background and weather display. Has a cyclic information line that includes, day, date, battery, sunrise and sunset times", "icon": "pastel.png", "dependencies": {"mylocation":"app","weather":"app"}, diff --git a/apps/pastel/pastel.settings.js b/apps/pastel/pastel.settings.js index 26dafd271..afe461f15 100644 --- a/apps/pastel/pastel.settings.js +++ b/apps/pastel/pastel.settings.js @@ -38,38 +38,28 @@ }, }, 'Show Grid': { - value: s.grid, - format: () => (s.grid ? 'Yes' : 'No'), - onchange: () => { - s.grid = !s.grid; + value: !!s.grid, + format: v => v ? /*LANG*/"Yes":/*LANG*/"No", + onchange: v => { + s.grid = v; save(); }, }, 'Show Weather': { - value: s.weather, - format: () => (s.weather ? 'Yes' : 'No'), - onchange: () => { - s.weather = !s.weather; + value: !!s.weather, + format: v => v ? /*LANG*/"Yes":/*LANG*/"No", + onchange: v => { + s.weather = v; save(); }, }, - // for use when the new menu system goes live - /* 'Idle Warning': { - value: s.idle_check, - onchange : v => { + value: !!s.idle_check, + format: v => v ? /*LANG*/"Yes":/*LANG*/"No", + onchange: v => { s.idle_check = v; save(); }, - }, - */ - 'Idle Warning': { - value: s.idle_check, - format: () => (s.idle_check ? 'Yes' : 'No'), - onchange: () => { - s.idle_check = !s.idle_check; - save(); - }, } }) }) From ece775bb8ea0e38d38123116fa49865923b6cc1f Mon Sep 17 00:00:00 2001 From: David Peer Date: Wed, 16 Feb 2022 21:31:46 +0100 Subject: [PATCH 46/99] Minor change --- apps/info/info.app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/info/info.app.js b/apps/info/info.app.js index bce9d4cff..c61a88045 100644 --- a/apps/info/info.app.js +++ b/apps/info/info.app.js @@ -27,7 +27,7 @@ function getSteps(){ function getBpm(){ try{ - return Math.round(Bangle.getHealthStatus("day").bpm) + " bpm"; + return Math.round(Bangle.getHealthStatus("day").bpm) + "bpm"; } catch(e) { return ">= 2v12"; } From 864faef9617c2e551093abff341aa8f3d2a62d57 Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Wed, 16 Feb 2022 21:59:28 +0100 Subject: [PATCH 47/99] widbars - Yellow battery bar on charge and prevent GC on every draw --- apps/widbars/ChangeLog | 2 ++ apps/widbars/metadata.json | 2 +- apps/widbars/widget.js | 10 ++++++++-- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/apps/widbars/ChangeLog b/apps/widbars/ChangeLog index 4c21f3ace..61e28e6e4 100644 --- a/apps/widbars/ChangeLog +++ b/apps/widbars/ChangeLog @@ -1 +1,3 @@ 0.01: New Widget! +0.02: Battery bar turns yellow on charge + Memory status bar does not trigger garbage collect diff --git a/apps/widbars/metadata.json b/apps/widbars/metadata.json index e8d52c90a..a9981305c 100644 --- a/apps/widbars/metadata.json +++ b/apps/widbars/metadata.json @@ -1,7 +1,7 @@ { "id": "widbars", "name": "Bars Widget", - "version": "0.01", + "version": "0.02", "description": "Display several measurements as vertical bars.", "icon": "icon.png", "screenshots": [{"url":"screenshot.png"}], diff --git a/apps/widbars/widget.js b/apps/widbars/widget.js index a1134f31f..cceeb0897 100644 --- a/apps/widbars/widget.js +++ b/apps/widbars/widget.js @@ -42,19 +42,25 @@ if (top) g .clearRect(x,y, x+w-1,y+top-1); // erase above bar if (f) g.setColor(col).fillRect(x,y+top, x+w-1,y+h-1); // even for f=0.001 this is still 1 pixel high } + let batColor='#0f0'; function draw() { g.reset(); const x = this.x, y = this.y, - m = process.memory(); + m = process.memory(false); let b=0; // ==HRM== bar(x+(w*b++),y,'#f00'/*red */,bpm/200); // >200 seems very unhealthy; if we have no valid bpm this will just be empty space // ==Temperature== bar(x+(w*b++),y,'#ff0'/*yellow */,E.getTemperature()/50); // you really don't want to wear a watch that's hotter than 50°C bar(x+(w*b++),y,g.theme.dark?'#0ff':'#00f'/*cyan/blue*/,1-(require('Storage').getFree() / process.env.STORAGE)); bar(x+(w*b++),y,'#f0f'/*magenta*/,m.usage/m.total); - bar(x+(w*b++),y,'#0f0'/*green */,E.getBattery()/100); + bar(x+(w*b++),y,batColor,E.getBattery()/100); } let redraw; + Bangle.on('charging', function(charging) { + batColor=charging?'#ff0':'#0f0'; + WIDGETS["bars"].draw(); + }); + Bangle.on('lcdPower', on => { if (redraw) clearInterval(redraw) redraw = undefined; From 63156bcca81875e7b61f6f64a69492e513f9e246 Mon Sep 17 00:00:00 2001 From: Danny <31635744+DDDanny@users.noreply.github.com> Date: Thu, 17 Feb 2022 02:42:21 +0100 Subject: [PATCH 48/99] v 0.04 fixes #1154 --- apps/timecal/ChangeLog | 9 + apps/timecal/README.md | 22 + apps/timecal/metadata.json | 11 +- apps/timecal/testing/timecal.app.test.js | 798 +++++++++++++++++++++++ apps/timecal/timecal.app.js | 352 +++++++--- apps/timecal/timecal.settings.js | 109 ++++ 6 files changed, 1211 insertions(+), 90 deletions(-) create mode 100644 apps/timecal/ChangeLog create mode 100644 apps/timecal/README.md create mode 100644 apps/timecal/testing/timecal.app.test.js create mode 100644 apps/timecal/timecal.settings.js diff --git a/apps/timecal/ChangeLog b/apps/timecal/ChangeLog new file mode 100644 index 000000000..43bff461d --- /dev/null +++ b/apps/timecal/ChangeLog @@ -0,0 +1,9 @@ +0.01: Initial creation of the clock face time and calendar +0.02: Feature Request #1154 and some findings... + -> get rendered time from optimisations + -> *BATT SAFE* only update once a minute instead of once a second + -> *RAM optimized* clean code, corrected minute update (timout, no intervall) + -> locale: weekday name (first two characters) from locale + -> added settings to render cal view begin day (-1: today, 0:sunday, 1:monday [default]) +0.03: a lot of more settings for outline, colors and highlights +0.04: finalized README, fixed settings cancel, fixed border-setting \ No newline at end of file diff --git a/apps/timecal/README.md b/apps/timecal/README.md new file mode 100644 index 000000000..d26f9ba4d --- /dev/null +++ b/apps/timecal/README.md @@ -0,0 +1,22 @@ +# Calendar Clock + +## Features +Shows the +* Date +* Time (hh:mm) - respecting 12/24 (uses locale string) +* 3 weeks calendar view (last,current and next week) + +### The settings menu +Calendar View can be customized +* < Save: Exist and save the current settings +* Show date: Choose if and how the date is displayed: none, locale (default), monthfull or monthshort.yearshort #weeknum with 0 prefixed +* Start wday: Set day of week start. Values: 0=Sunday, 1=Monday,...,6=Saturday or -1=Relative to today (default 0: Sunday) +* Su color: Set Sundays color. Values: none (default), red, green or blue +* Border: show or none (default) +* Submenu Today settings - choose how today is highlighted + * < Back: + * Color: none, red (default), green or blue + * Marker: Outline today graphically. Values: none (default), circle, rect(angle) + * Mrk.Color: Circle/rectangle color: red (default), green or blue + * Mrk.Size: Circle/rectangle thickness in pixel: min:1, max: 10, default:3 +* < Cancel: Exit and no change. Nevertheless missing default settings and superflous settings will be removed and saved. diff --git a/apps/timecal/metadata.json b/apps/timecal/metadata.json index 3237dd08a..4dd8a8ca0 100644 --- a/apps/timecal/metadata.json +++ b/apps/timecal/metadata.json @@ -1,13 +1,16 @@ { "id": "timecal", "name": "TimeCal", "shortName":"TimeCal", + "version":"0.04", + "description": "TimeCal shows the date/time along with a 3 week calendar", "icon": "icon.png", - "version":"0.01", - "description": "TimeCal shows the Time along with a 3 week calendar", - "tags": "clock", "type": "clock", + "tags": "clock,calendar", "supports":["BANGLEJS2"], + "readme": "README.md", + "allow_emulator":true, "storage": [ - {"name":"timecal.app.js","url":"timecal.app.js"} + {"name":"timecal.app.js","url":"timecal.app.js"}, + {"name":"timecal.settings.js","url":"timecal.settings.js"} ] } diff --git a/apps/timecal/testing/timecal.app.test.js b/apps/timecal/testing/timecal.app.test.js new file mode 100644 index 000000000..e41f3d848 --- /dev/null +++ b/apps/timecal/testing/timecal.app.test.js @@ -0,0 +1,798 @@ +//Clock renders date, time and pre,current,next week calender view +class TimeCalClock{ + DATE_FONT_SIZE(){ return 20; } + TIME_FONT_SIZE(){ return 40; } + + /** + * @param{Date} date optional the date (e.g. for testing) + * @param{Settings} settings optional settings to use e.g. for testing + */ + constructor(date, settings){ + if (date) + this.date=date; + + if (settings) + this._settings = settings; + else + this._settings = require("Storage").readJSON("timecal.settings.json", 1) || {}; + + const defaults = { + shwDate:1, //0:none, 1:locale, 2:month, 3:monthshort.year #week + + wdStrt:0, //identical to getDay() 0->Su, 1->Mo, ... //Issue #1154: weekstart So/Mo, -1 for use today + + tdyNumClr:3, //0:fg, 1:red=#E00, 2:green=#0E0, 3:blue=#00E + tdyMrkr:0, //0:none, 1:circle, 2:rectangle, 3:filled + tdyMrkClr:2, //1:red=#E00, 2:green=#0E0, 3:blue=#00E + tdyMrkPxl:3, //px + + suClr:1, //0:fg, 1:red=#E00, 2:green=#0E0, 3:blue=#00E + //phColor:"#E00", //public holiday + + calBrdr:false + }; + for (const k in this._settings) if (!defaults.hasOwnProperty(k)) delete this._settings[k]; //remove invalid settings + for (const k in defaults) if(!this._settings.hasOwnProperty(k)) this._settings[k] = defaults[k]; //assign missing defaults + + g.clear(); + Bangle.setUI("clock"); + Bangle.loadWidgets(); + Bangle.drawWidgets(); + + this.centerX = Bangle.appRect.w/2; + this.nrgb = [g.theme.fg, "#E00", "#0E0", "#00E"]; //fg, r ,g , b + + this.ABR_DAY=[]; + if (require("locale") && require("locale").dow) + for (let d=0; d<=6; d++) { + var refDay=new Date(); + refDay.setFullYear(1972); + refDay.setMonth(0); + refDay.setDate(2+d); + this.ABR_DAY.push(require("locale").dow(refDay)); + + } + else + this.ABR_DAY=["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]; + } + + /** + * @returns {Object} current settings object + */ + settings(){ + return this._settings; + } + + + /* + * Run forest run + **/ + draw(){ + this.drawTime(); + + if (this.TZOffset===undefined || this.TZOffset!==d.getTimezoneOffset()) + this.drawDateAndCal(); + } + + /** + * draw given or current time from date + * overwatch timezone changes + * schedules itself to update + */ + drawTime(){ + d=this.date ? this.date : new Date(); + const Y=Bangle.appRect.y+this.DATE_FONT_SIZE()+10; + + d=d?d :new Date(); + + g.setFontAlign(0, -1).setFont("Vector", this.TIME_FONT_SIZE()).setColor(g.theme.fg) + .clearRect(Bangle.appRect.x, Y, Bangle.appRect.x2, Y+this.TIME_FONT_SIZE()-7) + .drawString(("0" + require("locale").time(d, 1)).slice(-5), this.centerX, Y, true); + //.drawRect(Bangle.appRect.x, Y, Bangle.appRect.x2, Y+this.TIME_FONT_SIZE()-7); //DEV-Option + + setTimeout(this.draw.bind(this), 60000-(d.getSeconds()*1000)-d.getMilliseconds()); + } + + /** + * draws given date and cal + * @param{Date} d provide date or uses today + */ + drawDateAndCal(){ + d=this.date ? this.date : new Date(); + + this.TZOffset=d.getTimezoneOffset(); + this.drawDate(); + this.drawCal(); + + if (this.tOutD) //abort exisiting + clearTimeout(this.tOutD); + this.tOutD=setTimeout(this.drawDateAndCal.bind(this), 86400000-(d.getHours()*24*60*1000)-(d.getMinutes()*60*1000)-d.getSeconds()-d.getMilliseconds()); + } + + /** + * draws given date as defiend in settings + */ + drawDate(){ + d=this.date ? this.date : new Date(); + + const FONT_SIZE=20; + const Y=Bangle.appRect.y; + var render=false; + var dateStr = ""; + if (this.settings().shwDate>0) { //skip if exactly -none + const dateSttngs = ["","l","M","m.Y #W"]; + for (let c of dateSttngs[this.settings().shwDate]) { //add part as configured + switch (c){ + case "l":{ //locale + render=true; + dateStr+=require("locale").date(d,1); + break; + } + case "m":{ //month e.g. Jan. + render=true; + dateStr+=require("locale").month(d,1); + break; + } + case "M":{ //month e.g. January + render=true; + dateStr+=require("locale").month(d,0); + break; + } + case "y":{ //year e.g. 22 + render=true; + dateStr+=d.getFullYear().slice(-2); + break; + } + case "Y":{ //year e.g. 2022 + render=true; + dateStr+=d.getFullYear(); + break; + } + case "w":{ //week e.g. #2 + dateStr+=(this.ISO8601calWeek(d)); + break; + } + case "W":{ //week e.g. #02 + dateStr+=("0"+this.ISO8601calWeek(d)).slice(-2); + break; + } + default: //append c + dateStr+=c; + render=dateStr.length>0; + break; //noop + } + } + } + if (render){ + g.setFont("Vector", FONT_SIZE).setColor(g.theme.fg).setFontAlign(0, -1).clearRect(Bangle.appRect.x, Y, Bangle.appRect.x2, Y+FONT_SIZE-3).drawString(dateStr,this.centerX,Y); + } + //g.drawRect(Bangle.appRect.x, Y, Bangle.appRect.x2, Y+FONT_SIZE-3); //DEV-Option + } + + /** + * draws calender week view (-1,0,1) for given date + */ + drawCal(){ + d=this.date ? this.date : new Date(); + + const DAY_NAME_FONT_SIZE=10; + const CAL_Y=Bangle.appRect.y+this.DATE_FONT_SIZE()+10+this.TIME_FONT_SIZE()+3; + const CAL_AREA_H=Bangle.appRect.h-CAL_Y+24; //+24: top widegtes only + const CELL_W=Bangle.appRect.w/7; //cell width + const CELL_H=(CAL_AREA_H-DAY_NAME_FONT_SIZE)/3; //cell heigth + const DAY_NUM_FONT_SIZE=Math.min(CELL_H-1,15); //size down, max 15 + + g.setFont("Vector", DAY_NAME_FONT_SIZE).setColor(g.theme.fg).setFontAlign(-1, -1).clearRect(Bangle.appRect.x, CAL_Y, Bangle.appRect.x2, CAL_Y+CAL_AREA_H); + + //draw grid & Headline + const dNames = this.ABR_DAY.map((a) => a.length<=2 ? a : a.substr(0, 2)); //force shrt 2 + for(var dNo=0; dNo=0 ? (dNo+this.settings().wdStrt)%7 : (dNo+d.getDay()+4)%7; + const dName=dNames[dIdx]; + if(dNo>0) + g.drawLine(dNo*CELL_W, CAL_Y, dNo*CELL_W, CAL_Y+CAL_AREA_H-1); + + if (dIdx==0) g.setColor(this.nrgb[this.settings().suClr]); //sunday maybe colorize txt + g.drawString(dName, dNo*CELL_W+(CELL_W-g.stringWidth(dName))/2+2, CAL_Y+1).setColor(g.theme.fg); + } + + var nextY=CAL_Y+DAY_NAME_FONT_SIZE; + + for(i=0; i<3; i++){ + const y=nextY+i*CELL_H; + g.drawLine(Bangle.appRect.x, y, Bangle.appRect.x2, y); + } + + g.setFont("Vector", DAY_NUM_FONT_SIZE); + + //write days + const tdyDate=d.getDate(); + const days=this.settings().wdStrt>=0 ? 7+((7+d.getDay()-this.settings().wdStrt)%7) : 10;//start day (week before=7 days + days in this week realtive to week start) or fixed 7+3 days + var rD=new Date(d.getTime()); + rD.setDate(rD.getDate()-days); + var rDate=rD.getDate(); + for(var y=0; y<3; y++){ + for(var x=0; x", + cases: [ + { + value: "required,", + beforeTxt: "optional,", + beforeExpression: "optional,", + afterText: "optional,", + afterExpression: "optional," + } + ], + constructorParams: ["optional: ","|TEST_SETTINGS|","..."], //TEST_SETTINGS will be replcaed with each current {setting: case} + functionNames: ["required, ", "..."], + functionParams: ["optional: ","|TEST_SETTINGS|","..."] + }; + } + + constructor(data){ + + this._validate(data); + + this.setting = data.setting; + this.cases = data.cases.map((entry) => { + return { + value: entry.value, + beforeTxt: entry.beforeTxt||"", + beforeExpression: entry.beforeExpression||true, + afterTxt: entry.afterTxt||"", + afterExpression: entry.afterExpression||true + }; + }); + this.constructorParams = data.constructorParams; + this.functionNames = data.functionNames; + this.functionParams = data.functionParams; + } + + /** + * validates the given data config + */ + _validate(data){ + //validate given config + if (!data.setting) throw new EmptyMandatoryError("setting", data, this.TEST_SETTING_SAMPLE()); + if (!(data.cases instanceof Array) || data.cases.length==0) throw new EmptyMandatoryError("cases", data, this.TEST_SETTING_SAMPLE()); + if (!(data.functionNames instanceof Array) || data.functionNames==0) throw new EmptyMandatoryError("functionNames", data, this.TEST_SETTING_SAMPLE()); + + data.cases.forEach((entry,idx) => { + if (entry.value === undefined) throw new EmptyMandatoryError("cases["+idx+"].value", entry, this.TEST_SETTING_SAMPLE()); + }); + } +} + +/*************************************************************************/ + +/** + * Testing a Bangle object + */ +class BangleTestRunner{ + /** + * create for ObjClass + * @param {Class} objClass + * @param {LogSeverity} minSeverity to Log + */ + constructor(objClass, minSeverity){ + this.TESTCASE_MSG_BEFORE_TIMEOUT = 1000; //5s + this.TESTCASE_RUN_TIMEOUT = 1000; //5s + this.TESTCASE_MSG_AFTER_TIMEOUT = 1000; //5s + + this.oClass = objClass; + this.minSvrty = minSeverity; + this.tests = []; + + this.currentCaseNum = this.currentTestNum = this.currentTest = this.currentCase = undefined; + } + + /** + * add a Setting Test, return instance for chaining + * @param {TestSetting} + */ + addTestSettings(sttngs) { + this.tests.push(new TestSetting(sttngs)); + return this; + } + + /** + * Test execution of all tests + */ + execute() { + this._init(); + while (this._nextTest()) { + this._beforeTest(); + while (this._nextCase()) { + this._beforeCase(); + this._runCase(); + this._afterCase(); + } + this._afterTest(); + this._firstCase(); + } + this._exit(); + } + + /** + * global prepare - before all test + */ + _init() { + console.log(this._nowTime(), ">>init"); + this.currentTestNum=-1; + this.currentCaseNum=-1; + } + + /** + * before each test + */ + _beforeTest() { + console.log(this._nowTime(), ">>test #" + this.currentTestNum); + } + + /** + * befor each testcase + */ + _beforeCase() { + console.log(this.currentTest); + console.log(this._nowTime(), ">>case #" + this.currentTestNum + "." + this.currentCaseNum + "/" + (this.currentTest.cases.length-1)); + if (this.currentTest instanceof TestSetting) + console.log(this.currentTest.setting+"="+this.currentCase.value+"/n"+(this.currentCase.beforeTxt ? "#"+this.currentCase.beforeTxt : "")); + } + + /** + * testcase runner + */ + _runCase() { + console.log(this._nowTime(), ">>running..."); + var returns = []; + this.currentTest.functionNames.forEach((fName) => { + var settings={}; settings[this.currentTest.setting] = this.currentCase.value; + var cParams = this.currentTest.constructorParams||[]; + cParams = cParams.map((v) => (v && v instanceof String && v==="|TEST_SETTINGS|") ? settings : v);//replace settings in call params + var fParams = this.currentTest.functionParams||[]; + fParams = fParams.map((v) => (v && v instanceof String && v==="|TEST_SETTINGS|") ? settings : v);//replace settings in call params + + var creatorFunc = new Function("console.log('Constructor params:', arguments); return new " + this.oClass + "(arguments[0],arguments[1],arguments[2],arguments[3],arguments[4],arguments[5],arguments[6],arguments[7],arguments[8],arguments[9])"); //prepare spwan arguments[0],arguments[1] + let instance = creatorFunc.call(this.oClass, cParams[0], cParams[1], cParams[2], cParams[3], cParams[4], cParams[5], cParams[6], cParams[7], cParams[8], cParams[9]); //spwan + + console.log(">>"+this.oClass+"["+fName+"]()"); + + console.log('Instance:', instance); + console.log('Function params:', fParams); + returns.push(instance[fName](fParams[0], fParams[1], fParams[2], fParams[3], fParams[4], fParams[5], fParams[6], fParams[7], fParams[8], fParams[9])); //run method and store result + g.dump(); + console.log("<<"+this.oClass+"["+fName+"]()"); + }); + console.log(this._nowTime(), "<<...running"); + } + + /** + * after each testcase + */ + _afterCase() { + if (this.currentTest instanceof TestSetting) + if (this.currentCase.afterTxt.length>0) + console.log("++EXPECTED:" + this.currentCase.afterTxt + "EXPECTED++"); + console.log(this._nowTime(), "< setTimeout(resolve, sec)); + } + + _waits(sec) { + this._delay(1).then(); + } + + _log() { + + } + + _nextTest() { + if (this.currentTestNum>=-1 && (this.currentTestNum+1)=-1 && (this.currentCaseNum+1)Su, 1->Mo, ... //Issue #1154: weekstart So/Mo, -1 for use today + + tdyNumClr:3, //0:fg, 1:red=#E00, 2:green=#0E0, 3:blue=#00E + tdyMrkr:0, //0:none, 1:circle, 2:rectangle, 3:filled + tdyMrkClr:2, //1:red=#E00, 2:green=#0E0, 3:blue=#00E + tdyMrkPxl:3, //px + + suClr:1, //0:fg, 1:red=#E00, 2:green=#0E0, 3:blue=#00E + //phColor:"#E00", //public holiday + + calBrdr:false + }; + for (const k in this._settings) if (!defaults.hasOwnProperty(k)) delete this._settings[k]; //remove invalid settings + for (const k in defaults) if(!this._settings.hasOwnProperty(k)) this._settings[k] = defaults[k]; //assign missing defaults + + g.clear(); + Bangle.setUI("clock"); + Bangle.loadWidgets(); + Bangle.drawWidgets(); + + this.centerX = Bangle.appRect.w/2; + this.nrgb = [g.theme.fg, "#E00", "#0E0", "#00E"]; //fg, r ,g , b + + this.ABR_DAY=[]; + if (require("locale") && require("locale").dow) + for (let d=0; d<=6; d++) { + var refDay=new Date(); + refDay.setFullYear(1972); + refDay.setMonth(0); + refDay.setDate(2+d); + this.ABR_DAY.push(require("locale").dow(refDay)); -function drawCal(d){ - var calStart = 101; - var cellSize = g.getWidth() / 7; - var halfSize = cellSize / 2; - g.clearRect(0,calStart,g.getWidth(),g.getHeight()); - g.drawLine(0,calStart,g.getWidth(),calStart); - var days = ["Mo","Tu","We","Th","Fr","Sa","Su"]; - g.setFont("Vector",10); - g.setColor(fontColor); - g.setFontAlign(-1,-1,0); - for(var i = 0; i < days.length;i++){ - g.drawString(days[i],i*cellSize+5,calStart -11); - if(i!=0){ - g.drawLine(i*cellSize,calStart,i*cellSize,g.getHeight()); - } - } - var cellHeight = (g.getHeight() -calStart ) / 3; - for(var i = 0;i < 3;i++){ - var starty = calStart + i * cellHeight; - g.drawLine(0,starty,g.getWidth(),starty); - } - - g.setFont("Vector",15); - - var dayOfWeek = d.getDay(); - var dayRem = d.getDay() - 1; - if(dayRem <0){ - dayRem = 0; - } - - var start = new Date(); - start.setDate(start.getDate()-(7+dayRem)); - g.setFontAlign(0,-1,0); - for (var y = 0;y < 3; y++){ - for(var x = 0;x < 7; x++){ - if(start.getDate() === d.getDate()){ - g.setColor(accentColor); - }else{ - g.setColor(fontColor); } - g.drawString(start.getDate(),x*cellSize +(cellSize / 2) + 2,calStart+(cellHeight*y) + 5); - start.setDate(start.getDate()+1); + else + this.ABR_DAY=["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]; + } + + /** + * @returns {Object} current settings object + */ + settings(){ + return this._settings; + } + + + /* + * Run forest run + **/ + draw(){ + this.drawTime(); + + if (this.TZOffset===undefined || this.TZOffset!==d.getTimezoneOffset()) + this.drawDateAndCal(); } + + /** + * draw given or current time from date + * overwatch timezone changes + * schedules itself to update + */ + drawTime(){ + d=this.date ? this.date : new Date(); + const Y=Bangle.appRect.y+this.DATE_FONT_SIZE()+10; + + d=d?d :new Date(); + + g.setFontAlign(0, -1).setFont("Vector", this.TIME_FONT_SIZE()).setColor(g.theme.fg) + .clearRect(Bangle.appRect.x, Y, Bangle.appRect.x2, Y+this.TIME_FONT_SIZE()-7) + .drawString(("0" + require("locale").time(d, 1)).slice(-5), this.centerX, Y, true); + //.drawRect(Bangle.appRect.x, Y, Bangle.appRect.x2, Y+this.TIME_FONT_SIZE()-7); //DEV-Option + + setTimeout(this.draw.bind(this), 60000-(d.getSeconds()*1000)-d.getMilliseconds()); + } + + /** + * draws given date and cal + * @param{Date} d provide date or uses today + */ + drawDateAndCal(){ + d=this.date ? this.date : new Date(); + + this.TZOffset=d.getTimezoneOffset(); + this.drawDate(); + this.drawCal(); + + if (this.tOutD) //abort exisiting + clearTimeout(this.tOutD); + this.tOutD=setTimeout(this.drawDateAndCal.bind(this), 86400000-(d.getHours()*24*60*1000)-(d.getMinutes()*60*1000)-d.getSeconds()-d.getMilliseconds()); + } + + /** + * draws given date as defiend in settings + */ + drawDate(){ + d=this.date ? this.date : new Date(); + + const FONT_SIZE=20; + const Y=Bangle.appRect.y; + var render=false; + var dateStr = ""; + if (this.settings().shwDate>0) { //skip if exactly -none + const dateSttngs = ["","l","M","m.Y #W"]; + for (let c of dateSttngs[this.settings().shwDate]) { //add part as configured + switch (c){ + case "l":{ //locale + render=true; + dateStr+=require("locale").date(d,1); + break; + } + case "m":{ //month e.g. Jan. + render=true; + dateStr+=require("locale").month(d,1); + break; + } + case "M":{ //month e.g. January + render=true; + dateStr+=require("locale").month(d,0); + break; + } + case "y":{ //year e.g. 22 + render=true; + dateStr+=d.getFullYear().slice(-2); + break; + } + case "Y":{ //year e.g. 2022 + render=true; + dateStr+=d.getFullYear(); + break; + } + case "w":{ //week e.g. #2 + dateStr+=(this.ISO8601calWeek(d)); + break; + } + case "W":{ //week e.g. #02 + dateStr+=("0"+this.ISO8601calWeek(d)).slice(-2); + break; + } + default: //append c + dateStr+=c; + render=dateStr.length>0; + break; //noop + } + } + } + if (render){ + g.setFont("Vector", FONT_SIZE).setColor(g.theme.fg).setFontAlign(0, -1).clearRect(Bangle.appRect.x, Y, Bangle.appRect.x2, Y+FONT_SIZE-3).drawString(dateStr,this.centerX,Y); + } + //g.drawRect(Bangle.appRect.x, Y, Bangle.appRect.x2, Y+FONT_SIZE-3); //DEV-Option + } + + /** + * draws calender week view (-1,0,1) for given date + */ + drawCal(){ + d=this.date ? this.date : new Date(); + + const DAY_NAME_FONT_SIZE=10; + const CAL_Y=Bangle.appRect.y+this.DATE_FONT_SIZE()+10+this.TIME_FONT_SIZE()+3; + const CAL_AREA_H=Bangle.appRect.h-CAL_Y+24; //+24: top widegtes only + const CELL_W=Bangle.appRect.w/7; //cell width + const CELL_H=(CAL_AREA_H-DAY_NAME_FONT_SIZE)/3; //cell heigth + const DAY_NUM_FONT_SIZE=Math.min(CELL_H-1,15); //size down, max 15 + + g.setFont("Vector", DAY_NAME_FONT_SIZE).setColor(g.theme.fg).setFontAlign(-1, -1).clearRect(Bangle.appRect.x, CAL_Y, Bangle.appRect.x2, CAL_Y+CAL_AREA_H); + + //draw grid & Headline + const dNames = this.ABR_DAY.map((a) => a.length<=2 ? a : a.substr(0, 2)); //force shrt 2 + for(var dNo=0; dNo=0 ? (dNo+this.settings().wdStrt)%7 : (dNo+d.getDay()+4)%7; + const dName=dNames[dIdx]; + if(dNo>0) + g.drawLine(dNo*CELL_W, CAL_Y, dNo*CELL_W, CAL_Y+CAL_AREA_H-1); + + if (dIdx==0) g.setColor(this.nrgb[this.settings().suClr]); //sunday maybe colorize txt + g.drawString(dName, dNo*CELL_W+(CELL_W-g.stringWidth(dName))/2+2, CAL_Y+1).setColor(g.theme.fg); + } + + var nextY=CAL_Y+DAY_NAME_FONT_SIZE; + + for(i=0; i<3; i++){ + const y=nextY+i*CELL_H; + g.drawLine(Bangle.appRect.x, y, Bangle.appRect.x2, y); + } + + g.setFont("Vector", DAY_NUM_FONT_SIZE); + + //write days + const tdyDate=d.getDate(); + const days=this.settings().wdStrt>=0 ? 7+((7+d.getDay()-this.settings().wdStrt)%7) : 10;//start day (week before=7 days + days in this week realtive to week start) or fixed 7+3 days + var rD=new Date(d.getTime()); + rD.setDate(rD.getDate()-days); + var rDate=rD.getDate(); + for(var y=0; y<3; y++){ + for(var x=0; xSu, 1->Mo, ... //Issue #1154: weekstart So/Mo, -1 for use today + + tdyNumClr:3, //0:fg, 1:red=#E00, 2:green=#0E0, 3:blue=#00E + tdyMrkr:0, //0:none, 1:circle, 2:rectangle, 3:filled + tdyMrkClr:2, //1:red=#E00, 2:green=#0E0, 3:blue=#00E + tdyMrkPxl:3, //px + + suClr:1, //0:fg, 1:red=#E00, 2:green=#0E0, 3:blue=#00E + //phColor:"#E00", //public holiday + + calBrdr:false + }; + validSttngs = require("Storage").readJSON("timecal.validSttngs.json", 1) || {}; + for (const k in validSttngs) if (!DEFAULTS.hasOwnProperty(k)) delete this.validSttngs[k]; //remove invalid settings + for (const k in DEFAULTS) if(!validSttngs.hasOwnProperty(k)) validSttngs[k] = validSttngs[k]; //assign missing defaults + + var changedSttngs = Object.assign({}, validSttngs); + + var saveExitSettings = () => { + require('Storage').writeJSON(FILE, changedSttngs); + exit(); + }; + + var cancelExitSettings = () => { + require('Storage').writeJSON(FILE, validSttngs); + exit(); + }; + + var showMainMenu = () => { + E.showMenu({ + "": { + "title": "TimeCal "+ /*LANG*/"settings" + }, + /*LANG*/"< Save": () => saveExitSettings(), + /*LANG*/"Show date": { + value: validSttngs.shwDate, + min: 0, max: 3, + format: v => [/*LANG*/"none", /*LANG*/"locale", /*LANG*/"M", /*LANG*/"m.Y #W"][v], + onchange: v => validSttngs.shwDate = v + }, + /*LANG*/"Start wday": { + value: validSttngs.wdStrt, + min: -1, max: 6, + format: v => v>=0 ? ABR_DAY[v] : /*LANG*/"today", + onchange: v => validSttngs.wdStrt = v + }, + /*LANG*/"Su color": { + value: validSttngs.suClr, + min: 0, max: 3, + format: v => [/*LANG*/"none", /*LANG*/"red", /*LANG*/"green", /*LANG*/"blue"][v], + onchange: v => validSttngs.suClr = v + }, + /*LANG*/"Border": { + value: validSttngs.calBrdr, + format: v => v ? /*LANG*/"show" : /*LANG*/"none", + onchange: v => validSttngs.calBrdr = v + }, + /*LANG*/"Today settings": () => { + showTodayMenu(); + }, + /*LANG*/"< Cancel": () => cancelExitSettings() + }); + }; + + var showTodayMenu = () => { + E.showMenu({ + "": { + "title": /*LANG*/"Today settings" + }, + "< Back": () => showMainMenu(), + /*LANG*/"Color": { + value: validSttngs.tdyNumClr, + min: 0, max: 3, + format: v => [/*LANG*/"none", /*LANG*/"red", /*LANG*/"green", /*LANG*/"blue"][v], + onchange: v => validSttngs.tdyNumClr = v + }, + /*LANG*/"Marker": { + value: validSttngs.tdyMrkr, + min: 0, max: 3, + format: v => [/*LANG*/"none", /*LANG*/"circle", /*LANG*/"rectangle", /*LANG*/"filled"][v], + onchange: v => validSttngs.tdyMrkr = v + }, + /*LANG*/"Mrk.Color": { + value: validSttngs.tdyMrkClr, + min: 0, max: 2, + format: v => [/*LANG*/"red", /*LANG*/"green", /*LANG*/"blue"][v], + onchange: v => validSttngs.tdyMrkClr = v + }, + /*LANG*/"Mrk.Size": { + value: validSttngs.tdyMrkPxl, + min: 1, max: 10, + format: v => v+"px", + onchange: v => validSttngs.tdyMrkPxl = v + }, + /*LANG*/"< Cancel": () => cancelExitSettings() + }); + }; + + showMainMenu(); +}); From a4c5509c9a45922218f41a6051962eabc4ec6471 Mon Sep 17 00:00:00 2001 From: pkkpp <52079346+pkkpp@users.noreply.github.com> Date: Thu, 17 Feb 2022 13:57:37 +0100 Subject: [PATCH 49/99] Update metadata.json --- apps/7x7dotsclock/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/7x7dotsclock/metadata.json b/apps/7x7dotsclock/metadata.json index 6d973182b..2d2d7e5ac 100644 --- a/apps/7x7dotsclock/metadata.json +++ b/apps/7x7dotsclock/metadata.json @@ -12,5 +12,5 @@ {"name":"7x7dotsclock.app.js","url":"7x7dotsclock.app.js"}, {"name":"7x7dotsclock.img","url":"7x7dotsclock.img.js","evaluate":true} ], - "data": [{"name":"7x7dotsclock.json"}], + "data": [{"name":"7x7dotsclock.json"}] } From 8ddbc90c33b3e9565bf37b21df7e54cbc8bdc99a Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 17 Feb 2022 13:39:35 +0000 Subject: [PATCH 50/99] > specificlly check for Jekyll markup > Add ability to scan the server for metadata.json files if no apps.json is present > Tidying up search box/chip handling to avoid global vars - just work out what to filter from window location each time > Under device info, show installed apps > Allow left-click and copy link for links > Merge pull request #18 from myxor/chips_quickfix --- core | 2 +- loader.js | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/core b/core index bf29f5697..a7a80a13f 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit bf29f5697445686255a785476e6b1ed6a13ff697 +Subproject commit a7a80a13fa187a4ff5f89669992babca2d95812c diff --git a/loader.js b/loader.js index 6b27736ae..82d6172cb 100644 --- a/loader.js +++ b/loader.js @@ -202,7 +202,6 @@ window.addEventListener('load', (event) => { } var selectLang = document.getElementById("settings-lang"); - console.log(languages); languages.forEach(lang => { selectLang.innerHTML += ``; }); From 6e898cadee905ace3d04475b1f0a720974864f1f Mon Sep 17 00:00:00 2001 From: pkkpp <52079346+pkkpp@users.noreply.github.com> Date: Thu, 17 Feb 2022 15:49:03 +0100 Subject: [PATCH 51/99] Update 7x7dotsclock.settings.js --- apps/7x7dotsclock/7x7dotsclock.settings.js | 99 +++++++++++++--------- 1 file changed, 61 insertions(+), 38 deletions(-) diff --git a/apps/7x7dotsclock/7x7dotsclock.settings.js b/apps/7x7dotsclock/7x7dotsclock.settings.js index 94273e419..cdb06bf66 100644 --- a/apps/7x7dotsclock/7x7dotsclock.settings.js +++ b/apps/7x7dotsclock/7x7dotsclock.settings.js @@ -1,41 +1,64 @@ (function(back) { - function updateSettings() { - storage.write('numerals.json', numeralsSettings); - } - function resetSettings() { - numeralsSettings = { - color:0, - drawMode:"fill", - showDate:0 - }; - updateSettings(); - } - let numeralsSettings = storage.readJSON('numerals.json',1); - if (!numeralsSettings) resetSettings(); - let dm = ["fill","frame","framefill","thickframe","thickfill"]; - let col = process.env.HWVERSION==1?["rnd","r/g","y/w","o/c","b/y"]:["rnd","r/g","g/b","r/c","m/g"]; - let btn = [[24,"BTN1"],[22,"BTN2"],[23,"BTN3"],[11,"BTN4"],[16,"BTN5"]]; - var menu={ - "" : { "title":"Numerals"}, - "Colors": { - value: 0|numeralsSettings.color, - min:0,max:col.length-1, - format: v=>col[v], - onchange: v=> { numeralsSettings.color=v; updateSettings();} + +let settings = Object.assign({ swupApp: "",swdownApp: "", swleftApp: "", swrightApp: ""}, require("Storage").readJSON("7x7dotsclock.json", true) || {}); + + +function showMainMenu() { + const mainMenu = { + "": {"title": "7x7 Dots Clock Settings"}, + "< Back": ()=>load(), + "sw-up": ()=>showSelAppMenu("swupApp"), + "sw-down": ()=>showSelAppMenu("swdownApp"), + "sw-left": ()=>showSelAppMenu("swleftApp"), + "sw-right": ()=>showSelAppMenu("swrightApp") + + }; + + E.showMenu(mainMenu); +} + +function setSetting(key,value) { + print("call " + key + " = " + value); + settings[key] = value; + + print("storing settings 7x7dotsclock.json"); + storage.write('7x7dotsclock.json', settings); +} + +function showSelAppMenu(key) { + var Apps = require("Storage").list(/\.info$/) + .map(app => {var a=storage.readJSON(app, 1);return ( + a&&a.name != "Launcher" + && a&&a.name != "Bootloader" + && a&&a.type != "clock" + && a&&a.type !="widget" + )?a:undefined}) + .filter(app => app) // filter out any undefined apps + .sort((a, b) => a.sortorder - b.sortorder); + const SelAppMenu = { + '': { + 'title': /*LANG*/'Select App', }, - "Draw": { - value: 0|dm.indexOf(numeralsSettings.drawMode), - min:0,max:dm.length-1, - format: v=>dm[v], - onchange: v=> { numeralsSettings.drawMode=dm[v]; updateSettings();} - }, - "Date on touch": { - value: 0|numeralsSettings.showDate, - min:0,max:1, - format: v=>v?"On":"Off", - onchange: v=> { numeralsSettings.showDate=v; updateSettings();} - }, - "< back": back + '< Back': ()=>showMainMenu(), }; - E.showMenu(menu); -}) \ No newline at end of file + Apps.forEach((app, index) => { + var label = app.name; + if ((settings[key] && index === 0) || (settings[key] === app.src)) { + label = "* " + label; + } + SelAppMenu[label] = () => { + if (settings[key] !== app.src) { + setSetting(key,app.src); + showMainMenu(); + } + }; + }); + if (Apps.length === 0) { + SelAppMenu[/*LANG*/"No Apps Found"] = () => { }; + } + return E.showMenu(SelAppMenu); +} + +showMainMenu(); + +}) From dc28942d83d12d0bb759d419eef69ce0528b2145 Mon Sep 17 00:00:00 2001 From: pkkpp <52079346+pkkpp@users.noreply.github.com> Date: Thu, 17 Feb 2022 17:35:38 +0100 Subject: [PATCH 52/99] Update 7x7dotsclock.settings.js --- apps/7x7dotsclock/7x7dotsclock.settings.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/7x7dotsclock/7x7dotsclock.settings.js b/apps/7x7dotsclock/7x7dotsclock.settings.js index cdb06bf66..42473ec17 100644 --- a/apps/7x7dotsclock/7x7dotsclock.settings.js +++ b/apps/7x7dotsclock/7x7dotsclock.settings.js @@ -24,7 +24,8 @@ function setSetting(key,value) { print("storing settings 7x7dotsclock.json"); storage.write('7x7dotsclock.json', settings); } - + + function showSelAppMenu(key) { var Apps = require("Storage").list(/\.info$/) .map(app => {var a=storage.readJSON(app, 1);return ( @@ -43,7 +44,7 @@ function showSelAppMenu(key) { }; Apps.forEach((app, index) => { var label = app.name; - if ((settings[key] && index === 0) || (settings[key] === app.src)) { + if (settings[key] === app.src) { label = "* " + label; } SelAppMenu[label] = () => { From 9ca2078eec21691597e98c3ab0be9a35135da001 Mon Sep 17 00:00:00 2001 From: pkkpp <52079346+pkkpp@users.noreply.github.com> Date: Thu, 17 Feb 2022 17:44:27 +0100 Subject: [PATCH 53/99] Update 7x7dotsclock.app.js --- apps/7x7dotsclock/7x7dotsclock.app.js | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/apps/7x7dotsclock/7x7dotsclock.app.js b/apps/7x7dotsclock/7x7dotsclock.app.js index 4c8a36777..458e5e0f2 100644 --- a/apps/7x7dotsclock/7x7dotsclock.app.js +++ b/apps/7x7dotsclock/7x7dotsclock.app.js @@ -4,6 +4,9 @@ by Peter Kuppelwieser */ + +let settings = Object.assign({ swupApp: "",swdownApp: "", swleftApp: "", swrightApp: ""}, require("Storage").readJSON("7x7dotsclock.json", true) || {}); + // position on screen var Xs = 0, Ys = 30,Xe = 175, Ye=175; //const Xs = 0, Ys = 0,Xe = 175, Ye=175; @@ -217,11 +220,12 @@ function actions(v){ if(v==-1){ print("up swipe event"); - load("qrcode.app.js"); + if(settings.swupApp != "") load(settings.swupApp); + print(settings.swupApp); } else if(v==1) { print("down swipe event"); - load("hrm.app.js"); - print(apps[0].src); + if(settings.swdownApp != "") load(settings.swdownApp); + print(settings.swdownApp); } else { print("touch event"); } @@ -316,11 +320,13 @@ function SetFull(on) { switch (direction) { case 1: print("swipe left event"); - load("gbmusic.app.js"); + if(settings.swleftApp != "") load(settings.swleftApp); + print(settings.swleftApp); break; case -1: load("messages.app.js"); - print("swipe right event"); + if(settings.swrightApp != "") load(settings.swrightApp); + print(settings.swrightApp); break; default: print("swipe undefined event"); From eb64a7a43653b0975e0d7dd5adb6aada3a542ad5 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 17 Feb 2022 16:45:24 +0000 Subject: [PATCH 54/99] Fix build issues created with #1465 --- .eslintignore | 1 + apps/timecal/timecal.settings.js | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.eslintignore b/.eslintignore index e657b6260..7bbe41136 100644 --- a/.eslintignore +++ b/.eslintignore @@ -2,3 +2,4 @@ apps/animclk/V29.LBM.js apps/banglerun/rollup.config.js apps/schoolCalendar/fullcalendar/main.js apps/authentiwatch/qr_packed.js +*.test.js diff --git a/apps/timecal/timecal.settings.js b/apps/timecal/timecal.settings.js index 38c87903b..f3b46384d 100644 --- a/apps/timecal/timecal.settings.js +++ b/apps/timecal/timecal.settings.js @@ -21,7 +21,7 @@ }; validSttngs = require("Storage").readJSON("timecal.validSttngs.json", 1) || {}; for (const k in validSttngs) if (!DEFAULTS.hasOwnProperty(k)) delete this.validSttngs[k]; //remove invalid settings - for (const k in DEFAULTS) if(!validSttngs.hasOwnProperty(k)) validSttngs[k] = validSttngs[k]; //assign missing defaults + for (const k in DEFAULTS) if(!validSttngs.hasOwnProperty(k)) validSttngs[k] = DEFAULTS[k]; //assign missing defaults var changedSttngs = Object.assign({}, validSttngs); From 6d735f57e5dcfbe42d46f1ce00bd94ae9ef050d0 Mon Sep 17 00:00:00 2001 From: pkkpp <52079346+pkkpp@users.noreply.github.com> Date: Thu, 17 Feb 2022 17:49:57 +0100 Subject: [PATCH 55/99] Update README.md --- apps/7x7dotsclock/README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/apps/7x7dotsclock/README.md b/apps/7x7dotsclock/README.md index 37734911f..7f899ff0f 100644 --- a/apps/7x7dotsclock/README.md +++ b/apps/7x7dotsclock/README.md @@ -11,8 +11,7 @@ looks best with dark theme so far ![](dotsfontclock-scr1.png) * when screen is unlocked it shows additional info: bluetooth, battery, new message, date and seconds -* by swiping you can open customizable apps +* you can configure a app per swipe direction +* when swiping the configured apps are launced * button press opens launcher -Contributors: -* pkkpp From aabf9034f1b127a27a5735572faf851d1fa497b6 Mon Sep 17 00:00:00 2001 From: pkkpp <52079346+pkkpp@users.noreply.github.com> Date: Thu, 17 Feb 2022 17:54:09 +0100 Subject: [PATCH 56/99] Update metadata.json --- apps/7x7dotsclock/metadata.json | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/7x7dotsclock/metadata.json b/apps/7x7dotsclock/metadata.json index 2d2d7e5ac..7b2c52512 100644 --- a/apps/7x7dotsclock/metadata.json +++ b/apps/7x7dotsclock/metadata.json @@ -10,6 +10,7 @@ "readme": "README.md", "storage": [ {"name":"7x7dotsclock.app.js","url":"7x7dotsclock.app.js"}, + {"name":"7x7dotsclock.settings.js","url":"7x7dotsclock.settings.js"}, {"name":"7x7dotsclock.img","url":"7x7dotsclock.img.js","evaluate":true} ], "data": [{"name":"7x7dotsclock.json"}] From ca243f26d857e82d1335e16a189c83051cb8172a Mon Sep 17 00:00:00 2001 From: pkkpp <52079346+pkkpp@users.noreply.github.com> Date: Thu, 17 Feb 2022 17:54:37 +0100 Subject: [PATCH 57/99] Delete 7x7dotsclock.info --- apps/7x7dotsclock/7x7dotsclock.info | 7 ------- 1 file changed, 7 deletions(-) delete mode 100644 apps/7x7dotsclock/7x7dotsclock.info diff --git a/apps/7x7dotsclock/7x7dotsclock.info b/apps/7x7dotsclock/7x7dotsclock.info deleted file mode 100644 index 46d719749..000000000 --- a/apps/7x7dotsclock/7x7dotsclock.info +++ /dev/null @@ -1,7 +0,0 @@ -{ - "id":"7x7dotsclock", - "name":"7x7 dots clock", - "type":"clock", - "src":"dotfontclock.app.js", - "icon":"dotfontclock.img" -} From 76bdaba1efc09f10af94a8392998e959224c352a Mon Sep 17 00:00:00 2001 From: pkkpp <52079346+pkkpp@users.noreply.github.com> Date: Thu, 17 Feb 2022 18:01:01 +0100 Subject: [PATCH 58/99] Update 7x7dotsclock.app.js --- apps/7x7dotsclock/7x7dotsclock.app.js | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/7x7dotsclock/7x7dotsclock.app.js b/apps/7x7dotsclock/7x7dotsclock.app.js index 458e5e0f2..7acfb8555 100644 --- a/apps/7x7dotsclock/7x7dotsclock.app.js +++ b/apps/7x7dotsclock/7x7dotsclock.app.js @@ -324,7 +324,6 @@ function SetFull(on) { print(settings.swleftApp); break; case -1: - load("messages.app.js"); if(settings.swrightApp != "") load(settings.swrightApp); print(settings.swrightApp); break; From d110b8fefaf85e64b694bfb364c99d327e2c07b0 Mon Sep 17 00:00:00 2001 From: pkkpp <52079346+pkkpp@users.noreply.github.com> Date: Thu, 17 Feb 2022 18:07:20 +0100 Subject: [PATCH 59/99] Update 7x7dotsclock.app.js --- apps/7x7dotsclock/7x7dotsclock.app.js | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/7x7dotsclock/7x7dotsclock.app.js b/apps/7x7dotsclock/7x7dotsclock.app.js index 7acfb8555..3f2e9b9b1 100644 --- a/apps/7x7dotsclock/7x7dotsclock.app.js +++ b/apps/7x7dotsclock/7x7dotsclock.app.js @@ -324,6 +324,7 @@ function SetFull(on) { print(settings.swleftApp); break; case -1: + print("swipe right event"); if(settings.swrightApp != "") load(settings.swrightApp); print(settings.swrightApp); break; From cda843c9628c5e50606d8c9eec11189a94849865 Mon Sep 17 00:00:00 2001 From: Jeroen Peters Date: Thu, 17 Feb 2022 20:18:28 +0100 Subject: [PATCH 60/99] Work in progres for testing --- apps/antonclk/ChangeLog | 3 ++- apps/antonclk/metadata.json | 2 +- apps/antonclk/settings.js | 10 +++++----- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/apps/antonclk/ChangeLog b/apps/antonclk/ChangeLog index 4dca8053e..ac49dcbd7 100644 --- a/apps/antonclk/ChangeLog +++ b/apps/antonclk/ChangeLog @@ -7,4 +7,5 @@ when weekday name "On": weekday name is cut at 6th position and .# is added 0.06: fixes #1271 - wrong settings name when weekday name and calendar weeknumber are on then display is # - week is buffered until date or timezone changes \ No newline at end of file + week is buffered until date or timezone changes +0.07: align default settings with app.js (otherwise the initial displayed settings will be confusing to users) \ No newline at end of file diff --git a/apps/antonclk/metadata.json b/apps/antonclk/metadata.json index def5d3b48..4d26dd0c7 100644 --- a/apps/antonclk/metadata.json +++ b/apps/antonclk/metadata.json @@ -1,7 +1,7 @@ { "id": "antonclk", "name": "Anton Clock", - "version": "0.06", + "version": "0.07", "description": "A clock using the bold Anton font, optionally showing seconds and date in ISO-8601 format.", "readme":"README.md", "icon": "app.png", diff --git a/apps/antonclk/settings.js b/apps/antonclk/settings.js index e452b02c7..6882cbd0f 100644 --- a/apps/antonclk/settings.js +++ b/apps/antonclk/settings.js @@ -38,7 +38,7 @@ }, "< Back": () => back(), "Seconds...": () => E.showMenu(secmenu), - "Date": stringInSettings("dateOnMain", ["Short", "Long", "ISO8601"]), + "Date": stringInSettings("dateOnMain", ["Long", "Short", "ISO8601"]), "Show Weekday": { value: (settings.weekDay !== undefined ? settings.weekDay : true), format: v => v ? "On" : "Off", @@ -56,7 +56,7 @@ } }, "Uppercase": { - value: (settings.upperCase !== undefined ? settings.upperCase : false), + value: (settings.upperCase !== undefined ? settings.upperCase : true), format: v => v ? "On" : "Off", onchange: v => { settings.upperCase = v; @@ -81,7 +81,7 @@ "< Back": () => E.showMenu(mainmenu), "Show": stringInSettings("secondsMode", ["Never", "Unlocked", "Always"]), "With \":\"": { - value: (settings.secondsWithColon !== undefined ? settings.secondsWithColon : false), + value: (settings.secondsWithColon !== undefined ? settings.secondsWithColon : true), format: v => v ? "On" : "Off", onchange: v => { settings.secondsWithColon = v; @@ -89,14 +89,14 @@ } }, "Color": { - value: (settings.secondsColoured !== undefined ? settings.secondsColoured : false), + value: (settings.secondsColoured !== undefined ? settings.secondsColoured : true), format: v => v ? "On" : "Off", onchange: v => { settings.secondsColoured = v; writeSettings(); } }, - "Date": stringInSettings("dateOnSecs", ["No", "Year", "Weekday"]) + "Date": stringInSettings("dateOnSecs", ["Year", "Weekday", "No"]) }; // Actually display the menu From 9b1e977f0938090eb8e380b4c278c3f4a0c122b9 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Thu, 17 Feb 2022 17:05:47 -0800 Subject: [PATCH 61/99] Create appb2.js --- apps/blackjack/appb2.js | 207 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 207 insertions(+) create mode 100644 apps/blackjack/appb2.js diff --git a/apps/blackjack/appb2.js b/apps/blackjack/appb2.js new file mode 100644 index 000000000..c9907487d --- /dev/null +++ b/apps/blackjack/appb2.js @@ -0,0 +1,207 @@ +var Clubs = require("heatshrink").decompress(atob("j0ewcBkmSpICipEAiQLHwA3BBY8gBQMEEA1AJwQgGyAKChILGBQUCFgxwDJpEAO5AVCII44CAQI1GAAg1GAAZQCWxCDEAAqJBQYQAFRIJWCAApcCR4YADPoRWCgQdBPopfCwAdBTw47BcBAvBU44vDfBDUIRIbUHATuQ")); + +var Spades = require("heatshrink").decompress(atob("j0ewcBkmSpICuoALJIQILHpAKBJQ+QLIUJBYsgMoY1GBQcCBYmAPgkSEBEAgggIKApBDIg4KFHAZiCAAgsDBQw4DFitJFhQ4FTwplBgRoCSQoRBBYJ6EF4jgUwDUHAVOQA==")); + +var Hearts = require("heatshrink").decompress(atob("j0ewY96gMkyAEByVIBQcSpILBhMkBYkEyQLBAQYKCCIQLEEwQgCBYuAEBFJkBBCBYw4CEA44CgQLHIYQsHLJsAEBJEHSQhxENwQADMQoAEKAdAWowLCYJESXggAFGowA/AAQ")); + +var Diamonds = require("heatshrink").decompress(atob("j0ewY1ykgKJhIKJiVIEBOSoAKHpILBBQ+SBYOQBIsBCgILBwAKEgQgCAQIKEggICAQMgKwgUDAQI1GBY4IFLgoLGJpGSPoo4EMoxNIMoqSHiR6HLgizIPoLgfAFA")); + +var deck = []; +var player = {Hand:[]}; +var computer = {Hand:[]}; +var ctx = {ready:true}; + +function createDeck() { + var suits = ["Spades", "Hearts", "Diamonds", "Clubs"]; + var values = ["2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"]; + + var dck = []; + for (var i = 0 ; i < values.length; i++) { + for(var x = 0; x < suits.length; x++) { + dck.push({ Value: values[i], Suit: suits[x] }); + } + } + return dck; +} + +function shuffle(a) { + var j, x, i; + for (i = a.length - 1; i > 0; i--) { + j = Math.floor(Math.random() * (i + 1)); + x = a[i]; + a[i] = a[j]; + a[j] = x; + } + return a; +} + +function EndGameMessdage(msg){ + ctx.ready = false; + g.clearRect(0,160,176,176); + g.setColor(255,255,255); + g.fillRect(0,160,176,176); + g.setColor(0,0,0); + g.drawString(msg, 12, 155); + setTimeout(function(){ + startGame(); + }, 2500); + +} + +function hitMe() { + if (!ctx.ready) return; + player.Hand.push(deck.pop()); + renderOnScreen(1); + var playerWeight = calcWeight(player.Hand, 0); + + if(playerWeight == 21) + EndGameMessdage('WINNER'); + else if(playerWeight > 21) + EndGameMessdage('LOSER'); +} + +function calcWeight(hand, hideCard) { + if(hideCard === 1) { + if (hand[0].Value == "J" || hand[0].Value == "Q" || hand[0].Value == "K") + return "10 +"; + else if (hand[0].Value == "A") + return "11 +"; + else + return parseInt(hand[0].Value) +" +"; + } + else { + var weight = 0; + for(i=0; i 21 || bangleWeight < playerWeight) + EndGameMessdage('WINNER'); + else if(bangleWeight > playerWeight) + EndGameMessdage('LOOSER'); +} + +function renderOnScreen(HideCard) { + const fontName = "6x8"; + + g.clear(); // clear screen + g.reset(); // default draw styles + g.setFont(fontName, 1); + + g.setColor(255,255,255); + g.fillRect(Bangle.appRect); + g.setColor(0,0,0); + + g.drawString('Hit', 176/4-10, 160); + g.drawString('Stand', 176/4+176/2-10, 160); + + g.setFont(fontName, 3); + for(i=0; i right; + + if(is_left){ + hitMe(); + + } else if(is_right){ + stand(); + } +}); +setWatch(startGame, BTN1, {repeat:true, edge:"falling"}); + +startGame(); From 358683d319861ba70738029d7d488bc6a7555584 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Thu, 17 Feb 2022 17:07:13 -0800 Subject: [PATCH 62/99] Update metadata.json --- apps/blackjack/metadata.json | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/apps/blackjack/metadata.json b/apps/blackjack/metadata.json index 331c64040..837b891bd 100644 --- a/apps/blackjack/metadata.json +++ b/apps/blackjack/metadata.json @@ -2,15 +2,16 @@ "id": "blackjack", "name": "Black Jack game", "shortName": "Black Jack game", - "version": "0.02", + "version": "0.03", "description": "Simple implementation of card game Black Jack", "icon": "blackjack.png", "tags": "game", - "supports": ["BANGLEJS"], + "supports": ["BANGLEJS","BANGLEJS2"], "screenshots": [{"url":"bangle1-black-jack-game-screenshot.png"}], "allow_emulator": true, "storage": [ - {"name":"blackjack.app.js","url":"blackjack.app.js"}, + {"name":"blackjack.app.js","url":"blackjack.app.js","supports": ["BANGLEJS"]}, + {"name":"blackjack.app.js","url":"appb2.js","supports": ["BANGLEJS2"]}, {"name":"blackjack.img","url":"blackjack-icon.js","evaluate":true} ] } From 24b41baeabe081764a604d59a4f3f0ae9b319739 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Thu, 17 Feb 2022 17:08:02 -0800 Subject: [PATCH 63/99] Update ChangeLog --- apps/blackjack/ChangeLog | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/blackjack/ChangeLog b/apps/blackjack/ChangeLog index 25b5f9195..8e468e9ad 100644 --- a/apps/blackjack/ChangeLog +++ b/apps/blackjack/ChangeLog @@ -1,2 +1,3 @@ 0.01: New game! BTN4- Hit card, BTN5- Stand -0.02: ignore buttons on pauses \ No newline at end of file +0.02: Ignore buttons on pauses +0.03: Support Bangle.js 2 From f24b87715110ec2f4c7ed90986b73890a45ca9b0 Mon Sep 17 00:00:00 2001 From: Taras <2taras2006@gmail.com> Date: Fri, 18 Feb 2022 07:35:45 +0300 Subject: [PATCH 64/99] Add pie game --- apps/pie/app-icon.js | 1 + apps/pie/app.js | 56 +++++++++++++++++++++++++++++++++++++++++ apps/pie/app.png | Bin 0 -> 510 bytes apps/pie/metadata.json | 14 +++++++++++ 4 files changed, 71 insertions(+) create mode 100644 apps/pie/app-icon.js create mode 100644 apps/pie/app.js create mode 100644 apps/pie/app.png create mode 100644 apps/pie/metadata.json diff --git a/apps/pie/app-icon.js b/apps/pie/app-icon.js new file mode 100644 index 000000000..34a58225c --- /dev/null +++ b/apps/pie/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwhC/AH4A/ABl3ABQVJg4WLC/QWMC/4X/U7NVqIXTgtVC4MXC6QWBAAQYLCxQAGqByJIoQAKC8IWMJBIuNGBIXvCxxgIC/4XH1QAO0AX/C/4X/C/4X/C6Q")) diff --git a/apps/pie/app.js b/apps/pie/app.js new file mode 100644 index 000000000..69b67d3bd --- /dev/null +++ b/apps/pie/app.js @@ -0,0 +1,56 @@ +function end(){ + clearInterval(m); + clearWatch(w); + gfx.clear(); + gfx.setColor(1,0,0); + gfx.setFont("Vector30"); + gfx.drawString('Game over!\n Score: '+score+'\nPress BTN1', gfx.getWidth()*0.15,gfx.getHeight()*0.4); + setWatch(function(){init();}, BTN1); +} +function scrollX(){ + gfx.clearRect(0,gfx.getHeight()*(1/4),gfx.getWidth(),0); + gfx.scroll(0,gfx.getHeight()/4); + score++; + if(typeof(m) != undefined && score>0){ + clearInterval(m); + m = setInterval(scrollY,Math.abs(100/score+15-0.1*score));} + gfx.setColor(1,1,1); + gfx.drawString(score,gfx.getWidth()*(4.2/5),gfx.getHeight()*(0.5/5)); + gfx.setColor(Math.random(),Math.random(),Math.random()); + gfx.setColor(col[0],col[1],col[2]); + gfx.fillRect(colm[0],colm[1],colm[2],colm[3]); + col = [Math.random(),Math.random(),Math.random()]; + gfx.setColor(col[0],col[1],col[2]); + block[0] = gfx.getWidth(); +} +function scrollY(){ + block[0] -= 2; + block[2] = block[0]+colm[2]-colm[0]; + gfx.clearRect(block[2], block[1], gfx.getWidth(), block[3]); + gfx.fillRect(block[0],block[1],block[2],block[3]); + if(block[2]block[2] && colm[0]Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0h38YK~!i%?U=nz z!!QtlFZ_&jU`_f2tSn3n6$l<6yhmAJWCMg$-lLV6Ss0jD7+|S*0Qv-sAi`a^ERfnx z@%dD7-{MPE)%V3`pH(mn!!Z6e8IK}tJ|7nE)yD{D*};hl{x}*{1rrg0ji{4wDdn1uA&pC<)O8*0Z%^ z4wLZbPJ9V@@d@=+p`_~qmQerZswiIed;ASq78anyG1(D@zm825sK*o%3kjSA`9lPv|C`VS-~3(y+(^zPl!oqB9JUg=i8XPq0Iram-GfJb3A)_h zZqLng8CJlF320*i+L(YgCZLT8Xk!A}EV%%{7ZgN7ecm4EnE(I)07*qoM6N<$f`)d^ A?f?J) literal 0 HcmV?d00001 diff --git a/apps/pie/metadata.json b/apps/pie/metadata.json new file mode 100644 index 000000000..9650d1359 --- /dev/null +++ b/apps/pie/metadata.json @@ -0,0 +1,14 @@ +{ "id": "pie", + "name": "In this game you need to make highest pie", + "shortName":"Pie maker", + "version":"0.01", + "description": "In this game you will be making pie out of different pieces", + "icon": "app.png", + "type": "app", + "tags": "game", + "supports" : ["BANGLEJS"], + "storage": [ + {"name":"pie.app.js","url":"app.js"}, + {"name":"pie.img","url":"app-icon.js","evaluate":true} + ] +} From 18602e84147554e1d923297960124b23dea78959 Mon Sep 17 00:00:00 2001 From: Danny <31635744+DDDanny@users.noreply.github.com> Date: Fri, 18 Feb 2022 12:41:30 +0100 Subject: [PATCH 65/99] bug fix settings --- apps/timecal/ChangeLog | 3 +- apps/timecal/metadata.json | 2 +- ...mecal.app.test.js => timecal.app.test._js} | 0 apps/timecal/timecal.settings.js | 42 +++++++++---------- 4 files changed, 24 insertions(+), 23 deletions(-) rename apps/timecal/testing/{timecal.app.test.js => timecal.app.test._js} (100%) diff --git a/apps/timecal/ChangeLog b/apps/timecal/ChangeLog index 43bff461d..e48145b4b 100644 --- a/apps/timecal/ChangeLog +++ b/apps/timecal/ChangeLog @@ -6,4 +6,5 @@ -> locale: weekday name (first two characters) from locale -> added settings to render cal view begin day (-1: today, 0:sunday, 1:monday [default]) 0.03: a lot of more settings for outline, colors and highlights -0.04: finalized README, fixed settings cancel, fixed border-setting \ No newline at end of file +0.04: finalized README, fixed settings cancel, fixed border-setting +0.05: bugfix: default settings \ No newline at end of file diff --git a/apps/timecal/metadata.json b/apps/timecal/metadata.json index 4dd8a8ca0..f439f4e9c 100644 --- a/apps/timecal/metadata.json +++ b/apps/timecal/metadata.json @@ -1,7 +1,7 @@ { "id": "timecal", "name": "TimeCal", "shortName":"TimeCal", - "version":"0.04", + "version":"0.05", "description": "TimeCal shows the date/time along with a 3 week calendar", "icon": "icon.png", "type": "clock", diff --git a/apps/timecal/testing/timecal.app.test.js b/apps/timecal/testing/timecal.app.test._js similarity index 100% rename from apps/timecal/testing/timecal.app.test.js rename to apps/timecal/testing/timecal.app.test._js diff --git a/apps/timecal/timecal.settings.js b/apps/timecal/timecal.settings.js index 38c87903b..2642c9628 100644 --- a/apps/timecal/timecal.settings.js +++ b/apps/timecal/timecal.settings.js @@ -2,7 +2,7 @@ (function(exit) { ABR_DAY = require("locale") && require("locale").abday ? require("locale").abday : ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]; - var FILE = "timecal.validSttngs.json"; + var FILE = "timecal.settings.json"; const DEFAULTS = { shwDate:1, //0:none, 1:locale, 2:month, 3:monthshort.year #week @@ -19,14 +19,14 @@ calBrdr:false }; - validSttngs = require("Storage").readJSON("timecal.validSttngs.json", 1) || {}; + validSttngs = require("Storage").readJSON(FILE, 1) || {}; for (const k in validSttngs) if (!DEFAULTS.hasOwnProperty(k)) delete this.validSttngs[k]; //remove invalid settings - for (const k in DEFAULTS) if(!validSttngs.hasOwnProperty(k)) validSttngs[k] = validSttngs[k]; //assign missing defaults + for (const k in DEFAULTS) if(!validSttngs.hasOwnProperty(k)) validSttngs[k] = DEFAULTS[k]; //assign missing defaults - var changedSttngs = Object.assign({}, validSttngs); + var chngdSttngs = Object.assign({}, validSttngs); var saveExitSettings = () => { - require('Storage').writeJSON(FILE, changedSttngs); + require('Storage').writeJSON(FILE, chngdSttngs); exit(); }; @@ -42,27 +42,27 @@ }, /*LANG*/"< Save": () => saveExitSettings(), /*LANG*/"Show date": { - value: validSttngs.shwDate, + value: chngdSttngs.shwDate, min: 0, max: 3, format: v => [/*LANG*/"none", /*LANG*/"locale", /*LANG*/"M", /*LANG*/"m.Y #W"][v], - onchange: v => validSttngs.shwDate = v + onchange: v => chngdSttngs.shwDate = v }, /*LANG*/"Start wday": { - value: validSttngs.wdStrt, + value: chngdSttngs.wdStrt, min: -1, max: 6, format: v => v>=0 ? ABR_DAY[v] : /*LANG*/"today", - onchange: v => validSttngs.wdStrt = v + onchange: v => chngdSttngs.wdStrt = v }, /*LANG*/"Su color": { - value: validSttngs.suClr, + value: chngdSttngs.suClr, min: 0, max: 3, format: v => [/*LANG*/"none", /*LANG*/"red", /*LANG*/"green", /*LANG*/"blue"][v], - onchange: v => validSttngs.suClr = v + onchange: v => chngdSttngs.suClr = v }, /*LANG*/"Border": { - value: validSttngs.calBrdr, + value: chngdSttngs.calBrdr, format: v => v ? /*LANG*/"show" : /*LANG*/"none", - onchange: v => validSttngs.calBrdr = v + onchange: v => chngdSttngs.calBrdr = v }, /*LANG*/"Today settings": () => { showTodayMenu(); @@ -78,28 +78,28 @@ }, "< Back": () => showMainMenu(), /*LANG*/"Color": { - value: validSttngs.tdyNumClr, + value: chngdSttngs.tdyNumClr, min: 0, max: 3, format: v => [/*LANG*/"none", /*LANG*/"red", /*LANG*/"green", /*LANG*/"blue"][v], - onchange: v => validSttngs.tdyNumClr = v + onchange: v => chngdSttngs.tdyNumClr = v }, /*LANG*/"Marker": { - value: validSttngs.tdyMrkr, + value: chngdSttngs.tdyMrkr, min: 0, max: 3, format: v => [/*LANG*/"none", /*LANG*/"circle", /*LANG*/"rectangle", /*LANG*/"filled"][v], - onchange: v => validSttngs.tdyMrkr = v + onchange: v => chngdSttngs.tdyMrkr = v }, /*LANG*/"Mrk.Color": { - value: validSttngs.tdyMrkClr, + value: chngdSttngs.tdyMrkClr, min: 0, max: 2, format: v => [/*LANG*/"red", /*LANG*/"green", /*LANG*/"blue"][v], - onchange: v => validSttngs.tdyMrkClr = v + onchange: v => chngdSttngs.tdyMrkClr = v }, /*LANG*/"Mrk.Size": { - value: validSttngs.tdyMrkPxl, + value: chngdSttngs.tdyMrkPxl, min: 1, max: 10, format: v => v+"px", - onchange: v => validSttngs.tdyMrkPxl = v + onchange: v => chngdSttngs.tdyMrkPxl = v }, /*LANG*/"< Cancel": () => cancelExitSettings() }); From 7b276915ef79c7dc81afdbe0346d017166f012e3 Mon Sep 17 00:00:00 2001 From: Stiralbios Date: Fri, 18 Feb 2022 14:16:12 +0100 Subject: [PATCH 66/99] improve color and display position --- apps/terminalclock/README.md | 8 +++++++- apps/terminalclock/app.js | 6 ++---- apps/terminalclock/screenshot1.png | Bin 19618 -> 2938 bytes apps/terminalclock/screenshot2.png | Bin 2569 -> 3072 bytes 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/apps/terminalclock/README.md b/apps/terminalclock/README.md index d27fc4cfc..2a2bc1204 100644 --- a/apps/terminalclock/README.md +++ b/apps/terminalclock/README.md @@ -1,3 +1,9 @@ # Terminal clock -A clock displayed as a terminal cli. It can display the time, date, hrm, activity and steps +A clock displayed as a terminal cli. +It can display : +- time +- date +- hrm +- activity +- steps diff --git a/apps/terminalclock/app.js b/apps/terminalclock/app.js index af6ff8472..fb7bd16cc 100644 --- a/apps/terminalclock/app.js +++ b/apps/terminalclock/app.js @@ -1,6 +1,6 @@ var locale = require("locale"); -var fontColor = "#00FF00"; -var startY = 30; +var fontColor = g.theme.dark ? "#0f0" : "#000"; +var startY = 24; var paddingY = 2; var font6x8At4Size = 32; var font6x8At2Size = 18; @@ -82,8 +82,6 @@ function drawActivity(pos){ function draw(){ - // console.log("in draw"); - // console.log(settings); var curPos = 1; g.reset(); g.setFontAlign(-1, -1); diff --git a/apps/terminalclock/screenshot1.png b/apps/terminalclock/screenshot1.png index bfbb9039b7ec94990efcfc11154e714f051ef7b7..a0d41f4957fa8bd96572d2e126ed2aba38d68250 100644 GIT binary patch literal 2938 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 literal 19618 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 diff --git a/apps/terminalclock/screenshot2.png b/apps/terminalclock/screenshot2.png index 27bd6d68d4a7068e01c7f07c4799a631815463ac..21d7aadbf31906cf0316459a9b21bc3ae32e0bc8 100644 GIT binary patch literal 3072 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 jM6c{|gUSB|JP8lDilHZiwbMjjdf zY8$2_bjEDGcy>-HC8I-|9m`2(80LMPJOkd0#mDuyE4O_uaWj0my0_EW9HK^<*f}26xi1Ql~^;{XWf=G806Spmi|u zVr5%=*YH;%A(WRvfbA|n0r{=2Y_b(Dwa(}F2;-$KT!I=aH+nt($Q>MT_M1ZN?0P$p zohj6jJ}tH6Kqy$GT~HW1WWqz#^a#s44`yTIuu_VFL#yM_={zIF_{a=F9ie__chn}E ziPX`n`GRf^iX>j6=!RDaAUl`+MGE)BXcH0Mj722`VZ50}1U=R-SKOPHbl-NAuE zYz$VMaTznev6Ifb#D;3sOxp3%S+mUiKn=bItk`CA&xatIy}}ffR}8y+#K6Lu+`QO= zbbF$Tv7AH9(K*=8cuAF=Yz&t%)7Z4v=qQ^??GR|@y4J+vUD~i{YM4>xoH%6RUSXVI zC?ym#&YJgQ7Q?-#3wuX0x_c^+=enMwj&t~uWrphcgSBj=92r257f(LS5(VALd*0^> z*i{dd4n?A235BQ4I%Dk2QnS!ZrySCyG4T;5xsV%0#8PFC7LH21$pw*T$*)9t8LdpE z?nGT(-T@V-kNT<>S4oJAaQgx^Z90KGq)OPepWclhE9m43!_`e*E`)=AUt|SB%K3(w zetBp7?)N3mL@!obbBxHs>P3ldPR@@nDZTmv4I$I=s~T1KC!Si>jeW-Tehh~jRWuq> zX3zCF*WwXXm%GB-Wr_iO>=zn#jlhXSK{g|fi=z*Icb)Vt^U|?Hn|TXlxq;4yvZ$ld z1Bor=cUszw4*xN2WIEDiXgXKYH>TZ@qV$QBBZz=8K@ApK(KDA*CC{X8uDriL#p!rkeS%LlTO!l`|B-&-@)xrKO8ZHbBWuO_!-&xa#t2na)a`WJI|>;|2NP4o zW1#+9ztVD$@_N5&WvgSK>mG*Phj)dc_8k}*4yQ+4F>5)!3pm&7G$Bri%j=@owhF3s zoXcRt{R$V}kYrx*ni!!z)U@`c1+k5wwpIn%rS61micLb$MYy%1*qt={hiqBse5On} zV!`a((U(i94OH_2&KQh})1u@S&E`Dnsd1l%l+15oR+Gl8ViS*4z;tz(;t!09gMHD1R!D+xQ^=gufZ3iWJQ{0h+fX$+3OT$Dr~0Xw z5MLu>{xd+|D@4ma^`s)+ z>_UNwU0lZzOO5u6i_fGNAV5~ZSib8%dLV=q?#WH7EPtkn)WhkXR*ea zD}{!r7p{lM@x4$~dBdmB$yYV=i#KbrX4u$ZIklC?32Hjp_~+q9-*zX8TT;yK9xZ9PU8v=Kh3L8u z#IufKA8~-P461u=N&XSkUwU5BjF}lok3Ti`c60N^aT1U=O#-(#12?l|Wb(MTgX^0O z3yx6DSMqH*1qDZIJid~X%t(M7xX;FO za4rhdSuriNK3k>JT=o~lGkx?o=VW-T1pkN0!|b>pYM=t2Jh>@xGQ13x${ z%|4#&RgBx}7$CsL%ZR-eHVOV^&T?BIAhj<2x?jUi@@9{#1;+kbsi<<@pR3?i(wvN} z+?-q!e266r01UcPU4^;=N)(UFNHVgtN;K2 From 0eb1a2e16d6f930e8fc5297d97bb3e99e3a9e8ec Mon Sep 17 00:00:00 2001 From: Danny <31635744+DDDanny@users.noreply.github.com> Date: Fri, 18 Feb 2022 14:36:28 +0100 Subject: [PATCH 67/99] settings timecal-clock-0.05 --- apps/timecal/timecal.settings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/timecal/timecal.settings.js b/apps/timecal/timecal.settings.js index 2642c9628..e86f3d8b8 100644 --- a/apps/timecal/timecal.settings.js +++ b/apps/timecal/timecal.settings.js @@ -21,7 +21,7 @@ }; validSttngs = require("Storage").readJSON(FILE, 1) || {}; for (const k in validSttngs) if (!DEFAULTS.hasOwnProperty(k)) delete this.validSttngs[k]; //remove invalid settings - for (const k in DEFAULTS) if(!validSttngs.hasOwnProperty(k)) validSttngs[k] = DEFAULTS[k]; //assign missing defaults + for (const k in DEFAULTS) if(!validSttngs.hasOwnProperty(k)) validSttngs[k] = DEFAULTS[k]; //assign missing defaults fixed var chngdSttngs = Object.assign({}, validSttngs); From f8eebb80ec9dda4ee6fd0f7ebb881cb8a2a3380c Mon Sep 17 00:00:00 2001 From: David Peer Date: Fri, 18 Feb 2022 15:12:13 +0100 Subject: [PATCH 68/99] Optional settings to show a different color for (0,0) whenever the bangle is locked. --- apps/neonx/ChangeLog | 3 ++- apps/neonx/README.md | 7 +++++- apps/neonx/metadata.json | 2 +- apps/neonx/neonx.app.js | 49 ++++++++++++++++++++++++------------ apps/neonx/neonx.settings.js | 9 +++++++ 5 files changed, 51 insertions(+), 19 deletions(-) diff --git a/apps/neonx/ChangeLog b/apps/neonx/ChangeLog index 7ac033fe8..968d6d629 100644 --- a/apps/neonx/ChangeLog +++ b/apps/neonx/ChangeLog @@ -1,2 +1,3 @@ 0.01: Initial release -0.02: Optional fullscreen mode \ No newline at end of file +0.02: Optional fullscreen mode +0.03: Optional show lock status via color \ No newline at end of file diff --git a/apps/neonx/README.md b/apps/neonx/README.md index f205b702f..c3eb982c6 100644 --- a/apps/neonx/README.md +++ b/apps/neonx/README.md @@ -21,4 +21,9 @@ Shows the current date as DD MM on touch and reverts back to time after 5 second ### Fullscreen Shows the watchface in fullscreen mode. -Note: In fullscreen mode, widgets are hidden, but still loaded. \ No newline at end of file +Note: In fullscreen mode, widgets are hidden, but still loaded. + +### Show lock status +In fullscreen mode it can be useful to detect, whether the BangleJs is locked or not. +If these settings are enabled, the first digit is shown red if the BangleJs is locked +and purple otherwise. \ No newline at end of file diff --git a/apps/neonx/metadata.json b/apps/neonx/metadata.json index ffa4d1b8e..4ac7c4cea 100644 --- a/apps/neonx/metadata.json +++ b/apps/neonx/metadata.json @@ -2,7 +2,7 @@ "id": "neonx", "name": "Neon X & IO X Clock", "shortName": "Neon X Clock", - "version": "0.02", + "version": "0.03", "description": "Pebble Neon X & Neon IO X for Bangle.js", "icon": "neonx.png", "type": "clock", diff --git a/apps/neonx/neonx.app.js b/apps/neonx/neonx.app.js index 4ef0986fe..165ec32a6 100644 --- a/apps/neonx/neonx.app.js +++ b/apps/neonx/neonx.app.js @@ -8,6 +8,19 @@ * Created: February 2022 */ +let settings = { + thickness: 4, + io: 0, + showDate: 1, + fullscreen: false, + showLock: false, +}; +let saved_settings = require('Storage').readJSON('neonx.json', 1) || settings; +for (const key in saved_settings) { + settings[key] = saved_settings[key] +} + + const digits = { 0:[[15,15,85,15,85,85,15,85,15,15]], 1:[[85,15,85,85]], @@ -21,6 +34,7 @@ const digits = { 9:[[15,50,15,15,85,15,85,85,15,85]], }; + const colors = { x: [ ["#FF00FF", "#00FFFF"], @@ -31,17 +45,19 @@ const colors = { ["#00FF00", "#00FFFF"] ] }; +const unlockColor = "#FF0000"; const is12hour = (require("Storage").readJSON("setting.json",1)||{})["12hour"]||false; const screenWidth = g.getWidth(); const screenHeight = g.getHeight(); const halfWidth = screenWidth / 2; const scale = screenWidth / 240; -const REFRESH_RATE = 10E3; +const REFRESH_RATE = 60E3; let interval = 0; let showingDate = false; + function drawLine(poly, thickness){ for (let i = 0; i < poly.length; i = i + 2){ if (poly[i + 2] === undefined) { @@ -59,18 +75,6 @@ function drawLine(poly, thickness){ } } -let settings = { - thickness: 4, - io: 0, - showDate: 1, - fullscreen: false, -}; -let saved_settings = require('Storage').readJSON('neonx.json', 1) || settings; -for (const key in saved_settings) { - settings[key] = saved_settings[key] -} - - function drawClock(num){ let tx, ty; @@ -80,7 +84,11 @@ function drawClock(num){ const current = ((y + 1) * 2 + x - 1); let newScale = scale; - g.setColor(colors[settings.io ? 'io' : 'x'][y][x]); + let c = colors[settings.io ? 'io' : 'x'][y][x]; + if(x == 0 && y == 0 && settings.showLock){ + c = Bangle.isLocked() ? c : unlockColor; + } + g.setColor(c); if (!settings.io) { newScale *= settings.fullscreen ? 1.18 : 1.0; @@ -101,6 +109,7 @@ function drawClock(num){ } } + function draw(date){ let d = new Date(); let l1, l2; @@ -131,6 +140,7 @@ function draw(date){ drawClock([l1, l2]); } + function setUpdateInt(set){ if (interval) { clearInterval(interval); @@ -148,15 +158,22 @@ Bangle.setUI("clock"); setUpdateInt(1); draw(); + if (settings.showDate) { Bangle.on('touch', () => draw(!showingDate)); } Bangle.on('lcdPower', function(on){ if (on){ - draw(); setUpdateInt(1); - } else setUpdateInt(0); + draw(); + } else { + setUpdateInt(0); + } +}); + +Bangle.on('lock', function(isLocked) { + draw(); }); Bangle.loadWidgets(); diff --git a/apps/neonx/neonx.settings.js b/apps/neonx/neonx.settings.js index 3af2e0fa5..e01ceb4d3 100644 --- a/apps/neonx/neonx.settings.js +++ b/apps/neonx/neonx.settings.js @@ -9,6 +9,7 @@ io: 0, showDate: 1, fullscreen: false, + showLock: false, }; updateSettings(); @@ -58,6 +59,14 @@ updateSettings(); }, }, + 'Show lock': { + value: false | neonXSettings.showLock, + format: () => (neonXSettings.showLock ? 'Yes' : 'No'), + onchange: () => { + neonXSettings.showLock = !neonXSettings.showLock; + updateSettings(); + }, + }, }; E.showMenu(menu); }) From 225cda47bf32fa01bf86374d6c684ac4662437d9 Mon Sep 17 00:00:00 2001 From: Stiralbios Date: Fri, 18 Feb 2022 16:40:33 +0100 Subject: [PATCH 69/99] fix settings load --- apps/terminalclock/settings.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/terminalclock/settings.js b/apps/terminalclock/settings.js index 2b0d288a2..77df69b12 100644 --- a/apps/terminalclock/settings.js +++ b/apps/terminalclock/settings.js @@ -3,10 +3,10 @@ // Load settings var settings = Object.assign({ HRMinConfidence: 50, - showDate: "Yes", - showHRM: "Yes", - showActivity: "Yes", - showStepCount: "Yes", + showDate: true, + showHRM: true, + showActivity: true, + showStepCount: true, }, require('Storage').readJSON(FILE, true) || {}); function writeSettings() { From a4c97850dd1f7a5c83e9a2be95e89d8199cacced Mon Sep 17 00:00:00 2001 From: Jeroen Peters Date: Fri, 18 Feb 2022 19:53:11 +0100 Subject: [PATCH 70/99] #1132: Messages: Allow disabling repetition of buzzer --- apps/messages/ChangeLog | 1 + apps/messages/app.js | 2 +- apps/messages/metadata.json | 2 +- apps/messages/settings.js | 4 ++-- apps/messages/widget.js | 10 ++++++---- 5 files changed, 11 insertions(+), 8 deletions(-) diff --git a/apps/messages/ChangeLog b/apps/messages/ChangeLog index 4811cd19b..e2c671fa1 100644 --- a/apps/messages/ChangeLog +++ b/apps/messages/ChangeLog @@ -31,3 +31,4 @@ 0.19: Use a larger font for message text if it'll fit 0.20: Allow tapping on the body to show a scrollable view of the message and title in a bigger font (fix #1405, #1031) 0.21: Improve list readability on dark theme +0.22: Allow repeat to be switched Off, so there is no buzzing repetition diff --git a/apps/messages/app.js b/apps/messages/app.js index 4aaf97369..5f70f6748 100644 --- a/apps/messages/app.js +++ b/apps/messages/app.js @@ -123,7 +123,7 @@ function getMessageImageCol(msg,def) { "telegram": "#0088cc", "twitter": "#1da1f2", "whatsapp": "#4fce5d", - "wordfeud": "#dcc8bd", + "wordfeud": "#e7d3c7", }[(msg.src||"").toLowerCase()]||(def !== undefined?def:g.theme.fg); } diff --git a/apps/messages/metadata.json b/apps/messages/metadata.json index 6834693ae..e84d9f0d9 100644 --- a/apps/messages/metadata.json +++ b/apps/messages/metadata.json @@ -1,7 +1,7 @@ { "id": "messages", "name": "Messages", - "version": "0.21", + "version": "0.22", "description": "App to display notifications from iOS and Gadgetbridge", "icon": "app.png", "type": "app", diff --git a/apps/messages/settings.js b/apps/messages/settings.js index c865a37fb..ae9b4aab5 100644 --- a/apps/messages/settings.js +++ b/apps/messages/settings.js @@ -27,8 +27,8 @@ }, /*LANG*/'Repeat': { value: settings().repeat, - min: 2, max: 10, - format: v => v+"s", + min: 0, max: 10, + format: v => v?v+"s":/*LANG*/"Off", onchange: v => updateSetting("repeat", v) }, /*LANG*/'Unread timer': { diff --git a/apps/messages/widget.js b/apps/messages/widget.js index 1239ef262..614b6194a 100644 --- a/apps/messages/widget.js +++ b/apps/messages/widget.js @@ -1,4 +1,4 @@ -WIDGETS["messages"]={area:"tl", width:0, iconwidth:23, +WIDGETS["messages"]={area:"tl", width:0, iconwidth:24, draw:function() { Bangle.removeListener('touch', this.touch); if (!this.width) return; @@ -8,9 +8,11 @@ draw:function() { //if (c<60) Bangle.setLCDPower(1); // keep LCD on for 1 minute let settings = require('Storage').readJSON("messages.settings.json", true) || {}; if (settings.repeat===undefined) settings.repeat = 4; - if (c<120 && (Date.now()-this.l)>settings.repeat*1000) { - this.l = Date.now(); - WIDGETS["messages"].buzz(); // buzz every 4 seconds + if(settings.repeat!==0) { + if (c<120 && (Date.now()-this.l)>settings.repeat*1000) { + this.l = Date.now(); + WIDGETS["messages"].buzz(); // buzz every settings.repeat seconds + } } setTimeout(()=>WIDGETS["messages"].draw(), 1000); if (process.env.HWVERSION>1) Bangle.on('touch', this.touch); From d35481130a048b7cf22ad37e05601f55424ae132 Mon Sep 17 00:00:00 2001 From: Jeroen Peters Date: Fri, 18 Feb 2022 21:57:09 +0100 Subject: [PATCH 71/99] #1132: Messages: Allow disabling repetition of buzzer --- apps/messages/metadata.json | 2 +- apps/messages/widget.js | 9 ++++----- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/apps/messages/metadata.json b/apps/messages/metadata.json index e84d9f0d9..6834693ae 100644 --- a/apps/messages/metadata.json +++ b/apps/messages/metadata.json @@ -1,7 +1,7 @@ { "id": "messages", "name": "Messages", - "version": "0.22", + "version": "0.21", "description": "App to display notifications from iOS and Gadgetbridge", "icon": "app.png", "type": "app", diff --git a/apps/messages/widget.js b/apps/messages/widget.js index 614b6194a..5216c380d 100644 --- a/apps/messages/widget.js +++ b/apps/messages/widget.js @@ -8,11 +8,10 @@ draw:function() { //if (c<60) Bangle.setLCDPower(1); // keep LCD on for 1 minute let settings = require('Storage').readJSON("messages.settings.json", true) || {}; if (settings.repeat===undefined) settings.repeat = 4; - if(settings.repeat!==0) { - if (c<120 && (Date.now()-this.l)>settings.repeat*1000) { - this.l = Date.now(); - WIDGETS["messages"].buzz(); // buzz every settings.repeat seconds - } + if (settings.repeat===0) settings.repeat = (settings.unreadTimeout+1)*1000; // best way to no-repeat and keep next code + if (c<120 && (Date.now()-this.l)>settings.repeat*1000) { + this.l = Date.now(); + WIDGETS["messages"].buzz(); // buzz every settings.repeat seconds } setTimeout(()=>WIDGETS["messages"].draw(), 1000); if (process.env.HWVERSION>1) Bangle.on('touch', this.touch); From b7da92c7738afcc53bb9146c6188f570fb700e97 Mon Sep 17 00:00:00 2001 From: Jeroen Peters Date: Fri, 18 Feb 2022 22:21:19 +0100 Subject: [PATCH 72/99] #1132: Messages: Allow disabling repetition of buzzer --- apps/messages/metadata.json | 2 +- apps/messages/widget.js | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/messages/metadata.json b/apps/messages/metadata.json index 6834693ae..e84d9f0d9 100644 --- a/apps/messages/metadata.json +++ b/apps/messages/metadata.json @@ -1,7 +1,7 @@ { "id": "messages", "name": "Messages", - "version": "0.21", + "version": "0.22", "description": "App to display notifications from iOS and Gadgetbridge", "icon": "app.png", "type": "app", diff --git a/apps/messages/widget.js b/apps/messages/widget.js index 5216c380d..67ba777ad 100644 --- a/apps/messages/widget.js +++ b/apps/messages/widget.js @@ -1,5 +1,5 @@ WIDGETS["messages"]={area:"tl", width:0, iconwidth:24, -draw:function() { +draw:function(buzzed_once) { Bangle.removeListener('touch', this.touch); if (!this.width) return; var c = (Date.now()-this.t)/1000; @@ -8,12 +8,12 @@ draw:function() { //if (c<60) Bangle.setLCDPower(1); // keep LCD on for 1 minute let settings = require('Storage').readJSON("messages.settings.json", true) || {}; if (settings.repeat===undefined) settings.repeat = 4; - if (settings.repeat===0) settings.repeat = (settings.unreadTimeout+1)*1000; // best way to no-repeat and keep next code if (c<120 && (Date.now()-this.l)>settings.repeat*1000) { this.l = Date.now(); WIDGETS["messages"].buzz(); // buzz every settings.repeat seconds } - setTimeout(()=>WIDGETS["messages"].draw(), 1000); + if (settings.repeat===0 && buzzed_once!==true) settings.repeat = (settings.unreadTimeout+1)*1000; // Dont buzz again after this initial one + setTimeout(()=>WIDGETS["messages"].draw(true), 1000); if (process.env.HWVERSION>1) Bangle.on('touch', this.touch); },show:function(quiet) { WIDGETS["messages"].t=Date.now(); // first time From 5bb799898b61b2c60536f81fc633ec24877b3724 Mon Sep 17 00:00:00 2001 From: Jeroen Peters Date: Fri, 18 Feb 2022 22:28:26 +0100 Subject: [PATCH 73/99] #1132: Messages: Allow disabling repetition of buzzer --- apps/messages/metadata.json | 2 +- apps/messages/widget.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/messages/metadata.json b/apps/messages/metadata.json index e84d9f0d9..6834693ae 100644 --- a/apps/messages/metadata.json +++ b/apps/messages/metadata.json @@ -1,7 +1,7 @@ { "id": "messages", "name": "Messages", - "version": "0.22", + "version": "0.21", "description": "App to display notifications from iOS and Gadgetbridge", "icon": "app.png", "type": "app", diff --git a/apps/messages/widget.js b/apps/messages/widget.js index 67ba777ad..9d5c77c32 100644 --- a/apps/messages/widget.js +++ b/apps/messages/widget.js @@ -12,7 +12,7 @@ draw:function(buzzed_once) { this.l = Date.now(); WIDGETS["messages"].buzz(); // buzz every settings.repeat seconds } - if (settings.repeat===0 && buzzed_once!==true) settings.repeat = (settings.unreadTimeout+1)*1000; // Dont buzz again after this initial one + if (settings.repeat===0 && buzzed_once===true) settings.repeat = (settings.unreadTimeout+241)*1000; // Dont buzz again after this initial one setTimeout(()=>WIDGETS["messages"].draw(true), 1000); if (process.env.HWVERSION>1) Bangle.on('touch', this.touch); },show:function(quiet) { From a20e7d36c3580deab00a23a8d6d061b5831b8552 Mon Sep 17 00:00:00 2001 From: Jeroen Peters Date: Fri, 18 Feb 2022 22:33:17 +0100 Subject: [PATCH 74/99] #1132: Messages: Allow disabling repetition of buzzer --- apps/messages/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/messages/metadata.json b/apps/messages/metadata.json index 6834693ae..87d541d45 100644 --- a/apps/messages/metadata.json +++ b/apps/messages/metadata.json @@ -1,7 +1,7 @@ { "id": "messages", "name": "Messages", - "version": "0.21", + "version": "0.25", "description": "App to display notifications from iOS and Gadgetbridge", "icon": "app.png", "type": "app", From e172aa49279b381fd4202efee5879e7d5b9912b3 Mon Sep 17 00:00:00 2001 From: Jeroen Peters Date: Sat, 19 Feb 2022 00:23:12 +0100 Subject: [PATCH 75/99] #1132: Messages: Allow disabling repetition of buzzer --- apps/messages/ChangeLog | 6 ++++-- apps/messages/metadata.json | 4 ++-- apps/messages/settings.js | 1 - apps/messages/widget.js | 6 +++--- 4 files changed, 9 insertions(+), 8 deletions(-) diff --git a/apps/messages/ChangeLog b/apps/messages/ChangeLog index e2c671fa1..4ad3264b7 100644 --- a/apps/messages/ChangeLog +++ b/apps/messages/ChangeLog @@ -15,7 +15,7 @@ 0.10: Respect the 'new' attribute if it was set from iOS integrations 0.11: Open app when touching the widget (Bangle.js 2 only) 0.12: Extra app-specific notification icons - New animated notifcationicon (instead of large blinking 'MESSAGES') + New animated notification icon (instead of large blinking 'MESSAGES') Added screenshots 0.13: Add /*LANG*/ comments for internationalisation Add 'Delete All' option to message options @@ -31,4 +31,6 @@ 0.19: Use a larger font for message text if it'll fit 0.20: Allow tapping on the body to show a scrollable view of the message and title in a bigger font (fix #1405, #1031) 0.21: Improve list readability on dark theme -0.22: Allow repeat to be switched Off, so there is no buzzing repetition +0.22: Allow repeat to be switched Off, so there is no buzzing repetition. + Also gave the widget a pixel more room to the right + diff --git a/apps/messages/metadata.json b/apps/messages/metadata.json index 87d541d45..7488c792e 100644 --- a/apps/messages/metadata.json +++ b/apps/messages/metadata.json @@ -1,8 +1,8 @@ { "id": "messages", "name": "Messages", - "version": "0.25", - "description": "App to display notifications from iOS and Gadgetbridge", + "version": "0.22", + "description": "App to display notifications from iOS and Gadgetbridge/Android", "icon": "app.png", "type": "app", "tags": "tool,system", diff --git a/apps/messages/settings.js b/apps/messages/settings.js index ae9b4aab5..dcf7b4636 100644 --- a/apps/messages/settings.js +++ b/apps/messages/settings.js @@ -13,7 +13,6 @@ } var vibPatterns = [/*LANG*/"Off", ".", "-", "--", "-.-", "---"]; - var currentVib = settings().vibrate; var mainmenu = { "" : { "title" : /*LANG*/"Messages" }, "< Back" : back, diff --git a/apps/messages/widget.js b/apps/messages/widget.js index 9d5c77c32..fe609fb5c 100644 --- a/apps/messages/widget.js +++ b/apps/messages/widget.js @@ -1,5 +1,5 @@ WIDGETS["messages"]={area:"tl", width:0, iconwidth:24, -draw:function(buzzed_once) { +draw:function() { Bangle.removeListener('touch', this.touch); if (!this.width) return; var c = (Date.now()-this.t)/1000; @@ -8,12 +8,12 @@ draw:function(buzzed_once) { //if (c<60) Bangle.setLCDPower(1); // keep LCD on for 1 minute let settings = require('Storage').readJSON("messages.settings.json", true) || {}; if (settings.repeat===undefined) settings.repeat = 4; + else if (settings.repeat===0) settings.repeat = (settings.unreadTimeout+241)*1000; // best way to no-repeat and keep next code if (c<120 && (Date.now()-this.l)>settings.repeat*1000) { this.l = Date.now(); WIDGETS["messages"].buzz(); // buzz every settings.repeat seconds } - if (settings.repeat===0 && buzzed_once===true) settings.repeat = (settings.unreadTimeout+241)*1000; // Dont buzz again after this initial one - setTimeout(()=>WIDGETS["messages"].draw(true), 1000); + setTimeout(()=>WIDGETS["messages"].draw(), 1000); if (process.env.HWVERSION>1) Bangle.on('touch', this.touch); },show:function(quiet) { WIDGETS["messages"].t=Date.now(); // first time From e29a41aa282e574b54d2fd4768ef7ca277369685 Mon Sep 17 00:00:00 2001 From: Jeroen Peters Date: Sat, 19 Feb 2022 00:38:00 +0100 Subject: [PATCH 76/99] #1132: Messages: Allow disabling repetition of buzzer --- apps/messages/metadata.json | 2 +- apps/messages/widget.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/messages/metadata.json b/apps/messages/metadata.json index 7488c792e..08089dfb0 100644 --- a/apps/messages/metadata.json +++ b/apps/messages/metadata.json @@ -1,7 +1,7 @@ { "id": "messages", "name": "Messages", - "version": "0.22", + "version": "0.50", "description": "App to display notifications from iOS and Gadgetbridge/Android", "icon": "app.png", "type": "app", diff --git a/apps/messages/widget.js b/apps/messages/widget.js index fe609fb5c..852fe2f47 100644 --- a/apps/messages/widget.js +++ b/apps/messages/widget.js @@ -8,7 +8,7 @@ draw:function() { //if (c<60) Bangle.setLCDPower(1); // keep LCD on for 1 minute let settings = require('Storage').readJSON("messages.settings.json", true) || {}; if (settings.repeat===undefined) settings.repeat = 4; - else if (settings.repeat===0) settings.repeat = (settings.unreadTimeout+241)*1000; // best way to no-repeat and keep next code + //else if (settings.repeat===0) settings.repeat = (settings.unreadTimeout+241)*1000; // best way to no-repeat and keep next code if (c<120 && (Date.now()-this.l)>settings.repeat*1000) { this.l = Date.now(); WIDGETS["messages"].buzz(); // buzz every settings.repeat seconds From 6acf7b1b29125ffe804318c51449a5c10e6bbbbd Mon Sep 17 00:00:00 2001 From: Jeroen Peters Date: Sat, 19 Feb 2022 08:09:28 +0100 Subject: [PATCH 77/99] #1132: Messages: Allow disabling repetition of buzzer: Wow, dazzling solution --- apps/messages/metadata.json | 2 +- apps/messages/settings.js | 18 +++++++++++++----- apps/messages/widget.js | 3 +-- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/apps/messages/metadata.json b/apps/messages/metadata.json index 08089dfb0..7488c792e 100644 --- a/apps/messages/metadata.json +++ b/apps/messages/metadata.json @@ -1,7 +1,7 @@ { "id": "messages", "name": "Messages", - "version": "0.50", + "version": "0.22", "description": "App to display notifications from iOS and Gadgetbridge/Android", "icon": "app.png", "type": "app", diff --git a/apps/messages/settings.js b/apps/messages/settings.js index dcf7b4636..6ddd9de14 100644 --- a/apps/messages/settings.js +++ b/apps/messages/settings.js @@ -4,14 +4,22 @@ if (settings.vibrate===undefined) settings.vibrate="."; if (settings.repeat===undefined) settings.repeat=4; if (settings.unreadTimeout===undefined) settings.unreadTimeout=60; + settings.max_unread_timer=240; + settings.no_repeat_value=(settings.max_unread_timer+1)*1000; return settings; } function updateSetting(setting, value) { - let settings = require('Storage').readJSON("messages.settings.json", true) || {}; - settings[setting] = value; - require('Storage').writeJSON("messages.settings.json", settings); + let appsettings = require('Storage').readJSON("messages.settings.json", true) || {}; + if(setting=="repeat" && value===0) + { + value=settings().no_repeat_value; + } + appsettings[setting] = value; + require('Storage').writeJSON("messages.settings.json", appsettings); } + var repeatDisplay = settings().repeat; + if(repeatDisplay==settings().no_repeat_value) repeatDisplay=0; var vibPatterns = [/*LANG*/"Off", ".", "-", "--", "-.-", "---"]; var mainmenu = { "" : { "title" : /*LANG*/"Messages" }, @@ -25,14 +33,14 @@ } }, /*LANG*/'Repeat': { - value: settings().repeat, + value: repeatDisplay, min: 0, max: 10, format: v => v?v+"s":/*LANG*/"Off", onchange: v => updateSetting("repeat", v) }, /*LANG*/'Unread timer': { value: settings().unreadTimeout, - min: 0, max: 240, step : 10, + min: 0, max: settings().max_unread_timer, step : 10, format: v => v?v+"s":/*LANG*/"Off", onchange: v => updateSetting("unreadTimeout", v) }, diff --git a/apps/messages/widget.js b/apps/messages/widget.js index 852fe2f47..13e923670 100644 --- a/apps/messages/widget.js +++ b/apps/messages/widget.js @@ -8,10 +8,9 @@ draw:function() { //if (c<60) Bangle.setLCDPower(1); // keep LCD on for 1 minute let settings = require('Storage').readJSON("messages.settings.json", true) || {}; if (settings.repeat===undefined) settings.repeat = 4; - //else if (settings.repeat===0) settings.repeat = (settings.unreadTimeout+241)*1000; // best way to no-repeat and keep next code if (c<120 && (Date.now()-this.l)>settings.repeat*1000) { this.l = Date.now(); - WIDGETS["messages"].buzz(); // buzz every settings.repeat seconds + WIDGETS["messages"].buzz(); // buzz every 4 seconds } setTimeout(()=>WIDGETS["messages"].draw(), 1000); if (process.env.HWVERSION>1) Bangle.on('touch', this.touch); From 7c0328d642e0a7aebc85220f97a96ee9658c453b Mon Sep 17 00:00:00 2001 From: Jeroen Peters Date: Sat, 19 Feb 2022 09:34:56 +0100 Subject: [PATCH 78/99] #1132: Messages: Allow disabling repetition of buzzer --- apps/messages/metadata.json | 2 +- apps/messages/settings.js | 19 ++++++------------- apps/messages/widget.js | 5 +++-- 3 files changed, 10 insertions(+), 16 deletions(-) diff --git a/apps/messages/metadata.json b/apps/messages/metadata.json index 7488c792e..93c1d573d 100644 --- a/apps/messages/metadata.json +++ b/apps/messages/metadata.json @@ -1,7 +1,7 @@ { "id": "messages", "name": "Messages", - "version": "0.22", + "version": "0.55", "description": "App to display notifications from iOS and Gadgetbridge/Android", "icon": "app.png", "type": "app", diff --git a/apps/messages/settings.js b/apps/messages/settings.js index 6ddd9de14..39abfc131 100644 --- a/apps/messages/settings.js +++ b/apps/messages/settings.js @@ -4,22 +4,15 @@ if (settings.vibrate===undefined) settings.vibrate="."; if (settings.repeat===undefined) settings.repeat=4; if (settings.unreadTimeout===undefined) settings.unreadTimeout=60; - settings.max_unread_timer=240; - settings.no_repeat_value=(settings.max_unread_timer+1)*1000; + settings.maxUnreadTimeout=240; return settings; } function updateSetting(setting, value) { - let appsettings = require('Storage').readJSON("messages.settings.json", true) || {}; - if(setting=="repeat" && value===0) - { - value=settings().no_repeat_value; - } - appsettings[setting] = value; - require('Storage').writeJSON("messages.settings.json", appsettings); + let settings = require('Storage').readJSON("messages.settings.json", true) || {}; + settings[setting] = value; + require('Storage').writeJSON("messages.settings.json", settings); } - var repeatDisplay = settings().repeat; - if(repeatDisplay==settings().no_repeat_value) repeatDisplay=0; var vibPatterns = [/*LANG*/"Off", ".", "-", "--", "-.-", "---"]; var mainmenu = { "" : { "title" : /*LANG*/"Messages" }, @@ -33,14 +26,14 @@ } }, /*LANG*/'Repeat': { - value: repeatDisplay, + value: settings().repeat, min: 0, max: 10, format: v => v?v+"s":/*LANG*/"Off", onchange: v => updateSetting("repeat", v) }, /*LANG*/'Unread timer': { value: settings().unreadTimeout, - min: 0, max: settings().max_unread_timer, step : 10, + min: 0, max: settings().maxUnreadTimeout, step : 10, format: v => v?v+"s":/*LANG*/"Off", onchange: v => updateSetting("unreadTimeout", v) }, diff --git a/apps/messages/widget.js b/apps/messages/widget.js index 13e923670..db9c42409 100644 --- a/apps/messages/widget.js +++ b/apps/messages/widget.js @@ -5,10 +5,11 @@ draw:function() { var c = (Date.now()-this.t)/1000; g.reset().clearRect(this.x, this.y, this.x+this.width, this.y+this.iconwidth); g.drawImage((c&1) ? atob("GBiBAAAAAAAAAAAAAAAAAAAAAB//+DAADDAADDAADDwAPD8A/DOBzDDn/DA//DAHvDAPvjAPvjAPvjAPvh///gf/vAAD+AAB8AAAAA==") : atob("GBiBAAAAAAAAAAAAAAAAAAAAAB//+D///D///A//8CP/xDj/HD48DD+B8D/D+D/3vD/vvj/vvj/vvj/vvh/v/gfnvAAD+AAB8AAAAA=="), this.x, this.y); - //if (c<60) Bangle.setLCDPower(1); // keep LCD on for 1 minute let settings = require('Storage').readJSON("messages.settings.json", true) || {}; if (settings.repeat===undefined) settings.repeat = 4; - if (c<120 && (Date.now()-this.l)>settings.repeat*1000) { + if(settings.repeat===0) { + if(c===1) WIDGETS["messages"].buzz(); // buzz just once + } else if (csettings.repeat*1000) { this.l = Date.now(); WIDGETS["messages"].buzz(); // buzz every 4 seconds } From a476be978698d84930eafb443af422834de41538 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sat, 19 Feb 2022 09:36:32 +0100 Subject: [PATCH 79/99] Minor changes --- apps/neonx/README.md | 4 +--- apps/neonx/neonx.app.js | 10 +++------- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/apps/neonx/README.md b/apps/neonx/README.md index c3eb982c6..ffb3c3f2c 100644 --- a/apps/neonx/README.md +++ b/apps/neonx/README.md @@ -24,6 +24,4 @@ Shows the watchface in fullscreen mode. Note: In fullscreen mode, widgets are hidden, but still loaded. ### Show lock status -In fullscreen mode it can be useful to detect, whether the BangleJs is locked or not. -If these settings are enabled, the first digit is shown red if the BangleJs is locked -and purple otherwise. \ No newline at end of file +If enabled, color changes when unlocked to detect the lock state easily. \ No newline at end of file diff --git a/apps/neonx/neonx.app.js b/apps/neonx/neonx.app.js index 165ec32a6..d64e08d78 100644 --- a/apps/neonx/neonx.app.js +++ b/apps/neonx/neonx.app.js @@ -45,8 +45,6 @@ const colors = { ["#00FF00", "#00FFFF"] ] }; -const unlockColor = "#FF0000"; - const is12hour = (require("Storage").readJSON("setting.json",1)||{})["12hour"]||false; const screenWidth = g.getWidth(); const screenHeight = g.getHeight(); @@ -84,14 +82,12 @@ function drawClock(num){ const current = ((y + 1) * 2 + x - 1); let newScale = scale; - let c = colors[settings.io ? 'io' : 'x'][y][x]; - if(x == 0 && y == 0 && settings.showLock){ - c = Bangle.isLocked() ? c : unlockColor; - } + let xc = settings.showLock && Bangle.isLocked() ? Math.abs(x-1) : x; + let c = colors[settings.io ? 'io' : 'x'][y][xc]; g.setColor(c); if (!settings.io) { - newScale *= settings.fullscreen ? 1.18 : 1.0; + newScale *= settings.fullscreen ? 1.20 : 1.0; let dx = settings.fullscreen ? 0 : 18 tx = (x * 100 + dx) * newScale; ty = (y * 100 + dx*2) * newScale; From d74103273ef30ebc3a0370a8673cbbcb4d8051b6 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sat, 19 Feb 2022 09:39:26 +0100 Subject: [PATCH 80/99] Keep original style w.r.t colors. --- apps/neonx/neonx.app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/neonx/neonx.app.js b/apps/neonx/neonx.app.js index d64e08d78..a90d5c609 100644 --- a/apps/neonx/neonx.app.js +++ b/apps/neonx/neonx.app.js @@ -82,7 +82,7 @@ function drawClock(num){ const current = ((y + 1) * 2 + x - 1); let newScale = scale; - let xc = settings.showLock && Bangle.isLocked() ? Math.abs(x-1) : x; + let xc = settings.showLock && !Bangle.isLocked() ? Math.abs(x-1) : x; let c = colors[settings.io ? 'io' : 'x'][y][xc]; g.setColor(c); From 9d4de50606551b169830eb66888a51f6da43e2df Mon Sep 17 00:00:00 2001 From: David Peer Date: Sat, 19 Feb 2022 14:20:17 +0100 Subject: [PATCH 81/99] Test with 30 sec. interval --- apps/neonx/neonx.app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/neonx/neonx.app.js b/apps/neonx/neonx.app.js index a90d5c609..02e228a03 100644 --- a/apps/neonx/neonx.app.js +++ b/apps/neonx/neonx.app.js @@ -50,7 +50,7 @@ const screenWidth = g.getWidth(); const screenHeight = g.getHeight(); const halfWidth = screenWidth / 2; const scale = screenWidth / 240; -const REFRESH_RATE = 60E3; +const REFRESH_RATE = 30E3; let interval = 0; let showingDate = false; From c7a1d9e368d20b1eeaff2b19d8bdafe2ec6375aa Mon Sep 17 00:00:00 2001 From: David Peer Date: Sat, 19 Feb 2022 14:24:34 +0100 Subject: [PATCH 82/99] Back to 10 sec. refresh rate --- apps/neonx/neonx.app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/neonx/neonx.app.js b/apps/neonx/neonx.app.js index 02e228a03..bbc1bfeda 100644 --- a/apps/neonx/neonx.app.js +++ b/apps/neonx/neonx.app.js @@ -50,7 +50,7 @@ const screenWidth = g.getWidth(); const screenHeight = g.getHeight(); const halfWidth = screenWidth / 2; const scale = screenWidth / 240; -const REFRESH_RATE = 30E3; +const REFRESH_RATE = 10E3; let interval = 0; let showingDate = false; From 5460a95b8e92d3f2d0113de455622c76d699eb7a Mon Sep 17 00:00:00 2001 From: David Peer Date: Sat, 19 Feb 2022 14:31:58 +0100 Subject: [PATCH 83/99] Queue draw based on current time. --- apps/neonx/neonx.app.js | 55 ++++++++++++++++++++++------------------- 1 file changed, 30 insertions(+), 25 deletions(-) diff --git a/apps/neonx/neonx.app.js b/apps/neonx/neonx.app.js index bbc1bfeda..6a8b933e5 100644 --- a/apps/neonx/neonx.app.js +++ b/apps/neonx/neonx.app.js @@ -50,9 +50,6 @@ const screenWidth = g.getWidth(); const screenHeight = g.getHeight(); const halfWidth = screenWidth / 2; const scale = screenWidth / 240; -const REFRESH_RATE = 10E3; - -let interval = 0; let showingDate = false; @@ -107,20 +104,22 @@ function drawClock(num){ function draw(date){ + queueDraw(); + let d = new Date(); let l1, l2; showingDate = date; if (date) { - setUpdateInt(0); - l1 = ('0' + (new Date()).getDate()).substr(-2); l2 = ('0' + ((new Date()).getMonth() + 1)).substr(-2); + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = undefined; + setTimeout(_ => { draw(); - setUpdateInt(1); }, 5000); } else { l1 = ('0' + (d.getHours() % (is12hour ? 12 : 24))).substr(-2); @@ -137,34 +136,32 @@ function draw(date){ } -function setUpdateInt(set){ - if (interval) { - clearInterval(interval); - } - - if (set) { - interval = setInterval(draw, REFRESH_RATE); - } +/* + * Draw watch face + */ +var drawTimeout; +function queueDraw() { + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = setTimeout(function() { + drawTimeout = undefined; + draw(); + }, 60000 - (Date.now() % 60000)); } -g.clear(1); - -Bangle.setUI("clock"); - -setUpdateInt(1); -draw(); - +/* + * Event handlers + */ if (settings.showDate) { Bangle.on('touch', () => draw(!showingDate)); } Bangle.on('lcdPower', function(on){ - if (on){ - setUpdateInt(1); + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = undefined; + + if (on) { draw(); - } else { - setUpdateInt(0); } }); @@ -172,6 +169,14 @@ Bangle.on('lock', function(isLocked) { draw(); }); + +/* + * Draw first time + */ +g.clear(1); +Bangle.setUI("clock"); +draw(); + Bangle.loadWidgets(); if(settings.fullscreen){ From 7f515b172a25233c7e5a74e44e8aa1a184e57291 Mon Sep 17 00:00:00 2001 From: hughbarney Date: Sat, 19 Feb 2022 14:00:33 +0000 Subject: [PATCH 84/99] Stopwatch touch - adjust on touch for x,y outside the g dimensions of the screen --- apps/stopwatch/ChangeLog | 1 + apps/stopwatch/metadata.json | 2 +- apps/stopwatch/stopwatch.app.js | 18 ++++++++++++++---- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/apps/stopwatch/ChangeLog b/apps/stopwatch/ChangeLog index 9db0e26c5..104fce19d 100644 --- a/apps/stopwatch/ChangeLog +++ b/apps/stopwatch/ChangeLog @@ -1 +1,2 @@ 0.01: first release +0.02: Adjust for touch events outside of screen g dimensions diff --git a/apps/stopwatch/metadata.json b/apps/stopwatch/metadata.json index e72d85af1..cc13ec92f 100644 --- a/apps/stopwatch/metadata.json +++ b/apps/stopwatch/metadata.json @@ -1,7 +1,7 @@ { "id": "stopwatch", "name": "Stopwatch Touch", - "version": "0.01", + "version": "0.02", "description": "A touch based stop watch for Bangle JS 2", "icon": "stopwatch.png", "screenshots": [{"url":"screenshot1.png"},{"url":"screenshot2.png"},{"url":"screenshot3.png"}], diff --git a/apps/stopwatch/stopwatch.app.js b/apps/stopwatch/stopwatch.app.js index 48d4f26ea..e2be95451 100644 --- a/apps/stopwatch/stopwatch.app.js +++ b/apps/stopwatch/stopwatch.app.js @@ -185,17 +185,27 @@ resetBtn.setImage(pause_img); Bangle.on('touch', function(button, xy) { + var x = xy.x; + var y = xy.y; + + // adjust for outside the dimension of the screen + // http://forum.espruino.com/conversations/371867/#comment16406025 + if (y > h) y = h; + if (y < 0) y = 0; + if (x > w) x = w; + if (x < 0) x = 0; + // not running, and reset - if (!running && tCurrent == tTotal && bigPlayPauseBtn.check(xy.x, xy.y)) return; + if (!running && tCurrent == tTotal && bigPlayPauseBtn.check(x, y)) return; // paused and hit play - if (!running && tCurrent != tTotal && smallPlayPauseBtn.check(xy.x, xy.y)) return; + if (!running && tCurrent != tTotal && smallPlayPauseBtn.check(x, y)) return; // paused and press reset - if (!running && tCurrent != tTotal && resetBtn.check(xy.x, xy.y)) return; + if (!running && tCurrent != tTotal && resetBtn.check(x, y)) return; // must be running - if (running && bigPlayPauseBtn.check(xy.x, xy.y)) return; + if (running && bigPlayPauseBtn.check(x, y)) return; }); // Stop updates when LCD is off, restart when on From 91b905a777f08b7d9bdf602781c12c1e2c8b7f80 Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Sat, 19 Feb 2022 18:04:37 +0100 Subject: [PATCH 85/99] Update ChangeLog --- apps/contourclock/ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/contourclock/ChangeLog b/apps/contourclock/ChangeLog index 0b6709d24..9c62e637b 100644 --- a/apps/contourclock/ChangeLog +++ b/apps/contourclock/ChangeLog @@ -4,3 +4,4 @@ 0.22: Changed timing code, original "Nunito" Font is back! 0.23: Customizer! Unused fonts no longer take up precious memory. 0.24: Added previews to the customizer. +0.25: Fixed a bug that would let widgets change the color of the clock. From 47ac08e12e753f55b2746302f91cf7eeb8d13263 Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Sat, 19 Feb 2022 18:04:58 +0100 Subject: [PATCH 86/99] Update metadata.json --- apps/contourclock/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/contourclock/metadata.json b/apps/contourclock/metadata.json index a5d764f2d..54d799127 100644 --- a/apps/contourclock/metadata.json +++ b/apps/contourclock/metadata.json @@ -1,7 +1,7 @@ { "id": "contourclock", "name": "Contour Clock", "shortName" : "Contour Clock", - "version":"0.24", + "version":"0.25", "icon": "app.png", "description": "A Minimalist clockface with large Digits. Now with more fonts!", "screenshots" : [{"url":"cc-screenshot-1.png"},{"url":"cc-screenshot-2.png"}], From 7a4f67c342b68cfcdfb02ea6fde9ab317e058125 Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Sat, 19 Feb 2022 19:53:08 +0100 Subject: [PATCH 87/99] Update app.js --- apps/contourclock/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/contourclock/app.js b/apps/contourclock/app.js index 85692da60..cdfadd217 100644 --- a/apps/contourclock/app.js +++ b/apps/contourclock/app.js @@ -10,7 +10,7 @@ if (settings.fontIndex==undefined) { function draw() { var date = new Date(); // Draw day of the week - g.setColor(g.theme.fg); + g.reset(); g.setFont("Teletext10x18Ascii"); g.clearRect(0,138,g.getWidth()-1,176); g.setFontAlign(0,1).drawString(require("locale").dow(date).toUpperCase(),g.getWidth()/2,g.getHeight()-18); From c0921c6a1db1b05f7acb4a2fca133ca170ed0667 Mon Sep 17 00:00:00 2001 From: Richard de Boer Date: Sat, 19 Feb 2022 21:24:13 +0100 Subject: [PATCH 88/99] messages: add Home Assistant icon --- apps/messages/ChangeLog | 1 + apps/messages/app.js | 2 ++ apps/messages/metadata.json | 2 +- 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/apps/messages/ChangeLog b/apps/messages/ChangeLog index 4811cd19b..1290ad089 100644 --- a/apps/messages/ChangeLog +++ b/apps/messages/ChangeLog @@ -31,3 +31,4 @@ 0.19: Use a larger font for message text if it'll fit 0.20: Allow tapping on the body to show a scrollable view of the message and title in a bigger font (fix #1405, #1031) 0.21: Improve list readability on dark theme +0.22: Add Home Assistant icon diff --git a/apps/messages/app.js b/apps/messages/app.js index 4aaf97369..56753995f 100644 --- a/apps/messages/app.js +++ b/apps/messages/app.js @@ -83,6 +83,7 @@ function getMessageImage(msg) { if (s=="calendar") return atob("GBiBAAAAAAAAAAAAAA//8B//+BgAGBgAGBgAGB//+B//+B//+B9m2B//+B//+Btm2B//+B//+Btm+B//+B//+A//8AAAAAAAAAAAAA=="); if (s=="facebook") return getFBIcon(); if (s=="hangouts") return atob("FBaBAAH4AH/gD/8B//g//8P//H5n58Y+fGPnxj5+d+fmfj//4//8H//B//gH/4A/8AA+AAHAABgAAAA="); + if (s=="home assistant") return atob("FhaBAAAAAADAAAeAAD8AAf4AD/3AfP8D7fwft/D/P8ec572zbzbNsOEhw+AfD8D8P4fw/z/D/P8P8/w/z/AAAAA="); if (s=="instagram") return atob("GBiBAAAAAAAAAAAAAAAAAAP/wAYAYAwAMAgAkAh+EAjDEAiBEAiBEAiBEAiBEAjDEAh+EAgAEAwAMAYAYAP/wAAAAAAAAAAAAAAAAA=="); if (s=="gmail") return getNotificationImage(); if (s=="google home") return atob("GBiCAAAAAAAAAAAAAAAAAAAAAoAAAAAACqAAAAAAKqwAAAAAqroAAAACquqAAAAKq+qgAAAqr/qoAACqv/6qAAKq//+qgA6r///qsAqr///6sAqv///6sAqv///6sAqv///6sA6v///6sA6v///qsA6qqqqqsA6qqqqqsA6qqqqqsAP7///vwAAAAAAAAAAAAAAAAA=="); @@ -114,6 +115,7 @@ function getMessageImageCol(msg,def) { "facebook": "#4267b2", "gmail": "#ea4335", "google home": "#fbbc05", + "home assistant": "#fff", // ha-blue is #41bdf5, but that's the background "hangouts": "#1ba261", "instagram": "#dd2a7b", "messenger": "#0078ff", diff --git a/apps/messages/metadata.json b/apps/messages/metadata.json index 6834693ae..e84d9f0d9 100644 --- a/apps/messages/metadata.json +++ b/apps/messages/metadata.json @@ -1,7 +1,7 @@ { "id": "messages", "name": "Messages", - "version": "0.21", + "version": "0.22", "description": "App to display notifications from iOS and Gadgetbridge", "icon": "app.png", "type": "app", From c130fa05d1bda5471239d46cc069863abfc5ec4f Mon Sep 17 00:00:00 2001 From: Richard de Boer Date: Sat, 19 Feb 2022 21:24:35 +0100 Subject: [PATCH 89/99] messages: fix ChangeLog typo --- apps/messages/ChangeLog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/messages/ChangeLog b/apps/messages/ChangeLog index 1290ad089..6b967d566 100644 --- a/apps/messages/ChangeLog +++ b/apps/messages/ChangeLog @@ -15,7 +15,7 @@ 0.10: Respect the 'new' attribute if it was set from iOS integrations 0.11: Open app when touching the widget (Bangle.js 2 only) 0.12: Extra app-specific notification icons - New animated notifcationicon (instead of large blinking 'MESSAGES') + New animated notification icon (instead of large blinking 'MESSAGES') Added screenshots 0.13: Add /*LANG*/ comments for internationalisation Add 'Delete All' option to message options From 60cae6bc8420f709a45fca95008917186681a3db Mon Sep 17 00:00:00 2001 From: Richard de Boer Date: Sun, 13 Feb 2022 15:57:40 +0100 Subject: [PATCH 90/99] gbmusic: Simplify touch controls --- apps/gbmusic/ChangeLog | 1 + apps/gbmusic/README.md | 11 ++++--- apps/gbmusic/app.js | 48 ++++--------------------------- apps/gbmusic/metadata.json | 5 ++-- apps/gbmusic/screenshot_v1.png | Bin 5193 -> 0 bytes apps/gbmusic/screenshot_v1_d.png | Bin 0 -> 15590 bytes apps/gbmusic/screenshot_v1_l.png | Bin 0 -> 5102 bytes apps/gbmusic/screenshot_v2.png | Bin 3432 -> 0 bytes apps/gbmusic/screenshot_v2_d.png | Bin 0 -> 14443 bytes apps/gbmusic/screenshot_v2_l.png | Bin 0 -> 3357 bytes 10 files changed, 14 insertions(+), 51 deletions(-) delete mode 100644 apps/gbmusic/screenshot_v1.png create mode 100644 apps/gbmusic/screenshot_v1_d.png create mode 100644 apps/gbmusic/screenshot_v1_l.png delete mode 100644 apps/gbmusic/screenshot_v2.png create mode 100644 apps/gbmusic/screenshot_v2_d.png create mode 100644 apps/gbmusic/screenshot_v2_l.png diff --git a/apps/gbmusic/ChangeLog b/apps/gbmusic/ChangeLog index 8b1a3e4aa..cf010a771 100644 --- a/apps/gbmusic/ChangeLog +++ b/apps/gbmusic/ChangeLog @@ -7,3 +7,4 @@ 0.07: Fix "previous" button image 0.08: Fix scrolling title background color 0.09: Move event listener from widget to boot code, stops music from showing up in messages +0.10: Simplify touch events diff --git a/apps/gbmusic/README.md b/apps/gbmusic/README.md index 5d06164c2..7bd1486de 100644 --- a/apps/gbmusic/README.md +++ b/apps/gbmusic/README.md @@ -3,9 +3,10 @@ If you have an Android phone with Gadgetbridge, this app allows you to view and control music playback. -| Bangle.js 1 | Bangle.js 2 | -|:-------------------------------------------|:-------------------------------------------| -| ![Screenshot: Bangle 1](screenshot_v1.png) | ![Screenshot: Bangle 2](screenshot_v2.png) | +| Bangle.js 1 | Bangle.js 2 | +|:---------------------------------------------------------|:---------------------------------------------------------| +| ![Screenshot: Bangle 1 Dark theme](screenshot_v1_d.png) | ![Screenshot: Bangle 2 Darm theme](screenshot_v2_d.png) | +| ![Screenshot: Bangle 1 Light theme](screenshot_v1_l.png) | ![Screenshot: Bangle 2 Light theme](screenshot_v2_l.png) | Download the [latest Gadgetbridge for Android here](https://f-droid.org/packages/nodomain.freeyourgadget.gadgetbridge/). @@ -40,9 +41,7 @@ Disable double/triple pressing Middle Button: always simply toggle play/pause. * Button 3 (*Bangle.js 1*): Volume down ### Touch -* Left: Pause/previous song -* Right: Next song/resume -* Center: Toggle play/pause +* Touch: Toggle play/pause * Swipe left/right: Next/previous song * Swipe up/down (*Bangle.js 2*): Volume up/down diff --git a/apps/gbmusic/app.js b/apps/gbmusic/app.js index c8395f745..efcfdac22 100644 --- a/apps/gbmusic/app.js +++ b/apps/gbmusic/app.js @@ -195,9 +195,7 @@ function makeUI() { { type: "h", c: [ {width: 3}, - {id: "prev", type: "custom", height: 15, width: 15, icon: "previous", render: rIcon, bgCol: g.theme.bg}, {id: "date", type: "txt", halign: 0, valign: 1, label: "", font: "8%", fillx: 1, bgCol: g.theme.bg}, - {id: "next", type: "custom", height: 15, width: 15, icon: "next", render: rIcon, bgCol: g.theme.bg}, BANGLE2 ? {width: 3} : {id: "down", type: "txt", label: " -", font: "6x8:2"}, ], }, @@ -295,16 +293,10 @@ function drawDateTime() { } function drawControls() { - let l = layout; + if (BANGLE2) return; const cc = a => (a ? "#f00" : "#0f0"); // control color: red for active, green for inactive - if (!BANGLE2) { - l.up.col = cc("volumeup" in tCommand); - l.down.col = cc("volumedown" in tCommand); - } - l.prev.icon = (stat==="play") ? "pause" : "previous"; - l.prev.col = cc("prev" in tCommand || "pause" in tCommand); - l.next.icon = (stat==="play") ? "next" : "play"; - l.next.col = cc("next" in tCommand || "play" in tCommand); + layout.up.col = cc("volumeup" in tCommand); + layout.down.col = cc("volumedown" in tCommand); layout.render(); } @@ -473,37 +465,16 @@ function sendCommand(command) { drawControls(); } -// touch/swipe: navigation function togglePlay() { sendCommand(stat==="play" ? "pause" : "play"); } -function pausePrev() { - sendCommand(stat==="play" ? "pause" : "previous"); -} -function nextPlay() { - sendCommand(stat==="play" ? "next" : "play"); -} /** * Setup touch+swipe for Bangle.js 1 */ function touch1() { - Bangle.on("touch", side => { - if (!Bangle.isLCDOn()) {return;} // for <2v10 firmware - switch(side) { - case 1: - pausePrev(); - break; - case 2: - nextPlay(); - break; - default: - togglePlay(); - break; - } - }); + Bangle.on("touch", togglePlay); Bangle.on("swipe", dir => { - if (!Bangle.isLCDOn()) {return;} // for <2v10 firmware sendCommand(dir===1 ? "previous" : "next"); }); } @@ -511,16 +482,7 @@ function touch1() { * Setup touch+swipe for Bangle.js 2 */ function touch2() { - Bangle.on("touch", (side, xy) => { - const ar = Bangle.appRect; - if (xy.xar.x+ar.w*2/3) { - nextPlay(); - } else { - togglePlay(); - } - }); + Bangle.on("touch", togglePlay); // swiping let drag; Bangle.on("drag", e => { diff --git a/apps/gbmusic/metadata.json b/apps/gbmusic/metadata.json index f578f1f48..0ded80452 100644 --- a/apps/gbmusic/metadata.json +++ b/apps/gbmusic/metadata.json @@ -2,10 +2,11 @@ "id": "gbmusic", "name": "Gadgetbridge Music Controls", "shortName": "Music Controls", - "version": "0.09", + "version": "0.10", "description": "Control the music on your Gadgetbridge-connected phone", "icon": "icon.png", - "screenshots": [{"url":"screenshot_v1.png"},{"url":"screenshot_v2.png"}], + "screenshots": [{"url":"screenshot_v1_d.png"},{"url":"screenshot_v1_l.png"}, + {"url":"screenshot_v2_d.png"},{"url":"screenshot_v2_l.png"}], "type": "app", "tags": "tools,bluetooth,gadgetbridge,music", "supports": ["BANGLEJS","BANGLEJS2"], diff --git a/apps/gbmusic/screenshot_v1.png b/apps/gbmusic/screenshot_v1.png deleted file mode 100644 index 3b290e4591bd6181e832d864ddfb366681ba8cfa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5193 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 literal 0 HcmV?d00001 diff --git a/apps/gbmusic/screenshot_v1_l.png b/apps/gbmusic/screenshot_v1_l.png new file mode 100644 index 0000000000000000000000000000000000000000..725b21839c519784f11d7f305e0cefd6c501baba GIT binary patch literal 5102 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 diff --git a/apps/gbmusic/screenshot_v2_d.png b/apps/gbmusic/screenshot_v2_d.png new file mode 100644 index 0000000000000000000000000000000000000000..63e502cef6ed8e8a7a1f4e82e54c5321fd32d9c1 GIT binary patch literal 14443 zcmZvDb8scVw`OeHwlT47-`MuVwrv}eiOri#Y-@63+s-5t?)+Z8x3#;qU3JcPQ2j@L zb-GSf*XbBlWf^1y0t7HHFl0GdN%eo&_#c6T`KKE?4voOTSZ90zI_~PGUS!U$PFA)K zmSpZe&X#1B-nLd?VBYJXd|gixp45n)rdT})wCt>~yZmi2*1o>DA~RjBHOuGQ`Alkc ztehAqifc5uGJ&tZq$?i>q+f6Ysb2IeTE6s!U+OAbFh$?K{x`(Fw|NF3F`1XoxZ;XqugB$oIwWV8hvxAb_uyJxh z9$;8mG)Mch%$vn~hZ`C!#(X3z4rOB>r`b+v|;;4=tNbAJ|?H1TLb}->==Qx0axHfxgWi1r03! zw?f8I%UJu!l8oO){RgM%Mp%}wpwEulz(xg5)tfG{FN5FTS?#9x2eC#^+V>nfw<>wMbG9lM8 zz>T?WS<8=@xqZo%v95jDmvGA$3et_W=g+bq>Con`beKJIZ_sUqE$8gF2d0);?l+>i zTV2~DO)W#mC$9D@U`ULi=a%EMkg_vu8SmMlhO*GrBPUCf=YbN>j_ZYE$Ie}kopH_U zR6}2r-JU(@vM#;1A+UkK*rV+eD2bMDQHRfHMc=ru$tWtCw>;gEoN9a2YSl|9my#f6 zRhO_K#yE;mj>)uh+vE9V(An4eou%WS`g5Z-YkT&|qcz*)-dDfTr_;s^)OQ*Y)~)1w zO1V7PQ6ZdNN2^NsIve|H!0q~}7&LIF>y~qLNuX@e4!^n}!O#JXD=z29M1zgh)b;18 zQ;)=-V2DQf)e+27L^Lj90y|B#OS^HyHDSPN%_NC1q>)-trrPCAf9%W)nl}o%-k(FB z#(mZ>whGNFsV+m}1%nVuua(a)zYd70C)`NN1`_a!R&L+zMe zjxujg<>&C4pLrLNJvu-=IV`rw^ePLj*%O_~H>01ikYRt8+Jx4+zvKI_=%hKxnimK? zI##tgT!{Xno$Ysbv6gGIAKI{moH`RwUd(B{4jj2v4TX||(-B&M9GvhI)rru-lHeHy%KY-py&tY%U#GTt zHb%be2p&enDDtBx$y%VW*ntF^$oxseh{@XmKj2rfH@TR^%?VrSG!gm1P{f;0uqqrp zDmH8JHmZzz5)k4vaC`vSXMeU{&(ej_qicS#ljpYB8nnu=L93!Q_#A>Xi}|ifk?3eIkswv{h{E> zKF6U!C8o^{7kf{zVnQ71FA44Vmct>8n6_?g*CHAH%w?o-)&;y@ppcVFMoR7alJASSODnfvLY6j}95Is@3deE8WTlGm9sa) zCbkfP&JbEyvvSU%azRN}4{|WQ<&YdPasiJ9n>PQa_pgm|b*J7AowApY4kG=?ohYtA;tNkq{>kduXmMOrq7eb%zv4AxeQ^GE+*0HNix& zmzwd=Bw1vd9Paf?`vxgDbdZb8zh{ZA*!tej5D#WbXg`~~F?kf~YxP=zrAW*05n%F} zLbyX}fgx~e1CtU-;C}~+hn_db>6vXTB}304&x#816)$+0bqW|Q0tpUj_>gsATqZPj zP!;*z74ynpE

QtnzA2q{yU}n_6iqGK4Yn}iuc%QoCo*m}|2 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 literal 0 HcmV?d00001 diff --git a/apps/gbmusic/screenshot_v2_l.png b/apps/gbmusic/screenshot_v2_l.png new file mode 100644 index 0000000000000000000000000000000000000000..521d304aa4c4c82a30fe974905e3d0132ef31aa8 GIT binary patch literal 3357 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 NbJJ@k6~=B4{{zxVG*|!t literal 0 HcmV?d00001 From ee74900f4acad32ede9580c7115baac8fa923780 Mon Sep 17 00:00:00 2001 From: Benjamin_6848 <83084481+Benjamin-6848@users.noreply.github.com> Date: Sat, 19 Feb 2022 22:54:50 +0100 Subject: [PATCH 91/99] Bold Clock: Removed "wake LCD on face-up" Removed "wake LCD on face-up"-feature of Bold Clock: A watch-face should not set things like "wake LCD on face-up". If you want, that the LCD get activated when facing up, go to Settings > System > LCD > Wake on FaceUp. --- apps/boldclk/bold_clock.js | 8 -------- 1 file changed, 8 deletions(-) diff --git a/apps/boldclk/bold_clock.js b/apps/boldclk/bold_clock.js index 4358b2e29..9d3ea0756 100644 --- a/apps/boldclk/bold_clock.js +++ b/apps/boldclk/bold_clock.js @@ -129,14 +129,6 @@ Bangle.on('lcdPower', (on) => { 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.loadWidgets(); From 2b49fbaa9ab0050a550a8685b64241e7dca7c476 Mon Sep 17 00:00:00 2001 From: Benjamin_6848 <83084481+Benjamin-6848@users.noreply.github.com> Date: Sat, 19 Feb 2022 22:59:37 +0100 Subject: [PATCH 92/99] Bold Clock: Removed "wake LCD on face-up" Removed "wake LCD on face-up"-feature of Bold Clock: A watch-face should not set things like "wake LCD on face-up". If you want, that the LCD get activated when facing up, go to Settings > System > LCD > Wake on FaceUp. --- apps/boldclk/ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/boldclk/ChangeLog b/apps/boldclk/ChangeLog index c7a4ba7b4..30ac31c61 100644 --- a/apps/boldclk/ChangeLog +++ b/apps/boldclk/ChangeLog @@ -2,3 +2,4 @@ 0.03: Tweak for more efficient rendering, and firmware 2v06 0.04: Work with themes, smaller screens 0.05: Adjust hand lengths to be within 'tick' points +0.06: Removed "wake LCD on face-up"-feature: A watch-face should not set things like "wake LCD on face-up". From 74646002afbc3f3f75f02f9f5356f75ed613a25d Mon Sep 17 00:00:00 2001 From: Benjamin_6848 <83084481+Benjamin-6848@users.noreply.github.com> Date: Sat, 19 Feb 2022 23:00:50 +0100 Subject: [PATCH 93/99] Bold Clock: Removed "wake LCD on face-up" Removed "wake LCD on face-up"-feature of Bold Clock: A watch-face should not set things like "wake LCD on face-up". If you want, that the LCD get activated when facing up, go to Settings > System > LCD > Wake on FaceUp. --- apps/boldclk/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/boldclk/metadata.json b/apps/boldclk/metadata.json index 7e3941cb3..cf961347d 100644 --- a/apps/boldclk/metadata.json +++ b/apps/boldclk/metadata.json @@ -1,7 +1,7 @@ { "id": "boldclk", "name": "Bold Clock", - "version": "0.05", + "version": "0.06", "description": "Simple, readable and practical clock", "icon": "bold_clock.png", "screenshots": [{"url":"screenshot_bold.png"}], From f20872f6ae2cd2fbdb1b39489da525343ab5f217 Mon Sep 17 00:00:00 2001 From: Jeroen Peters Date: Sat, 19 Feb 2022 23:59:23 +0100 Subject: [PATCH 94/99] #1132: Messages: Allow disabling repetition of buzzer: Wow, dazzling solution --- apps/messages/metadata.json | 2 +- apps/messages/widget.js | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/apps/messages/metadata.json b/apps/messages/metadata.json index 93c1d573d..0ff2603c2 100644 --- a/apps/messages/metadata.json +++ b/apps/messages/metadata.json @@ -1,7 +1,7 @@ { "id": "messages", "name": "Messages", - "version": "0.55", + "version": "0.43", "description": "App to display notifications from iOS and Gadgetbridge/Android", "icon": "app.png", "type": "app", diff --git a/apps/messages/widget.js b/apps/messages/widget.js index db9c42409..4a247b917 100644 --- a/apps/messages/widget.js +++ b/apps/messages/widget.js @@ -6,10 +6,9 @@ draw:function() { g.reset().clearRect(this.x, this.y, this.x+this.width, this.y+this.iconwidth); g.drawImage((c&1) ? atob("GBiBAAAAAAAAAAAAAAAAAAAAAB//+DAADDAADDAADDwAPD8A/DOBzDDn/DA//DAHvDAPvjAPvjAPvjAPvh///gf/vAAD+AAB8AAAAA==") : atob("GBiBAAAAAAAAAAAAAAAAAAAAAB//+D///D///A//8CP/xDj/HD48DD+B8D/D+D/3vD/vvj/vvj/vvj/vvh/v/gfnvAAD+AAB8AAAAA=="), this.x, this.y); let settings = require('Storage').readJSON("messages.settings.json", true) || {}; + console.log("dingen ", typeof(settings.repeat), settings.repeat) if (settings.repeat===undefined) settings.repeat = 4; - if(settings.repeat===0) { - if(c===1) WIDGETS["messages"].buzz(); // buzz just once - } else if (csettings.repeat*1000) { + if (c<120 && (Date.now()-this.l)>settings.repeat*1000) { this.l = Date.now(); WIDGETS["messages"].buzz(); // buzz every 4 seconds } From 32273ed1587d0a287e43453e8d58481f27717825 Mon Sep 17 00:00:00 2001 From: Richard de Boer Date: Sun, 13 Feb 2022 16:49:28 +0100 Subject: [PATCH 95/99] gbmusic: remove date+time --- apps/gbmusic/ChangeLog | 1 + apps/gbmusic/README.md | 1 - apps/gbmusic/app.js | 62 ++++++------------------------- apps/gbmusic/screenshot_v1_d.png | Bin 15590 -> 13284 bytes apps/gbmusic/screenshot_v1_l.png | Bin 5102 -> 8967 bytes apps/gbmusic/screenshot_v2_d.png | Bin 14443 -> 11408 bytes apps/gbmusic/screenshot_v2_l.png | Bin 3357 -> 13929 bytes 7 files changed, 12 insertions(+), 52 deletions(-) diff --git a/apps/gbmusic/ChangeLog b/apps/gbmusic/ChangeLog index cf010a771..e2ee53ede 100644 --- a/apps/gbmusic/ChangeLog +++ b/apps/gbmusic/ChangeLog @@ -8,3 +8,4 @@ 0.08: Fix scrolling title background color 0.09: Move event listener from widget to boot code, stops music from showing up in messages 0.10: Simplify touch events + Remove date+time diff --git a/apps/gbmusic/README.md b/apps/gbmusic/README.md index 7bd1486de..f1f9c4378 100644 --- a/apps/gbmusic/README.md +++ b/apps/gbmusic/README.md @@ -15,7 +15,6 @@ Download the [latest Gadgetbridge for Android here](https://f-droid.org/packages * Dynamic colors based on Track/Artist/Album name * Scrolling display for long titles * Automatic start when music plays -* Time and date display ## Settings diff --git a/apps/gbmusic/app.js b/apps/gbmusic/app.js index efcfdac22..5252ac0ac 100644 --- a/apps/gbmusic/app.js +++ b/apps/gbmusic/app.js @@ -10,15 +10,15 @@ const BANGLE2 = process.env.HWVERSION===2; /** * @param {string} text - * @return {number} Maximum font size to make text fit on screen + * @param {number} w Width to fit text in + * @return {number} Maximum font size to make text fit */ -function fitText(text) { +function fitText(text, w) { if (!text.length) { return Infinity; } // make a guess, then shrink/grow until it fits - const w = Bangle.appRect.w, - test = (s) => g.setFont("Vector", s).stringWidth(text); + const test = (s) => g.setFont("Vector", s).stringWidth(text); let best = Math.floor(100*w/test(100)); if (test(best)===w) { // good guess! return best; @@ -106,7 +106,7 @@ function rTitle(l) { rScroller(l); // already scrolling return; } - let size = fitText(l.label); + let size = fitText(l.label, l.w); if (sizel.h) { size = l.h; } @@ -182,21 +182,17 @@ function makeUI() { type: "v", c: [ { type: "h", fillx: 1, c: [ - {id: "time", type: "txt", label: "88:88", valign: -1, halign: -1, font: "8%", bgCol: g.theme.bg}, {fillx: 1}, - {id: "num", type: "txt", label: "88:88", valign: -1, halign: 1, font: "12%", bgCol: g.theme.bg}, - BANGLE2 ? {} : {id: "up", type: "txt", label: " +", font: "6x8:2"}, + {id: "num", type: "txt", label: "", valign: -1, halign: -1, font: "12%", bgCol: g.theme.bg}, + BANGLE2 ? {} : {id: "up", type: "txt", label: " +", halign: 1, font: "6x8:2"}, ], }, {id: "title", type: "custom", label: "", fillx: 1, filly: 2, offset: null, font: "Vector:20%", render: rTitle, bgCol: g.theme.bg}, {id: "artist", type: "custom", label: "", fillx: 1, filly: 1, size: 30, render: rInfo, bgCol: g.theme.bg}, - {id: "album", type: "custom", label: "", fillx: 1, filly: 1, size: 20, render: rInfo, bgCol: g.theme.bg}, - {height: 10}, { type: "h", c: [ - {width: 3}, - {id: "date", type: "txt", halign: 0, valign: 1, label: "", font: "8%", fillx: 1, bgCol: g.theme.bg}, - BANGLE2 ? {width: 3} : {id: "down", type: "txt", label: " -", font: "6x8:2"}, + {id: "album", type: "custom", label: "", fillx: 1, filly: 1, size: 20, render: rInfo, bgCol: g.theme.bg}, + BANGLE2 ? {} : {id: "down", type: "txt", label: " -", font: "6x8:2"}, ], }, {height: 10}, @@ -209,20 +205,6 @@ function makeUI() { // Self-repeating timeouts /////////////////////// -// Clock -let tock = -1; -function tick() { - if (!BANGLE2 && !Bangle.isLCDOn()) { - return; - } - const now = new Date(); - if (now.getHours()*60+now.getMinutes()!==tock) { - drawDateTime(); - tock = now.getHours()*60+now.getMinutes(); - } - setTimeout(tick, 1000); // we only show minute precision anyway -} - // Fade out while paused and auto closing let fade = null; function fadeOut() { @@ -269,28 +251,6 @@ function scrollStop() { //////////////////// // Drawing functions //////////////////// -/** - * Draw date and time - */ -function drawDateTime() { - const now = new Date(); - const l = require("locale"); - const is12 = (require("Storage").readJSON("setting.json", 1) || {})["12hour"]; - if (is12) { - const d12 = new Date(now.getTime()); - const hour = d12.getHours(); - if (hour===0) { - d12.setHours(12); - } else if (hour>12) { - d12.setHours(hour-12); - } - layout.time.label = l.time(d12, true)+l.meridian(now); - } else { - layout.time.label = l.time(now, true); - } - layout.date.label = require("locale").date(now, true); - layout.render(); -} function drawControls() { if (BANGLE2) return; @@ -331,6 +291,7 @@ function info(info) { layout.album.col = infoColor("album"); layout.artist.col = infoColor("artist"); layout.num.label = formatNum(info); + layout.update(); layout.render(); rTitle(layout.title); // force redraw of title, or scroller might break // reset auto exit interval @@ -557,7 +518,6 @@ function startWatches() { function start() { makeUI(); startWatches(); - tick(); startEmulator(); } diff --git a/apps/gbmusic/screenshot_v1_d.png b/apps/gbmusic/screenshot_v1_d.png index c85e8b8a6c400658e82c8c5dbd274f39fb41e7a6..3a6d84cffed4ca998a5f78bb299aa3b0fd2dfaae 100644 GIT binary patch literal 13284 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 diff --git a/apps/gbmusic/screenshot_v1_l.png b/apps/gbmusic/screenshot_v1_l.png index 725b21839c519784f11d7f305e0cefd6c501baba..1b6b57809cb905b4ba34c4440f671b0799f218f0 100644 GIT binary patch literal 8967 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 E52X)jJOBUy literal 14443 zcmZvDb8scVw`OeHwlT47-`MuVwrv}eiOri#Y-@63+s-5t?)+Z8x3#;qU3JcPQ2j@L zb-GSf*XbBlWf^1y0t7HHFl0GdN%eo&_#c6T`KKE?4voOTSZ90zI_~PGUS!U$PFA)K zmSpZe&X#1B-nLd?VBYJXd|gixp45n)rdT})wCt>~yZmi2*1o>DA~RjBHOuGQ`Alkc ztehAqifc5uGJ&tZq$?i>q+f6Ysb2IeTE6s!U+OAbFh$?K{x`(Fw|NF3F`1XoxZ;XqugB$oIwWV8hvxAb_uyJxh z9$;8mG)Mch%$vn~hZ`C!#(X3z4rOB>r`b+v|;;4=tNbAJ|?H1TLb}->==Qx0axHfxgWi1r03! zw?f8I%UJu!l8oO){RgM%Mp%}wpwEulz(xg5)tfG{FN5FTS?#9x2eC#^+V>nfw<>wMbG9lM8 zz>T?WS<8=@xqZo%v95jDmvGA$3et_W=g+bq>Con`beKJIZ_sUqE$8gF2d0);?l+>i zTV2~DO)W#mC$9D@U`ULi=a%EMkg_vu8SmMlhO*GrBPUCf=YbN>j_ZYE$Ie}kopH_U zR6}2r-JU(@vM#;1A+UkK*rV+eD2bMDQHRfHMc=ru$tWtCw>;gEoN9a2YSl|9my#f6 zRhO_K#yE;mj>)uh+vE9V(An4eou%WS`g5Z-YkT&|qcz*)-dDfTr_;s^)OQ*Y)~)1w zO1V7PQ6ZdNN2^NsIve|H!0q~}7&LIF>y~qLNuX@e4!^n}!O#JXD=z29M1zgh)b;18 zQ;)=-V2DQf)e+27L^Lj90y|B#OS^HyHDSPN%_NC1q>)-trrPCAf9%W)nl}o%-k(FB z#(mZ>whGNFsV+m}1%nVuua(a)zYd70C)`NN1`_a!R&L+zMe zjxujg<>&C4pLrLNJvu-=IV`rw^ePLj*%O_~H>01ikYRt8+Jx4+zvKI_=%hKxnimK? zI##tgT!{Xno$Ysbv6gGIAKI{moH`RwUd(B{4jj2v4TX||(-B&M9GvhI)rru-lHeHy%KY-py&tY%U#GTt zHb%be2p&enDDtBx$y%VW*ntF^$oxseh{@XmKj2rfH@TR^%?VrSG!gm1P{f;0uqqrp zDmH8JHmZzz5)k4vaC`vSXMeU{&(ej_qicS#ljpYB8nnu=L93!Q_#A>Xi}|ifk?3eIkswv{h{E> zKF6U!C8o^{7kf{zVnQ71FA44Vmct>8n6_?g*CHAH%w?o-)&;y@ppcVFMoR7alJASSODnfvLY6j}95Is@3deE8WTlGm9sa) zCbkfP&JbEyvvSU%azRN}4{|WQ<&YdPasiJ9n>PQa_pgm|b*J7AowApY4kG=?ohYtA;tNkq{>kduXmMOrq7eb%zv4AxeQ^GE+*0HNix& zmzwd=Bw1vd9Paf?`vxgDbdZb8zh{ZA*!tej5D#WbXg`~~F?kf~YxP=zrAW*05n%F} zLbyX}fgx~e1CtU-;C}~+hn_db>6vXTB}304&x#816)$+0bqW|Q0tpUj_>gsATqZPj zP!;*z74ynpE

QtnzA2q{yU}n_6iqGK4Yn}iuc%QoCo*m}|2 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 diff --git a/apps/gbmusic/screenshot_v2_l.png b/apps/gbmusic/screenshot_v2_l.png index 521d304aa4c4c82a30fe974905e3d0132ef31aa8..5cf05c7cb036c0d98662057318804a8165571c0c 100644 GIT binary patch literal 13929 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 literal 3357 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 NbJJ@k6~=B4{{zxVG*|!t From 71e60eda00a44d9fc253d4ddff122c092a0893d5 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Mon, 21 Feb 2022 10:25:56 +0000 Subject: [PATCH 96/99] stop cadence needing GPS - fix #1480 --- modules/exstats.js | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/exstats.js b/modules/exstats.js index 8890ae9db..8a726a5de 100644 --- a/modules/exstats.js +++ b/modules/exstats.js @@ -207,7 +207,6 @@ exports.getStats = function(statIDs, options) { }; } if (statIDs.includes("caden")) { - needGPS = true; stats["caden"]={ title : "Cadence", getValue : function() { return state.stepsPerMin; }, From 580497b1e7be9d10256f41a277fc4a189efe4c56 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Mon, 21 Feb 2022 10:55:22 +0000 Subject: [PATCH 97/99] Fix Layout module rendering black text on white --- modules/Layout.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/Layout.js b/modules/Layout.js index 134cc8103..1b0bbd47f 100644 --- a/modules/Layout.js +++ b/modules/Layout.js @@ -232,7 +232,7 @@ Layout.prototype.render = function (l) { function render(l) {"ram" g.reset(); - if (l.col) g.setColor(l.col); + if (l.col!==undefined) g.setColor(l.col); if (l.bgCol!==undefined) g.setBgColor(l.bgCol).clearRect(l.x,l.y,l.x+l.w-1,l.y+l.h-1); cb[l.type](l); } @@ -264,7 +264,7 @@ Layout.prototype.render = function (l) { x,y+4 ], bg = l.selected?g.theme.bgH:g.theme.bg2; g.setColor(bg).fillPoly(poly).setColor(l.selected ? g.theme.fgH : g.theme.fg2).drawPoly(poly); - if (l.col) g.setColor(l.col); + if (l.col!==undefined) g.setColor(l.col); if (l.src) g.setBgColor(bg).drawImage("function"==typeof l.src?l.src():l.src, l.x + 10 + (0|l.pad), l.y + 8 + (0|l.pad)); else g.setFont("6x8",2).setFontAlign(0,0,l.r).drawString(l.label,l.x+l.w/2,l.y+l.h/2); }, "img":function(l){ From 7a7462e714cca75a2346af082c5097b8d7ee4423 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Mon, 21 Feb 2022 11:08:44 +0000 Subject: [PATCH 98/99] 0.07: Fix crash if an odd number of active boxes are configured (fix #1473) --- apps/run/ChangeLog | 1 + apps/run/app.js | 12 ++++++------ apps/run/metadata.json | 2 +- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/apps/run/ChangeLog b/apps/run/ChangeLog index fd28c4414..0d61aa789 100644 --- a/apps/run/ChangeLog +++ b/apps/run/ChangeLog @@ -5,3 +5,4 @@ 0.04: Use the exstats module, and make what is displayed configurable 0.05: exstats updated so update 'distance' label is updated, option for 'speed' 0.06: Add option to record a run using the recorder app automatically +0.07: Fix crash if an odd number of active boxes are configured (fix #1473) diff --git a/apps/run/app.js b/apps/run/app.js index a8515a71a..bc1d54de2 100644 --- a/apps/run/app.js +++ b/apps/run/app.js @@ -62,14 +62,14 @@ for (var i=0;ilayout[e.id].label = e.getString()); - sb.on('changed', e=>layout[e.id].label = e.getString()); + if (sa) sa.on('changed', e=>layout[e.id].label = e.getString()); + if (sb) sb.on('changed', e=>layout[e.id].label = e.getString()); } // At the bottom put time/GPS state/etc lc.push({ type:"h", filly:1, c:[ diff --git a/apps/run/metadata.json b/apps/run/metadata.json index ea68f4734..7aabf8b53 100644 --- a/apps/run/metadata.json +++ b/apps/run/metadata.json @@ -1,6 +1,6 @@ { "id": "run", "name": "Run", - "version":"0.06", + "version":"0.07", "description": "Displays distance, time, steps, cadence, pace and more for runners.", "icon": "app.png", "tags": "run,running,fitness,outdoors,gps", From b77578333337250e21133a46bbd83388f2f11e52 Mon Sep 17 00:00:00 2001 From: David Peer Date: Mon, 21 Feb 2022 19:19:08 +0100 Subject: [PATCH 99/99] Bugfix: Ensure that widgets are always hidden in fulscreen mode. --- apps/neonx/ChangeLog | 3 ++- apps/neonx/metadata.json | 2 +- apps/neonx/neonx.app.js | 28 +++++++++++++++------------- 3 files changed, 18 insertions(+), 15 deletions(-) diff --git a/apps/neonx/ChangeLog b/apps/neonx/ChangeLog index 968d6d629..2e815a449 100644 --- a/apps/neonx/ChangeLog +++ b/apps/neonx/ChangeLog @@ -1,3 +1,4 @@ 0.01: Initial release 0.02: Optional fullscreen mode -0.03: Optional show lock status via color \ No newline at end of file +0.03: Optional show lock status via color +0.04: Ensure that widgets are always hidden in fullscreen mode \ No newline at end of file diff --git a/apps/neonx/metadata.json b/apps/neonx/metadata.json index 4ac7c4cea..840e5b82e 100644 --- a/apps/neonx/metadata.json +++ b/apps/neonx/metadata.json @@ -2,7 +2,7 @@ "id": "neonx", "name": "Neon X & IO X Clock", "shortName": "Neon X Clock", - "version": "0.03", + "version": "0.04", "description": "Pebble Neon X & Neon IO X for Bangle.js", "icon": "neonx.png", "type": "clock", diff --git a/apps/neonx/neonx.app.js b/apps/neonx/neonx.app.js index 6a8b933e5..4b9231b0e 100644 --- a/apps/neonx/neonx.app.js +++ b/apps/neonx/neonx.app.js @@ -74,6 +74,12 @@ function drawLine(poly, thickness){ function drawClock(num){ let tx, ty; + if(settings.fullscreen){ + g.clearRect(0,0,screenWidth,screenHeight); + } else { + g.clearRect(0,24,240,240); + } + for (let x = 0; x <= 1; x++) { for (let y = 0; y <= 1; y++) { const current = ((y + 1) * 2 + x - 1); @@ -106,6 +112,14 @@ function drawClock(num){ function draw(date){ queueDraw(); + // Depending on the settings, we clear all widgets or draw those. + if(settings.fullscreen){ + for (let wd of WIDGETS) {wd.draw=()=>{};wd.area="";} + } else { + Bangle.drawWidgets(); + } + + // Now lets draw the time/date let d = new Date(); let l1, l2; @@ -126,12 +140,6 @@ function draw(date){ l2 = ('0' + d.getMinutes()).substr(-2); } - if(settings.fullscreen){ - g.clearRect(0,0,screenWidth,screenHeight); - } else { - g.clearRect(0,24,240,240); - } - drawClock([l1, l2]); } @@ -175,12 +183,6 @@ Bangle.on('lock', function(isLocked) { */ g.clear(1); Bangle.setUI("clock"); -draw(); - Bangle.loadWidgets(); -if(settings.fullscreen){ - for (let wd of WIDGETS) {wd.draw=()=>{};wd.area="";} -} else { - Bangle.drawWidgets(); -} \ No newline at end of file +draw(); \ No newline at end of file