From 1abb3c84e56398ec1628d7ca6b63c441c09e7bbb Mon Sep 17 00:00:00 2001 From: Erik Andresen Date: Fri, 27 Jan 2023 17:57:45 +0100 Subject: [PATCH 01/27] widalarmeta fixes Fix Bell not appearing on alarms > 24h and redrawing interval --- apps/widalarmeta/ChangeLog | 1 + apps/widalarmeta/metadata.json | 2 +- apps/widalarmeta/widget.js | 13 +++++++++---- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/apps/widalarmeta/ChangeLog b/apps/widalarmeta/ChangeLog index 37b619f7f..19a19c006 100644 --- a/apps/widalarmeta/ChangeLog +++ b/apps/widalarmeta/ChangeLog @@ -2,3 +2,4 @@ 0.02: Change font to 5x9 7 segment-style Add settings page Add option to show seconds +0.03: Fix Bell not appearing on alarms > 24h and redrawing interval diff --git a/apps/widalarmeta/metadata.json b/apps/widalarmeta/metadata.json index 79387c1c5..89e35c090 100644 --- a/apps/widalarmeta/metadata.json +++ b/apps/widalarmeta/metadata.json @@ -2,7 +2,7 @@ "id": "widalarmeta", "name": "Alarm & Timer ETA", "shortName": "Alarm ETA", - "version": "0.02", + "version": "0.03", "description": "A widget that displays the time to the next Alarm or Timer in hours and minutes, maximum 24h (configurable).", "icon": "widget.png", "type": "widget", diff --git a/apps/widalarmeta/widget.js b/apps/widalarmeta/widget.js index ff3390d89..8a7933358 100644 --- a/apps/widalarmeta/widget.js +++ b/apps/widalarmeta/widget.js @@ -9,7 +9,7 @@ function draw() { const times = alarms.map(alarm => require("sched").getTimeToAlarm(alarm)).filter(a => a !== undefined); - const next = Math.min.apply(null, times); + const next = times.length > 0 ? Math.min.apply(null, times) : 0; let calcWidth = 0; let drawSeconds = false; @@ -34,7 +34,7 @@ if (drawSeconds) { calcWidth += 3*5; } - } else if (times.length > 0 && config.drawBell) { + } else if (config.drawBell && alarms.some(alarm=>alarm.on&&(alarm.hidden!==true))) { // next alarm too far in future, draw only widalarm bell g.reset().drawImage(atob("GBgBAAAAAAAAABgADhhwDDwwGP8YGf+YMf+MM//MM//MA//AA//AA//AA//AA//AA//AB//gD//wD//wAAAAADwAABgAAAAAAAAA"),this.x,this.y); calcWidth = 24; @@ -52,8 +52,13 @@ if (timeout === 0) { timeout += period; } - setTimeout(()=>{ - WIDGETS["widalarmeta"].draw(WIDGETS["widalarmeta"]); + + if (this.timeoutId !== undefined) { + clearTimeout(this.timeoutId); + } + this.timeoutId = setTimeout(()=>{ + this.timeoutId = undefined; + this.draw(); }, timeout); } /* draw */ From 5f11e6dec11d2d60688a3ecd48129cee2f8906ab Mon Sep 17 00:00:00 2001 From: Erik Andresen Date: Fri, 27 Jan 2023 17:59:07 +0100 Subject: [PATCH 02/27] sleepphasealarm fixes Fix dated events alarm on wrong date --- apps/sleepphasealarm/ChangeLog | 1 + apps/sleepphasealarm/app.js | 2 +- apps/sleepphasealarm/metadata.json | 4 ++-- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/apps/sleepphasealarm/ChangeLog b/apps/sleepphasealarm/ChangeLog index 795c62fa2..4815e5e75 100644 --- a/apps/sleepphasealarm/ChangeLog +++ b/apps/sleepphasealarm/ChangeLog @@ -13,3 +13,4 @@ 0.10: Fix: Do not wake when falling asleep 0.11: Minor tweaks 0.12: Support javascript command to execute as defined in scheduler 'js' configuration +0.13: Fix dated events alarm on wrong date diff --git a/apps/sleepphasealarm/app.js b/apps/sleepphasealarm/app.js index ba8bff9b2..0aef07760 100644 --- a/apps/sleepphasealarm/app.js +++ b/apps/sleepphasealarm/app.js @@ -10,7 +10,7 @@ const config = Object.assign({ disableAlarm: false, } }, require("Storage").readJSON(CONFIGFILE,1) || {}); -const active = alarms.filter(a=>a.on); +const active = alarms.filter(alarm => require("sched").getTimeToAlarm(alarm)); const schedSettings = require("sched").getSettings(); let buzzCount = schedSettings.buzzCount; let logs = []; diff --git a/apps/sleepphasealarm/metadata.json b/apps/sleepphasealarm/metadata.json index ced99062f..5382160c0 100644 --- a/apps/sleepphasealarm/metadata.json +++ b/apps/sleepphasealarm/metadata.json @@ -2,7 +2,7 @@ "id": "sleepphasealarm", "name": "SleepPhaseAlarm", "shortName": "SleepPhaseAlarm", - "version": "0.12", + "version": "0.13", "description": "Uses the accelerometer to estimate sleep and wake states with the principle of Estimation of Stationary Sleep-segments (ESS, see https://ubicomp.eti.uni-siegen.de/home/datasets/ichi14/index.html.en). This app will read the next alarm from the alarm application and will wake you up to 30 minutes early at the best guessed time when you are almost already awake.", "icon": "app.png", "tags": "alarm", @@ -14,6 +14,6 @@ {"name":"sleepphasealarm.settings.js","url":"settings.js"}, {"name":"sleepphasealarm.img","url":"app-icon.js","evaluate":true} ], - "data": [{"name":"sleepphasealarm.json","storageFile":true}], + "data": [{"name":"sleepphasealarm.json"}], "interface": "interface.html" } From 3287106ed7aade5fce85a9b52a41345e03ed771d Mon Sep 17 00:00:00 2001 From: Erik Andresen Date: Sat, 28 Jan 2023 10:06:01 +0100 Subject: [PATCH 03/27] widbatpc remove jitter option Add option 'Remove Jitter'='Drop only' to prevent percentage from getting up again when not charging --- apps/hwid_a_battery_widget/metadata.json | 1 + apps/wid_a_battery_widget/metadata.json | 1 + apps/widbatpc/ChangeLog | 1 + apps/widbatpc/metadata.json | 2 +- apps/widbatpc/settings.js | 24 +++++++++++++++++------- apps/widbatpc/widget.js | 17 +++++++++++++++-- 6 files changed, 36 insertions(+), 10 deletions(-) diff --git a/apps/hwid_a_battery_widget/metadata.json b/apps/hwid_a_battery_widget/metadata.json index 29b0540c2..981b81079 100644 --- a/apps/hwid_a_battery_widget/metadata.json +++ b/apps/hwid_a_battery_widget/metadata.json @@ -9,6 +9,7 @@ "readme": "README.md", "description": "Simple and slim battery widget with charge status and percentage", "tags": "widget,battery", + "provides_widgets" : ["battery"], "storage": [ {"name":"hwid_a_battery_widget.wid.js","url":"widget.js"} ] diff --git a/apps/wid_a_battery_widget/metadata.json b/apps/wid_a_battery_widget/metadata.json index 6c507b7b3..017550b1e 100644 --- a/apps/wid_a_battery_widget/metadata.json +++ b/apps/wid_a_battery_widget/metadata.json @@ -9,6 +9,7 @@ "readme": "README.md", "description": "Simple and slim battery widget with charge status and percentage", "tags": "widget,battery", + "provides_widgets" : ["battery"], "storage": [ {"name":"wid_a_battery_widget.wid.js","url":"widget.js"} ] diff --git a/apps/widbatpc/ChangeLog b/apps/widbatpc/ChangeLog index e70093659..782446cb4 100644 --- a/apps/widbatpc/ChangeLog +++ b/apps/widbatpc/ChangeLog @@ -13,3 +13,4 @@ 0.14: Fix drawing the bar when charging 0.15: Added option to always display the icon when charging (useful if 'hide if charge greater than' is enabled) 0.16: Increase screen update rate when charging +0.17: Add option 'Remove Jitter'='Drop only' to prevent percentage from getting up again when not charging diff --git a/apps/widbatpc/metadata.json b/apps/widbatpc/metadata.json index 953f8d345..cb47475cb 100644 --- a/apps/widbatpc/metadata.json +++ b/apps/widbatpc/metadata.json @@ -2,7 +2,7 @@ "id": "widbatpc", "name": "Battery Level Widget (with percentage)", "shortName": "Battery Widget", - "version": "0.16", + "version": "0.17", "description": "Show the current battery level and charging status in the top right of the clock, with charge percentage", "icon": "widget.png", "type": "widget", diff --git a/apps/widbatpc/settings.js b/apps/widbatpc/settings.js index b45fc6749..5cafbf1cf 100644 --- a/apps/widbatpc/settings.js +++ b/apps/widbatpc/settings.js @@ -5,6 +5,7 @@ (function(back) { const SETTINGS_FILE = 'widbatpc.json' const COLORS = ['By Level', 'Green', 'Monochrome'] + const RM_JITTER_OPTIONS = [/*LANG*/'Off', /*LANG*/'Drop only']; // initialize with default settings... let s = { @@ -14,6 +15,7 @@ 'charger': true, 'hideifmorethan': 100, 'alwaysoncharge': false, + 'removejitter': 0, } // ...and overwrite them with any saved values // This way saved values are preserved if a new version adds more settings @@ -28,7 +30,9 @@ return function (value) { s[key] = value; storage.write(SETTINGS_FILE, s); - WIDGETS["batpc"].reload(); + if ("WIDGETS" in global && WIDGETS["batpc"] !== undefined) { + WIDGETS["batpc"].reload(); + } } } @@ -36,17 +40,17 @@ const menu = { '': { 'title': 'Battery Widget' }, '< Back': back, - 'Percentage': { + /*LANG*/'Percentage': { value: s.percentage, format: onOffFormat, onchange: save('percentage'), }, - 'Charging Icon': { + /*LANG*/'Charging Icon': { value: s.charger, format: onOffFormat, onchange: save('charger'), }, - 'Color': { + /*LANG*/'Color': { format: () => s.color, onchange: function () { // cycles through options @@ -56,12 +60,12 @@ save('color')(s.color) } }, - 'Fill Bar': { + /*LANG*/'Fill Bar': { value: s.fillbar, format: onOffFormat, onchange: save('fillbar'), }, - 'Hide if >': { + /*LANG*/'Hide if >': { value: s.hideifmorethan||100, min: 10, max : 100, @@ -69,11 +73,17 @@ format: x => x+"%", onchange: save('hideifmorethan'), }, - 'Show on charge': { // Not sure if this is readable enough in the 'big' menu + /*LANG*/'Show on charge': { // Not sure if this is readable enough in the 'big' menu value: s.alwaysoncharge, format: onOffFormat, onchange: save('alwaysoncharge'), }, + /*LANG*/'Remove Jitter': { + value: s.removejitter, + min: 0, max: 1, + format: v => RM_JITTER_OPTIONS[v], + onchange: save('removejitter'), + }, } E.showMenu(menu) }) diff --git a/apps/widbatpc/widget.js b/apps/widbatpc/widget.js index 529923386..a204a1f9e 100644 --- a/apps/widbatpc/widget.js +++ b/apps/widbatpc/widget.js @@ -2,6 +2,8 @@ const intervalLow = 60000; // update time when not charging const intervalHigh = 2000; // update time when charging + let prevMin = 100; + let COLORS = {}; if (process.env.HWVERSION == 1) { @@ -33,6 +35,7 @@ 'charger': true, 'hideifmorethan': 100, 'alwaysoncharge': false, + 'removejitter': 0, // 0 == off, 1 == downwards only }; Object.keys(DEFAULTS).forEach(k=>{ if (settings[k]===undefined) settings[k]=DEFAULTS[k]; @@ -88,8 +91,18 @@ // else... var s = 39; var x = this.x, y = this.y; - const l = E.getBattery(), - c = levelColor(l); + let l = E.getBattery(); + if (setting('removejitter') === 1) { + // if we have seen a battery percentage that was lower than current, use lower + if (Bangle.isCharging()) { + prevMin = l; // charging is the only way to increase percentage + } else if (prevMin >= l) { + prevMin = l; + } else { + l = prevMin; + } + } + const c = levelColor(l); if (Bangle.isCharging() && setting('charger')) { g.setColor(chargerColor()).drawImage(atob( From d3c2c5a47dc8d029d827407f37d65fe934921db0 Mon Sep 17 00:00:00 2001 From: Stiralbios Date: Sun, 29 Jan 2023 10:13:29 +0100 Subject: [PATCH 04/27] [TerminalClock] Reapply changes for fast loading --- apps/terminalclock/ChangeLog | 1 + apps/terminalclock/app.js | 415 ++++++++++++++++--------------- apps/terminalclock/metadata.json | 2 +- 3 files changed, 222 insertions(+), 196 deletions(-) diff --git a/apps/terminalclock/ChangeLog b/apps/terminalclock/ChangeLog index 268e0427c..59cabf01c 100644 --- a/apps/terminalclock/ChangeLog +++ b/apps/terminalclock/ChangeLog @@ -7,3 +7,4 @@ 0.07: Use ClockFace module and rework the settings to be able to personnalize the order of the lines 0.08: Hide widgets instead of not loading them at all Use Clockface_menu for widgets and power saving settings +0.09: Add, fastload compatibility, default HRM value, default altitude value diff --git a/apps/terminalclock/app.js b/apps/terminalclock/app.js index 515ad8f66..392d16227 100644 --- a/apps/terminalclock/app.js +++ b/apps/terminalclock/app.js @@ -1,211 +1,236 @@ -const locale = require("locale"); -var heartRate = 0; -var altitude = -9001; +{ + const locale = require("locale"); + let heartRate = 0; + let altitude = -9001; -const fontColor = g.theme.dark ? "#0f0" : "#000"; -// handling the differents versions of the Banglejs smartwatch screen sizes -if (process.env.HWVERSION == 1){ - var paddingY = 3; - var font6x8At4Size = 48; - var font6x8At2Size = 27; - var font6x8FirstTextSize = 6; - var font6x8DefaultTextSize = 3; -} else{ - var paddingY = 2; - var font6x8At4Size = 32; - var font6x8At2Size = 18; - var font6x8FirstTextSize = 4; - var font6x8DefaultTextSize = 2; -} + const fontColor = g.theme.dark ? "#0f0" : "#000"; + // handling the differents versions of the Banglejs smartwatch screen sizes + // default BJS2 + let paddingY = 2; + let font6x8At4Size = 32; + let font6x8At2Size = 18; + let font6x8FirstTextSize = 4; + let font6x8DefaultTextSize = 2; + if (process.env.HWVERSION == 1){ + paddingY = 3; + font6x8At4Size = 48; + font6x8At2Size = 27; + font6x8FirstTextSize = 6; + font6x8DefaultTextSize = 3; + } + // initialising the clockface + const ClockFace = require("ClockFace"); + const clock = new ClockFace({ + precision: 60, + settingsFile: "terminalclock.json", -// initialising the clockface -const ClockFace = require("ClockFace"); -const clock = new ClockFace({ - precision: 60, - settingsFile: "terminalclock.json", + init: function () { + // check settings and set default if needed + this.showHRM = false; + this.showAltitude = false; + this.lock_precision = this.precision; + this.unlock_precision = 1; + if (this.HRMinConfidence === undefined) this.HRMinConfidence = 50; + if (this.PowerOnInterval === undefined) this.PowerOnInterval = 15; + if (this.powerSave===undefined) this.powerSave = this.powerSaving; // migrate old setting + if (this.powerSave===undefined) this.powerSave = true; - init: function () { - // check settings and set default if needed - this.showHRM = false; - this.showAltitude = false; - this.lock_precision = this.precision; - this.unlock_precision = 1; - if (this.HRMinConfidence === undefined) this.HRMinConfidence = 50; - if (this.PowerOnInterval === undefined) this.PowerOnInterval = 15; - if (this.powerSave===undefined) this.powerSave = this.powerSaving; // migrate old setting - if (this.powerSave===undefined) this.powerSave = true; - ["L2", "L3", "L4", "L5", "L6", "L7", "L8", "L9"].forEach(k => { - if (this[k]===undefined){ - if(k == "L2") this[k] = "Date"; - else if(k == "L3") { - this[k] = "HR"; - this.showHRM = true; - }else if(k == "L4") this[k] = "Motion"; - else if(k == "L5") this[k] = "Steps"; - else if(k == "L6") this[k] = ">"; - else this[k] = "Empty"; - } - else if (this[k]==="HR") this.showHRM = true; - else if (this[k]==="Alt") this.showAltitude = true && process.env.HWVERSION == 2; - }); + ["L2", "L3", "L4", "L5", "L6", "L7", "L8", "L9"].forEach(k => { + if (this[k]===undefined){ + if(k == "L2") this[k] = "Date"; + else if(k == "L3") { + this[k] = "HR"; + this.showHRM = true; + }else if(k == "L4") this[k] = "Motion"; + else if(k == "L5") this[k] = "Steps"; + else if(k == "L6") this[k] = ">"; + else this[k] = "Empty"; + } + else if (this[k]==="HR") this.showHRM = true; + else if (this[k]==="Alt") this.showAltitude = true && process.env.HWVERSION == 2; + }); - // set the lock and unlock actions - Bangle.on("lock", on => { - if (on) lock(); - else unlock(); - }); + // set the services (HRM, pressure sensor, etc....) + if(!this.powerSave){ + turnOnServices(); + } else{ + this.turnOnInterval = setInterval(turnOnServices, this.PowerOnInterval*60000); // every PowerOnInterval min + } + // start the clock unlocked + unlock(); + }, - // set the services (HRM, pressure sensor, etc....) - if(!this.powerSave){ - turnOnServices(); - } else{ - setInterval(turnOnServices, this.PowerOnInterval*60000); // every PowerOnInterval min - } - // start the clock unlocked - unlock(); - }, - - draw: function (date) { - var curPos = 1; - g.setFontAlign(-1, -1); - g.setColor(fontColor); - drawTime(date, curPos); - curPos++; - - ["L2", "L3", "L4", "L5", "L6", "L7", "L8", "L9"].forEach(line => { - if (this[line]==='Date') drawDate(date, curPos); - else if (this[line]==='HR') drawHRM(curPos); - else if (this[line]==='Motion') drawMotion(curPos); - else if (this[line]==='Alt') drawAltitude(curPos); - else if (this[line]==='Steps') drawStepCount(curPos); - else if (this[line]==='>') drawInput(curPos); + draw: function (date) { + let curPos = 1; + g.setFontAlign(-1, -1); + g.setColor(fontColor); + drawTime(date, curPos); curPos++; - }); - }, -}); + ["L2", "L3", "L4", "L5", "L6", "L7", "L8", "L9"].forEach(line => { + if (this[line]==='Date') drawDate(date, curPos); + else if (this[line]==='HR') drawHRM(curPos); + else if (this[line]==='Motion') drawMotion(curPos); + else if (this[line]==='Alt') drawAltitude(curPos); + else if (this[line]==='Steps') drawStepCount(curPos); + else if (this[line]==='>') drawInput(curPos); + curPos++; + }); + }, -/* ---------------------------- -Draw related of specific lines --------------------------------- */ - -function drawLine(line, pos){ - if(pos == 1) - g.setFont("6x8", font6x8FirstTextSize); - else - g.setFont("6x8", font6x8DefaultTextSize); - - var yPos = Bangle.appRect.y + - 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(pos){ - drawLine(">", pos); -} - -function drawStepCount(pos){ - var health = Bangle.getHealthStatus("day"); - var steps_formated = ">Steps: " + health.steps; - drawLine(steps_formated, pos); -} - -function drawHRM(pos){ - if(heartRate != 0) - drawLine(">HR: " + parseInt(heartRate), pos); - else - drawLine(">HR: unknown", pos); -} - -function drawAltitude(pos){ - if(altitude > 0) - drawLine(">Alt: " + altitude.toFixed(1) + "m", pos); - else - drawLine(">Alt: unknown", pos); -} - -function drawMotion(pos){ - var health = Bangle.getHealthStatus('last'); - var steps_formated = ">Motion: " + parseInt(health.movement); - drawLine(steps_formated, pos); -} - -/* ----------------------------------------------- -Services functions (HRM, pressure, etc...) --------------------------------------------------- */ - -function turnOnServices(){ - if(clock.showHRM){ - Bangle.setHRMPower(true, "terminalclock"); - } - if(clock.showAltitude){ - Bangle.setBarometerPower(true, "terminalclock"); - } - if(clock.powerSave){ - setTimeout(function () { + remove: function() { + if (this.turnOnInterval){ + clearInterval(this.turnOnInterval); + delete this.turnOnInterval; + } + if (this.turnOffServiceTimeout){ + clearTimeout(this.turnOffServiceTimeout) + } turnOffServices(); - }, 45000); - } -} + if (this.onLock) Bangle.removeListener('lock', this.onLock); + if (this.onHRM) Bangle.removeListener('HRM', this.onHRM); + if (this.onPressure) Bangle.removeListener('onPressure', this.onPressure); + } -function turnOffServices(){ - if(clock.showHRM){ - Bangle.setHRMPower(false, "terminalclock"); - } - if(clock.showAltitude){ - Bangle.setBarometerPower(false, "terminalclock"); - } -} + }); -Bangle.on('HRM',function(hrmInfo) { - if(hrmInfo.confidence >= clock.HRMinConfidence) - heartRate = hrmInfo.bpm; -}); -const MEDIANLENGTH = 20; // technical -var avr = [], median; // technical -Bangle.on('pressure', function(e) { - while (avr.length>MEDIANLENGTH) avr.pop(); - avr.unshift(e.altitude); - median = avr.slice().sort(); - if (median.length>10) { - var mid = median.length>>1; - altitude = E.sum(median.slice(mid-4,mid+5)) / 9; - } -}); + /* ---------------------------- + Draw related of specific lines + -------------------------------- */ -/* ------------------------------------------------- -Clock related functions but not in the ClockFace module ----------------------------------------------------- */ + let drawLine = function(line, pos){ + if(pos == 1) + g.setFont("6x8", font6x8FirstTextSize); + else + g.setFont("6x8", font6x8DefaultTextSize); -function unlock(){ - if(clock.powerSave){ - turnOnServices(); - } - clock.precision = clock.unlock_precision; - clock.tick(); -} + let yPos = Bangle.appRect.y + + paddingY * (pos - 1) + + font6x8At4Size * Math.min(1, pos-1) + + font6x8At2Size * Math.max(0, pos-2); + g.drawString(line, 5, yPos, true); + }; -function lock(){ - clock.precision = clock.lock_precision; - clock.tick(); -} + let drawTime = function(now, pos){ + let h = now.getHours(); + let m = now.getMinutes(); + let time = ">" + (""+h).substr(-2) + ":" + ("0"+m).substr(-2); + drawLine(time, pos); + }; -// starting the clock -clock.start(); + let drawDate = function(now, pos){ + let dow = locale.dow(now, 1); + let date = locale.date(now, 1).substr(0,6) + locale.date(now, 1).substr(-2); + let locale_date = ">" + dow + " " + date; + drawLine(locale_date, pos); + }; + + let drawInput = function(pos){ + drawLine(">", pos); + }; + + let drawStepCount = function(pos){ + let health = Bangle.getHealthStatus("day"); + let steps_formated = ">Steps: " + health.steps; + drawLine(steps_formated, pos); + }; + + let drawHRM = function(pos){ + if(heartRate != 0) + drawLine(">HR: " + parseInt(heartRate), pos); + else + drawLine( + ">HR: " + parseInt(Math.round(Bangle.getHealthStatus().bpm||Bangle.getHealthStatus("last").bpm)), + pos); + }; + + let drawAltitude = function(pos){ + if(altitude > 0) + drawLine(">Alt: " + altitude.toFixed(1) + "m", pos); + else + drawLine(">Alt: unknown", pos); + }; + + let drawMotion = function(pos){ + let health = Bangle.getHealthStatus('last'); + let steps_formated = ">Motion: " + parseInt(health.movement); + drawLine(steps_formated, pos); + }; + + /* ----------------------------------------------- + Services functions (HRM, pressure, etc...) + -------------------------------------------------- */ + + let turnOnServices = function(){ + if(clock.showHRM){ + Bangle.setHRMPower(true, "terminalclock"); + } + if(clock.showAltitude){ + Bangle.setBarometerPower(true, "terminalclock"); + } + if(clock.powerSave){ + clock.turnOffServiceTimeout = setTimeout(function () { + turnOffServices(); + }, 45000); + } + }; + + let turnOffServices = function(){ + if(clock.showHRM){ + Bangle.setHRMPower(false, "terminalclock"); + } + if(clock.showAltitude){ + Bangle.setBarometerPower(false, "terminalclock"); + } + }; + + // set the lock and unlock actions + clock.onLock = lock_event => { + if (lock_event) lock(); + else unlock(); + }; + Bangle.on("lock", clock.onLock); + + clock.onHRM = hrmInfo => { + if(hrmInfo.confidence >= clock.HRMinConfidence) + heartRate = hrmInfo.bpm; + }; + Bangle.on('HRM', clock.onHRM); + + const MEDIANLENGTH = 20; // technical + let avr = [], median; // technical + clock.onPressure = pressureInfo => { + while (avr.length>MEDIANLENGTH) avr.pop(); + avr.unshift(pressureInfo.altitude); + median = avr.slice().sort(); + if (median.length>10) { + let mid = median.length>>1; + altitude = E.sum(median.slice(mid-4,mid+5)) / 9; + } + else + altitude = pressureInfo.altitude; + }; + Bangle.on('pressure', clock.onPressure); + + + /* ------------------------------------------------- + Clock related functions but not in the ClockFace module + ---------------------------------------------------- */ + + let unlock = function(){ + if(clock.powerSave){ + turnOnServices(); + } + clock.precision = clock.unlock_precision; + clock.tick(); + }; + + let lock = function(){ + clock.precision = clock.lock_precision; + clock.tick(); + }; + + // starting the clock + clock.start(); +} \ No newline at end of file diff --git a/apps/terminalclock/metadata.json b/apps/terminalclock/metadata.json index 8403a3b4d..809bbc952 100644 --- a/apps/terminalclock/metadata.json +++ b/apps/terminalclock/metadata.json @@ -8,7 +8,7 @@ "type": "clock", "tags": "clock", "supports": ["BANGLEJS", "BANGLEJS2"], - "allow_emulator": true, + "allow_emulator": false, "readme": "README.md", "storage": [ {"name": "terminalclock.app.js","url": "app.js"}, From 9f9eb2ba81d225047c9079b50345afbe342e6ee8 Mon Sep 17 00:00:00 2001 From: Stiralbios Date: Sun, 29 Jan 2023 10:15:20 +0100 Subject: [PATCH 05/27] [TerminalClock] Version 0.0.9 --- 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 809bbc952..fcdafd017 100644 --- a/apps/terminalclock/metadata.json +++ b/apps/terminalclock/metadata.json @@ -3,7 +3,7 @@ "name": "Terminal Clock", "shortName":"Terminal Clock", "description": "A terminal cli like clock displaying multiple sensor data", - "version":"0.08", + "version":"0.09", "icon": "app.png", "type": "clock", "tags": "clock", From c9e28caf10a79fea3908112337481397ea0887bc Mon Sep 17 00:00:00 2001 From: Erik Andresen Date: Sun, 29 Jan 2023 11:00:28 +0100 Subject: [PATCH 06/27] widbatpc Add option to disable vibration when charger connects --- apps/widbatpc/ChangeLog | 1 + apps/widbatpc/settings.js | 6 ++++++ apps/widbatpc/widget.js | 5 ++++- 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/apps/widbatpc/ChangeLog b/apps/widbatpc/ChangeLog index 782446cb4..97da2cba6 100644 --- a/apps/widbatpc/ChangeLog +++ b/apps/widbatpc/ChangeLog @@ -14,3 +14,4 @@ 0.15: Added option to always display the icon when charging (useful if 'hide if charge greater than' is enabled) 0.16: Increase screen update rate when charging 0.17: Add option 'Remove Jitter'='Drop only' to prevent percentage from getting up again when not charging + Add option to disable vibration when charger connects diff --git a/apps/widbatpc/settings.js b/apps/widbatpc/settings.js index 5cafbf1cf..c988d23bf 100644 --- a/apps/widbatpc/settings.js +++ b/apps/widbatpc/settings.js @@ -16,6 +16,7 @@ 'hideifmorethan': 100, 'alwaysoncharge': false, 'removejitter': 0, + 'buzzoncharge': true, } // ...and overwrite them with any saved values // This way saved values are preserved if a new version adds more settings @@ -78,6 +79,11 @@ format: onOffFormat, onchange: save('alwaysoncharge'), }, + /*LANG*/'Buzz on charge': { + value: s.buzzoncharge, + format: onOffFormat, + onchange: save('buzzoncharge'), + }, /*LANG*/'Remove Jitter': { value: s.removejitter, min: 0, max: 1, diff --git a/apps/widbatpc/widget.js b/apps/widbatpc/widget.js index a204a1f9e..7f483c960 100644 --- a/apps/widbatpc/widget.js +++ b/apps/widbatpc/widget.js @@ -36,6 +36,7 @@ 'hideifmorethan': 100, 'alwaysoncharge': false, 'removejitter': 0, // 0 == off, 1 == downwards only + 'buzzoncharge': true, }; Object.keys(DEFAULTS).forEach(k=>{ if (settings[k]===undefined) settings[k]=DEFAULTS[k]; @@ -161,7 +162,9 @@ } Bangle.on('charging',function(charging) { - if(charging) Bangle.buzz(); + if (setting('buzzoncharge')) { + if(charging) Bangle.buzz(); + } update(); g.flip(); }); From c0d301c1e7c59a1d8e1714cdd5b51deeb7a7ae6b Mon Sep 17 00:00:00 2001 From: Stiralbios Date: Sun, 29 Jan 2023 11:04:35 +0100 Subject: [PATCH 07/27] [TerminalClock] Remove fastloading It still have memory leak and I am unable to find why --- apps/terminalclock/ChangeLog | 2 +- apps/terminalclock/app.js | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/apps/terminalclock/ChangeLog b/apps/terminalclock/ChangeLog index 59cabf01c..2df526734 100644 --- a/apps/terminalclock/ChangeLog +++ b/apps/terminalclock/ChangeLog @@ -7,4 +7,4 @@ 0.07: Use ClockFace module and rework the settings to be able to personnalize the order of the lines 0.08: Hide widgets instead of not loading them at all Use Clockface_menu for widgets and power saving settings -0.09: Add, fastload compatibility, default HRM value, default altitude value +0.09: Add default HRM value, default altitude value diff --git a/apps/terminalclock/app.js b/apps/terminalclock/app.js index 392d16227..04e4fb5c8 100644 --- a/apps/terminalclock/app.js +++ b/apps/terminalclock/app.js @@ -78,6 +78,8 @@ }); }, + /* + // todo add fastloading when the memory leak is fixed remove: function() { if (this.turnOnInterval){ clearInterval(this.turnOnInterval); @@ -91,6 +93,7 @@ if (this.onHRM) Bangle.removeListener('HRM', this.onHRM); if (this.onPressure) Bangle.removeListener('onPressure', this.onPressure); } + */ }); From 298df7b877e33e98877448dac9aff99ec30408fb Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 29 Jan 2023 15:55:49 +0100 Subject: [PATCH 08/27] Added happy clock --- apps/happyclk/ChangeLog | 1 + apps/happyclk/README.md | 10 ++ apps/happyclk/happyclk.app.js | 170 +++++++++++++++++++++++++++++++++ apps/happyclk/happyclk.icon.js | 1 + apps/happyclk/happyclk.png | Bin 0 -> 469 bytes apps/happyclk/metadata.json | 20 ++++ apps/happyclk/screenshot_1.png | Bin 0 -> 2547 bytes apps/happyclk/screenshot_2.png | Bin 0 -> 2554 bytes 8 files changed, 202 insertions(+) create mode 100644 apps/happyclk/ChangeLog create mode 100644 apps/happyclk/README.md create mode 100644 apps/happyclk/happyclk.app.js create mode 100644 apps/happyclk/happyclk.icon.js create mode 100644 apps/happyclk/happyclk.png create mode 100644 apps/happyclk/metadata.json create mode 100644 apps/happyclk/screenshot_1.png create mode 100644 apps/happyclk/screenshot_2.png diff --git a/apps/happyclk/ChangeLog b/apps/happyclk/ChangeLog new file mode 100644 index 000000000..759f68777 --- /dev/null +++ b/apps/happyclk/ChangeLog @@ -0,0 +1 @@ +0.01: New app! \ No newline at end of file diff --git a/apps/happyclk/README.md b/apps/happyclk/README.md new file mode 100644 index 000000000..e7f0cefa9 --- /dev/null +++ b/apps/happyclk/README.md @@ -0,0 +1,10 @@ +# Happy Clock + +A really happy clock. + +The left eye shows the hour, the right hour the minutes. +The mouth the battery percentage, each eyebrow shows 5k steps. +The left mouthline shows whether your bangle is locked or not and the right whether its connected via bluetooth or not. + +## Creator +- [David Peer](https://github.com/peerdavid). \ No newline at end of file diff --git a/apps/happyclk/happyclk.app.js b/apps/happyclk/happyclk.app.js new file mode 100644 index 000000000..aeefa499e --- /dev/null +++ b/apps/happyclk/happyclk.app.js @@ -0,0 +1,170 @@ +/************************************************ + * Happy Clock + */ +var W = g.getWidth(),R=W/2; +var H = g.getHeight(); +var drawTimeout; + + +/* + * Based on the great multi clock from https://github.com/jeffmer/BangleApps/ + */ +Graphics.prototype.drawRotRect = function(cx, cy, r1, r2, angle) { + angle = angle % 360; + var theta=angle*Math.PI/180; + var x = parseInt(cx+r1*Math.sin(theta)*1.2); + var y = parseInt(cy-r1*Math.cos(theta)*1.2); + + g.setColor(g.theme.fg); + g.fillCircle(cx, cy, 32); + g.setColor(g.theme.bg); + g.fillCircle(cx, cy, 28); + + g.setColor(g.theme.fg); + g.fillCircle(x, y, 12); +}; + +let drawEyes = function(){ + // And now the analog time + var drawHourHand = g.drawRotRect.bind(g,55,70,12,R-38); + var drawMinuteHand = g.drawRotRect.bind(g,125,70,12,R-12); + + g.setFontAlign(0,0); + + // Compute angles + var date = new Date(); + var m = parseInt(date.getMinutes() * 360 / 60); + var h = date.getHours(); + h = h > 12 ? h-12 : h; + h += date.getMinutes()/60.0; + h = parseInt(h*360/12); + + // Draw minute and hour fg + g.setColor(g.theme.fg); + drawHourHand(h); + drawMinuteHand(m); +} + +function quadraticCurve(t, p0x, p0y, p1x, p1y, p2x, p2y){ + var t2 = t * t; + var oneMinT = 1 - t; + var oneMinT2 = oneMinT * oneMinT; + return { + x: p0x * oneMinT2 + 2 * p1x * t * oneMinT + p2x *t2, + y: p0y * oneMinT2 + 2 * p1y * t * oneMinT + p2y *t2 + }; +} + +let drawSmile = function(isLocked){ + var w = 8; + var y = 120; + var o = parseInt(E.getBattery()*0.8); + + var isConnected = NRF.getSecurityStatus().connected; + for(var i = 0; i < w; i++){ + drawCurve(30, y+i, W/2+10, y+i+o, W-40, y+i); + } + + for(var i=0; i < w-2; i++){ + if(isLocked) g.drawLine(25, y+5+i, 35, y-5+i); + if(isConnected) g.drawLine(W-35, y+5+i, W-45, y-5+i); + } +} + +let drawEyeBrow = function(){ + var w = 4; + var steps = Bangle.getHealthStatus("day").steps; + var reached = steps / 10000.0; + reached = 1.1; + for(var i = 0; i < w; i++){ + if(reached > 0.5) g.drawLine(25, 25+i, 70, 15+i); + if(reached > 1.0) g.drawLine(W-25, 25+i, W-70, 15+i); + } +} + +// Thanks to user stephaneAG from the Espruino forum! +// https://forum.espruino.com/conversations/330154/#comment14593349 +let drawCurve = function(x1, y1, x2, y2, x3, y3){ + var p0 = { x: x1, y: y1}; + var p1 = { x: x2, y: y2}; + var p2 = { x: x3, y: y3}; + var time = 0; + //var stepping = 0.005; // seems the nicest + //var stepping = 0.05; // a little less neat, yet faster + var stepping = 0.1; // quick enough ? + var pathPts = []; + for(time = 0; time <= 1; time+= stepping){ + var pos = quadraticCurve(time, p0.x, p0.y, p1.x, p1.y, p2.x, p2.y); + pathPts.push(pos.x, pos.y); + } + g.drawPoly(pathPts, false); + g.flip(); +} + + +let draw = function(){ + // Queue draw in one minute + queueDraw(); + + var isLocked = Bangle.isLocked(); + drawHelper(isLocked); +} + +let drawHelper = function(isLocked){ + g.setColor(g.theme.fg); + g.reset().clear(); + + drawEyes(); + drawSmile(isLocked); + drawEyeBrow(); +} + + +/* + * Listeners + */ +Bangle.on('lcdPower',on=>{ + if (on) { + draw(); + } else { // stop draw timer + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = undefined; + } +}); + +Bangle.on('lock', function(isLocked) { + draw(isLocked); +}); + + +/* + * Some helpers + */ +let queueDraw = function() { + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = setTimeout(function() { + drawTimeout = undefined; + draw(); + }, 60000 - (Date.now() % 60000)); +} + + +/* + * Lets start widgets, listen for btn etc. + */ +// Show launcher when middle button pressed +Bangle.setUI("clock"); +Bangle.loadWidgets(); +/* + * we are not drawing the widgets as we are taking over the whole screen + * so we will blank out the draw() functions of each widget and change the + * area to the top bar doesn't get cleared. + */ +require('widget_utils').hide(); + +// Clear the screen once, at startup and draw clock +// g.setTheme({bg:"#fff",fg:"#000",dark:false}); +draw(); + +// After drawing the watch face, we can draw the widgets +// Bangle.drawWidgets(); diff --git a/apps/happyclk/happyclk.icon.js b/apps/happyclk/happyclk.icon.js new file mode 100644 index 000000000..d59fc0668 --- /dev/null +++ b/apps/happyclk/happyclk.icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwgP/ADEP/AEC+E//kH//+gYIB8F//1/B4U/ERgdB/wdB//AFIJGCx/n+P8EIM/+fnE4IBB/PAv4aBv/84E/z/8//8wAFDwwFB74FBgQFD/wFGyF/AoUAz//z/+AoPfAoV/gPP/+/IIP585lCj/z8ZvCw+H/HwPQUf/iACACIrBAAaRCGAP+AoXzAonxAoJRB//lAQJLBC4X/44IE8KeCVoQCBj4CB/iYBEwX+h6sCAAOB8BCD4C+CDwTKCACI=")) \ No newline at end of file diff --git a/apps/happyclk/happyclk.png b/apps/happyclk/happyclk.png new file mode 100644 index 0000000000000000000000000000000000000000..53fbe152ef305866412f0523c6088c97183854bb GIT binary patch literal 469 zcmV;`0V@89P)D=yD>gz z8<52-;B0)e1S0bH-xE^%cd{WU(I6fTMh($;qFhS>tV!I)0M2o3p{kR1Hjjuj5m9Xj zZ=tKg=;Tx`j{xtv-N$*xu*R7&us6!m+MjD4Mz~D-Jb3_3Qv3JN zoMPE<$SGv4#0ZZ#ZHy`a_5O-6K6dA|;^GPz|M}gtiqj z+b!MDXs9STT3f6@RS;(3&criBvuP$~;C=u(7PWVnTpjKpj%HPFp_b-~R--e*=*`5c z(hPG&T1v}v$kxbmy*=^Sc!q#0)I1teiHwbXIqt<$K(*(iom^`djsdR-Qvl)>6iBJD z6wrw(MT~P>2ydaIM4-L2Tflh7!xWO?3atRMzMpYG-5Od8A>YPU9B4@fAEUF?h^z?f zLm#CY^)~RcaphkrRU#lB7*o@(RU)~9*@DpTg{u3b%hp0(++M&BTNMyXm!1(>00000 LNkvXXu0mjf7L3kJ literal 0 HcmV?d00001 diff --git a/apps/happyclk/metadata.json b/apps/happyclk/metadata.json new file mode 100644 index 000000000..51028df4b --- /dev/null +++ b/apps/happyclk/metadata.json @@ -0,0 +1,20 @@ +{ + "id": "happyclk", + "name": "Happy Clock", + "shortName":"Happy Clock", + "icon": "happyclk.png", + "version":"0.01", + "readme": "README.md", + "supports": ["BANGLEJS2"], + "description": ":)", + "type": "clock", + "tags": "clock", + "screenshots": [ + {"url":"screenshot_1.png"}, + {"url":"screenshot_2.png"}, + ], + "storage": [ + {"name":"happyclk.app.js","url":"happyclk.app.js"}, + {"name":"happyclk.img","url":"happyclk.icon.js","evaluate":true} + ] +} diff --git a/apps/happyclk/screenshot_1.png b/apps/happyclk/screenshot_1.png new file mode 100644 index 0000000000000000000000000000000000000000..879b01cbf34ada7ef948777cfa587ab2b27c29d5 GIT binary patch literal 2547 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 MjjRkQ`nb6N0>e(3S^xk5 literal 0 HcmV?d00001 diff --git a/apps/happyclk/screenshot_2.png b/apps/happyclk/screenshot_2.png new file mode 100644 index 0000000000000000000000000000000000000000..d561c3175c23a53563b29773c14a9e39dd73b689 GIT binary patch literal 2554 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 Date: Sun, 29 Jan 2023 15:56:40 +0100 Subject: [PATCH 09/27] Added rebble link --- apps/happyclk/README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/apps/happyclk/README.md b/apps/happyclk/README.md index e7f0cefa9..d8680c54f 100644 --- a/apps/happyclk/README.md +++ b/apps/happyclk/README.md @@ -7,4 +7,7 @@ The mouth the battery percentage, each eyebrow shows 5k steps. The left mouthline shows whether your bangle is locked or not and the right whether its connected via bluetooth or not. ## Creator -- [David Peer](https://github.com/peerdavid). \ No newline at end of file +- [David Peer](https://github.com/peerdavid). + +Thanks for this great idea: +http://apps.rebble.io/de_DE/application/55014a037ed24ae745000004?section=watchfaces From c0596a48c79214b2018ae0d649799929d2f63d92 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 29 Jan 2023 15:57:43 +0100 Subject: [PATCH 10/27] Minor fix --- apps/happyclk/happyclk.app.js | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/happyclk/happyclk.app.js b/apps/happyclk/happyclk.app.js index aeefa499e..136111c82 100644 --- a/apps/happyclk/happyclk.app.js +++ b/apps/happyclk/happyclk.app.js @@ -75,7 +75,6 @@ let drawEyeBrow = function(){ var w = 4; var steps = Bangle.getHealthStatus("day").steps; var reached = steps / 10000.0; - reached = 1.1; for(var i = 0; i < w; i++){ if(reached > 0.5) g.drawLine(25, 25+i, 70, 15+i); if(reached > 1.0) g.drawLine(W-25, 25+i, W-70, 15+i); From 549ee39069bdf534068326f5c4f79509074cf3fc Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 29 Jan 2023 15:58:19 +0100 Subject: [PATCH 11/27] Fixed metadata --- apps/happyclk/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/happyclk/metadata.json b/apps/happyclk/metadata.json index 51028df4b..ca1f27e69 100644 --- a/apps/happyclk/metadata.json +++ b/apps/happyclk/metadata.json @@ -11,7 +11,7 @@ "tags": "clock", "screenshots": [ {"url":"screenshot_1.png"}, - {"url":"screenshot_2.png"}, + {"url":"screenshot_2.png"} ], "storage": [ {"name":"happyclk.app.js","url":"happyclk.app.js"}, From 60242a500821d3b1559c3fa4819e78a004d5431b Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 29 Jan 2023 16:01:34 +0100 Subject: [PATCH 12/27] Minor changes --- apps/happyclk/README.md | 3 +-- apps/happyclk/happyclk.app.js | 11 ++++------- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/apps/happyclk/README.md b/apps/happyclk/README.md index d8680c54f..997400eef 100644 --- a/apps/happyclk/README.md +++ b/apps/happyclk/README.md @@ -3,8 +3,7 @@ A really happy clock. The left eye shows the hour, the right hour the minutes. -The mouth the battery percentage, each eyebrow shows 5k steps. -The left mouthline shows whether your bangle is locked or not and the right whether its connected via bluetooth or not. +The mouth the battery percentage, each eyebrow the left mouthline shows whether your bangle is locked or not and the right whether you reached 10k steps. ## Creator - [David Peer](https://github.com/peerdavid). diff --git a/apps/happyclk/happyclk.app.js b/apps/happyclk/happyclk.app.js index 136111c82..6c443e1a0 100644 --- a/apps/happyclk/happyclk.app.js +++ b/apps/happyclk/happyclk.app.js @@ -59,25 +59,22 @@ let drawSmile = function(isLocked){ var w = 8; var y = 120; var o = parseInt(E.getBattery()*0.8); - - var isConnected = NRF.getSecurityStatus().connected; for(var i = 0; i < w; i++){ drawCurve(30, y+i, W/2+10, y+i+o, W-40, y+i); } + var reachedSteps = Bangle.getHealthStatus("day").steps >= 10000; for(var i=0; i < w-2; i++){ if(isLocked) g.drawLine(25, y+5+i, 35, y-5+i); - if(isConnected) g.drawLine(W-35, y+5+i, W-45, y-5+i); + if(reachedSteps) g.drawLine(W-35, y+5+i, W-45, y-5+i); } } let drawEyeBrow = function(){ var w = 4; - var steps = Bangle.getHealthStatus("day").steps; - var reached = steps / 10000.0; for(var i = 0; i < w; i++){ - if(reached > 0.5) g.drawLine(25, 25+i, 70, 15+i); - if(reached > 1.0) g.drawLine(W-25, 25+i, W-70, 15+i); + g.drawLine(25, 25+i, 70, 15+i); + g.drawLine(W-25, 25+i, W-70, 15+i); } } From 1cfb4c1eb22d0f6a6ec871d0dbbc6f2871314bcf Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 29 Jan 2023 17:53:37 +0100 Subject: [PATCH 13/27] Minor design imrpvements --- apps/happyclk/README.md | 4 +++- apps/happyclk/happyclk.app.js | 24 +++++++++++++----------- apps/happyclk/metadata.json | 2 +- apps/happyclk/screenshot_1.png | Bin 2547 -> 2530 bytes apps/happyclk/screenshot_2.png | Bin 2554 -> 2550 bytes 5 files changed, 17 insertions(+), 13 deletions(-) diff --git a/apps/happyclk/README.md b/apps/happyclk/README.md index 997400eef..140645fa4 100644 --- a/apps/happyclk/README.md +++ b/apps/happyclk/README.md @@ -1,6 +1,8 @@ # Happy Clock -A really happy clock. +A happy clock. + +![](screenshot_1.png) The left eye shows the hour, the right hour the minutes. The mouth the battery percentage, each eyebrow the left mouthline shows whether your bangle is locked or not and the right whether you reached 10k steps. diff --git a/apps/happyclk/happyclk.app.js b/apps/happyclk/happyclk.app.js index 6c443e1a0..e6dec0795 100644 --- a/apps/happyclk/happyclk.app.js +++ b/apps/happyclk/happyclk.app.js @@ -9,7 +9,7 @@ var drawTimeout; /* * Based on the great multi clock from https://github.com/jeffmer/BangleApps/ */ -Graphics.prototype.drawRotRect = function(cx, cy, r1, r2, angle) { +Graphics.prototype.drawPupils = function(cx, cy, r1, dx, dy, angle) { angle = angle % 360; var theta=angle*Math.PI/180; var x = parseInt(cx+r1*Math.sin(theta)*1.2); @@ -18,16 +18,18 @@ Graphics.prototype.drawRotRect = function(cx, cy, r1, r2, angle) { g.setColor(g.theme.fg); g.fillCircle(cx, cy, 32); g.setColor(g.theme.bg); - g.fillCircle(cx, cy, 28); + g.fillCircle(cx, cy, 27); + g.fillCircle(cx+dx, cy+dy, 28); g.setColor(g.theme.fg); - g.fillCircle(x, y, 12); + g.fillCircle(x, y, 8); + g.fillCircle(x+1, y, 8); }; let drawEyes = function(){ // And now the analog time - var drawHourHand = g.drawRotRect.bind(g,55,70,12,R-38); - var drawMinuteHand = g.drawRotRect.bind(g,125,70,12,R-12); + var drawHour = g.drawPupils.bind(g,55,70,12,1,0,R-38); + var drawMinute = g.drawPupils.bind(g,125,70,12,0,1,R-12); g.setFontAlign(0,0); @@ -41,8 +43,8 @@ let drawEyes = function(){ // Draw minute and hour fg g.setColor(g.theme.fg); - drawHourHand(h); - drawMinuteHand(m); + drawHour(h); + drawMinute(m); } function quadraticCurve(t, p0x, p0y, p1x, p1y, p2x, p2y){ @@ -65,16 +67,16 @@ let drawSmile = function(isLocked){ var reachedSteps = Bangle.getHealthStatus("day").steps >= 10000; for(var i=0; i < w-2; i++){ - if(isLocked) g.drawLine(25, y+5+i, 35, y-5+i); + if(isLocked) g.drawLine(25, y+6+i, 35, y-5+i); if(reachedSteps) g.drawLine(W-35, y+5+i, W-45, y-5+i); } } let drawEyeBrow = function(){ - var w = 4; + var w = 6; for(var i = 0; i < w; i++){ - g.drawLine(25, 25+i, 70, 15+i); - g.drawLine(W-25, 25+i, W-70, 15+i); + g.drawLine(25, 25+i, 70, 15+i%3); + g.drawLine(W-25, 28+i%3, W-68, 19+i); } } diff --git a/apps/happyclk/metadata.json b/apps/happyclk/metadata.json index ca1f27e69..48d05842c 100644 --- a/apps/happyclk/metadata.json +++ b/apps/happyclk/metadata.json @@ -6,7 +6,7 @@ "version":"0.01", "readme": "README.md", "supports": ["BANGLEJS2"], - "description": ":)", + "description": "A happy clock :)", "type": "clock", "tags": "clock", "screenshots": [ diff --git a/apps/happyclk/screenshot_1.png b/apps/happyclk/screenshot_1.png index 879b01cbf34ada7ef948777cfa587ab2b27c29d5..c3e372608e8534e3600be6ede5269c4bf61d59d7 100644 GIT binary patch literal 2530 zcmbVO`8(7L7yo|83^Rjkjmh2}LuI`&crDp7s*$aPi{TcPq|C)NNXDd6jJe3ZO^r3% zAZwGpb*|AF_1_dL%zpL3q)Jf9yvKb+5b=pU!ahd^OvJ?&x*z8?!LOVRjXJE z7uxYFRt{YFW`4ywC-QK6XJDHOqiarLp9Ql!wEZJwmw$O&4}sLTK3WBUy1}Z6nvg&9 zISk(XJVv_!NQ)apOY#OcYbh`X;j>y+RN`dUEK2|I|5z5!=`aM?3?LFnzwmvS~n1E`LVO>f=2tPYxiQYb3at3Q$JjN zGQ4%&IrEHPk4c|x&D|CiWz#P)^Lpx#O4`M7JIs@Fn#@um^EbbzlOV#<#%T5N;YEO9 z#C*1zld|wn7I(*I#Kn42mTI3!vi8tpj)t=u(yJLIF(@kcRGI_ftGTEkdk=z{pO=*d zSW5|T^Il5~wO%3l{?p#C_OF$fmo89Qxl1sapH=0WSr(26lh(tAEcYtS^{x-cfST*- zyUFfUpeyJvE%1{& z>A*$SS_q5#({%@Su+Ot2gXy>Q0iumv78VtD@%$B?R9zRIpuxI)j-?xKxk=BUD6F4Q z%V74DS+hDev-mkBn);@kTcOFHk_<(CXUDlOzK zomlnu)2&%O-%0wc2gC3JE>qnE-vAZkRGy^pvv$(3Dk*WFT z06{6#Xv@5W(A; zf!Z`;XvjzGh=X7Y1`{*ipZajT4yqV`s0Ph74rUPjdK*&?d9R4^UnUy|Ge&=k6UD8b zp2J}b^~mtCmF__lKXW-MpyTj%|L*G%xry-~-j?NN03yx~R7*R0&MrzH+$*L=$Yn^U z10qzp@IRlSZf`bchNbfUKFKap8(SCwM`@K{rhz^tFXz`*pmNbITFf3<?Ht3iL^R}p;Df|ksvS*lcxcejx&s?q8veE(Oqmb4!V2pi~4GPeE%^As)(&z zq$w=Vc)zV+mHSGjX%O?|o^h0J635zNq4CqD7Gbcl45t)?KmM6(%C7P%eIy_&Kp*B$ zGF%GqP1kbRCaqnvRCf%vaxvPFuv*eM{mXe!aA_?6aZCN^%?QDxq^UtbkoRWl%W~eE z!>c9BHhG6P_V&}atn4xPS*4co`id~JUxYhQ z=ZSYhG)uR8u9B9=)C8mcOLecfB|_fdtfxj_Yqb$w>eF4ogGL!WP4;*GO$YhA5=eKI z7lRZM>UsYWGG5wIW%Tq-GbisDT`sa}E^kt>0&nB@m(S7lCB(hef9FEqf5FX(E>C2C zdY2!bYI=3yGZ2H|^NY+r7`49bV8wkD|8|a!X5;8M8BU=+FjHlh+Zl1oyzd;nNc1D} zNlYLHVcSWOcB>F>c6mpD$=``@mbQ3fcq+7#S5-#LhO3B&iTL3l3oG}bVg!_$@{Ln- z;0HBL#4rLilihMF?f)Ny5v%LHnj>uvb#NSX?hWv5Z(bG@E3}hNA z^E~&Tin2Ae`@z5c$Z`@>ktHI2lDe>nmMwQrs zbJaYJf5kXL$8H7t%!#GjKWMUb#54hl+cy^LZyoUr?lR{M2??PGRAZr=ZR(JlRU^%8ZoV~_8Szd}e02$D zwH6(rlA^;{alw03FD|0UeV+lw*}3fbYNX)Aj+Jcu)Pj;E?^{Am9InZ%}D literal 2547 zcmZ`*c{mh$7yivmBQusu3?hRpg|Z}!HCeJN%UGj{vS;5)WhmMCxRE7^A(}CREZL2c z8i}}eVzOjQGmMa2KKFUPKfimP=bZPS_xy3*bI$X;Nms0lxsbw0005V%iJ{FQR{xXi zY=^b#^}O35KtgSd^#P^t#4-Q~vZ>)kyC}D{!tsbX45#7b!NEYD$7Ol)>5^(5c_$V| zM)vs%66#aW+WjXU96Z;vg}Z^qm!a&x2>`IMlTm<5UNc|CP&V1xZT`L4&z>d)Q18MDBAv@$kDzF>b1qWd6Nl^{pWo=auB zqlGWRlQ|zr{U{`E4gzz_3xHyGn<1AkQ?;VuBfo6}7`~M<3@kCs1s|!FW=oD3DCeRI z8`$6T4*~7z152aDW>1bpVQWMI|H{uy=w1BJ7Y5g~)@JQRM~`iUBd&Q*zP=Id=)wL#NO9#Hfg z*p4^vG3=f2(ri9@EVm+Gr@Er(_iJtKYK(!_EMR-m7hm@9W1|e}ub-?`Ar*@3Kp8(3 z)kWknfCtHU2OW(#j#oKw>LDw|#1wD*P{}w&W%4>nrAxMl=wf#~W+bgoUd)8@^NNHO z7bI;WuZ~L*SEBSeUA?3Jx-6lY`xv4e_O-JB$t*N|hDuYUu}m0^ZKJOTV{2(COqH_u zCEr0?)dnSw<`032;LPav3_)+VRXH0wOIqTE6ZBLmYyi)nl`MLtaiMjGK||EB-lcam z56{1^ka%3=QERY4OkyHfn^T=q-3Pymcr54c<5KP6B@f zgRct+f&MV|w@qLt#^*DPgE?y_*%`7@jAo`2l};^|D`(aa;aH3Lr4q-849lxh{3i&Y z`pciVU+6Ku=@vO{4(6iw($~?b^H{msaG}C|$NF=?(Y(uNdYluaT0Vu?9ON)7JTEW4 z5dba@*GazW9-PL4pLQ##!ov!omGaD`8WN%&+8U`|ioFUP4UBlGD&j5>ckzBNgdMId z%he^ZB}}8q4)*$|OdqRnZlhPZuw}%13X)dZW76H%{X}O*#bHzc3Szj%*UzhpjII9E z358SH0tnCxDeU-D5-fko(o;OsI$ule6#jC7wcZgae%Y>d@jHT%Ku#3fW?9AAs%aCe z8+M_%bdOeLSsQ$>uP3nBk4C{0+blMm)sf#)cOcbo zTonneBiPc4{4CxWB(;!K{n~VTmGt3;MNhI87rk7PoUF6%UAxHZH(xL0uggtKS4Ghk zc)W5S2V2VaqTDTxHfna|$=q}+h-)(Qmj?IaFsqe2%Xh~Jw}c?J(%gN5dYR34-}9}j z35TnPb|pdccHJf4NzEo$opdKwd@N^Tp%}h-B3ohL{y+asI~#Qq^1?aUFD@Txcs#WI zk>|Z6L{`moaCDU-EnB7G20X`3)GBL2Ih)${O&nrbaNzAG?b-wDy(NFfl6ZqB+d=9B zD%=NF9f_rQbHf7-u@s8AIsR-aDIk@9x@A3oWy|aC)jY1nDrZK|pe0jO(J}eF?d94yd9Y$kZ~Aj+kl@J75}(w!k(NGER#bu23{J zIVii*#!>JW`xf%fN!pDs70=1tUl2noEncpFwniHCT980R-$c?Q&kwupAYeO)OLcrT z&!=6}U<~D|LBA&wAoM$=>qPcmw+Yxv(Qgkqj_=PXZ#ncgjnz9l3hAL`p9SAGyAsyCWtT*7(ovIuGtoy$ zL(*QmaWGh*&`i4hB&a8SDsh)cwW8fJ&>1mp%_chQVV^w(=V*WYV4xK`!T?Etww+SAgj zEL?7LL3BP+XMPdi;ycNl6AE7taBmQH*i*~k_`%H#7|=Hn|K<-=?wBI#P=T6#wl-Rx zG+Xv`A-h#-Y`2J~6=!7Ao%ins)O~v!fbH-WUJp8O29xEt#{I*-07DeMLifh$UbEdT z2(oL%Zx=yb9Oz;#mfgmbWo8dKoNUhO$o-gbmqmJOrUUHZ;jJA9n_ zs%#(4j$g=6@~Yh0ec=e+BfyyT)iY~V0Bns4IRqU(lU8y{+24njX;|M0N}S@sys#x;6>lP8{9vn#iRwpjp6$+7s^NH4kL+#Ll*~3 MjjRkQ`nb6N0>e(3S^xk5 diff --git a/apps/happyclk/screenshot_2.png b/apps/happyclk/screenshot_2.png index d561c3175c23a53563b29773c14a9e39dd73b689..d290f835050d7a8e475efdb6c55a1c164d5a724c 100644 GIT binary patch literal 2550 zcmbW3dpy$%AIE>cZDt#0k+~L&bYbqvwPWsDhZP~q?1W7&Gxyb~O~^?d_r%F`Lh_KU zIy}qx{>+>_k+d~PXg#iFS z$;;FA*mo8EGbrTuEo^y5`z~O@F%M^;;hD}H0H8%)t|UJWZLxgu?2H{MV`8)8qhQaX z-Q%Qic!3kV?CZ&Scvb+a|FrD$%*@RE1>OC5etaL;b*p%*O)3aGf;(p9#PhwF+p9{q z$O{5t*X>fR1VADG1qLU6FR#Cch3PfH5H?Bc5e}dsyjD#Qs_pie zL7QoM-T^>XhGc$zR{K^(h3T1fl0TixQx2q(c0qj~zl}BTfP5fYw;K;FJtk)?5-9C% zC3iE*9{3@bBn2?kS3&=6U?~L3n)uQ5{KHyRX5t~5#nIDSI5@(yT55AAU)(zqRLjC@emNUAT(#P{dj== zrGel63-eU~s>z75S4wN)6se>LSVOo!kyGPM9WAi}xQJQorz2*P1_cKwA8dnNQM5?f z_!(~ujR33At@27{bZyvNT0_(CDXHWi5W#xj2%_KRLCqP*4~@`rWZm$42S)DGZ3%%} z=OUHmMD7m+Hv;8c;3p~v){;L-Lo+As&dp@17au(>j~bZ z_2-X)4IqQ}?6uRnUoOK2}1Y4S4(ThLT8kV^5>`yV9-UuB7X3>InN1 z@G>PNva`5(xU^IQ#N?RNEe6Bb436aRB~2W2B)oVLF;>9xjuC>NVVvI9a+9)lx8lGK z?3LjbT%CWUkyd5R*HWDR+$qDgkc(=EG8kettc{yv&?@C`6BG7qd;|vN?yC+1%`QRHcvF|1Z!U5*MBNa$EI})U^gMRvP!6}Vt zUC?@oZaI)GsE@H~srwz#Ad6-Pzu1{1vWK?SQB-$FQO>gTjZbK}sXv`2S4t+kWU@ja z>SjV@=qu}{SL6DYnv-8xhuZp@aAd8Z=sgg=X?p-^+)m?esve}I@t_4qJYU&4tn=3W zaCYelue$!<%WDn^a$X*QS3;YKcS6z4c#C}sm2(!Ashl9O;F}5^-bn+Z9v`?C$@)~v zcZ}6rl1$ydX3hyhB4ioEcFlO2q-`j&C52mOg6E<{Zp7d29H0oO^R6vfS6*F^|_gTT;giqI3_YCSi)gku|w76B7P6Gk_ zF@4XSpM$ z9t^Vgcs}NMDC&!=>AjB|R$5iSSizM$-cb|!{JN*TmF-20qxy5O6V4IJNk=0U{bjOloZ;Y$wY8+%tn(6fYB?9c)>O?vFqfh7wqK0W-7;>*Mdq2-h=)hCJNB; zD79d5z<^4DEf^?5j}O+M%*=?qTO=U$+qf=>tU`=cy$6I}+|fiB?SmlRuJhhiUFM1z@;<&7zldIF>r9%%P2eJz~0{7j>a zU)@pQhTkur{JDNGzDW})LP!XX1cCfd63@~GYZqXoi=55P|8>-KVgsQbVXkXAF;LVd}?E0f8sycfAA zs}ns7`NUG2DE#ou!I9-!gTke`#|+tg`7XHX+c;oGx2HGsI|7*o76JH%~}r_t|4 O4)AjGc5QH`r~e0Gc!Zh& literal 2554 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 Date: Sun, 29 Jan 2023 17:56:49 +0100 Subject: [PATCH 14/27] Fix --- apps/happyclk/happyclk.app.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/happyclk/happyclk.app.js b/apps/happyclk/happyclk.app.js index e6dec0795..9400c5119 100644 --- a/apps/happyclk/happyclk.app.js +++ b/apps/happyclk/happyclk.app.js @@ -28,8 +28,8 @@ Graphics.prototype.drawPupils = function(cx, cy, r1, dx, dy, angle) { let drawEyes = function(){ // And now the analog time - var drawHour = g.drawPupils.bind(g,55,70,12,1,0,R-38); - var drawMinute = g.drawPupils.bind(g,125,70,12,0,1,R-12); + var drawHour = g.drawPupils.bind(g,55,70,12,1,0); + var drawMinute = g.drawPupils.bind(g,125,70,12,0,1); g.setFontAlign(0,0); From e7a1928b33815cf1ed8eea362046d6bd5e61bdf2 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 29 Jan 2023 17:59:33 +0100 Subject: [PATCH 15/27] Minor improvements --- apps/happyclk/happyclk.app.js | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/apps/happyclk/happyclk.app.js b/apps/happyclk/happyclk.app.js index 9400c5119..b51019ffc 100644 --- a/apps/happyclk/happyclk.app.js +++ b/apps/happyclk/happyclk.app.js @@ -62,7 +62,7 @@ let drawSmile = function(isLocked){ var y = 120; var o = parseInt(E.getBattery()*0.8); for(var i = 0; i < w; i++){ - drawCurve(30, y+i, W/2+10, y+i+o, W-40, y+i); + drawCurve(30, y+i, W/2+12, y+i+o, W-40, y+i); } var reachedSteps = Bangle.getHealthStatus("day").steps >= 10000; @@ -87,9 +87,7 @@ let drawCurve = function(x1, y1, x2, y2, x3, y3){ var p1 = { x: x2, y: y2}; var p2 = { x: x3, y: y3}; var time = 0; - //var stepping = 0.005; // seems the nicest - //var stepping = 0.05; // a little less neat, yet faster - var stepping = 0.1; // quick enough ? + var stepping = 0.1; // Stepping defines the speed. var pathPts = []; for(time = 0; time <= 1; time+= stepping){ var pos = quadraticCurve(time, p0.x, p0.y, p1.x, p1.y, p2.x, p2.y); @@ -113,8 +111,8 @@ let drawHelper = function(isLocked){ g.reset().clear(); drawEyes(); - drawSmile(isLocked); drawEyeBrow(); + drawSmile(isLocked); } From 1a49342ccf15bc73fb13b643345fc5752a89abba Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Sun, 29 Jan 2023 17:00:47 +0000 Subject: [PATCH 16/27] chargent: support BangleJS2 --- apps/chargent/ChangeLog | 1 + apps/chargent/boot.js | 8 +++++--- apps/chargent/boot.min.js | 1 - apps/chargent/metadata.json | 6 +++--- 4 files changed, 9 insertions(+), 7 deletions(-) delete mode 100644 apps/chargent/boot.min.js diff --git a/apps/chargent/ChangeLog b/apps/chargent/ChangeLog index 7f837e50e..ae4aa0e36 100644 --- a/apps/chargent/ChangeLog +++ b/apps/chargent/ChangeLog @@ -1 +1,2 @@ 0.01: First version +0.02: Support BangleJS2 diff --git a/apps/chargent/boot.js b/apps/chargent/boot.js index 802c3f55a..b02d00a8e 100644 --- a/apps/chargent/boot.js +++ b/apps/chargent/boot.js @@ -1,4 +1,6 @@ (() => { + const pin = process.env.HWVERSION === 2 ? D3 : D30; + var id; Bangle.on('charging', (charging) => { if (charging) { @@ -6,9 +8,9 @@ var max = 0; var count = 0; id = setInterval(() => { - var d30 = analogRead(D30); - if (max < d30) { - max = d30; + var battlvl = analogRead(pin); + if (max < battlvl) { + max = battlvl; count = 0; } else { count++; diff --git a/apps/chargent/boot.min.js b/apps/chargent/boot.min.js deleted file mode 100644 index 700198146..000000000 --- a/apps/chargent/boot.min.js +++ /dev/null @@ -1 +0,0 @@ -(function(){var a;Bangle.on("charging",function(e){if(e){if(!a){var c=0,b=0;a=setInterval(function(){var d=analogRead(D30);c Date: Sun, 29 Jan 2023 18:04:40 +0100 Subject: [PATCH 17/27] Updated screenshots --- apps/happyclk/screenshot_1.png | Bin 2530 -> 2500 bytes apps/happyclk/screenshot_2.png | Bin 2550 -> 2501 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/apps/happyclk/screenshot_1.png b/apps/happyclk/screenshot_1.png index c3e372608e8534e3600be6ede5269c4bf61d59d7..20bf2d2942e7947bcf540d670e534b87a1a756f1 100644 GIT binary patch delta 2477 zcmV;e2~zgr6T}mcF@JtZL_t(|UhSRHcH=k-&H8O;dihw+Hxu^~x#%EP&}0cmnpbSOH9D->-s7CvXp}XJrH~Ke$JQr2zHqls_a&C)nGyu1RLYUJM=&q*7 zT3WiG!2Q&QrH)^9G5oP_w#2iT7Xfh#nur=KTAZ(mu4#D!v%`Csb5$qOEOuR3>RSph ziwLb&A{ycdU1p?vM4c^fmI2JrU$(@#d;PQanSV))hN1;-?^!sy-j+v80L~2WT^i4T z7_Cb$yvJHCYeUz58zw8>#I0IvYd812j!0o-pY4Tr6k-efJ-RPHg{S~8B8AbqtO6K) z%oo~1piLUt$=R7jD&bO!01Pe7tEebwmPuH=joriw9u< zqkmJzvRKqLBPooAcLl(a5HAH7wJTAeKHb-w!UA~Atq_1Kr|-xcx(IkzC2&*`da&723=Y$#SC!oju_wnKkNR`1ZFU5a=@By*GggJBh^&kf{RdV z7Qg^A1@LcC1uy_K)GY`kNfQtb9UPi?CAzI*m$~o(c zBv%l(;627zuXF8W!a=C@Lca?U0dOz8hqow*twy1~8$ihJuMnH5eQJQc@FF1=z;W%v zcR*(Ti3|bEn773MMzs;6@FG&!nt#5#^})Tm^lVFb0t?`KJ9g-U(Q8}=@Y~jrW}Yp9 zJw|!P^rRERwdgg50E|dsW`KJ(CfeYY5J#+SDZnEs%mna=Q6pnl!fBa1Vr^jn&rV@h zfP2#S>doB9rnW#8bxj1kA;)NE!S0}&VY=5C&)iRI^4u@VY_CS1aZzguO@H9K6!xah zXbO8^n+ z-VZ4}CR*q4+}pEpEn}iLS@e7s4SsOKn7|_-_X_ZIJrlUrL>zreS${S)lP@jQ> zyi5kQ)?@*$br0+7jJl)&7@f+D=2*dMy}|0e&uEH|%-1_MCBQS%xdN~)vpwmYO_ve? zw~W;5brlf6b-mqUWde8$o9ix80N3?)i9x=DLd%z;(UdVt-`Zy3^>&MuQ33q^@=3NYlWai=@giveKE636fQe}# zER6!-^Vj|aFd-$xB`pVd)o*km_C%$1D6kY@mftPVp_eWtQ(zguOuy@Z%oD0|*xy)F z0j&O)irv3|B9_^gB><~+-~#oonhYmH;Q*_3$OZ4aS|#uw&wpA!CCe;S4(#StndN9R zEP-3_9?}cqc@TQ!U%U?s5)(AHG~ zxTO&IbtSQ1;A-%u>485jvp}qt;-_jA;Y|y$wVe>e|9?UJwBfTKMW*V3mBhaGp=$c3 zPT(K!MD_9WE!mafEdy}tF?n`3`y;a_gR8?^3g8}ytM|sOH@THIaq1rUDves^eU7PQ zrezbCTQBpMd3qj~y*+WowxYFptHE2Yh47wI9OJSY+yb|9%T%s~7=<{S*%o-St*Ph9 zTOMFbUw?Qf7<(e`4sZDuVx%u-?vbtFR!-i-pDhx27RalC=mB?itvzkP$hF%6{CDRX zKD~PqHnP1Cxc5$M3vdRId%@i$b$>ijE1m=QK9W43Smx+S=@~Wj%x9@T!!_F{@XY>r zmEk*ryX~7e3uH6W&@#`AYj%crt79||EbJif4u7uzHd4(7vcUb{IQ76rh-aNzbWZo< za)J9>Jpt?_Dl(M?uFip-n6`%@K^C|M{dEr97Rh@>58Q&)r?OfIpKcmOqJRJ6gv#(KAb@?kX%vY90+_@ImEluB0Q+>)C=vw(Fo_W=!>51%_UWck rBqj<7U=kx#hED+j?9)x7NEG-NVnJnEXsjgR00000NkvXXu0mjf+l!5` literal 2530 zcmbVO`8(7L7yo|83^Rjkjmh2}LuI`&crDp7s*$aPi{TcPq|C)NNXDd6jJe3ZO^r3% zAZwGpb*|AF_1_dL%zpL3q)Jf9yvKb+5b=pU!ahd^OvJ?&x*z8?!LOVRjXJE z7uxYFRt{YFW`4ywC-QK6XJDHOqiarLp9Ql!wEZJwmw$O&4}sLTK3WBUy1}Z6nvg&9 zISk(XJVv_!NQ)apOY#OcYbh`X;j>y+RN`dUEK2|I|5z5!=`aM?3?LFnzwmvS~n1E`LVO>f=2tPYxiQYb3at3Q$JjN zGQ4%&IrEHPk4c|x&D|CiWz#P)^Lpx#O4`M7JIs@Fn#@um^EbbzlOV#<#%T5N;YEO9 z#C*1zld|wn7I(*I#Kn42mTI3!vi8tpj)t=u(yJLIF(@kcRGI_ftGTEkdk=z{pO=*d zSW5|T^Il5~wO%3l{?p#C_OF$fmo89Qxl1sapH=0WSr(26lh(tAEcYtS^{x-cfST*- zyUFfUpeyJvE%1{& z>A*$SS_q5#({%@Su+Ot2gXy>Q0iumv78VtD@%$B?R9zRIpuxI)j-?xKxk=BUD6F4Q z%V74DS+hDev-mkBn);@kTcOFHk_<(CXUDlOzK zomlnu)2&%O-%0wc2gC3JE>qnE-vAZkRGy^pvv$(3Dk*WFT z06{6#Xv@5W(A; zf!Z`;XvjzGh=X7Y1`{*ipZajT4yqV`s0Ph74rUPjdK*&?d9R4^UnUy|Ge&=k6UD8b zp2J}b^~mtCmF__lKXW-MpyTj%|L*G%xry-~-j?NN03yx~R7*R0&MrzH+$*L=$Yn^U z10qzp@IRlSZf`bchNbfUKFKap8(SCwM`@K{rhz^tFXz`*pmNbITFf3<?Ht3iL^R}p;Df|ksvS*lcxcejx&s?q8veE(Oqmb4!V2pi~4GPeE%^As)(&z zq$w=Vc)zV+mHSGjX%O?|o^h0J635zNq4CqD7Gbcl45t)?KmM6(%C7P%eIy_&Kp*B$ zGF%GqP1kbRCaqnvRCf%vaxvPFuv*eM{mXe!aA_?6aZCN^%?QDxq^UtbkoRWl%W~eE z!>c9BHhG6P_V&}atn4xPS*4co`id~JUxYhQ z=ZSYhG)uR8u9B9=)C8mcOLecfB|_fdtfxj_Yqb$w>eF4ogGL!WP4;*GO$YhA5=eKI z7lRZM>UsYWGG5wIW%Tq-GbisDT`sa}E^kt>0&nB@m(S7lCB(hef9FEqf5FX(E>C2C zdY2!bYI=3yGZ2H|^NY+r7`49bV8wkD|8|a!X5;8M8BU=+FjHlh+Zl1oyzd;nNc1D} zNlYLHVcSWOcB>F>c6mpD$=``@mbQ3fcq+7#S5-#LhO3B&iTL3l3oG}bVg!_$@{Ln- z;0HBL#4rLilihMF?f)Ny5v%LHnj>uvb#NSX?hWv5Z(bG@E3}hNA z^E~&Tin2Ae`@z5c$Z`@>ktHI2lDe>nmMwQrs zbJaYJf5kXL$8H7t%!#GjKWMUb#54hl+cy^LZyoUr?lR{M2??PGRAZr=ZR(JlRU^%8ZoV~_8Szd}e02$D zwH6(rlA^;{alw03FD|0UeV+lw*}3fbYNX)Aj+Jcu)Pj;E?^{Am9InZ%}D diff --git a/apps/happyclk/screenshot_2.png b/apps/happyclk/screenshot_2.png index d290f835050d7a8e475efdb6c55a1c164d5a724c..5bb00bc38de160a0e8d86053d4e1299a93da59f3 100644 GIT binary patch delta 2478 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 literal 2550 zcmbW3dpy$%AIE>cZDt#0k+~L&bYbqvwPWsDhZP~q?1W7&Gxyb~O~^?d_r%F`Lh_KU zIy}qx{>+>_k+d~PXg#iFS z$;;FA*mo8EGbrTuEo^y5`z~O@F%M^;;hD}H0H8%)t|UJWZLxgu?2H{MV`8)8qhQaX z-Q%Qic!3kV?CZ&Scvb+a|FrD$%*@RE1>OC5etaL;b*p%*O)3aGf;(p9#PhwF+p9{q z$O{5t*X>fR1VADG1qLU6FR#Cch3PfH5H?Bc5e}dsyjD#Qs_pie zL7QoM-T^>XhGc$zR{K^(h3T1fl0TixQx2q(c0qj~zl}BTfP5fYw;K;FJtk)?5-9C% zC3iE*9{3@bBn2?kS3&=6U?~L3n)uQ5{KHyRX5t~5#nIDSI5@(yT55AAU)(zqRLjC@emNUAT(#P{dj== zrGel63-eU~s>z75S4wN)6se>LSVOo!kyGPM9WAi}xQJQorz2*P1_cKwA8dnNQM5?f z_!(~ujR33At@27{bZyvNT0_(CDXHWi5W#xj2%_KRLCqP*4~@`rWZm$42S)DGZ3%%} z=OUHmMD7m+Hv;8c;3p~v){;L-Lo+As&dp@17au(>j~bZ z_2-X)4IqQ}?6uRnUoOK2}1Y4S4(ThLT8kV^5>`yV9-UuB7X3>InN1 z@G>PNva`5(xU^IQ#N?RNEe6Bb436aRB~2W2B)oVLF;>9xjuC>NVVvI9a+9)lx8lGK z?3LjbT%CWUkyd5R*HWDR+$qDgkc(=EG8kettc{yv&?@C`6BG7qd;|vN?yC+1%`QRHcvF|1Z!U5*MBNa$EI})U^gMRvP!6}Vt zUC?@oZaI)GsE@H~srwz#Ad6-Pzu1{1vWK?SQB-$FQO>gTjZbK}sXv`2S4t+kWU@ja z>SjV@=qu}{SL6DYnv-8xhuZp@aAd8Z=sgg=X?p-^+)m?esve}I@t_4qJYU&4tn=3W zaCYelue$!<%WDn^a$X*QS3;YKcS6z4c#C}sm2(!Ashl9O;F}5^-bn+Z9v`?C$@)~v zcZ}6rl1$ydX3hyhB4ioEcFlO2q-`j&C52mOg6E<{Zp7d29H0oO^R6vfS6*F^|_gTT;giqI3_YCSi)gku|w76B7P6Gk_ zF@4XSpM$ z9t^Vgcs}NMDC&!=>AjB|R$5iSSizM$-cb|!{JN*TmF-20qxy5O6V4IJNk=0U{bjOloZ;Y$wY8+%tn(6fYB?9c)>O?vFqfh7wqK0W-7;>*Mdq2-h=)hCJNB; zD79d5z<^4DEf^?5j}O+M%*=?qTO=U$+qf=>tU`=cy$6I}+|fiB?SmlRuJhhiUFM1z@;<&7zldIF>r9%%P2eJz~0{7j>a zU)@pQhTkur{JDNGzDW})LP!XX1cCfd63@~GYZqXoi=55P|8>-KVgsQbVXkXAF;LVd}?E0f8sycfAA zs}ns7`NUG2DE#ou!I9-!gTke`#|+tg`7XHX+c;oGx2HGsI|7*o76JH%~}r_t|4 O4)AjGc5QH`r~e0Gc!Zh& From 9f648c1e1e8d14ff88fcaf3f5996483600e6437c Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 29 Jan 2023 19:56:31 +0100 Subject: [PATCH 18/27] Performance improvements --- apps/happyclk/happyclk.app.js | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/apps/happyclk/happyclk.app.js b/apps/happyclk/happyclk.app.js index b51019ffc..5c8f55997 100644 --- a/apps/happyclk/happyclk.app.js +++ b/apps/happyclk/happyclk.app.js @@ -58,15 +58,15 @@ function quadraticCurve(t, p0x, p0y, p1x, p1y, p2x, p2y){ } let drawSmile = function(isLocked){ - var w = 8; var y = 120; var o = parseInt(E.getBattery()*0.8); - for(var i = 0; i < w; i++){ - drawCurve(30, y+i, W/2+12, y+i+o, W-40, y+i); - } + // Draw smile + drawCurve(30, y, W/2+12, y+o, W-40, y); + + // And the two "mouth lines" var reachedSteps = Bangle.getHealthStatus("day").steps >= 10000; - for(var i=0; i < w-2; i++){ + for(var i=0; i < 6; i++){ if(isLocked) g.drawLine(25, y+6+i, 35, y-5+i); if(reachedSteps) g.drawLine(W-35, y+5+i, W-45, y-5+i); } @@ -88,12 +88,15 @@ let drawCurve = function(x1, y1, x2, y2, x3, y3){ var p2 = { x: x3, y: y3}; var time = 0; var stepping = 0.1; // Stepping defines the speed. - var pathPts = []; - for(time = 0; time <= 1; time+= stepping){ - var pos = quadraticCurve(time, p0.x, p0.y, p1.x, p1.y, p2.x, p2.y); - pathPts.push(pos.x, pos.y); + + for(var y = 0; y < 8; y++){ + var pathPts = []; + for(time = 0; time <= 1; time+= stepping){ + var pos = quadraticCurve(time, p0.x, p0.y, p1.x, p1.y, p2.x, p2.y); + pathPts.push(pos.x, pos.y+y); + } + g.drawPoly(pathPts, false); } - g.drawPoly(pathPts, false); g.flip(); } From 916a7c30a8a7930ff24b7b58204e9f2e9e1de53e Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 29 Jan 2023 19:58:41 +0100 Subject: [PATCH 19/27] Minor changes --- apps/happyclk/happyclk.app.js | 66 ++++++++++++++++++++--------------- 1 file changed, 37 insertions(+), 29 deletions(-) diff --git a/apps/happyclk/happyclk.app.js b/apps/happyclk/happyclk.app.js index 5c8f55997..ad8f80cbf 100644 --- a/apps/happyclk/happyclk.app.js +++ b/apps/happyclk/happyclk.app.js @@ -7,8 +7,10 @@ var drawTimeout; /* - * Based on the great multi clock from https://github.com/jeffmer/BangleApps/ + * HELPER */ + +// Based on the great multi clock from https://github.com/jeffmer/BangleApps/ Graphics.prototype.drawPupils = function(cx, cy, r1, dx, dy, angle) { angle = angle % 360; var theta=angle*Math.PI/180; @@ -26,6 +28,40 @@ Graphics.prototype.drawPupils = function(cx, cy, r1, dx, dy, angle) { g.fillCircle(x+1, y, 8); }; +let quadraticCurve = function(t, p0x, p0y, p1x, p1y, p2x, p2y){ + var t2 = t * t; + var oneMinT = 1 - t; + var oneMinT2 = oneMinT * oneMinT; + return { + x: p0x * oneMinT2 + 2 * p1x * t * oneMinT + p2x *t2, + y: p0y * oneMinT2 + 2 * p1y * t * oneMinT + p2y *t2 + }; +} + +// Thanks to user stephaneAG from the Espruino forum! +// https://forum.espruino.com/conversations/330154/#comment14593349 +let drawCurve = function(x1, y1, x2, y2, x3, y3){ + var p0 = { x: x1, y: y1}; + var p1 = { x: x2, y: y2}; + var p2 = { x: x3, y: y3}; + var time = 0; + var stepping = 0.1; // Stepping defines the speed. + + for(var y = 0; y < 8; y++){ + var pathPts = []; + for(time = 0; time <= 1; time+= stepping){ + var pos = quadraticCurve(time, p0.x, p0.y, p1.x, p1.y, p2.x, p2.y); + pathPts.push(pos.x, pos.y+y); + } + g.drawPoly(pathPts, false); + } + g.flip(); +} + + +/* + * Draw the clock + */ let drawEyes = function(){ // And now the analog time var drawHour = g.drawPupils.bind(g,55,70,12,1,0); @@ -47,15 +83,6 @@ let drawEyes = function(){ drawMinute(m); } -function quadraticCurve(t, p0x, p0y, p1x, p1y, p2x, p2y){ - var t2 = t * t; - var oneMinT = 1 - t; - var oneMinT2 = oneMinT * oneMinT; - return { - x: p0x * oneMinT2 + 2 * p1x * t * oneMinT + p2x *t2, - y: p0y * oneMinT2 + 2 * p1y * t * oneMinT + p2y *t2 - }; -} let drawSmile = function(isLocked){ var y = 120; @@ -80,25 +107,6 @@ let drawEyeBrow = function(){ } } -// Thanks to user stephaneAG from the Espruino forum! -// https://forum.espruino.com/conversations/330154/#comment14593349 -let drawCurve = function(x1, y1, x2, y2, x3, y3){ - var p0 = { x: x1, y: y1}; - var p1 = { x: x2, y: y2}; - var p2 = { x: x3, y: y3}; - var time = 0; - var stepping = 0.1; // Stepping defines the speed. - - for(var y = 0; y < 8; y++){ - var pathPts = []; - for(time = 0; time <= 1; time+= stepping){ - var pos = quadraticCurve(time, p0.x, p0.y, p1.x, p1.y, p2.x, p2.y); - pathPts.push(pos.x, pos.y+y); - } - g.drawPoly(pathPts, false); - } - g.flip(); -} let draw = function(){ From c958c52c49554fa71fdc3f2dfc0079f03c530319 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 29 Jan 2023 20:01:15 +0100 Subject: [PATCH 20/27] Updated readme --- apps/happyclk/README.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/apps/happyclk/README.md b/apps/happyclk/README.md index 140645fa4..91ad892cb 100644 --- a/apps/happyclk/README.md +++ b/apps/happyclk/README.md @@ -4,8 +4,11 @@ A happy clock. ![](screenshot_1.png) -The left eye shows the hour, the right hour the minutes. -The mouth the battery percentage, each eyebrow the left mouthline shows whether your bangle is locked or not and the right whether you reached 10k steps. +## How to read? +- The left eye shows the hour, the right hour the minutes. +- The happiness decreases as the battery level decreases. +- The left mouthline shows whether your bangle is locked or not +- The right mouthline whether you reached 10k steps or not. ## Creator - [David Peer](https://github.com/peerdavid). From c8b41bf4e985062f178cc183867fa85ce6934e19 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 29 Jan 2023 20:01:30 +0100 Subject: [PATCH 21/27] Minor changes --- apps/happyclk/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/happyclk/README.md b/apps/happyclk/README.md index 91ad892cb..eec6104ed 100644 --- a/apps/happyclk/README.md +++ b/apps/happyclk/README.md @@ -4,7 +4,7 @@ A happy clock. ![](screenshot_1.png) -## How to read? +## How to read this happy clock? - The left eye shows the hour, the right hour the minutes. - The happiness decreases as the battery level decreases. - The left mouthline shows whether your bangle is locked or not From 135fa048b7cc7aba0d2f8f73331d197144cf6b28 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 29 Jan 2023 20:04:33 +0100 Subject: [PATCH 22/27] Added low battery example --- apps/happyclk/README.md | 4 ++++ apps/happyclk/metadata.json | 3 ++- apps/happyclk/screenshot_3.png | Bin 0 -> 2391 bytes 3 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 apps/happyclk/screenshot_3.png diff --git a/apps/happyclk/README.md b/apps/happyclk/README.md index eec6104ed..3540b5aca 100644 --- a/apps/happyclk/README.md +++ b/apps/happyclk/README.md @@ -10,6 +10,10 @@ A happy clock. - The left mouthline shows whether your bangle is locked or not - The right mouthline whether you reached 10k steps or not. +Here you can see an example of a locked bangle with a low battery: + +![](screenshot_3.png) + ## Creator - [David Peer](https://github.com/peerdavid). diff --git a/apps/happyclk/metadata.json b/apps/happyclk/metadata.json index 48d05842c..ef5f9836f 100644 --- a/apps/happyclk/metadata.json +++ b/apps/happyclk/metadata.json @@ -11,7 +11,8 @@ "tags": "clock", "screenshots": [ {"url":"screenshot_1.png"}, - {"url":"screenshot_2.png"} + {"url":"screenshot_2png"}, + {"url":"screenshot_3.png"} ], "storage": [ {"name":"happyclk.app.js","url":"happyclk.app.js"}, diff --git a/apps/happyclk/screenshot_3.png b/apps/happyclk/screenshot_3.png new file mode 100644 index 0000000000000000000000000000000000000000..404bd7918f450afa46832c36f37214a92b78e835 GIT binary patch literal 2391 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 Date: Wed, 16 Nov 2022 21:59:58 +0100 Subject: [PATCH 23/27] iconlaunch - Use E.showScroller --- apps/iconlaunch/app.js | 135 ++++++++++------------------------------- 1 file changed, 33 insertions(+), 102 deletions(-) diff --git a/apps/iconlaunch/app.js b/apps/iconlaunch/app.js index acf695ddb..8d155c73e 100644 --- a/apps/iconlaunch/app.js +++ b/apps/iconlaunch/app.js @@ -32,13 +32,14 @@ }) }; s.writeJSON("iconlaunch.cache.json", launchCache); } - let scroll = 0; + let selectedItem = -1; const R = Bangle.appRect; const iconSize = 48; const appsN = Math.floor(R.w / iconSize); const whitespace = (R.w - appsN * iconSize) / (appsN + 1); const itemSize = iconSize + whitespace; + let drawItem = function(itemI, r) { g.clearRect(r.x, r.y, r.x + r.w - 1, r.y + r.h - 1); let x = 0; @@ -61,36 +62,26 @@ } x += iconSize; } - drawText(itemI); + drawText(itemI, r.y); }; - let drawItemAuto = function(i) { - let y = idxToY(i); - g.reset().setClipRect(R.x, y, R.x2, y + itemSize); - drawItem(i, { - x: R.x, - y: y, - w: R.w, - h: itemSize - }); - g.setClipRect(0, 0, g.getWidth() - 1, g.getHeight() - 1); - }; - let lastIsDown = false; - let drawText = function(i) { + + let drawText = function(i, appY) { const selectedApp = launchCache.apps[selectedItem]; const idy = (selectedItem - (selectedItem % 3)) / 3; if (!selectedApp || i != idy) return; - const appY = idxToY(idy) + iconSize / 2; + appY = appY + itemSize/2; g.setFontAlign(0, 0, 0); g.setFont("12x20"); const rect = g.stringMetrics(selectedApp.name); g.clearRect( - R.w / 2 - rect.width / 2, - appY - rect.height / 2, - R.w / 2 + rect.width / 2, - appY + rect.height / 2 + R.w / 2 - rect.width / 2 - 2, + appY - rect.height / 2 - 2, + R.w / 2 + rect.width / 2 + 1, + appY + rect.height / 2 + 1 ); g.drawString(selectedApp.name, R.w / 2, appY); }; + let selectItem = function(id, e) { const iconN = E.clip(Math.floor((e.x - R.x) / itemSize), 0, appsN - 1); const appId = id * appsN + iconN; @@ -108,96 +99,32 @@ } } selectedItem = appId; - drawItems(); + if (scroller) scroller.draw(); }; - let idxToY = function(i) { - return i * itemSize + R.y - (scroll & ~1); - }; - let YtoIdx = function(y) { - return Math.floor((y + (scroll & ~1) - R.y) / itemSize); - }; - let drawItems = function() { - g.reset().clearRect(R.x, R.y, R.x2, R.y2); - g.setClipRect(R.x, R.y, R.x2, R.y2); - let a = YtoIdx(R.y); - let b = Math.min(YtoIdx(R.y2), 99); - for (let i = a; i <= b; i++) - drawItem(i, { - x: R.x, - y: idxToY(i), - w: R.w, - h: itemSize, - }); - g.setClipRect(0, 0, g.getWidth() - 1, g.getHeight() - 1); - }; - drawItems(); - g.flip(); const itemsN = Math.ceil(launchCache.apps.length / appsN); - let onDrag = function(e) { - updateTimeout(); - g.setColor(g.theme.fg); - g.setBgColor(g.theme.bg); - let dy = e.dy; - if (scroll + R.h - dy > itemsN * itemSize) { - dy = scroll + R.h - itemsN * itemSize; - } - if (scroll - dy < 0) { - dy = scroll; - } - scroll -= dy; - scroll = E.clip(scroll, 0, itemSize * (itemsN - 1)); - g.setClipRect(R.x, R.y, R.x2, R.y2); - g.scroll(0, dy); - if (dy < 0) { - g.setClipRect(R.x, R.y2 - (1 - dy), R.x2, R.y2); - let i = YtoIdx(R.y2 - (1 - dy)); - let y = idxToY(i); - while (y < R.y2) { - drawItem(i, { - x: R.x, - y: y, - w: R.w, - h: itemSize, - }); - i++; - y += itemSize; - } - } else { - g.setClipRect(R.x, R.y, R.x2, R.y + dy); - let i = YtoIdx(R.y + dy); - let y = idxToY(i); - while (y > R.y - itemSize) { - drawItem(i, { - x: R.x, - y: y, - w: R.w, - h: itemSize, - }); - y -= itemSize; - i--; - } - } - g.setClipRect(0, 0, g.getWidth() - 1, g.getHeight() - 1); - }; - let mode = { - mode: "custom", - drag: onDrag, - touch: (_, e) => { - if (e.y < R.y - 4) return; - updateTimeout(); - let i = YtoIdx(e.y); - selectItem(i, e); - }, - swipe: (h,_) => { if(settings.swipeExit && h==1) { Bangle.showClock(); } }, - btn: _=> { if (settings.oneClickExit) Bangle.showClock(); }, + + let back = ()=>{}; + if (settings.oneClickExit) back = Bangle.showClock; + + let options = { + h: itemSize, + c: itemsN, + draw: drawItem, + select: selectItem, + back: back, remove: function() { if (timeout) clearTimeout(timeout); + Bangle.removeListener("drag", updateTimeout); + Bangle.removeListener("touch", updateTimeout); + Bangle.removeListener("swipe", swipeHandler); if (settings.fullscreen) { // for fast-load, if we hid widgets then we should show them again require("widget_utils").show(); } } }; + let scroller = E.showScroller(options); + let timeout; const updateTimeout = function(){ if (settings.timeOut!="Off"){ @@ -207,7 +134,11 @@ } }; - updateTimeout(); + let swipeHandler = (h,_) => { if(settings.swipeExit && h==1) { Bangle.showClock(); } }; + + Bangle.on("swipe", swipeHandler) + Bangle.on("drag", updateTimeout); + Bangle.on("touch", updateTimeout); - Bangle.setUI(mode); + updateTimeout(); } From 84f048f058409bf5b6bb9d56983cb2289e0a5db4 Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Sun, 29 Jan 2023 22:09:15 +0100 Subject: [PATCH 24/27] iconlaunch - Adapt README --- apps/iconlaunch/README.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/apps/iconlaunch/README.md b/apps/iconlaunch/README.md index 0d36fdeb4..49d01d3fd 100644 --- a/apps/iconlaunch/README.md +++ b/apps/iconlaunch/README.md @@ -6,7 +6,3 @@ This launcher shows 9 apps per screen, making it much faster to navigate versus ![A screenshot](screenshot1.png) ![Another screenshot](screenshot2.png) - -## Technical note - -The app uses `E.showScroller`'s code in the app but not the function itself because `E.showScroller` doesn't report the position of a press to the select function. From 2bc311bcf7a9b375aa94f7abbc13409ead474dd3 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 29 Jan 2023 22:21:57 +0100 Subject: [PATCH 25/27] Fixed metadata --- apps/happyclk/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/happyclk/metadata.json b/apps/happyclk/metadata.json index ef5f9836f..2388db667 100644 --- a/apps/happyclk/metadata.json +++ b/apps/happyclk/metadata.json @@ -11,7 +11,7 @@ "tags": "clock", "screenshots": [ {"url":"screenshot_1.png"}, - {"url":"screenshot_2png"}, + {"url":"screenshot_2.png"}, {"url":"screenshot_3.png"} ], "storage": [ From 1a97f2bf41b1facf85e64a39cd31729822657676 Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Sun, 29 Jan 2023 22:48:14 +0000 Subject: [PATCH 26/27] lightswitch: whitespace --- apps/lightswitch/README.md | 60 +++++++++++++++++++------------------- apps/lightswitch/widget.js | 2 +- 2 files changed, 31 insertions(+), 31 deletions(-) diff --git a/apps/lightswitch/README.md b/apps/lightswitch/README.md index 67d070f5c..46c383a92 100644 --- a/apps/lightswitch/README.md +++ b/apps/lightswitch/README.md @@ -1,6 +1,6 @@ # Light Switch Widget -With this widget I wanted to create a solution to quickly en-/disable the LCD backlight and even change the brightness. +With this widget I wanted to create a solution to quickly en-/disable the LCD backlight and even change the brightness. In addition it shows the lock status with the option to personalize the lock icon with a tiny image. All touch and drag inputs related to this widget are cached/masked to prevent actions in the active app. @@ -9,32 +9,32 @@ All touch and drag inputs related to this widget are cached/masked to prevent ac --- ### Control --- -* __On / off__ +* __On / off__ Single touch the widget to en-/disable the backlight. -* __Change brightness__ _(can be disabled)_ +* __Change brightness__ _(can be disabled)_ First touch the widget, then quickly touch the screen again and drag up/down until you reach your wished brigthness. -* __Double tap to flash backlight__ _(can be disabled)_ - By defaut you can double tap on the right side of your bangle to flash the backlight for a short duration. +* __Double tap to flash backlight__ _(can be disabled)_ + By defaut you can double tap on the right side of your bangle to flash the backlight for a short duration. (While the backlight is active your bangle will be unlocked.) -* __Double tap to unlock__ _(disabled by default)_ +* __Double tap to unlock__ _(disabled by default)_ If a side is defined in the app settings, your bangle will be unlocked if you double tap on that side. --- ### Settings --- #### Widget - Change the apperance of the widget: -* __Bulb col__ - _red_ / _yellow_ / _green_ / __cyan__ / _blue_ / _magenta_ - Define the color used for the lightbulbs inner circle. +* __Bulb col__ + _red_ / _yellow_ / _green_ / __cyan__ / _blue_ / _magenta_ + Define the color used for the lightbulbs inner circle. The selected color will be dimmed depending on the actual brightness value. -* __Image__ - __default__ / _random_ / _..._ +* __Image__ + __default__ / _random_ / _..._ Set your favourite lock icon image. (If no image file is found _no image_ will be displayed.) * _random_ -> Select a random image on each time the widget is drawn. #### Control - Change when and how to use the widget: -* __Touch__ - _on def clk_ / _on all clk_ / _clk+setting_ / _clk+launch_ / _except apps_ / __always on__ +* __Touch__ + _on def clk_ / _on all clk_ / _clk+setting_ / _clk+launch_ / _except apps_ / __always on__ Select when touching the widget is active to en-/disable the backlight. * _on def clk_ -> only on your selected main clock face * _on all clk_ -> on all apps of the type _clock_ @@ -42,32 +42,32 @@ All touch and drag inputs related to this widget are cached/masked to prevent ac * _clk+launch_ -> on all apps of the types _clock_ and _launch_ * _except apps_ -> on all apps of the types _clock_ and _launch_ and in the settings * _always on_ -> always enabled when the widget is displayed -* __Oversize__ - _0px_ / _1px_ / _..._ / __20px__ / _..._ / _50px_ +* __Oversize__ + _0px_ / _1px_ / _..._ / __20px__ / _..._ / _50px_ To make it easier to hit the widget, this value extends the touch area of the widget in all directions. -* __Drag Delay__ - _off_ / _50ms_ / _100ms_ / _..._ / __500ms__ / _..._ / _1000ms_ +* __Drag Delay__ + _off_ / _50ms_ / _100ms_ / _..._ / __500ms__ / _..._ / _1000ms_ Change the maximum delay between first touch and re-touch/drag to change the brightness or disable changing the brightness completely. -* __Min Value__ - _1%_ / _2%_ / _..._ / __10%__ / _..._ / _100%_ - Set the minimal level of brightness you can change to. +* __Min Value__ + _1%_ / _2%_ / _..._ / __10%__ / _..._ / _100%_ + Set the minimal level of brightness you can change to. #### Unlock - Set double tap side to unlock: -* __TapSide__ +* __TapSide__ __off__ / _left_ / _right_ / _top_ / _bottom_ / _front_ / _back_ #### Flash - Change if and how to flash the backlight: -* __TapSide__ - _off_ / _left_ / __right__ / _top_ / _bottom_ / _front_ / _back_ +* __TapSide__ + _off_ / _left_ / __right__ / _top_ / _bottom_ / _front_ / _back_ Set double tap side to flash the backlight or disable completely. -* __Tap__ - _on locked_ / _on unlocked_ / __always on__ +* __Tap__ + _on locked_ / _on unlocked_ / __always on__ Select when a double tap is recognised. -* __Timeout__ - _0.5s_ / _1s_ / _..._ / __2s__ / _..._ / _10s_ +* __Timeout__ + _0.5s_ / _1s_ / _..._ / __2s__ / _..._ / _10s_ Change how long the backlight will be activated on a flash. -* __Min Value__ - _1%_ / _2%_ / _..._ / __20%__ / _..._ / _100%_ +* __Min Value__ + _1%_ / _2%_ / _..._ / __20%__ / _..._ / _100%_ Set the minimal level of brightness for the backlight on a flash. --- @@ -81,7 +81,7 @@ All touch and drag inputs related to this widget are cached/masked to prevent ac Examples in default light and dark theme. -| Lock | Heart | Invader | JS | Smiley | Skull | Storm | +| Lock | Heart | Invader | JS | Smiley | Skull | Storm | |:----:|:-----:|:-------:|:--:|:------:|:-----:|:-----:| | ![](images/image_lock.png) | ![](images/image_heart.png) | ![](images/image_invader.png) | ![](images/image_js.png) | ![](images/image_smiley.png) | ![](images/image_skull.png) | ![](images/image_storm.png) | diff --git a/apps/lightswitch/widget.js b/apps/lightswitch/widget.js index 9eb488aca..8ba139d4a 100644 --- a/apps/lightswitch/widget.js +++ b/apps/lightswitch/widget.js @@ -251,7 +251,7 @@ w = undefined; } }); - + Bangle.on("lock", locked => { var w = WIDGETS.lightswitch; // set lcd brightness on unlocking From fe9572bdbe115284df7299f30207a17b846cf2b1 Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Sun, 29 Jan 2023 22:48:23 +0000 Subject: [PATCH 27/27] lightswitch: tap-to-lock setting --- apps/lightswitch/README.md | 2 ++ apps/lightswitch/settings.js | 7 +++++++ apps/lightswitch/widget.js | 9 +++++++-- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/apps/lightswitch/README.md b/apps/lightswitch/README.md index 46c383a92..c17a6a4ed 100644 --- a/apps/lightswitch/README.md +++ b/apps/lightswitch/README.md @@ -51,6 +51,8 @@ All touch and drag inputs related to this widget are cached/masked to prevent ac * __Min Value__ _1%_ / _2%_ / _..._ / __10%__ / _..._ / _100%_ Set the minimal level of brightness you can change to. +* __Tap to lock__ + Tapping the widget locks the screen, rather than toggling brightness. #### Unlock - Set double tap side to unlock: * __TapSide__ diff --git a/apps/lightswitch/settings.js b/apps/lightswitch/settings.js index 5ac70bc28..aff45a444 100644 --- a/apps/lightswitch/settings.js +++ b/apps/lightswitch/settings.js @@ -10,6 +10,7 @@ oversize: 20, dragDelay: 500, minValue: 0.1, + tapToLock: false, unlockSide: "", tapSide: "right", tapOn: "always", @@ -119,6 +120,11 @@ max: 100, step: 1 }, + tapToLock: { + title: ["on", "off"], + value: [true, false], + drawWidgets: false + }, unlockSide: { title: ["off", "left", "right", "top", "bottom", "front", "back"], value: ["", "left", "right", "top", "bottom", "front", "back"] @@ -154,6 +160,7 @@ "Oversize": getEntry("oversize"), "Drag Delay": getEntry("dragDelay"), "Min Value": getEntry("minValue"), + "Tap to lock": getEntry("tapToLock"), "-- Unlock": 0, "TapSide": getEntry("unlockSide"), "-- Flash": 0, diff --git a/apps/lightswitch/widget.js b/apps/lightswitch/widget.js index 8ba139d4a..922875216 100644 --- a/apps/lightswitch/widget.js +++ b/apps/lightswitch/widget.js @@ -7,6 +7,7 @@ oversize: 20, dragDelay: 500, minValue: 0.1, + tapToLock: false, unlockSide: "", tapSide: "right", tapOn: "always", @@ -208,8 +209,12 @@ w.dragStatus = "off"; }, w.dragDelay, w); } - // switch backlight - w.changeValue(); + if (w.tapToLock) { + Bangle.setLocked(true); + } else { + // switch backlight + w.changeValue(); + } // masks this touch event by messing up the event handler // see https://github.com/espruino/Espruino/issues/2151 Bangle.removeListener("touch", w.touchListener);