From 6f387e9ecd19233501be240e9ce8b20f807833a0 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Fri, 7 Mar 2025 06:15:19 -0500 Subject: [PATCH 01/23] Added 24hr day to Daisy face --- apps/daisy/app.js | 3 +++ apps/daisy/settings.js | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/apps/daisy/app.js b/apps/daisy/app.js index 84d08e094..bd2989c4c 100644 --- a/apps/daisy/app.js +++ b/apps/daisy/app.js @@ -276,6 +276,9 @@ function drawClock() { case 'Seconds': ring_percent = Math.round((10*date.getSeconds())/6); break; + case 'Day': + ring_percent = Math.round((10*(((hh % 12) * 60) + mm))/144); + break; case 'Steps': ring_percent = Math.round(100*(getSteps()/settings.step_target)); break; diff --git a/apps/daisy/settings.js b/apps/daisy/settings.js index 74b667e2a..e099475f6 100644 --- a/apps/daisy/settings.js +++ b/apps/daisy/settings.js @@ -29,7 +29,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', 'Sun']; + var ring_options = ['Hours', 'Minutes', 'Seconds', 'Day', 'Sun', 'Steps', 'Battery']; var step_options = [100, 1000, 5000, 10000, 15000, 20000]; function showMainMenu() { From db27f32882ae2d8b70daa716916eb62b32625843 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Sun, 9 Mar 2025 12:11:32 -0400 Subject: [PATCH 02/23] Added hourly buzz on Daisy Face --- apps/daisy/app.js | 18 ++++++++++++++++-- apps/daisy/settings.js | 8 ++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/apps/daisy/app.js b/apps/daisy/app.js index bd2989c4c..613190404 100644 --- a/apps/daisy/app.js +++ b/apps/daisy/app.js @@ -11,6 +11,7 @@ let location; // variable for controlling idle alert let lastStep = getTime(); let warned = 0; +let hourly_buzz_occurred = false; let idle = false; let IDLE_MINUTES = 26; @@ -87,6 +88,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.hourly_buzz = (settings.hourly_buzz === undefined ? false : settings.hourly_buzz); settings.ring = settings.ring||'Steps'; settings.idxInfo = settings.idxInfo||0; settings.step_target = settings.step_target||10000; @@ -264,6 +266,7 @@ function drawClock() { var date = new Date(); var hh = date.getHours(); var mm = date.getMinutes(); + let min = mm; var ring_percent; var invertRing = false; switch (settings.ring) { @@ -321,9 +324,20 @@ function drawClock() { drawInfo(); // recalc sunrise / sunset every hour - if (drawCount % 60 == 0) - updateSunRiseSunSet(date, location.lat, location.lon, settings.ring == 'Sun'); + if (drawCount % 60 == 0) { + let recalcSunLeft = (settings.ring == 'Sun' || settings.hourly_buzz); + updateSunRiseSunSet(date, location.lat, location.lon, recalcSunLeft); + } drawCount++; + + if (settings.hourly_buzz) { + if (min != 0) + hourly_buzz_occurred = false; + else if (!hourly_buzz_occurred && isDaytime) { + Bangle.buzz(150); + hourly_buzz_occurred = true; + } + } } function drawSteps() { diff --git a/apps/daisy/settings.js b/apps/daisy/settings.js index e099475f6..f59735032 100644 --- a/apps/daisy/settings.js +++ b/apps/daisy/settings.js @@ -8,6 +8,7 @@ 'check_idle' : true, 'batt_hours' : false, 'hr_12' : false, + 'hourly_buzz' : false, 'ring' : 'Steps', 'idxInfo' : 0, 'step_target' : 10000}; @@ -68,6 +69,13 @@ save(); }, }, + 'Hourly Buzz': { + value: !!s.hourly_buzz, + onchange: v => { + s.hourly_buzz = v; + save(); + }, + }, 'Ring Display': { value: 0 | ring_options.indexOf(s.ring), min: 0, max: ring_options.length - 1, From 84dc9f7f5ad15e89b6cadf572b772d15a44adf7e Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Sat, 3 May 2025 15:04:41 -0400 Subject: [PATCH 03/23] Moved settings around --- apps/daisy/settings.js | 78 +++++++++++++++++++++--------------------- 1 file changed, 39 insertions(+), 39 deletions(-) diff --git a/apps/daisy/settings.js b/apps/daisy/settings.js index f59735032..95de5abd1 100644 --- a/apps/daisy/settings.js +++ b/apps/daisy/settings.js @@ -37,45 +37,6 @@ 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(); - }, - }, - '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(); - }, - }, - 'Hourly Buzz': { - value: !!s.hourly_buzz, - onchange: v => { - s.hourly_buzz = v; - save(); - }, - }, 'Ring Display': { value: 0 | ring_options.indexOf(s.ring), min: 0, max: ring_options.length - 1, @@ -103,6 +64,45 @@ }, }; } + appMenu['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(); + }, + }; + appMenu['Idle Warning'] = { + value: !!s.idle_check, + onchange: v => { + s.idle_check = v; + save(); + }, + }; + appMenu['Expected Battery Life In Days Not Percentage'] = { + value: !!s.batt_hours, + onchange: v => { + s.batt_hours = v; + save(); + }, + }; + appMenu['12 Hr Time'] = { + value: !!s.hr_12, + onchange: v => { + s.hr_12 = v; + save(); + }, + }; + appMenu['Hourly Buzz'] = { + value: !!s.hourly_buzz, + onchange: v => { + s.hourly_buzz = v; + save(); + }, + }; E.showMenu(appMenu); } From 5dd59e55f53e1437ad4da9551fb5f82823cf1caf Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Tue, 8 Apr 2025 20:00:42 -0400 Subject: [PATCH 04/23] 24hr settings in Daisy use the Locale global setting --- apps/daisy/app.js | 3 ++- apps/daisy/settings.js | 21 +++++++-------------- 2 files changed, 9 insertions(+), 15 deletions(-) diff --git a/apps/daisy/app.js b/apps/daisy/app.js index 613190404..fcb93edb9 100644 --- a/apps/daisy/app.js +++ b/apps/daisy/app.js @@ -2,6 +2,7 @@ var SunCalc = require("suncalc"); // from modules folder const storage = require('Storage'); const widget_utils = require('widget_utils'); const SETTINGS_FILE = "daisy.json"; +const global_settings = storage.readJSON("setting.json", true) || {}; const LOCATION_FILE = "mylocation.json"; const h = g.getHeight(); const w = g.getWidth(); @@ -87,7 +88,7 @@ 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.hr_12 = (global_settings["12hour"] === undefined ? false : global_settings["12hour"]); settings.hourly_buzz = (settings.hourly_buzz === undefined ? false : settings.hourly_buzz); settings.ring = settings.ring||'Steps'; settings.idxInfo = settings.idxInfo||0; diff --git a/apps/daisy/settings.js b/apps/daisy/settings.js index 95de5abd1..41ec54160 100644 --- a/apps/daisy/settings.js +++ b/apps/daisy/settings.js @@ -82,20 +82,6 @@ save(); }, }; - appMenu['Expected Battery Life In Days Not Percentage'] = { - value: !!s.batt_hours, - onchange: v => { - s.batt_hours = v; - save(); - }, - }; - appMenu['12 Hr Time'] = { - value: !!s.hr_12, - onchange: v => { - s.hr_12 = v; - save(); - }, - }; appMenu['Hourly Buzz'] = { value: !!s.hourly_buzz, onchange: v => { @@ -103,6 +89,13 @@ save(); }, }; + appMenu['Expected Battery Life In Days Not Percentage'] = { + value: !!s.batt_hours, + onchange: v => { + s.batt_hours = v; + save(); + }, + }; E.showMenu(appMenu); } From 3e8ceaacd4b43c6045abe2f7984c8ac04e90a336 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Wed, 9 Apr 2025 07:51:22 -0400 Subject: [PATCH 05/23] Daisy settings reorder --- apps/daisy/settings.js | 70 +++++++++++++++++++++--------------------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/apps/daisy/settings.js b/apps/daisy/settings.js index 41ec54160..cbf318162 100644 --- a/apps/daisy/settings.js +++ b/apps/daisy/settings.js @@ -3,35 +3,34 @@ // initialize with default settings... let s = {'gy' : '#020', - 'fg' : '#0f0', - 'color': 'Green', - 'check_idle' : true, - 'batt_hours' : false, - 'hr_12' : false, - 'hourly_buzz' : false, - 'ring' : 'Steps', - 'idxInfo' : 0, - 'step_target' : 10000}; + 'fg' : '#0f0', + 'color': 'Green', + 'check_idle' : true, + 'batt_hours' : false, + 'hourly_buzz' : false, + 'ring' : 'Steps', + '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'); - let settings = storage.readJSON(SETTINGS_FILE, 1) || s; - const saved = settings || {}; - for (const key in saved) { - s[key] = saved[key]; - } +// ...and overwrite them with any saved values +// This way saved values are preserved if a new version adds more settings +const storage = require('Storage'); +let settings = storage.readJSON(SETTINGS_FILE, 1) || s; +const saved = settings || {}; +for (const key in saved) { +s[key] = saved[key]; +} - function save() { - settings = s; - storage.write(SETTINGS_FILE, settings); - } +function save() { +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', 'Day', 'Sun', 'Steps', 'Battery']; - var step_options = [100, 1000, 5000, 10000, 15000, 20000]; +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', 'Day', 'Sun', 'Steps', 'Battery']; +var step_options = [100, 1000, 5000, 10000, 15000, 20000]; function showMainMenu() { let appMenu = { @@ -64,7 +63,7 @@ }, }; } - appMenu['Colour'] = { + appMenu['Color'] = { value: 0 | color_options.indexOf(s.color), min: 0, max: color_options.length - 1, format: v => color_options[v], @@ -75,13 +74,6 @@ save(); }, }; - appMenu['Idle Warning'] = { - value: !!s.idle_check, - onchange: v => { - s.idle_check = v; - save(); - }, - }; appMenu['Hourly Buzz'] = { value: !!s.hourly_buzz, onchange: v => { @@ -89,8 +81,16 @@ save(); }, }; - appMenu['Expected Battery Life In Days Not Percentage'] = { + appMenu['Idle Warning'] = { + value: !!s.idle_check, + onchange: v => { + s.idle_check = v; + save(); + }, + }; + appMenu['Battery Life Format'] = { value: !!s.batt_hours, + format: value => value?"Days":"%", onchange: v => { s.batt_hours = v; save(); From cfb3eb067c4e69ff6b98039be7a9deb4eea74d81 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Sun, 20 Apr 2025 10:58:29 -0400 Subject: [PATCH 06/23] Moved the color location in Daisy settings and the sortorder --- apps/daisy/settings.js | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/apps/daisy/settings.js b/apps/daisy/settings.js index cbf318162..71a7b4c1f 100644 --- a/apps/daisy/settings.js +++ b/apps/daisy/settings.js @@ -36,6 +36,17 @@ var step_options = [100, 1000, 5000, 10000, 15000, 20000]; let appMenu = { '': { 'title': 'Daisy Clock' }, '< Back': back, + 'Color': { + 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(); + } + }, 'Ring Display': { value: 0 | ring_options.indexOf(s.ring), min: 0, max: ring_options.length - 1, @@ -63,17 +74,6 @@ var step_options = [100, 1000, 5000, 10000, 15000, 20000]; }, }; } - appMenu['Color'] = { - 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(); - }, - }; appMenu['Hourly Buzz'] = { value: !!s.hourly_buzz, onchange: v => { From b6382fc4b29c0b3a5f720d517f4a30887fb2e0bb Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Sat, 19 Apr 2025 06:27:22 -0400 Subject: [PATCH 07/23] Added full ring from sunrise start to end and sunset to dusk --- apps/daisy/app.js | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/apps/daisy/app.js b/apps/daisy/app.js index fcb93edb9..5b3953219 100644 --- a/apps/daisy/app.js +++ b/apps/daisy/app.js @@ -116,6 +116,7 @@ function extractTime(d){ var sunRise = "00:00"; var sunSet = "00:00"; var drawCount = 0; +var night; // In terms of minutes var sunStart; // In terms of ms var sunEnd; // In terms of minutes var sunFull; // In terms of ms @@ -135,14 +136,15 @@ function updateSunRiseSunSet(now, lat, lon, sunLeftCalcs){ sunSet = extractTime(times.sunset); if (!sunLeftCalcs) return; - let sunLeft = times.sunset - dateCopy; + let sunLeft = times.dusk - dateCopy; 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; + sunStart = times.dusk; sunFull = timesTmrw.sunrise - sunStart; sunEnd = getMinutesFromDate(timesTmrw.sunrise); + night = getMinutesFromDate(timesTmrw.sunriseEnd); } else { sunLeft = dateCopy - times.sunrise; @@ -150,15 +152,17 @@ function updateSunRiseSunSet(now, lat, lon, sunLeftCalcs){ dateCopy.setDate(dateCopy.getDate() - 1); let timesYest = SunCalc.getTimes(dateCopy, lat, lon); isDaytime = false; - sunStart = timesYest.sunset; + sunStart = timesYest.dusk; sunFull = times.sunrise - sunStart; sunEnd = getMinutesFromDate(times.sunrise); + night = getMinutesFromDate(times.sunriseEnd); } else { // We're in the middle of the day isDaytime = true; - sunStart = times.sunrise; + sunStart = times.sunriseEnd; sunFull = times.sunset - sunStart; sunEnd = getMinutesFromDate(times.sunset); + night = getMinutesFromDate(times.dusk); } } } @@ -290,13 +294,15 @@ function drawClock() { ring_percent = E.getBattery(); 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); + var dayMin = getMinutesFromDate(date); + if (dayMin >= sunEnd && dayMin <= night) ring_percent = 100; + else { 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 4c5c32d42e26c52a17b26780e59c67771578bf50 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Sat, 3 May 2025 12:22:07 -0400 Subject: [PATCH 08/23] Daisy no longer uses images --- apps/daisy/app.js | 254 ++++++++++++---------------------------------- 1 file changed, 63 insertions(+), 191 deletions(-) diff --git a/apps/daisy/app.js b/apps/daisy/app.js index 5b3953219..7ec8382b2 100644 --- a/apps/daisy/app.js +++ b/apps/daisy/app.js @@ -6,8 +6,8 @@ const global_settings = storage.readJSON("setting.json", true) || {}; const LOCATION_FILE = "mylocation.json"; const h = g.getHeight(); const w = g.getWidth(); -let settings; -let location; +const rad = h/2; +const hyp = Math.sqrt(Math.pow(rad, 2) + Math.pow(rad, 2)); // variable for controlling idle alert let lastStep = getTime(); @@ -301,7 +301,7 @@ function drawClock() { 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; - } + } } invertRing = !isDaytime; break; @@ -317,7 +317,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); + drawGaugeImage(ring_percent, settings.ring, invertRing); setLargeFont(); g.setColor(settings.fg); @@ -383,196 +383,68 @@ Bangle.on('HRM', function(hrm) { ///////////////// GAUGE images ///////////////////////////////////// +function addPoint(loc) { + angle = ((2*Math.PI)/100) * loc; + x = hyp * Math.sin(angle); + y = hyp * Math.cos(angle + Math.PI); + x += rad; + y += rad; + return [Math.round(x),Math.round(y)]; +} -// putting into 1 function like this, rather than individual variables -// reduces ram usage from 70%-13% -function getGaugeImage(p, type, reverse) { +function polyArray(start, end) { + if (start == end) return []; // No array to draw if the points are the same. + if (start > end) end = 100 - end; + var array = [g.getHeight()/2, g.getHeight()/2]; + var pt = addPoint(start); + array.push(pt[0], pt[1]); + + for (let i = start+1; i < end; i++) { + if (((i - start)) % 13 < 1) { // Add a point every 8th of the circle + pt = addPoint(i); + array.push(pt[0], pt[1]); + } + } + pt = addPoint(end); + array.push(pt[0], pt[1]); + log_debug("Poly Arr: " + array) + return array; +} + +buf = Graphics.createArrayBuffer(w, h, 2, { msb: true }); +function drawRing(start, end) { + const edge = 4; + const thickness = 6; + let img = { width: w, height: h, transparent: 0, + bpp: 2, palette: pal1, buffer: buf.buffer }; + buf.clear(); + buf.setColor(1).fillEllipse(edge,edge,w-edge,h-edge); + buf.setColor(0).fillEllipse(edge+thickness,edge+thickness,w-edge-thickness,h-edge-thickness); + img.palette = pal2; + g.drawImage(img, 0, 0); // Draws an unfilled circle + buf.clear(); + + buf.setColor(1).fillEllipse(edge,edge,w-edge,h-edge); + buf.setColor(0).fillEllipse(edge+thickness,edge+thickness,w-edge-thickness,h-edge-thickness); + buf.setColor(0).fillPoly(polyArray(start, end)); + img.palette = pal1; + g.drawImage(img, 0, 0); // Draws the filled-in segment + return; +} + +function drawGaugeImage(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 : (reverse ? pal2 : pal1), - buffer : require("heatshrink").decompress(atob("AH4A/AH4ACgtVAAVUFUgpDAAdAFMEBFQ4ABqBVnLMQqLLLzWEABLgbVgohEGopYaiofDBihWVHJpYYDgYPbKx1ACJhYZIwT4OcAZWYHyRYUIgQXQH4RqOThCXUYRpCHNyQVVQQTwVQiSZWIQSEQNgSYSIYiEQQSyEUCQLDSOAyCnQiSCYQiSCYQiSCZDaDARObKuBSZwcaVzR0QFYKuZWAYNZWCJJKMoKuaWAahKBhiwTJRSudURorBFTgfMVzqjDO5DaeZ5jaeJhhiKbi4rIbT4hLqoriPI7afUpS5BbTwiKFdZgIADSmHFYIqgbgIrGcgIriEYwzHADZ7HRY4rdaYrjHADcBFYoGBFcgkEGQwAeFYqKHFbzUEcQ4AdiorwiorlEogxFAD59FWoorhoArDqArjgIr/FbYwFAEJSDFf4rXgornqgrDFUkAior/Ff4rGAYYAjKYYr/Ff4r/FbdVFdFAFYNQFcsBFf4r/Ff4r/Ff4r/Ff4r/Ff4r/Ff4r/FbdUFcsFFYUVFdADBFf4r/Ff4rbAYYAjKYYr/Ff4rFoArkqorCgIrnqAr/FbIEFAEBSFFf4rYqgrjgorEiormAocVAogAfEooxFFcB9EFdq1DAD9VFYkBFctQFYoGEADokHFcp8FRQoAdag7iFFb4HFioHGADYjHGY4rcPYyLHADbTHcYNQFT4iIFdZgIADKmJqrcgiorIBIIrhMKIAXUpIrBbjzaBFZAKKbS5MJFcKkJbj4fLBYLcdqorKbjzPMbjxKNMhauTURawdJJorBWDShBFZiRBWDQcOHRyuPOhorBWDIbPWDRzQSYKEYIwLLOHgSEXDIJyPQjD2SQjCCQQjSCRCYY/QN4xDRQiyCSQgjdSCqqECLCRWBYyiECISBWCYqgXCLCBWCQSYYEIhxqCeChYFThoQCKypYEIxgPPLB4cKFQZWXDoosIBhhYWcArWDKzYhHABA1EADArNoArcFhgqeWQysgLJxVfcBLWdAH4A5A")) - }; + var start = 0; + var end = p; + if (endsDontShowList.includes(type)) + end = Math.floor(end / 5) * 5; + if (reverse) { + start = 100 - end; + end = 100; - // p2 - if (p < 5) return { - width : 176, height : 176, bpp : 2, - transparent : -1, - 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")) - }; - - // p5 - if (p < 10) return { - width : 176, height : 176, bpp : 2, - transparent : -1, - 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=")) - }; - - // p10 - if (p < 15) return { - width : 176, height : 176, bpp : 2, - transparent : -1, - 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")) - }; - - // p15 - if (p < 20) return { - width : 176, height : 176, bpp : 2, - transparent : -1, - 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==")) - }; - - // p20 - if (p < 25) return { - width : 176, height : 176, bpp : 2, - transparent : -1, - palette : (reverse ? pal2 : 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 : (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=")) - }; - - // p30 - if (p < 35) return { - width : 176, height : 176, bpp : 2, - transparent : -1, - 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")) - }; - - // p35 - if (p < 40) return { - width : 176, height : 176, bpp : 2, - transparent : -1, - 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")) - }; - - // p40 - if (p < 45) return { - width : 176, height : 176, bpp : 2, - transparent : -1, - 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")) - }; - - // p45 - if (p < 50) return { - width : 176, height : 176, bpp : 2, - transparent : -1, - 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=")) - }; - - // p50 - if (p < 55) return { - width : 176, height : 176, bpp : 2, - transparent : -1, - 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")) - }; - - // p55 - if (p < 60) return { - width : 176, height : 176, bpp : 2, - transparent : -1, - 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==")) - }; - - // p60 - if (p < 65) return { - width : 176, height : 176, bpp : 2, - transparent : -1, - 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")) - }; - - // p65 - if (p < 70) return { - width : 176, height : 176, bpp : 2, - transparent : -1, - 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=")) - }; - - // p70 - if (p < 75) return { - width : 176, height : 176, bpp : 2, - transparent : -1, - 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=")) - }; - - // p75 - if (p < 80) return { - width : 176, height : 176, bpp : 2, - transparent : -1, - palette : (reverse ? pal1 : pal2), - buffer : require("heatshrink").decompress(atob("AH4A/AH4AChWq1WpqtUFUgpBFYYABoApggQqDFYlVqBVjFYxZfFQorGLLrWCFZbgbVguoBQcFLD8qFQYMHiosDKzoOJFgZYYKwYPLFgZWawARMLDJWCawgAJcAZWYCZ6FCLCkKFQOgCZ8BFYNUFaZWSLAlAQShWQLAiESQQRtTLAKESFQOoFacFQiSCCwArTgCESQSyEUlTZTboyCnQiSCYQiSCYQiSCZQgdAVxwqYQgSwMVwOoFbMFWBquaWCArBVzKwDbRoqaWATcKbQKuaWAbcKbQKuaWAbcKVzqwNFYIqcWATaKVziwDbhDaebhjaebhgrBbTrcCFZDafbheqFcTcHbT7cDFY0CbT7cDqArxhWqwArfgFVqgrHFUDcBFY0qFcdVFY2oFcMFFY2qFclAFYugFcMBFYsCFctQFYuAFcMAFYsKFctUFYoqigEVFeEqFctVFYmoFccFFYmqFc1AFYegFccBFf4rbgWqwArjgFVqAr/FbMKFc9UFYYqkgEVFf4r/FY0q1ArlgtVFf4r/Ff4rd1QrooArB0ArlgIr/Ff4r/Ff4r/Ff4rOqtQFf4r/Ff4r/Ff4r/FZVUFcsFFYUVFdADBFf4r/Ff4rbAYYAjKYYr/Ff4rFoArkqorCgIrnqAr/FbIEFAEBSFFf4rYqgrjgorEiormAocVAogAfEooxFFcB9EFdq1DAD9VFYkBFctQFYoGEADokHFcp8FRQoAdag7iFFb4HFioHGADYjHGY4rcPYyLHADbTHcYNQFT4iIFdZgIADKmJqrcgiorIBIIrhMKIAXUpIrBbjzaBFZAKKbS5MJFcKkJbj4fLBYLcdqorKbjzPMbjxKNMhauTURawdJJorBWDShBFZiRBWDQcOHRyuPOhorBWDIbPWDRzQSYKEYIwLLOHgSEXDIJyPQjD2SQjCCQQjSCRCYY/QN4xDRQiyCSQgjdSCqqECLCRWBYyiECISBWCYqgXCLCBWCQSYYEIhxqCeChYFThoQCKypYEIxgPPLB4cKFQZWXDoosIBhhYWcArWDKzYhHABA1EADArNoArcFhgqeWQysgLJxVfcBLWdAH4A5")) - }; - - // p80 - if (p < 85) return { - width : 176, height : 176, bpp : 2, - transparent : -1, - 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=")) - }; - - // p85 - if (p < 90) return { - width : 176, height : 176, bpp : 2, - transparent : -1, - 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")) - }; - - // p90 - if (p < 95) return { - width : 176, height : 176, bpp : 2, - transparent : -1, - 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")) - }; - - // p95 - if (p < 98 || (p < 100 && endsDontShow)) return { - width : 176, height : 176, bpp : 2, - transparent : -1, - 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==")) - }; - - // p98 - if (p < 100) return { - width : 176, height : 176, bpp : 2, - transparent : -1, - 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")) - }; - - // p100 - return { - width : 176, height : 176, bpp : 2, - transparent : -1, - 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=")) - }; + } + drawRing(start, end); + log_debug("Start: "+ start + " end: " +end); } ///////////////// IDLE TIMER ///////////////////////////////////// From 9f0af38cb68f914deae064b11c2b4279f10f8831 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Sat, 3 May 2025 14:34:42 -0400 Subject: [PATCH 09/23] Made updating every second possible and only update the ring during the start of a minute --- apps/daisy/app.js | 153 +++++++++++++++++++++++++--------------------- 1 file changed, 83 insertions(+), 70 deletions(-) diff --git a/apps/daisy/app.js b/apps/daisy/app.js index 7ec8382b2..8bbc450a7 100644 --- a/apps/daisy/app.js +++ b/apps/daisy/app.js @@ -21,7 +21,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 +const sec_update = 1000; // This ms between updates when the ring is in Seconds mode var drawingSteps = false; function log_debug(o) { @@ -259,54 +259,78 @@ function drawHrm() { g.drawString(hrmCurrent, (w/2) + 10, infoLine); } -function draw() { - if (!idle) - drawClock(); +function draw(drawRingOnly) { + if (!idle) { + if (drawRingOnly) { + drawGaugeImage(new Date()); + } + else { + drawClock(); + } + } else drawIdle(); queueDraw(); } +function drawGaugeImage(date) { + var hh = date.getHours(); + var mm = date.getMinutes(); + var ring_fill; + var invertRing = false; + var ring_max = 100; + switch (settings.ring) { + case 'Hours': + ring_fill = ((hh % 12) * 60) + mm; + ring_max = 720; + break; + case 'Minutes': + ring_fill = mm; + ring_max = 60; + break; + case 'Seconds': + ring_fill = date.getSeconds(); + ring_max = 60; + break; + case 'Day': + ring_fill = (hh * 60) + mm; + ring_max = 1440; + break; + case 'Steps': + ring_fill = getSteps(); + ring_max = settings.step_target; + break; + case 'Battery': + ring_fill = E.getBattery(); + break; + case 'Sun': + var dayMin = getMinutesFromDate(date); + if (dayMin >= sunEnd && dayMin <= night) ring_fill = 100; + else { + ring_fill = 100 * (date - sunStart) / sunFull; + if (ring_fill > 100) { // If we're now past a sunrise of sunset + updateSunRiseSunSet(date, location.lat, location.lon, true); + ring_fill = 100 * (date - sunStart) / sunFull; + } + } + invertRing = !isDaytime; + break; + } + var start = 0; + var end = ring_fill; + if (invertRing) { + start = 100 - end; + end = 100; + } + drawRing(start, end, ring_max); + log_debug("Start: "+ start + " end: " +end); +} + function drawClock() { var date = new Date(); var hh = date.getHours(); var mm = date.getMinutes(); let min = mm; - var ring_percent; - var invertRing = false; - switch (settings.ring) { - case 'Hours': - ring_percent = Math.round((10*(((hh % 12) * 60) + mm))/72); - break; - case 'Minutes': - ring_percent = Math.round((10*mm)/6); - break; - case 'Seconds': - ring_percent = Math.round((10*date.getSeconds())/6); - break; - case 'Day': - ring_percent = Math.round((10*(((hh % 12) * 60) + mm))/144); - break; - case 'Steps': - ring_percent = Math.round(100*(getSteps()/settings.step_target)); - break; - case 'Battery': - ring_percent = E.getBattery(); - break; - case 'Sun': - var dayMin = getMinutesFromDate(date); - if (dayMin >= sunEnd && dayMin <= night) ring_percent = 100; - else { - 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; - } - } - invertRing = !isDaytime; - break; - } - if (settings.hr_12) { hh = hh % 12; if (hh == 0) hh = 12; @@ -317,7 +341,7 @@ function drawClock() { g.reset(); g.setColor(g.theme.bg); g.fillRect(0, 0, w, h); - drawGaugeImage(ring_percent, settings.ring, invertRing); + drawGaugeImage(date); setLargeFont(); g.setColor(settings.fg); @@ -383,8 +407,8 @@ Bangle.on('HRM', function(hrm) { ///////////////// GAUGE images ///////////////////////////////////// -function addPoint(loc) { - angle = ((2*Math.PI)/100) * loc; +function addPoint(loc, max) { + angle = ((2*Math.PI)/max) * loc; x = hyp * Math.sin(angle); y = hyp * Math.cos(angle + Math.PI); x += rad; @@ -392,27 +416,27 @@ function addPoint(loc) { return [Math.round(x),Math.round(y)]; } -function polyArray(start, end) { +function polyArray(start, end, max) { if (start == end) return []; // No array to draw if the points are the same. - if (start > end) end = 100 - end; + if (start > end) end = max - end; var array = [g.getHeight()/2, g.getHeight()/2]; - var pt = addPoint(start); + var pt = addPoint(start, max); array.push(pt[0], pt[1]); for (let i = start+1; i < end; i++) { if (((i - start)) % 13 < 1) { // Add a point every 8th of the circle - pt = addPoint(i); + pt = addPoint(i, max); array.push(pt[0], pt[1]); } } - pt = addPoint(end); + pt = addPoint(end, max); array.push(pt[0], pt[1]); - log_debug("Poly Arr: " + array) + log_debug("Poly Arr: " + array); return array; } buf = Graphics.createArrayBuffer(w, h, 2, { msb: true }); -function drawRing(start, end) { +function drawRing(start, end, max) { const edge = 4; const thickness = 6; let img = { width: w, height: h, transparent: 0, @@ -426,26 +450,12 @@ function drawRing(start, end) { buf.setColor(1).fillEllipse(edge,edge,w-edge,h-edge); buf.setColor(0).fillEllipse(edge+thickness,edge+thickness,w-edge-thickness,h-edge-thickness); - buf.setColor(0).fillPoly(polyArray(start, end)); + buf.setColor(0).fillPoly(polyArray(start, end, max)); img.palette = pal1; g.drawImage(img, 0, 0); // Draws the filled-in segment return; } -function drawGaugeImage(p, type, reverse) { - const endsDontShowList = ['Minutes', 'Seconds']; // Don't show non-5% increments with these ring types - var start = 0; - var end = p; - if (endsDontShowList.includes(type)) - end = Math.floor(end / 5) * 5; - if (reverse) { - start = 100 - end; - end = 100; - - } - drawRing(start, end); - log_debug("Start: "+ start + " end: " +end); -} ///////////////// IDLE TIMER ///////////////////////////////////// @@ -503,7 +513,7 @@ function dismissPrompt() { warned = false; lastStep = getTime(); Bangle.buzz(100); - draw(); + draw(false); } var dismissBtn = new BUTTON("big",0, 3*h/4 ,w, h/4, "#0ff", dismissPrompt, "Dismiss"); @@ -585,19 +595,22 @@ var drawTimeout; // schedule a draw for the next minute or every sec_update ms function queueDraw() { - let delay = settings.ring == 'Seconds' ? sec_update - (Date.now() % sec_update) : 60000 - (Date.now() % 60000); + let now = Date.now(); + let delay = settings.ring == 'Seconds' ? sec_update - (now % sec_update) : 60000 - (now % 60000); + print(delay); if (drawTimeout) clearTimeout(drawTimeout); drawTimeout = setTimeout(function() { drawTimeout = undefined; checkIdle(); - draw(); + let updateRingOnly = settings.ring == 'Seconds' && (now % 60000) < 59000; + draw(updateRingOnly); }, delay); } // Stop updates when LCD is off, restart when on Bangle.on('lcdPower',on=>{ if (on) { - draw(); // draw immediately, queue redraw + draw(false); // draw immediately, queue redraw } else { // stop draw timer if (drawTimeout) clearTimeout(drawTimeout); drawTimeout = undefined; @@ -612,7 +625,7 @@ Bangle.setUI("clockupdown", btn=> { Bangle.setHRMPower(infoMode == "ID_HRM" ? 1 : 0); resetHrm(); log_debug("idxInfo=" + settings.idxInfo); - draw(); + draw(false); storage.write(SETTINGS_FILE, settings); // Retains idxInfo when leaving the face }); @@ -627,4 +640,4 @@ Bangle.loadWidgets(); * we are not drawing the widgets as we are taking over the whole screen */ widget_utils.hide(); -draw(); +draw(false); From 5f837fbf0b59536f5ea765da8f347ea67e77a86d Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Sat, 3 May 2025 15:19:32 -0400 Subject: [PATCH 10/23] Locally scoped buf --- apps/daisy/app.js | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/apps/daisy/app.js b/apps/daisy/app.js index 8bbc450a7..d5c8beb5b 100644 --- a/apps/daisy/app.js +++ b/apps/daisy/app.js @@ -296,14 +296,14 @@ function drawGaugeImage(date) { ring_fill = (hh * 60) + mm; ring_max = 1440; break; - case 'Steps': + case 'Steps': ring_fill = getSteps(); ring_max = settings.step_target; break; - case 'Battery': + case 'Battery': ring_fill = E.getBattery(); break; - case 'Sun': + case 'Sun': var dayMin = getMinutesFromDate(date); if (dayMin >= sunEnd && dayMin <= night) ring_fill = 100; else { @@ -311,7 +311,7 @@ function drawGaugeImage(date) { if (ring_fill > 100) { // If we're now past a sunrise of sunset updateSunRiseSunSet(date, location.lat, location.lon, true); ring_fill = 100 * (date - sunStart) / sunFull; - } + } } invertRing = !isDaytime; break; @@ -422,34 +422,38 @@ function polyArray(start, end, max) { var array = [g.getHeight()/2, g.getHeight()/2]; var pt = addPoint(start, max); array.push(pt[0], pt[1]); - + for (let i = start+1; i < end; i++) { if (((i - start)) % 13 < 1) { // Add a point every 8th of the circle pt = addPoint(i, max); array.push(pt[0], pt[1]); } - } + } pt = addPoint(end, max); array.push(pt[0], pt[1]); log_debug("Poly Arr: " + array); return array; } -buf = Graphics.createArrayBuffer(w, h, 2, { msb: true }); function drawRing(start, end, max) { const edge = 4; const thickness = 6; + // Create persistent `buf` inside the function scope + if (!drawRing._buf) { + drawRing._buf = Graphics.createArrayBuffer(w, h, 2, { msb: true }); + } + const buf = drawRing._buf; let img = { width: w, height: h, transparent: 0, bpp: 2, palette: pal1, buffer: buf.buffer }; buf.clear(); buf.setColor(1).fillEllipse(edge,edge,w-edge,h-edge); - buf.setColor(0).fillEllipse(edge+thickness,edge+thickness,w-edge-thickness,h-edge-thickness); + buf.setColor(0).fillEllipse(edge+thickness,edge+thickness,w-edge-thickness,h-edge-thickness); img.palette = pal2; g.drawImage(img, 0, 0); // Draws an unfilled circle buf.clear(); - + buf.setColor(1).fillEllipse(edge,edge,w-edge,h-edge); - buf.setColor(0).fillEllipse(edge+thickness,edge+thickness,w-edge-thickness,h-edge-thickness); + buf.setColor(0).fillEllipse(edge+thickness,edge+thickness,w-edge-thickness,h-edge-thickness); buf.setColor(0).fillPoly(polyArray(start, end, max)); img.palette = pal1; g.drawImage(img, 0, 0); // Draws the filled-in segment @@ -597,7 +601,6 @@ var drawTimeout; function queueDraw() { let now = Date.now(); let delay = settings.ring == 'Seconds' ? sec_update - (now % sec_update) : 60000 - (now % 60000); - print(delay); if (drawTimeout) clearTimeout(drawTimeout); drawTimeout = setTimeout(function() { drawTimeout = undefined; From a716a8d8537f4e196e9daa8e4104ebafc190d143 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Sat, 3 May 2025 15:44:58 -0400 Subject: [PATCH 11/23] Updated version info --- apps/daisy/ChangeLog | 1 + apps/daisy/README.md | 8 ++++---- apps/daisy/app.js | 12 ++++++------ apps/daisy/metadata.json | 4 ++-- 4 files changed, 13 insertions(+), 12 deletions(-) diff --git a/apps/daisy/ChangeLog b/apps/daisy/ChangeLog index 11138f412..ab4161a31 100644 --- a/apps/daisy/ChangeLog +++ b/apps/daisy/ChangeLog @@ -13,3 +13,4 @@ 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; Step goal can be changed; The info that is set on the watchface will retain when leaving the face +0.16: Ring is now dynamically-created, rather than displaying pre-rendnered rings; Seconds update every second; Ability to see Day ring; Hourly Chime is an option; Settings options moved around to avoid popping of Steps option disappearing when not used; In Sun setting, ring is fully illuminated between during all of sunrise and sunset. \ No newline at end of file diff --git a/apps/daisy/README.md b/apps/daisy/README.md index 5cc3060dc..1fc2bb5c2 100644 --- a/apps/daisy/README.md +++ b/apps/daisy/README.md @@ -4,11 +4,10 @@ cyclic information line that includes, day, date, steps, battery, sunrise and sunset times* -Written by: [Hugh Barney](https://github.com/hughbarney) For support -and discussion please post in the [Bangle JS -Forum](http://forum.espruino.com/microcosms/1424/) +Written by: [Hugh Barney](https://github.com/hughbarney) and [David Volovskiy](https://github.com/voloved) +For support and discussion please post in the [Bangle JS Forum](http://forum.espruino.com/microcosms/1424/) -* Derived from [The Ring](https://banglejs.com/apps/?id=thering) proof of concept and the [Pastel clock](https://banglejs.com/apps/?q=pastel) +* Derived from [The Ring](https://banglejs.com/apps/?id=thering) proof of concept and the [Pastel clock](https://banglejs.com/apps/?q=pastel), though all rings are dynamically created. * Includes the [Lazybones](https://banglejs.com/apps/?q=lazybones) Idle warning timer * Touch the top right/top left to cycle through the info display (Day, Date, Steps, Sunrise, Sunset, Heart Rate, Battery Estimate) * The heart rate monitor is turned on only when Heart rate is selected and will take a few seconds to settle @@ -25,6 +24,7 @@ See [#1248](https://github.com/espruino/BangleApps/issues/1248) * 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. + * Day - Displays the ring as how much of the day is left. Functionally, it fills the ring half as quickly as the Hours option. * 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. diff --git a/apps/daisy/app.js b/apps/daisy/app.js index d5c8beb5b..72aff9c43 100644 --- a/apps/daisy/app.js +++ b/apps/daisy/app.js @@ -136,12 +136,12 @@ function updateSunRiseSunSet(now, lat, lon, sunLeftCalcs){ sunSet = extractTime(times.sunset); if (!sunLeftCalcs) return; - let sunLeft = times.dusk - dateCopy; + let sunLeft = times.sunset - dateCopy; if (sunLeft < 0) { // If it's already night dateCopy.setDate(dateCopy.getDate() + 1); let timesTmrw = SunCalc.getTimes(dateCopy, lat, lon); isDaytime = false; - sunStart = times.dusk; + sunStart = times.sunset; sunFull = timesTmrw.sunrise - sunStart; sunEnd = getMinutesFromDate(timesTmrw.sunrise); night = getMinutesFromDate(timesTmrw.sunriseEnd); @@ -152,7 +152,7 @@ function updateSunRiseSunSet(now, lat, lon, sunLeftCalcs){ dateCopy.setDate(dateCopy.getDate() - 1); let timesYest = SunCalc.getTimes(dateCopy, lat, lon); isDaytime = false; - sunStart = timesYest.dusk; + sunStart = timesYest.sunset; sunFull = times.sunrise - sunStart; sunEnd = getMinutesFromDate(times.sunrise); night = getMinutesFromDate(times.sunriseEnd); @@ -160,9 +160,9 @@ function updateSunRiseSunSet(now, lat, lon, sunLeftCalcs){ else { // We're in the middle of the day isDaytime = true; sunStart = times.sunriseEnd; - sunFull = times.sunset - sunStart; - sunEnd = getMinutesFromDate(times.sunset); - night = getMinutesFromDate(times.dusk); + sunFull = times.sunsetStart - sunStart; + sunEnd = getMinutesFromDate(times.sunsetStart); + night = getMinutesFromDate(times.sunset); } } } diff --git a/apps/daisy/metadata.json b/apps/daisy/metadata.json index d75402153..59b533020 100644 --- a/apps/daisy/metadata.json +++ b/apps/daisy/metadata.json @@ -1,8 +1,8 @@ { "id": "daisy", "name": "Daisy", - "version": "0.15", + "version": "0.16", "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", + "description": "A beautiful digital clock with large ring gauge, idle timer and a cyclic information line that includes, day, date, steps, battery, sunrise and sunset times", "icon": "app.png", "type": "clock", "tags": "clock", From 109c10f960ecadcc4e972b3a9c5f44ea9f29a278 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Sun, 4 May 2025 09:13:28 -0400 Subject: [PATCH 12/23] Shortened longer loops for drawing polygons --- apps/daisy/app.js | 37 +++++++++++++++++++++---------------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/apps/daisy/app.js b/apps/daisy/app.js index 72aff9c43..d01b44280 100644 --- a/apps/daisy/app.js +++ b/apps/daisy/app.js @@ -305,12 +305,12 @@ function drawGaugeImage(date) { break; case 'Sun': var dayMin = getMinutesFromDate(date); - if (dayMin >= sunEnd && dayMin <= night) ring_fill = 100; + if (dayMin >= sunEnd && dayMin <= night) ring_fill = max; else { - ring_fill = 100 * (date - sunStart) / sunFull; - if (ring_fill > 100) { // If we're now past a sunrise of sunset + ring_fill = max * (date - sunStart) / sunFull; + if (ring_fill > max) { // If we're now past a sunrise of sunset updateSunRiseSunSet(date, location.lat, location.lon, true); - ring_fill = 100 * (date - sunStart) / sunFull; + ring_fill = max * (date - sunStart) / sunFull; } } invertRing = !isDaytime; @@ -319,8 +319,8 @@ function drawGaugeImage(date) { var start = 0; var end = ring_fill; if (invertRing) { - start = 100 - end; - end = 100; + start = max - end; + end = max; } drawRing(start, end, ring_max); log_debug("Start: "+ start + " end: " +end); @@ -417,17 +417,22 @@ function addPoint(loc, max) { } function polyArray(start, end, max) { + const eighth = max / 8; if (start == end) return []; // No array to draw if the points are the same. - if (start > end) end = max - end; + let startOrigin = start; + let endOrigin = end; + start %= max; + end %= max; + if(start == 0 && startOrigin != 0) start = max; + if(end == 0 && endOrigin != 0) end = max; + if (start > end) end += max; var array = [g.getHeight()/2, g.getHeight()/2]; var pt = addPoint(start, max); array.push(pt[0], pt[1]); - for (let i = start+1; i < end; i++) { - if (((i - start)) % 13 < 1) { // Add a point every 8th of the circle - pt = addPoint(i, max); - array.push(pt[0], pt[1]); - } + for (let i = start + eighth; i < end; i += eighth) { + pt = addPoint(i, max); + array.push(pt[0], pt[1]); } pt = addPoint(end, max); array.push(pt[0], pt[1]); @@ -449,14 +454,14 @@ function drawRing(start, end, max) { buf.setColor(1).fillEllipse(edge,edge,w-edge,h-edge); buf.setColor(0).fillEllipse(edge+thickness,edge+thickness,w-edge-thickness,h-edge-thickness); img.palette = pal2; - g.drawImage(img, 0, 0); // Draws an unfilled circle + g.drawImage(img, 0, 0); // Draws a filled-in circle + if((end - start) >= max) return; // No need to add the unfilled circle buf.clear(); - buf.setColor(1).fillEllipse(edge,edge,w-edge,h-edge); buf.setColor(0).fillEllipse(edge+thickness,edge+thickness,w-edge-thickness,h-edge-thickness); - buf.setColor(0).fillPoly(polyArray(start, end, max)); + buf.setColor(0).fillPoly(polyArray(start, end, max)); // Masks the filled-in part of the segment over the unfilled part img.palette = pal1; - g.drawImage(img, 0, 0); // Draws the filled-in segment + g.drawImage(img, 0, 0); // Draws the unfilled-in segment return; } From 78e7df22560801e41025145d9ca87011d688bfd9 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Sun, 4 May 2025 10:32:55 -0400 Subject: [PATCH 13/23] Ring will only be redrawn of it needs changing since its last update --- apps/daisy/README.md | 2 +- apps/daisy/app.js | 10 ++++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/apps/daisy/README.md b/apps/daisy/README.md index 1fc2bb5c2..f42d34e2c 100644 --- a/apps/daisy/README.md +++ b/apps/daisy/README.md @@ -23,7 +23,7 @@ See [#1248](https://github.com/espruino/BangleApps/issues/1248) * 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. + * Seconds - Displays the ring as though it's the seconds hand on an analog clock. This option uses far more battery than any other option as it updates the screen 60 times more often. * Day - Displays the ring as how much of the day is left. Functionally, it fills the ring half as quickly as the Hours option. * 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. diff --git a/apps/daisy/app.js b/apps/daisy/app.js index d01b44280..a3ba4df8a 100644 --- a/apps/daisy/app.js +++ b/apps/daisy/app.js @@ -21,8 +21,11 @@ let pal2; // palette for 50-100% const infoLine = (3*h/4) - 6; const infoWidth = 56; const infoHeight = 11; +const textStartWidth = 28; +const textStartHeight = 44; const sec_update = 1000; // This ms between updates when the ring is in Seconds mode var drawingSteps = false; +var prevRing = {start: null, end: null, max: null}; function log_debug(o) { //print(o); @@ -322,7 +325,10 @@ function drawGaugeImage(date) { start = max - end; end = max; } - drawRing(start, end, ring_max); + if (end !== prevRing.end || start !== prevRing.start || ring_max !== prevRing.max) { + drawRing(start, end, ring_max); + prevRing = {start: start, end: end, max: ring_max}; + } log_debug("Start: "+ start + " end: " +end); } @@ -340,7 +346,7 @@ function drawClock() { g.reset(); g.setColor(g.theme.bg); - g.fillRect(0, 0, w, h); + g.fillRect(textStartWidth, textStartHeight, w-textStartWidth, h-textStartHeight); // Clears the text within the circle drawGaugeImage(date); setLargeFont(); From 1bb077be7a9e1ad6145ae579f41aeb56485c54da Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Sun, 4 May 2025 13:22:13 -0400 Subject: [PATCH 14/23] Changed array writing to be more explicit --- apps/daisy/app.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/daisy/app.js b/apps/daisy/app.js index a3ba4df8a..c65a24dee 100644 --- a/apps/daisy/app.js +++ b/apps/daisy/app.js @@ -327,7 +327,9 @@ function drawGaugeImage(date) { } if (end !== prevRing.end || start !== prevRing.start || ring_max !== prevRing.max) { drawRing(start, end, ring_max); - prevRing = {start: start, end: end, max: ring_max}; + prevRing.start = start; + prevRing.end = end; + prevRing.max = ring_max; } log_debug("Start: "+ start + " end: " +end); } From 213485b3aa007a02040fba801f0bb4009503fc8b Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Sun, 4 May 2025 22:13:56 -0400 Subject: [PATCH 15/23] corrected variables --- apps/daisy/app.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/apps/daisy/app.js b/apps/daisy/app.js index c65a24dee..0901a60ed 100644 --- a/apps/daisy/app.js +++ b/apps/daisy/app.js @@ -308,12 +308,12 @@ function drawGaugeImage(date) { break; case 'Sun': var dayMin = getMinutesFromDate(date); - if (dayMin >= sunEnd && dayMin <= night) ring_fill = max; + if (dayMin >= sunEnd && dayMin <= night) ring_fill = ring_max; else { - ring_fill = max * (date - sunStart) / sunFull; - if (ring_fill > max) { // If we're now past a sunrise of sunset + ring_fill = ring_max * (date - sunStart) / sunFull; + if (ring_fill > ring_max) { // If we're now past a sunrise of sunset updateSunRiseSunSet(date, location.lat, location.lon, true); - ring_fill = max * (date - sunStart) / sunFull; + ring_fill = ring_max * (date - sunStart) / sunFull; } } invertRing = !isDaytime; @@ -322,8 +322,8 @@ function drawGaugeImage(date) { var start = 0; var end = ring_fill; if (invertRing) { - start = max - end; - end = max; + start = ring_max - end; + end = ring_max; } if (end !== prevRing.end || start !== prevRing.start || ring_max !== prevRing.max) { drawRing(start, end, ring_max); From 9f682bef2ca4b635c1e19b2d3b7e7617c8b3d90f Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Mon, 5 May 2025 06:42:48 -0400 Subject: [PATCH 16/23] Made filling inner ring fill all of it. --- apps/daisy/app.js | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/apps/daisy/app.js b/apps/daisy/app.js index 0901a60ed..f4629394a 100644 --- a/apps/daisy/app.js +++ b/apps/daisy/app.js @@ -21,8 +21,8 @@ let pal2; // palette for 50-100% const infoLine = (3*h/4) - 6; const infoWidth = 56; const infoHeight = 11; -const textStartWidth = 28; -const textStartHeight = 44; +const ringEdge = 4; +const ringThick = 6; const sec_update = 1000; // This ms between updates when the ring is in Seconds mode var drawingSteps = false; var prevRing = {start: null, end: null, max: null}; @@ -348,7 +348,7 @@ function drawClock() { g.reset(); g.setColor(g.theme.bg); - g.fillRect(textStartWidth, textStartHeight, w-textStartWidth, h-textStartHeight); // Clears the text within the circle + g.fillEllipse(ringEdge+ringThick,ringEdge+ringThick,w-ringEdge-ringThick,h-ringEdge-ringThick); // Clears the text within the circle drawGaugeImage(date); setLargeFont(); @@ -449,8 +449,6 @@ function polyArray(start, end, max) { } function drawRing(start, end, max) { - const edge = 4; - const thickness = 6; // Create persistent `buf` inside the function scope if (!drawRing._buf) { drawRing._buf = Graphics.createArrayBuffer(w, h, 2, { msb: true }); @@ -459,14 +457,14 @@ function drawRing(start, end, max) { let img = { width: w, height: h, transparent: 0, bpp: 2, palette: pal1, buffer: buf.buffer }; buf.clear(); - buf.setColor(1).fillEllipse(edge,edge,w-edge,h-edge); - buf.setColor(0).fillEllipse(edge+thickness,edge+thickness,w-edge-thickness,h-edge-thickness); + buf.setColor(1).fillEllipse(ringEdge,ringEdge,w-ringEdge,h-ringEdge); + buf.setColor(0).fillEllipse(ringEdge+ringThick,ringEdge+ringThick,w-ringEdge-ringThick,h-ringEdge-ringThick); img.palette = pal2; g.drawImage(img, 0, 0); // Draws a filled-in circle if((end - start) >= max) return; // No need to add the unfilled circle buf.clear(); - buf.setColor(1).fillEllipse(edge,edge,w-edge,h-edge); - buf.setColor(0).fillEllipse(edge+thickness,edge+thickness,w-edge-thickness,h-edge-thickness); + buf.setColor(1).fillEllipse(ringEdge,ringEdge,w-ringEdge,h-ringEdge); + buf.setColor(0).fillEllipse(ringEdge+ringThick,ringEdge+ringThick,w-ringEdge-ringThick,h-ringEdge-ringThick); buf.setColor(0).fillPoly(polyArray(start, end, max)); // Masks the filled-in part of the segment over the unfilled part img.palette = pal1; g.drawImage(img, 0, 0); // Draws the unfilled-in segment From 09a69f814bc65f669f0f4d0dcc4e6618478f4225 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Mon, 5 May 2025 07:20:19 -0400 Subject: [PATCH 17/23] Lowered the amount of sring updates by rounding the ring_fill --- apps/daisy/app.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/daisy/app.js b/apps/daisy/app.js index f4629394a..b83c64694 100644 --- a/apps/daisy/app.js +++ b/apps/daisy/app.js @@ -320,7 +320,7 @@ function drawGaugeImage(date) { break; } var start = 0; - var end = ring_fill; + var end = Math.round(ring_fill); if (invertRing) { start = ring_max - end; end = ring_max; @@ -330,6 +330,7 @@ function drawGaugeImage(date) { prevRing.start = start; prevRing.end = end; prevRing.max = ring_max; + log_debug("Redrew ring at " + hh + ":" + mm); } log_debug("Start: "+ start + " end: " +end); } From 7a7e82b484b521b0905d791eff8a27c6262c4d0f Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Mon, 5 May 2025 07:39:26 -0400 Subject: [PATCH 18/23] typo --- apps/daisy/ChangeLog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/daisy/ChangeLog b/apps/daisy/ChangeLog index ab4161a31..b20870418 100644 --- a/apps/daisy/ChangeLog +++ b/apps/daisy/ChangeLog @@ -13,4 +13,4 @@ 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; Step goal can be changed; The info that is set on the watchface will retain when leaving the face -0.16: Ring is now dynamically-created, rather than displaying pre-rendnered rings; Seconds update every second; Ability to see Day ring; Hourly Chime is an option; Settings options moved around to avoid popping of Steps option disappearing when not used; In Sun setting, ring is fully illuminated between during all of sunrise and sunset. \ No newline at end of file +0.16: Ring is now dynamically-created, rather than displaying pre-rendered rings; Seconds update every second; Ability to see Day ring; Hourly Chime is an option; Settings options moved around to avoid popping of Steps option disappearing when not used; In Sun setting, ring is fully illuminated between during all of sunrise and sunset. \ No newline at end of file From f318c6e055b0db8c052b125726b0446109f72969 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Mon, 5 May 2025 13:11:04 -0400 Subject: [PATCH 19/23] Added lower updates on seconds at lower battery --- apps/daisy/app.js | 39 +++++++++++++++++++++++++++++++++++---- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/apps/daisy/app.js b/apps/daisy/app.js index b83c64694..75ed66823 100644 --- a/apps/daisy/app.js +++ b/apps/daisy/app.js @@ -23,7 +23,7 @@ const infoWidth = 56; const infoHeight = 11; const ringEdge = 4; const ringThick = 6; -const sec_update = 1000; // This ms between updates when the ring is in Seconds mode +let nextUpdateMs; var drawingSteps = false; var prevRing = {start: null, end: null, max: null}; @@ -604,6 +604,35 @@ function buzzer(n) { }, 500); } +function getDelayMs(prevDelayMs, ring_setting, now) { + // Much of the logic here is for slowing or speeding the delay on the seconds setting. + // returns [ms before next update, if only the ring should be updated] + const sec_batt = [20, 50]; + const sec_delay = [10000, 2000, 1000]; + const deadband = 5; + if (ring_setting == 'Seconds') { + const nearNextMinute = (now % 60000) >= (60000 - prevDelayMs); + if (nearNextMinute) { + let batt = E.getBattery(); + for (let i = 0; i < sec_batt.length; i++) { + if (batt <= sec_batt[i]) + return [sec_delay[i], false]; + } + // Check for coming out of the above states w/ deadband + for (let i = 0; i < sec_batt.length; i++) { + if (prevDelayMs == sec_delay[i] && batt >= (sec_batt[i] + deadband)) + return [sec_delay[i + 1], false]; + } + return [sec_delay[sec_delay.length - 1], false]; + } + else { + return [prevDelayMs, true]; + } + } + else + return [60000, false]; +} + /////////////////////////////////////////////////////////////////////////////// // timeout used to update every minute @@ -612,13 +641,14 @@ var drawTimeout; // schedule a draw for the next minute or every sec_update ms function queueDraw() { let now = Date.now(); - let delay = settings.ring == 'Seconds' ? sec_update - (now % sec_update) : 60000 - (now % 60000); + var nextUpdateRet = getDelayMs(nextUpdateMs, settings.ring, now); + nextUpdateMs = nextUpdateRet[0]; + let delay = nextUpdateMs - (now % nextUpdateMs); if (drawTimeout) clearTimeout(drawTimeout); drawTimeout = setTimeout(function() { drawTimeout = undefined; checkIdle(); - let updateRingOnly = settings.ring == 'Seconds' && (now % 60000) < 59000; - draw(updateRingOnly); + draw(nextUpdateRet[1]); }, delay); } @@ -648,6 +678,7 @@ loadSettings(); loadLocation(); var infoMode = infoList[settings.idxInfo]; updateSunRiseSunSet(new Date(), location.lat, location.lon, true); +nextUpdateMs = getDelayMs(1000, settings.ring, Date.now())[0]; g.clear(); Bangle.loadWidgets(); From 656ed76b5fc3daf2abbb6e5e79f89fe782ca7202 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Mon, 5 May 2025 13:19:00 -0400 Subject: [PATCH 20/23] PR-review changes --- apps/daisy/app.js | 1 + apps/daisy/settings.js | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/apps/daisy/app.js b/apps/daisy/app.js index 75ed66823..f369ae7e9 100644 --- a/apps/daisy/app.js +++ b/apps/daisy/app.js @@ -2,6 +2,7 @@ var SunCalc = require("suncalc"); // from modules folder const storage = require('Storage'); const widget_utils = require('widget_utils'); const SETTINGS_FILE = "daisy.json"; +let settings = undefined; const global_settings = storage.readJSON("setting.json", true) || {}; const LOCATION_FILE = "mylocation.json"; const h = g.getHeight(); diff --git a/apps/daisy/settings.js b/apps/daisy/settings.js index 71a7b4c1f..5fe695f48 100644 --- a/apps/daisy/settings.js +++ b/apps/daisy/settings.js @@ -3,14 +3,14 @@ // initialize with default settings... let s = {'gy' : '#020', - 'fg' : '#0f0', - 'color': 'Green', - 'check_idle' : true, - 'batt_hours' : false, - 'hourly_buzz' : false, - 'ring' : 'Steps', - 'idxInfo' : 0, - 'step_target' : 10000}; + 'fg' : '#0f0', + 'color': 'Green', + 'check_idle' : true, + 'batt_hours' : false, + 'hourly_buzz' : false, + 'ring' : 'Steps', + '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 @@ -22,8 +22,8 @@ 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']; From dac7a56fcf076d5bdb4943ff8b78f03ab1b65a3a Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Mon, 5 May 2025 13:21:13 -0400 Subject: [PATCH 21/23] Linter fixes --- apps/daisy/app.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/apps/daisy/app.js b/apps/daisy/app.js index f369ae7e9..0a7f201b6 100644 --- a/apps/daisy/app.js +++ b/apps/daisy/app.js @@ -1,8 +1,9 @@ var SunCalc = require("suncalc"); // from modules folder const storage = require('Storage'); const widget_utils = require('widget_utils'); -const SETTINGS_FILE = "daisy.json"; let settings = undefined; +let location = undefined; +const SETTINGS_FILE = "daisy.json"; const global_settings = storage.readJSON("setting.json", true) || {}; const LOCATION_FILE = "mylocation.json"; const h = g.getHeight(); @@ -418,9 +419,9 @@ Bangle.on('HRM', function(hrm) { ///////////////// GAUGE images ///////////////////////////////////// function addPoint(loc, max) { - angle = ((2*Math.PI)/max) * loc; - x = hyp * Math.sin(angle); - y = hyp * Math.cos(angle + Math.PI); + var angle = ((2*Math.PI)/max) * loc; + var x = hyp * Math.sin(angle); + var y = hyp * Math.cos(angle + Math.PI); x += rad; y += rad; return [Math.round(x),Math.round(y)]; From f5fc8055ac360093ed5279b1768bc4c7ec4680db Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Mon, 5 May 2025 13:29:47 -0400 Subject: [PATCH 22/23] Removed hourly buzz option as chimer app exists. --- apps/daisy/ChangeLog | 2 +- apps/daisy/app.js | 13 +------------ apps/daisy/settings.js | 10 +--------- 3 files changed, 3 insertions(+), 22 deletions(-) diff --git a/apps/daisy/ChangeLog b/apps/daisy/ChangeLog index b20870418..c797845c5 100644 --- a/apps/daisy/ChangeLog +++ b/apps/daisy/ChangeLog @@ -13,4 +13,4 @@ 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; Step goal can be changed; The info that is set on the watchface will retain when leaving the face -0.16: Ring is now dynamically-created, rather than displaying pre-rendered rings; Seconds update every second; Ability to see Day ring; Hourly Chime is an option; Settings options moved around to avoid popping of Steps option disappearing when not used; In Sun setting, ring is fully illuminated between during all of sunrise and sunset. \ No newline at end of file +0.16: Ring is now dynamically-created, rather than displaying pre-rendered rings; Seconds update every second; Ability to see Day ring; Settings options moved around to avoid popping of Steps option disappearing when not used; In Sun setting, ring is fully illuminated between during all of sunrise and sunset. \ No newline at end of file diff --git a/apps/daisy/app.js b/apps/daisy/app.js index 0a7f201b6..a88f0d1b0 100644 --- a/apps/daisy/app.js +++ b/apps/daisy/app.js @@ -14,7 +14,6 @@ const hyp = Math.sqrt(Math.pow(rad, 2) + Math.pow(rad, 2)); // variable for controlling idle alert let lastStep = getTime(); let warned = 0; -let hourly_buzz_occurred = false; let idle = false; let IDLE_MINUTES = 26; @@ -94,7 +93,6 @@ 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 = (global_settings["12hour"] === undefined ? false : global_settings["12hour"]); - settings.hourly_buzz = (settings.hourly_buzz === undefined ? false : settings.hourly_buzz); settings.ring = settings.ring||'Steps'; settings.idxInfo = settings.idxInfo||0; settings.step_target = settings.step_target||10000; @@ -367,19 +365,10 @@ function drawClock() { // recalc sunrise / sunset every hour if (drawCount % 60 == 0) { - let recalcSunLeft = (settings.ring == 'Sun' || settings.hourly_buzz); + let recalcSunLeft = (settings.ring == 'Sun'); updateSunRiseSunSet(date, location.lat, location.lon, recalcSunLeft); } drawCount++; - - if (settings.hourly_buzz) { - if (min != 0) - hourly_buzz_occurred = false; - else if (!hourly_buzz_occurred && isDaytime) { - Bangle.buzz(150); - hourly_buzz_occurred = true; - } - } } function drawSteps() { diff --git a/apps/daisy/settings.js b/apps/daisy/settings.js index 5fe695f48..741d4f3ea 100644 --- a/apps/daisy/settings.js +++ b/apps/daisy/settings.js @@ -7,7 +7,6 @@ 'color': 'Green', 'check_idle' : true, 'batt_hours' : false, - 'hourly_buzz' : false, 'ring' : 'Steps', 'idxInfo' : 0, 'step_target' : 10000}; @@ -73,14 +72,7 @@ var step_options = [100, 1000, 5000, 10000, 15000, 20000]; save(); }, }; - } - appMenu['Hourly Buzz'] = { - value: !!s.hourly_buzz, - onchange: v => { - s.hourly_buzz = v; - save(); - }, - }; + } appMenu['Idle Warning'] = { value: !!s.idle_check, onchange: v => { From 4ad42dc2a9f2d2f900b54bc20f37fcd436b42aed Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Mon, 5 May 2025 13:32:16 -0400 Subject: [PATCH 23/23] Removed a now-unused var. --- apps/daisy/app.js | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/daisy/app.js b/apps/daisy/app.js index a88f0d1b0..d8e6ceb9c 100644 --- a/apps/daisy/app.js +++ b/apps/daisy/app.js @@ -339,7 +339,6 @@ function drawClock() { var date = new Date(); var hh = date.getHours(); var mm = date.getMinutes(); - let min = mm; if (settings.hr_12) { hh = hh % 12; if (hh == 0) hh = 12;