From 8969eebab7a5ea0abc009644b6f0569fb6ab7681 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Sat, 22 Feb 2025 18:27:12 -0500 Subject: [PATCH 01/37] Daisy clock updates --- apps/daisy/ChangeLog | 1 + apps/daisy/app.js | 15 ++++++++------- apps/daisy/metadata.json | 2 +- apps/daisy/settings.js | 18 +++++++++++++++++- 4 files changed, 27 insertions(+), 9 deletions(-) diff --git a/apps/daisy/ChangeLog b/apps/daisy/ChangeLog index 3d8ef0472..aecf555c0 100644 --- a/apps/daisy/ChangeLog +++ b/apps/daisy/ChangeLog @@ -12,3 +12,4 @@ 0.12: Added setting to change Battery estimate to hours 0.13: Fixed Battery estimate Default to percentage and improved setting string 0.14: Use `power_usage` module +0.15: Made ring show minutes and allowed 12 hr time diff --git a/apps/daisy/app.js b/apps/daisy/app.js index 4aa7eb132..4e5ac9b19 100644 --- a/apps/daisy/app.js +++ b/apps/daisy/app.js @@ -84,6 +84,8 @@ function loadSettings() { settings.fg = settings.fg||'#0f0'; settings.idle_check = (settings.idle_check === undefined ? true : settings.idle_check); settings.batt_hours = (settings.batt_hours === undefined ? false : settings.batt_hours); + settings.hr_12 = (settings.hr_12 === undefined ? false : settings.hr_12); + settings.show_steps_ring = (settings.show_steps_ring === undefined ? false : settings.show_steps_ring); assignPalettes(); } @@ -221,13 +223,12 @@ function draw() { function drawClock() { var date = new Date(); - //var timeStr = require("locale").time(date,1); - var da = date.toString().split(" "); - //var time = da[4].substr(0,5); - var hh = da[4].substr(0,2); - var mm = da[4].substr(3,2); - var steps = getSteps(); - var p_steps = Math.round(100*(steps/10000)); + var hh = date.getHours(); + if (settings.hr_12) hh = hh % 12; + hh = hh.toString().toString().padStart(2, '0'); + var mm = date.getMinutes() + var p_steps = settings.show_steps_ring ? Math.round(100*(getSteps()/10000)) : Math.round(10*(mm/6)); + mm = mm.toString().padStart(2, '0'); g.reset(); g.setColor(g.theme.bg); diff --git a/apps/daisy/metadata.json b/apps/daisy/metadata.json index 178cd8b20..d75402153 100644 --- a/apps/daisy/metadata.json +++ b/apps/daisy/metadata.json @@ -1,6 +1,6 @@ { "id": "daisy", "name": "Daisy", - "version": "0.14", + "version": "0.15", "dependencies": {"mylocation":"app"}, "description": "A beautiful digital clock with large ring guage, idle timer and a cyclic information line that includes, day, date, steps, battery, sunrise and sunset times", "icon": "app.png", diff --git a/apps/daisy/settings.js b/apps/daisy/settings.js index 250633dea..9b017e042 100644 --- a/apps/daisy/settings.js +++ b/apps/daisy/settings.js @@ -6,7 +6,9 @@ 'fg' : '#0f0', 'color': 'Green', 'check_idle' : true, - 'batt_hours' : false}; + 'batt_hours' : false, + 'hr_12' : false, + 'show_steps_ring' : false}; // ...and overwrite them with any saved values // This way saved values are preserved if a new version adds more settings @@ -53,6 +55,20 @@ s.batt_hours = v; save(); }, + }, + '12 Hr Time': { + value: !!s.hr_12, + onchange: v => { + s.hr_12 = v; + save(); + }, + }, + 'Step Counter Ring': { + value: !!s.show_steps_ring, + onchange: v => { + s.show_steps_ring = v; + save(); + }, } }); }) From 38fe3c4d47909ed2fcaab26d51801a25ac14c451 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Sat, 22 Feb 2025 19:11:07 -0500 Subject: [PATCH 02/37] Added seconds to Daisy ring display --- apps/daisy/app.js | 13 ++++++++++++- apps/daisy/settings.js | 9 ++++++--- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/apps/daisy/app.js b/apps/daisy/app.js index 4e5ac9b19..b9963c926 100644 --- a/apps/daisy/app.js +++ b/apps/daisy/app.js @@ -227,7 +227,18 @@ function drawClock() { if (settings.hr_12) hh = hh % 12; hh = hh.toString().toString().padStart(2, '0'); var mm = date.getMinutes() - var p_steps = settings.show_steps_ring ? Math.round(100*(getSteps()/10000)) : Math.round(10*(mm/6)); + var p_steps; + switch (settings.ring) { + case 'Minutes': + p_steps = Math.round(100*(mm/60)); + break; + case 'Seconds': + p_steps = Math.round(100*(date.getSeconds()/60)); + break; + case 'Steps': + p_steps = Math.round(100*(getSteps()/10000)); + break; + } mm = mm.toString().padStart(2, '0'); g.reset(); diff --git a/apps/daisy/settings.js b/apps/daisy/settings.js index 9b017e042..65b5d7cc2 100644 --- a/apps/daisy/settings.js +++ b/apps/daisy/settings.js @@ -27,6 +27,7 @@ var color_options = ['Green','Orange','Cyan','Purple','Red','Blue']; var fg_code = ['#0f0','#ff0','#0ff','#f0f','#f00','#00f']; var gy_code = ['#020','#220','#022','#202','#200','#002']; + var ring_options = ['Minutes', 'Seconds', 'Steps']; E.showMenu({ '': { 'title': 'Daisy Clock' }, @@ -63,10 +64,12 @@ save(); }, }, - 'Step Counter Ring': { - value: !!s.show_steps_ring, + 'Ring Display': { + value: 0 | ring_options.indexOf(s.ring), + min: 0, max: 2, + format: v => ring_options[v], onchange: v => { - s.show_steps_ring = v; + s.ring = ring_options[v]; save(); }, } From 12e68f2a9fafe7769e7ca02541eb821b3df81856 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Sat, 22 Feb 2025 19:31:06 -0500 Subject: [PATCH 03/37] shorter timeout for seconds --- apps/daisy/app.js | 5 +++-- apps/daisy/settings.js | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/apps/daisy/app.js b/apps/daisy/app.js index b9963c926..b13ac6080 100644 --- a/apps/daisy/app.js +++ b/apps/daisy/app.js @@ -552,14 +552,15 @@ function buzzer(n) { // timeout used to update every minute var drawTimeout; -// schedule a draw for the next minute +// schedule a draw for the next minute or every 2 seconds function queueDraw() { + let delay = (settings.ring == 'Seconds') ? (2000 - (Date.now() % 2000)) : (60000 - (Date.now() % 60000)); if (drawTimeout) clearTimeout(drawTimeout); drawTimeout = setTimeout(function() { drawTimeout = undefined; checkIdle(); draw(); - }, 60000 - (Date.now() % 60000)); + }, delay); } // Stop updates when LCD is off, restart when on diff --git a/apps/daisy/settings.js b/apps/daisy/settings.js index 65b5d7cc2..fa4fd4222 100644 --- a/apps/daisy/settings.js +++ b/apps/daisy/settings.js @@ -8,7 +8,7 @@ 'check_idle' : true, 'batt_hours' : false, 'hr_12' : false, - 'show_steps_ring' : false}; + 'ring' : 'Minutes'}; // ...and overwrite them with any saved values // This way saved values are preserved if a new version adds more settings From 75dedf7400a87bf93cd8640ce2fb7fe69a42b84c Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Sun, 23 Feb 2025 10:43:39 -0500 Subject: [PATCH 04/37] Added all 5% in the Daisy wheel --- apps/daisy/app.js | 114 ++++++++++++++++++++++++++++++++----------- apps/thering/15p.png | Bin 0 -> 1364 bytes apps/thering/25p.png | Bin 0 -> 1368 bytes apps/thering/35p.png | Bin 0 -> 1408 bytes apps/thering/45p.png | Bin 0 -> 1456 bytes apps/thering/55p.png | Bin 0 -> 1460 bytes apps/thering/5p.png | Bin 0 -> 1364 bytes apps/thering/65p.png | Bin 0 -> 1407 bytes apps/thering/75p.png | Bin 0 -> 1371 bytes apps/thering/85p.png | Bin 0 -> 1358 bytes apps/thering/95p.png | Bin 0 -> 1360 bytes 11 files changed, 85 insertions(+), 29 deletions(-) create mode 100644 apps/thering/15p.png create mode 100644 apps/thering/25p.png create mode 100644 apps/thering/35p.png create mode 100644 apps/thering/45p.png create mode 100644 apps/thering/55p.png create mode 100644 apps/thering/5p.png create mode 100644 apps/thering/65p.png create mode 100644 apps/thering/75p.png create mode 100644 apps/thering/85p.png create mode 100644 apps/thering/95p.png diff --git a/apps/daisy/app.js b/apps/daisy/app.js index b13ac6080..21f56a083 100644 --- a/apps/daisy/app.js +++ b/apps/daisy/app.js @@ -304,109 +304,165 @@ Bangle.on('HRM', function(hrm) { // reduces ram usage from 70%-13% function getGaugeImage(p) { // p0 - if (p < 2) return { + if (p < 5) return { width : 176, height : 176, bpp : 2, transparent : -1, palette : pal1, buffer : require("heatshrink").decompress(atob("AH4A/AH4ACgtVAAVUFUgpDAAdAFMEBFQ4ABqBVnLMQqLLLzWEABLgbVgohEGopYaiofDBihWVHJpYYDgYPbKx1ACJhYZIwT4OcAZWYHyRYUIgQXQH4RqOThCXUYRpCHNyQVVQQTwVQiSZWIQSEQNgSYSIYiEQQSyEUCQLDSOAyCnQiSCYQiSCYQiSCZDaDARObKuBSZwcaVzR0QFYKuZWAYNZWCJJKMoKuaWAahKBhiwTJRSudURorBFTgfMVzqjDO5DaeZ5jaeJhhiKbi4rIbT4hLqoriPI7afUpS5BbTwiKFdZgIADSmHFYIqgbgIrGcgIriEYwzHADZ7HRY4rdaYrjHADcBFYoGBFcgkEGQwAeFYqKHFbzUEcQ4AdiorwiorlEogxFAD59FWoorhoArDqArjgIr/FbYwFAEJSDFf4rXgornqgrDFUkAior/Ff4rGAYYAjKYYr/Ff4r/FbdVFdFAFYNQFcsBFf4r/Ff4r/Ff4r/Ff4r/Ff4r/Ff4r/FbdUFcsFFYUVFdADBFf4r/Ff4rbAYYAjKYYr/Ff4rFoArkqorCgIrnqAr/FbIEFAEBSFFf4rYqgrjgorEiormAocVAogAfEooxFFcB9EFdq1DAD9VFYkBFctQFYoGEADokHFcp8FRQoAdag7iFFb4HFioHGADYjHGY4rcPYyLHADbTHcYNQFT4iIFdZgIADKmJqrcgiorIBIIrhMKIAXUpIrBbjzaBFZAKKbS5MJFcKkJbj4fLBYLcdqorKbjzPMbjxKNMhauTURawdJJorBWDShBFZiRBWDQcOHRyuPOhorBWDIbPWDRzQSYKEYIwLLOHgSEXDIJyPQjD2SQjCCQQjSCRCYY/QN4xDRQiyCSQgjdSCqqECLCRWBYyiECISBWCYqgXCLCBWCQSYYEIhxqCeChYFThoQCKypYEIxgPPLB4cKFQZWXDoosIBhhYWcArWDKzYhHABA1EADArNoArcFhgqeWQysgLJxVfcBLWdAH4A5A")) }; - // p2 - if (p >= 2 && p < 4) return { + // p5 + if (p < 10) return { width : 176, height : 176, bpp : 2, transparent : -1, palette: pal1, - buffer : require("heatshrink").decompress(atob("AH4A/ADNUFE8FqtVq2q1AqkFIIrDAAOAFMEBFQYrE1WgKsYrGLL4qFFY2pqDWeFZdUVkAhCAQMKFYdVLDUVFQYMHlWq0oMJKyoOJlQrCLDBWDB5clB5xWOoARMCARYWKwT4OgpYXKwY+SLChECC6A/CNRycIS6jCNIQ5uSCqqCCeCqESTKxCCQiBsCTCRDEQiCCWQigSBYaRwGQU6ESQTCESQTCESQTIbQYCJzZVwKTODjSuaOiArBVzKwDBrKwRJJRlBVzSwDUJQMMWCZKKVzqiNFYIqcD5iudUYZ3IbTzPMbTxMMMRTcXFZDafEJdVFcR5HbT6lKXILaeERQrrMBAAaUw4rBFUDcBFYzkBFcQjGGY4AbPY6LHFbrTFcY4AbgIrFAwIrkEggyGADwrFRQ4reagjiHADsVFeEVFcolEGIoAfPoq1FFcNAFYdQFccBFf4rbGAoAhKQYr/Fa8FFc9UFYYqkgEVFf4r/FYwDDAEZTDFf4r/Ff4rbqorooArBqArlgIr/Ff4r/Ff4r/Ff4r/Ff4r/Ff4r/Ff4rbqgrlgorCioroAYIr/Ff4r/FbYDDAEZTDFf4r/FYtAFclVFYUBFc9QFf4rZAgoAgKQor/FbFUFccFFYkVFcwFDioFEAD4lFGIorgPogrtWoYAfqorEgIrlqArFAwgAdEg4rlPgqKFADrUHcQorfA4sVA4wAbEY4zHFbh7GRY4AbaY7jBqAqfERArrMBAAZUxNVbkEVFZAJBFcJhRAC6lJFYLcebQIrIBRTaXJhIrhUhLcfD5YLBbjtVFZTceZ5jceJRpkLVyaiLWDpJNFYKwaUIIrMSIKwaDhw6OVx50NFYKwZDZ6waOaCTBQjBGBZZw8CQi4ZBOR6EYeySEYQSCEaQSITDH6BvGIaKEWQSSEEbqQVVQgRYSKwLGUQgRCQKwTFUC4RYQKwSCTDAhEONQTwULAqcNCARWVLAhGMB55YPDhQqDKy4dFFhAMMLCzgFawZWbEI4AIGogAYFZtAFbgsMFTyyGVkBZOKr7gJazoA/AHI")) - }; - - // p4 - if (p >= 4 && p < 7) return { - width : 176, height : 176, bpp : 2, - transparent : -1, - palette : pal1, - buffer : require("heatshrink").decompress(atob("AH4A/AH4ACgtVqtW1WoFUgpBFYYABwApggIqDFYmq0BVjFY2loAqjFY1VqDWeFZdUVkAhEhQrDLDcVFQYMHlQrCBhBWVHJpYYDgYPbKx1ACJhYZIwT4OgpYXKwY+SLChECC6A/CNRycIS6jCNIQ5uSCqqCCeCqESTKxCCQiBsCTCRDEQiCCWQigSBYaRwGQU6ESQTCESQTCESQTIbQYCJzZVwKTODjSuaOiArBVzKwDBrKwRJJRlBVzSwDUJQMMWCZKKVzqiNFYIqcD5iudUYZ3IbTzPMbTxMMMRTcXFZDafEJdVFcR5HbT6lKXILaeERQrrMBAAaUw4rBFUDcBFYzkBFcQjGGY4AbPY6LHFbrTFcY4AbgIrFAwIrkEggyGADwrFRQ4reagjiHADsVFeEVFcolEGIoAfPoq1FFcNAFYdQFccBFf4rbGAoAhKQYr/Fa8FFc9UFYYqkgEVFf4r/FYwDDAEZTDFf4r/Ff4rbqorooArBqArlgIr/Ff4r/Ff4r/Ff4r/Ff4r/Ff4r/Ff4rbqgrlgorCioroAYIr/Ff4r/FbYDDAEZTDFf4r/FYtAFclVFYUBFc9QFf4rZAgoAgKQor/FbFUFccFFYkVFcwFDioFEAD4lFGIorgPogrtWoYAfqorEgIrlqArFAwgAdEg4rlPgqKFADrUHcQorfA4sVA4wAbEY4zHFbh7GRY4AbaY7jBqAqfERArrMBAAZUxNVbkEVFZAJBFcJhRAC6lJFYLcebQIrIBRTaXJhIrhUhLcfD5YLBbjtVFZTceZ5jceJRpkLVyaiLWDpJNFYKwaUIIrMSIKwaDhw6OVx50NFYKwZDZ6waOaCTBQjBGBZZw8CQi4ZBOR6EYeySEYQSCEaQSITDH6BvGIaKEWQSSEEbqQVVQgRYSKwLGUQgRCQKwTFUC4RYQKwSCTDAhEONQTwULAqcNCARWVLAhGMB55YPDhQqDKy4dFFhAMMLCzgFawZWbEI4AIGogAYFZtAFbgsMFTyyGVkBZOKr7gJazoA/AHI")) - }; - - // p7 - if (p >= 7 && p < 10) return { - width : 176, height : 176, bpp : 2, - transparent : -1, - palette : pal1, - buffer : require("heatshrink").decompress(atob("AH4A/AH4ACgtVqtW1WoFUgpBFYYABwApggIqDFYmq0BVjFYxZfFQorGLLrWCFZbgbVgtUBQcKLD8VFQYMHlQsDKzoOJFgZYYKwYPLFgWlKzVACJgrCqBWYawgAJcAOlNBhWMCZ8qFYJYUgoqBC6ECFYJqOAApWSS4jCNQQ5uSCqqCCeCqESFQKZUIQSEQNgSYSIYiEQQSyEUCQLDSOAyCnQiSCYQiSCYQiSCZDaDARObKuBSZwcaVzR0QFYKuZWAYNZWCJJKMoKuaWAahKBhiwTJRSudURorBFTgfMVzqjDO5DaeZ5jaeJhhiKbi4rIbT4hLqoriPI7afUpS5BbTwiKFdZgIADSmHFYIqgbgIrGcgIriEYwzHADZ7HRY4rdaYrjHADcBFYoGBFcgkEGQwAeFYqKHFbzUEcQ4AdiorwiorlEogxFAD59FWoorhoArDqArjgIr/FbYwFAEJSDFf4rXgornqgrDFUkAior/Ff4rGAYYAjKYYr/Ff4r/FbdVFdFAFYNQFcsBFf4r/Ff4r/Ff4r/Ff4r/Ff4r/Ff4r/FbdUFcsFFYUVFdADBFf4r/Ff4rbAYYAjKYYr/Ff4rFoArkqorCgIrnqAr/FbIEFAEBSFFf4rYqgrjgorEiormAocVAogAfEooxFFcB9EFdq1DAD9VFYkBFctQFYoGEADokHFcp8FRQoAdag7iFFb4HFioHGADYjHGY4rcPYyLHADbTHcYNQFT4iIFdZgIADKmJqrcgiorIBIIrhMKIAXUpIrBbjzaBFZAKKbS5MJFcKkJbj4fLBYLcdqorKbjzPMbjxKNMhauTURawdJJorBWDShBFZiRBWDQcOHRyuPOhorBWDIbPWDRzQSYKEYIwLLOHgSEXDIJyPQjD2SQjCCQQjSCRCYY/QN4xDRQiyCSQgjdSCqqECLCRWBYyiECISBWCYqgXCLCBWCQSYYEIhxqCeChYFThoQCKypYEIxgPPLB4cKFQZWXDoosIBhhYWcArWDKzYhHABA1EADArNoArcFhgqeWQysgLJxVfcBLWdAH4A5A==")) + buffer : require("heatshrink").decompress(atob("AH4A/AH4ACgtVqtW1WoFUgpBFYYABwApggIqDFYmq0BVjFYxZfFQorGLLrWCFZeUVkFUBQcKFYdVqArZioqDBg8qFYQMIKyoOJlWpBoJYYKwYPLlIPOKx1ACJgQCLCxWCawgAJgpYXKwY+SLChECC6A/CNRycIS6jCNIQ5uSCqqCCeCqESTKxCCQiBsCTCRDEQiCCWQigSBYaRwGQU6ESQTCESQTCESQTIbQYCJzZVwKTODjSuaOiArBVzKwDBrKwRJJRlBVzSwDUJQMMWCZKKVzqiNFYIqcD5iudUYZ3IbTzPMbTxMMMRTcXFZDafEJdVFcR5HbT6lKXILaeERQrrMBAAaUw4rBFUDcBFYzkBFcQjGGY4AbPY6LHFbrTFcY4AbgIrFAwIrkEggyGADwrFRQ4reagjiHADsVFeEVFcolEGIoAfPoq1FFcNAFYdQFccBFf4rbGAoAhKQYr/Fa8FFc9UFYYqkgEVFf4r/FYwDDAEZTDFf4r/Ff4rbqorooArBqArlgIr/Ff4r/Ff4r/Ff4r/Ff4r/Ff4r/Ff4rbqgrlgorCioroAYIr/Ff4r/FbYDDAEZTDFf4r/FYtAFclVFYUBFc9QFf4rZAgoAgKQor/FbFUFccFFYkVFcwFDioFEAD4lFGIorgPogrtWoYAfqorEgIrlqArFAwgAdEg4rlPgqKFADrUHcQorfA4sVA4wAbEY4zHFbh7GRY4AbaY7jBqAqfERArrMBAAZUxNVbkEVFZAJBFcJhRAC6lJFYLcebQIrIBRTaXJhIrhUhLcfD5YLBbjtVFZTceZ5jceJRpkLVyaiLWDpJNFYKwaUIIrMSIKwaDhw6OVx50NFYKwZDZ6waOaCTBQjBGBZZw8CQi4ZBOR6EYeySEYQSCEaQSITDH6BvGIaKEWQSSEEbqQVVQgRYSKwLGUQgRCQKwTFUC4RYQKwSCTDAhEONQTwULAqcNCARWVLAhGMB55YPDhQqDKy4dFFhAMMLCzgFawZWbEI4AIGogAYFZtAFbgsMFTyyGVkBZOKr7gJazoA/AHIA=")) }; // p10 - if (p >= 10 && p < 20) return { + if (p < 15) return { width : 176, height : 176, bpp : 2, transparent : -1, palette : pal1, buffer : require("heatshrink").decompress(atob("AH4A/AH4ACgtVqtW1WoFUgpBFYYABwApggIqDFYmq0BVjFYxZfFQorGLLrWCFZbgbVgtUBQcKLD8VFQYMHlQsDKzoOJFgZYYKwYPLFgZWaoARMLDJWCawgAJcAZWYCZ6FCLCkFFQNQCZ8CFYOoFaZWSLAmAQShWQLAiESQQRtTLAOkQSdUFacK1WloCCSCaAAEFYKaQQSyEC0pvQirZTbomlIh6CYZAZFOQTBxDQhyCYOQhoPQS4bQHaBzaVwKTODjSuaOiArBVzKwDBrKwRJJRlBVzSwDUJQMMWCZKKVzqiNFYIqcD5iudUYZ3IbTzPMbTxMMMRTcXFZDafEJdVFcR5HbT6lKXILaeERQrrMBAAaUw4rBFUDcBFYzkBFcQjGGY4AbPY6LHFbrTFcY4AbgIrFAwIrkEggyGADwrFRQ4reagjiHADsVFeEVFcolEGIoAfPoq1FFcNAFYdQFccBFf4rbGAoAhKQYr/Fa8FFc9UFYYqkgEVFf4r/FYwDDAEZTDFf4r/Ff4rbqorooArBqArlgIr/Ff4r/Ff4r/Ff4r/Ff4r/Ff4r/Ff4rbqgrlgorCioroAYIr/Ff4r/FbYDDAEZTDFf4r/FYtAFclVFYUBFc9QFf4rZAgoAgKQor/FbFUFccFFYkVFcwFDioFEAD4lFGIorgPogrtWoYAfqorEgIrlqArFAwgAdEg4rlPgqKFADrUHcQorfA4sVA4wAbEY4zHFbh7GRY4AbaY7jBqAqfERArrMBAAZUxNVbkEVFZAJBFcJhRAC6lJFYLcebQIrIBRTaXJhIrhUhLcfD5YLBbjtVFZTceZ5jceJRpkLVyaiLWDpJNFYKwaUIIrMSIKwaDhw6OVx50NFYKwZDZ6waOaCTBQjBGBZZw8CQi4ZBOR6EYeySEYQSCEaQSITDH6BvGIaKEWQSSEEbqQVVQgRYSKwLGUQgRCQKwTFUC4RYQKwSCTDAhEONQTwULAqcNCARWVLAhGMB55YPDhQqDKy4dFFhAMMLCzgFawZWbEI4AIGogAYFZtAFbgsMFTyyGVkBZOKr7gJazoA/AHI")) }; + // p15 + if (p < 20) return { + width : 176, height : 176, bpp : 2, + transparent : -1, + palette : pal1, + buffer : require("heatshrink").decompress(atob("AH4A/AH4ACgtVqtW1WoFUgpBFYYABwApggIqDFYmq0BVjFYxZfFQorGLLrWCFZbgbVgtUBQcKLD8VFQYMHlQsDKzoOJFgZYYKwYPLFgZWaoARMLDJWCawgAJcAZWYCZ6FCLCkFFQNQCZ8CFYOoFaZWSLAmAQShWQLAiESQQRtTLAKESFQNUFacKQiSCCoArTgCESQSyEUirZTboyCnQiSCYQiSCYQiSCZQgeAVxwqYQgSwMVwNUFbMKWBquaWCArBVzKwDbRoqaWATcKbQKuaWAbcKbQKuaWAbcKVzqwNFYIqcWAOpbRSucWAWVO5DaeZ5jaeJhgrBbTqkLbT4hLqoriPI7afUpS5BbTwiKFdZgIADSmHFYIqgbgIrGcgIriEYwzHADZ7HRY4rdaYrjHADcBFYoGBFcgkEGQwAeFYqKHFbzUEcQ4AdiorwiorlEogxFAD59FWoorhoArDqArjgIr/FbYwFAEJSDFf4rXgornqgrDFUkAior/Ff4rGAYYAjKYYr/Ff4r/FbdVFdFAFYNQFcsBFf4r/Ff4r/Ff4r/Ff4r/Ff4r/Ff4r/FbdUFcsFFYUVFdADBFf4r/Ff4rbAYYAjKYYr/Ff4rFoArkqorCgIrnqAr/FbIEFAEBSFFf4rYqgrjgorEiormAocVAogAfEooxFFcB9EFdq1DAD9VFYkBFctQFYoGEADokHFcp8FRQoAdag7iFFb4HFioHGADYjHGY4rcPYyLHADbTHcYNQFT4iIFdZgIADKmJqrcgiorIBIIrhMKIAXUpIrBbjzaBFZAKKbS5MJFcKkJbj4fLBYLcdqorKbjzPMbjxKNMhauTURawdJJorBWDShBFZiRBWDQcOHRyuPOhorBWDIbPWDRzQSYKEYIwLLOHgSEXDIJyPQjD2SQjCCQQjSCRCYY/QN4xDRQiyCSQgjdSCqqECLCRWBYyiECISBWCYqgXCLCBWCQSYYEIhxqCeChYFThoQCKypYEIxgPPLB4cKFQZWXDoosIBhhYWcArWDKzYhHABA1EADArNoArcFhgqeWQysgLJxVfcBLWdAH4A5A==")) + }; + // p20 - if (p >= 20 && p < 30) return { + if (p < 25) return { width : 176, height : 176, bpp : 2, transparent : -1, palette : pal1, buffer : require("heatshrink").decompress(atob("AH4A/AH4ACgtVqtW1WoFUgpBFYYABwApggIqDFYmq0BVjFYxZfFQorGLLrWCFZbgbVgtUBQcKLD8VFQYMHlQsDKzoOJFgZYYKwYPLFgZWaoARMLDJWCawgAJcAZWYCZ6FCLCkFFQNQCZ8CFYOoFaZWSLAmAQShWQLAiESQQRtTLAKESFQNUFacKQiSCCoArTgCESQSyEUirZTboyCnQiSCYQiSCYQiSCZQgeAVxwqYQgSwMVwNUFbMKWBquaWCArBVzKwDbRoqaWATcKbQKuaWAbcKbQKuaWAbcKVzqwNFYIqcWATaKVziwDbhDaebhjaebhgrBbTrcCFZDafbhdVFcTcHbT7cDFY0BbT7cD0ArxgtVoArfgGq1ArHFUDcBFY0VFceqFY1UFcMKFY1VFcmAFYtQFcMCFYsBFcugFYtAFcMAFYsFFcuoFYoqigEqFeEVFcuqFYlUFccKFYlVFc2AFYdQFccCFf4AWgNVoAEGAERSDFf4rXgornqgrDFUkAior/Ff4rGAYYAjKYYr/Ff4r/FbdVFdFAFYNQFcsBFf4r/Ff4r/Ff4r/Ff4r/Ff4r/Ff4r/FbdUFcsFFYUVFdADBFf4r/Ff4rbAYYAjKYYr/Ff4rFoArkqorCgIrnqAr/FbIEFAEBSFFf4rYqgrjgorEiormAocVAogAfEooxFFcB9EFdq1DAD9VFYkBFctQFYoGEADokHFcp8FRQoAdag7iFFb4HFioHGADYjHGY4rcPYyLHADbTHcYNQFT4iIFdZgIADKmJqrcgiorIBIIrhMKIAXUpIrBbjzaBFZAKKbS5MJFcKkJbj4fLBYLcdqorKbjzPMbjxKNMhauTURawdJJorBWDShBFZiRBWDQcOHRyuPOhorBWDIbPWDRzQSYKEYIwLLOHgSEXDIJyPQjD2SQjCCQQjSCRCYY/QN4xDRQiyCSQgjdSCqqECLCRWBYyiECISBWCYqgXCLCBWCQSYYEIhxqCeChYFThoQCKypYEIxgPPLB4cKFQZWXDoosIBhhYWcArWDKzYhHABA1EADArNoArcFhgqeWQysgLJxVfcBLWdAH4A5A=")) }; + // p25 + if (p < 30) return { + width : 176, height : 176, bpp : 2, + transparent : -1, + palette : pal1, + buffer : require("heatshrink").decompress(atob("AH4A/AH4ACgtVqtW1WoFUgpBFYYABwApggIqDFYmq0BVjFYxZfFQorGLLrWCFZbgbVgtUBQcKLD8VFQYMHlQsDKzoOJFgZYYKwYPLFgZWaoARMLDJWCawgAJcAZWYCZ6FCLCkFFQNQCZ8CFYOoFaZWSLAmAQShWQLAiESQQRtTLAKESFQNUFacKQiSCCoArTgCESQSyEUirZTboyCnQiSCYQiSCYQiSCZQgeAVxwqYQgSwMVwNUFbMKWBquaWCArBVzKwDbRoqaWATcKbQKuaWAbcKbQKuaWAbcKVzqwNFYIqcWATaKVziwDbhDaebhjaebhgrBbTrcCFZDafbhdVFcTcHbT7cDFY0BbT7cD0ArxgtVoArfgGq1ArHFUDcBFY0VFceqFY1UFcMKFY1VFcmAFYtQFcMCFYsBFcugFYtAFcMAFYsFFcuoFYoqigEqFeEVFcuqFYlUFccKFYlVFc2AFYdQFccCFf4rbgNVoArjgGq0Ar/FbMFFc+oFYYqkgEqFf4r/FY0VqgrlhWqFf4r/Ff4rdqorowArBqArlgQr/Ff4r/Ff4r/Ff4AKgNVoAr/Ff4r/Ff4r/Ff4rNqgrlgorCioroAYIr/Ff4r/FbYDDAEZTDFf4r/FYtAFclVFYUBFc9QFf4rZAgoAgKQor/FbFUFccFFYkVFcwFDioFEAD4lFGIorgPogrtWoYAfqorEgIrlqArFAwgAdEg4rlPgqKFADrUHcQorfA4sVA4wAbEY4zHFbh7GRY4AbaY7jBqAqfERArrMBAAZUxNVbkEVFZAJBFcJhRAC6lJFYLcebQIrIBRTaXJhIrhUhLcfD5YLBbjtVFZTceZ5jceJRpkLVyaiLWDpJNFYKwaUIIrMSIKwaDhw6OVx50NFYKwZDZ6waOaCTBQjBGBZZw8CQi4ZBOR6EYeySEYQSCEaQSITDH6BvGIaKEWQSSEEbqQVVQgRYSKwLGUQgRCQKwTFUC4RYQKwSCTDAhEONQTwULAqcNCARWVLAhGMB55YPDhQqDKy4dFFhAMMLCzgFawZWbEI4AIGogAYFZtAFbgsMFTyyGVkBZOKr7gJazoA/AHIA=")) + }; + // p30 - if (p >= 30 && p < 40) return { + if (p < 35) return { width : 176, height : 176, bpp : 2, transparent : -1, palette : pal1, buffer : require("heatshrink").decompress(atob("AH4A/AH4ACgtVqtW1WoFUgpBFYYABwApggIqDFYmq0BVjFYxZfFQorGLLrWCFZbgbVgtUBQcKLD8VFQYMHlQsDKzoOJFgZYYKwYPLFgZWaoARMLDJWCawgAJcAZWYCZ6FCLCkFFQNQCZ8CFYOoFaZWSLAmAQShWQLAiESQQRtTLAKESFQNUFacKQiSCCoArTgCESQSyEUirZTboyCnQiSCYQiSCYQiSCZQgeAVxwqYQgSwMVwNUFbMKWBquaWCArBVzKwDbRoqaWATcKbQKuaWAbcKbQKuaWAbcKVzqwNFYIqcWATaKVziwDbhDaebhjaebhgrBbTrcCFZDafbhdVFcTcHbT7cDFY0BbT7cD0ArxgtVoArfgGq1ArHFUDcBFY0VFceqFY1UFcMKFY1VFcmAFYtQFcMCFYsBFcugFYtAFcMAFYsFFcuoFYoqigEqFeEVFcuqFYlUFccKFYlVFc2AFYdQFccCFf4rbgNVoArjgGq0Ar/FbMFFc+oFYYqkgEqFf4r/FY0VqgrlhWqFf4r/Ff4rdqorowArBqArlgQr/Ff4r/Ff4r/Ff4r/Ff4r/Ff4r/Ff4rbqgrlhQrCioroAYIr/Ff4r/FbcFqorllWoFf4r/FY9AFcmqFYUBFc+gFf4rZgFVqAqjgWqwAr/FbdUFccFawkVFcwFDioFEAD4lFGIorgPogrtWoYAfqorEgIrlqArFAwgAdEg4rlPgqKFADrUHcQorfA4sVA4wAbEY4zHFbh7GRY4AbaY7jBqAqfERArrMBAAZUxNVbkEVFZAJBFcJhRAC6lJFYLcebQIrIBRTaXJhIrhUhLcfD5YLBbjtVFZTceZ5jceJRpkLVyaiLWDpJNFYKwaUIIrMSIKwaDhw6OVx50NFYKwZDZ6waOaCTBQjBGBZZw8CQi4ZBOR6EYeySEYQSCEaQSITDH6BvGIaKEWQSSEEbqQVVQgRYSKwLGUQgRCQKwTFUC4RYQKwSCTDAhEONQTwULAqcNCARWVLAhGMB55YPDhQqDKy4dFFhAMMLCzgFawZWbEI4AIGogAYFZtAFbgsMFTyyGVkBZOKr7gJazoA/AHI")) }; + // p35 + if (p < 40) return { + width : 176, height : 176, bpp : 2, + transparent : -1, + palette : pal1, + buffer : require("heatshrink").decompress(atob("AH4A/AH4ACgtVqtW1WoFUgpBFYYABwApggIqDFYmq0BVjFYxZfFQorGLLrWCFZbgbVgtUBQcKLD8VFQYMHlQsDKzoOJFgZYYKwYPLFgZWaoARMLDJWCawgAJcAZWYCZ6FCLCkFFQNQCZ8CFYOoFaZWSLAmAQShWQLAiESQQRtTLAKESFQNUFacKQiSCCoArTgCESQSyEUirZTboyCnQiSCYQiSCYQiSCZQgeAVxwqYQgSwMVwNUFbMKWBquaWCArBVzKwDbRoqaWATcKbQKuaWAbcKbQKuaWAbcKVzqwNFYIqcWATaKVziwDbhDaebhjaebhgrBbTrcCFZDafbhdVFcTcHbT7cDFY0BbT7cD0ArxgtVoArfgGq1ArHFUDcBFY0VFceqFY1UFcMKFY1VFcmAFYtQFcMCFYsBFcugFYtAFcMAFYsFFcuoFYoqigEqFeEVFcuqFYlUFccKFYlVFc2AFYdQFccCFf4rbgNVoArjgGq0Ar/FbMFFc+oFYYqkgEqFf4r/FY0VqgrlhWqFf4r/Ff4rdqorowArBqArlgQr/Ff4r/Ff4r/Ff4r/Ff4r/Ff4r/Ff4rbqgrlhQrCioroAYIr/Ff4r/FbcFqorllWoFf4r/FY9AFcmqFYUBFc+gFf4rZgFVqAqjgWqwAr/FbdUFccKFYkVFcwFDitVFccqFYkFFcuoFeNAFcWqFYkBFcugFYtQFUMCFYsAFcuAFYtUFcMKFY0VFcgHFitVFcMqFY0FFceoFY9AFcGqFY0BqtQFT8C1WgFeMAqtUFb8K1WAFY7cglQrIiorgjWqBI8FqtAFb1W1ArJbjz9BFZAKBbjxMBsALIFcKkJbj4fLBYLcdqorKbjzPMbjxKNMhauTURawdJJorBWDShBFZiRBWDQcOHRyuPOhorBWDIbPWDRzQSYKEYIwLLOHgSEXDIJyPQjD2SQjCCQQjSCRCYY/QN4xDRQiyCSQgjdSCqqECLCRWBYyiECISBWCYqgXCLCBWCQSYYEIhxqCeChYFThoQCKypYEIxgPPLB4cKFQZWXDoosIBhhYWcArWDKzYhHABA1EADArNoArcFhgqeWQysgLJxVfcBLWdAH4A5")) + }; + // p40 - if (p >= 40 && p < 50) return { + if (p < 45) return { width : 176, height : 176, bpp : 2, transparent : -1, palette : pal1, buffer : require("heatshrink").decompress(atob("AH4A/AH4ACgtVqtW1WoFUgpBFYYABwApggIqDFYmq0BVjFYxZfFQorGLLrWCFZbgbVgtUBQcKLD8VFQYMHlQsDKzoOJFgZYYKwYPLFgZWaoARMLDJWCawgAJcAZWYCZ6FCLCkFFQNQCZ8CFYOoFaZWSLAmAQShWQLAiESQQRtTLAKESFQNUFacKQiSCCoArTgCESQSyEUirZTboyCnQiSCYQiSCYQiSCZQgeAVxwqYQgSwMVwNUFbMKWBquaWCArBVzKwDbRoqaWATcKbQKuaWAbcKbQKuaWAbcKVzqwNFYIqcWATaKVziwDbhDaebhjaebhgrBbTrcCFZDafbhdVFcTcHbT7cDFY0BbT7cD0ArxgtVoArfgGq1ArHFUDcBFY0VFceqFY1UFcMKFY1VFcmAFYtQFcMCFYsBFcugFYtAFcMAFYsFFcuoFYoqigEqFeEVFcuqFYlUFccKFYlVFc2AFYdQFccCFf4rbgNVoArjgGq0Ar/FbMFFc+oFYYqkgEqFf4r/FY0VqgrlhWqFf4r/Ff4rdqorowArBqArlgQr/Ff4r/Ff4r/Ff4r/Ff4r/Ff4r/Ff4rbqgrlhQrCioroAYIr/Ff4r/FbcFqorllWoFf4r/FY9AFcmqFYUBFc+gFf4rZgFVqAqjgWqwAr/FbdUFccKFYkVFcwFDitVFccqFYkFFcuoFeNAFcWqFYkBFcugFYtQFUMCFYsAFcuAFYtUFcMKFY0VFcgHFitVFcMqFY0FFceoFY9AFcGqFY0BqtQFT8C1WgFeMAqtUFb8K1WAFY7cglQrIioriBI8FqtAFb2q1ArJbjzaBFZEBbj7aB0ALIFcLaHbkLaJFYbcd1QrKbjzaKbkDaLbgSwcVwLaJWD6uLFYawaVwIrMbgKwaVwLaKbgawaVwLaLbgawZQQLaLWDiuOWAaEYQQKuMWAiEXKwKuNQjUBQR6EaiqCPQjVVQSATCqtUFSZvB1WACiSEUY4KCQQgjdSCqqECLCRWBYyiECISBWCYqgXCLCBWCQSYYEIhxqCeChYFThoQCKypYEIxgPPLB4cKFQZWXDoosIBhhYWcArWDKzYhHABA1EADArNoArcFhgqeWQysgLJxVfcBLWdAH4A5A")) }; + // p45 + if (p < 50) return { + width : 176, height : 176, bpp : 2, + transparent : -1, + palette : pal2, + buffer : require("heatshrink").decompress(atob("AH4A/AH4ACgtVqtW1WoFUgpBFYYABwApggIqDFYmq0BVjFYxZfFQorGLLrWCFZbgbVgtUBQcKLD8VFQYMHlQsDKzoOJFgZYYKwYPLFgZWaoARMLDJWCawgAJcAZWYCZ6FCLCkFFQNQCZ8CFYOoFaZWSLAmAQShWQLAiESQQRtTLAKESFQNUFacKQiSCCoArTgCESQSyEUirZTboyCnQiSCYQiSCYQiSCZQgeAVxwqYQgSwMVwNUFbMKWBquaWCArBVzKwDbRoqaWATcKbQKuaWAbcKbQKuaWAbcKVzqwNFYIqcWATaKVziwDbhDaebhjaebhgrBbTrcCFZDafbhdVFcTcHbT7cDFY0BbT7cD0ArxgtVoArfgGq1ArHFUDcBFY0VFceqFY1UFcMKFY1VFcmAFYtQFcMCFYsBFcugFYtAFcMAFYsFFcuoFYoqigEqFeEVFcuqFYlUFccKFYlVFc2AFYdQFccCFf4rbgNVoArjgGq0Ar/FbMFFc+oFYYqkgEqFf4r/FY0VqgrlhWqFf4r/Ff4rdqorowArBqArlgQr/Ff4r/Ff4r/Ff4r/Ff4r/Ff4r/Ff4rbqgrlhQrCioroAYIr/Ff4r/FbcFqorllWoFf4r/FY9AFcmqFYUBFc+gFf4rZgFVqAqjgWqwAr/FbdUFccKFYkVFcwFDitVFccqFYkFFcuoFeNAFcWqFYkBFcugFYtQFUMCFYsAFcuAFYtUFcMKFY0VFcgHFitVFcMqFY0FFceoFY9AFcGqFY0BqtQFT8C1WgFeMAqtUFb8K1WAFY7cglQrIioriBI8FqtAFb2q1ArJbjzaBFZEBbj7aB0ALIFcLaHbkLaJFYbcd1QrKbjzaKbkDaLbgSwcVwLaJWD6uLFYawaVwIrMbgKwaVwLaKbgawaVwLaLbgawZQQLaLWDiuOWAaEYQQKuMWAiEXKwKuNQjSCQQjSCQQjSCRAAIrBqgqThQrBwAUQQiyCSQgjdSbISCRQgZYSKwKCSQghYQKwSCSQghYQKwSCTAAMVFYNUCJsKFQOqFShYEoARMrRWXLAiFMiorCFSxYEFhQ6BFYJWXLAosIBgVWKzBYGcAsFBIdWKzIhGABI1EADArNoArcFhgqeWQwAEqAqeLJRVfcBLWdAH4A5A=")) + }; + // p50 - if (p >= 50 && p < 60) return { + if (p < 55) return { width : 176, height : 176, bpp : 2, transparent : -1, palette : pal2, buffer : require("heatshrink").decompress(atob("AH4A/AH4AChWq1WpqtUFUgpBFYYABoApggQqDFYlVqBVjFYxZfFQorGLLrWCFZbgbVguoBQcFLD8qFQYMHiosDKzoOJFgZYYKwYPLFgZWawARMLDJWCawgAJcAZWYCZ6FCLCkKFQOgCZ8BFYNUFaZWSLAlAQShWQLAiESQQRtTLAKESFQOoFacFQiSCCwArTgCESQSyEUlTZTboyCnQiSCYQiSCYQiSCZQgdAVxwqYQgSwMVwOoFbMFWBquaWCArBVzKwDbRoqaWATcKbQKuaWAbcKbQKuaWAbcKVzqwNFYIqcWATaKVziwDbhDaebhjaebhgrBbTrcCFZDafbheqFcTcHbT7cDFY0CbT7cDqArxhWqwArfgFVqgrHFUDcBFY0qFcdVFY2oFcMFFY2qFclAFYugFcMBFYsCFctQFYuAFcMAFYsKFctUFYoqigEVFeEqFctVFYmoFccFFYmqFc1AFYegFccBFf4rbgWqwArjgFVqAr/FbMKFc9UFYYqkgEVFf4r/FY0q1ArlgtVFf4r/Ff4rd1QrooArB0ArlgIr/Ff4r/Ff4r/Ff4r/Ff4r/Ff4r/Ff4rb1ArlgorClQroAYIr/Ff4r/FbcK1QrlitUFf4r/FY+AFclVFYUCFc9QFf4rZgGq0AqjgNVoAr/FbeoFccFFYkqFcwFDlWqFccVFYkKFctUFeOAFcVVFYkCFctQFYugFUMBFYsAFctAFYuoFcMFFY0qFcgHFlWqFcMVFY0KFcdUFY+AFcFVFY0C1WgFT8BqtQFeMA1WoFb8FqtAFY7cgiorIlQriBI8K1WAFb1VqgrJbjzaBFZECbj7aBqALIFcLaHbkLaJFYbcdqorKbjzaKbkDaLbgSwcVwLaJWD6uLFYawaVwIrMbgKwaVwLaKbgawaVwLaLbgawZQQLaLWDiuOWAaEYQQKuMWAiEXKwKuNQjSCQQjSCQQjSCRAAIrB1AqTgorBoAUQQiyCSQgjdSbISCRQgZYSKwKCSQghYQKwSCSQghYQKwSCTAAMqFYOoCJsFFQNVFShYEwARMFQRWVLAiFMQIRWWLAosKFQZWXLAosIFQZWYLAzgFawZWbAAMKFgmq1IoEAANUFTQABFZtAFbgsFFYwqeWQorFVjZZJFYhVfcAwrCazoA/AHI")) }; + // p55 + if (p < 60) return { + width : 176, height : 176, bpp : 2, + transparent : -1, + palette : pal2, + buffer : require("heatshrink").decompress(atob("AH4A/AH4AChWq1WpqtUFUgpBFYYABoApggQqDFYlVqBVjFYxZfFQorGLLrWCFZbgbVguoBQcFLD8qFQYMHiosDKzoOJFgZYYKwYPLFgZWawARMLDJWCawgAJcAZWYCZ6FCLCkKFQOgCZ8BFYNUFaZWSLAlAQShWQLAiESQQRtTLAKESFQOoFacFQiSCCwArTgCESQSyEUlTZTboyCnQiSCYQiSCYQiSCZQgdAVxwqYQgSwMVwOoFbMFWBquaWCArBVzKwDbRoqaWATcKbQKuaWAbcKbQKuaWAbcKVzqwNFYIqcWATaKVziwDbhDaebhjaebhgrBbTrcCFZDafbheqFcTcHbT7cDFY0CbT7cDqArxhWqwArfgFVqgrHFUDcBFY0qFcdVFY2oFcMFFY2qFclAFYugFcMBFYsCFctQFYuAFcMAFYsKFctUFYoqigEVFeEqFctVFYmoFccFFYmqFc1AFYegFccBFf4rbgWqwArjgFVqAr/FbMKFc9UFYYqkgEVFf4r/FY0q1ArlgtVFf4r/Ff4rd1QrooArB0ArlgIr/Ff4r/Ff4r/Ff4r/Ff4r/Ff4r/Ff4rb1ArlgorClQroAYIr/Ff4r/FbcK1QrlitUFf4r/FY+AFclVFYUCFc9QFf4rZgGq0AqjgNVoAr/FbeoFccFFYkqFcwFDlWqFccVFYkKFctUFeOAFcVVFYkCFctQFYugFUMBFYsAFctAFYuoFcMFFY0qFcgHFlWqFcMVFY0KFcdUFY+AFcFVFY0C1WgFT8BqtQFeMA1WoFb8FqtAFY7cgiorIlQriBI8K1WAFb1VqgrJbjzaBFZECbj7aBqALIFcLaHbkLaJFYbcdqorKbjzaKbkDaLbgSwcVwLaJWD6uLFYawaVwIrMbgKwaVwLaKbgawaVwLaLbgawZQQLaLWDiuOWAaEYQQKuMWAiEXKwKuNQjSCQQjSCQQjSCRAAIrB1AqTgorBoAUQQiyCSQgjdSbISCRQgZYSKwKCSQghYQKwSCSQghYQKwSCTAAMqFYOoCJsFFQNVFShYEwARMFQRWVLAmVQJxWWLAgcLFQZWXLAWpJJQqDKzBYC0ofDqjWHKzYhHABA1EADArNoArcFhgqegEBFRKsbLJxVfcBLWdAH4A5A==")) + }; + // p60 - if (p >= 60 && p < 70) return { + if (p < 65) return { width : 176, height : 176, bpp : 2, transparent : -1, palette : pal2, buffer : require("heatshrink").decompress(atob("AH4A/AH4AChWq1WpqtUFUgpBFYYABoApggQqDFYlVqBVjFYxZfFQorGLLrWCFZbgbVguoBQcFLD8qFQYMHiosDKzoOJFgZYYKwYPLFgZWawARMLDJWCawgAJcAZWYCZ6FCLCkKFQOgCZ8BFYNUFaZWSLAlAQShWQLAiESQQRtTLAKESFQOoFacFQiSCCwArTgCESQSyEUlTZTboyCnQiSCYQiSCYQiSCZQgdAVxwqYQgSwMVwOoFbMFWBquaWCArBVzKwDbRoqaWATcKbQKuaWAbcKbQKuaWAbcKVzqwNFYIqcWATaKVziwDbhDaebhjaebhgrBbTrcCFZDafbheqFcTcHbT7cDFY0CbT7cDqArxhWqwArfgFVqgrHFUDcBFY0qFcdVFY2oFcMFFY2qFclAFYugFcMBFYsCFctQFYuAFcMAFYsKFctUFYoqigEVFeEqFctVFYmoFccFFYmqFc1AFYegFccBFf4rbgWqwArjgFVqAr/FbMKFc9UFYYqkgEVFf4r/FY0q1ArlgtVFf4r/Ff4rd1QrooArB0ArlgIr/Ff4r/Ff4r/Ff4r/Ff4r/Ff4r/Ff4rb1ArlgorClQroAYIr/Ff4r/FbcK1QrlitUFf4r/FY+AFclVFYUCFc9QFf4rZgGq0AqjgNVoAr/FbeoFccFFYkqFcwFDlWqFccVFYkKFctUFeOAFcVVFYkCFctQFYugFUMBFYsAFctAFYuoFcMFFY0qFcgHFlWqFcMVFY0KFcdUFY+AFcFVFY0C1WgFT8BqtQFeMA1WoFb8FqtAFY7cgiorIlQriBI8K1WAFb1VqgrJbjzaBFZECbj7aBqALIFcLaHbkLaJFYbcdqorKbjzaKbkDaLbgSwcVwLaJWD6uLFYawaVwIrMbgKwaVwLaKbgawaVwLaLbgawZQQLaLWDiuOWAaEYQQKuMWAelNBqCLVxqEC0oRPQS6EC0oSQQSyECFYKEVQSIABFYI/QAAcFFYJDRCgSCmYYjdSCqqYCLCRWBYyiECISBWCYqgXCLCBWCQSYYEIhxqCeChYFThoQCKypYEIxgPPLB4cKFQZWXDoosIBhhYWcArWDKzYhHABA1EADArNoArcFhgqeWQysgLJxVfcBLWdAH4A5A")) }; + // p65 + if (p < 70) return { + width : 176, height : 176, bpp : 2, + transparent : -1, + palette : pal2, + buffer : require("heatshrink").decompress(atob("AH4A/AH4AChWq1WpqtUFUgpBFYYABoApggQqDFYlVqBVjFYxZfFQorGLLrWCFZbgbVguoBQcFLD8qFQYMHiosDKzoOJFgZYYKwYPLFgZWawARMLDJWCawgAJcAZWYCZ6FCLCkKFQOgCZ8BFYNUFaZWSLAlAQShWQLAiESQQRtTLAKESFQOoFacFQiSCCwArTgCESQSyEUlTZTboyCnQiSCYQiSCYQiSCZQgdAVxwqYQgSwMVwOoFbMFWBquaWCArBVzKwDbRoqaWATcKbQKuaWAbcKbQKuaWAbcKVzqwNFYIqcWATaKVziwDbhDaebhjaebhgrBbTrcCFZDafbheqFcTcHbT7cDFY0CbT7cDqArxhWqwArfgFVqgrHFUDcBFY0qFcdVFY2oFcMFFY2qFclAFYugFcMBFYsCFctQFYuAFcMAFYsKFctUFYoqigEVFeEqFctVFYmoFccFFYmqFc1AFYegFccBFf4rbgWqwArjgFVqAr/FbMKFc9UFYYqkgEVFf4r/FY0q1ArlgtVFf4r/Ff4rd1QrooArB0ArlgIr/Ff4r/Ff4r/Ff4r/Ff4r/Ff4r/Ff4rb1ArlgorClQroAYIr/Ff4r/FbcK1QrlitUFf4r/FY+AFclVFYUCFc9QFf4rZgGq0AqjgNVoAr/FbeoFccFFYkqFcwFDlWqFccVFYkKFctUFeOAFcVVFYkCFctQFYugFUMBFYsAFctAFYuoFcMFFY0qFcgHFlWqFcMVFY0KFcdUFY+AFcFVFY0C1WgFT8BqtQFeMA1WkFb8FqtAFY+VbUArIlVVFcIJHhI1IAC9VqiNJXI7aYFZAKKbS5MJFcKkJXRLafBYbcdqorKbjzPMbjxKNMhauTURawdJJorBWDShBFZiRBWDQcOHRyuPOhorBWDIbPWDRzQSYKEYIwLLOHgSEXDIJyPQjD2SQjCCQQjSCRCYY/QN4xDRQiyCSQgjdSCqqECLCRWBYyiECISBWCYqgXCLCBWCQSYYEIhxqCeChYFThoQCKypYEIxgPPLB4cKFQZWXDoosIBhhYWcArWDKzYhHABA1EADArNoArcFhgqeWQysgLJxVfcBLWdAH4A5A=")) + }; + // p70 - if (p >= 70 && p < 80) return { + if (p < 75) return { width : 176, height : 176, bpp : 2, transparent : -1, palette : pal2, buffer : require("heatshrink").decompress(atob("AH4A/AH4AChWq1WpqtUFUgpBFYYABoApggQqDFYlVqBVjFYxZfFQorGLLrWCFZbgbVguoBQcFLD8qFQYMHiosDKzoOJFgZYYKwYPLFgZWawARMLDJWCawgAJcAZWYCZ6FCLCkKFQOgCZ8BFYNUFaZWSLAlAQShWQLAiESQQRtTLAKESFQOoFacFQiSCCwArTgCESQSyEUlTZTboyCnQiSCYQiSCYQiSCZQgdAVxwqYQgSwMVwOoFbMFWBquaWCArBVzKwDbRoqaWATcKbQKuaWAbcKbQKuaWAbcKVzqwNFYIqcWATaKVziwDbhDaebhjaebhgrBbTrcCFZDafbheqFcTcHbT7cDFY0CbT7cDqArxhWqwArfgFVqgrHFUDcBFY0qFcdVFY2oFcMFFY2qFclAFYugFcMBFYsCFctQFYuAFcMAFYsKFctUFYoqigEVFeEqFctVFYmoFccFFYmqFc1AFYegFccBFf4rbgWqwArjgFVqAr/FbMKFc9UFYYqkgEVFf4r/FY0q1ArlgtVFf4r/Ff4rd1QrooArB0ArlgIr/Ff4r/Ff4r/Ff4r/Ff4r/Ff4r/Ff4rb1ArlgorClQroAYIr/Ff4r/FbcK1QrlitUFf4r/FY+AFclVFYUCFc9QFf4rZAgoAggNVoAr/FbdUFccFFYkVFcwFDioFEAD4lFGIorgPogrtWoYAfqorEgIrlqArFAwgAdEg4rlPgqKFADrUHcQorfA4sVA4wAbEY4zHFbh7GRY4AbaY7jBqAqfERArrMBAAZUxNVbkEVFZAJBFcJhRAC6lJFYLcebQIrIBRTaXJhIrhUhLcfD5YLBbjtVFZTceZ5jceJRpkLVyaiLWDpJNFYKwaUIIrMSIKwaDhw6OVx50NFYKwZDZ6waOaCTBQjBGBZZw8CQi4ZBOR6EYeySEYQSCEaQSITDH6BvGIaKEWQSSEEbqQVVQgRYSKwLGUQgRCQKwTFUC4RYQKwSCTDAhEONQTwULAqcNCARWVLAhGMB55YPDhQqDKy4dFFhAMMLCzgFawZWbEI4AIGogAYFZtAFbgsMFTyyGVkBZOKr7gJazoA/AHIA=")) }; + // p75 + if (p < 80) return { + width : 176, height : 176, bpp : 2, + transparent : -1, + palette : pal2, + buffer : require("heatshrink").decompress(atob("AH4A/AH4AChWq1WpqtUFUgpBFYYABoApggQqDFYlVqBVjFYxZfFQorGLLrWCFZbgbVguoBQcFLD8qFQYMHiosDKzoOJFgZYYKwYPLFgZWawARMLDJWCawgAJcAZWYCZ6FCLCkKFQOgCZ8BFYNUFaZWSLAlAQShWQLAiESQQRtTLAKESFQOoFacFQiSCCwArTgCESQSyEUlTZTboyCnQiSCYQiSCYQiSCZQgdAVxwqYQgSwMVwOoFbMFWBquaWCArBVzKwDbRoqaWATcKbQKuaWAbcKbQKuaWAbcKVzqwNFYIqcWATaKVziwDbhDaebhjaebhgrBbTrcCFZDafbheqFcTcHbT7cDFY0CbT7cDqArxhWqwArfgFVqgrHFUDcBFY0qFcdVFY2oFcMFFY2qFclAFYugFcMBFYsCFctQFYuAFcMAFYsKFctUFYoqigEVFeEqFctVFYmoFccFFYmqFc1AFYegFccBFf4rbgWqwArjgFVqAr/FbMKFc9UFYYqkgEVFf4r/FY0q1ArlgtVFf4r/Ff4rd1QrooArB0ArlgIr/Ff4r/Ff4r/Ff4rOqtQFf4r/Ff4r/Ff4r/FZVUFcsFFYUVFdADBFf4r/Ff4rbAYYAjKYYr/Ff4rFoArkqorCgIrnqAr/FbIEFAEBSFFf4rYqgrjgorEiormAocVAogAfEooxFFcB9EFdq1DAD9VFYkBFctQFYoGEADokHFcp8FRQoAdag7iFFb4HFioHGADYjHGY4rcPYyLHADbTHcYNQFT4iIFdZgIADKmJqrcgiorIBIIrhMKIAXUpIrBbjzaBFZAKKbS5MJFcKkJbj4fLBYLcdqorKbjzPMbjxKNMhauTURawdJJorBWDShBFZiRBWDQcOHRyuPOhorBWDIbPWDRzQSYKEYIwLLOHgSEXDIJyPQjD2SQjCCQQjSCRCYY/QN4xDRQiyCSQgjdSCqqECLCRWBYyiECISBWCYqgXCLCBWCQSYYEIhxqCeChYFThoQCKypYEIxgPPLB4cKFQZWXDoosIBhhYWcArWDKzYhHABA1EADArNoArcFhgqeWQysgLJxVfcBLWdAH4A5")) + }; + // p80 - if (p >= 80 && p < 90) return { + if (p < 85) return { width : 176, height : 176, bpp : 2, transparent : -1, palette : pal2, buffer : require("heatshrink").decompress(atob("AH4A/AH4AChWq1WpqtUFUgpBFYYABoApggQqDFYlVqBVjFYxZfFQorGLLrWCFZbgbVguoBQcFLD8qFQYMHiosDKzoOJFgZYYKwYPLFgZWawARMLDJWCawgAJcAZWYCZ6FCLCkKFQOgCZ8BFYNUFaZWSLAlAQShWQLAiESQQRtTLAKESFQOoFacFQiSCCwArTgCESQSyEUlTZTboyCnQiSCYQiSCYQiSCZQgdAVxwqYQgSwMVwOoFbMFWBquaWCArBVzKwDbRoqaWATcKbQKuaWAbcKbQKuaWAbcKVzqwNFYIqcWATaKVziwDbhDaebhjaebhgrBbTrcCFZDafbheqFcTcHbT7cDFY0CbT7cDqArxhWqwArfgFVqgrHFUDcBFY0qFcdVFY2oFcMFFY2qFclAFYugFcMBFYsCFctQFYuAFcMAFYsKFctUFYoqigEVFeEqFctVFYmoFccFFYmqFc1AcIdQFccBFf4rbGAoAhKQYr/Fa8FFc9UFYYqkgEVFf4r/FYwDDAEZTDFf4r/Ff4rbqorooArBqArlgIr/Ff4r/Ff4r/Ff4r/Ff4r/Ff4r/Ff4rbqgrlgorCioroAYIr/Ff4r/FbYDDAEZTDFf4r/FYtAFclVFYUBFc9QFf4rZAgoAgKQor/FbFUFccFFYkVFcwFDioFEAD4lFGIorgPogrtWoYAfqorEgIrlqArFAwgAdEg4rlPgqKFADrUHcQorfA4sVA4wAbEY4zHFbh7GRY4AbaY7jBqAqfERArrMBAAZUxNVbkEVFZAJBFcJhRAC6lJFYLcebQIrIBRTaXJhIrhUhLcfD5YLBbjtVFZTceZ5jceJRpkLVyaiLWDpJNFYKwaUIIrMSIKwaDhw6OVx50NFYKwZDZ6waOaCTBQjBGBZZw8CQi4ZBOR6EYeySEYQSCEaQSITDH6BvGIaKEWQSSEEbqQVVQgRYSKwLGUQgRCQKwTFUC4RYQKwSCTDAhEONQTwULAqcNCARWVLAhGMB55YPDhQqDKy4dFFhAMMLCzgFawZWbEI4AIGogAYFZtAFbgsMFTyyGVkBZOKr7gJazoA/AHIA=")) }; + // p85 + if (p < 90) return { + width : 176, height : 176, bpp : 2, + transparent : -1, + palette : pal2, + buffer : require("heatshrink").decompress(atob("AH4A/AH4AChWq1WpqtUFUgpBFYYABoApggQqDFYlVqBVjFYxZfFQorGLLrWCFZbgbVguoBQcFLD8qFQYMHiosDKzoOJFgZYYKwYPLFgZWawARMLDJWCawgAJcAZWYCZ6FCLCkKFQOgCZ8BFYNUFaZWSLAlAQShWQLAiESQQRtTLAKESFQOoFacFQiSCCwArTgCESQSyEUlTZTboyCnQiSCYQiSCYQiSCZQgdAVxwqYQgSwMVwOoFbMFWBquaWCArBVzKwDbRoqaWATcKbQKuaWAbcKbQKuaWAbcKVzqwNFYIqcWATaKVziwDbhEBtQrgbhEFrTacbhkFqzadbgQrIXRbcfqoribg5hJbjIrGXILlIbjIiGFdZgIADSmHFYIqgbgIrGcgIriEYwzHADZ7HRY4rdaYrjHADcBFYoGBFcgkEGQwAeFYqKHFbzUEcQ4AdiorwiorlEogxFAD59FWoorhoArDqArjgIr/FbYwFAEJSDFf4rXgornqgrDFUkAior/Ff4rGAYYAjKYYr/Ff4r/FbdVFdFAFYNQFcsBFf4r/Ff4r/Ff4r/Ff4r/Ff4r/Ff4r/FbdUFcsFFYUVFdADBFf4r/Ff4rbAYYAjKYYr/Ff4rFoArkqorCgIrnqAr/FbIEFAEBSFFf4rYqgrjgorEiormAocVAogAfEooxFFcB9EFdq1DAD9VFYkBFctQFYoGEADokHFcp8FRQoAdag7iFFb4HFioHGADYjHGY4rcPYyLHADbTHcYNQFT4iIFdZgIADKmJqrcgiorIBIIrhMKIAXUpIrBbjzaBFZAKKbS5MJFcKkJbj4fLBYLcdqorKbjzPMbjxKNMhauTURawdJJorBWDShBFZiRBWDQcOHRyuPOhorBWDIbPWDRzQSYKEYIwLLOHgSEXDIJyPQjD2SQjCCQQjSCRCYY/QN4xDRQiyCSQgjdSCqqECLCRWBYyiECISBWCYqgXCLCBWCQSYYEIhxqCeChYFThoQCKypYEIxgPPLB4cKFQZWXDoosIBhhYWcArWDKzYhHABA1EADArNoArcFhgqeWQysgLJxVfcBLWdAH4A5")) + }; + // p90 - if (p >= 90 && p < 100) return { + if (p < 95) return { width : 176, height : 176, bpp : 2, transparent : -1, palette : pal2, buffer : require("heatshrink").decompress(atob("AH4A/AH4AChWq1WpqtUFUgpBFYYABoApggQqDFYlVqBVjFYxZfFQorGLLrWCFZbgbVguoBQcFLD8qFQYMHiosDKzoOJFgZYYKwYPLFgZWawARMLDJWCawgAJcAZWYCZ6FCLCkKFQOgCZ8BFYNUFaZWSLAlAQShWQLAiESQQRtTLAKESquq1ArTgqESNgOqwArTIYKERH4KCUQigSBbKTdGCKKCVQiTCCFSyERCALBQQjAPBoArXDZ7ARObKuBSZwcaVzR0QFYKuZWAYNZWCJJKMoKuaWAahKBhiwTJRSudURorBFTgfMVzqjDO5DaeZ5jaeJhhiKbi4rIbT4hLqoriPI7afUpS5BbTwiKFdZgIADSmHFYIqgbgIrGcgIriEYwzHADZ7HRY4rdaYrjHADcBFYoGBFcgkEGQwAeFYqKHFbzUEcQ4AdiorwiorlEogxFAD59FWoorhoArDqArjgIr/FbYwFAEJSDFf4rXgornqgrDFUkAior/Ff4rGAYYAjKYYr/Ff4r/FbdVFdFAFYNQFcsBFf4r/Ff4r/Ff4r/Ff4r/Ff4r/Ff4r/FbdUFcsFFYUVFdADBFf4r/Ff4rbAYYAjKYYr/Ff4rFoArkqorCgIrnqAr/FbIEFAEBSFFf4rYqgrjgorEiormAocVAogAfEooxFFcB9EFdq1DAD9VFYkBFctQFYoGEADokHFcp8FRQoAdag7iFFb4HFioHGADYjHGY4rcPYyLHADbTHcYNQFT4iIFdZgIADKmJqrcgiorIBIIrhMKIAXUpIrBbjzaBFZAKKbS5MJFcKkJbj4fLBYLcdqorKbjzPMbjxKNMhauTURawdJJorBWDShBFZiRBWDQcOHRyuPOhorBWDIbPWDRzQSYKEYIwLLOHgSEXDIJyPQjD2SQjCCQQjSCRCYY/QN4xDRQiyCSQgjdSCqqECLCRWBYyiECISBWCYqgXCLCBWCQSYYEIhxqCeChYFThoQCKypYEIxgPPLB4cKFQZWXDoosIBhhYWcArWDKzYhHABA1EADArNoArcFhgqeWQysgLJxVfcBLWdAH4A5A")) }; + // p95 + if (p < 99) return { + width : 176, height : 176, bpp : 2, + transparent : -1, + palette : pal2, + buffer : require("heatshrink").decompress(atob("AH4A/AH4AChWq1WpqtUFUgpBFYYABoApggQqDFYlVqBVjFYxZfFQorGLLsFFZrgbgNVFAeoGohYfiorDBhIACKzVVtQqIFgpYYDgVqB5xYXKwVVoARMLDJGCfBzgDKzA+SLChECC6A/CNRycIS6jCNIQ5uSCqqCCeCqESTKxCCQiBsCTCRDEQiCCWQigSBYaRwGQU6ESQTCESQTCESQTIbQYCJzZVwKTODjSuaOiArBVzKwDBrKwRJJRlBVzSwDUJQMMWCZKKVzqiNFYIqcD5iudUYZ3IbTzPMbTxMMMRTcXFZDafEJdVFcR5HbT6lKXILaeERQrrMBAAaUw4rBFUDcBFYzkBFcQjGGY4AbPY6LHFbrTFcY4AbgIrFAwIrkEggyGADwrFRQ4reagjiHADsVFeEVFcolEGIoAfPoq1FFcNAFYdQFccBFf4rbGAoAhKQYr/Fa8FFc9UFYYqkgEVFf4r/FYwDDAEZTDFf4r/Ff4rbqorooArBqArlgIr/Ff4r/Ff4r/Ff4r/Ff4r/Ff4r/Ff4rbqgrlgorCioroAYIr/Ff4r/FbYDDAEZTDFf4r/FYtAFclVFYUBFc9QFf4rZAgoAgKQor/FbFUFccFFYkVFcwFDioFEAD4lFGIorgPogrtWoYAfqorEgIrlqArFAwgAdEg4rlPgqKFADrUHcQorfA4sVA4wAbEY4zHFbh7GRY4AbaY7jBqAqfERArrMBAAZUxNVbkEVFZAJBFcJhRAC6lJFYLcebQIrIBRTaXJhIrhUhLcfD5YLBbjtVFZTceZ5jceJRpkLVyaiLWDpJNFYKwaUIIrMSIKwaDhw6OVx50NFYKwZDZ6waOaCTBQjBGBZZw8CQi4ZBOR6EYeySEYQSCEaQSITDH6BvGIaKEWQSSEEbqQVVQgRYSKwLGUQgRCQKwTFUC4RYQKwSCTDAhEONQTwULAqcNCARWVLAhGMB55YPDhQqDKy4dFFhAMMLCzgFawZWbEI4AIGogAYFZtAFbgsMFTyyGVkBZOKr7gJazoA/AHIA==")) + }; + // p100 return { width : 176, height : 176, bpp : 2, diff --git a/apps/thering/15p.png b/apps/thering/15p.png new file mode 100644 index 0000000000000000000000000000000000000000..429cec6dc381b63d297c0fba12a30f2601918a12 GIT binary patch literal 1364 zcmeAS@N?(olHy`uVBq!ia0vp^8$g(Y4M?uv{v-}av6p!Iy0X7y66a?(J7_lJJWxoy z#5JNMI6tkVJh3R1!QICNXpBNxYLSAmo=IWrl7~Pg93=&Q?m!u1Ae+IfK~o+`v7|ft zIx;Y9?C1WI$O`1MC3(BMfaDn%emd{22P#EaktG3V{gi(N9-Jgyi2eQ{9OZ=0wl zFloZOb(>V=Wh?F19M?SkX&L8tJGuVj>_2r8C*`VZ}{@|cmHiUdHMCG zJEklCWLUelWtWUW;`#~v7u?d;tYj4as{M&^$*RS=+%smJ=c!2FaGS}_I_oFHPJbTs(`LMknFCtic_Eaq0(ZA~6Oxcdo8|PG)j1MRMvIx7HJOWtz0uI zHZEE)`;OxkZm0TB4L`rSx)j-0GOrM4mfr;8wH@gz;tSJfsoTbWX1%_V>Q@o_fV~_) zZiyM}-?w7Ih0r$&Uzr~CHzcmLN%;4(!Rz3@Yy1K6GR0F^fvU?mO16DV{Mu^B&v;mh z@o-etfg{~_#b$Z`l@M?`uwj~*!T+B;T-{+{rwX$H`YUNF*?G5F~8)~$J=J)4(+ z!5Tpr(q-TCVgILw5_79P-`ZbsKeS=t$tD8PLL;YEL=5VAQ7 z8}jQIJW4n3ozl;c$sutKh`gB9l0u?hy!&_j%Jd^K+-H~8@o*?6M0oR7d~7~2>F6~t zJFYu!2R3XoO;B=M=8*ncK0IEkm_;i3zlET(^M>^|6knY_9KT_$Zaag&C(tMtl@d{V zpS>(UyfU=vBm|RPgZwSqS50TM_tbqV<8@?*^2Wt`4qx?d>_5`>iBCN#X5t9n=1 zccbt2^VWpjP#{P`s(( z!`kCQ+a%`KL7vk$($SNw(mQw@I-Fb ze$np6uhNw|p0)`Vp&MfR zoaNc>Y5W3lIgg)iGfUYI%#qXX)LhKvxxKQcL3sK(zRxGvHL4jFyC>woe!`qnDX`f+ z(f#^K_6HMhc(&9q+*~}h8^1JFYYZ$uQ*Y_RF zyp{&k8Yt`G{%WqUfugV;<9Yt5z0OQ|PO?fD^(OLPm}M1`RO@Zmpz4(Cj3{t)esfAD WoY=8{pYv-_5$5UY=d#Wzp$PzU@=7TH literal 0 HcmV?d00001 diff --git a/apps/thering/25p.png b/apps/thering/25p.png new file mode 100644 index 0000000000000000000000000000000000000000..05bc4224be95e28a157f1c7155e7c6696c2ea613 GIT binary patch literal 1368 zcmeAS@N?(olHy`uVBq!ia0vp^8$g(Y4M?uv{v-}av6p!Iy0X7y66fcXmu1)01qz9m zxJHx&=ckpFCl;kLxcj&OjZr8|EmAPnGbwCc@(`$mqolyk9VlZAWHWd*XvzaAmUKs7 zM+SzC{oH>NS%G}EByV>YkURs!Pv_nBKn0sUT^vIy=DfXmF)PN9$MxdRFHQ^h&%Gq# zi+yGz5V#@+nsFBja1|pY@He~ zomuUT=qJWo9X+Nd35)97>>5JKwq!C2f1b%0&K529;b!1zb_w})Di4a4rtv38=f2o; z#OHwI!&T=$^-Y*RkzXLqXTy4dPy3%R=Sa)H(N1sIkx#gJ@nYTcJrkZX-*MX^K1X;{ zO~dJqvWstk0x?cI7}MNzm30}|l+Oe$4EoQgk$62q% z3-6{Kv36PCk!_}QFY%Yloc)|1`K~HI`qM1*KH)O6+CAnB<#W+D=%`WYftuQls^7G0 z>KPs#H46pu1eM-t*W@QZa-H$2;pZ=wm8Bh;3{B@g0hWAm)bL35;RzY6}7VY99dDa`0(rcHFhHB3Kt(-YtI%WfTTE= zwWgR+;mX->PGXFQAQDS~dQNP)aQE-gEA2;OxX-rgvE=~W%*|U-=$LRaDO&*_%MI-+DX0*`JT*bNpCn_WYrsgRXq^y z5d3?#pkWxxSCP#te;GYcU$JzCZ>K~#OPR>_oxg$}C~sJ}<7}ryILmio>y}?d7vc-7 zH#!R#&hvb+?5cr;&dTX!%!wlxBs6js<`sNhy2vk){o3Kh3m<)7Z_6NfUajJ{A$#MD7iW*laxfj*E>~?J zBDnwK59XwAw_ovl9+@|5&+EYUqkF#Fe7Z2>bDz7s+`sq7RS*2S`zwx3@%x28Yj;RQ z?4NjCb!EEE#FM*Eu)p07*qPw{uRvmum6)lSMJhFM}N!buAdmA>Cz*zYIFRQb$N=Bz5wOOnbJ5QOkS_v{5y}fmiREQ-(qjN$ zCLL)*J{6NrcC>X$%dZ|mBp6<5kT1eGA~6sEZ6hI0Kh87I69A+ajg~lTklY~hfG_Jt4+Mx{(4X#km|v+K98B2cV8ZB`|7$v%~cdJ-4budU1VMd+5La_b3C~G3)>XepJYE&_@|P94;ggQI-FbHgh5xY(2MPzz>5hEczrUo%Fwoz0D4I^-JlQ|ZkW z1rR6s6r4?C*GaoYvqmO%HP<%S%k0YDw&qWen9ZRGUkq`m``Bt_x)vAVQ3Odhq2$L7 z!%GY6Otq~+XO_w8{BScLTzQdQR+OS@#7hF-}p{nBI^xB*rLt>(L8;x{fL5U%bw5h4%gx7eVTHT;5 zKI{sFi*-{~B_HB)grcUL!WpF@Q68zL4iLuhZI>DcWp6F=pdPBNswxG;VLNr;k-chn*{C9uBoB}|!I`=`v@M31d42N}u}ox9DoX2D3i*X|o?_yW zz-r^U1U7~CTQZoY!yAFY5@~1@2ketu-BgaX&a4sfQ}P;y-!RD5`~K9jFnSLgR5MD6 zXs$>m@cbj^{zCcI$YB4c)3xQw+_5apfv6i9ZVRI$g4`s%`fln(tV#O%j_wP^XQwx2 zC6%6TGrL+@m<^401>EHfI=ULo19vQBpUWLDVW0hcw!^vSx~`=YBn}*$u5`5@PMini z7T5S0A%oF^QM52QeX2Mps=@smY^u7Z;e46~&2$C6^JWh(bbz7h-a$g)OBv zRvL8s`mUu{{8a&RHTL>_k9Hq*-_Zg3Wx-e1pO(!UT9aV)tGGw6oDz3Up~@;Y`}vH! z+pxW?!}U}i@zYyOQ%%QB#P^X!dwXx1z7Ly1?ZhRRPoW^(KgJcH7Gp;9G9DM0emr;n Lj3D|QFLvJF4X1F& literal 0 HcmV?d00001 diff --git a/apps/thering/45p.png b/apps/thering/45p.png new file mode 100644 index 0000000000000000000000000000000000000000..745b38e177b33cea03c86b4ddaa2b8a203fa8097 GIT binary patch literal 1456 zcmah}ZB&wH7=8f@6cy2Jpw{q{KGqP+YEFlWFZhv|*%mDgk^HDcB$a%(Xi_HP5z8%) zhhw%nWuD3{^;By4`jMj9%HvL7YNjS)bEzm~DJrs;{iyxhbI$$T_kCU0eVym|a~H-$ zhuPV<*Z=@v7ZDD|BDvNQxYfvA)1c)c37Z|kVPXG9lL&-ObH$U*2t>+e?akhuk&>O0 zn3)WOMS+No+tK7qw=FckBl(r1hy<4{jt)bZEl3SS$~I7tWR)7i2?2n*Gx+7iRY<>D zupdT{8l=MG!eXyD?B6K`KQCsl!UxgiErtgE%;D}MXu?i4q>-o5)V)HeYJ zROO}1c6gPl*A_~yeTZfR95w=j1z%V%R4B$VrNz%BJOTBULj0`P5Zs-k#WW63`*U!{ z03-0Ep78$s&CoIeeQM%hg1=9a5g5WX-1B#Th&{-@mG|EMdq%KRyQDT%Z9s{LB3U!D zj4R_eAPMZVbSDydE?!)iE{dyo;__G%a6BrSFFvyxob zG#Yi7nHdJJ#I}FAF;$)B<29@?uwdP0%@BA)(H9TG=N>p6S@u>pU0XxEAGBUC63)vC z=YbcBG5dAHc@rL|{Z$a5vasJAqxq(PQDLH-ga}-JzNWL|uEJzL_6(Kqyg71V4G1qJ zbJUCuN1tD>JJ9u-JwkOBcJ_^|L6G46TJFj7dqAe^FYSm@k70=PyGb@G$X6YtsS8n% zI-a6#9{26c!Os(dVO5olY8p@aDXwuwpvgb?453E z5l6nl!akbBFngNWaH|X=(kyftd8B*Q1B&M#%Rt?vmy9-3()wlb8mx;3cFel;@V zJ7=%O-1G03-8A{O2!duGvQj=y!BBbKx5Ji~3arVQNRPM^>5-oN(rqsETqfIQIyZL3 zn5QoC`#>P>#j;&49~}ONcx$Ut)IFUrtDVvE_&E6WJi&>s{qIaVl^?1uIdrBkFzA%b zJ@jAqeMxPgGG;oL*#cWW5T5|QewS#a97pDUSS?hLAI{xR(-FM+n-F<=avNyNHMKID z;GhZ_QM8Hoc12uIXBKB9JUMEO@_YorRnv}WHW|?=H)Pcis!W^F@}@fwXDL~j*jPT& zQZ*BcmY*|1oRKRCFgwsvWzIx*`CWiG=5b+Slzy-!MTkRp(OaROeg|Qqt$wH_MN0Ny zlgv=hLa>#RHh|s+DyhEu@;mo*XsRIaWoNa0zXM&=*_kGldkF$Rb*<4mmvXI_9hcsS z^{y&~KA8h|<%rQ;9pzB5c@~s5O7t#f?5poI{7K$gnlFK=#_prk6drT)U?`|OrzJip z1@^<#6;vT~;04544sF4!6h%LhW@so^kKw4(P|w{0s)nO2?ECFFRpDgq3TuI(|r>`ULMgKa~erTfFK+L4H-i-T8z|PV|BPQO^aFn z)5X_4AkA(&7iKfsc7t$CkJ!h6;t5=_)lHJtvjlPVIssGk)Jdd+ils8@sVRPqMNs~Z z9o21~lgF*&c~UM8hIilZ40KHY-9pKUhRI&7%u>E=xwZSiPmA$O1;>6SI4rVs)GO6qr+*Z4fd#tUtbr&!7u~g#4wXDYoRy25n$v^oIh>nQ& literal 0 HcmV?d00001 diff --git a/apps/thering/55p.png b/apps/thering/55p.png new file mode 100644 index 0000000000000000000000000000000000000000..a89e714b370473b1b3eade4c309f4a8611569515 GIT binary patch literal 1460 zcmZuxdsNbA7zR;+(&0}sFpqLmT5U_buuPXjLCw^%%bAvmV3wA7O(#oD3JJ)|%1Vhm z)$DdojgT~@B%?rQOV_efTBzv{rR4>~X3ZhGpS!gEu|MALdEf7O-{(8;AI~R=-4Nlp zXxSnd4CWZQjK~EJ%j<^{!l^-zxtc;l&}S1(lb*Ap&Cjpd7ZIzk&dPZE8qN2n?qDcJVCN4yx^w zqas)fJPbC&Y$<`k>@bn6kgdGh3B5kk&Bq~ZQ^|otHr9zH{-gdO;Qy4M4Eh~yp3#$9z+7V)!sZ`vxs@IiWS!o-sRxNQe_aS)sngpf7dA}C$mZdmId5^uQp!pCApXh5Bt;T}{b1zX> z#vSE9Zag_2%Js##q1S+QkswsbtSMWEzNYl)sT~{>DN6uI< z&feX`e~4x93;vMc2Zaw4|4(%JamekPFU(_8QTW^pv+UfL(VAobooPJHcLbQ1*RtQv zl58DZ|B@ynsL7>!=dn}TF%dwk9xLln|Fg+ixEs0M*J_rHiJWN*>o)mv$VaZtC7oNV zE(w5B`r_3_tM>VQ6uq@LMo+RWry0z$CMF8cJqgG9T<*LREPba%;Y~)6J|R*HhxQ({ z$Xc0be5TPrFBaVp4&6_+$mXZnkFLNXGjqlG z#90H~fBQx^9+`N(v-bfbOCBB?m1z(opSnFYmhJV1Ietwm zc&TBPZ%ha2tpY5~^h}pND_Ra}S_`|UhHkZH=5b67)I%;Q`lFf(0iQi1)9R5ocW6ImLIGm2-WM#=22WA zcHgDKrsJ5w%z%OKlNuxHPn!%;!3^nZUR=AA&&z=!6X8ua!*_Fu(KfoHG)iMZ%I6%= z0qA@&D=0LWkvSSGnRcIn(Sf~7r{H|ozk^!>cYN=#C&e=uweUqohHYS759J*G1Aq#T Au>b%7 literal 0 HcmV?d00001 diff --git a/apps/thering/5p.png b/apps/thering/5p.png new file mode 100644 index 0000000000000000000000000000000000000000..202d49ba7984d09bb1072b722e5dd0856a84f327 GIT binary patch literal 1364 zcmeAS@N?(olHy`uVBq!ia0vp^8$g(Y4M?uv{v-}av6p!Iy0X7y66co^V>P)V4HObD zag8Vm&QB{TPb^AhaQATm8lzB_TBKmCXHwX@!lvI6;RN#5=*AbAFcpU%7MfeO}px;TbZ%z1nBU|!5_K9`ICzA!L;y3O}S zVdm0Wl}TD+TiLT`*oo{+jM?+OYHyr;gW*pGhn5-!1t&WO0Y&)(m-^@LpSIV|?q2o> zJ?Br1QMWlutrHI2QN#!~2pSPA2rT)|6lQ#CWW|+Ui05 z{p=0pOnEZ7ulAh$IPKi6?wW>c4_Dp)q^kHJ?EOhqd4;nx683MFTz}Vk{zQHOGrJq_ zb69L%{QbnZEml_7`lq)YgL{&@;3r0}{zdb4Hb1PM%pXw1@^z0a@7;wp4bs!k`F%dY z?h(1AD$L#ao3^~dmYA<|glD{uvO93iNLv5Oq>uNWGVACE+CEQdGoQf!VAqa~XYznP z%8U#*-0A(E)imb8gso|7w5xf7$glCeQACUUfX_UhG%? zPp|l8 zE@M7?WTD!t_E3ExD=|i4{d=147Ux+o9b5j$?NwW_K40w?o*5Mz7p<6H#+sEtTEU5T{O>WmI(nd8C*j{OCFdk}OZhN;mbyOnGx6~$UavI&Iet}o z@H*napRca1E$foxgY+5xaY$S{#r(`(K0x!v^?&SF_>aq^GJd`;uFhh0`*-5kWAq|>%logPLQ6xUu5QA==f)a2CELF_zhY0aV`?)6qpbx8j&N^nWpn;7 zq2YL7gBuKOll^e)|5WxR(JwySv=6c8_^y}`p-ejR=AF?|c*&{#{Qr%=0(TsDYF=2+ zGerT(9B$S9sL$m$Kv4(wmnSBKydLTxANEa%j#5~-OAAWdb~k^scq|(2J?D> z8=G!Mo$O~i4Ge@nHlHIWL|)|lKYq3Um`vlbZ}oFJCMwRSE&d5gS;)}Rg>0uywQ07_|?(_?n%y-^6E)8 zz({!~@apM;{ZGn@+7*)a1Yhu7ooEmdsQ;GjP{3OzJsGaUB4t755`vF|3zfGrubR%j z_mQ1WTgyu3*em>AN6M|PwA?*lP_Uu3xOw&Tu42Bj1X~*^tD66t`4t}BWZ5qNS)ijc z&+eV0fWW<~H-`&4ejIx&-*I#MRr^UDwx&B@hxQ-cQyup+*ZtxsP`jMN_p2nJnwX9~*i)ZFq438mi8*Px zZgvL*uQrw}xo62JZ1hm*!=D9LtyLbVT~QQzEB2FN?Mi3WYxyVHH@K|GJ;BZZG?oFF d(HnC2GxBD69AJH?IS*8XdAjA%6in!(#OYl+G;!XPISM2&CrESvxTnB9>l}zfG_Vbhi=)m2EYx zJl&dU=eg1=#9eQSib*Lt?U#j?fM#W$qH{!A?DckS|L^Yke4p?0`8@aB=dX_}J~rId zX{8eY0Irb{%mjoRmkQ&Eyw_D@T!hg1kufavD?0+#!&x4AA^0Q;Zkx2mZ2X+$W~rQ6$$!Tp=C2r-misYsEDc4 z1st`eC|!M_z1E>f_+S=1jZJi)3BmWE8&3u1bNSw*s|@we$BCpi3bdxzzg--rwfR82 zC+2o>u24G**6v$1^@ZicdWh#`C}{E7Zv{rA1%ppWJ?NKVEnuI59jfMhcdI=KX^3Rm zn}aEQD-egzBu`7nQHv#M?9K-L^99xaZLFT8nc;juhSYxKr;qpAU3X$25YHTSrzbbw{8@i6anhC!p`4}rw zWQ4da_R+9Nkfjk|NAH8s)cbR6;%U*q6~0;{CmkbKLDFLXngm4nn(_UvVQ@vQTZNtw z#m_RBK`EhU516+=W)AypYo?jW(FN+^R*Yw!vxOP~W6C{gDrz&k?Zm=zGWRe;-Pjz= z3xygVK26t5I7kWlDJLYz_eGY$g7xOska%ngk1a=5J)61B_!vv!)hubJisWiKfAR6b zeuxQ|{bNG<9M=jF=`m#PhrD@OJgwnh=p1{i%f1S;RiCph(v7SY_AY||fwQ28e}e8q z+&2t$*`!=$wRYOOY_U7J=_8cqi;3iu(GplUSBj(U$9O$LP~aG?8LGF%Y1?427f2al z!@9{*JZ%u!jpaCu^B+`n>tV@fAjK8z+?%FmD&kFTp$p@4oy)xRx-NZ@I7mfnzSwsB zQY#DNrSI+5|LGT|9@@ErhEKiwbb@ie4GA6I3&+^_!yOo)P(8@NGgY+gj(#a5_`kvSz1P8x%rMusRt}iT$MfdCD(4}4eB%RG;N*P-T$vU`n4{*G{SoaJ2H7e zS^+61d%l(&$3;Kt{PptiT$~srhjKnVf#%5Z_baVARC|Y!Bxr%Jy&PgPCF9boGfK+W z^5Zu3&DWQA6;2e6N0}<~;CJH&iTJQxL;r6xX}DZhW&ii5O6FHwIQ+xWJH*0Dc~S8P zU42u^#N1YAD{ze{^ll3%!_rhG%D{o@>DC@JTOU7P=`-_8UaxMS> literal 0 HcmV?d00001 diff --git a/apps/thering/75p.png b/apps/thering/75p.png new file mode 100644 index 0000000000000000000000000000000000000000..8675811e2d894d34bed5c008bf3b91b780bd466b GIT binary patch literal 1371 zcmZ`(dsLEV9R7#|VkM%dA>J@=9p^I1E~XQei+G=zHCt+mGj}ozje->ObE&~0k7fBJBO)fxAF96^RsG~dT!}dB$rWOj z=9P}uf#?}W0)GE7ZdRvPW|T;!f7(>_mGZ%%-P8p03duJL^!Lu2h8}~$S)vJuc|LH( zEaE{LDxP?7k1UP3ft18=D+3=1<0xRpjmvsVZ$w%_1EtT8dLoz-SV6vXo2pnU!$~su zlIAM=U-)1ulQ~zdr;2fGTU8=EN->S_bRK40r@@U?DpUorg%8$Zw%utgeU0Rc*k}6% zaTHlOMq0|1Pa`O*1`lX%ix{WPXWME;u;T}1$URslpy0)iO!=*T(>t3tOIwBxMsx&c zGvmA5Rh93EnNvmb^rn6Cqd(y_7M)H_&jq|wZ>=&H-Q<3;B?3Jztm9-Pu7ZcVRP1v& z6Y>{$LRE!AV_>D=6~T4%gfMNX(i(d2z9wXNmG?pbTsui;6yd#o!+SL{%pL?>41yK| zYI8d+bkrg+x%h8nY)gU)M+}0crIZy#c8I$+|6=%nY<~TBH`ogS?sfGa!_f0(T<$+!Fe@Lt5ry@23ob7v_7^!dlAhj%vp zp*fUHHmoBn7bd6#;?*`pH2lYkWn~zt! zmR5rgIE&JoI&MFkD>o>-JC#V+$ zYXWizS1%k{p=lT6BzY~l8>LdB(SzjpzAR@ShjjgYEJY?Pe`w!x23KkXC?&GaYiDuM zddI|)Zu^AwB#;S39aEqm`&Sz8W-fM(BR}v$YSI3$tCR}#8poh`o0+t( z+CRmh1Qt&Q`o_H6j6#kMRw#t{3U8*G#q-nRR#<~?DBu!D7UaXpy2%su7oVOCw|}Yh!xTuA)(zRNY!cLJ+s?XD{8~JM*0Pyytn&bLKsN-hw?es`(n* zH2?sZhwLKngL3U^n3_PR=-~%Cl#uL@a0+q^ZVg)DB_}(4Aj+CeiDK_hI?Cq6r5pjM zyUEZPhf_yV9Nf2klbm;31+|#6Su`r7xI=d!l(!iJC8J}ca1sF23Cxz_jG@{jK8#9U z)d4^sEY5-&?uL*_5nSQKo0n&!eb!Q5F3e;HW{QJ%ppG&gEhtLa><`Pe_KOEgy(ncr zNa!L^T9yGQbN`Dl!_s`yxK5*?=cKQ{0Cp;9m3=VFSqnXoNN%^a-M+Wg5fiw@S8<*IqezI~1Q3M`XH|39hf~+m}WYgpE$|BZlj-D)6%aNw;_+B+i+uDKj_9XVI z-`dq@@DdMD7cVUam4dZJEKK93!+Jn~o~U?(eS+lXvJg*;qKMK%xmOvHaxJWd+}LrH zycMI&LZ8H{`9p{$Wa}ebOKZCpwt{-j zk+Ez5smGd5J6TYr^DYldWU8*hV2lf7sFshF_Xn0$eJhm}+G+ZYz?*c`!bRj$ktYzV$ME5RYos`d z_&4ybD_;*Wf8!kVyh{J1sZl}pMx(U}pV0>s8AN^#1Jf3ml^Y8|jUcSe_W$GHaVfbd z^o4KqJX2TB5{#JJFT0)3;l&mIiwT1A0SMG}E6nt!sQkZJ7Y_z*XN7LklUUK>G<+~= z+YD2>9)9LQCvT2uI{qfXW$2c42UNe}71)%_`uff{F1#vZw$|kcEZuNIT`HHqpq=7$ zM|NPPJ-1<&ZZsk1OIBIh7gMPN5z;tvk)4~rv0WA2WJz}4icLT>DbdvI{Ck(-m}GNf zdzy@k`{kMv+x3K$RX1S-l4RUXEmtGk81+KB!aVn`!dU2KRnhUuDS11tJ*lbK39O{s z&!jBY+N`V5iU~G9@zoK3BdVu+jNS%G}EByV>YkURs!Pv_nBKn1HkT^vIy=DfXmc3rY7kLyDlDY}y#F*8$U|#v6xz^!LmE- z{Hu)Pbx)a(Oj|v#nE8F|X?Ba~XLnkwKHc42)9~Fp>xNG8y|N~}z6Z)*W*^K; z*zqEBQDVebrG?3Y1|J{IzGcVNuAJ~E=(fkhf>%cq`zA69>)%`PGWCwbjjWIZN4kZ7 z-c{jW6esX(GW(hJ`btH=J!KsBO8l6>3gj6*DV_4==&RNP{?!Nm{89?`^XH6T5yw)q z6(p&3WH(pc#45%Q?guu6$r=2waabA=->4s8FH=1QByTmRyzIxpSM161Ol_u2ZCk$p z-Ff$(`Sf3j4m^y9qoNM{d2Xz+=l#2<>?`Fv{&GlMgP=n|_g$H1F7YdQ0UP6CDHys{ zc;Nm2aJdQZE8F@12mDpI)83HSOFGguO;B=M{#;do$!8w`nY z{kY4{u=C#5>7NuGRE-?SIc$Re&6%y;*H|ttL6Fs{{|)2+z&<^m2Ee- zgA(z?lasC(-#hVG?-S!Z{p@3hzJ1=+TElSt=-Vgd%s&~@x#w(ksoz&UonIh&Mb$ap zJ>|Oc3j1#CJUurTly{!!R(@Ob{KnScpA6=Db7h}RF&WidAuVjTj2)q*L{MJ&_aP!JSq1XQ>@;~SdSdJ)Z7>@sAGt1UV UecWyfDk2#?UHx3vIVCg!0D#ee;s5{u literal 0 HcmV?d00001 From fe82a62f7ca6c12f51204e79a6f7e861f9a6d603 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Sun, 23 Feb 2025 10:58:24 -0500 Subject: [PATCH 05/37] Daisy testing --- apps/daisy/app.js | 12 +++++++++--- apps/daisy/metadata.json | 2 +- apps/daisy/settings.js | 4 ++-- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/apps/daisy/app.js b/apps/daisy/app.js index 21f56a083..7ccfce041 100644 --- a/apps/daisy/app.js +++ b/apps/daisy/app.js @@ -224,7 +224,10 @@ function draw() { function drawClock() { var date = new Date(); var hh = date.getHours(); - if (settings.hr_12) hh = hh % 12; + if (settings.hr_12) { + hh = hh % 12; + if (hh == 0) hh = 12; + } hh = hh.toString().toString().padStart(2, '0'); var mm = date.getMinutes() var p_steps; @@ -238,6 +241,9 @@ function drawClock() { case 'Steps': p_steps = Math.round(100*(getSteps()/10000)); break; + case 'Battery': + p_steps = E.getBattery(); + break; } mm = mm.toString().padStart(2, '0'); @@ -608,9 +614,9 @@ function buzzer(n) { // timeout used to update every minute var drawTimeout; -// schedule a draw for the next minute or every 2 seconds +// schedule a draw for the next minute or every 5 seconds function queueDraw() { - let delay = (settings.ring == 'Seconds') ? (2000 - (Date.now() % 2000)) : (60000 - (Date.now() % 60000)); + let delay = (settings.ring == 'Seconds') ? (5000 - (Date.now() % 5000)) : (60000 - (Date.now() % 60000)); if (drawTimeout) clearTimeout(drawTimeout); drawTimeout = setTimeout(function() { drawTimeout = undefined; diff --git a/apps/daisy/metadata.json b/apps/daisy/metadata.json index d75402153..3e5e2b02a 100644 --- a/apps/daisy/metadata.json +++ b/apps/daisy/metadata.json @@ -1,6 +1,6 @@ { "id": "daisy", "name": "Daisy", - "version": "0.15", + "version": "0.17", "dependencies": {"mylocation":"app"}, "description": "A beautiful digital clock with large ring guage, idle timer and a cyclic information line that includes, day, date, steps, battery, sunrise and sunset times", "icon": "app.png", diff --git a/apps/daisy/settings.js b/apps/daisy/settings.js index fa4fd4222..4ad2fd431 100644 --- a/apps/daisy/settings.js +++ b/apps/daisy/settings.js @@ -27,7 +27,7 @@ var color_options = ['Green','Orange','Cyan','Purple','Red','Blue']; var fg_code = ['#0f0','#ff0','#0ff','#f0f','#f00','#00f']; var gy_code = ['#020','#220','#022','#202','#200','#002']; - var ring_options = ['Minutes', 'Seconds', 'Steps']; + var ring_options = ['Minutes', 'Seconds', 'Steps', 'Battery']; E.showMenu({ '': { 'title': 'Daisy Clock' }, @@ -66,7 +66,7 @@ }, 'Ring Display': { value: 0 | ring_options.indexOf(s.ring), - min: 0, max: 2, + min: 0, max: 3, format: v => ring_options[v], onchange: v => { s.ring = ring_options[v]; From 5a6f1136aac950409a53de7614c537fa88509a8e Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Sun, 23 Feb 2025 11:02:34 -0500 Subject: [PATCH 06/37] Upped version and changelog --- apps/daisy/ChangeLog | 2 +- apps/daisy/metadata.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/daisy/ChangeLog b/apps/daisy/ChangeLog index aecf555c0..f21249c29 100644 --- a/apps/daisy/ChangeLog +++ b/apps/daisy/ChangeLog @@ -12,4 +12,4 @@ 0.12: Added setting to change Battery estimate to hours 0.13: Fixed Battery estimate Default to percentage and improved setting string 0.14: Use `power_usage` module -0.15: Made ring show minutes and allowed 12 hr time +0.15: Ring can now show minutes, seconds, and battery; Allowed for 12hr time; Ring now goes up in 5% increments diff --git a/apps/daisy/metadata.json b/apps/daisy/metadata.json index 3e5e2b02a..d75402153 100644 --- a/apps/daisy/metadata.json +++ b/apps/daisy/metadata.json @@ -1,6 +1,6 @@ { "id": "daisy", "name": "Daisy", - "version": "0.17", + "version": "0.15", "dependencies": {"mylocation":"app"}, "description": "A beautiful digital clock with large ring guage, idle timer and a cyclic information line that includes, day, date, steps, battery, sunrise and sunset times", "icon": "app.png", From 3c3ab7c80c1afadd368211adac803380a12fb0d9 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Sun, 23 Feb 2025 11:11:56 -0500 Subject: [PATCH 07/37] Renamed p_steps to ring_percent --- apps/daisy/app.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/apps/daisy/app.js b/apps/daisy/app.js index 7ccfce041..6baff0167 100644 --- a/apps/daisy/app.js +++ b/apps/daisy/app.js @@ -229,20 +229,20 @@ function drawClock() { if (hh == 0) hh = 12; } hh = hh.toString().toString().padStart(2, '0'); - var mm = date.getMinutes() - var p_steps; + var mm = date.getMinutes(); + var ring_percent; switch (settings.ring) { case 'Minutes': - p_steps = Math.round(100*(mm/60)); + ring_percent = Math.round((10*mm)/6); break; case 'Seconds': - p_steps = Math.round(100*(date.getSeconds()/60)); + ring_percent = Math.round((10*date.getSeconds())/6); break; case 'Steps': - p_steps = Math.round(100*(getSteps()/10000)); + ring_percent = Math.round(100*(getSteps()/10000)); break; case 'Battery': - p_steps = E.getBattery(); + ring_percent = E.getBattery(); break; } mm = mm.toString().padStart(2, '0'); @@ -250,7 +250,7 @@ function drawClock() { g.reset(); g.setColor(g.theme.bg); g.fillRect(0, 0, w, h); - g.drawImage(getGaugeImage(p_steps), 0, 0); + g.drawImage(getGaugeImage(ring_percent), 0, 0); setLargeFont(); g.setColor(settings.fg); From 3e0ee44dcb85fb7adea381644e337eda58578f45 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Sun, 23 Feb 2025 11:41:57 -0500 Subject: [PATCH 08/37] Added display of hr hand in daisy --- apps/daisy/ChangeLog | 2 +- apps/daisy/app.js | 15 ++++++++++----- apps/daisy/settings.js | 6 +++--- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/apps/daisy/ChangeLog b/apps/daisy/ChangeLog index f21249c29..f40825ac6 100644 --- a/apps/daisy/ChangeLog +++ b/apps/daisy/ChangeLog @@ -12,4 +12,4 @@ 0.12: Added setting to change Battery estimate to hours 0.13: Fixed Battery estimate Default to percentage and improved setting string 0.14: Use `power_usage` module -0.15: Ring can now show minutes, seconds, and battery; Allowed for 12hr time; Ring now goes up in 5% increments +0.15: Ring can now show hours, minute, or seconds hand, or battery; Allowed for 12hr time; Ring now goes up in 5% increments diff --git a/apps/daisy/app.js b/apps/daisy/app.js index 6baff0167..c61360935 100644 --- a/apps/daisy/app.js +++ b/apps/daisy/app.js @@ -224,14 +224,13 @@ function draw() { function drawClock() { var date = new Date(); var hh = date.getHours(); - if (settings.hr_12) { - hh = hh % 12; - if (hh == 0) hh = 12; - } - hh = hh.toString().toString().padStart(2, '0'); var mm = date.getMinutes(); var ring_percent; switch (settings.ring) { + case 'Hours': + let min_so_far = (hh * 60) + mm; + ring_percent = Math.round((10*min_so_far)/72); + break; case 'Minutes': ring_percent = Math.round((10*mm)/6); break; @@ -245,6 +244,12 @@ function drawClock() { ring_percent = E.getBattery(); break; } + + if (settings.hr_12) { + hh = hh % 12; + if (hh == 0) hh = 12; + } + hh = hh.toString().padStart(2, '0'); mm = mm.toString().padStart(2, '0'); g.reset(); diff --git a/apps/daisy/settings.js b/apps/daisy/settings.js index 4ad2fd431..84cbb9b66 100644 --- a/apps/daisy/settings.js +++ b/apps/daisy/settings.js @@ -8,7 +8,7 @@ 'check_idle' : true, 'batt_hours' : false, 'hr_12' : false, - 'ring' : 'Minutes'}; + 'ring' : 'Steps'}; // ...and overwrite them with any saved values // This way saved values are preserved if a new version adds more settings @@ -27,7 +27,7 @@ var color_options = ['Green','Orange','Cyan','Purple','Red','Blue']; var fg_code = ['#0f0','#ff0','#0ff','#f0f','#f00','#00f']; var gy_code = ['#020','#220','#022','#202','#200','#002']; - var ring_options = ['Minutes', 'Seconds', 'Steps', 'Battery']; + var ring_options = ['Hours', 'Minutes', 'Seconds', 'Steps', 'Battery']; E.showMenu({ '': { 'title': 'Daisy Clock' }, @@ -66,7 +66,7 @@ }, 'Ring Display': { value: 0 | ring_options.indexOf(s.ring), - min: 0, max: 3, + min: 0, max: 4, format: v => ring_options[v], onchange: v => { s.ring = ring_options[v]; From 14cacd9b3abb5ac8791e6dc9ba6a0c241d951f31 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Sun, 23 Feb 2025 11:48:21 -0500 Subject: [PATCH 09/37] Got rid of an unnecissary let --- apps/daisy/app.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/apps/daisy/app.js b/apps/daisy/app.js index c61360935..541a8ee1b 100644 --- a/apps/daisy/app.js +++ b/apps/daisy/app.js @@ -228,8 +228,7 @@ function drawClock() { var ring_percent; switch (settings.ring) { case 'Hours': - let min_so_far = (hh * 60) + mm; - ring_percent = Math.round((10*min_so_far)/72); + ring_percent = Math.round((10*((hh * 60) + mm))/72); break; case 'Minutes': ring_percent = Math.round((10*mm)/6); From 4788395f03558734028bdb3058f25609c7044597 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Sun, 23 Feb 2025 13:27:13 -0500 Subject: [PATCH 10/37] Bug fix on hours resetting after noon --- apps/daisy/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/daisy/app.js b/apps/daisy/app.js index 541a8ee1b..b88eb18ed 100644 --- a/apps/daisy/app.js +++ b/apps/daisy/app.js @@ -228,7 +228,7 @@ function drawClock() { var ring_percent; switch (settings.ring) { case 'Hours': - ring_percent = Math.round((10*((hh * 60) + mm))/72); + ring_percent = Math.round((10*(((hh % 12) * 60) + mm))/72); break; case 'Minutes': ring_percent = Math.round((10*mm)/6); From 398c448768ee05e9b13ff086f66704f2ce2bac70 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Sun, 23 Feb 2025 13:45:23 -0500 Subject: [PATCH 11/37] Added 2% and 98% to ring --- apps/daisy/app.js | 25 +++++++++++++++++++++---- apps/thering/98p.png | Bin 0 -> 1354 bytes 2 files changed, 21 insertions(+), 4 deletions(-) create mode 100644 apps/thering/98p.png diff --git a/apps/daisy/app.js b/apps/daisy/app.js index b88eb18ed..9b9325167 100644 --- a/apps/daisy/app.js +++ b/apps/daisy/app.js @@ -254,7 +254,7 @@ function drawClock() { g.reset(); g.setColor(g.theme.bg); g.fillRect(0, 0, w, h); - g.drawImage(getGaugeImage(ring_percent), 0, 0); + g.drawImage(getGaugeImage(ring_percent, settings.ring), 0, 0); setLargeFont(); g.setColor(settings.fg); @@ -312,15 +312,24 @@ Bangle.on('HRM', function(hrm) { // putting into 1 function like this, rather than individual variables // reduces ram usage from 70%-13% -function getGaugeImage(p) { +function getGaugeImage(p, type) { + const endsDontShow = ['Minutes', 'Seconds']; // Don't show non-5% iincrements with these ring types // p0 - if (p < 5) return { + if (p < 2 || (p < 5 && endsDontShow.includes(type))) return { width : 176, height : 176, bpp : 2, transparent : -1, palette : pal1, buffer : require("heatshrink").decompress(atob("AH4A/AH4ACgtVAAVUFUgpDAAdAFMEBFQ4ABqBVnLMQqLLLzWEABLgbVgohEGopYaiofDBihWVHJpYYDgYPbKx1ACJhYZIwT4OcAZWYHyRYUIgQXQH4RqOThCXUYRpCHNyQVVQQTwVQiSZWIQSEQNgSYSIYiEQQSyEUCQLDSOAyCnQiSCYQiSCYQiSCZDaDARObKuBSZwcaVzR0QFYKuZWAYNZWCJJKMoKuaWAahKBhiwTJRSudURorBFTgfMVzqjDO5DaeZ5jaeJhhiKbi4rIbT4hLqoriPI7afUpS5BbTwiKFdZgIADSmHFYIqgbgIrGcgIriEYwzHADZ7HRY4rdaYrjHADcBFYoGBFcgkEGQwAeFYqKHFbzUEcQ4AdiorwiorlEogxFAD59FWoorhoArDqArjgIr/FbYwFAEJSDFf4rXgornqgrDFUkAior/Ff4rGAYYAjKYYr/Ff4r/FbdVFdFAFYNQFcsBFf4r/Ff4r/Ff4r/Ff4r/Ff4r/Ff4r/FbdUFcsFFYUVFdADBFf4r/Ff4rbAYYAjKYYr/Ff4rFoArkqorCgIrnqAr/FbIEFAEBSFFf4rYqgrjgorEiormAocVAogAfEooxFFcB9EFdq1DAD9VFYkBFctQFYoGEADokHFcp8FRQoAdag7iFFb4HFioHGADYjHGY4rcPYyLHADbTHcYNQFT4iIFdZgIADKmJqrcgiorIBIIrhMKIAXUpIrBbjzaBFZAKKbS5MJFcKkJbj4fLBYLcdqorKbjzPMbjxKNMhauTURawdJJorBWDShBFZiRBWDQcOHRyuPOhorBWDIbPWDRzQSYKEYIwLLOHgSEXDIJyPQjD2SQjCCQQjSCRCYY/QN4xDRQiyCSQgjdSCqqECLCRWBYyiECISBWCYqgXCLCBWCQSYYEIhxqCeChYFThoQCKypYEIxgPPLB4cKFQZWXDoosIBhhYWcArWDKzYhHABA1EADArNoArcFhgqeWQysgLJxVfcBLWdAH4A5A")) }; + // p2 + if (p < 5) return { + width : 176, height : 176, bpp : 2, + transparent : -1, + palette: pal1, + buffer : require("heatshrink").decompress(atob("AH4A/ADNUFE8FqtVq2q1AqkFIIrDAAOAFMEBFQYrE1WgKsYrGLL4qFFY2pqDWeFZdUVkAhCAQMKFYdVLDUVFQYMHlWq0oMJKyoOJlQrCLDBWDB5clB5xWOoARMCARYWKwT4OgpYXKwY+SLChECC6A/CNRycIS6jCNIQ5uSCqqCCeCqESTKxCCQiBsCTCRDEQiCCWQigSBYaRwGQU6ESQTCESQTCESQTIbQYCJzZVwKTODjSuaOiArBVzKwDBrKwRJJRlBVzSwDUJQMMWCZKKVzqiNFYIqcD5iudUYZ3IbTzPMbTxMMMRTcXFZDafEJdVFcR5HbT6lKXILaeERQrrMBAAaUw4rBFUDcBFYzkBFcQjGGY4AbPY6LHFbrTFcY4AbgIrFAwIrkEggyGADwrFRQ4reagjiHADsVFeEVFcolEGIoAfPoq1FFcNAFYdQFccBFf4rbGAoAhKQYr/Fa8FFc9UFYYqkgEVFf4r/FYwDDAEZTDFf4r/Ff4rbqorooArBqArlgIr/Ff4r/Ff4r/Ff4r/Ff4r/Ff4r/Ff4rbqgrlgorCioroAYIr/Ff4r/FbYDDAEZTDFf4r/FYtAFclVFYUBFc9QFf4rZAgoAgKQor/FbFUFccFFYkVFcwFDioFEAD4lFGIorgPogrtWoYAfqorEgIrlqArFAwgAdEg4rlPgqKFADrUHcQorfA4sVA4wAbEY4zHFbh7GRY4AbaY7jBqAqfERArrMBAAZUxNVbkEVFZAJBFcJhRAC6lJFYLcebQIrIBRTaXJhIrhUhLcfD5YLBbjtVFZTceZ5jceJRpkLVyaiLWDpJNFYKwaUIIrMSIKwaDhw6OVx50NFYKwZDZ6waOaCTBQjBGBZZw8CQi4ZBOR6EYeySEYQSCEaQSITDH6BvGIaKEWQSSEEbqQVVQgRYSKwLGUQgRCQKwTFUC4RYQKwSCTDAhEONQTwULAqcNCARWVLAhGMB55YPDhQqDKy4dFFhAMMLCzgFawZWbEI4AIGogAYFZtAFbgsMFTyyGVkBZOKr7gJazoA/AHI")) + }; + // p5 if (p < 10) return { width : 176, height : 176, bpp : 2, @@ -466,13 +475,21 @@ function getGaugeImage(p) { }; // p95 - if (p < 99) return { + if (p < 98 || (p < 100 && endsDontShow.includes(type))) return { width : 176, height : 176, bpp : 2, transparent : -1, palette : pal2, buffer : require("heatshrink").decompress(atob("AH4A/AH4AChWq1WpqtUFUgpBFYYABoApggQqDFYlVqBVjFYxZfFQorGLLsFFZrgbgNVFAeoGohYfiorDBhIACKzVVtQqIFgpYYDgVqB5xYXKwVVoARMLDJGCfBzgDKzA+SLChECC6A/CNRycIS6jCNIQ5uSCqqCCeCqESTKxCCQiBsCTCRDEQiCCWQigSBYaRwGQU6ESQTCESQTCESQTIbQYCJzZVwKTODjSuaOiArBVzKwDBrKwRJJRlBVzSwDUJQMMWCZKKVzqiNFYIqcD5iudUYZ3IbTzPMbTxMMMRTcXFZDafEJdVFcR5HbT6lKXILaeERQrrMBAAaUw4rBFUDcBFYzkBFcQjGGY4AbPY6LHFbrTFcY4AbgIrFAwIrkEggyGADwrFRQ4reagjiHADsVFeEVFcolEGIoAfPoq1FFcNAFYdQFccBFf4rbGAoAhKQYr/Fa8FFc9UFYYqkgEVFf4r/FYwDDAEZTDFf4r/Ff4rbqorooArBqArlgIr/Ff4r/Ff4r/Ff4r/Ff4r/Ff4r/Ff4rbqgrlgorCioroAYIr/Ff4r/FbYDDAEZTDFf4r/FYtAFclVFYUBFc9QFf4rZAgoAgKQor/FbFUFccFFYkVFcwFDioFEAD4lFGIorgPogrtWoYAfqorEgIrlqArFAwgAdEg4rlPgqKFADrUHcQorfA4sVA4wAbEY4zHFbh7GRY4AbaY7jBqAqfERArrMBAAZUxNVbkEVFZAJBFcJhRAC6lJFYLcebQIrIBRTaXJhIrhUhLcfD5YLBbjtVFZTceZ5jceJRpkLVyaiLWDpJNFYKwaUIIrMSIKwaDhw6OVx50NFYKwZDZ6waOaCTBQjBGBZZw8CQi4ZBOR6EYeySEYQSCEaQSITDH6BvGIaKEWQSSEEbqQVVQgRYSKwLGUQgRCQKwTFUC4RYQKwSCTDAhEONQTwULAqcNCARWVLAhGMB55YPDhQqDKy4dFFhAMMLCzgFawZWbEI4AIGogAYFZtAFbgsMFTyyGVkBZOKr7gJazoA/AHIA==")) }; + // p98 + if (p < 100) return { + width : 176, height : 176, bpp : 2, + transparent : -1, + palette : pal2, + buffer : require("heatshrink").decompress(atob("AH4A/AH4ACgtV1WpqtUFUlVAAIrCAANAFMEBEoQrFqtQKsQrHLL4jEFY5ZdawIrMcDasEEIo1FLDUVD4YMUKyo5NLDAcDB7ZWOoARMLDJGCfBzgDKzA+SLChECC6A/CNRycIS6jCNIQ5uSCqqCCeCqESTKxCCQiBsCTCRDEQiCCWQigSBYaRwGQU6ESQTCESQTCESQTIbQYCJzZVwKTODjSuaOiArBVzKwDBrKwRJJRlBVzSwDUJQMMWCZKKVzqiNFYIqcD5iudUYZ3IbTzPMbTxMMMRTcXFZDafEJdVFcR5HbT6lKXILaeERQrrMBAAaUw4rBFUDcBFYzkBFcQjGGY4AbPY6LHFbrTFcY4AbgIrFAwIrkEggyGADwrFRQ4reagjiHADsVFeEVFcolEGIoAfPoq1FFcNAFYdQFccBFf4rbGAoAhKQYr/Fa8FFc9UFYYqkgEVFf4r/FYwDDAEZTDFf4r/Ff4rbqorooArBqArlgIr/Ff4r/Ff4r/Ff4r/Ff4r/Ff4r/Ff4rbqgrlgorCioroAYIr/Ff4r/FbYDDAEZTDFf4r/FYtAFclVFYUBFc9QFf4rZAgoAgKQor/FbFUFccFFYkVFcwFDioFEAD4lFGIorgPogrtWoYAfqorEgIrlqArFAwgAdEg4rlPgqKFADrUHcQorfA4sVA4wAbEY4zHFbh7GRY4AbaY7jBqAqfERArrMBAAZUxNVbkEVFZAJBFcJhRAC6lJFYLcebQIrIBRTaXJhIrhUhLcfD5YLBbjtVFZTceZ5jceJRpkLVyaiLWDpJNFYKwaUIIrMSIKwaDhw6OVx50NFYKwZDZ6waOaCTBQjBGBZZw8CQi4ZBOR6EYeySEYQSCEaQSITDH6BvGIaKEWQSSEEbqQVVQgRYSKwLGUQgRCQKwTFUC4RYQKwSCTDAhEONQTwULAqcNCARWVLAhGMB55YPDhQqDKy4dFFhAMMLCzgFawZWbEI4AIGogAYFZtAFbgsMFTyyGVkBZOKr7gJazoA/AHI")) + }; + // p100 return { width : 176, height : 176, bpp : 2, diff --git a/apps/thering/98p.png b/apps/thering/98p.png new file mode 100644 index 0000000000000000000000000000000000000000..0136a292c4204e7bc2d5138a5537f7f4daa4c304 GIT binary patch literal 1354 zcmeAS@N?(olHy`uVBq!ia0vp^8$g(Y4M?uv{v-}av6p!Iy0X7y5*JdD*>FoN8Ym=Q z;u=vBoS#-wo>-L1;O^rBG)AE;wMfBO&!n(*$wQzLj*!LpeYZeSkfJR z9T^xl_H+M9WCilslDyqrK=KR>Kb?2i0~IXwba4!+nDh4L-K-RM9@j+sDg}e}Zw+|P zgyzf-{&n-#s?v|KyP{QfXDR;t0R${PC)pX4o-i{AeqwCk_{lKO&i?;(`~UxbT?()N zJpGsNyeG_Oz6F=eWEB3!`IDh|4qKS4L14YRT|-z}$XrI@&r2D@U6=6uc(>vy^BRuw zm;>KkbmR}1--=G3>uPu4O~KXtn?L5od}2(Kjrz-W@8`4{hPRGaH-G-8@sr_id+_>;+NRVr||T)i@eY zD_Q^3JjrmwzN;5nSM;+@-@TC~;{N+r#}EJS3%8T1eph)ldE@(a%yO&jSmxyK{?~Y; z_VHGJXZ5>luiJ8H&6>Twl0)sq{@TyVSGe75UpI7$@0B&-^*vDjGW%d&!j2c2ixMNg zDlJSFH2C<)dTXr+pZkFyYqw22^zcgeVHss+wYWWjmrw6#+;DXTP^yURsLgkEIipj^pa6nf7jl8y|0HG zB$(Q^ZfW>=K0Tn~{@v63LG}W_1r63fP%F@VD{S)(z8rVpWok2pp{&du2x_G#gPYM|1!Ky^lQ z%f)^ad|kZpcx7@Uzj{(i$5+umLSG+0)V~&XdOAb=WHz589UbLUKcv1=JrKTUWsAOY z(wq}7HD7vPJ>4*W&a_GUrgVICi*xUcUl+$!^Tc$@kEbp@>P5dj<(&4)oSA;x?~{N_ z&-*9k##s_MVUSqd(eS$MkXh+m5k9vgpm=`7c=dF1T&}#B^P$jMao%R3k8`VLZIG7W z`xTWT6SFtu%gfgXsw#Z0RR4d*F7Pq$@Aml50xL4}_PuiqxNx`X?cocq)sMgOA9;71 zuR=wzdRF1})pFgn-}ijFc%%6EYI*+uzd?yL_k$5fW!uf|phP_Ji1Po=NE`xQFV@YPr0tV!oC|jPtVN-<(((G zmERUUzp*v=Cxf}(T-j$6`2)%s<|}X5Ui^u%itkaWNZFS;H4J@6{D9@bi@s;I7We+Q z*EC4Bmsq{feP82dci;@Oztxv*-=9q4e^B`2mBgGhU?z9yf90SS^nOkQ=gb1miuwz$ zWQ9Hmyb|dA)>6}O^U6Y@*ZxnKE0nHiB8r#;8~-!>T$X1lwRGVuP{HNt>gTe~DWM4f Df@5@1 literal 0 HcmV?d00001 From 6795a11a08b8fb43d497e1adfbd98b17206e67da Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Sun, 23 Feb 2025 13:54:27 -0500 Subject: [PATCH 12/37] Made endsDontShow its own variable --- apps/daisy/app.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/apps/daisy/app.js b/apps/daisy/app.js index 9b9325167..51cfe0f68 100644 --- a/apps/daisy/app.js +++ b/apps/daisy/app.js @@ -313,9 +313,10 @@ Bangle.on('HRM', function(hrm) { // putting into 1 function like this, rather than individual variables // reduces ram usage from 70%-13% function getGaugeImage(p, type) { - const endsDontShow = ['Minutes', 'Seconds']; // Don't show non-5% iincrements with these ring types + const endsDontShowList = ['Minutes', 'Seconds']; // Don't show non-5% iincrements with these ring types + var endsDontShow = !endsDontShowList.includes(type); // p0 - if (p < 2 || (p < 5 && endsDontShow.includes(type))) return { + if (p < 2 || (p < 5 && endsDontShow)) return { width : 176, height : 176, bpp : 2, transparent : -1, palette : pal1, @@ -475,7 +476,7 @@ function getGaugeImage(p, type) { }; // p95 - if (p < 98 || (p < 100 && endsDontShow.includes(type))) return { + if (p < 98 || (p < 100 && endsDontShow)) return { width : 176, height : 176, bpp : 2, transparent : -1, palette : pal2, From 54c31b8fb620a18a8baf02cab870f0f2b024b8da Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Sun, 23 Feb 2025 14:05:52 -0500 Subject: [PATCH 13/37] bug fix on endsDontShow --- apps/daisy/app.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/daisy/app.js b/apps/daisy/app.js index 51cfe0f68..418ce92bc 100644 --- a/apps/daisy/app.js +++ b/apps/daisy/app.js @@ -313,8 +313,8 @@ Bangle.on('HRM', function(hrm) { // putting into 1 function like this, rather than individual variables // reduces ram usage from 70%-13% function getGaugeImage(p, type) { - const endsDontShowList = ['Minutes', 'Seconds']; // Don't show non-5% iincrements with these ring types - var endsDontShow = !endsDontShowList.includes(type); + const endsDontShowList = ['Minutes', 'Seconds']; // Don't show non-5% increments with these ring types + var endsDontShow = endsDontShowList.includes(type); // p0 if (p < 2 || (p < 5 && endsDontShow)) return { width : 176, height : 176, bpp : 2, From b34218aa5c7194f224623dd10e37e68f10df4d17 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Sun, 23 Feb 2025 15:14:26 -0500 Subject: [PATCH 14/37] palette fix --- apps/daisy/app.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/daisy/app.js b/apps/daisy/app.js index 418ce92bc..0afbad2cd 100644 --- a/apps/daisy/app.js +++ b/apps/daisy/app.js @@ -41,12 +41,12 @@ Graphics.prototype.setFontRoboto20 = function(scale) { function assignPalettes() { if (g.theme.dark) { - // palette for 0-40% + // palette for 0-45% pal1 = new Uint16Array([g.theme.bg, g.toColor(settings.gy), g.toColor(settings.fg), g.toColor("#00f")]); // palette for 50-100% pal2 = new Uint16Array([g.theme.bg, g.toColor(settings.fg), g.toColor(settings.gy), g.toColor("#00f")]); } else { - // palette for 0-40% + // palette for 0-45% pal1 = new Uint16Array([g.theme.bg, g.theme.fg, g.toColor(settings.fg), g.toColor("#00f")]); // palette for 50-100% pal2 = new Uint16Array([g.theme.bg, g.toColor(settings.fg), g.theme.fg, g.toColor("#00f")]); @@ -399,7 +399,7 @@ function getGaugeImage(p, type) { if (p < 50) return { width : 176, height : 176, bpp : 2, transparent : -1, - palette : pal2, + palette : pal1, buffer : require("heatshrink").decompress(atob("AH4A/AH4ACgtVqtW1WoFUgpBFYYABwApggIqDFYmq0BVjFYxZfFQorGLLrWCFZbgbVgtUBQcKLD8VFQYMHlQsDKzoOJFgZYYKwYPLFgZWaoARMLDJWCawgAJcAZWYCZ6FCLCkFFQNQCZ8CFYOoFaZWSLAmAQShWQLAiESQQRtTLAKESFQNUFacKQiSCCoArTgCESQSyEUirZTboyCnQiSCYQiSCYQiSCZQgeAVxwqYQgSwMVwNUFbMKWBquaWCArBVzKwDbRoqaWATcKbQKuaWAbcKbQKuaWAbcKVzqwNFYIqcWATaKVziwDbhDaebhjaebhgrBbTrcCFZDafbhdVFcTcHbT7cDFY0BbT7cD0ArxgtVoArfgGq1ArHFUDcBFY0VFceqFY1UFcMKFY1VFcmAFYtQFcMCFYsBFcugFYtAFcMAFYsFFcuoFYoqigEqFeEVFcuqFYlUFccKFYlVFc2AFYdQFccCFf4rbgNVoArjgGq0Ar/FbMFFc+oFYYqkgEqFf4r/FY0VqgrlhWqFf4r/Ff4rdqorowArBqArlgQr/Ff4r/Ff4r/Ff4r/Ff4r/Ff4r/Ff4rbqgrlhQrCioroAYIr/Ff4r/FbcFqorllWoFf4r/FY9AFcmqFYUBFc+gFf4rZgFVqAqjgWqwAr/FbdUFccKFYkVFcwFDitVFccqFYkFFcuoFeNAFcWqFYkBFcugFYtQFUMCFYsAFcuAFYtUFcMKFY0VFcgHFitVFcMqFY0FFceoFY9AFcGqFY0BqtQFT8C1WgFeMAqtUFb8K1WAFY7cglQrIioriBI8FqtAFb2q1ArJbjzaBFZEBbj7aB0ALIFcLaHbkLaJFYbcd1QrKbjzaKbkDaLbgSwcVwLaJWD6uLFYawaVwIrMbgKwaVwLaKbgawaVwLaLbgawZQQLaLWDiuOWAaEYQQKuMWAiEXKwKuNQjSCQQjSCQQjSCRAAIrBqgqThQrBwAUQQiyCSQgjdSbISCRQgZYSKwKCSQghYQKwSCSQghYQKwSCTAAMVFYNUCJsKFQOqFShYEoARMrRWXLAiFMiorCFSxYEFhQ6BFYJWXLAosIBgVWKzBYGcAsFBIdWKzIhGABI1EADArNoArcFhgqeWQwAEqAqeLJRVfcBLWdAH4A5A=")) }; From f7002a782fcad5d1384d5898d90360159af74bdb Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Tue, 25 Feb 2025 04:32:11 -0500 Subject: [PATCH 15/37] Added Sun settings and 12hrs in sunrise and set times --- apps/daisy/ChangeLog | 2 +- apps/daisy/README.md | 9 ++++++++- apps/daisy/app.js | 41 ++++++++++++++++++++++++++++++++++++++--- apps/daisy/settings.js | 4 ++-- 4 files changed, 49 insertions(+), 7 deletions(-) diff --git a/apps/daisy/ChangeLog b/apps/daisy/ChangeLog index f40825ac6..80b85d26d 100644 --- a/apps/daisy/ChangeLog +++ b/apps/daisy/ChangeLog @@ -12,4 +12,4 @@ 0.12: Added setting to change Battery estimate to hours 0.13: Fixed Battery estimate Default to percentage and improved setting string 0.14: Use `power_usage` module -0.15: Ring can now show hours, minute, or seconds hand, or battery; Allowed for 12hr time; Ring now goes up in 5% increments +0.15: Ring can now show hours, minute, or seconds hand, day/night left, or battery; Allowed for 12hr time; Ring now goes up in 5% increments diff --git a/apps/daisy/README.md b/apps/daisy/README.md index 5599d313c..2e72345e4 100644 --- a/apps/daisy/README.md +++ b/apps/daisy/README.md @@ -18,9 +18,16 @@ See [#1248](https://github.com/espruino/BangleApps/issues/1248) * Uses mylocation.json from MyLocation app to calculate sunrise and sunset times for your location * If your Sunrise, Sunset times look odd make sure you have setup your location using [MyLocation](https://banglejs.com/apps/?id=mylocation) -* The screen is updated every minute to save battery power +* The screen is updated every minute to save battery power, unless the ring is set to display seconds, then it updates every 5 seconds. * Uses the [BloggerSansLight](https://www.1001fonts.com/rounded-fonts.html?page=3) font, which if free for commercial use * You need to run >2V22 to show the battery estimate in hours +* In the settings, the ring can be set to: + * Hours - Displays the ring as though it's the hour hand on an analog clock. + * Minutes - Displays the ring as though it's the minute hand on an analog clock. + * Seconds - Displays the ring as though it's the seconds hand on an analog clock. + * Steps - Displays the ring as the amount of steps taken that day out of 10,000. + * Battery - Displays the ring as the amount of battery percentage left. + * Sun - Displays the ring as the amount of time that has passed from sunrise to sunset in the day and the amount of time between sunset and sunrise at night. ## Future Development * Use mini icons in the information line rather that text diff --git a/apps/daisy/app.js b/apps/daisy/app.js index 0afbad2cd..5dba90a6a 100644 --- a/apps/daisy/app.js +++ b/apps/daisy/app.js @@ -99,22 +99,53 @@ function loadLocation() { function extractTime(d){ var h = d.getHours(), m = d.getMinutes(); + if (settings.hr_12) { + h = h % 12; + if (h == 0) h = 12; + } return(("0"+h).substr(-2) + ":" + ("0"+m).substr(-2)); } var sunRise = "00:00"; var sunSet = "00:00"; var drawCount = 0; +var sunStart; +var sunFull; -function updateSunRiseSunSet(now, lat, lon, line){ +function updateSunRiseSunSet(now, lat, lon, sunLeftCalcs){ // get today's sunlight times for lat/lon - var times = SunCalc.getTimes(new Date(), lat, lon); + var times = SunCalc.getTimes(now, lat, lon); // format sunrise time from the Date object sunRise = extractTime(times.sunrise); sunSet = extractTime(times.sunset); + if (!sunLeftCalcs) return; + + let sunLeft = times.sunset - now; + if (sunLeft < 0) { // If it's already night + let tmrw = now; + tmrw.setDate(tmrw.getDate() + 1); + let timesTmrw = SunCalc.getTimes(tmrw, lat, lon); + sunStart = times.sunset; + sunFull = timesTmrw.sunrise - sunStart; + } + else { + sunLeft = now - times.sunrise; + if (sunLeft < 0) { // If it's not morning yet. + let yest = now; + yest.setDate(yest.getDate() - 1); + let timesYest = SunCalc.getTimes(yest, lat, lon); + sunStart = timesYest.sunset; + sunFull = times.sunrise - sunStart; + } + else { // We're in the middle of the day + sunStart = times.sunrise; + sunFull = times.sunset - sunStart; + } + } } + function batteryString(){ let stringToInsert; if (settings.batt_hours) { @@ -242,6 +273,9 @@ function drawClock() { case 'Battery': ring_percent = E.getBattery(); break; + case 'Sun': + ring_percent = 100 * (date - sunStart) / sunFull; + break; } if (settings.hr_12) { @@ -269,7 +303,7 @@ function drawClock() { // recalc sunrise / sunset every hour if (drawCount % 60 == 0) - updateSunRiseSunSet(new Date(), location.lat, location.lon); + updateSunRiseSunSet(new Date(), location.lat, location.lon, settings.ring == 'Sun'); drawCount++; } @@ -665,6 +699,7 @@ Bangle.setUI("clockupdown", btn=> { loadSettings(); loadLocation(); +updateSunRiseSunSet(new Date(), location.lat, location.lon, true); g.clear(); Bangle.loadWidgets(); diff --git a/apps/daisy/settings.js b/apps/daisy/settings.js index 84cbb9b66..c6805803e 100644 --- a/apps/daisy/settings.js +++ b/apps/daisy/settings.js @@ -27,7 +27,7 @@ var color_options = ['Green','Orange','Cyan','Purple','Red','Blue']; var fg_code = ['#0f0','#ff0','#0ff','#f0f','#f00','#00f']; var gy_code = ['#020','#220','#022','#202','#200','#002']; - var ring_options = ['Hours', 'Minutes', 'Seconds', 'Steps', 'Battery']; + var ring_options = ['Hours', 'Minutes', 'Seconds', 'Steps', 'Battery', 'Sun']; E.showMenu({ '': { 'title': 'Daisy Clock' }, @@ -66,7 +66,7 @@ }, 'Ring Display': { value: 0 | ring_options.indexOf(s.ring), - min: 0, max: 4, + min: 0, max: 5, format: v => ring_options[v], onchange: v => { s.ring = ring_options[v]; From c94287f3a80f18068bfb5b6a79c05140d41343c0 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Tue, 25 Feb 2025 04:40:48 -0500 Subject: [PATCH 16/37] Got rid of hardcoded max in settings --- apps/daisy/settings.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/daisy/settings.js b/apps/daisy/settings.js index c6805803e..e07685d37 100644 --- a/apps/daisy/settings.js +++ b/apps/daisy/settings.js @@ -34,7 +34,7 @@ '< Back': back, 'Colour': { value: 0 | color_options.indexOf(s.color), - min: 0, max: 5, + min: 0, max: color_options.length - 1, format: v => color_options[v], onchange: v => { s.color = color_options[v]; @@ -66,7 +66,7 @@ }, 'Ring Display': { value: 0 | ring_options.indexOf(s.ring), - min: 0, max: 5, + min: 0, max: ring_options.length - 1, format: v => ring_options[v], onchange: v => { s.ring = ring_options[v]; From 2acb2b390adf7c49f6a753b337995b2ebd547673 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Tue, 25 Feb 2025 05:10:24 -0500 Subject: [PATCH 17/37] Removed side-effect in updateSunRiseSunSet --- apps/daisy/app.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/apps/daisy/app.js b/apps/daisy/app.js index 5dba90a6a..e2a969023 100644 --- a/apps/daisy/app.js +++ b/apps/daisy/app.js @@ -115,26 +115,26 @@ var sunFull; function updateSunRiseSunSet(now, lat, lon, sunLeftCalcs){ // get today's sunlight times for lat/lon var times = SunCalc.getTimes(now, lat, lon); + dateCopy = new Date(now.getTime()); + yestTmrw = new Date(now.getTime()); // format sunrise time from the Date object sunRise = extractTime(times.sunrise); sunSet = extractTime(times.sunset); if (!sunLeftCalcs) return; - let sunLeft = times.sunset - now; + let sunLeft = times.sunset - dateCopy; if (sunLeft < 0) { // If it's already night - let tmrw = now; - tmrw.setDate(tmrw.getDate() + 1); - let timesTmrw = SunCalc.getTimes(tmrw, lat, lon); + yestTmrw.setDate(yestTmrw.getDate() + 1); + let timesTmrw = SunCalc.getTimes(yestTmrw, lat, lon); sunStart = times.sunset; sunFull = timesTmrw.sunrise - sunStart; } else { - sunLeft = now - times.sunrise; + sunLeft = dateCopy - times.sunrise; if (sunLeft < 0) { // If it's not morning yet. - let yest = now; - yest.setDate(yest.getDate() - 1); - let timesYest = SunCalc.getTimes(yest, lat, lon); + yestTmrw.setDate(yestTmrw.getDate() - 1); + let timesYest = SunCalc.getTimes(yestTmrw, lat, lon); sunStart = timesYest.sunset; sunFull = times.sunrise - sunStart; } From f2c616377764ebd9c35f21752e2fd6753131b1f9 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Tue, 25 Feb 2025 05:12:11 -0500 Subject: [PATCH 18/37] Removed yestTmrw since dateCopy can be reused for that after the checks. --- apps/daisy/app.js | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/apps/daisy/app.js b/apps/daisy/app.js index e2a969023..65f3859ad 100644 --- a/apps/daisy/app.js +++ b/apps/daisy/app.js @@ -116,7 +116,6 @@ function updateSunRiseSunSet(now, lat, lon, sunLeftCalcs){ // get today's sunlight times for lat/lon var times = SunCalc.getTimes(now, lat, lon); dateCopy = new Date(now.getTime()); - yestTmrw = new Date(now.getTime()); // format sunrise time from the Date object sunRise = extractTime(times.sunrise); @@ -125,16 +124,16 @@ function updateSunRiseSunSet(now, lat, lon, sunLeftCalcs){ let sunLeft = times.sunset - dateCopy; if (sunLeft < 0) { // If it's already night - yestTmrw.setDate(yestTmrw.getDate() + 1); - let timesTmrw = SunCalc.getTimes(yestTmrw, lat, lon); + dateCopy.setDate(dateCopy.getDate() + 1); + let timesTmrw = SunCalc.getTimes(dateCopy, lat, lon); sunStart = times.sunset; sunFull = timesTmrw.sunrise - sunStart; } else { sunLeft = dateCopy - times.sunrise; if (sunLeft < 0) { // If it's not morning yet. - yestTmrw.setDate(yestTmrw.getDate() - 1); - let timesYest = SunCalc.getTimes(yestTmrw, lat, lon); + dateCopy.setDate(dateCopy.getDate() - 1); + let timesYest = SunCalc.getTimes(dateCopy, lat, lon); sunStart = timesYest.sunset; sunFull = times.sunrise - sunStart; } From 2e563f8a0d184bf1e93d7533efac9c3c6f6d1d2b Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Wed, 26 Feb 2025 05:38:47 -0500 Subject: [PATCH 19/37] Fix on if we're acting on the sunrise/sunset after one occurred since the last check. --- apps/daisy/app.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/apps/daisy/app.js b/apps/daisy/app.js index 65f3859ad..4b9b87058 100644 --- a/apps/daisy/app.js +++ b/apps/daisy/app.js @@ -115,7 +115,7 @@ var sunFull; function updateSunRiseSunSet(now, lat, lon, sunLeftCalcs){ // get today's sunlight times for lat/lon var times = SunCalc.getTimes(now, lat, lon); - dateCopy = new Date(now.getTime()); + var dateCopy = new Date(now.getTime()); // format sunrise time from the Date object sunRise = extractTime(times.sunrise); @@ -274,6 +274,10 @@ function drawClock() { break; case 'Sun': ring_percent = 100 * (date - sunStart) / sunFull; + if (ring_percent > 100) { // If we're now past a sunrise of sunset + updateSunRiseSunSet(date, location.lat, location.lon, true); + ring_percent = 100 * (date - sunStart) / sunFull; + } break; } @@ -302,7 +306,7 @@ function drawClock() { // recalc sunrise / sunset every hour if (drawCount % 60 == 0) - updateSunRiseSunSet(new Date(), location.lat, location.lon, settings.ring == 'Sun'); + updateSunRiseSunSet(date, location.lat, location.lon, settings.ring == 'Sun'); drawCount++; } From 3b200a73794a8ab505e2e2d4e3539cd71896c1df Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Wed, 26 Feb 2025 06:16:16 -0500 Subject: [PATCH 20/37] If we're exactly at the sunrise or set, show 100% --- apps/daisy/app.js | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/apps/daisy/app.js b/apps/daisy/app.js index 4b9b87058..6303fd10d 100644 --- a/apps/daisy/app.js +++ b/apps/daisy/app.js @@ -109,8 +109,9 @@ function extractTime(d){ var sunRise = "00:00"; var sunSet = "00:00"; var drawCount = 0; -var sunStart; -var sunFull; +var sunStart; // In terms of ms +var sunEnd; // In terms of minutes +var sunFull; // In terms of ms function updateSunRiseSunSet(now, lat, lon, sunLeftCalcs){ // get today's sunlight times for lat/lon @@ -128,6 +129,7 @@ function updateSunRiseSunSet(now, lat, lon, sunLeftCalcs){ let timesTmrw = SunCalc.getTimes(dateCopy, lat, lon); sunStart = times.sunset; sunFull = timesTmrw.sunrise - sunStart; + sunEnd = (60 * timesTmrw.sunrise.getHours()) + timesTmrw.sunrise.getMinutes(); } else { sunLeft = dateCopy - times.sunrise; @@ -136,10 +138,12 @@ function updateSunRiseSunSet(now, lat, lon, sunLeftCalcs){ let timesYest = SunCalc.getTimes(dateCopy, lat, lon); sunStart = timesYest.sunset; sunFull = times.sunrise - sunStart; + sunEnd = (60 * times.sunrise.getHours()) + times.sunrise.getMinutes(); } else { // We're in the middle of the day sunStart = times.sunrise; sunFull = times.sunset - sunStart; + sunEnd = (60 * times.sunset.getHours()) + times.sunset.getMinutes(); } } } @@ -273,6 +277,11 @@ function drawClock() { ring_percent = E.getBattery(); break; case 'Sun': + if (((60 * date.getHours()) + date.getMinutes()) == sunEnd) { + // If we're exactly on the minute that the sun is setting/rising + ring_percent = 100; + break; + } ring_percent = 100 * (date - sunStart) / sunFull; if (ring_percent > 100) { // If we're now past a sunrise of sunset updateSunRiseSunSet(date, location.lat, location.lon, true); From aae7a98ddb041a4f8d4f88fa57c19b4a3b0cc29f Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Wed, 26 Feb 2025 06:29:32 -0500 Subject: [PATCH 21/37] Made the ring invert when it's night time in the Sun setting --- apps/daisy/app.js | 57 ++++++++++++++++++++++++++--------------------- 1 file changed, 32 insertions(+), 25 deletions(-) diff --git a/apps/daisy/app.js b/apps/daisy/app.js index 6303fd10d..5e08ac196 100644 --- a/apps/daisy/app.js +++ b/apps/daisy/app.js @@ -112,6 +112,7 @@ var drawCount = 0; var sunStart; // In terms of ms var sunEnd; // In terms of minutes var sunFull; // In terms of ms +var isDaytime = true; function updateSunRiseSunSet(now, lat, lon, sunLeftCalcs){ // get today's sunlight times for lat/lon @@ -127,6 +128,7 @@ function updateSunRiseSunSet(now, lat, lon, sunLeftCalcs){ if (sunLeft < 0) { // If it's already night dateCopy.setDate(dateCopy.getDate() + 1); let timesTmrw = SunCalc.getTimes(dateCopy, lat, lon); + isDaytime = false; sunStart = times.sunset; sunFull = timesTmrw.sunrise - sunStart; sunEnd = (60 * timesTmrw.sunrise.getHours()) + timesTmrw.sunrise.getMinutes(); @@ -136,11 +138,13 @@ function updateSunRiseSunSet(now, lat, lon, sunLeftCalcs){ if (sunLeft < 0) { // If it's not morning yet. dateCopy.setDate(dateCopy.getDate() - 1); let timesYest = SunCalc.getTimes(dateCopy, lat, lon); + isDaytime = false; sunStart = timesYest.sunset; sunFull = times.sunrise - sunStart; sunEnd = (60 * times.sunrise.getHours()) + times.sunrise.getMinutes(); } else { // We're in the middle of the day + isDaytime = true; sunStart = times.sunrise; sunFull = times.sunset - sunStart; sunEnd = (60 * times.sunset.getHours()) + times.sunset.getMinutes(); @@ -260,6 +264,7 @@ function drawClock() { var hh = date.getHours(); var mm = date.getMinutes(); var ring_percent; + var invertRing = false; switch (settings.ring) { case 'Hours': ring_percent = Math.round((10*(((hh % 12) * 60) + mm))/72); @@ -287,6 +292,7 @@ function drawClock() { updateSunRiseSunSet(date, location.lat, location.lon, true); ring_percent = 100 * (date - sunStart) / sunFull; } + invertRing = !isDaytime; break; } @@ -300,7 +306,7 @@ function drawClock() { g.reset(); g.setColor(g.theme.bg); g.fillRect(0, 0, w, h); - g.drawImage(getGaugeImage(ring_percent, settings.ring), 0, 0); + g.drawImage(getGaugeImage(ring_percent, settings.ring, invertRing), 0, 0); setLargeFont(); g.setColor(settings.fg); @@ -358,14 +364,15 @@ Bangle.on('HRM', function(hrm) { // putting into 1 function like this, rather than individual variables // reduces ram usage from 70%-13% -function getGaugeImage(p, type) { +function getGaugeImage(p, type, reverse) { const endsDontShowList = ['Minutes', 'Seconds']; // Don't show non-5% increments with these ring types + if (reverse) p = 100 - p; var endsDontShow = endsDontShowList.includes(type); // p0 if (p < 2 || (p < 5 && endsDontShow)) return { width : 176, height : 176, bpp : 2, transparent : -1, - palette : pal1, + palette : (reverse ? pal2 : pal1), buffer : require("heatshrink").decompress(atob("AH4A/AH4ACgtVAAVUFUgpDAAdAFMEBFQ4ABqBVnLMQqLLLzWEABLgbVgohEGopYaiofDBihWVHJpYYDgYPbKx1ACJhYZIwT4OcAZWYHyRYUIgQXQH4RqOThCXUYRpCHNyQVVQQTwVQiSZWIQSEQNgSYSIYiEQQSyEUCQLDSOAyCnQiSCYQiSCYQiSCZDaDARObKuBSZwcaVzR0QFYKuZWAYNZWCJJKMoKuaWAahKBhiwTJRSudURorBFTgfMVzqjDO5DaeZ5jaeJhhiKbi4rIbT4hLqoriPI7afUpS5BbTwiKFdZgIADSmHFYIqgbgIrGcgIriEYwzHADZ7HRY4rdaYrjHADcBFYoGBFcgkEGQwAeFYqKHFbzUEcQ4AdiorwiorlEogxFAD59FWoorhoArDqArjgIr/FbYwFAEJSDFf4rXgornqgrDFUkAior/Ff4rGAYYAjKYYr/Ff4r/FbdVFdFAFYNQFcsBFf4r/Ff4r/Ff4r/Ff4r/Ff4r/Ff4r/FbdUFcsFFYUVFdADBFf4r/Ff4rbAYYAjKYYr/Ff4rFoArkqorCgIrnqAr/FbIEFAEBSFFf4rYqgrjgorEiormAocVAogAfEooxFFcB9EFdq1DAD9VFYkBFctQFYoGEADokHFcp8FRQoAdag7iFFb4HFioHGADYjHGY4rcPYyLHADbTHcYNQFT4iIFdZgIADKmJqrcgiorIBIIrhMKIAXUpIrBbjzaBFZAKKbS5MJFcKkJbj4fLBYLcdqorKbjzPMbjxKNMhauTURawdJJorBWDShBFZiRBWDQcOHRyuPOhorBWDIbPWDRzQSYKEYIwLLOHgSEXDIJyPQjD2SQjCCQQjSCRCYY/QN4xDRQiyCSQgjdSCqqECLCRWBYyiECISBWCYqgXCLCBWCQSYYEIhxqCeChYFThoQCKypYEIxgPPLB4cKFQZWXDoosIBhhYWcArWDKzYhHABA1EADArNoArcFhgqeWQysgLJxVfcBLWdAH4A5A")) }; @@ -373,7 +380,7 @@ function getGaugeImage(p, type) { if (p < 5) return { width : 176, height : 176, bpp : 2, transparent : -1, - palette: pal1, + palette : (reverse ? pal2 : pal1), buffer : require("heatshrink").decompress(atob("AH4A/ADNUFE8FqtVq2q1AqkFIIrDAAOAFMEBFQYrE1WgKsYrGLL4qFFY2pqDWeFZdUVkAhCAQMKFYdVLDUVFQYMHlWq0oMJKyoOJlQrCLDBWDB5clB5xWOoARMCARYWKwT4OgpYXKwY+SLChECC6A/CNRycIS6jCNIQ5uSCqqCCeCqESTKxCCQiBsCTCRDEQiCCWQigSBYaRwGQU6ESQTCESQTCESQTIbQYCJzZVwKTODjSuaOiArBVzKwDBrKwRJJRlBVzSwDUJQMMWCZKKVzqiNFYIqcD5iudUYZ3IbTzPMbTxMMMRTcXFZDafEJdVFcR5HbT6lKXILaeERQrrMBAAaUw4rBFUDcBFYzkBFcQjGGY4AbPY6LHFbrTFcY4AbgIrFAwIrkEggyGADwrFRQ4reagjiHADsVFeEVFcolEGIoAfPoq1FFcNAFYdQFccBFf4rbGAoAhKQYr/Fa8FFc9UFYYqkgEVFf4r/FYwDDAEZTDFf4r/Ff4rbqorooArBqArlgIr/Ff4r/Ff4r/Ff4r/Ff4r/Ff4r/Ff4rbqgrlgorCioroAYIr/Ff4r/FbYDDAEZTDFf4r/FYtAFclVFYUBFc9QFf4rZAgoAgKQor/FbFUFccFFYkVFcwFDioFEAD4lFGIorgPogrtWoYAfqorEgIrlqArFAwgAdEg4rlPgqKFADrUHcQorfA4sVA4wAbEY4zHFbh7GRY4AbaY7jBqAqfERArrMBAAZUxNVbkEVFZAJBFcJhRAC6lJFYLcebQIrIBRTaXJhIrhUhLcfD5YLBbjtVFZTceZ5jceJRpkLVyaiLWDpJNFYKwaUIIrMSIKwaDhw6OVx50NFYKwZDZ6waOaCTBQjBGBZZw8CQi4ZBOR6EYeySEYQSCEaQSITDH6BvGIaKEWQSSEEbqQVVQgRYSKwLGUQgRCQKwTFUC4RYQKwSCTDAhEONQTwULAqcNCARWVLAhGMB55YPDhQqDKy4dFFhAMMLCzgFawZWbEI4AIGogAYFZtAFbgsMFTyyGVkBZOKr7gJazoA/AHI")) }; @@ -381,7 +388,7 @@ function getGaugeImage(p, type) { if (p < 10) return { width : 176, height : 176, bpp : 2, transparent : -1, - palette: pal1, + palette : (reverse ? pal2 : pal1), buffer : require("heatshrink").decompress(atob("AH4A/AH4ACgtVqtW1WoFUgpBFYYABwApggIqDFYmq0BVjFYxZfFQorGLLrWCFZeUVkFUBQcKFYdVqArZioqDBg8qFYQMIKyoOJlWpBoJYYKwYPLlIPOKx1ACJgQCLCxWCawgAJgpYXKwY+SLChECC6A/CNRycIS6jCNIQ5uSCqqCCeCqESTKxCCQiBsCTCRDEQiCCWQigSBYaRwGQU6ESQTCESQTCESQTIbQYCJzZVwKTODjSuaOiArBVzKwDBrKwRJJRlBVzSwDUJQMMWCZKKVzqiNFYIqcD5iudUYZ3IbTzPMbTxMMMRTcXFZDafEJdVFcR5HbT6lKXILaeERQrrMBAAaUw4rBFUDcBFYzkBFcQjGGY4AbPY6LHFbrTFcY4AbgIrFAwIrkEggyGADwrFRQ4reagjiHADsVFeEVFcolEGIoAfPoq1FFcNAFYdQFccBFf4rbGAoAhKQYr/Fa8FFc9UFYYqkgEVFf4r/FYwDDAEZTDFf4r/Ff4rbqorooArBqArlgIr/Ff4r/Ff4r/Ff4r/Ff4r/Ff4r/Ff4rbqgrlgorCioroAYIr/Ff4r/FbYDDAEZTDFf4r/FYtAFclVFYUBFc9QFf4rZAgoAgKQor/FbFUFccFFYkVFcwFDioFEAD4lFGIorgPogrtWoYAfqorEgIrlqArFAwgAdEg4rlPgqKFADrUHcQorfA4sVA4wAbEY4zHFbh7GRY4AbaY7jBqAqfERArrMBAAZUxNVbkEVFZAJBFcJhRAC6lJFYLcebQIrIBRTaXJhIrhUhLcfD5YLBbjtVFZTceZ5jceJRpkLVyaiLWDpJNFYKwaUIIrMSIKwaDhw6OVx50NFYKwZDZ6waOaCTBQjBGBZZw8CQi4ZBOR6EYeySEYQSCEaQSITDH6BvGIaKEWQSSEEbqQVVQgRYSKwLGUQgRCQKwTFUC4RYQKwSCTDAhEONQTwULAqcNCARWVLAhGMB55YPDhQqDKy4dFFhAMMLCzgFawZWbEI4AIGogAYFZtAFbgsMFTyyGVkBZOKr7gJazoA/AHIA=")) }; @@ -389,7 +396,7 @@ function getGaugeImage(p, type) { if (p < 15) return { width : 176, height : 176, bpp : 2, transparent : -1, - palette : pal1, + palette : (reverse ? pal2 : pal1), buffer : require("heatshrink").decompress(atob("AH4A/AH4ACgtVqtW1WoFUgpBFYYABwApggIqDFYmq0BVjFYxZfFQorGLLrWCFZbgbVgtUBQcKLD8VFQYMHlQsDKzoOJFgZYYKwYPLFgZWaoARMLDJWCawgAJcAZWYCZ6FCLCkFFQNQCZ8CFYOoFaZWSLAmAQShWQLAiESQQRtTLAOkQSdUFacK1WloCCSCaAAEFYKaQQSyEC0pvQirZTbomlIh6CYZAZFOQTBxDQhyCYOQhoPQS4bQHaBzaVwKTODjSuaOiArBVzKwDBrKwRJJRlBVzSwDUJQMMWCZKKVzqiNFYIqcD5iudUYZ3IbTzPMbTxMMMRTcXFZDafEJdVFcR5HbT6lKXILaeERQrrMBAAaUw4rBFUDcBFYzkBFcQjGGY4AbPY6LHFbrTFcY4AbgIrFAwIrkEggyGADwrFRQ4reagjiHADsVFeEVFcolEGIoAfPoq1FFcNAFYdQFccBFf4rbGAoAhKQYr/Fa8FFc9UFYYqkgEVFf4r/FYwDDAEZTDFf4r/Ff4rbqorooArBqArlgIr/Ff4r/Ff4r/Ff4r/Ff4r/Ff4r/Ff4rbqgrlgorCioroAYIr/Ff4r/FbYDDAEZTDFf4r/FYtAFclVFYUBFc9QFf4rZAgoAgKQor/FbFUFccFFYkVFcwFDioFEAD4lFGIorgPogrtWoYAfqorEgIrlqArFAwgAdEg4rlPgqKFADrUHcQorfA4sVA4wAbEY4zHFbh7GRY4AbaY7jBqAqfERArrMBAAZUxNVbkEVFZAJBFcJhRAC6lJFYLcebQIrIBRTaXJhIrhUhLcfD5YLBbjtVFZTceZ5jceJRpkLVyaiLWDpJNFYKwaUIIrMSIKwaDhw6OVx50NFYKwZDZ6waOaCTBQjBGBZZw8CQi4ZBOR6EYeySEYQSCEaQSITDH6BvGIaKEWQSSEEbqQVVQgRYSKwLGUQgRCQKwTFUC4RYQKwSCTDAhEONQTwULAqcNCARWVLAhGMB55YPDhQqDKy4dFFhAMMLCzgFawZWbEI4AIGogAYFZtAFbgsMFTyyGVkBZOKr7gJazoA/AHI")) }; @@ -397,7 +404,7 @@ function getGaugeImage(p, type) { if (p < 20) return { width : 176, height : 176, bpp : 2, transparent : -1, - palette : pal1, + palette : (reverse ? pal2 : pal1), buffer : require("heatshrink").decompress(atob("AH4A/AH4ACgtVqtW1WoFUgpBFYYABwApggIqDFYmq0BVjFYxZfFQorGLLrWCFZbgbVgtUBQcKLD8VFQYMHlQsDKzoOJFgZYYKwYPLFgZWaoARMLDJWCawgAJcAZWYCZ6FCLCkFFQNQCZ8CFYOoFaZWSLAmAQShWQLAiESQQRtTLAKESFQNUFacKQiSCCoArTgCESQSyEUirZTboyCnQiSCYQiSCYQiSCZQgeAVxwqYQgSwMVwNUFbMKWBquaWCArBVzKwDbRoqaWATcKbQKuaWAbcKbQKuaWAbcKVzqwNFYIqcWAOpbRSucWAWVO5DaeZ5jaeJhgrBbTqkLbT4hLqoriPI7afUpS5BbTwiKFdZgIADSmHFYIqgbgIrGcgIriEYwzHADZ7HRY4rdaYrjHADcBFYoGBFcgkEGQwAeFYqKHFbzUEcQ4AdiorwiorlEogxFAD59FWoorhoArDqArjgIr/FbYwFAEJSDFf4rXgornqgrDFUkAior/Ff4rGAYYAjKYYr/Ff4r/FbdVFdFAFYNQFcsBFf4r/Ff4r/Ff4r/Ff4r/Ff4r/Ff4r/FbdUFcsFFYUVFdADBFf4r/Ff4rbAYYAjKYYr/Ff4rFoArkqorCgIrnqAr/FbIEFAEBSFFf4rYqgrjgorEiormAocVAogAfEooxFFcB9EFdq1DAD9VFYkBFctQFYoGEADokHFcp8FRQoAdag7iFFb4HFioHGADYjHGY4rcPYyLHADbTHcYNQFT4iIFdZgIADKmJqrcgiorIBIIrhMKIAXUpIrBbjzaBFZAKKbS5MJFcKkJbj4fLBYLcdqorKbjzPMbjxKNMhauTURawdJJorBWDShBFZiRBWDQcOHRyuPOhorBWDIbPWDRzQSYKEYIwLLOHgSEXDIJyPQjD2SQjCCQQjSCRCYY/QN4xDRQiyCSQgjdSCqqECLCRWBYyiECISBWCYqgXCLCBWCQSYYEIhxqCeChYFThoQCKypYEIxgPPLB4cKFQZWXDoosIBhhYWcArWDKzYhHABA1EADArNoArcFhgqeWQysgLJxVfcBLWdAH4A5A==")) }; @@ -405,7 +412,7 @@ function getGaugeImage(p, type) { if (p < 25) return { width : 176, height : 176, bpp : 2, transparent : -1, - palette : pal1, + palette : (reverse ? pal2 : pal1), buffer : require("heatshrink").decompress(atob("AH4A/AH4ACgtVqtW1WoFUgpBFYYABwApggIqDFYmq0BVjFYxZfFQorGLLrWCFZbgbVgtUBQcKLD8VFQYMHlQsDKzoOJFgZYYKwYPLFgZWaoARMLDJWCawgAJcAZWYCZ6FCLCkFFQNQCZ8CFYOoFaZWSLAmAQShWQLAiESQQRtTLAKESFQNUFacKQiSCCoArTgCESQSyEUirZTboyCnQiSCYQiSCYQiSCZQgeAVxwqYQgSwMVwNUFbMKWBquaWCArBVzKwDbRoqaWATcKbQKuaWAbcKbQKuaWAbcKVzqwNFYIqcWATaKVziwDbhDaebhjaebhgrBbTrcCFZDafbhdVFcTcHbT7cDFY0BbT7cD0ArxgtVoArfgGq1ArHFUDcBFY0VFceqFY1UFcMKFY1VFcmAFYtQFcMCFYsBFcugFYtAFcMAFYsFFcuoFYoqigEqFeEVFcuqFYlUFccKFYlVFc2AFYdQFccCFf4AWgNVoAEGAERSDFf4rXgornqgrDFUkAior/Ff4rGAYYAjKYYr/Ff4r/FbdVFdFAFYNQFcsBFf4r/Ff4r/Ff4r/Ff4r/Ff4r/Ff4r/FbdUFcsFFYUVFdADBFf4r/Ff4rbAYYAjKYYr/Ff4rFoArkqorCgIrnqAr/FbIEFAEBSFFf4rYqgrjgorEiormAocVAogAfEooxFFcB9EFdq1DAD9VFYkBFctQFYoGEADokHFcp8FRQoAdag7iFFb4HFioHGADYjHGY4rcPYyLHADbTHcYNQFT4iIFdZgIADKmJqrcgiorIBIIrhMKIAXUpIrBbjzaBFZAKKbS5MJFcKkJbj4fLBYLcdqorKbjzPMbjxKNMhauTURawdJJorBWDShBFZiRBWDQcOHRyuPOhorBWDIbPWDRzQSYKEYIwLLOHgSEXDIJyPQjD2SQjCCQQjSCRCYY/QN4xDRQiyCSQgjdSCqqECLCRWBYyiECISBWCYqgXCLCBWCQSYYEIhxqCeChYFThoQCKypYEIxgPPLB4cKFQZWXDoosIBhhYWcArWDKzYhHABA1EADArNoArcFhgqeWQysgLJxVfcBLWdAH4A5A=")) }; @@ -413,7 +420,7 @@ function getGaugeImage(p, type) { if (p < 30) return { width : 176, height : 176, bpp : 2, transparent : -1, - palette : pal1, + palette : (reverse ? pal2 : pal1), buffer : require("heatshrink").decompress(atob("AH4A/AH4ACgtVqtW1WoFUgpBFYYABwApggIqDFYmq0BVjFYxZfFQorGLLrWCFZbgbVgtUBQcKLD8VFQYMHlQsDKzoOJFgZYYKwYPLFgZWaoARMLDJWCawgAJcAZWYCZ6FCLCkFFQNQCZ8CFYOoFaZWSLAmAQShWQLAiESQQRtTLAKESFQNUFacKQiSCCoArTgCESQSyEUirZTboyCnQiSCYQiSCYQiSCZQgeAVxwqYQgSwMVwNUFbMKWBquaWCArBVzKwDbRoqaWATcKbQKuaWAbcKbQKuaWAbcKVzqwNFYIqcWATaKVziwDbhDaebhjaebhgrBbTrcCFZDafbhdVFcTcHbT7cDFY0BbT7cD0ArxgtVoArfgGq1ArHFUDcBFY0VFceqFY1UFcMKFY1VFcmAFYtQFcMCFYsBFcugFYtAFcMAFYsFFcuoFYoqigEqFeEVFcuqFYlUFccKFYlVFc2AFYdQFccCFf4rbgNVoArjgGq0Ar/FbMFFc+oFYYqkgEqFf4r/FY0VqgrlhWqFf4r/Ff4rdqorowArBqArlgQr/Ff4r/Ff4r/Ff4AKgNVoAr/Ff4r/Ff4r/Ff4rNqgrlgorCioroAYIr/Ff4r/FbYDDAEZTDFf4r/FYtAFclVFYUBFc9QFf4rZAgoAgKQor/FbFUFccFFYkVFcwFDioFEAD4lFGIorgPogrtWoYAfqorEgIrlqArFAwgAdEg4rlPgqKFADrUHcQorfA4sVA4wAbEY4zHFbh7GRY4AbaY7jBqAqfERArrMBAAZUxNVbkEVFZAJBFcJhRAC6lJFYLcebQIrIBRTaXJhIrhUhLcfD5YLBbjtVFZTceZ5jceJRpkLVyaiLWDpJNFYKwaUIIrMSIKwaDhw6OVx50NFYKwZDZ6waOaCTBQjBGBZZw8CQi4ZBOR6EYeySEYQSCEaQSITDH6BvGIaKEWQSSEEbqQVVQgRYSKwLGUQgRCQKwTFUC4RYQKwSCTDAhEONQTwULAqcNCARWVLAhGMB55YPDhQqDKy4dFFhAMMLCzgFawZWbEI4AIGogAYFZtAFbgsMFTyyGVkBZOKr7gJazoA/AHIA=")) }; @@ -421,7 +428,7 @@ function getGaugeImage(p, type) { if (p < 35) return { width : 176, height : 176, bpp : 2, transparent : -1, - palette : pal1, + palette : (reverse ? pal2 : pal1), buffer : require("heatshrink").decompress(atob("AH4A/AH4ACgtVqtW1WoFUgpBFYYABwApggIqDFYmq0BVjFYxZfFQorGLLrWCFZbgbVgtUBQcKLD8VFQYMHlQsDKzoOJFgZYYKwYPLFgZWaoARMLDJWCawgAJcAZWYCZ6FCLCkFFQNQCZ8CFYOoFaZWSLAmAQShWQLAiESQQRtTLAKESFQNUFacKQiSCCoArTgCESQSyEUirZTboyCnQiSCYQiSCYQiSCZQgeAVxwqYQgSwMVwNUFbMKWBquaWCArBVzKwDbRoqaWATcKbQKuaWAbcKbQKuaWAbcKVzqwNFYIqcWATaKVziwDbhDaebhjaebhgrBbTrcCFZDafbhdVFcTcHbT7cDFY0BbT7cD0ArxgtVoArfgGq1ArHFUDcBFY0VFceqFY1UFcMKFY1VFcmAFYtQFcMCFYsBFcugFYtAFcMAFYsFFcuoFYoqigEqFeEVFcuqFYlUFccKFYlVFc2AFYdQFccCFf4rbgNVoArjgGq0Ar/FbMFFc+oFYYqkgEqFf4r/FY0VqgrlhWqFf4r/Ff4rdqorowArBqArlgQr/Ff4r/Ff4r/Ff4r/Ff4r/Ff4r/Ff4rbqgrlhQrCioroAYIr/Ff4r/FbcFqorllWoFf4r/FY9AFcmqFYUBFc+gFf4rZgFVqAqjgWqwAr/FbdUFccFawkVFcwFDioFEAD4lFGIorgPogrtWoYAfqorEgIrlqArFAwgAdEg4rlPgqKFADrUHcQorfA4sVA4wAbEY4zHFbh7GRY4AbaY7jBqAqfERArrMBAAZUxNVbkEVFZAJBFcJhRAC6lJFYLcebQIrIBRTaXJhIrhUhLcfD5YLBbjtVFZTceZ5jceJRpkLVyaiLWDpJNFYKwaUIIrMSIKwaDhw6OVx50NFYKwZDZ6waOaCTBQjBGBZZw8CQi4ZBOR6EYeySEYQSCEaQSITDH6BvGIaKEWQSSEEbqQVVQgRYSKwLGUQgRCQKwTFUC4RYQKwSCTDAhEONQTwULAqcNCARWVLAhGMB55YPDhQqDKy4dFFhAMMLCzgFawZWbEI4AIGogAYFZtAFbgsMFTyyGVkBZOKr7gJazoA/AHI")) }; @@ -429,7 +436,7 @@ function getGaugeImage(p, type) { if (p < 40) return { width : 176, height : 176, bpp : 2, transparent : -1, - palette : pal1, + palette : (reverse ? pal2 : pal1), buffer : require("heatshrink").decompress(atob("AH4A/AH4ACgtVqtW1WoFUgpBFYYABwApggIqDFYmq0BVjFYxZfFQorGLLrWCFZbgbVgtUBQcKLD8VFQYMHlQsDKzoOJFgZYYKwYPLFgZWaoARMLDJWCawgAJcAZWYCZ6FCLCkFFQNQCZ8CFYOoFaZWSLAmAQShWQLAiESQQRtTLAKESFQNUFacKQiSCCoArTgCESQSyEUirZTboyCnQiSCYQiSCYQiSCZQgeAVxwqYQgSwMVwNUFbMKWBquaWCArBVzKwDbRoqaWATcKbQKuaWAbcKbQKuaWAbcKVzqwNFYIqcWATaKVziwDbhDaebhjaebhgrBbTrcCFZDafbhdVFcTcHbT7cDFY0BbT7cD0ArxgtVoArfgGq1ArHFUDcBFY0VFceqFY1UFcMKFY1VFcmAFYtQFcMCFYsBFcugFYtAFcMAFYsFFcuoFYoqigEqFeEVFcuqFYlUFccKFYlVFc2AFYdQFccCFf4rbgNVoArjgGq0Ar/FbMFFc+oFYYqkgEqFf4r/FY0VqgrlhWqFf4r/Ff4rdqorowArBqArlgQr/Ff4r/Ff4r/Ff4r/Ff4r/Ff4r/Ff4rbqgrlhQrCioroAYIr/Ff4r/FbcFqorllWoFf4r/FY9AFcmqFYUBFc+gFf4rZgFVqAqjgWqwAr/FbdUFccKFYkVFcwFDitVFccqFYkFFcuoFeNAFcWqFYkBFcugFYtQFUMCFYsAFcuAFYtUFcMKFY0VFcgHFitVFcMqFY0FFceoFY9AFcGqFY0BqtQFT8C1WgFeMAqtUFb8K1WAFY7cglQrIiorgjWqBI8FqtAFb1W1ArJbjz9BFZAKBbjxMBsALIFcKkJbj4fLBYLcdqorKbjzPMbjxKNMhauTURawdJJorBWDShBFZiRBWDQcOHRyuPOhorBWDIbPWDRzQSYKEYIwLLOHgSEXDIJyPQjD2SQjCCQQjSCRCYY/QN4xDRQiyCSQgjdSCqqECLCRWBYyiECISBWCYqgXCLCBWCQSYYEIhxqCeChYFThoQCKypYEIxgPPLB4cKFQZWXDoosIBhhYWcArWDKzYhHABA1EADArNoArcFhgqeWQysgLJxVfcBLWdAH4A5")) }; @@ -437,7 +444,7 @@ function getGaugeImage(p, type) { if (p < 45) return { width : 176, height : 176, bpp : 2, transparent : -1, - palette : pal1, + palette : (reverse ? pal2 : pal1), buffer : require("heatshrink").decompress(atob("AH4A/AH4ACgtVqtW1WoFUgpBFYYABwApggIqDFYmq0BVjFYxZfFQorGLLrWCFZbgbVgtUBQcKLD8VFQYMHlQsDKzoOJFgZYYKwYPLFgZWaoARMLDJWCawgAJcAZWYCZ6FCLCkFFQNQCZ8CFYOoFaZWSLAmAQShWQLAiESQQRtTLAKESFQNUFacKQiSCCoArTgCESQSyEUirZTboyCnQiSCYQiSCYQiSCZQgeAVxwqYQgSwMVwNUFbMKWBquaWCArBVzKwDbRoqaWATcKbQKuaWAbcKbQKuaWAbcKVzqwNFYIqcWATaKVziwDbhDaebhjaebhgrBbTrcCFZDafbhdVFcTcHbT7cDFY0BbT7cD0ArxgtVoArfgGq1ArHFUDcBFY0VFceqFY1UFcMKFY1VFcmAFYtQFcMCFYsBFcugFYtAFcMAFYsFFcuoFYoqigEqFeEVFcuqFYlUFccKFYlVFc2AFYdQFccCFf4rbgNVoArjgGq0Ar/FbMFFc+oFYYqkgEqFf4r/FY0VqgrlhWqFf4r/Ff4rdqorowArBqArlgQr/Ff4r/Ff4r/Ff4r/Ff4r/Ff4r/Ff4rbqgrlhQrCioroAYIr/Ff4r/FbcFqorllWoFf4r/FY9AFcmqFYUBFc+gFf4rZgFVqAqjgWqwAr/FbdUFccKFYkVFcwFDitVFccqFYkFFcuoFeNAFcWqFYkBFcugFYtQFUMCFYsAFcuAFYtUFcMKFY0VFcgHFitVFcMqFY0FFceoFY9AFcGqFY0BqtQFT8C1WgFeMAqtUFb8K1WAFY7cglQrIioriBI8FqtAFb2q1ArJbjzaBFZEBbj7aB0ALIFcLaHbkLaJFYbcd1QrKbjzaKbkDaLbgSwcVwLaJWD6uLFYawaVwIrMbgKwaVwLaKbgawaVwLaLbgawZQQLaLWDiuOWAaEYQQKuMWAiEXKwKuNQjUBQR6EaiqCPQjVVQSATCqtUFSZvB1WACiSEUY4KCQQgjdSCqqECLCRWBYyiECISBWCYqgXCLCBWCQSYYEIhxqCeChYFThoQCKypYEIxgPPLB4cKFQZWXDoosIBhhYWcArWDKzYhHABA1EADArNoArcFhgqeWQysgLJxVfcBLWdAH4A5A")) }; @@ -445,7 +452,7 @@ function getGaugeImage(p, type) { if (p < 50) return { width : 176, height : 176, bpp : 2, transparent : -1, - palette : pal1, + palette : (reverse ? pal2 : pal1), buffer : require("heatshrink").decompress(atob("AH4A/AH4ACgtVqtW1WoFUgpBFYYABwApggIqDFYmq0BVjFYxZfFQorGLLrWCFZbgbVgtUBQcKLD8VFQYMHlQsDKzoOJFgZYYKwYPLFgZWaoARMLDJWCawgAJcAZWYCZ6FCLCkFFQNQCZ8CFYOoFaZWSLAmAQShWQLAiESQQRtTLAKESFQNUFacKQiSCCoArTgCESQSyEUirZTboyCnQiSCYQiSCYQiSCZQgeAVxwqYQgSwMVwNUFbMKWBquaWCArBVzKwDbRoqaWATcKbQKuaWAbcKbQKuaWAbcKVzqwNFYIqcWATaKVziwDbhDaebhjaebhgrBbTrcCFZDafbhdVFcTcHbT7cDFY0BbT7cD0ArxgtVoArfgGq1ArHFUDcBFY0VFceqFY1UFcMKFY1VFcmAFYtQFcMCFYsBFcugFYtAFcMAFYsFFcuoFYoqigEqFeEVFcuqFYlUFccKFYlVFc2AFYdQFccCFf4rbgNVoArjgGq0Ar/FbMFFc+oFYYqkgEqFf4r/FY0VqgrlhWqFf4r/Ff4rdqorowArBqArlgQr/Ff4r/Ff4r/Ff4r/Ff4r/Ff4r/Ff4rbqgrlhQrCioroAYIr/Ff4r/FbcFqorllWoFf4r/FY9AFcmqFYUBFc+gFf4rZgFVqAqjgWqwAr/FbdUFccKFYkVFcwFDitVFccqFYkFFcuoFeNAFcWqFYkBFcugFYtQFUMCFYsAFcuAFYtUFcMKFY0VFcgHFitVFcMqFY0FFceoFY9AFcGqFY0BqtQFT8C1WgFeMAqtUFb8K1WAFY7cglQrIioriBI8FqtAFb2q1ArJbjzaBFZEBbj7aB0ALIFcLaHbkLaJFYbcd1QrKbjzaKbkDaLbgSwcVwLaJWD6uLFYawaVwIrMbgKwaVwLaKbgawaVwLaLbgawZQQLaLWDiuOWAaEYQQKuMWAiEXKwKuNQjSCQQjSCQQjSCRAAIrBqgqThQrBwAUQQiyCSQgjdSbISCRQgZYSKwKCSQghYQKwSCSQghYQKwSCTAAMVFYNUCJsKFQOqFShYEoARMrRWXLAiFMiorCFSxYEFhQ6BFYJWXLAosIBgVWKzBYGcAsFBIdWKzIhGABI1EADArNoArcFhgqeWQwAEqAqeLJRVfcBLWdAH4A5A=")) }; @@ -453,7 +460,7 @@ function getGaugeImage(p, type) { if (p < 55) return { width : 176, height : 176, bpp : 2, transparent : -1, - palette : pal2, + palette : (reverse ? pal1 : pal2), buffer : require("heatshrink").decompress(atob("AH4A/AH4AChWq1WpqtUFUgpBFYYABoApggQqDFYlVqBVjFYxZfFQorGLLrWCFZbgbVguoBQcFLD8qFQYMHiosDKzoOJFgZYYKwYPLFgZWawARMLDJWCawgAJcAZWYCZ6FCLCkKFQOgCZ8BFYNUFaZWSLAlAQShWQLAiESQQRtTLAKESFQOoFacFQiSCCwArTgCESQSyEUlTZTboyCnQiSCYQiSCYQiSCZQgdAVxwqYQgSwMVwOoFbMFWBquaWCArBVzKwDbRoqaWATcKbQKuaWAbcKbQKuaWAbcKVzqwNFYIqcWATaKVziwDbhDaebhjaebhgrBbTrcCFZDafbheqFcTcHbT7cDFY0CbT7cDqArxhWqwArfgFVqgrHFUDcBFY0qFcdVFY2oFcMFFY2qFclAFYugFcMBFYsCFctQFYuAFcMAFYsKFctUFYoqigEVFeEqFctVFYmoFccFFYmqFc1AFYegFccBFf4rbgWqwArjgFVqAr/FbMKFc9UFYYqkgEVFf4r/FY0q1ArlgtVFf4r/Ff4rd1QrooArB0ArlgIr/Ff4r/Ff4r/Ff4r/Ff4r/Ff4r/Ff4rb1ArlgorClQroAYIr/Ff4r/FbcK1QrlitUFf4r/FY+AFclVFYUCFc9QFf4rZgGq0AqjgNVoAr/FbeoFccFFYkqFcwFDlWqFccVFYkKFctUFeOAFcVVFYkCFctQFYugFUMBFYsAFctAFYuoFcMFFY0qFcgHFlWqFcMVFY0KFcdUFY+AFcFVFY0C1WgFT8BqtQFeMA1WoFb8FqtAFY7cgiorIlQriBI8K1WAFb1VqgrJbjzaBFZECbj7aBqALIFcLaHbkLaJFYbcdqorKbjzaKbkDaLbgSwcVwLaJWD6uLFYawaVwIrMbgKwaVwLaKbgawaVwLaLbgawZQQLaLWDiuOWAaEYQQKuMWAiEXKwKuNQjSCQQjSCQQjSCRAAIrB1AqTgorBoAUQQiyCSQgjdSbISCRQgZYSKwKCSQghYQKwSCSQghYQKwSCTAAMqFYOoCJsFFQNVFShYEwARMFQRWVLAiFMQIRWWLAosKFQZWXLAosIFQZWYLAzgFawZWbAAMKFgmq1IoEAANUFTQABFZtAFbgsFFYwqeWQorFVjZZJFYhVfcAwrCazoA/AHI")) }; @@ -461,7 +468,7 @@ function getGaugeImage(p, type) { if (p < 60) return { width : 176, height : 176, bpp : 2, transparent : -1, - palette : pal2, + palette : (reverse ? pal1 : pal2), buffer : require("heatshrink").decompress(atob("AH4A/AH4AChWq1WpqtUFUgpBFYYABoApggQqDFYlVqBVjFYxZfFQorGLLrWCFZbgbVguoBQcFLD8qFQYMHiosDKzoOJFgZYYKwYPLFgZWawARMLDJWCawgAJcAZWYCZ6FCLCkKFQOgCZ8BFYNUFaZWSLAlAQShWQLAiESQQRtTLAKESFQOoFacFQiSCCwArTgCESQSyEUlTZTboyCnQiSCYQiSCYQiSCZQgdAVxwqYQgSwMVwOoFbMFWBquaWCArBVzKwDbRoqaWATcKbQKuaWAbcKbQKuaWAbcKVzqwNFYIqcWATaKVziwDbhDaebhjaebhgrBbTrcCFZDafbheqFcTcHbT7cDFY0CbT7cDqArxhWqwArfgFVqgrHFUDcBFY0qFcdVFY2oFcMFFY2qFclAFYugFcMBFYsCFctQFYuAFcMAFYsKFctUFYoqigEVFeEqFctVFYmoFccFFYmqFc1AFYegFccBFf4rbgWqwArjgFVqAr/FbMKFc9UFYYqkgEVFf4r/FY0q1ArlgtVFf4r/Ff4rd1QrooArB0ArlgIr/Ff4r/Ff4r/Ff4r/Ff4r/Ff4r/Ff4rb1ArlgorClQroAYIr/Ff4r/FbcK1QrlitUFf4r/FY+AFclVFYUCFc9QFf4rZgGq0AqjgNVoAr/FbeoFccFFYkqFcwFDlWqFccVFYkKFctUFeOAFcVVFYkCFctQFYugFUMBFYsAFctAFYuoFcMFFY0qFcgHFlWqFcMVFY0KFcdUFY+AFcFVFY0C1WgFT8BqtQFeMA1WoFb8FqtAFY7cgiorIlQriBI8K1WAFb1VqgrJbjzaBFZECbj7aBqALIFcLaHbkLaJFYbcdqorKbjzaKbkDaLbgSwcVwLaJWD6uLFYawaVwIrMbgKwaVwLaKbgawaVwLaLbgawZQQLaLWDiuOWAaEYQQKuMWAiEXKwKuNQjSCQQjSCQQjSCRAAIrB1AqTgorBoAUQQiyCSQgjdSbISCRQgZYSKwKCSQghYQKwSCSQghYQKwSCTAAMqFYOoCJsFFQNVFShYEwARMFQRWVLAmVQJxWWLAgcLFQZWXLAWpJJQqDKzBYC0ofDqjWHKzYhHABA1EADArNoArcFhgqegEBFRKsbLJxVfcBLWdAH4A5A==")) }; @@ -469,7 +476,7 @@ function getGaugeImage(p, type) { if (p < 65) return { width : 176, height : 176, bpp : 2, transparent : -1, - palette : pal2, + palette : (reverse ? pal1 : pal2), buffer : require("heatshrink").decompress(atob("AH4A/AH4AChWq1WpqtUFUgpBFYYABoApggQqDFYlVqBVjFYxZfFQorGLLrWCFZbgbVguoBQcFLD8qFQYMHiosDKzoOJFgZYYKwYPLFgZWawARMLDJWCawgAJcAZWYCZ6FCLCkKFQOgCZ8BFYNUFaZWSLAlAQShWQLAiESQQRtTLAKESFQOoFacFQiSCCwArTgCESQSyEUlTZTboyCnQiSCYQiSCYQiSCZQgdAVxwqYQgSwMVwOoFbMFWBquaWCArBVzKwDbRoqaWATcKbQKuaWAbcKbQKuaWAbcKVzqwNFYIqcWATaKVziwDbhDaebhjaebhgrBbTrcCFZDafbheqFcTcHbT7cDFY0CbT7cDqArxhWqwArfgFVqgrHFUDcBFY0qFcdVFY2oFcMFFY2qFclAFYugFcMBFYsCFctQFYuAFcMAFYsKFctUFYoqigEVFeEqFctVFYmoFccFFYmqFc1AFYegFccBFf4rbgWqwArjgFVqAr/FbMKFc9UFYYqkgEVFf4r/FY0q1ArlgtVFf4r/Ff4rd1QrooArB0ArlgIr/Ff4r/Ff4r/Ff4r/Ff4r/Ff4r/Ff4rb1ArlgorClQroAYIr/Ff4r/FbcK1QrlitUFf4r/FY+AFclVFYUCFc9QFf4rZgGq0AqjgNVoAr/FbeoFccFFYkqFcwFDlWqFccVFYkKFctUFeOAFcVVFYkCFctQFYugFUMBFYsAFctAFYuoFcMFFY0qFcgHFlWqFcMVFY0KFcdUFY+AFcFVFY0C1WgFT8BqtQFeMA1WoFb8FqtAFY7cgiorIlQriBI8K1WAFb1VqgrJbjzaBFZECbj7aBqALIFcLaHbkLaJFYbcdqorKbjzaKbkDaLbgSwcVwLaJWD6uLFYawaVwIrMbgKwaVwLaKbgawaVwLaLbgawZQQLaLWDiuOWAaEYQQKuMWAelNBqCLVxqEC0oRPQS6EC0oSQQSyECFYKEVQSIABFYI/QAAcFFYJDRCgSCmYYjdSCqqYCLCRWBYyiECISBWCYqgXCLCBWCQSYYEIhxqCeChYFThoQCKypYEIxgPPLB4cKFQZWXDoosIBhhYWcArWDKzYhHABA1EADArNoArcFhgqeWQysgLJxVfcBLWdAH4A5A")) }; @@ -477,7 +484,7 @@ function getGaugeImage(p, type) { if (p < 70) return { width : 176, height : 176, bpp : 2, transparent : -1, - palette : pal2, + palette : (reverse ? pal1 : pal2), buffer : require("heatshrink").decompress(atob("AH4A/AH4AChWq1WpqtUFUgpBFYYABoApggQqDFYlVqBVjFYxZfFQorGLLrWCFZbgbVguoBQcFLD8qFQYMHiosDKzoOJFgZYYKwYPLFgZWawARMLDJWCawgAJcAZWYCZ6FCLCkKFQOgCZ8BFYNUFaZWSLAlAQShWQLAiESQQRtTLAKESFQOoFacFQiSCCwArTgCESQSyEUlTZTboyCnQiSCYQiSCYQiSCZQgdAVxwqYQgSwMVwOoFbMFWBquaWCArBVzKwDbRoqaWATcKbQKuaWAbcKbQKuaWAbcKVzqwNFYIqcWATaKVziwDbhDaebhjaebhgrBbTrcCFZDafbheqFcTcHbT7cDFY0CbT7cDqArxhWqwArfgFVqgrHFUDcBFY0qFcdVFY2oFcMFFY2qFclAFYugFcMBFYsCFctQFYuAFcMAFYsKFctUFYoqigEVFeEqFctVFYmoFccFFYmqFc1AFYegFccBFf4rbgWqwArjgFVqAr/FbMKFc9UFYYqkgEVFf4r/FY0q1ArlgtVFf4r/Ff4rd1QrooArB0ArlgIr/Ff4r/Ff4r/Ff4r/Ff4r/Ff4r/Ff4rb1ArlgorClQroAYIr/Ff4r/FbcK1QrlitUFf4r/FY+AFclVFYUCFc9QFf4rZgGq0AqjgNVoAr/FbeoFccFFYkqFcwFDlWqFccVFYkKFctUFeOAFcVVFYkCFctQFYugFUMBFYsAFctAFYuoFcMFFY0qFcgHFlWqFcMVFY0KFcdUFY+AFcFVFY0C1WgFT8BqtQFeMA1WkFb8FqtAFY+VbUArIlVVFcIJHhI1IAC9VqiNJXI7aYFZAKKbS5MJFcKkJXRLafBYbcdqorKbjzPMbjxKNMhauTURawdJJorBWDShBFZiRBWDQcOHRyuPOhorBWDIbPWDRzQSYKEYIwLLOHgSEXDIJyPQjD2SQjCCQQjSCRCYY/QN4xDRQiyCSQgjdSCqqECLCRWBYyiECISBWCYqgXCLCBWCQSYYEIhxqCeChYFThoQCKypYEIxgPPLB4cKFQZWXDoosIBhhYWcArWDKzYhHABA1EADArNoArcFhgqeWQysgLJxVfcBLWdAH4A5A=")) }; @@ -485,7 +492,7 @@ function getGaugeImage(p, type) { if (p < 75) return { width : 176, height : 176, bpp : 2, transparent : -1, - palette : pal2, + palette : (reverse ? pal1 : pal2), buffer : require("heatshrink").decompress(atob("AH4A/AH4AChWq1WpqtUFUgpBFYYABoApggQqDFYlVqBVjFYxZfFQorGLLrWCFZbgbVguoBQcFLD8qFQYMHiosDKzoOJFgZYYKwYPLFgZWawARMLDJWCawgAJcAZWYCZ6FCLCkKFQOgCZ8BFYNUFaZWSLAlAQShWQLAiESQQRtTLAKESFQOoFacFQiSCCwArTgCESQSyEUlTZTboyCnQiSCYQiSCYQiSCZQgdAVxwqYQgSwMVwOoFbMFWBquaWCArBVzKwDbRoqaWATcKbQKuaWAbcKbQKuaWAbcKVzqwNFYIqcWATaKVziwDbhDaebhjaebhgrBbTrcCFZDafbheqFcTcHbT7cDFY0CbT7cDqArxhWqwArfgFVqgrHFUDcBFY0qFcdVFY2oFcMFFY2qFclAFYugFcMBFYsCFctQFYuAFcMAFYsKFctUFYoqigEVFeEqFctVFYmoFccFFYmqFc1AFYegFccBFf4rbgWqwArjgFVqAr/FbMKFc9UFYYqkgEVFf4r/FY0q1ArlgtVFf4r/Ff4rd1QrooArB0ArlgIr/Ff4r/Ff4r/Ff4r/Ff4r/Ff4r/Ff4rb1ArlgorClQroAYIr/Ff4r/FbcK1QrlitUFf4r/FY+AFclVFYUCFc9QFf4rZAgoAggNVoAr/FbdUFccFFYkVFcwFDioFEAD4lFGIorgPogrtWoYAfqorEgIrlqArFAwgAdEg4rlPgqKFADrUHcQorfA4sVA4wAbEY4zHFbh7GRY4AbaY7jBqAqfERArrMBAAZUxNVbkEVFZAJBFcJhRAC6lJFYLcebQIrIBRTaXJhIrhUhLcfD5YLBbjtVFZTceZ5jceJRpkLVyaiLWDpJNFYKwaUIIrMSIKwaDhw6OVx50NFYKwZDZ6waOaCTBQjBGBZZw8CQi4ZBOR6EYeySEYQSCEaQSITDH6BvGIaKEWQSSEEbqQVVQgRYSKwLGUQgRCQKwTFUC4RYQKwSCTDAhEONQTwULAqcNCARWVLAhGMB55YPDhQqDKy4dFFhAMMLCzgFawZWbEI4AIGogAYFZtAFbgsMFTyyGVkBZOKr7gJazoA/AHIA=")) }; @@ -493,7 +500,7 @@ function getGaugeImage(p, type) { if (p < 80) return { width : 176, height : 176, bpp : 2, transparent : -1, - palette : pal2, + palette : (reverse ? pal1 : pal2), buffer : require("heatshrink").decompress(atob("AH4A/AH4AChWq1WpqtUFUgpBFYYABoApggQqDFYlVqBVjFYxZfFQorGLLrWCFZbgbVguoBQcFLD8qFQYMHiosDKzoOJFgZYYKwYPLFgZWawARMLDJWCawgAJcAZWYCZ6FCLCkKFQOgCZ8BFYNUFaZWSLAlAQShWQLAiESQQRtTLAKESFQOoFacFQiSCCwArTgCESQSyEUlTZTboyCnQiSCYQiSCYQiSCZQgdAVxwqYQgSwMVwOoFbMFWBquaWCArBVzKwDbRoqaWATcKbQKuaWAbcKbQKuaWAbcKVzqwNFYIqcWATaKVziwDbhDaebhjaebhgrBbTrcCFZDafbheqFcTcHbT7cDFY0CbT7cDqArxhWqwArfgFVqgrHFUDcBFY0qFcdVFY2oFcMFFY2qFclAFYugFcMBFYsCFctQFYuAFcMAFYsKFctUFYoqigEVFeEqFctVFYmoFccFFYmqFc1AFYegFccBFf4rbgWqwArjgFVqAr/FbMKFc9UFYYqkgEVFf4r/FY0q1ArlgtVFf4r/Ff4rd1QrooArB0ArlgIr/Ff4r/Ff4r/Ff4rOqtQFf4r/Ff4r/Ff4r/FZVUFcsFFYUVFdADBFf4r/Ff4rbAYYAjKYYr/Ff4rFoArkqorCgIrnqAr/FbIEFAEBSFFf4rYqgrjgorEiormAocVAogAfEooxFFcB9EFdq1DAD9VFYkBFctQFYoGEADokHFcp8FRQoAdag7iFFb4HFioHGADYjHGY4rcPYyLHADbTHcYNQFT4iIFdZgIADKmJqrcgiorIBIIrhMKIAXUpIrBbjzaBFZAKKbS5MJFcKkJbj4fLBYLcdqorKbjzPMbjxKNMhauTURawdJJorBWDShBFZiRBWDQcOHRyuPOhorBWDIbPWDRzQSYKEYIwLLOHgSEXDIJyPQjD2SQjCCQQjSCRCYY/QN4xDRQiyCSQgjdSCqqECLCRWBYyiECISBWCYqgXCLCBWCQSYYEIhxqCeChYFThoQCKypYEIxgPPLB4cKFQZWXDoosIBhhYWcArWDKzYhHABA1EADArNoArcFhgqeWQysgLJxVfcBLWdAH4A5")) }; @@ -501,7 +508,7 @@ function getGaugeImage(p, type) { if (p < 85) return { width : 176, height : 176, bpp : 2, transparent : -1, - palette : pal2, + palette : (reverse ? pal1 : pal2), buffer : require("heatshrink").decompress(atob("AH4A/AH4AChWq1WpqtUFUgpBFYYABoApggQqDFYlVqBVjFYxZfFQorGLLrWCFZbgbVguoBQcFLD8qFQYMHiosDKzoOJFgZYYKwYPLFgZWawARMLDJWCawgAJcAZWYCZ6FCLCkKFQOgCZ8BFYNUFaZWSLAlAQShWQLAiESQQRtTLAKESFQOoFacFQiSCCwArTgCESQSyEUlTZTboyCnQiSCYQiSCYQiSCZQgdAVxwqYQgSwMVwOoFbMFWBquaWCArBVzKwDbRoqaWATcKbQKuaWAbcKbQKuaWAbcKVzqwNFYIqcWATaKVziwDbhDaebhjaebhgrBbTrcCFZDafbheqFcTcHbT7cDFY0CbT7cDqArxhWqwArfgFVqgrHFUDcBFY0qFcdVFY2oFcMFFY2qFclAFYugFcMBFYsCFctQFYuAFcMAFYsKFctUFYoqigEVFeEqFctVFYmoFccFFYmqFc1AcIdQFccBFf4rbGAoAhKQYr/Fa8FFc9UFYYqkgEVFf4r/FYwDDAEZTDFf4r/Ff4rbqorooArBqArlgIr/Ff4r/Ff4r/Ff4r/Ff4r/Ff4r/Ff4rbqgrlgorCioroAYIr/Ff4r/FbYDDAEZTDFf4r/FYtAFclVFYUBFc9QFf4rZAgoAgKQor/FbFUFccFFYkVFcwFDioFEAD4lFGIorgPogrtWoYAfqorEgIrlqArFAwgAdEg4rlPgqKFADrUHcQorfA4sVA4wAbEY4zHFbh7GRY4AbaY7jBqAqfERArrMBAAZUxNVbkEVFZAJBFcJhRAC6lJFYLcebQIrIBRTaXJhIrhUhLcfD5YLBbjtVFZTceZ5jceJRpkLVyaiLWDpJNFYKwaUIIrMSIKwaDhw6OVx50NFYKwZDZ6waOaCTBQjBGBZZw8CQi4ZBOR6EYeySEYQSCEaQSITDH6BvGIaKEWQSSEEbqQVVQgRYSKwLGUQgRCQKwTFUC4RYQKwSCTDAhEONQTwULAqcNCARWVLAhGMB55YPDhQqDKy4dFFhAMMLCzgFawZWbEI4AIGogAYFZtAFbgsMFTyyGVkBZOKr7gJazoA/AHIA=")) }; @@ -509,7 +516,7 @@ function getGaugeImage(p, type) { if (p < 90) return { width : 176, height : 176, bpp : 2, transparent : -1, - palette : pal2, + palette : (reverse ? pal1 : pal2), buffer : require("heatshrink").decompress(atob("AH4A/AH4AChWq1WpqtUFUgpBFYYABoApggQqDFYlVqBVjFYxZfFQorGLLrWCFZbgbVguoBQcFLD8qFQYMHiosDKzoOJFgZYYKwYPLFgZWawARMLDJWCawgAJcAZWYCZ6FCLCkKFQOgCZ8BFYNUFaZWSLAlAQShWQLAiESQQRtTLAKESFQOoFacFQiSCCwArTgCESQSyEUlTZTboyCnQiSCYQiSCYQiSCZQgdAVxwqYQgSwMVwOoFbMFWBquaWCArBVzKwDbRoqaWATcKbQKuaWAbcKbQKuaWAbcKVzqwNFYIqcWATaKVziwDbhEBtQrgbhEFrTacbhkFqzadbgQrIXRbcfqoribg5hJbjIrGXILlIbjIiGFdZgIADSmHFYIqgbgIrGcgIriEYwzHADZ7HRY4rdaYrjHADcBFYoGBFcgkEGQwAeFYqKHFbzUEcQ4AdiorwiorlEogxFAD59FWoorhoArDqArjgIr/FbYwFAEJSDFf4rXgornqgrDFUkAior/Ff4rGAYYAjKYYr/Ff4r/FbdVFdFAFYNQFcsBFf4r/Ff4r/Ff4r/Ff4r/Ff4r/Ff4r/FbdUFcsFFYUVFdADBFf4r/Ff4rbAYYAjKYYr/Ff4rFoArkqorCgIrnqAr/FbIEFAEBSFFf4rYqgrjgorEiormAocVAogAfEooxFFcB9EFdq1DAD9VFYkBFctQFYoGEADokHFcp8FRQoAdag7iFFb4HFioHGADYjHGY4rcPYyLHADbTHcYNQFT4iIFdZgIADKmJqrcgiorIBIIrhMKIAXUpIrBbjzaBFZAKKbS5MJFcKkJbj4fLBYLcdqorKbjzPMbjxKNMhauTURawdJJorBWDShBFZiRBWDQcOHRyuPOhorBWDIbPWDRzQSYKEYIwLLOHgSEXDIJyPQjD2SQjCCQQjSCRCYY/QN4xDRQiyCSQgjdSCqqECLCRWBYyiECISBWCYqgXCLCBWCQSYYEIhxqCeChYFThoQCKypYEIxgPPLB4cKFQZWXDoosIBhhYWcArWDKzYhHABA1EADArNoArcFhgqeWQysgLJxVfcBLWdAH4A5")) }; @@ -517,7 +524,7 @@ function getGaugeImage(p, type) { if (p < 95) return { width : 176, height : 176, bpp : 2, transparent : -1, - palette : pal2, + palette : (reverse ? pal1 : pal2), buffer : require("heatshrink").decompress(atob("AH4A/AH4AChWq1WpqtUFUgpBFYYABoApggQqDFYlVqBVjFYxZfFQorGLLrWCFZbgbVguoBQcFLD8qFQYMHiosDKzoOJFgZYYKwYPLFgZWawARMLDJWCawgAJcAZWYCZ6FCLCkKFQOgCZ8BFYNUFaZWSLAlAQShWQLAiESQQRtTLAKESquq1ArTgqESNgOqwArTIYKERH4KCUQigSBbKTdGCKKCVQiTCCFSyERCALBQQjAPBoArXDZ7ARObKuBSZwcaVzR0QFYKuZWAYNZWCJJKMoKuaWAahKBhiwTJRSudURorBFTgfMVzqjDO5DaeZ5jaeJhhiKbi4rIbT4hLqoriPI7afUpS5BbTwiKFdZgIADSmHFYIqgbgIrGcgIriEYwzHADZ7HRY4rdaYrjHADcBFYoGBFcgkEGQwAeFYqKHFbzUEcQ4AdiorwiorlEogxFAD59FWoorhoArDqArjgIr/FbYwFAEJSDFf4rXgornqgrDFUkAior/Ff4rGAYYAjKYYr/Ff4r/FbdVFdFAFYNQFcsBFf4r/Ff4r/Ff4r/Ff4r/Ff4r/Ff4r/FbdUFcsFFYUVFdADBFf4r/Ff4rbAYYAjKYYr/Ff4rFoArkqorCgIrnqAr/FbIEFAEBSFFf4rYqgrjgorEiormAocVAogAfEooxFFcB9EFdq1DAD9VFYkBFctQFYoGEADokHFcp8FRQoAdag7iFFb4HFioHGADYjHGY4rcPYyLHADbTHcYNQFT4iIFdZgIADKmJqrcgiorIBIIrhMKIAXUpIrBbjzaBFZAKKbS5MJFcKkJbj4fLBYLcdqorKbjzPMbjxKNMhauTURawdJJorBWDShBFZiRBWDQcOHRyuPOhorBWDIbPWDRzQSYKEYIwLLOHgSEXDIJyPQjD2SQjCCQQjSCRCYY/QN4xDRQiyCSQgjdSCqqECLCRWBYyiECISBWCYqgXCLCBWCQSYYEIhxqCeChYFThoQCKypYEIxgPPLB4cKFQZWXDoosIBhhYWcArWDKzYhHABA1EADArNoArcFhgqeWQysgLJxVfcBLWdAH4A5A")) }; @@ -525,7 +532,7 @@ function getGaugeImage(p, type) { if (p < 98 || (p < 100 && endsDontShow)) return { width : 176, height : 176, bpp : 2, transparent : -1, - palette : pal2, + palette : (reverse ? pal1 : pal2), buffer : require("heatshrink").decompress(atob("AH4A/AH4AChWq1WpqtUFUgpBFYYABoApggQqDFYlVqBVjFYxZfFQorGLLsFFZrgbgNVFAeoGohYfiorDBhIACKzVVtQqIFgpYYDgVqB5xYXKwVVoARMLDJGCfBzgDKzA+SLChECC6A/CNRycIS6jCNIQ5uSCqqCCeCqESTKxCCQiBsCTCRDEQiCCWQigSBYaRwGQU6ESQTCESQTCESQTIbQYCJzZVwKTODjSuaOiArBVzKwDBrKwRJJRlBVzSwDUJQMMWCZKKVzqiNFYIqcD5iudUYZ3IbTzPMbTxMMMRTcXFZDafEJdVFcR5HbT6lKXILaeERQrrMBAAaUw4rBFUDcBFYzkBFcQjGGY4AbPY6LHFbrTFcY4AbgIrFAwIrkEggyGADwrFRQ4reagjiHADsVFeEVFcolEGIoAfPoq1FFcNAFYdQFccBFf4rbGAoAhKQYr/Fa8FFc9UFYYqkgEVFf4r/FYwDDAEZTDFf4r/Ff4rbqorooArBqArlgIr/Ff4r/Ff4r/Ff4r/Ff4r/Ff4r/Ff4rbqgrlgorCioroAYIr/Ff4r/FbYDDAEZTDFf4r/FYtAFclVFYUBFc9QFf4rZAgoAgKQor/FbFUFccFFYkVFcwFDioFEAD4lFGIorgPogrtWoYAfqorEgIrlqArFAwgAdEg4rlPgqKFADrUHcQorfA4sVA4wAbEY4zHFbh7GRY4AbaY7jBqAqfERArrMBAAZUxNVbkEVFZAJBFcJhRAC6lJFYLcebQIrIBRTaXJhIrhUhLcfD5YLBbjtVFZTceZ5jceJRpkLVyaiLWDpJNFYKwaUIIrMSIKwaDhw6OVx50NFYKwZDZ6waOaCTBQjBGBZZw8CQi4ZBOR6EYeySEYQSCEaQSITDH6BvGIaKEWQSSEEbqQVVQgRYSKwLGUQgRCQKwTFUC4RYQKwSCTDAhEONQTwULAqcNCARWVLAhGMB55YPDhQqDKy4dFFhAMMLCzgFawZWbEI4AIGogAYFZtAFbgsMFTyyGVkBZOKr7gJazoA/AHIA==")) }; @@ -533,7 +540,7 @@ function getGaugeImage(p, type) { if (p < 100) return { width : 176, height : 176, bpp : 2, transparent : -1, - palette : pal2, + palette : (reverse ? pal1 : pal2), buffer : require("heatshrink").decompress(atob("AH4A/AH4ACgtV1WpqtUFUlVAAIrCAANAFMEBEoQrFqtQKsQrHLL4jEFY5ZdawIrMcDasEEIo1FLDUVD4YMUKyo5NLDAcDB7ZWOoARMLDJGCfBzgDKzA+SLChECC6A/CNRycIS6jCNIQ5uSCqqCCeCqESTKxCCQiBsCTCRDEQiCCWQigSBYaRwGQU6ESQTCESQTCESQTIbQYCJzZVwKTODjSuaOiArBVzKwDBrKwRJJRlBVzSwDUJQMMWCZKKVzqiNFYIqcD5iudUYZ3IbTzPMbTxMMMRTcXFZDafEJdVFcR5HbT6lKXILaeERQrrMBAAaUw4rBFUDcBFYzkBFcQjGGY4AbPY6LHFbrTFcY4AbgIrFAwIrkEggyGADwrFRQ4reagjiHADsVFeEVFcolEGIoAfPoq1FFcNAFYdQFccBFf4rbGAoAhKQYr/Fa8FFc9UFYYqkgEVFf4r/FYwDDAEZTDFf4r/Ff4rbqorooArBqArlgIr/Ff4r/Ff4r/Ff4r/Ff4r/Ff4r/Ff4rbqgrlgorCioroAYIr/Ff4r/FbYDDAEZTDFf4r/FYtAFclVFYUBFc9QFf4rZAgoAgKQor/FbFUFccFFYkVFcwFDioFEAD4lFGIorgPogrtWoYAfqorEgIrlqArFAwgAdEg4rlPgqKFADrUHcQorfA4sVA4wAbEY4zHFbh7GRY4AbaY7jBqAqfERArrMBAAZUxNVbkEVFZAJBFcJhRAC6lJFYLcebQIrIBRTaXJhIrhUhLcfD5YLBbjtVFZTceZ5jceJRpkLVyaiLWDpJNFYKwaUIIrMSIKwaDhw6OVx50NFYKwZDZ6waOaCTBQjBGBZZw8CQi4ZBOR6EYeySEYQSCEaQSITDH6BvGIaKEWQSSEEbqQVVQgRYSKwLGUQgRCQKwTFUC4RYQKwSCTDAhEONQTwULAqcNCARWVLAhGMB55YPDhQqDKy4dFFhAMMLCzgFawZWbEI4AIGogAYFZtAFbgsMFTyyGVkBZOKr7gJazoA/AHI")) }; @@ -541,7 +548,7 @@ function getGaugeImage(p, type) { return { width : 176, height : 176, bpp : 2, transparent : -1, - palette : pal2, + palette : (reverse ? pal1 : pal2), buffer : require("heatshrink").decompress(atob("AH4A/AH4ACgtVAAVUFUgpDAAdAFMEBFQ4ABqBVnLMQqLFjzWEABLgbVgohEGoqyaiofDBihWVHJpYYDgYPbKxz5NLDJGCfBzgDKzA+SLChECC6A/CNRycIS6jCNIQ5uSCqqCCeCqESTKxCCQiBsCTCRDEQiCCWQigSBYaRwGQU6ESQTCESQTCESQTIbQYCJzZVwKTODjSuaOiArBVzKwDBrKwRJJRlBVzSwDUJQMMWCZKKVzqiNFYIqcD5iudUYZ3IbTzPMbTxMMMRTcXFZDafEJdVFcR5HbT6lKXILaeERQrrMBAAaUw4rBFUDcBFYzkBFcQjGGY4AbPY6LHFbrTFcY4AbgIrFAwIrkEggyGADwrFRQ4reagjiHADsVFeEVFcolEGIoAfPoq1FFcNAFYdQFccBFf4rbGAoAhKQYr/Fa8FFc9UFYYqkgEVFf4r/FYwDDAEZTDFf4r/Ff4rbqorooArBqArlgIr/Ff4r/Ff4r/Ff4r/Ff4r/Ff4r/Ff4rbqgrlgorCioroAYIr/Ff4r/FbYDDAEZTDFf4r/FYtAFclVFYUBFc9QFf4rZAgoAgKQor/FbFUFccFFYkVFcwFDioFEAD4lFGIorgPogrtWoYAfqorEgIrlqArFAwgAdEg4rlPgqKFADrUHcQorfA4sVA4wAbEY4zHFbh7GRY4AbaY7jBqAqfERArrMBAAZUxNVbkEVFZAJBFcJhRAC6lJFYLcebQIrIBRTaXJhIrhUhLcfD5YLBbjtVFZTceZ5jceJRpkLVyaiLWDpJNFYKwaUIIrMSIKwaDhw6OVx50NFYKwZDZ6waOaCTBQjBGBZZw8CQi4ZBOR6EYeySEYQSCEaQSITDH6BvGIaKEWQSSEEbqQVVQgRYSKwLGUQgRCQKwTFUC4RYQKwSCTDAhEONQTwULAqcNCARWVLAhGMB55YPDhQqDKy4dFFhAMMLCzgFawZWbEI4AIGogAYFZtAFbgsMFTyyGVkBZOKr7gJazoA/AHIA=")) }; } From 0bc7a3dddb83313790ee680ed558533e4adc93ed Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Wed, 26 Feb 2025 21:05:28 -0500 Subject: [PATCH 22/37] Made getMinutesFromDate as a function --- apps/daisy/app.js | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/apps/daisy/app.js b/apps/daisy/app.js index 5e08ac196..a59907649 100644 --- a/apps/daisy/app.js +++ b/apps/daisy/app.js @@ -114,6 +114,10 @@ var sunEnd; // In terms of minutes var sunFull; // In terms of ms var isDaytime = true; +function getMinutesFromDate(date) { + return (60 * date.getHours()) + date.getMinutes(); +} + function updateSunRiseSunSet(now, lat, lon, sunLeftCalcs){ // get today's sunlight times for lat/lon var times = SunCalc.getTimes(now, lat, lon); @@ -131,7 +135,7 @@ function updateSunRiseSunSet(now, lat, lon, sunLeftCalcs){ isDaytime = false; sunStart = times.sunset; sunFull = timesTmrw.sunrise - sunStart; - sunEnd = (60 * timesTmrw.sunrise.getHours()) + timesTmrw.sunrise.getMinutes(); + sunEnd = getMinutesFromDate(timesTmrw.sunrise); } else { sunLeft = dateCopy - times.sunrise; @@ -141,13 +145,13 @@ function updateSunRiseSunSet(now, lat, lon, sunLeftCalcs){ isDaytime = false; sunStart = timesYest.sunset; sunFull = times.sunrise - sunStart; - sunEnd = (60 * times.sunrise.getHours()) + times.sunrise.getMinutes(); + sunEnd = getMinutesFromDate(times.sunrise); } else { // We're in the middle of the day isDaytime = true; sunStart = times.sunrise; sunFull = times.sunset - sunStart; - sunEnd = (60 * times.sunset.getHours()) + times.sunset.getMinutes(); + sunEnd = getMinutesFromDate(times.sunset); } } } @@ -282,16 +286,13 @@ function drawClock() { ring_percent = E.getBattery(); break; case 'Sun': - if (((60 * date.getHours()) + date.getMinutes()) == sunEnd) { - // If we're exactly on the minute that the sun is setting/rising - ring_percent = 100; - break; - } ring_percent = 100 * (date - sunStart) / sunFull; if (ring_percent > 100) { // If we're now past a sunrise of sunset updateSunRiseSunSet(date, location.lat, location.lon, true); ring_percent = 100 * (date - sunStart) / sunFull; } + // If we're exactly on the minute that the sun is setting/rising + if (getMinutesFromDate(date) == sunEnd) ring_percent = 100; invertRing = !isDaytime; break; } From 173251044b946dff2332708f357ec1aebbe9b21a Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Wed, 26 Feb 2025 21:08:45 -0500 Subject: [PATCH 23/37] Removed the ring inversion during sunset --- apps/daisy/app.js | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/apps/daisy/app.js b/apps/daisy/app.js index a59907649..21af373a0 100644 --- a/apps/daisy/app.js +++ b/apps/daisy/app.js @@ -112,7 +112,6 @@ var drawCount = 0; var sunStart; // In terms of ms var sunEnd; // In terms of minutes var sunFull; // In terms of ms -var isDaytime = true; function getMinutesFromDate(date) { return (60 * date.getHours()) + date.getMinutes(); @@ -132,7 +131,6 @@ function updateSunRiseSunSet(now, lat, lon, sunLeftCalcs){ if (sunLeft < 0) { // If it's already night dateCopy.setDate(dateCopy.getDate() + 1); let timesTmrw = SunCalc.getTimes(dateCopy, lat, lon); - isDaytime = false; sunStart = times.sunset; sunFull = timesTmrw.sunrise - sunStart; sunEnd = getMinutesFromDate(timesTmrw.sunrise); @@ -142,13 +140,11 @@ function updateSunRiseSunSet(now, lat, lon, sunLeftCalcs){ if (sunLeft < 0) { // If it's not morning yet. dateCopy.setDate(dateCopy.getDate() - 1); let timesYest = SunCalc.getTimes(dateCopy, lat, lon); - isDaytime = false; sunStart = timesYest.sunset; sunFull = times.sunrise - sunStart; sunEnd = getMinutesFromDate(times.sunrise); } else { // We're in the middle of the day - isDaytime = true; sunStart = times.sunrise; sunFull = times.sunset - sunStart; sunEnd = getMinutesFromDate(times.sunset); @@ -268,7 +264,6 @@ function drawClock() { var hh = date.getHours(); var mm = date.getMinutes(); var ring_percent; - var invertRing = false; switch (settings.ring) { case 'Hours': ring_percent = Math.round((10*(((hh % 12) * 60) + mm))/72); @@ -293,7 +288,6 @@ function drawClock() { } // If we're exactly on the minute that the sun is setting/rising if (getMinutesFromDate(date) == sunEnd) ring_percent = 100; - invertRing = !isDaytime; break; } @@ -307,7 +301,7 @@ function drawClock() { g.reset(); g.setColor(g.theme.bg); g.fillRect(0, 0, w, h); - g.drawImage(getGaugeImage(ring_percent, settings.ring, invertRing), 0, 0); + g.drawImage(getGaugeImage(ring_percent, settings.ring, false), 0, 0); setLargeFont(); g.setColor(settings.fg); From d767506b3baee356285e7036d798dd3e80ee92f9 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Thu, 6 Mar 2025 06:26:40 -0500 Subject: [PATCH 24/37] bugfix on incorrect reference in settings --- apps/daisy/app.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/daisy/app.js b/apps/daisy/app.js index 21af373a0..4e7e8dbcf 100644 --- a/apps/daisy/app.js +++ b/apps/daisy/app.js @@ -13,7 +13,7 @@ let warned = 0; let idle = false; let IDLE_MINUTES = 26; -let pal1; // palette for 0-40% +let pal1; // palette for 0-49% let pal2; // palette for 50-100% const infoLine = (3*h/4) - 6; const infoWidth = 56; @@ -41,7 +41,7 @@ Graphics.prototype.setFontRoboto20 = function(scale) { function assignPalettes() { if (g.theme.dark) { - // palette for 0-45% + // palette for 0-49% pal1 = new Uint16Array([g.theme.bg, g.toColor(settings.gy), g.toColor(settings.fg), g.toColor("#00f")]); // palette for 50-100% pal2 = new Uint16Array([g.theme.bg, g.toColor(settings.fg), g.toColor(settings.gy), g.toColor("#00f")]); @@ -85,7 +85,7 @@ function loadSettings() { settings.idle_check = (settings.idle_check === undefined ? true : settings.idle_check); settings.batt_hours = (settings.batt_hours === undefined ? false : settings.batt_hours); settings.hr_12 = (settings.hr_12 === undefined ? false : settings.hr_12); - settings.show_steps_ring = (settings.show_steps_ring === undefined ? false : settings.show_steps_ring); + settings.ring = settings.ring||'Steps'; assignPalettes(); } From e046a975ae8bee5050b25f0d56a8d95498eb9de4 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Thu, 6 Mar 2025 06:28:12 -0500 Subject: [PATCH 25/37] The displayed info index remains when leaving and re-entering the screen --- apps/daisy/app.js | 36 +++++++++++++++++++----------------- apps/daisy/settings.js | 3 ++- 2 files changed, 21 insertions(+), 18 deletions(-) diff --git a/apps/daisy/app.js b/apps/daisy/app.js index 4e7e8dbcf..38d2d3185 100644 --- a/apps/daisy/app.js +++ b/apps/daisy/app.js @@ -1,4 +1,5 @@ var SunCalc = require("suncalc"); // from modules folder +const storage = require('Storage') const widget_utils = require('widget_utils'); const SETTINGS_FILE = "daisy.json"; const LOCATION_FILE = "mylocation.json"; @@ -86,6 +87,7 @@ function loadSettings() { settings.batt_hours = (settings.batt_hours === undefined ? false : settings.batt_hours); settings.hr_12 = (settings.hr_12 === undefined ? false : settings.hr_12); settings.ring = settings.ring||'Steps'; + settings.idxInfo = settings.idxInfo||0; assignPalettes(); } @@ -190,28 +192,21 @@ const infoData = { }; const infoList = Object.keys(infoData).sort(); -let infoMode = infoList[0]; -function nextInfo() { - let idx = infoList.indexOf(infoMode); +function nextInfo(idx) { if (idx > -1) { - if (idx === infoList.length - 1) infoMode = infoList[0]; - else infoMode = infoList[idx + 1]; + if (idx === infoList.length - 1) idx = 0; + else idx += 1; } - // power HRM on/off accordingly - Bangle.setHRMPower(infoMode == "ID_HRM" ? 1 : 0); - resetHrm(); + return idx; } -function prevInfo() { - let idx = infoList.indexOf(infoMode); +function prevInfo(idx) { if (idx > -1) { - if (idx === 0) infoMode = infoList[infoList.length - 1]; - else infoMode = infoList[idx - 1]; + if (idx === 0) idx = infoList.length - 1; + else idx -= 1; } - // power HRM on/off accordingly - Bangle.setHRMPower(infoMode == "ID_HRM" ? 1 : 0); - resetHrm(); + return idx; } function clearInfo() { @@ -706,13 +701,20 @@ Bangle.on('lcdPower',on=>{ }); Bangle.setUI("clockupdown", btn=> { - if (btn<0) prevInfo(); - if (btn>0) nextInfo(); + if (btn<0) settings.idxInfo = prevInfo(settings.idxInfo); + if (btn>0) settings.idxInfo = nextInfo(settings.idxInfo); + // power HRM on/off accordingly + infoMode = infoList[settings.idxInfo]; + Bangle.setHRMPower(infoMode == "ID_HRM" ? 1 : 0); + resetHrm(); + log_debug("idxInfo=" + settings.idxInfo); draw(); + storage.write(SETTINGS_FILE, settings); // Retains idxInfo when leaving the face }); loadSettings(); loadLocation(); +var infoMode = infoList[settings.idxInfo]; updateSunRiseSunSet(new Date(), location.lat, location.lon, true); g.clear(); diff --git a/apps/daisy/settings.js b/apps/daisy/settings.js index e07685d37..277a5743a 100644 --- a/apps/daisy/settings.js +++ b/apps/daisy/settings.js @@ -8,7 +8,8 @@ 'check_idle' : true, 'batt_hours' : false, 'hr_12' : false, - 'ring' : 'Steps'}; + 'ring' : 'Steps', + 'idxInfo' : 0}; // ...and overwrite them with any saved values // This way saved values are preserved if a new version adds more settings From 021ac3169bfed951aa643d1689fb9a7f40fc6942 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Thu, 6 Mar 2025 08:08:58 -0500 Subject: [PATCH 26/37] Step Target can now be changed --- apps/daisy/app.js | 3 ++- apps/daisy/settings.js | 32 +++++++++++++++++++++++--------- 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/apps/daisy/app.js b/apps/daisy/app.js index 38d2d3185..e1f3a07d4 100644 --- a/apps/daisy/app.js +++ b/apps/daisy/app.js @@ -88,6 +88,7 @@ function loadSettings() { settings.hr_12 = (settings.hr_12 === undefined ? false : settings.hr_12); settings.ring = settings.ring||'Steps'; settings.idxInfo = settings.idxInfo||0; + settings.step_target = settings.step_target||10000; assignPalettes(); } @@ -270,7 +271,7 @@ function drawClock() { ring_percent = Math.round((10*date.getSeconds())/6); break; case 'Steps': - ring_percent = Math.round(100*(getSteps()/10000)); + ring_percent = Math.round(100*(getSteps()/settings.step_target)); break; case 'Battery': ring_percent = E.getBattery(); diff --git a/apps/daisy/settings.js b/apps/daisy/settings.js index 277a5743a..a27df3e80 100644 --- a/apps/daisy/settings.js +++ b/apps/daisy/settings.js @@ -9,28 +9,30 @@ 'batt_hours' : false, 'hr_12' : false, 'ring' : 'Steps', - 'idxInfo' : 0}; + 'idxInfo' : 0, + 'step_target' : 10000}; // ...and overwrite them with any saved values // This way saved values are preserved if a new version adds more settings - const storage = require('Storage') + const storage = require('Storage'); let settings = storage.readJSON(SETTINGS_FILE, 1) || s; - const saved = settings || {} + const saved = settings || {}; for (const key in saved) { - s[key] = saved[key] + s[key] = saved[key]; } function save() { - settings = s - storage.write(SETTINGS_FILE, settings) + settings = s; + storage.write(SETTINGS_FILE, settings); } var color_options = ['Green','Orange','Cyan','Purple','Red','Blue']; var fg_code = ['#0f0','#ff0','#0ff','#f0f','#f00','#00f']; var gy_code = ['#020','#220','#022','#202','#200','#002']; var ring_options = ['Hours', 'Minutes', 'Seconds', 'Steps', 'Battery', 'Sun']; - - E.showMenu({ + var step_options = [100, 1000, 5000, 10000, 15000, 20000]; + + let appMenu = { '': { 'title': 'Daisy Clock' }, '< Back': back, 'Colour': { @@ -74,5 +76,17 @@ save(); }, } - }); + }; + if (s.ring == 'Steps') { + appMenu[/*LANG*/"Step Target"] = { + value: 0 | step_options.indexOf(s.step_target), + min: 0, max: step_options.length - 1, + format: v => step_options[v], + onchange: v => { + s.step_target = step_options[v]; + save(); + }, + }; + } + E.showMenu(appMenu); }) From ff906ffe253b5c909c45075a187e427ba49eada4 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Thu, 6 Mar 2025 08:11:03 -0500 Subject: [PATCH 27/37] Failed attempt on on-the-fly redraw of menu when selecting Steps --- apps/daisy/settings.js | 112 ++++++++++++++++++++++------------------- 1 file changed, 60 insertions(+), 52 deletions(-) diff --git a/apps/daisy/settings.js b/apps/daisy/settings.js index a27df3e80..8af9a5efb 100644 --- a/apps/daisy/settings.js +++ b/apps/daisy/settings.js @@ -32,61 +32,69 @@ var ring_options = ['Hours', 'Minutes', 'Seconds', 'Steps', 'Battery', 'Sun']; var step_options = [100, 1000, 5000, 10000, 15000, 20000]; - let appMenu = { - '': { 'title': 'Daisy Clock' }, - '< Back': back, - 'Colour': { - value: 0 | color_options.indexOf(s.color), - min: 0, max: color_options.length - 1, - format: v => color_options[v], - onchange: v => { - s.color = color_options[v]; - s.fg = fg_code[v]; - s.gy = gy_code[v]; - save(); + function buildMainMenu() { + let appMenu = { + '': { 'title': 'Daisy Clock' }, + '< Back': back, + 'Colour': { + value: 0 | color_options.indexOf(s.color), + min: 0, max: color_options.length - 1, + format: v => color_options[v], + onchange: v => { + s.color = color_options[v]; + s.fg = fg_code[v]; + s.gy = gy_code[v]; + save(); + }, }, - }, - 'Idle Warning': { - value: !!s.idle_check, - onchange: v => { - s.idle_check = v; - save(); + 'Idle Warning': { + value: !!s.idle_check, + onchange: v => { + s.idle_check = v; + save(); + }, }, - }, - 'Expected Battery Life In Days Not Percentage': { - value: !!s.batt_hours, - onchange: v => { - s.batt_hours = v; - save(); + 'Expected Battery Life In Days Not Percentage': { + value: !!s.batt_hours, + onchange: v => { + s.batt_hours = v; + save(); + }, }, - }, - '12 Hr Time': { - value: !!s.hr_12, - onchange: v => { - s.hr_12 = v; - save(); - }, - }, - 'Ring Display': { - value: 0 | ring_options.indexOf(s.ring), - min: 0, max: ring_options.length - 1, - format: v => ring_options[v], - onchange: v => { - s.ring = ring_options[v]; - save(); - }, - } - }; - if (s.ring == 'Steps') { - appMenu[/*LANG*/"Step Target"] = { - value: 0 | step_options.indexOf(s.step_target), - min: 0, max: step_options.length - 1, - format: v => step_options[v], - onchange: v => { - s.step_target = step_options[v]; - save(); + '12 Hr Time': { + value: !!s.hr_12, + onchange: v => { + s.hr_12 = v; + save(); + }, }, + 'Ring Display': { + value: 0 | ring_options.indexOf(s.ring), + min: 0, max: ring_options.length - 1, + format: v => ring_options[v], + onchange: v => { + let prev = s.ring; + s.ring = ring_options[v]; + save(); + if (prev != s.ring && (prev === 'Steps' || s.ring === 'Steps')) { + E.showMenu(buildMainMenu()); + } + }, + } }; + if (s.ring == 'Steps') { + appMenu[/*LANG*/"Step Target"] = { + value: 0 | step_options.indexOf(s.step_target), + min: 0, max: step_options.length - 1, + format: v => step_options[v], + onchange: v => { + s.step_target = step_options[v]; + save(); + }, + }; + } + return appMenu; } - E.showMenu(appMenu); -}) + + E.showMenu(buildMainMenu()); +}) \ No newline at end of file From e4519a8286af1b667366b569ea22c78656454832 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Thu, 6 Mar 2025 08:22:26 -0500 Subject: [PATCH 28/37] Seconds setting will update every 3 seconds Since we have the wheel in incrmeents of 5/100, rather than 5/60, it'll be more precise to show jumps of 3 seconds, not 5. --- apps/daisy/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/daisy/app.js b/apps/daisy/app.js index e1f3a07d4..45213426d 100644 --- a/apps/daisy/app.js +++ b/apps/daisy/app.js @@ -682,7 +682,7 @@ var drawTimeout; // schedule a draw for the next minute or every 5 seconds function queueDraw() { - let delay = (settings.ring == 'Seconds') ? (5000 - (Date.now() % 5000)) : (60000 - (Date.now() % 60000)); + let delay = (settings.ring == 'Seconds') ? (3000 - (Date.now() % 3000)) : (60000 - (Date.now() % 60000)); if (drawTimeout) clearTimeout(drawTimeout); drawTimeout = setTimeout(function() { drawTimeout = undefined; From dc50311e89b415db26c59d21a3584309f8da581c Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Thu, 6 Mar 2025 08:29:18 -0500 Subject: [PATCH 29/37] committing the cutelauncher blunder --- apps/cutelauncher/Changelog | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/cutelauncher/Changelog b/apps/cutelauncher/Changelog index 29232f766..8a5d25486 100644 --- a/apps/cutelauncher/Changelog +++ b/apps/cutelauncher/Changelog @@ -2,3 +2,5 @@ 0.28: Adjusted icon size to better fit with native dimensions (48x48) 0.29: Draw function optimization 0.30: Refine initial scrollbar position +0.31: Coloring for scrollbar +0.32: Coloring for scrollbar From 40bc35cb4fe4c5a507860863d644e84ce7376066 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Thu, 6 Mar 2025 12:24:49 -0500 Subject: [PATCH 30/37] Fixed "Step Target" display update --- apps/daisy/app.js | 2 +- apps/daisy/settings.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/daisy/app.js b/apps/daisy/app.js index 45213426d..5c5219153 100644 --- a/apps/daisy/app.js +++ b/apps/daisy/app.js @@ -1,5 +1,5 @@ var SunCalc = require("suncalc"); // from modules folder -const storage = require('Storage') +const storage = require('Storage'); const widget_utils = require('widget_utils'); const SETTINGS_FILE = "daisy.json"; const LOCATION_FILE = "mylocation.json"; diff --git a/apps/daisy/settings.js b/apps/daisy/settings.js index 8af9a5efb..226c4031b 100644 --- a/apps/daisy/settings.js +++ b/apps/daisy/settings.js @@ -77,7 +77,7 @@ s.ring = ring_options[v]; save(); if (prev != s.ring && (prev === 'Steps' || s.ring === 'Steps')) { - E.showMenu(buildMainMenu()); + setTimeout(() => E.showMenu(buildMainMenu()), 0); // Reference https://github.com/orgs/espruino/discussions/7697 } }, } From 62709a55d395b1c9dccfe09c3d6f0d8cb7edee4f Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Thu, 6 Mar 2025 12:28:24 -0500 Subject: [PATCH 31/37] Changed formatting of showMainMenu to limit a little duplicati0on per gfwilliams' suggestion --- apps/daisy/settings.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/daisy/settings.js b/apps/daisy/settings.js index 226c4031b..55f079acc 100644 --- a/apps/daisy/settings.js +++ b/apps/daisy/settings.js @@ -32,7 +32,7 @@ var ring_options = ['Hours', 'Minutes', 'Seconds', 'Steps', 'Battery', 'Sun']; var step_options = [100, 1000, 5000, 10000, 15000, 20000]; - function buildMainMenu() { + function showMainMenu() { let appMenu = { '': { 'title': 'Daisy Clock' }, '< Back': back, @@ -77,7 +77,7 @@ s.ring = ring_options[v]; save(); if (prev != s.ring && (prev === 'Steps' || s.ring === 'Steps')) { - setTimeout(() => E.showMenu(buildMainMenu()), 0); // Reference https://github.com/orgs/espruino/discussions/7697 + setTimeout(showMainMenu, 0); // Reference https://github.com/orgs/espruino/discussions/7697 } }, } @@ -93,8 +93,8 @@ }, }; } - return appMenu; + E.showMenu(appMenu); } - E.showMenu(buildMainMenu()); + showMainMenu(); }) \ No newline at end of file From ebf2362682237466a522f7478381bda10ec0e07e Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Thu, 6 Mar 2025 12:41:02 -0500 Subject: [PATCH 32/37] Updated readme and changelog --- apps/daisy/ChangeLog | 2 +- apps/daisy/README.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/daisy/ChangeLog b/apps/daisy/ChangeLog index 80b85d26d..11138f412 100644 --- a/apps/daisy/ChangeLog +++ b/apps/daisy/ChangeLog @@ -12,4 +12,4 @@ 0.12: Added setting to change Battery estimate to hours 0.13: Fixed Battery estimate Default to percentage and improved setting string 0.14: Use `power_usage` module -0.15: Ring can now show hours, minute, or seconds hand, day/night left, or battery; Allowed for 12hr time; Ring now goes up in 5% increments +0.15: Ring can now show hours, minute, or seconds hand, day/night left, or battery; Allowed for 12hr time; Ring now goes up in 5% increments; Step goal can be changed; The info that is set on the watchface will retain when leaving the face diff --git a/apps/daisy/README.md b/apps/daisy/README.md index 2e72345e4..5cc3060dc 100644 --- a/apps/daisy/README.md +++ b/apps/daisy/README.md @@ -18,14 +18,14 @@ See [#1248](https://github.com/espruino/BangleApps/issues/1248) * Uses mylocation.json from MyLocation app to calculate sunrise and sunset times for your location * If your Sunrise, Sunset times look odd make sure you have setup your location using [MyLocation](https://banglejs.com/apps/?id=mylocation) -* The screen is updated every minute to save battery power, unless the ring is set to display seconds, then it updates every 5 seconds. +* The screen is updated every minute to save battery power, unless the ring is set to display seconds, then it updates every 3 seconds. * Uses the [BloggerSansLight](https://www.1001fonts.com/rounded-fonts.html?page=3) font, which if free for commercial use * You need to run >2V22 to show the battery estimate in hours * In the settings, the ring can be set to: * Hours - Displays the ring as though it's the hour hand on an analog clock. * Minutes - Displays the ring as though it's the minute hand on an analog clock. * Seconds - Displays the ring as though it's the seconds hand on an analog clock. - * Steps - Displays the ring as the amount of steps taken that day out of 10,000. + * Steps - Displays the ring as the amount of steps taken that day out of Step Target setting. * Battery - Displays the ring as the amount of battery percentage left. * Sun - Displays the ring as the amount of time that has passed from sunrise to sunset in the day and the amount of time between sunset and sunrise at night. From 13092d5c748b43d2132278dcf76453e2cb5dbcf1 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Thu, 6 Mar 2025 12:47:39 -0500 Subject: [PATCH 33/37] Ring gets inverted when it's nighttime --- apps/daisy/app.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/apps/daisy/app.js b/apps/daisy/app.js index 5c5219153..fa3755443 100644 --- a/apps/daisy/app.js +++ b/apps/daisy/app.js @@ -115,6 +115,7 @@ var drawCount = 0; var sunStart; // In terms of ms var sunEnd; // In terms of minutes var sunFull; // In terms of ms +var isDaytime = true; function getMinutesFromDate(date) { return (60 * date.getHours()) + date.getMinutes(); @@ -134,6 +135,7 @@ function updateSunRiseSunSet(now, lat, lon, sunLeftCalcs){ if (sunLeft < 0) { // If it's already night dateCopy.setDate(dateCopy.getDate() + 1); let timesTmrw = SunCalc.getTimes(dateCopy, lat, lon); + isDaytime = false; sunStart = times.sunset; sunFull = timesTmrw.sunrise - sunStart; sunEnd = getMinutesFromDate(timesTmrw.sunrise); @@ -143,11 +145,13 @@ function updateSunRiseSunSet(now, lat, lon, sunLeftCalcs){ if (sunLeft < 0) { // If it's not morning yet. dateCopy.setDate(dateCopy.getDate() - 1); let timesYest = SunCalc.getTimes(dateCopy, lat, lon); + isDaytime = false; sunStart = timesYest.sunset; sunFull = times.sunrise - sunStart; sunEnd = getMinutesFromDate(times.sunrise); } else { // We're in the middle of the day + isDaytime = true; sunStart = times.sunrise; sunFull = times.sunset - sunStart; sunEnd = getMinutesFromDate(times.sunset); @@ -260,6 +264,7 @@ function drawClock() { var hh = date.getHours(); var mm = date.getMinutes(); var ring_percent; + var invertRing = false; switch (settings.ring) { case 'Hours': ring_percent = Math.round((10*(((hh % 12) * 60) + mm))/72); @@ -284,6 +289,7 @@ function drawClock() { } // If we're exactly on the minute that the sun is setting/rising if (getMinutesFromDate(date) == sunEnd) ring_percent = 100; + invertRing = !isDaytime; break; } @@ -297,7 +303,7 @@ function drawClock() { g.reset(); g.setColor(g.theme.bg); g.fillRect(0, 0, w, h); - g.drawImage(getGaugeImage(ring_percent, settings.ring, false), 0, 0); + g.drawImage(getGaugeImage(ring_percent, settings.ring, invertRing), 0, 0); setLargeFont(); g.setColor(settings.fg); From f431258eafca3167610b295b625fda24fa87ea38 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Fri, 7 Mar 2025 05:28:15 -0500 Subject: [PATCH 34/37] Updates from code review --- apps/daisy/app.js | 5 +++-- apps/daisy/settings.js | 4 +++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/apps/daisy/app.js b/apps/daisy/app.js index fa3755443..21bf4d06c 100644 --- a/apps/daisy/app.js +++ b/apps/daisy/app.js @@ -19,6 +19,7 @@ let pal2; // palette for 50-100% const infoLine = (3*h/4) - 6; const infoWidth = 56; const infoHeight = 11; +const sec_update = 3000; // This ms between updates when the ring is in Seconds mode var drawingSteps = false; function log_debug(o) { @@ -686,9 +687,9 @@ function buzzer(n) { // timeout used to update every minute var drawTimeout; -// schedule a draw for the next minute or every 5 seconds +// schedule a draw for the next minute or every sec_update ms function queueDraw() { - let delay = (settings.ring == 'Seconds') ? (3000 - (Date.now() % 3000)) : (60000 - (Date.now() % 60000)); + let delay = settings.ring == 'Seconds' ? sec_update - (Date.now() % sec_update) : 60000 - (Date.now() % 60000); if (drawTimeout) clearTimeout(drawTimeout); drawTimeout = setTimeout(function() { drawTimeout = undefined; diff --git a/apps/daisy/settings.js b/apps/daisy/settings.js index 55f079acc..74b667e2a 100644 --- a/apps/daisy/settings.js +++ b/apps/daisy/settings.js @@ -77,7 +77,9 @@ s.ring = ring_options[v]; save(); if (prev != s.ring && (prev === 'Steps' || s.ring === 'Steps')) { - setTimeout(showMainMenu, 0); // Reference https://github.com/orgs/espruino/discussions/7697 + // redisplay the menu with/without ring setting + // Reference https://github.com/orgs/espruino/discussions/7697 + setTimeout(showMainMenu, 0); } }, } From d3326676296648e844b0a258bdf1e0452ee8e02d Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Fri, 7 Mar 2025 05:45:32 -0500 Subject: [PATCH 35/37] Removed ALL Cutelauncher changelogs --- apps/cutelauncher/ChangeLog | 6 ------ apps/cutelauncher/Changelog | 4 ---- 2 files changed, 10 deletions(-) delete mode 100644 apps/cutelauncher/ChangeLog delete mode 100644 apps/cutelauncher/Changelog diff --git a/apps/cutelauncher/ChangeLog b/apps/cutelauncher/ChangeLog deleted file mode 100644 index 8a5d25486..000000000 --- a/apps/cutelauncher/ChangeLog +++ /dev/null @@ -1,6 +0,0 @@ -0.27: New app introduced to the app loader! -0.28: Adjusted icon size to better fit with native dimensions (48x48) -0.29: Draw function optimization -0.30: Refine initial scrollbar position -0.31: Coloring for scrollbar -0.32: Coloring for scrollbar diff --git a/apps/cutelauncher/Changelog b/apps/cutelauncher/Changelog deleted file mode 100644 index 29232f766..000000000 --- a/apps/cutelauncher/Changelog +++ /dev/null @@ -1,4 +0,0 @@ -0.27: New app introduced to the app loader! -0.28: Adjusted icon size to better fit with native dimensions (48x48) -0.29: Draw function optimization -0.30: Refine initial scrollbar position From 1f3656271dd0496607ccbe59f1695f611c8afc3b Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Fri, 7 Mar 2025 05:48:35 -0500 Subject: [PATCH 36/37] Committing the cutelauncher items from master This commit and the last were due to the Changelog commit yoyoing back whenever I'd delete, reset, or stash it. --- apps/cutelauncher/ChangeLog | 1 + apps/cutelauncher/metadata.json | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 apps/cutelauncher/ChangeLog diff --git a/apps/cutelauncher/ChangeLog b/apps/cutelauncher/ChangeLog new file mode 100644 index 000000000..6eedfa435 --- /dev/null +++ b/apps/cutelauncher/ChangeLog @@ -0,0 +1 @@ +0.01: New app introduced to the app loader! diff --git a/apps/cutelauncher/metadata.json b/apps/cutelauncher/metadata.json index bd565fe51..d35815854 100644 --- a/apps/cutelauncher/metadata.json +++ b/apps/cutelauncher/metadata.json @@ -2,7 +2,7 @@ "id": "cutelauncher", "name": "Cute Launcher", "shortName": "Cute Launcher", - "version": "0.32", + "version": "0.01", "description": "A simple launcher app for Bangle.js 2 that makes use of the full touchscreen", "icon": "app.png", "type": "launch", @@ -35,4 +35,4 @@ "name": "cutelauncher.settings.json" } ] -} \ No newline at end of file +} From 0475c3a06414db925ba4ea9051aa5c4650449ba2 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Fri, 7 Mar 2025 05:58:41 -0500 Subject: [PATCH 37/37] Small mistake in comment fix --- apps/daisy/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/daisy/app.js b/apps/daisy/app.js index 21bf4d06c..84d08e094 100644 --- a/apps/daisy/app.js +++ b/apps/daisy/app.js @@ -48,7 +48,7 @@ function assignPalettes() { // palette for 50-100% pal2 = new Uint16Array([g.theme.bg, g.toColor(settings.fg), g.toColor(settings.gy), g.toColor("#00f")]); } else { - // palette for 0-45% + // palette for 0-49% pal1 = new Uint16Array([g.theme.bg, g.theme.fg, g.toColor(settings.fg), g.toColor("#00f")]); // palette for 50-100% pal2 = new Uint16Array([g.theme.bg, g.toColor(settings.fg), g.theme.fg, g.toColor("#00f")]);