From 6315a192d656e1d3e50cf1358d72fc5f53aed886 Mon Sep 17 00:00:00 2001 From: Richard de Boer Date: Tue, 1 Feb 2022 21:10:15 +0100 Subject: [PATCH 01/23] android: Include charging state in battery updates to phone --- apps/android/ChangeLog | 1 + apps/android/boot.js | 3 ++- apps/android/metadata.json | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/apps/android/ChangeLog b/apps/android/ChangeLog index 0d837fe432..59cb23a464 100644 --- a/apps/android/ChangeLog +++ b/apps/android/ChangeLog @@ -5,3 +5,4 @@ 0.04: Android icon now goes to settings page with 'find phone' 0.05: Fix handling of message actions 0.06: Option to keep messages after a disconnect (default false) (fix #1186) +0.07: Include charging state in battery updates to phone diff --git a/apps/android/boot.js b/apps/android/boot.js index fff9ad4447..eb3d26c6e6 100644 --- a/apps/android/boot.js +++ b/apps/android/boot.js @@ -50,8 +50,9 @@ }; // Battery monitor - function sendBattery() { gbSend({ t: "status", bat: E.getBattery() }); } + function sendBattery() { gbSend({ t: "status", bat: E.getBattery(), chg: Bangle.isCharging()?1:0 }); } NRF.on("connect", () => setTimeout(sendBattery, 2000)); + Bangle.on("charging", sendBattery); if (!settings.keep) NRF.on("disconnect", () => require("messages").clearAll()); // remove all messages on disconnect setInterval(sendBattery, 10*60*1000); diff --git a/apps/android/metadata.json b/apps/android/metadata.json index 6b780ff550..d126b869a4 100644 --- a/apps/android/metadata.json +++ b/apps/android/metadata.json @@ -2,7 +2,7 @@ "id": "android", "name": "Android Integration", "shortName": "Android", - "version": "0.06", + "version": "0.07", "description": "Display notifications/music/etc sent from the Gadgetbridge app on Android. This replaces the old 'Gadgetbridge' Bangle.js widget.", "icon": "app.png", "tags": "tool,system,messages,notifications,gadgetbridge", From f131426976dde581923bbe4b1a3aa940a7f636ef Mon Sep 17 00:00:00 2001 From: Richard de Boer Date: Tue, 1 Feb 2022 21:10:26 +0100 Subject: [PATCH 02/23] gbridge: Include charging state in battery updates to phone --- apps/gbridge/ChangeLog | 1 + apps/gbridge/PROTOCOL.md | 3 ++- apps/gbridge/metadata.json | 2 +- apps/gbridge/widget.js | 3 ++- 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/apps/gbridge/ChangeLog b/apps/gbridge/ChangeLog index 67d421f336..059767ece0 100644 --- a/apps/gbridge/ChangeLog +++ b/apps/gbridge/ChangeLog @@ -26,3 +26,4 @@ 0.24: tag HRM power requests to allow this to work alongside other widgets/apps (fix #799) 0.25: workaround call notification Fix inflated step number +0.26: Include charging status in battery updates to phone diff --git a/apps/gbridge/PROTOCOL.md b/apps/gbridge/PROTOCOL.md index 1fd0ddb4aa..7191ca0b14 100644 --- a/apps/gbridge/PROTOCOL.md +++ b/apps/gbridge/PROTOCOL.md @@ -11,11 +11,12 @@ t can be one of "info", "warn", "error" ## report battery level ``` -{ "t": "status", "bat": 30, "volt": 30 } +{ "t": "status", "bat": 30, "volt": 30, "chg": 0 } ``` * bat is in range 0 to 100 * volt is optional and should be greater than 0 +* chg is optional and should be either 0 or 1 to indicate the watch is charging ## find phone diff --git a/apps/gbridge/metadata.json b/apps/gbridge/metadata.json index cdbc95c110..0c46aa852c 100644 --- a/apps/gbridge/metadata.json +++ b/apps/gbridge/metadata.json @@ -1,7 +1,7 @@ { "id": "gbridge", "name": "Gadgetbridge", - "version": "0.25", + "version": "0.26", "description": "(NOT RECOMMENDED) Displays Gadgetbridge notifications from Android. Please use the 'Android' Bangle.js app instead.", "icon": "app.png", "type": "widget", diff --git a/apps/gbridge/widget.js b/apps/gbridge/widget.js index 7cb7147ec0..3b5f2c7808 100644 --- a/apps/gbridge/widget.js +++ b/apps/gbridge/widget.js @@ -256,7 +256,7 @@ } function sendBattery() { - gbSend({ t: "status", bat: E.getBattery() }); + gbSend({ t: "status", bat: E.getBattery(), chg: Bangle.isCharging()?1:0 }); } // Send a summary of activity to Gadgetbridge @@ -268,6 +268,7 @@ // Battery monitor NRF.on("connect", () => setTimeout(sendBattery, 2000)); + Bangle.on("charging", sendBattery); setInterval(sendBattery, 10*60*1000); sendBattery(); // Activity monitor From 704fdb5a35fb07e0cd379f1fd4b29d627212e9b9 Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Wed, 2 Feb 2022 21:31:44 +0100 Subject: [PATCH 03/23] Recorder - Extract number from file name for overwrite prompt --- apps/recorder/ChangeLog | 1 + apps/recorder/metadata.json | 2 +- apps/recorder/widget.js | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/recorder/ChangeLog b/apps/recorder/ChangeLog index d9d94bc0fb..890d973890 100644 --- a/apps/recorder/ChangeLog +++ b/apps/recorder/ChangeLog @@ -12,3 +12,4 @@ Record all HRM events Move recording for CoreTemp to its own app 0.08: Memory usage improvements for recorder app itself +0.09: Show correct number for log in overwrite prompt diff --git a/apps/recorder/metadata.json b/apps/recorder/metadata.json index 62d487a954..d235628375 100644 --- a/apps/recorder/metadata.json +++ b/apps/recorder/metadata.json @@ -2,7 +2,7 @@ "id": "recorder", "name": "Recorder", "shortName": "Recorder", - "version": "0.08", + "version": "0.09", "description": "Record GPS position, heart rate and more in the background, then download to your PC.", "icon": "app.png", "tags": "tool,outdoors,gps,widget", diff --git a/apps/recorder/widget.js b/apps/recorder/widget.js index de465b7c1a..742d373a47 100644 --- a/apps/recorder/widget.js +++ b/apps/recorder/widget.js @@ -228,7 +228,7 @@ },setRecording:function(isOn) { var settings = loadSettings(); if (isOn && !settings.recording && require("Storage").list(settings.file).length) - return E.showPrompt("Overwrite\nLog 0?",{title:"Recorder",buttons:{Yes:"yes",No:"no"}}).then(selection=>{ + return E.showPrompt("Overwrite\nLog " + settings.file.match(/\d+/)[0] + "?",{title:"Recorder",buttons:{Yes:"yes",No:"no"}}).then(selection=>{ if (selection=="no") return false; // just cancel if (selection=="yes") require("Storage").open(settings.file,"r").erase(); // TODO: Add 'new file' option From 57e325548f9a4a89b5a3405f10b97f638e0c677e Mon Sep 17 00:00:00 2001 From: hughbarney Date: Wed, 2 Feb 2022 22:35:06 +0000 Subject: [PATCH 04/23] Lazybones: idle timer based on step threshold --- apps/lazybones/ChangeLog | 1 + apps/lazybones/README.md | 5 + apps/lazybones/lazybones.app.js | 204 +++++++++++++++++++++++++++++++ apps/lazybones/lazybones.icon.js | 1 + apps/lazybones/lazybones.png | Bin 0 -> 1547 bytes apps/lazybones/metadata.json | 15 +++ 6 files changed, 226 insertions(+) create mode 100644 apps/lazybones/ChangeLog create mode 100644 apps/lazybones/README.md create mode 100644 apps/lazybones/lazybones.app.js create mode 100644 apps/lazybones/lazybones.icon.js create mode 100644 apps/lazybones/lazybones.png create mode 100644 apps/lazybones/metadata.json diff --git a/apps/lazybones/ChangeLog b/apps/lazybones/ChangeLog new file mode 100644 index 0000000000..9db0e26c52 --- /dev/null +++ b/apps/lazybones/ChangeLog @@ -0,0 +1 @@ +0.01: first release diff --git a/apps/lazybones/README.md b/apps/lazybones/README.md new file mode 100644 index 0000000000..2fe597234a --- /dev/null +++ b/apps/lazybones/README.md @@ -0,0 +1,5 @@ +# Simplest Clock + +The simplest working clock, acts as a tutorial piece + +![](screenshot.jpg) diff --git a/apps/lazybones/lazybones.app.js b/apps/lazybones/lazybones.app.js new file mode 100644 index 0000000000..6af26d6bcb --- /dev/null +++ b/apps/lazybones/lazybones.app.js @@ -0,0 +1,204 @@ +Graphics.prototype.setFontRoboto = function(scale) { + // Actual height 21 (20 - 0) + this.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAH/zA/+YAAAAAAAHwAAwAAHwAA+AAAAAAAAAAAQACDAAYbADP4B/8A/zAGYZADH4A/+A/7AHYYADCAAAAAAAQAeHgH4eBzgwMMHnhw88GGBw4wHj+AcPgAAAAAAAAAAB4AA/gAGMAAwhwGMcAfuABzgABzgAc+AOMYBhBAAMYAB/AAHwAAAAAHwD5+A/8YGPDAw8YGPzA/HYD4fAADwAB/AAOYAABAAAAHwAA4AAAAAAAAAAH/gD//B8A+cAA7AADAAAAAAAYAAbwAHHgHwf/4A/8AAAAEAABiAAGwAA8AA/AAH+AAGwAByAAEAAAAAAAMAABgAAMAABgAH/wA/+AAMAABgAAMAABgAAAAAAAIAAfAADwAAAABgAAMAABgAAMAABgAAAAAAAAAAAAADAAAYAAAAAAAAADgAB8AB+AA+AA+AA/AAHAAAgAAAAAAB8AB/8Af/wHAHAwAYGADAwAYHAHAf/wB/8AAAAAAAAAAABgAAcAADAAAYAAH//A//4AAAAAAAAAAAAAAAAAAAAABwDAeA4HAPAwHYGBzAwcYHHDAfwYB8DAAAYAAAAAAABgOAcBwHADAwwYGGDAwwYHPHAf/wB58AAAAAAAAADAAB4AAfAAPYAHjAB4YA8DAH//A//4AAYAADAAAAAAAAAEMA/xwH+HAxgYGMDAxgYGODAw/4GD+AAHAAAAAAAAAf8AP/wD2HA5wYGMDAxgYGOHAA/wAD8AAAAAAAAAAAGAAAwAAGADAwB4GB+Aw+AGfAA/gAHwAAwAAAAAAADAB5+Af/wHPDAwwYGGDAwwYHPHAfvwB58AAAAAAAAAAAB+AAf4AHDjAwMYGBjAwM4HDOAf/gB/4AAAAAAAAAAAAYDADAYAAAAAAAAAAYDAfAYHwAAAABAAAcAADgAA+AAGwAB3AAMYABjgAYMAAAAAAAAAAAAAAABmAAMwABmAAMwABmAAMwABmAAMwAAiAAAAAAAAAYMADjgAMYAB3AAGwAA2AADgAAcAABAAAAAAAAAMAADgAA4AAGBzAweYGHAA/wAD8AAEAAAAwAB/4A/PwOAGDgAYYPxmH/Mw4ZmMDMxgZmM+Mx/5mHDAYAIDgDAPBwAf8AAMAAAAAAAYAAfAAPwAP4AH+AH4wA8GAH4wAP2AAPwAAfwAAfAAAYAAAAAAAAAAA//4H//AwwYGGDAwwYGGDAwwYH/HAf/wB58AAAAADAAH/AD/+AcBwHADAwAYGADAwAYGADA4A4DweAODgAAAAAAAAAAAAAAH//A//4GADAwAYGADAwAYGADAYAwD4+AP/gAfwAAAAAAAAAAAH//A//4GDDAwYYGDDAwYYGDDAwYYGCDAgAYAAAAAAAH//A//4GDAAwYAGDAAwYAGDAAwYAGAAAAAAAAAAH/AD/8AcBwHAHAwAYGADAwYYGDDA4YYDz/AOfwAAAAAAAAAAA//4H//A//4ADAAAYAADAAAYAADAAAYAADAA//4H//AAAAAAAAAAAAAAA//4H//AAAAAAAAABAAAeAAB4AADAAAYAADAAAYAAHA//wH/8AAAAAAAAAAAAAAA//4H//AAcAAPAAD4AA/wAOPADg8A4B4GAHAgAYAAAAAAAH//A//4AADAAAYAADAAAYAADAAAYAADAAAAAAAA//4H//A+AAB+AAD8AAD8AAH4AAPAAH4AH4AD8AD8AA+AAH//A//4AAAAAAAH//A//4H//AeAAB8AADwAAPgAAeAAA8AADwH//A//4AAAAAAAAAAAH/AB/8AeDwHAHAwAYGADAwAYGADA4A4DweAP/gA/4AAAAAAAAAAAH//A//4GBgAwMAGBgAwMAGBgAwcAH/AAfwAA8AAAAAA/4AP/gDgOA4A4GADAwAYGADAwAYHAHgeD+B/8wD+GAAAAAAAAAAA//4H//AwYAGDAAwYAGDgAweAHH8Afz4B8HAAAIAAYAPDwD8OA5w4GGDAwwYGHDAwYYHDnAePwBw8AAAAGAAAwAAGAAAwAAGAAA//4H//AwAAGAAAwAAGAAAwAAAAAAAAAH/4A//wAAPAAAYAADAAAYAADAAAYAAPA//wH/8AAAAAAAAgAAHAAA/AAB/AAD+AAD+AAD4AAfAAfwAfwAfwAH4AA4AAEAAA+AAH/AAH/gAD/AAD4AD+AH+AH8AA+AAH+AAD+AAD/AAD4AH/AP/AH+AA8AAAAAAAAAGADA4A4HweAPPgA/wAB8AAfwAPvgDweA8B4GADAAAIGAAA4AAHwAAPgAAfAAA/4AH/AD4AB8AA+AAHgAAwAAAAAAAAAGADAwB4GAfAwPYGDzAx4YGeDA/AYHwDA4AYGADAAAAAAAA///3//+wAA2AAGAAAGAAA+AAD8AAD8AAD4AAH4AAHgAAMAAAAwAA2AAG///3//+AAAAAAAAAAAOAAHwAD4AA8AAD8AADwAAGAAAAAAABgAAMAABgAAMAABgAAMAABgAAMAABgAAAEAAAwAADAAAIAAAAAAAAAAEeABn4Ad3ADMYAZjADMYAZmAB/4AP/AAAAAAAA//4H//ABgwAYDADAYAYDADg4AP+AA/gABwAAAAAAAAA/gAP+ADg4AYDADAYAYDADAYAOOABxwAAAAAEAAH8AB/wAcHADAYAYDADAYAcDA//4H//AAAAAAAAAAAAH8AB/wAdnADMYAZjADMYAZjAB84AHmAAMAAMAABgAB//gf/8HMAAxgAGIAAAAAAH8IB/zAcHMDAZgYDMDAZgcHcD//Af/wAAAAAAAAAAH//A//4AMAADAAAYAADAAAcAAD/4AP/AAAAAAAAAAAGf/Az/4AAAAAAAAAAMz//mf/4AAAAAAAAAAH//A//4ABwAAeAAH4ABzwAcPACAYAABAAAAAAAA//4H//AAAAAAAAAAAAf/AD/4AMAADAAAYAADAAAcAAD/4AP/ABgAAYAADAAAYAADgAAP/AA/4AAAAAAAAf/AD/4AMAADAAAYAADAAAcAAD/4AP/AAAAAAAAAAAAH8AB/wAcHADAYAYDADAYAYDADx4AP+AA/gAAAAAAAAf/8D//gYDADAYAYDADAYAcHAB/wAH8AAEAAAAAAEAAH8AB/wAcHADAYAYDADAYAYDAD//gf/8AAAAAAAAAAAf/AD/4AcAADAAAYAACAAAAEAB5wAfnADMYAZjADGYAYzADn4AOeAAAAAAAADAAAYAAf/wD//ADAYAYDAAAAAAAAD/gAf/AAA4AADAAAYAADAAAwAf/AD/4AAAAAAAAYAAD4AAP4AAP4AAPAAH4AH4AD8AAcAAAAAAQAADwAAf4AAf4AAPAAP4AP4ADwAAfgAA/gAA/AAD4AH+AD+AAeAAAAAAAAACAYAcHADzwAH8AAfAAH8ADx4AcHACAIAcAMD4BgP4MAP/AAPwAP4AP4AD4AAcAAAAAAAAADAYAYHADD4AY7ADOYAfjADwYAcDADAYAAAAADAAA4AH//B/v8cABzAACAAAH//w//+AAAAAAACAACcAAx/n+H//AA4AAHAAAAAAAAAAAAAOAADgAAYAADAAAcAABgAAGAAAwAAGAADwAAcAAAAA"), 32, atob("BQUHDQwPDQQHBwkMBAYGCQwMDAwMDAwMDAwFBAsMCwoTDg0ODgwMDg8GDA0LEg8ODQ4NDA0ODRMNDQ0GCQYJCQYLDAsMCwcMDAUFCwUSDAwMDAcLBwwKEAoKCgcFBw4A"), 21+(scale<<8)+(1<<16)); + return this; +} + +function setSmallFont() { + g.setFontRoboto(); +} + +const h = g.getHeight(); +const w = g.getWidth(); + +function draw() { + if (!idle) + drawClock(); + else + drawIdle(); + queueDraw(); +} + +function drawClock() { + var date = new Date(); + var timeStr = require("locale").time(date,1); + + g.reset(); + g.setColor(g.theme.bg); + g.fillRect(Bangle.appRect); + + g.setFont('Vector', w/3); + g.setFontAlign(0, 0); + g.setColor(g.theme.fg); + g.drawString(timeStr, w/2, h/2); + setSmallFont(); + g.drawString('Last Step ' + lastStepTime, w/2, 3*h/4); +} + +///////////////// IDLE TIMER ///////////////////////////////////// + +function log_debug(o) { + //print(o); +} + +// variable for controlling idle alert +let lastStep = getTime(); +let lastStepTime = '??'; +let warned = 0; +let idle = false; +let IDLE_MINUTES = 26; + +function drawIdle() { + let mins = Math.round((getTime() - lastStep) / 60); + g.reset(); + g.setColor(g.theme.bg); + g.fillRect(Bangle.appRect); + g.setColor(g.theme.fg); + setSmallFont(); + g.setFontAlign(0, 0); + g.drawString('Last step was', w/2, (h/3)); + g.drawString(mins + ' minutes ago', w/2, 20+(h/3)); + dismissBtn.draw(); +} + +/////////////// BUTTON CLASS /////////////////////////////////////////// + +// simple on screen button class +function BUTTON(name,x,y,w,h,c,f,tx) { + this.name = name; + this.x = x; + this.y = y; + this.w = w; + this.h = h; + this.color = c; + this.callback = f; + this.text = tx; +} + +// if pressed the callback +BUTTON.prototype.check = function(x,y) { + //console.log(this.name + ":check() x=" + x + " y=" + y +"\n"); + + if (x>= this.x && x<= (this.x + this.w) && y>= this.y && y<= (this.y + this.h)) { + log_debug(this.name + ":callback\n"); + this.callback(); + return true; + } + return false; +}; + +BUTTON.prototype.draw = function() { + g.setColor(this.color); + g.fillRect(this.x, this.y, this.x + this.w, this.y + this.h); + g.setColor("#000"); // the icons and boxes are drawn black + setSmallFont(); + g.setFontAlign(0, 0); + g.drawString(this.text, (this.x + this.w/2), (this.y + this.h/2)); + g.drawRect(this.x, this.y, (this.x + this.w), (this.y + this.h)); +}; + +function dismissPrompt() { + idle = false; + warned = false; + lastStep = getTime(); + Bangle.buzz(100); + draw(); +} + +var dismissBtn = new BUTTON("big",0, 3*h/4 ,w, h/4, "#0ff", dismissPrompt, "Dismiss"); + +Bangle.on('touch', function(button, xy) { + if (idle && dismissBtn.check(xy.x, xy.y)) return; +}); + +// if we get a step then we are not idle +Bangle.on('step', s => { + setLastStepTime(); + lastStep = getTime(); + // redraw if we had been idle + if (idle == true) { + dismissPrompt(); + } + idle = false; + warned = 0; +}); + +function setLastStepTime() { + var date = new Date(); + lastStepTime = require("locale").time(date,1); +} + +function checkIdle() { + let hour = (new Date()).getHours(); + let active = (hour >= 9 && hour < 21); + //let active = true; + let dur = getTime() - lastStep; + + if (active && dur > IDLE_MINUTES * 60) { + drawIdle(); + if (warned++ < 3) { + buzzer(warned); + log_debug("checkIdle: warned=" + warned); + Bangle.setLocked(false); + } + idle = true; + } else { + idle = false; + warned = 0; + } +} + +setLastStepTime(); + +// timeout for multi-buzzer +var buzzTimeout; + +// n buzzes +function buzzer(n) { + log_debug("buzzer n=" + n); + + if (n-- < 1) return; + Bangle.buzz(250); + + if (buzzTimeout) clearTimeout(buzzTimeout); + buzzTimeout = setTimeout(function() { + buzzTimeout = undefined; + buzzer(n); + }, 500); +} + + +/////////////////////////////////////////////////////////////////////////////// + + +// timeout used to update every minute +var drawTimeout; +const DRAW_PERIOD = 60000; + +// schedule a draw for the next minute +function queueDraw() { + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = setTimeout(function() { + drawTimeout = undefined; + checkIdle(); + draw(); + }, DRAW_PERIOD - (Date.now() % DRAW_PERIOD)); +} + +// Stop updates when LCD is off, restart when on +Bangle.on('lcdPower',on=>{ + if (on) { + draw(); // draw immediately, queue redraw + } else { // stop draw timer + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = undefined; + } +}); + +g.clear(); + +// Show launcher when middle button pressed +Bangle.setUI("clock"); +Bangle.loadWidgets(); +Bangle.drawWidgets(); +draw(); diff --git a/apps/lazybones/lazybones.icon.js b/apps/lazybones/lazybones.icon.js new file mode 100644 index 0000000000..ff37557058 --- /dev/null +++ b/apps/lazybones/lazybones.icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwMB///4EDAYP//gNBn4FB+E//kPAoPBAQODAQOPAQPx//+j4FB/F//l/AoP+DQImC/8//IFDz/zAofPAovnAofnApfPAofzAshgBLwIFB/EH8Ef+fO+Pj4+PufmuYOB51n8nn/Of88nAovwAocP+IFDx/5AoefAoIjBAoYvBAoXwg1gh4FB/EcnEfAoLGBYgOfU4IjBU4P+v/xx4DB/8P+VP+BnBw/wh/hAoPj/Ef45zCWQQCB/YCB74CBZgQqBAo34AQLsCIAJCCAAMAgCeD4EDAYIA=")) diff --git a/apps/lazybones/lazybones.png b/apps/lazybones/lazybones.png new file mode 100644 index 0000000000000000000000000000000000000000..ecca084c665974e3e21b80433654a6160e6c1ea2 GIT binary patch literal 1547 zcmV+m2K4!fP)T3ZAos4Z;)5u{QdQ9saBe4xcNl1Mb- zgKA>LSAr!(k!aK?5?_fQP~@9_FqB9X(-NZ;F%*f7F+LiDiHcZCo0yskZK>^TZ`Thq z>z;1+?xXki(tmPucIV8@`JcUe=FFUpkvd9%8-OZc8E^qG$M_|He}L24_5jC#cAypL zP6LO?s06kFzW|oc?+nl%pmPj(8CaSL;;VpzE&`{3Pk=4J&A?^Ag+R7pm#ebH>SL?g zbQ*rffG>cXrh@oF;4>HLmylN`RaC04Q-=R$pdt;v0ay?8spCI^dgO_w8@cMc1LyU7 zAQgu(V7od?0B->Ksc{U2d>t#HW523gBI8YUa2lvh7rO|kMg9c~cs;7|6KdECT$x^8 zk#IE7D?T9Fw)J%yyAVk^Swt02WYRPkrV$MJKG z9Av|@fI2_L7FAlC0a8(M7sBoHWD4cTZg>)z@pMBD(1mcEZws>wh1E#B{TLX{D7A1H z1@<8v{}1ct1XgN$FoUF`;()d{dUduV?^sF3=tM^u!tn>M&a=P(liap5gc!0P^t(H9 zak9+mj&6i&E;wu8JZ%Th1*3=<(6$hq2@Gpnka0TEQK;>(DU2cM>x6e}8e#wmsT0;} zH?m304C$yA_yCDs$B}Yy6Hw%1Qv@_1<)mHMzYp9Na?ApJ*6P>Vd2I+M%_J|<|G>M{ zTn3!*v1=mu6~0b&TfI7WYUjgxKOZR}pEPu`kG|Gl_fzDf}ypdkc8SYXbG!xm)iy==}~uXC2N)QtaU)hEx1+HsqUC zwjb|(rWp89bv79C9WGg;-rw&vfs2rZ+>6B6Jxr{GzEjyPUJev1RHx05eXFt+K6a~A z=X*o;xXK!V8Ax@O0Olrha##)Ok=1Tye)IIc(}x5|Q9gnbuR->g5rPi|I&}=2V42?c z0}m0RsJREHkhg%NMqi!EJ`5mXZ})bn%R-*oS%TA)-8#nYhU}<|)7_?lnT>*kw=Q6o z-ZvV3rP`hdAW?#Z;x3#Mw=N{Y1SN{L?@~jyN84G*KeW#@a8FY*Swra{gm3 zU>kOHToPsig~-8HACTwKUk!YzgV|&fI*5JbkqsO%`j6l|@j9LKn9(0spI-Y!J`zR; ziI6QfspDsSbPA9sQpLmsZj;)#bdc$#vS0REy)yJzB+uhJm5~|!r-K~3npQk z3=6f5Jb}qzF7m#10q3W|-)!VWWElAvo)OqN%{RcJ6#Oj0S>!v@z$-Ln;^aD`NSNJ- zZ>) xr4%{g$i+E&=|j?jzmQY4c4SvRfJ|=E_z%s}z^MCt-emv)002ovPDHLkV1oDD-4Xx* literal 0 HcmV?d00001 diff --git a/apps/lazybones/metadata.json b/apps/lazybones/metadata.json new file mode 100644 index 0000000000..e1df6dc5d5 --- /dev/null +++ b/apps/lazybones/metadata.json @@ -0,0 +1,15 @@ +{ + "id": "lazybones", + "name": "Lazybones", + "version": "0.01", + "description": "Idleness timer, warns when you have been sat too long", + "icon": "lazybones.png", + "screenshots": [{"url":"screenshot_lazybones.png"}], + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"lazybones.app.js","url":"lazybones.app.js"}, + {"name":"lazybones.img","url":"lazybones.icon.js","evaluate":true} + ] +} From 272cfaa2d34768935c6d04fcc944c25a989a14d7 Mon Sep 17 00:00:00 2001 From: hughbarney Date: Wed, 2 Feb 2022 23:19:11 +0000 Subject: [PATCH 05/23] Lazybones: idle timer based on step threshold --- apps/lazybones/README.md | 41 +++++++++++++++++++++++++++++++++++++--- apps/simplest/README.md | 2 ++ 2 files changed, 40 insertions(+), 3 deletions(-) diff --git a/apps/lazybones/README.md b/apps/lazybones/README.md index 2fe597234a..fe11739d4a 100644 --- a/apps/lazybones/README.md +++ b/apps/lazybones/README.md @@ -1,5 +1,40 @@ -# Simplest Clock +# Lazybones -The simplest working clock, acts as a tutorial piece +'Warns when you have been sat still for too long.' -![](screenshot.jpg) +![](screenshot_lazybones.png) + +- Spending too much time sat down is destructive to our health and fitness. +- Lazy bones checks the step count every minute and if this + has not changed after 26 minutes the buzzer will sound and a pop up + screen will show. +- It gives 3 warnings before giving up +- The timer only goes off between the hours 9am to 9pm. +- A settings menu may be added in a future release + +## Dedication + +This is app is dedicated in memory of my friend, Huw Evans 1960-2019, +poet, writer, actor, archiologist, technical author, husband, father, +friend. + +In May 2017, Huw Evans received a terminal cancer diagnosis. [Not +Long Now](https://www.youtube.com/watch?v=HD_Xysb6ZEA) is his +response to that diagnosis and the drastic shortening of his life +expectancy. Not Long Now is a one-man show, which uses poetry, +story-telling, puppetry and video to address one basic question: +given we are all going to die, how then shall we live? + +## Why the Skull ? + +![](lazybones.png) + +The Skull is a [Memento +mori](https://en.wikipedia.org/wiki/Memento_mori) (Latin for +'remember that you [have to] die') is an artistic or symbolic trope +acting as a reminder of the inevitability of death. + +Let us choose not to die from sitting too long. + + +Written by: [Hugh Barney](https://github.com/hughbarney) For support and discussion please post in the [Bangle JS Forum](http://forum.espruino.com/microcosms/1424/) diff --git a/apps/simplest/README.md b/apps/simplest/README.md index 2fe597234a..cc7b52c792 100644 --- a/apps/simplest/README.md +++ b/apps/simplest/README.md @@ -3,3 +3,5 @@ The simplest working clock, acts as a tutorial piece ![](screenshot.jpg) + +Written by: [Hugh Barney](https://github.com/hughbarney) For support and discussion please post in the [Bangle JS Forum](http://forum.espruino.com/microcosms/1424/) From df8251024eb70c9ba49aa5f4370291c3589711ce Mon Sep 17 00:00:00 2001 From: hughbarney Date: Wed, 2 Feb 2022 23:19:27 +0000 Subject: [PATCH 06/23] Lazybones: idle timer based on step threshold --- apps/lazybones/screenshot_lazybones.png | Bin 0 -> 2674 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/lazybones/screenshot_lazybones.png diff --git a/apps/lazybones/screenshot_lazybones.png b/apps/lazybones/screenshot_lazybones.png new file mode 100644 index 0000000000000000000000000000000000000000..b01d287600669aa73d5f6685945cae406985f417 GIT binary patch literal 2674 zcmds(`#;l*AIE3kDMXpuqiHUYOD^fm5l58!LgmuTWz0^Ju#6m-lXyD2hb5+HB zxqOazCa_QAh#PwU5AT=1Hysb@ID=F2v-q~Pv9Yl!Hh>*7S;+-U>yfdUnl1#7VjuCM zCCOdBl|H{IGl2R$nJyio@~yXIL(BX zPQ2q<;0wX7C-K+zotE}8n(~$(k-SjzZCe?8l7awQc1PBg^)+~P_>k$*Kki#NxobB& zse4ibIb9U(q!}uKbVLyubrnieZ#HW-`80=9<2Ww*zU{EoIEu@mt9)_3PJbNiPf3(; z^@nA5x_WzSEF0{HLpv+jopWT76WNk4nQe_Up$?zBUd6RhK~2yhCqKOTTuWcGQGj{f zW-A-6jC7+{mGb_D({vHDi)d5u{kxk?Z-6)(gHGe4dx>Wt01toSA)0_3D}g{s!t_Hl z(4oOj0Vbk+JEadK5#pgr0_iH<3HlivfvJ-hr;XEK?}7h%Fc1x0qf&V5Q!hGC`iOh7 z&287Cm-sH{m7HSX>ST=$!hYCZ=*!#2D~BHZdbCJ8X-{~GnI?F|1cB5E4( zO-A;k~d5g*E4YG+p|0?b&m2 z5Ygmooho(fOkwt-A{U(H4B$g08&b7G9 zYgQQxZ4_Q^D(KR5s{x~1w_EyA7xf~UoVLNZUaflDO6#cbKmuuik-<(C`@6DszX~g9 z3A4P5?Z!q9#e3E@7J}_rVlD(Pj})akW25UD=I`;#Kzey2uY(;|wf=A6(o4~8ntc6& zzYeA*XTSkFynU|iM5ON4R`*mUc4Q_YaoD{q&=n`F4pa+LECHe+(?Cv;u1pH0Y zXs-VyC3=62R-9rv;BR?{KV3?5#;cJp5>2pvgsP=ReQ<8^9ajJ4Mt>ps z_k#)7CR6jCH#wvVWCK(;aljSj(SwOd3ursDDgpqLUMV4C3a=?b+Xsvi%MiigIUojL z53x2|o=d~bO0|P*N)r>dVxcqvR2QCc?0%~9R()E`8Z}jL7-~7O86q*72uPVw6Q&#J zU2mn{`ot-CiveP`zJLtzg&8-+a`)6bpbstnI@d7_@KKS+3Z=ytjN$Vf3#IPjb_Z#U z*~g^XcOqdq(?;Vv3To-MmUm!Hf3II&n0a*e%1qgSTWIpD&5JCxfbo1fe_{9As6omD z%9@vFIUYd65`xS)8Zw>3tD*74DT>5Jhhc@{*^fl+kKGpVts1HOxGla{Q-^vCF3HOK zPPNsNj8s0352A55tpK6V)o0r;LYij2EMauc(Q;S$sq)t2#AhJ3;^`{G-cI-Fo8?;V zF&ucxkBte7SA}M7Z~c*Lt6i@sTZYnz@|5p0ZTshe;fSHdx59qmZgQOB{Vpv%8n`r_ zo`kvO*nPC+V%J9ZS5V~IRtql3Pwr_QrSuRF8p$-HvAihyLTr$&Brj0pcY(-^_Z{pO z-nt}AGk=n1HlW+Ulcr@urssq4Pd#gK1+Jvm!BI7zwE&@hbKwg+(dJEbF1txp-i%sP zABFyr|AXV3U~lxv(g1+nW<8-r-q+Z&@$|EihHQ1&`A3m6#q+YqX~L^IZK(X4t^FXp9tw}HKW2S7Y zZq0d*u{KEf!o2y%p#W}N$U8&bU6E7i{8#_XuLqBO{wWkW!~)>}?giK4N)s5TZ?{ky zJQWj6;H0KoXGpr$C7bTgaz0`Az&qXbUN_fYI4yGmggiyIj7#UK2c!w`pSpN5)2fWN zS-nHHJz-jFBB;#JtMb)kT^+a}^bjFz9$F=r%qkmh!5CDGRe|@dx5L^*pT>Kz}xbs9pygko))VmRG{s&rx0B`^R literal 0 HcmV?d00001 From 0020533864dd96a81c3b99bc7cf94c19d891d2ac Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Wed, 2 Feb 2022 15:29:32 -0800 Subject: [PATCH 07/23] add settings.js --- apps/torch/settings.js | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 apps/torch/settings.js diff --git a/apps/torch/settings.js b/apps/torch/settings.js new file mode 100644 index 0000000000..77bfb0ddde --- /dev/null +++ b/apps/torch/settings.js @@ -0,0 +1,38 @@ +(function(back) { + const SETTINGS_FILE = "torch.json"; + + // initialize with default settings... + let s = {'bg': '#0f0', 'color': 'Green'} + + // ...and overwrite them with any saved values + // This way saved values are preserved if a new version adds more settings + const storage = require('Storage') + let settings = storage.readJSON(SETTINGS_FILE, 1) || s; + const saved = settings || {} + for (const key in saved) { + s[key] = saved[key] + } + + function save() { + settings = s + storage.write(SETTINGS_FILE, settings) + } + + var color_options = ['Green','Orange','Cyan','Purple','Red','Blue','Yellow']; + var bg_code = ['#0f0','#ff0','#0ff','#f0f','#f00','#00f','#ffef00']; + + E.showMenu({ + '': { 'title': 'Torch' }, + '< Back': back, + 'Colour': { + value: 0 | color_options.indexOf(s.color), + min: 0, max: 5, + format: v => color_options[v], + onchange: v => { + s.color = color_options[v]; + s.bg = bg_code[v]; + save(); + }, + } + }); +}) From 0400d6d498f9cb6de53c7cc1c31f2ab24a1c2a45 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Wed, 2 Feb 2022 15:30:14 -0800 Subject: [PATCH 08/23] Update metadata.json --- apps/torch/metadata.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/torch/metadata.json b/apps/torch/metadata.json index 39655dbba7..81b8aa9574 100644 --- a/apps/torch/metadata.json +++ b/apps/torch/metadata.json @@ -10,6 +10,7 @@ "storage": [ {"name":"torch.app.js","url":"app.js"}, {"name":"torch.wid.js","url":"widget.js"}, - {"name":"torch.img","url":"app-icon.js","evaluate":true} + {"name":"torch.img","url":"app-icon.js","evaluate":true}, + {"name":"torch.settings.js","url":"torch.settings.js"}, ] } From b1601ae4b3528ac3fc48bc50b9da762da7db7f68 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Wed, 2 Feb 2022 15:33:16 -0800 Subject: [PATCH 09/23] Update settings.js --- apps/torch/settings.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/torch/settings.js b/apps/torch/settings.js index 77bfb0ddde..b51c597ed4 100644 --- a/apps/torch/settings.js +++ b/apps/torch/settings.js @@ -2,7 +2,7 @@ const SETTINGS_FILE = "torch.json"; // initialize with default settings... - let s = {'bg': '#0f0', 'color': 'Green'} + let s = {'bg': '#FFFFFF', 'color': 'White'} // ...and overwrite them with any saved values // This way saved values are preserved if a new version adds more settings @@ -18,8 +18,8 @@ storage.write(SETTINGS_FILE, settings) } - var color_options = ['Green','Orange','Cyan','Purple','Red','Blue','Yellow']; - var bg_code = ['#0f0','#ff0','#0ff','#f0f','#f00','#00f','#ffef00']; + var color_options = ['Green','Orange','Cyan','Purple','Red','Blue','Yellow','White']; + var bg_code = ['#0f0','#ff0','#0ff','#f0f','#f00','#00f','#ffef00','#FFFFFF']; E.showMenu({ '': { 'title': 'Torch' }, From 48aed2c04ef62765e69083e3c307e2c5f7c78be6 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Wed, 2 Feb 2022 15:34:12 -0800 Subject: [PATCH 10/23] Update app.js --- apps/torch/app.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/apps/torch/app.js b/apps/torch/app.js index 28aa00bd69..36a992d8c8 100644 --- a/apps/torch/app.js +++ b/apps/torch/app.js @@ -1,6 +1,13 @@ +const SETTINGS_FILE = "torch.json"; + +function loadSettings() { + settings = require("Storage").readJSON(SETTINGS_FILE,1)|| {'bg': '#FFFFFF', 'color': 'White'}; +} + Bangle.setLCDPower(1); Bangle.setLCDTimeout(0); g.reset(); +g.setColor(settings.bg); g.fillRect(0,0,g.getWidth(),g.getHeight()); // Any button turns off setWatch(()=>load(), BTN1); From 8bbdb82af5870c44073864378984ff796d00bbdc Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Wed, 2 Feb 2022 15:36:37 -0800 Subject: [PATCH 11/23] Update metadata.json --- apps/torch/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/torch/metadata.json b/apps/torch/metadata.json index 81b8aa9574..6bd627e372 100644 --- a/apps/torch/metadata.json +++ b/apps/torch/metadata.json @@ -11,6 +11,6 @@ {"name":"torch.app.js","url":"app.js"}, {"name":"torch.wid.js","url":"widget.js"}, {"name":"torch.img","url":"app-icon.js","evaluate":true}, - {"name":"torch.settings.js","url":"torch.settings.js"}, + {"name":"torch.settings.js","url":"torch.settings.js"} ] } From 2492ac9a7e847101b672f363263a7f9f209e3023 Mon Sep 17 00:00:00 2001 From: hughbarney Date: Wed, 2 Feb 2022 23:37:41 +0000 Subject: [PATCH 12/23] Lazybones: idle timer based on step threshold --- apps/lazybones/README.md | 5 +++++ apps/lazybones/lazybones.icon.js | 2 +- apps/lazybones/screenshot_lazybones2.png | Bin 0 -> 2696 bytes 3 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 apps/lazybones/screenshot_lazybones2.png diff --git a/apps/lazybones/README.md b/apps/lazybones/README.md index fe11739d4a..4c90f54de8 100644 --- a/apps/lazybones/README.md +++ b/apps/lazybones/README.md @@ -2,6 +2,7 @@ 'Warns when you have been sat still for too long.' +![](screenshot_lazybones2.png) ![](screenshot_lazybones.png) - Spending too much time sat down is destructive to our health and fitness. @@ -9,9 +10,13 @@ has not changed after 26 minutes the buzzer will sound and a pop up screen will show. - It gives 3 warnings before giving up +- Standing up and walking around until the step counting threshold is reached will automatically dismiss the warning. +- When the warning is not displaying the apps is a simple clock - The timer only goes off between the hours 9am to 9pm. +- The app is a basic proof of concept that can be used in other clocks - A settings menu may be added in a future release + ## Dedication This is app is dedicated in memory of my friend, Huw Evans 1960-2019, diff --git a/apps/lazybones/lazybones.icon.js b/apps/lazybones/lazybones.icon.js index ff37557058..6a783cdafd 100644 --- a/apps/lazybones/lazybones.icon.js +++ b/apps/lazybones/lazybones.icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwwMB///4EDAYP//gNBn4FB+E//kPAoPBAQODAQOPAQPx//+j4FB/F//l/AoP+DQImC/8//IFDz/zAofPAovnAofnApfPAofzAshgBLwIFB/EH8Ef+fO+Pj4+PufmuYOB51n8nn/Of88nAovwAocP+IFDx/5AoefAoIjBAoYvBAoXwg1gh4FB/EcnEfAoLGBYgOfU4IjBU4P+v/xx4DB/8P+VP+BnBw/wh/hAoPj/Ef45zCWQQCB/YCB74CBZgQqBAo34AQLsCIAJCCAAMAgCeD4EDAYIA=")) +require("heatshrink").decompress(atob("mEwgIEBn/8BIUD///4AFBh/AgfwAoM8AQlwAQMOgEB8AFBg+AgeAAoMBDQIxD4EGAodghg9EAosYAocYApcwAocMAshgBLwIFBg/4j/ghkxh0cnFwxkZxgOBmOYjcYg1gjHYAosPAofwhwFDuEGAodgAoIjBAoYvBAoUP/Of+AFBg/j4/gAoLGBYgNgU4IjBU4MBwEOuADBgHwhuwh5nBvEP+EeAoMcg/gnBzCWQQCBggCBkACBZgQqBAo0HAQLsCIAJCCAAP//6eDn/8AYI")) diff --git a/apps/lazybones/screenshot_lazybones2.png b/apps/lazybones/screenshot_lazybones2.png new file mode 100644 index 0000000000000000000000000000000000000000..f3a4b308e0da28cffe27704174eb4e0361781518 GIT binary patch literal 2696 zcmeHJSu`7p7S$L_YgSVe^IUDcm`bQ2=BZSb2606NL1~B>a?_|HrlP8)G1RO|j5Rbg z&olI@8rmy{R>Ukd1fh!Fy58seeZTL0oW0jxd+ndI_FCrToteecM56uo2I9!!OOxp23>K$sVnu*N#|1 z-1^#bY642z(zYLtS{%Fm;wMWN^@Oc=T-ES^RD+osYqY-c_AUAP3}nQ?y0Qj&v9hUK zuhq|xUQE5EUy)_YnaCZkt$r3F+NPpn^m`I!&?g)|R0uXz-R@q`QqD2j`|Hjo7D_Ks z8yk4pQ>7o-OxK7&t^Ng4i2KxbYL^B!D5(ecpkj3qi+OF%%8$<`*knZcF|m;tJ3FIV z%XW~=G!8)*pXas?u$dy;LdahD0A;G;xLgmO-=WFV;R8kYE5TicvgPs?l===E0 zWYbG_u+EjtfqjLBgFwQp!JF0^gBC9;i!g3>gD@Ii3na&uk{>&l6n9O-35$MaDv80&8y{|c;+v9ulJtc_=Ba3XO61bmNx!mLRlOY3!l zq{VUErgo!rwFx1Zz!HK_j%C9mf(F!? zc+Sl%J*m9^;nJ*(n4XZ6_l14vVJ$aJIguwaA&-Ig)QBaW42JVyuY6LVF$xi;ArnG*4poV0Zod9 zjXY}n6GDl-KM^67InnoeSx===RY$i}f@6Ha98D|6A)!mTZy_Lcf|G{WzKd6!O=K@K_+aIWjvJeq5Ar_m@^#wc+y3u>u&g4?`fX zX`O{B$v%0cS?+v!80Kt+{DmE;dX*K3kBoLqBH_Kw@i{N;8VqQ%&EhS$ATE-hHHCTCWPGm*xX(0FW?Xr@R=b9>A1Mgv*= zM_Bf_KLjWEyV7JUAU-M;xUEdYtf7_1PHxa`;N7obQSU9imyFTKQ1!3Vn^DLOuraI^ zo1J`cBuJ?fDBrbTZ{cj=R5Dl?l}Z;Z6FE4S0hGEtP9}gU6XfwrePdM}xl@jmw=@KA zATO=!1o$|WqIlVOJ1V$GvSBx6gu4FQeIC&%%Lf3~{E%1C>B&$V^9~d`!%s=kLPjf^ z5sJ*v1twhT+n@&01d)Rq1NeCNyKpHrzT>`!8bEyNtnRbv|1um1D1n3Ee~5vYT#U&k8uj-=Q(mS06za6 zYVyGMdb(o76-?drXG>u^%qEMI1Z#RpXAWKxPyn%r)YGv=z)Bn@6yn^za0USe#Kj> zzIvJFUn63gM=dnIIg@;eE-F8}pW&5Dp7_I+@L12o=*ct6q#?O257TrU{T|D-j@wfZ zoW9ROR8-vN3XEW%B&(W9gBBIKnkroio2$&jqclYlngTqF7bmN%=(8N z&@(ZM|8k=_IX6@VDVN2Rwu}|DZv5XYjXV-*(0D4#5Q0Fu3T>P5FRd z1xiU#;rU&LaS3BfA>*;g1=@h2QtM$n!&P_^T&lap-)(@|)AF<9VqP>gDobGf8YQq! z&$hl$Mdx%F8Z*GM}rQ`7xS^LQuc?frZJKow>RjV&O%Vua5c`aktA1ua`)W4 z=Aqe9NiCO+jvBT^ Date: Wed, 2 Feb 2022 23:40:48 +0000 Subject: [PATCH 13/23] Lazybones: idle timer based on step threshold --- apps/lazybones/metadata.json | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/lazybones/metadata.json b/apps/lazybones/metadata.json index e1df6dc5d5..961da8a149 100644 --- a/apps/lazybones/metadata.json +++ b/apps/lazybones/metadata.json @@ -5,6 +5,7 @@ "description": "Idleness timer, warns when you have been sat too long", "icon": "lazybones.png", "screenshots": [{"url":"screenshot_lazybones.png"}], + "readme": "README.md", "type": "clock", "tags": "clock", "supports": ["BANGLEJS","BANGLEJS2"], From 76dc660ab2e40012dd7cc9cd687100424df32c2f Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Wed, 2 Feb 2022 15:55:23 -0800 Subject: [PATCH 14/23] Update ChangeLog --- apps/torch/ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/torch/ChangeLog b/apps/torch/ChangeLog index 8e76b717ae..de1bcd265b 100644 --- a/apps/torch/ChangeLog +++ b/apps/torch/ChangeLog @@ -1,2 +1,3 @@ 0.01: New App! 0.02: Change start sequence to BTN1/3/1/3 to avoid accidental turning on (fix #342) +0.03: Add Color Changing Settings From caf60baa552af687ad29efa52dee4a5d3bdda8e6 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Wed, 2 Feb 2022 15:56:01 -0800 Subject: [PATCH 15/23] Update metadata.json --- apps/torch/metadata.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/torch/metadata.json b/apps/torch/metadata.json index 6bd627e372..84b814e2c4 100644 --- a/apps/torch/metadata.json +++ b/apps/torch/metadata.json @@ -2,7 +2,7 @@ "id": "torch", "name": "Torch", "shortName": "Torch", - "version": "0.02", + "version": "0.03", "description": "Turns screen white to help you see in the dark. Select from the launcher or press BTN1,BTN3,BTN1,BTN3 quickly to start when in any app that shows widgets", "icon": "app.png", "tags": "tool,torch", @@ -11,6 +11,6 @@ {"name":"torch.app.js","url":"app.js"}, {"name":"torch.wid.js","url":"widget.js"}, {"name":"torch.img","url":"app-icon.js","evaluate":true}, - {"name":"torch.settings.js","url":"torch.settings.js"} + {"name":"torch.settings.js","url":"settings.js"} ] } From bb3e23709257d0a74b0405a586374a4ede5a91d2 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Wed, 2 Feb 2022 16:01:40 -0800 Subject: [PATCH 16/23] Update app.js --- apps/torch/app.js | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/torch/app.js b/apps/torch/app.js index 36a992d8c8..87b78e4feb 100644 --- a/apps/torch/app.js +++ b/apps/torch/app.js @@ -1,4 +1,5 @@ const SETTINGS_FILE = "torch.json"; +let settings; function loadSettings() { settings = require("Storage").readJSON(SETTINGS_FILE,1)|| {'bg': '#FFFFFF', 'color': 'White'}; From 03a72675d4612212cc40d891477a40c6f8b6cc11 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Wed, 2 Feb 2022 16:07:08 -0800 Subject: [PATCH 17/23] Update app.js --- apps/torch/app.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/torch/app.js b/apps/torch/app.js index 87b78e4feb..9504f3ac01 100644 --- a/apps/torch/app.js +++ b/apps/torch/app.js @@ -5,6 +5,8 @@ function loadSettings() { settings = require("Storage").readJSON(SETTINGS_FILE,1)|| {'bg': '#FFFFFF', 'color': 'White'}; } +loadSettings(); + Bangle.setLCDPower(1); Bangle.setLCDTimeout(0); g.reset(); From 44e9662d968cb060e24936b9bf160108428822d7 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Wed, 2 Feb 2022 16:13:37 -0800 Subject: [PATCH 18/23] Update settings.js --- apps/torch/settings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/torch/settings.js b/apps/torch/settings.js index b51c597ed4..899ae21bee 100644 --- a/apps/torch/settings.js +++ b/apps/torch/settings.js @@ -19,7 +19,7 @@ } var color_options = ['Green','Orange','Cyan','Purple','Red','Blue','Yellow','White']; - var bg_code = ['#0f0','#ff0','#0ff','#f0f','#f00','#00f','#ffef00','#FFFFFF']; + var bg_code = ['#0f0','#FFA500','#0ff','#f0f','#f00','#00f','#ffef00','#FFFFFF']; E.showMenu({ '': { 'title': 'Torch' }, From e94813a4f81ec73ce6940fa338c333a8c8fd0227 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Wed, 2 Feb 2022 16:14:56 -0800 Subject: [PATCH 19/23] Update settings.js --- apps/torch/settings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/torch/settings.js b/apps/torch/settings.js index 899ae21bee..58a876bccb 100644 --- a/apps/torch/settings.js +++ b/apps/torch/settings.js @@ -26,7 +26,7 @@ '< Back': back, 'Colour': { value: 0 | color_options.indexOf(s.color), - min: 0, max: 5, + min: 0, max: 8, format: v => color_options[v], onchange: v => { s.color = color_options[v]; From 76d932ea416cec58f83b30e6fd3ed6ef8ab566fe Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Wed, 2 Feb 2022 16:18:55 -0800 Subject: [PATCH 20/23] Update settings.js --- apps/torch/settings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/torch/settings.js b/apps/torch/settings.js index 58a876bccb..8dd6d18540 100644 --- a/apps/torch/settings.js +++ b/apps/torch/settings.js @@ -26,7 +26,7 @@ '< Back': back, 'Colour': { value: 0 | color_options.indexOf(s.color), - min: 0, max: 8, + min: 0, max: 7, format: v => color_options[v], onchange: v => { s.color = color_options[v]; From ce605f82eebfa6db391bdd4d9f602f2710ad9fe3 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Wed, 2 Feb 2022 16:26:08 -0800 Subject: [PATCH 21/23] Update metadata.json --- apps/torch/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/torch/metadata.json b/apps/torch/metadata.json index 84b814e2c4..1f64e1e82e 100644 --- a/apps/torch/metadata.json +++ b/apps/torch/metadata.json @@ -3,7 +3,7 @@ "name": "Torch", "shortName": "Torch", "version": "0.03", - "description": "Turns screen white to help you see in the dark. Select from the launcher or press BTN1,BTN3,BTN1,BTN3 quickly to start when in any app that shows widgets", + "description": "Turns screen white to help you see in the dark. Select from the launcher or press BTN1,BTN3,BTN1,BTN3 quickly to start when in any app that shows widgets. You can also set the color through the apps settings menu.", "icon": "app.png", "tags": "tool,torch", "supports": ["BANGLEJS"], From 1bed60388295a7e09081fe78e472f55285859fbf Mon Sep 17 00:00:00 2001 From: Alessandro Cocco Date: Thu, 3 Feb 2022 22:25:42 +0100 Subject: [PATCH 22/23] Launcher: Add an option to hide clocks from the app list --- apps/launch/ChangeLog | 1 + apps/launch/app.js | 10 +++++----- apps/launch/metadata.json | 2 +- apps/launch/settings.js | 22 ++++++++++++++-------- 4 files changed, 21 insertions(+), 14 deletions(-) diff --git a/apps/launch/ChangeLog b/apps/launch/ChangeLog index ceb0177da1..7f0e5d66ac 100644 --- a/apps/launch/ChangeLog +++ b/apps/launch/ChangeLog @@ -10,3 +10,4 @@ After 10s of being locked, the launcher goes back to the clock screen 0.10: added in selectable font in settings including scalable vector font 0.11: Merge Bangle.js 1 and 2 launchers, again +0.12: Add an option to hide clocks from the app list (fix #1015) diff --git a/apps/launch/app.js b/apps/launch/app.js index 42aba1bb96..de7aa8963a 100644 --- a/apps/launch/app.js +++ b/apps/launch/app.js @@ -1,9 +1,9 @@ var s = require("Storage"); -let fonts = g.getFonts(); var scaleval = 1; var vectorval = 20; var font = g.getFonts().includes("12x20") ? "12x20" : "6x8:2"; -let settings = require('Storage').readJSON("launch.json", true) || {}; +let settings = Object.assign({ showClocks: true }, s.readJSON("launch.json", true) || {}); + if ("vectorsize" in settings) { vectorval = parseInt(settings.vectorsize); } @@ -14,10 +14,10 @@ if ("font" in settings){ } else{ font = settings.font; - scaleval = (font.split('x')[1])/20; + scaleval = (font.split("x")[1])/20; } } -var apps = s.list(/\.info$/).map(app=>{var a=s.readJSON(app,1);return a&&{name:a.name,type:a.type,icon:a.icon,sortorder:a.sortorder,src:a.src};}).filter(app=>app && (app.type=="app" || app.type=="clock" || !app.type)); +var apps = s.list(/\.info$/).map(app=>{var a=s.readJSON(app,1);return a&&{name:a.name,type:a.type,icon:a.icon,sortorder:a.sortorder,src:a.src};}).filter(app=>app && (app.type=="app" || (app.type=="clock" && settings.showClocks) || !app.type)); apps.sort((a,b)=>{ var n=(0|a.sortorder)-(0|b.sortorder); if (n) return n; // do sortorder first @@ -72,7 +72,7 @@ if (process.env.HWVERSION==2) { // 10s of inactivity goes back to clock Bangle.setLocked(false); // unlock initially var lockTimeout; -Bangle.on('lock', locked => { +Bangle.on("lock", locked => { if (lockTimeout) clearTimeout(lockTimeout); lockTimeout = undefined; if (locked) diff --git a/apps/launch/metadata.json b/apps/launch/metadata.json index 1701d1f870..96bbf104b9 100644 --- a/apps/launch/metadata.json +++ b/apps/launch/metadata.json @@ -2,7 +2,7 @@ "id": "launch", "name": "Launcher", "shortName": "Launcher", - "version": "0.11", + "version": "0.12", "description": "This is needed to display a menu allowing you to choose your own applications. You can replace this with a customised launcher.", "icon": "app.png", "type": "launch", diff --git a/apps/launch/settings.js b/apps/launch/settings.js index 8be1adb369..f75e875a81 100644 --- a/apps/launch/settings.js +++ b/apps/launch/settings.js @@ -1,24 +1,30 @@ // make sure to enclose the function in parentheses (function(back) { - let settings = require('Storage').readJSON('launch.json',1)||{}; + let settings = Object.assign({ showClocks: true }, require("Storage").readJSON("launch.json", true) || {}); + let fonts = g.getFonts(); function save(key, value) { settings[key] = value; - require('Storage').write('launch.json',settings); + require("Storage").write("launch.json",settings); } const appMenu = { - '': {'title': 'Launcher Settings'}, - '< Back': back, - 'Font': { + "": {"title": "Launcher Settings"}, + "< Back": back, + "Font": { value: fonts.includes(settings.font)? fonts.indexOf(settings.font) : fonts.indexOf("12x20"), min:0, max:fonts.length-1, step:1,wrap:true, - onchange: (m) => {save('font', fonts[m])}, + onchange: (m) => {save("font", fonts[m])}, format: v => fonts[v] }, - 'Vector font size': { + "Vector font size": { value: settings.vectorsize || 10, min:10, max: 20,step:1,wrap:true, - onchange: (m) => {save('vectorsize', m)} + onchange: (m) => {save("vectorsize", m)} + }, + "Show clocks": { + value: settings.showClocks == true, + format: v => v ? "Yes" : "No", + onchange: (m) => {save("showClocks", m)} } }; E.showMenu(appMenu); From 5cf772923a0190edb948463d6b762cc0000282ff Mon Sep 17 00:00:00 2001 From: Alessandro Cocco Date: Thu, 3 Feb 2022 22:29:19 +0100 Subject: [PATCH 23/23] Launcher: Add /*LANG*/ tags --- apps/launch/ChangeLog | 1 + apps/launch/app.js | 4 ++-- apps/launch/settings.js | 12 ++++++------ 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/apps/launch/ChangeLog b/apps/launch/ChangeLog index 7f0e5d66ac..b8c198d507 100644 --- a/apps/launch/ChangeLog +++ b/apps/launch/ChangeLog @@ -11,3 +11,4 @@ 0.10: added in selectable font in settings including scalable vector font 0.11: Merge Bangle.js 1 and 2 launchers, again 0.12: Add an option to hide clocks from the app list (fix #1015) + Add /*LANG*/ tags for internationalisation diff --git a/apps/launch/app.js b/apps/launch/app.js index de7aa8963a..4ceabe751e 100644 --- a/apps/launch/app.js +++ b/apps/launch/app.js @@ -54,10 +54,10 @@ E.showScroller({ var app = apps[i]; if (!app) return; if (!app.src || require("Storage").read(app.src)===undefined) { - E.showMessage("App Source\nNot found"); + E.showMessage(/*LANG*/"App Source\nNot found"); setTimeout(drawMenu, 2000); } else { - E.showMessage("Loading..."); + E.showMessage(/*LANG*/"Loading..."); load(app.src); } } diff --git a/apps/launch/settings.js b/apps/launch/settings.js index f75e875a81..1bb3d5c9ae 100644 --- a/apps/launch/settings.js +++ b/apps/launch/settings.js @@ -8,22 +8,22 @@ require("Storage").write("launch.json",settings); } const appMenu = { - "": {"title": "Launcher Settings"}, - "< Back": back, - "Font": { + /*LANG*/"": {"title": /*LANG*/"Launcher Settings"}, + /*LANG*/"< Back": back, + /*LANG*/"Font": { value: fonts.includes(settings.font)? fonts.indexOf(settings.font) : fonts.indexOf("12x20"), min:0, max:fonts.length-1, step:1,wrap:true, onchange: (m) => {save("font", fonts[m])}, format: v => fonts[v] }, - "Vector font size": { + /*LANG*/"Vector font size": { value: settings.vectorsize || 10, min:10, max: 20,step:1,wrap:true, onchange: (m) => {save("vectorsize", m)} }, - "Show clocks": { + /*LANG*/"Show clocks": { value: settings.showClocks == true, - format: v => v ? "Yes" : "No", + format: v => v ? /*LANG*/"Yes" : /*LANG*/"No", onchange: (m) => {save("showClocks", m)} } };