From bf3a9e0002e82cbaf9b289a4b8fea77c7d92e408 Mon Sep 17 00:00:00 2001 From: lunctis-viribus Date: Sat, 25 Feb 2023 16:05:03 +0100 Subject: [PATCH 01/29] weatherclock v0.06 --- apps/weatherClock/ChangeLog | 5 ++- apps/weatherClock/app.js | 13 +++++- apps/weatherClock/metadata.json | 12 ++++-- apps/weatherClock/weatherClock.settings.js | 49 ++++++++++++++++++++++ core | 2 +- 5 files changed, 72 insertions(+), 9 deletions(-) create mode 100644 apps/weatherClock/weatherClock.settings.js diff --git a/apps/weatherClock/ChangeLog b/apps/weatherClock/ChangeLog index a6a12c297..e8b056999 100644 --- a/apps/weatherClock/ChangeLog +++ b/apps/weatherClock/ChangeLog @@ -1,5 +1,6 @@ 0.01: New App! 0.02: Minor layout format tweak so it uses less memory and draws ok on Bangle.js 1 (#1012) 0.03: Minor layout extra spaces. -0.04: Layout now compatible with Bangle.js 2 -0.05: Use weather condition code for icon selection +0.04: Layout now compatible with Bangle.js 2. +0.05: Use weather condition code for icon selection. +0.06: New settings to (un)hide day of week, date and wind speed. diff --git a/apps/weatherClock/app.js b/apps/weatherClock/app.js index 91d0ab36f..fbdc39264 100644 --- a/apps/weatherClock/app.js +++ b/apps/weatherClock/app.js @@ -1,6 +1,8 @@ const Layout = require("Layout"); const storage = require('Storage'); const locale = require("locale"); +const SETTINGS_FILE = "weatherClock.json"; +let settings; // weather icons from https://icons8.com/icon/set/weather/color var sunIcon = require("heatshrink").decompress(atob("mEwwhC/AH4AbhvQC6vd7ouVC4IwUCwIwUFwQwQCYgAHDZQXc9wACC6QWDDAgXN7wXF9oXPCwowDC5guGGAYXMCw4wCC5RGJJAZGTJBiNISIylQVJrLCC5owGF65fXR7AwBC5jvhC7JIILxapDFxAXOGAy9KC4owGBAQXODAgHDC54AHC8T0FAAQSOGg4qPGA4WUGAIuVC7AA/AH4AEA=")); @@ -18,6 +20,13 @@ var stormIcon = require("heatshrink").decompress(atob("mEwwhC/AFEzmcwCyoYUgYXDmY // err icon - https://icons8.com/icons/set/error var errIcon = require("heatshrink").decompress(atob("mEwwkBiIA/AH4AZUAIWUiAXBWqgXXdIYuVGCgXBgICCIyYXCJCQTDC6QrEMCQSEJCQRFC6ApGJCCiDDQSpQFAYXEJBqNGJCA/EC4ZIOEwgXFJBgNEAhKlNAgxIKBgoXEJBjsLC5TsIeRycMBhRrMMBKzQEozjOBxAgHGww+IA6wfSH4hnIC47OMSJqlRIJAXCACIXaGoQARPwwuTAH4A/ABw")); +function loadSettings() { + settings = require("Storage").readJSON(SETTINGS_FILE,1)||{}; + settings.day = settings.day||true; + settings.date = settings.date||true; + settings.wind = settings.wind||true; +} + /** Choose weather icon to display based on condition. Based on function from the Bangle weather app so it should handle all of the conditions @@ -120,8 +129,8 @@ function queueDraw() { function draw() { var date = new Date(); clockLayout.time.label = locale.time(date, 1); - clockLayout.date.label = locale.date(date, 1).toUpperCase(); - clockLayout.dow.label = locale.dow(date, 1).toUpperCase() + " "; + clockLayout.date.label = (settings.date) ? locale.date(date, 1).toUpperCase() : ""; + clockLayout.dow.label = (settings.day) ? locale.dow(date, 1).toUpperCase() + " " : ""; var weatherJson = getWeather(); if(weatherJson && weatherJson.weather){ var currentWeather = weatherJson.weather; diff --git a/apps/weatherClock/metadata.json b/apps/weatherClock/metadata.json index cf8bd899e..38f3eccca 100644 --- a/apps/weatherClock/metadata.json +++ b/apps/weatherClock/metadata.json @@ -1,10 +1,12 @@ { "id": "weatherClock", "name": "Weather Clock", - "version": "0.05", + "shortName": "Weather Clock", + "version": "0.06", "description": "A clock which displays current weather conditions (requires Gadgetbridge and Weather apps).", "icon": "app.png", - "screenshots": [{"url":"screens/screen1.png"}], + "dependencies": {"weather":"app"}, + "screenshots": [{"url":"screens/screen1.png"}, {"url":"screens/screen2.png"}], "type": "clock", "tags": "clock, weather", "supports": ["BANGLEJS","BANGLEJS2"], @@ -12,6 +14,8 @@ "readme": "README.md", "storage": [ {"name":"weatherClock.app.js","url":"app.js"}, - {"name":"weatherClock.img","url":"app-icon.js","evaluate":true} - ] + {"name":"weatherClock.img","url":"app-icon.js","evaluate":true}, + {"name":"weatherClock.settings.js","url":"weatherClock.settings.js"} + ], + "data": [{"name":"weatherClock.json"}] } diff --git a/apps/weatherClock/weatherClock.settings.js b/apps/weatherClock/weatherClock.settings.js new file mode 100644 index 000000000..89b76adb5 --- /dev/null +++ b/apps/weatherClock/weatherClock.settings.js @@ -0,0 +1,49 @@ +(function(back) { + const SETTINGS_FILE = "weatherClock.json"; + + // initialize with default settings... + let s = { + 'day': true, + 'date': true, + 'wind': true + } + + // ...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) || {} + const saved = settings || {} + for (const key in saved) { + s[key] = saved[key] + } + + function save() { + settings = s + storage.write(SETTINGS_FILE, settings) + } + + + E.showMenu({ + '': { 'title': 'Show Day of Week': { + value: !!s.day, + onchange: v => { + s.day = v; + save(); + }, + }, + 'Show Date': { + value: !!s.date, + onchange: v => { + s.date = v; + save(); + }, + }, + 'Show Wind Speed': { + value: !!s.wind, + onchange: v => { + s.wind = v; + save(); + }, + } + }) +}) diff --git a/core b/core index 0d02ff376..23854083e 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit 0d02ff3763783d166ff84906af038420736aabfc +Subproject commit 23854083e0c3f83c649073a2d85e8079efc471d3 From 4680ad77098f6159f83d65f6163d04e966f28405 Mon Sep 17 00:00:00 2001 From: lunctis-viribus Date: Sat, 25 Feb 2023 16:19:10 +0100 Subject: [PATCH 02/29] weatherclock v0.06 --- apps/weatherClock/weatherClock.settings.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/apps/weatherClock/weatherClock.settings.js b/apps/weatherClock/weatherClock.settings.js index 89b76adb5..658630696 100644 --- a/apps/weatherClock/weatherClock.settings.js +++ b/apps/weatherClock/weatherClock.settings.js @@ -22,9 +22,10 @@ storage.write(SETTINGS_FILE, settings) } - E.showMenu({ - '': { 'title': 'Show Day of Week': { + '': { 'title': 'Weather Clock' }, + '< Back': back, + 'Show DoW': { value: !!s.day, onchange: v => { s.day = v; @@ -38,7 +39,7 @@ save(); }, }, - 'Show Wind Speed': { + 'Show Wind': { value: !!s.wind, onchange: v => { s.wind = v; From 9db41919f80e6c2b7150bb73f940aa0f4d39796c Mon Sep 17 00:00:00 2001 From: lunctis-viribus Date: Sat, 25 Feb 2023 18:11:13 +0100 Subject: [PATCH 03/29] weatherclock v0.06 --- apps/weatherClock/ChangeLog | 2 +- apps/weatherClock/app.js | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/weatherClock/ChangeLog b/apps/weatherClock/ChangeLog index e8b056999..ffaf87d1e 100644 --- a/apps/weatherClock/ChangeLog +++ b/apps/weatherClock/ChangeLog @@ -3,4 +3,4 @@ 0.03: Minor layout extra spaces. 0.04: Layout now compatible with Bangle.js 2. 0.05: Use weather condition code for icon selection. -0.06: New settings to (un)hide day of week, date and wind speed. +0.06: Dev-New settings to (un)hide day of week, date and wind speed. diff --git a/apps/weatherClock/app.js b/apps/weatherClock/app.js index fbdc39264..914b0b041 100644 --- a/apps/weatherClock/app.js +++ b/apps/weatherClock/app.js @@ -156,6 +156,8 @@ function draw() { queueDraw(); } +loadSettings(); + g.clear(); Bangle.setUI("clock"); // Show launcher when middle button pressed Bangle.loadWidgets(); From a41402607462fc9545ce212d9c52d0405e779160 Mon Sep 17 00:00:00 2001 From: lunctis-viribus Date: Sat, 25 Feb 2023 18:23:28 +0100 Subject: [PATCH 04/29] weatherclock v0.06 --- apps/weatherClock/app.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/weatherClock/app.js b/apps/weatherClock/app.js index 914b0b041..1fc5f5de5 100644 --- a/apps/weatherClock/app.js +++ b/apps/weatherClock/app.js @@ -22,9 +22,9 @@ var errIcon = require("heatshrink").decompress(atob("mEwwkBiIA/AH4AZUAIWUiAXBWqg function loadSettings() { settings = require("Storage").readJSON(SETTINGS_FILE,1)||{}; - settings.day = settings.day||true; - settings.date = settings.date||true; - settings.wind = settings.wind||true; + settings.day = (settings.day === undefined ? true : settings.day); + settings.date = (settings.date === undefined ? true : settings.date); + settings.wind = (settings.wind === undefined ? true : settings.wind); } /** From fd33d8445e0f346852f83fbfd0102eebfe92643f Mon Sep 17 00:00:00 2001 From: lunctis-viribus Date: Sat, 25 Feb 2023 19:17:42 +0100 Subject: [PATCH 05/29] weatherclock v0.06 --- apps/weatherClock/metadata.json | 4 ++-- apps/weatherClock/{weatherClock.settings.js => settings.js} | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) rename apps/weatherClock/{weatherClock.settings.js => settings.js} (94%) diff --git a/apps/weatherClock/metadata.json b/apps/weatherClock/metadata.json index 38f3eccca..270591c74 100644 --- a/apps/weatherClock/metadata.json +++ b/apps/weatherClock/metadata.json @@ -6,7 +6,7 @@ "description": "A clock which displays current weather conditions (requires Gadgetbridge and Weather apps).", "icon": "app.png", "dependencies": {"weather":"app"}, - "screenshots": [{"url":"screens/screen1.png"}, {"url":"screens/screen2.png"}], + "screenshots": [{"url":"screens/screen1.png"}], "type": "clock", "tags": "clock, weather", "supports": ["BANGLEJS","BANGLEJS2"], @@ -15,7 +15,7 @@ "storage": [ {"name":"weatherClock.app.js","url":"app.js"}, {"name":"weatherClock.img","url":"app-icon.js","evaluate":true}, - {"name":"weatherClock.settings.js","url":"weatherClock.settings.js"} + {"name":"weatherClock.settings.js","url":"settings.js"} ], "data": [{"name":"weatherClock.json"}] } diff --git a/apps/weatherClock/weatherClock.settings.js b/apps/weatherClock/settings.js similarity index 94% rename from apps/weatherClock/weatherClock.settings.js rename to apps/weatherClock/settings.js index 658630696..9597e7066 100644 --- a/apps/weatherClock/weatherClock.settings.js +++ b/apps/weatherClock/settings.js @@ -25,21 +25,21 @@ E.showMenu({ '': { 'title': 'Weather Clock' }, '< Back': back, - 'Show DoW': { + 'Day Of Week': { value: !!s.day, onchange: v => { s.day = v; save(); }, }, - 'Show Date': { + 'Date': { value: !!s.date, onchange: v => { s.date = v; save(); }, }, - 'Show Wind': { + 'Wind Speed': { value: !!s.wind, onchange: v => { s.wind = v; From f635e37263566ed5f406f73a862f27ec6118dd05 Mon Sep 17 00:00:00 2001 From: lunctis-viribus Date: Sat, 25 Feb 2023 19:35:00 +0100 Subject: [PATCH 06/29] weatherclock v0.06 --- apps/weatherClock/ChangeLog | 2 +- apps/weatherClock/metadata.json | 2 +- apps/weatherClock/weatherClock.settings.js | 50 ++++++++++++++++++++++ 3 files changed, 52 insertions(+), 2 deletions(-) create mode 100644 apps/weatherClock/weatherClock.settings.js diff --git a/apps/weatherClock/ChangeLog b/apps/weatherClock/ChangeLog index ffaf87d1e..1476ffc34 100644 --- a/apps/weatherClock/ChangeLog +++ b/apps/weatherClock/ChangeLog @@ -3,4 +3,4 @@ 0.03: Minor layout extra spaces. 0.04: Layout now compatible with Bangle.js 2. 0.05: Use weather condition code for icon selection. -0.06: Dev-New settings to (un)hide day of week, date and wind speed. +0.06: Dev2-New settings to (un)hide day of week, date and wind speed. diff --git a/apps/weatherClock/metadata.json b/apps/weatherClock/metadata.json index 270591c74..0b7987ee5 100644 --- a/apps/weatherClock/metadata.json +++ b/apps/weatherClock/metadata.json @@ -15,7 +15,7 @@ "storage": [ {"name":"weatherClock.app.js","url":"app.js"}, {"name":"weatherClock.img","url":"app-icon.js","evaluate":true}, - {"name":"weatherClock.settings.js","url":"settings.js"} + {"name":"weatherClock.settings.js","url":"weatherClock.settings.js"} ], "data": [{"name":"weatherClock.json"}] } diff --git a/apps/weatherClock/weatherClock.settings.js b/apps/weatherClock/weatherClock.settings.js new file mode 100644 index 000000000..9597e7066 --- /dev/null +++ b/apps/weatherClock/weatherClock.settings.js @@ -0,0 +1,50 @@ +(function(back) { + const SETTINGS_FILE = "weatherClock.json"; + + // initialize with default settings... + let s = { + 'day': true, + 'date': true, + 'wind': true + } + + // ...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) || {} + const saved = settings || {} + for (const key in saved) { + s[key] = saved[key] + } + + function save() { + settings = s + storage.write(SETTINGS_FILE, settings) + } + + E.showMenu({ + '': { 'title': 'Weather Clock' }, + '< Back': back, + 'Day Of Week': { + value: !!s.day, + onchange: v => { + s.day = v; + save(); + }, + }, + 'Date': { + value: !!s.date, + onchange: v => { + s.date = v; + save(); + }, + }, + 'Wind Speed': { + value: !!s.wind, + onchange: v => { + s.wind = v; + save(); + }, + } + }) +}) From d3d96e3782d7e0d24833f69580196ccf06325860 Mon Sep 17 00:00:00 2001 From: lunctis-viribus Date: Sat, 25 Feb 2023 19:46:39 +0100 Subject: [PATCH 07/29] weatherclock v0.06 --- apps/weatherClock/ChangeLog | 2 +- apps/weatherClock/metadata.json | 4 +- apps/weatherClock/weatherClock.settings.js | 50 ---------------------- 3 files changed, 3 insertions(+), 53 deletions(-) delete mode 100644 apps/weatherClock/weatherClock.settings.js diff --git a/apps/weatherClock/ChangeLog b/apps/weatherClock/ChangeLog index 1476ffc34..07ef8c118 100644 --- a/apps/weatherClock/ChangeLog +++ b/apps/weatherClock/ChangeLog @@ -3,4 +3,4 @@ 0.03: Minor layout extra spaces. 0.04: Layout now compatible with Bangle.js 2. 0.05: Use weather condition code for icon selection. -0.06: Dev2-New settings to (un)hide day of week, date and wind speed. +0.07: Dev-New settings to (un)hide day of week, date and wind speed. diff --git a/apps/weatherClock/metadata.json b/apps/weatherClock/metadata.json index 0b7987ee5..88057c8dd 100644 --- a/apps/weatherClock/metadata.json +++ b/apps/weatherClock/metadata.json @@ -2,7 +2,7 @@ "id": "weatherClock", "name": "Weather Clock", "shortName": "Weather Clock", - "version": "0.06", + "version": "0.07", "description": "A clock which displays current weather conditions (requires Gadgetbridge and Weather apps).", "icon": "app.png", "dependencies": {"weather":"app"}, @@ -15,7 +15,7 @@ "storage": [ {"name":"weatherClock.app.js","url":"app.js"}, {"name":"weatherClock.img","url":"app-icon.js","evaluate":true}, - {"name":"weatherClock.settings.js","url":"weatherClock.settings.js"} + {"name":"weatherClock.settings.js","url":"settings.js"} ], "data": [{"name":"weatherClock.json"}] } diff --git a/apps/weatherClock/weatherClock.settings.js b/apps/weatherClock/weatherClock.settings.js deleted file mode 100644 index 9597e7066..000000000 --- a/apps/weatherClock/weatherClock.settings.js +++ /dev/null @@ -1,50 +0,0 @@ -(function(back) { - const SETTINGS_FILE = "weatherClock.json"; - - // initialize with default settings... - let s = { - 'day': true, - 'date': true, - 'wind': true - } - - // ...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) || {} - const saved = settings || {} - for (const key in saved) { - s[key] = saved[key] - } - - function save() { - settings = s - storage.write(SETTINGS_FILE, settings) - } - - E.showMenu({ - '': { 'title': 'Weather Clock' }, - '< Back': back, - 'Day Of Week': { - value: !!s.day, - onchange: v => { - s.day = v; - save(); - }, - }, - 'Date': { - value: !!s.date, - onchange: v => { - s.date = v; - save(); - }, - }, - 'Wind Speed': { - value: !!s.wind, - onchange: v => { - s.wind = v; - save(); - }, - } - }) -}) From 85692d5476d2714ef225f75010c96ae4023b16c8 Mon Sep 17 00:00:00 2001 From: lunctis-viribus Date: Sat, 25 Feb 2023 22:33:52 +0100 Subject: [PATCH 08/29] weatherclock v0.06 --- apps/weatherClock/ChangeLog | 2 +- apps/weatherClock/app.js | 19 ++++++++----------- 2 files changed, 9 insertions(+), 12 deletions(-) diff --git a/apps/weatherClock/ChangeLog b/apps/weatherClock/ChangeLog index 07ef8c118..c8a31f7e0 100644 --- a/apps/weatherClock/ChangeLog +++ b/apps/weatherClock/ChangeLog @@ -3,4 +3,4 @@ 0.03: Minor layout extra spaces. 0.04: Layout now compatible with Bangle.js 2. 0.05: Use weather condition code for icon selection. -0.07: Dev-New settings to (un)hide day of week, date and wind speed. +0.06: Dev1-New settings to (un)hide day of week, date and wind speed. diff --git a/apps/weatherClock/app.js b/apps/weatherClock/app.js index 1fc5f5de5..2a42365cb 100644 --- a/apps/weatherClock/app.js +++ b/apps/weatherClock/app.js @@ -2,7 +2,6 @@ const Layout = require("Layout"); const storage = require('Storage'); const locale = require("locale"); const SETTINGS_FILE = "weatherClock.json"; -let settings; // weather icons from https://icons8.com/icon/set/weather/color var sunIcon = require("heatshrink").decompress(atob("mEwwhC/AH4AbhvQC6vd7ouVC4IwUCwIwUFwQwQCYgAHDZQXc9wACC6QWDDAgXN7wXF9oXPCwowDC5guGGAYXMCw4wCC5RGJJAZGTJBiNISIylQVJrLCC5owGF65fXR7AwBC5jvhC7JIILxapDFxAXOGAy9KC4owGBAQXODAgHDC54AHC8T0FAAQSOGg4qPGA4WUGAIuVC7AA/AH4AEA=")); @@ -20,12 +19,10 @@ var stormIcon = require("heatshrink").decompress(atob("mEwwhC/AFEzmcwCyoYUgYXDmY // err icon - https://icons8.com/icons/set/error var errIcon = require("heatshrink").decompress(atob("mEwwkBiIA/AH4AZUAIWUiAXBWqgXXdIYuVGCgXBgICCIyYXCJCQTDC6QrEMCQSEJCQRFC6ApGJCCiDDQSpQFAYXEJBqNGJCA/EC4ZIOEwgXFJBgNEAhKlNAgxIKBgoXEJBjsLC5TsIeRycMBhRrMMBKzQEozjOBxAgHGww+IA6wfSH4hnIC47OMSJqlRIJAXCACIXaGoQARPwwuTAH4A/ABw")); -function loadSettings() { - settings = require("Storage").readJSON(SETTINGS_FILE,1)||{}; - settings.day = (settings.day === undefined ? true : settings.day); - settings.date = (settings.date === undefined ? true : settings.date); - settings.wind = (settings.wind === undefined ? true : settings.wind); -} +var settings = require("Storage").readJSON(SETTINGS_FILE,1)||{}; +settings.day = (settings.day === undefined ? true : settings.day); +settings.date = (settings.date === undefined ? true : settings.date); +settings.wind = (settings.wind === undefined ? true : settings.wind); /** Choose weather icon to display based on condition. @@ -92,6 +89,8 @@ function getWeather() { return jsonWeather; } +let fontTemp = settings.wind ? "10%" : "20%"; +let fontWind = settings.wind ? "10%" : "0%"; var clockLayout = new Layout( { type:"v", c: [ {type:"txt", font:"35%", halign: 0, fillx:1, pad: 8, label:"00:00", id:"time" }, @@ -104,10 +103,10 @@ var clockLayout = new Layout( { {type: "img", filly: 1, id: "weatherIcon", src: sunIcon}, {type: "v", fillx:1, c: [ {type: "h", c: [ - {type: "txt", font: "10%", id: "temp", label: "000 °C"}, + {type: "txt", font: fontTemp, id: "temp", label: "000 °C"}, ]}, {type: "h", c: [ - {type: "txt", font: "10%", id: "wind", label: "00 km/h"}, + {type: "txt", font: fontWind, id: "wind", label: "00 km/h"}, ]} ] }, @@ -156,8 +155,6 @@ function draw() { queueDraw(); } -loadSettings(); - g.clear(); Bangle.setUI("clock"); // Show launcher when middle button pressed Bangle.loadWidgets(); From a66e433ebe40e82a87bc0db67b1ce2495129fb2a Mon Sep 17 00:00:00 2001 From: lunctis-viribus Date: Sat, 25 Feb 2023 22:52:01 +0100 Subject: [PATCH 09/29] weatherclock v0.06 --- apps/weatherClock/ChangeLog | 2 +- apps/weatherClock/app.js | 12 ++++++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/apps/weatherClock/ChangeLog b/apps/weatherClock/ChangeLog index c8a31f7e0..6ea37b64e 100644 --- a/apps/weatherClock/ChangeLog +++ b/apps/weatherClock/ChangeLog @@ -3,4 +3,4 @@ 0.03: Minor layout extra spaces. 0.04: Layout now compatible with Bangle.js 2. 0.05: Use weather condition code for icon selection. -0.06: Dev1-New settings to (un)hide day of week, date and wind speed. +0.07: Dev2-New settings to hide day of week, date and wind speed. diff --git a/apps/weatherClock/app.js b/apps/weatherClock/app.js index 2a42365cb..16da02af6 100644 --- a/apps/weatherClock/app.js +++ b/apps/weatherClock/app.js @@ -76,7 +76,7 @@ function chooseIconByCode(code) { case 800: return sunIcon; case 801: return partSunIcon; default: return cloudIcon; - } + } break; default: return cloudIcon; } } @@ -91,18 +91,22 @@ function getWeather() { let fontTemp = settings.wind ? "10%" : "20%"; let fontWind = settings.wind ? "10%" : "0%"; +let labelDay = settings.day ? "THU" : ""; +let labelDate = settings.date ? "01/01/1970" : ""; var clockLayout = new Layout( { type:"v", c: [ {type:"txt", font:"35%", halign: 0, fillx:1, pad: 8, label:"00:00", id:"time" }, {type: "h", fillx: 1, c: [ - {type:"txt", font:"10%", label:"THU", id:"dow" }, - {type:"txt", font:"10%", label:"01/01/1970", id:"date" } + {type: "h", c: [ + {type:"txt", font:"10%", label:labelDay, id:"dow" }, + {type:"txt", font:"10%", label:labelDate, id:"date" } + ]}, ] }, {type: "h", valign : 1, fillx:1, c: [ {type: "img", filly: 1, id: "weatherIcon", src: sunIcon}, {type: "v", fillx:1, c: [ - {type: "h", c: [ + {type: "h", c: [ {type: "txt", font: fontTemp, id: "temp", label: "000 °C"}, ]}, {type: "h", c: [ From a52a2caaed0dd3c6c97b9f065904f7fca1720a48 Mon Sep 17 00:00:00 2001 From: lunctis-viribus Date: Sat, 25 Feb 2023 22:55:54 +0100 Subject: [PATCH 10/29] weatherclock v0.06 --- apps/weatherClock/ChangeLog | 2 +- apps/weatherClock/app.js | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/weatherClock/ChangeLog b/apps/weatherClock/ChangeLog index 6ea37b64e..aa3f9c970 100644 --- a/apps/weatherClock/ChangeLog +++ b/apps/weatherClock/ChangeLog @@ -3,4 +3,4 @@ 0.03: Minor layout extra spaces. 0.04: Layout now compatible with Bangle.js 2. 0.05: Use weather condition code for icon selection. -0.07: Dev2-New settings to hide day of week, date and wind speed. +0.06: Dev3-New settings to hide day of week, date and wind speed. diff --git a/apps/weatherClock/app.js b/apps/weatherClock/app.js index 16da02af6..cbe63f84c 100644 --- a/apps/weatherClock/app.js +++ b/apps/weatherClock/app.js @@ -76,7 +76,7 @@ function chooseIconByCode(code) { case 800: return sunIcon; case 801: return partSunIcon; default: return cloudIcon; - } break; + } default: return cloudIcon; } } @@ -97,7 +97,7 @@ var clockLayout = new Layout( { type:"v", c: [ {type:"txt", font:"35%", halign: 0, fillx:1, pad: 8, label:"00:00", id:"time" }, {type: "h", fillx: 1, c: [ - {type: "h", c: [ + {type: "h", c: [ {type:"txt", font:"10%", label:labelDay, id:"dow" }, {type:"txt", font:"10%", label:labelDate, id:"date" } ]}, @@ -106,7 +106,7 @@ var clockLayout = new Layout( { {type: "h", valign : 1, fillx:1, c: [ {type: "img", filly: 1, id: "weatherIcon", src: sunIcon}, {type: "v", fillx:1, c: [ - {type: "h", c: [ + {type: "h", c: [ {type: "txt", font: fontTemp, id: "temp", label: "000 °C"}, ]}, {type: "h", c: [ From f3a28b2b4ca29352bace011ffec67f58db0e9e4a Mon Sep 17 00:00:00 2001 From: lunctis-viribus Date: Sun, 26 Feb 2023 14:24:49 +0100 Subject: [PATCH 11/29] weatherclock v0.06 --- apps/weatherClock/ChangeLog | 2 +- apps/weatherClock/app.js | 77 ++++++++++++++++++------------------- 2 files changed, 39 insertions(+), 40 deletions(-) diff --git a/apps/weatherClock/ChangeLog b/apps/weatherClock/ChangeLog index aa3f9c970..5607abade 100644 --- a/apps/weatherClock/ChangeLog +++ b/apps/weatherClock/ChangeLog @@ -3,4 +3,4 @@ 0.03: Minor layout extra spaces. 0.04: Layout now compatible with Bangle.js 2. 0.05: Use weather condition code for icon selection. -0.06: Dev3-New settings to hide day of week, date and wind speed. +0.06: Dev4-New settings to hide the day of week, date and/or wind speed. diff --git a/apps/weatherClock/app.js b/apps/weatherClock/app.js index cbe63f84c..90f73b6d7 100644 --- a/apps/weatherClock/app.js +++ b/apps/weatherClock/app.js @@ -2,28 +2,18 @@ const Layout = require("Layout"); const storage = require('Storage'); const locale = require("locale"); const SETTINGS_FILE = "weatherClock.json"; +let settings; // weather icons from https://icons8.com/icon/set/weather/color var sunIcon = require("heatshrink").decompress(atob("mEwwhC/AH4AbhvQC6vd7ouVC4IwUCwIwUFwQwQCYgAHDZQXc9wACC6QWDDAgXN7wXF9oXPCwowDC5guGGAYXMCw4wCC5RGJJAZGTJBiNISIylQVJrLCC5owGF65fXR7AwBC5jvhC7JIILxapDFxAXOGAy9KC4owGBAQXODAgHDC54AHC8T0FAAQSOGg4qPGA4WUGAIuVC7AA/AH4AEA=")); - var partSunIcon = require("heatshrink").decompress(atob("mEwwhC/AH4AY6AWVhvdC6vd7owUFwIABFiYAFGR4Xa93u9oXTCwIYDC6HeC4fuC56MBC4ySOIwpIQXYQXHmYABRpwXECwQYKF5HjC4kwL5gQCAYYwO7wqFAAowK7wWKJBgXLJBPd6YX/AAoVMAAM/Cw0DC5yRHCx5JGFyAwGCyIwFC/4XyR4inXa64wRFwowQCw4A/AH4AkA")); - var cloudIcon = require("heatshrink").decompress(atob("mEwwhC/AH4A/AH4AtgczmYWWDCgWDmcwIKAuEGBoSGGCAWKC7BIKIxYX6CpgABn4tUSJIWPJIwuQGAwWRGAoX/C+SPEU67XXGCIuFGCAWHAH4A/AH4A/ADg=")); - var snowIcon = require("heatshrink").decompress(atob("mEwwhC/AH4AhxGAC9YUBC4QZRhAVBAIWIC6QAEI6IYEI5cIBgwWOC64NCKohHPNox3RBgqnQEo7XPHpKONR5AXYAH4ASLa4XWXILiBC6r5LDBgWWDBRrKC5hsCEacIHawvMCIwvQC5QvQFAROEfZ5ADLJ4YGCywvVI7CPGC9IA/AH4AF")); - var rainIcon = require("heatshrink").decompress(atob("mEwwhC/AH4AFgczmYWWDCgWDmcwIKAuEGBoSGGCAWKC7BIKIxYX6CpgABn4tUSJIWPJIwuQGAwWRGAoX/C+SPEU67XXGCIuFGCAWHAGeIBJEIwAVJhGIC5AJBC5QMJEJQMEC44JBC6QSCC54FHLxgNBBgYSEDgKpPMhQXneSwuUAH4A/AA4=")); - var stormIcon = require("heatshrink").decompress(atob("mEwwhC/AFEzmcwCyoYUgYXDmYuVGAY0OFwocHC6pNLCxYXYJBQXuCxhhJRpgYKCyBKFFyIXFCyJIFC/4XaO66nU3eza6k7C4IWFGBwXBCwwwO3ewC5AZMC6RaCIxZiI3e7AYYwRCQIIBC4QwPIQIpDC5owDhYREIxgAEFIouNC4orDFyBGBGAcLC6BaFhYWRLSRIFISQXcCyqhRAH4Az")); - // err icon - https://icons8.com/icons/set/error var errIcon = require("heatshrink").decompress(atob("mEwwkBiIA/AH4AZUAIWUiAXBWqgXXdIYuVGCgXBgICCIyYXCJCQTDC6QrEMCQSEJCQRFC6ApGJCCiDDQSpQFAYXEJBqNGJCA/EC4ZIOEwgXFJBgNEAhKlNAgxIKBgoXEJBjsLC5TsIeRycMBhRrMMBKzQEozjOBxAgHGww+IA6wfSH4hnIC47OMSJqlRIJAXCACIXaGoQARPwwuTAH4A/ABw")); -var settings = require("Storage").readJSON(SETTINGS_FILE,1)||{}; -settings.day = (settings.day === undefined ? true : settings.day); -settings.date = (settings.date === undefined ? true : settings.date); -settings.wind = (settings.wind === undefined ? true : settings.wind); - /** Choose weather icon to display based on condition. Based on function from the Bangle weather app so it should handle all of the conditions @@ -89,34 +79,6 @@ function getWeather() { return jsonWeather; } -let fontTemp = settings.wind ? "10%" : "20%"; -let fontWind = settings.wind ? "10%" : "0%"; -let labelDay = settings.day ? "THU" : ""; -let labelDate = settings.date ? "01/01/1970" : ""; -var clockLayout = new Layout( { - type:"v", c: [ - {type:"txt", font:"35%", halign: 0, fillx:1, pad: 8, label:"00:00", id:"time" }, - {type: "h", fillx: 1, c: [ - {type: "h", c: [ - {type:"txt", font:"10%", label:labelDay, id:"dow" }, - {type:"txt", font:"10%", label:labelDate, id:"date" } - ]}, - ] - }, - {type: "h", valign : 1, fillx:1, c: [ - {type: "img", filly: 1, id: "weatherIcon", src: sunIcon}, - {type: "v", fillx:1, c: [ - {type: "h", c: [ - {type: "txt", font: fontTemp, id: "temp", label: "000 °C"}, - ]}, - {type: "h", c: [ - {type: "txt", font: fontWind, id: "wind", label: "00 km/h"}, - ]} - ] - }, - ]}] -}); - // timeout used to update every minute var drawTimeout; @@ -159,6 +121,43 @@ function draw() { queueDraw(); } +function loadSettings() { + settings = require("Storage").readJSON(SETTINGS_FILE,1)||{}; + settings.day = (settings.day === undefined ? true : settings.day); + settings.date = (settings.date === undefined ? true : settings.date); + settings.wind = (settings.wind === undefined ? true : settings.wind); +} + +loadSettings(); + +let fontTemp = settings.wind ? "10%" : "20%"; +let fontWind = settings.wind ? "10%" : "0%"; +let labelDay = settings.day ? "THU" : ""; +let labelDate = settings.date ? "01/01/1970" : ""; +var clockLayout = new Layout( { + type:"v", c: [ + {type:"txt", font:"35%", halign: 0, fillx:1, pad: 8, label:"00:00", id:"time" }, + {type: "h", fillx: 1, c: [ + {type: "h", c: [ + {type:"txt", font:"10%", label:labelDay, id:"dow" }, + {type:"txt", font:"10%", label:labelDate, id:"date" } + ]}, + ] + }, + {type: "h", valign : 1, fillx:1, c: [ + {type: "img", filly: 1, id: "weatherIcon", src: sunIcon}, + {type: "v", fillx:1, c: [ + {type: "h", c: [ + {type: "txt", font: fontTemp, id: "temp", label: "000 °C"}, + ]}, + {type: "h", c: [ + {type: "txt", font: fontWind, id: "wind", label: "00 km/h"}, + ]} + ] + }, + ]}] +}); + g.clear(); Bangle.setUI("clock"); // Show launcher when middle button pressed Bangle.loadWidgets(); From 35b4611a9cdf87c78c9cc5f5ddd34ad43097c0c5 Mon Sep 17 00:00:00 2001 From: lunctis-viribus Date: Sun, 26 Feb 2023 14:37:16 +0100 Subject: [PATCH 12/29] weatherclock v0.06 --- apps/weatherClock/ChangeLog | 2 +- apps/weatherClock/app.js | 3 ++- apps/weatherClock/settings.js | 8 ++++++++ 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/apps/weatherClock/ChangeLog b/apps/weatherClock/ChangeLog index 5607abade..ace827ede 100644 --- a/apps/weatherClock/ChangeLog +++ b/apps/weatherClock/ChangeLog @@ -3,4 +3,4 @@ 0.03: Minor layout extra spaces. 0.04: Layout now compatible with Bangle.js 2. 0.05: Use weather condition code for icon selection. -0.06: Dev4-New settings to hide the day of week, date and/or wind speed. +0.06: Dev5-New settings to hide the weather icon, day of week, date and/or wind speed. diff --git a/apps/weatherClock/app.js b/apps/weatherClock/app.js index 90f73b6d7..d5cff8459 100644 --- a/apps/weatherClock/app.js +++ b/apps/weatherClock/app.js @@ -134,6 +134,7 @@ let fontTemp = settings.wind ? "10%" : "20%"; let fontWind = settings.wind ? "10%" : "0%"; let labelDay = settings.day ? "THU" : ""; let labelDate = settings.date ? "01/01/1970" : ""; +let srcWeather = settings.icon ? sunIcon : ""; var clockLayout = new Layout( { type:"v", c: [ {type:"txt", font:"35%", halign: 0, fillx:1, pad: 8, label:"00:00", id:"time" }, @@ -145,7 +146,7 @@ var clockLayout = new Layout( { ] }, {type: "h", valign : 1, fillx:1, c: [ - {type: "img", filly: 1, id: "weatherIcon", src: sunIcon}, + {type: "img", filly: 1, id: "weatherIcon", src: srcWeather}, {type: "v", fillx:1, c: [ {type: "h", c: [ {type: "txt", font: fontTemp, id: "temp", label: "000 °C"}, diff --git a/apps/weatherClock/settings.js b/apps/weatherClock/settings.js index 9597e7066..ee68df4fd 100644 --- a/apps/weatherClock/settings.js +++ b/apps/weatherClock/settings.js @@ -3,6 +3,7 @@ // initialize with default settings... let s = { + 'icon': true, 'day': true, 'date': true, 'wind': true @@ -25,6 +26,13 @@ E.showMenu({ '': { 'title': 'Weather Clock' }, '< Back': back, + 'Weather Icon': { + value: !!s.icon, + onchange: v => { + s.icon = v; + save(); + }, + }, 'Day Of Week': { value: !!s.day, onchange: v => { From 822b56a6fdff6aba0dbff8ba16c9f3332db1310f Mon Sep 17 00:00:00 2001 From: lunctis-viribus Date: Sun, 26 Feb 2023 14:53:19 +0100 Subject: [PATCH 13/29] weatherclock v0.06 --- apps/weatherClock/ChangeLog | 2 +- apps/weatherClock/app.js | 3 ++- apps/weatherClock/metadata.json | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/apps/weatherClock/ChangeLog b/apps/weatherClock/ChangeLog index ace827ede..956ba394b 100644 --- a/apps/weatherClock/ChangeLog +++ b/apps/weatherClock/ChangeLog @@ -3,4 +3,4 @@ 0.03: Minor layout extra spaces. 0.04: Layout now compatible with Bangle.js 2. 0.05: Use weather condition code for icon selection. -0.06: Dev5-New settings to hide the weather icon, day of week, date and/or wind speed. +0.06: Dev6-New settings to hide the weather icon, day of week, date and/or wind speed. diff --git a/apps/weatherClock/app.js b/apps/weatherClock/app.js index d5cff8459..0876f7fe3 100644 --- a/apps/weatherClock/app.js +++ b/apps/weatherClock/app.js @@ -13,6 +13,7 @@ var rainIcon = require("heatshrink").decompress(atob("mEwwhC/AH4AFgczmYWWDCgWDmc var stormIcon = require("heatshrink").decompress(atob("mEwwhC/AFEzmcwCyoYUgYXDmYuVGAY0OFwocHC6pNLCxYXYJBQXuCxhhJRpgYKCyBKFFyIXFCyJIFC/4XaO66nU3eza6k7C4IWFGBwXBCwwwO3ewC5AZMC6RaCIxZiI3e7AYYwRCQIIBC4QwPIQIpDC5owDhYREIxgAEFIouNC4orDFyBGBGAcLC6BaFhYWRLSRIFISQXcCyqhRAH4Az")); // err icon - https://icons8.com/icons/set/error var errIcon = require("heatshrink").decompress(atob("mEwwkBiIA/AH4AZUAIWUiAXBWqgXXdIYuVGCgXBgICCIyYXCJCQTDC6QrEMCQSEJCQRFC6ApGJCCiDDQSpQFAYXEJBqNGJCA/EC4ZIOEwgXFJBgNEAhKlNAgxIKBgoXEJBjsLC5TsIeRycMBhRrMMBKzQEozjOBxAgHGww+IA6wfSH4hnIC47OMSJqlRIJAXCACIXaGoQARPwwuTAH4A/ABw")); +var dummyIcon = require("heatshrink").decompress(atob("gMBwMAwA")); /** Choose weather icon to display based on condition. @@ -134,7 +135,7 @@ let fontTemp = settings.wind ? "10%" : "20%"; let fontWind = settings.wind ? "10%" : "0%"; let labelDay = settings.day ? "THU" : ""; let labelDate = settings.date ? "01/01/1970" : ""; -let srcWeather = settings.icon ? sunIcon : ""; +let srcWeather = settings.icon ? sunIcon : dummyIcon; var clockLayout = new Layout( { type:"v", c: [ {type:"txt", font:"35%", halign: 0, fillx:1, pad: 8, label:"00:00", id:"time" }, diff --git a/apps/weatherClock/metadata.json b/apps/weatherClock/metadata.json index 88057c8dd..270591c74 100644 --- a/apps/weatherClock/metadata.json +++ b/apps/weatherClock/metadata.json @@ -2,7 +2,7 @@ "id": "weatherClock", "name": "Weather Clock", "shortName": "Weather Clock", - "version": "0.07", + "version": "0.06", "description": "A clock which displays current weather conditions (requires Gadgetbridge and Weather apps).", "icon": "app.png", "dependencies": {"weather":"app"}, From 7d2159efa18b05c6b30e8f2edc3a1dbfe3a659c9 Mon Sep 17 00:00:00 2001 From: lunctis-viribus Date: Sun, 26 Feb 2023 15:19:40 +0100 Subject: [PATCH 14/29] weatherclock v0.06 --- apps/weatherClock/ChangeLog | 2 +- apps/weatherClock/app.js | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/apps/weatherClock/ChangeLog b/apps/weatherClock/ChangeLog index 956ba394b..c7af13ffa 100644 --- a/apps/weatherClock/ChangeLog +++ b/apps/weatherClock/ChangeLog @@ -3,4 +3,4 @@ 0.03: Minor layout extra spaces. 0.04: Layout now compatible with Bangle.js 2. 0.05: Use weather condition code for icon selection. -0.06: Dev6-New settings to hide the weather icon, day of week, date and/or wind speed. +0.06: Dev7-New settings to hide the weather icon, day of week, date and/or wind speed. diff --git a/apps/weatherClock/app.js b/apps/weatherClock/app.js index 0876f7fe3..7a356559c 100644 --- a/apps/weatherClock/app.js +++ b/apps/weatherClock/app.js @@ -104,9 +104,9 @@ function draw() { clockLayout.temp.label = temp[1] + " " + temp[2]; const code = currentWeather.code || -1; if (code > 0) { - clockLayout.weatherIcon.src = chooseIconByCode(code); + clockLayout.weatherIcon.src = settings.icon ? chooseIconByCode(code) : dummyIcon; } else { - clockLayout.weatherIcon.src = chooseIcon(currentWeather.txt); + clockLayout.weatherIcon.src = settings.icon ? chooseIcon(currentWeather.txt) : dummyIcon; } const wind = locale.speed(currentWeather.wind).match(/^(\D*\d*)(.*)$/); clockLayout.wind.label = wind[1] + " " + wind[2] + " " + (currentWeather.wrose||'').toUpperCase(); @@ -114,7 +114,7 @@ function draw() { else{ clockLayout.temp.label = "Err"; clockLayout.wind.label = "No Data"; - clockLayout.weatherIcon.src = errIcon; + clockLayout.weatherIcon.src = settings.icon ? errIcon : dummyIcon; } clockLayout.clear(); clockLayout.render(); @@ -124,6 +124,7 @@ function draw() { function loadSettings() { settings = require("Storage").readJSON(SETTINGS_FILE,1)||{}; + settings.icon = (settings.icon === undefined ? true : settings.icon); settings.day = (settings.day === undefined ? true : settings.day); settings.date = (settings.date === undefined ? true : settings.date); settings.wind = (settings.wind === undefined ? true : settings.wind); @@ -131,11 +132,11 @@ function loadSettings() { loadSettings(); +let srcWeather = settings.icon ? sunIcon : dummyIcon; let fontTemp = settings.wind ? "10%" : "20%"; let fontWind = settings.wind ? "10%" : "0%"; let labelDay = settings.day ? "THU" : ""; let labelDate = settings.date ? "01/01/1970" : ""; -let srcWeather = settings.icon ? sunIcon : dummyIcon; var clockLayout = new Layout( { type:"v", c: [ {type:"txt", font:"35%", halign: 0, fillx:1, pad: 8, label:"00:00", id:"time" }, From 4dc02a5a3217d4ceb2b26eb0a24126fd1dab99a6 Mon Sep 17 00:00:00 2001 From: lunctis-viribus Date: Sun, 26 Feb 2023 16:31:56 +0100 Subject: [PATCH 15/29] weatherclock v0.06 --- apps/weatherClock/ChangeLog | 2 +- apps/weatherClock/app.js | 80 ++++++++++++++++++++++--------------- 2 files changed, 49 insertions(+), 33 deletions(-) diff --git a/apps/weatherClock/ChangeLog b/apps/weatherClock/ChangeLog index c7af13ffa..c2c0b76e3 100644 --- a/apps/weatherClock/ChangeLog +++ b/apps/weatherClock/ChangeLog @@ -3,4 +3,4 @@ 0.03: Minor layout extra spaces. 0.04: Layout now compatible with Bangle.js 2. 0.05: Use weather condition code for icon selection. -0.06: Dev7-New settings to hide the weather icon, day of week, date and/or wind speed. +0.06: Dev8-New settings to hide the weather icon, day of week, date and/or wind speed. diff --git a/apps/weatherClock/app.js b/apps/weatherClock/app.js index 7a356559c..50649569c 100644 --- a/apps/weatherClock/app.js +++ b/apps/weatherClock/app.js @@ -5,15 +5,31 @@ const SETTINGS_FILE = "weatherClock.json"; let settings; // weather icons from https://icons8.com/icon/set/weather/color -var sunIcon = require("heatshrink").decompress(atob("mEwwhC/AH4AbhvQC6vd7ouVC4IwUCwIwUFwQwQCYgAHDZQXc9wACC6QWDDAgXN7wXF9oXPCwowDC5guGGAYXMCw4wCC5RGJJAZGTJBiNISIylQVJrLCC5owGF65fXR7AwBC5jvhC7JIILxapDFxAXOGAy9KC4owGBAQXODAgHDC54AHC8T0FAAQSOGg4qPGA4WUGAIuVC7AA/AH4AEA=")); -var partSunIcon = require("heatshrink").decompress(atob("mEwwhC/AH4AY6AWVhvdC6vd7owUFwIABFiYAFGR4Xa93u9oXTCwIYDC6HeC4fuC56MBC4ySOIwpIQXYQXHmYABRpwXECwQYKF5HjC4kwL5gQCAYYwO7wqFAAowK7wWKJBgXLJBPd6YX/AAoVMAAM/Cw0DC5yRHCx5JGFyAwGCyIwFC/4XyR4inXa64wRFwowQCw4A/AH4AkA")); -var cloudIcon = require("heatshrink").decompress(atob("mEwwhC/AH4A/AH4AtgczmYWWDCgWDmcwIKAuEGBoSGGCAWKC7BIKIxYX6CpgABn4tUSJIWPJIwuQGAwWRGAoX/C+SPEU67XXGCIuFGCAWHAH4A/AH4A/ADg=")); -var snowIcon = require("heatshrink").decompress(atob("mEwwhC/AH4AhxGAC9YUBC4QZRhAVBAIWIC6QAEI6IYEI5cIBgwWOC64NCKohHPNox3RBgqnQEo7XPHpKONR5AXYAH4ASLa4XWXILiBC6r5LDBgWWDBRrKC5hsCEacIHawvMCIwvQC5QvQFAROEfZ5ADLJ4YGCywvVI7CPGC9IA/AH4AF")); -var rainIcon = require("heatshrink").decompress(atob("mEwwhC/AH4AFgczmYWWDCgWDmcwIKAuEGBoSGGCAWKC7BIKIxYX6CpgABn4tUSJIWPJIwuQGAwWRGAoX/C+SPEU67XXGCIuFGCAWHAGeIBJEIwAVJhGIC5AJBC5QMJEJQMEC44JBC6QSCC54FHLxgNBBgYSEDgKpPMhQXneSwuUAH4A/AA4=")); -var stormIcon = require("heatshrink").decompress(atob("mEwwhC/AFEzmcwCyoYUgYXDmYuVGAY0OFwocHC6pNLCxYXYJBQXuCxhhJRpgYKCyBKFFyIXFCyJIFC/4XaO66nU3eza6k7C4IWFGBwXBCwwwO3ewC5AZMC6RaCIxZiI3e7AYYwRCQIIBC4QwPIQIpDC5owDhYREIxgAEFIouNC4orDFyBGBGAcLC6BaFhYWRLSRIFISQXcCyqhRAH4Az")); +function getSun() { + return require("heatshrink").decompress(atob("mEwwhC/AH4AbhvQC6vd7ouVC4IwUCwIwUFwQwQCYgAHDZQXc9wACC6QWDDAgXN7wXF9oXPCwowDC5guGGAYXMCw4wCC5RGJJAZGTJBiNISIylQVJrLCC5owGF65fXR7AwBC5jvhC7JIILxapDFxAXOGAy9KC4owGBAQXODAgHDC54AHC8T0FAAQSOGg4qPGA4WUGAIuVC7AA/AH4AEA=")); +} +function getPartSun() { + return require("heatshrink").decompress(atob("mEwwhC/AH4AY6AWVhvdC6vd7owUFwIABFiYAFGR4Xa93u9oXTCwIYDC6HeC4fuC56MBC4ySOIwpIQXYQXHmYABRpwXECwQYKF5HjC4kwL5gQCAYYwO7wqFAAowK7wWKJBgXLJBPd6YX/AAoVMAAM/Cw0DC5yRHCx5JGFyAwGCyIwFC/4XyR4inXa64wRFwowQCw4A/AH4AkA")); +} +function getCloud() { + return require("heatshrink").decompress(atob("mEwwhC/AH4A/AH4AtgczmYWWDCgWDmcwIKAuEGBoSGGCAWKC7BIKIxYX6CpgABn4tUSJIWPJIwuQGAwWRGAoX/C+SPEU67XXGCIuFGCAWHAH4A/AH4A/ADg=")); +} +function getSnow() { + return require("heatshrink").decompress(atob("mEwwhC/AH4AhxGAC9YUBC4QZRhAVBAIWIC6QAEI6IYEI5cIBgwWOC64NCKohHPNox3RBgqnQEo7XPHpKONR5AXYAH4ASLa4XWXILiBC6r5LDBgWWDBRrKC5hsCEacIHawvMCIwvQC5QvQFAROEfZ5ADLJ4YGCywvVI7CPGC9IA/AH4AF")); +} +function getRain() { + return require("heatshrink").decompress(atob("mEwwhC/AH4AFgczmYWWDCgWDmcwIKAuEGBoSGGCAWKC7BIKIxYX6CpgABn4tUSJIWPJIwuQGAwWRGAoX/C+SPEU67XXGCIuFGCAWHAGeIBJEIwAVJhGIC5AJBC5QMJEJQMEC44JBC6QSCC54FHLxgNBBgYSEDgKpPMhQXneSwuUAH4A/AA4=")); +} +function getStorm() { + return require("heatshrink").decompress(atob("mEwwhC/AFEzmcwCyoYUgYXDmYuVGAY0OFwocHC6pNLCxYXYJBQXuCxhhJRpgYKCyBKFFyIXFCyJIFC/4XaO66nU3eza6k7C4IWFGBwXBCwwwO3ewC5AZMC6RaCIxZiI3e7AYYwRCQIIBC4QwPIQIpDC5owDhYREIxgAEFIouNC4orDFyBGBGAcLC6BaFhYWRLSRIFISQXcCyqhRAH4Az")); +} // err icon - https://icons8.com/icons/set/error -var errIcon = require("heatshrink").decompress(atob("mEwwkBiIA/AH4AZUAIWUiAXBWqgXXdIYuVGCgXBgICCIyYXCJCQTDC6QrEMCQSEJCQRFC6ApGJCCiDDQSpQFAYXEJBqNGJCA/EC4ZIOEwgXFJBgNEAhKlNAgxIKBgoXEJBjsLC5TsIeRycMBhRrMMBKzQEozjOBxAgHGww+IA6wfSH4hnIC47OMSJqlRIJAXCACIXaGoQARPwwuTAH4A/ABw")); -var dummyIcon = require("heatshrink").decompress(atob("gMBwMAwA")); +function getErr() { + return require("heatshrink").decompress(atob("mEwwkBiIA/AH4AZUAIWUiAXBWqgXXdIYuVGCgXBgICCIyYXCJCQTDC6QrEMCQSEJCQRFC6ApGJCCiDDQSpQFAYXEJBqNGJCA/EC4ZIOEwgXFJBgNEAhKlNAgxIKBgoXEJBjsLC5TsIeRycMBhRrMMBKzQEozjOBxAgHGww+IA6wfSH4hnIC47OMSJqlRIJAXCACIXaGoQARPwwuTAH4A/ABw")); +} +function getDummy() { + return require("heatshrink").decompress(atob("gMBwMAwA")); +} /** Choose weather icon to display based on condition. @@ -22,20 +38,20 @@ sent from gadget bridge. */ function chooseIcon(condition) { condition = condition.toLowerCase(); - if (condition.includes("thunderstorm")) return stormIcon; + if (condition.includes("thunderstorm")) return getStorm; if (condition.includes("freezing")||condition.includes("snow")|| condition.includes("sleet")) { - return snowIcon; + return getSnow; } if (condition.includes("drizzle")|| condition.includes("shower")) { - return rainIcon; + return getRain; } - if (condition.includes("rain")) return rainIcon; - if (condition.includes("clear")) return sunIcon; - if (condition.includes("few clouds")) return partSunIcon; - if (condition.includes("scattered clouds")) return cloudIcon; - if (condition.includes("clouds")) return cloudIcon; + if (condition.includes("rain")) return getRain; + if (condition.includes("clear")) return getSun; + if (condition.includes("few clouds")) return getPartSun; + if (condition.includes("scattered clouds")) return getCloud; + if (condition.includes("clouds")) return getCloud; if (condition.includes("mist") || condition.includes("smoke") || condition.includes("haze") || @@ -45,9 +61,9 @@ function chooseIcon(condition) { condition.includes("ash") || condition.includes("squalls") || condition.includes("tornado")) { - return cloudIcon; + return getCloud; } - return cloudIcon; + return getCloud; } /* @@ -57,18 +73,18 @@ function chooseIcon(condition) { function chooseIconByCode(code) { const codeGroup = Math.round(code / 100); switch (codeGroup) { - case 2: return stormIcon; - case 3: return rainIcon; - case 5: return rainIcon; - case 6: return snowIcon; - case 7: return cloudIcon; + case 2: return getStorm; + case 3: return getRain; + case 5: return getRain; + case 6: return getSnow; + case 7: return getCloud; case 8: switch (code) { - case 800: return sunIcon; - case 801: return partSunIcon; - default: return cloudIcon; + case 800: return getSun; + case 801: return getPartSun; + default: return getCloud; } - default: return cloudIcon; + default: return getCloud; } } @@ -104,9 +120,9 @@ function draw() { clockLayout.temp.label = temp[1] + " " + temp[2]; const code = currentWeather.code || -1; if (code > 0) { - clockLayout.weatherIcon.src = settings.icon ? chooseIconByCode(code) : dummyIcon; + clockLayout.weatherIcon.src = settings.icon ? chooseIconByCode(code) : getDummy; } else { - clockLayout.weatherIcon.src = settings.icon ? chooseIcon(currentWeather.txt) : dummyIcon; + clockLayout.weatherIcon.src = settings.icon ? chooseIcon(currentWeather.txt) : getDummy; } const wind = locale.speed(currentWeather.wind).match(/^(\D*\d*)(.*)$/); clockLayout.wind.label = wind[1] + " " + wind[2] + " " + (currentWeather.wrose||'').toUpperCase(); @@ -114,7 +130,7 @@ function draw() { else{ clockLayout.temp.label = "Err"; clockLayout.wind.label = "No Data"; - clockLayout.weatherIcon.src = settings.icon ? errIcon : dummyIcon; + clockLayout.weatherIcon.src = settings.icon ? getErr : getDummy; } clockLayout.clear(); clockLayout.render(); @@ -132,7 +148,7 @@ function loadSettings() { loadSettings(); -let srcWeather = settings.icon ? sunIcon : dummyIcon; +let srcWeather = settings.icon ? getSun : getDummy; let fontTemp = settings.wind ? "10%" : "20%"; let fontWind = settings.wind ? "10%" : "0%"; let labelDay = settings.day ? "THU" : ""; @@ -144,7 +160,7 @@ var clockLayout = new Layout( { {type: "h", c: [ {type:"txt", font:"10%", label:labelDay, id:"dow" }, {type:"txt", font:"10%", label:labelDate, id:"date" } - ]}, + ]}, ] }, {type: "h", valign : 1, fillx:1, c: [ From b7222c485b14cf7b7f4efefd7b7cdee6f3e46602 Mon Sep 17 00:00:00 2001 From: lunctis-viribus Date: Sun, 26 Feb 2023 16:46:02 +0100 Subject: [PATCH 16/29] weatherclock v0.06 --- apps/weatherClock/ChangeLog | 2 +- apps/weatherClock/settings.js | 20 ++++++-------------- 2 files changed, 7 insertions(+), 15 deletions(-) diff --git a/apps/weatherClock/ChangeLog b/apps/weatherClock/ChangeLog index c2c0b76e3..37891568d 100644 --- a/apps/weatherClock/ChangeLog +++ b/apps/weatherClock/ChangeLog @@ -3,4 +3,4 @@ 0.03: Minor layout extra spaces. 0.04: Layout now compatible with Bangle.js 2. 0.05: Use weather condition code for icon selection. -0.06: Dev8-New settings to hide the weather icon, day of week, date and/or wind speed. +0.06: Dev9-New settings to hide the weather icon, day of week, date and/or wind speed. diff --git a/apps/weatherClock/settings.js b/apps/weatherClock/settings.js index ee68df4fd..f8925d86a 100644 --- a/apps/weatherClock/settings.js +++ b/apps/weatherClock/settings.js @@ -1,22 +1,14 @@ (function(back) { const SETTINGS_FILE = "weatherClock.json"; - // initialize with default settings... - let s = { - 'icon': true, - 'day': true, - 'date': true, - 'wind': true - } - - // ...and overwrite them with any saved values - // This way saved values are preserved if a new version adds more settings + // Load setings file const storage = require('Storage') let settings = storage.readJSON(SETTINGS_FILE, 1) || {} - const saved = settings || {} - for (const key in saved) { - s[key] = saved[key] - } + let s; + s.icon = (settings.icon === undefined ? true : settings.icon); + s.day = (settings.day === undefined ? true : settings.day); + s.date = (settings.date === undefined ? true : settings.date); + s.wind = (settings.wind === undefined ? true : settings.wind); function save() { settings = s From 7809129ddf1990f1c00a3d2aaf10a773f5e471d7 Mon Sep 17 00:00:00 2001 From: lunctis-viribus Date: Sun, 26 Feb 2023 16:59:43 +0100 Subject: [PATCH 17/29] weatherclock v0.06 --- apps/weatherClock/ChangeLog | 2 +- apps/weatherClock/README.md | 4 +++- apps/weatherClock/app.js | 2 +- apps/weatherClock/settings.js | 12 ++++++------ 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/apps/weatherClock/ChangeLog b/apps/weatherClock/ChangeLog index 37891568d..22f9fc5d2 100644 --- a/apps/weatherClock/ChangeLog +++ b/apps/weatherClock/ChangeLog @@ -3,4 +3,4 @@ 0.03: Minor layout extra spaces. 0.04: Layout now compatible with Bangle.js 2. 0.05: Use weather condition code for icon selection. -0.06: Dev9-New settings to hide the weather icon, day of week, date and/or wind speed. +0.06: Dev9-New settings to optionally hide elements. Images placed into functions for performance. diff --git a/apps/weatherClock/README.md b/apps/weatherClock/README.md index f1f146440..c72a575ec 100644 --- a/apps/weatherClock/README.md +++ b/apps/weatherClock/README.md @@ -1,6 +1,8 @@ # Weather Clock -A clock which displays the current weather conditions. Temperature, wind speed, and an icon indicating the weather conditions are displayed. +A clock which displays the current weather conditions. Time, day of week, date, temperature, wind speed, and an icon indicating the weather conditions are displayed. + +As of Weather Clock v0.06 the day of week, date, temperature and/or wind speed can be hidden using settings. Standard widgets are displayed. diff --git a/apps/weatherClock/app.js b/apps/weatherClock/app.js index 50649569c..8747620d8 100644 --- a/apps/weatherClock/app.js +++ b/apps/weatherClock/app.js @@ -139,7 +139,7 @@ function draw() { } function loadSettings() { - settings = require("Storage").readJSON(SETTINGS_FILE,1)||{}; + settings = storage.readJSON(SETTINGS_FILE,1)||{}; settings.icon = (settings.icon === undefined ? true : settings.icon); settings.day = (settings.day === undefined ? true : settings.day); settings.date = (settings.date === undefined ? true : settings.date); diff --git a/apps/weatherClock/settings.js b/apps/weatherClock/settings.js index f8925d86a..cd6a46970 100644 --- a/apps/weatherClock/settings.js +++ b/apps/weatherClock/settings.js @@ -1,10 +1,10 @@ (function(back) { const SETTINGS_FILE = "weatherClock.json"; - // Load setings file - const storage = require('Storage') - let settings = storage.readJSON(SETTINGS_FILE, 1) || {} - let s; + // Load settings file + const storage = require('Storage'); + let settings = storage.readJSON(SETTINGS_FILE, 1) || {}; + let s = {}; s.icon = (settings.icon === undefined ? true : settings.icon); s.day = (settings.day === undefined ? true : settings.day); s.date = (settings.date === undefined ? true : settings.date); @@ -46,5 +46,5 @@ save(); }, } - }) -}) + }); +}); From a6805a304fabd49c8d857d5b10cfa325e668e1cb Mon Sep 17 00:00:00 2001 From: lunctis-viribus Date: Sun, 26 Feb 2023 16:59:59 +0100 Subject: [PATCH 18/29] weatherclock v0.06 --- apps/weatherClock/ChangeLog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/weatherClock/ChangeLog b/apps/weatherClock/ChangeLog index 22f9fc5d2..b15f34d47 100644 --- a/apps/weatherClock/ChangeLog +++ b/apps/weatherClock/ChangeLog @@ -3,4 +3,4 @@ 0.03: Minor layout extra spaces. 0.04: Layout now compatible with Bangle.js 2. 0.05: Use weather condition code for icon selection. -0.06: Dev9-New settings to optionally hide elements. Images placed into functions for performance. +0.06: Dev10-New settings to optionally hide elements. Images placed into functions for performance. From aa5ed45c26823dfc91ce26ff119e437a5e6e2da6 Mon Sep 17 00:00:00 2001 From: lunctis-viribus Date: Mon, 27 Feb 2023 01:14:25 +0100 Subject: [PATCH 19/29] weatherclock v0.06 --- apps/weatherClock/app.js | 47 ++++++++++++++++++++++------------- apps/weatherClock/settings.js | 8 ++++++ 2 files changed, 38 insertions(+), 17 deletions(-) diff --git a/apps/weatherClock/app.js b/apps/weatherClock/app.js index 8747620d8..aa9b6939c 100644 --- a/apps/weatherClock/app.js +++ b/apps/weatherClock/app.js @@ -3,6 +3,7 @@ const storage = require('Storage'); const locale = require("locale"); const SETTINGS_FILE = "weatherClock.json"; let settings; +const weather = require('weather'); // weather icons from https://icons8.com/icon/set/weather/color function getSun() { @@ -111,21 +112,22 @@ function queueDraw() { function draw() { var date = new Date(); clockLayout.time.label = locale.time(date, 1); - clockLayout.date.label = (settings.date) ? locale.date(date, 1).toUpperCase() : ""; - clockLayout.dow.label = (settings.day) ? locale.dow(date, 1).toUpperCase() + " " : ""; - var weatherJson = getWeather(); - if(weatherJson && weatherJson.weather){ - var currentWeather = weatherJson.weather; - const temp = locale.temp(currentWeather.temp-273.15).match(/^(\D*\d*)(.*)$/); + clockLayout.date.label = settings.date ? locale.date(date, 1).toUpperCase() : ""; + clockLayout.dow.label = settings.day ? locale.dow(date, 1).toUpperCase() + " " : ""; + let current = weather.get(); + if(current){ + const temp = locale.temp(current.temp-273.15).match(/^(\D*\d*)(.*)$/); clockLayout.temp.label = temp[1] + " " + temp[2]; - const code = currentWeather.code || -1; + const code = current.code || -1; if (code > 0) { - clockLayout.weatherIcon.src = settings.icon ? chooseIconByCode(code) : getDummy; + let srcIconsCode = settings.src ? weatherIcon(current.code) : chooseIconByCode(current.code); + clockLayout.weatherIcon.src = settings.icon ? srcIconsCode : getDummy; } else { - clockLayout.weatherIcon.src = settings.icon ? chooseIcon(currentWeather.txt) : getDummy; + let srcIconsTxt = settings.src ? weatherIcon(current.txt) : chooseIcon(current.txt); + clockLayout.weatherIcon.src = settings.icon ? srcIconsTxt : getDummy; } - const wind = locale.speed(currentWeather.wind).match(/^(\D*\d*)(.*)$/); - clockLayout.wind.label = wind[1] + " " + wind[2] + " " + (currentWeather.wrose||'').toUpperCase(); + const wind = locale.speed(current.wind).match(/^(\D*\d*)(.*)$/); + clockLayout.wind.label = wind[1] + " " + wind[2] + " " + (current.wrose||'').toUpperCase(); } else{ clockLayout.temp.label = "Err"; @@ -140,15 +142,26 @@ function draw() { function loadSettings() { settings = storage.readJSON(SETTINGS_FILE,1)||{}; - settings.icon = (settings.icon === undefined ? true : settings.icon); - settings.day = (settings.day === undefined ? true : settings.day); - settings.date = (settings.date === undefined ? true : settings.date); - settings.wind = (settings.wind === undefined ? true : settings.wind); + settings.src = settings.src === undefined ? false : settings.src; + settings.icon = settings.icon === undefined ? true : settings.icon; + settings.day = settings.day === undefined ? true : settings.day; + settings.date = settings.date === undefined ? true : settings.date; + settings.wind = settings.wind === undefined ? true : settings.wind; } loadSettings(); -let srcWeather = settings.icon ? getSun : getDummy; +function weatherIcon(code) { + var ovr = Graphics.createArrayBuffer(48,56,1,{msb:true}); + if (typeof code == "number") weather.drawIcon({code:code},24,24,24,ovr); + if (typeof code == "string") weather.drawIcon({code},24,24,24,ovr); + var img = ovr.asImage(); + img.transparent = 0; + return img; +} + +let srcIcons = settings.src ? weatherIcon(800) : getSun; +let srcWeather = settings.icon ? srcIcons : getDummy; let fontTemp = settings.wind ? "10%" : "20%"; let fontWind = settings.wind ? "10%" : "0%"; let labelDay = settings.day ? "THU" : ""; @@ -164,7 +177,7 @@ var clockLayout = new Layout( { ] }, {type: "h", valign : 1, fillx:1, c: [ - {type: "img", filly: 1, id: "weatherIcon", src: srcWeather}, + {type: "img", filly: 1, pad: 8, id: "weatherIcon", src: srcWeather}, {type: "v", fillx:1, c: [ {type: "h", c: [ {type: "txt", font: fontTemp, id: "temp", label: "000 °C"}, diff --git a/apps/weatherClock/settings.js b/apps/weatherClock/settings.js index cd6a46970..bc4544b31 100644 --- a/apps/weatherClock/settings.js +++ b/apps/weatherClock/settings.js @@ -5,6 +5,7 @@ const storage = require('Storage'); let settings = storage.readJSON(SETTINGS_FILE, 1) || {}; let s = {}; + s.src = (settings.src === undefined ? false : settings.src); s.icon = (settings.icon === undefined ? true : settings.icon); s.day = (settings.day === undefined ? true : settings.day); s.date = (settings.date === undefined ? true : settings.date); @@ -45,6 +46,13 @@ s.wind = v; save(); }, + }, + 'Icons from weather app': { + value: !!s.src, + onchange: v => { + s.src = v; + save(); + }, } }); }); From 483503dc36f3cb99becaece7d0841757f7dc4919 Mon Sep 17 00:00:00 2001 From: lunctis-viribus Date: Mon, 27 Feb 2023 20:06:14 +0100 Subject: [PATCH 20/29] weatherclock v0.06 --- apps/weatherClock/ChangeLog | 2 +- apps/weatherClock/app.js | 4 +- apps/weatherClock/lib.js | 399 ++++++++++++++++++++++++++++++++ apps/weatherClock/metadata.json | 3 +- 4 files changed, 404 insertions(+), 4 deletions(-) create mode 100644 apps/weatherClock/lib.js diff --git a/apps/weatherClock/ChangeLog b/apps/weatherClock/ChangeLog index b15f34d47..4f66ce437 100644 --- a/apps/weatherClock/ChangeLog +++ b/apps/weatherClock/ChangeLog @@ -3,4 +3,4 @@ 0.03: Minor layout extra spaces. 0.04: Layout now compatible with Bangle.js 2. 0.05: Use weather condition code for icon selection. -0.06: Dev10-New settings to optionally hide elements. Images placed into functions for performance. +0.06: Dev11-New settings to optionally hide elements. Images placed into functions for performance. diff --git a/apps/weatherClock/app.js b/apps/weatherClock/app.js index aa9b6939c..f57d0fd80 100644 --- a/apps/weatherClock/app.js +++ b/apps/weatherClock/app.js @@ -3,7 +3,7 @@ const storage = require('Storage'); const locale = require("locale"); const SETTINGS_FILE = "weatherClock.json"; let settings; -const weather = require('weather'); +const weather = require('weatherClock'); // weather icons from https://icons8.com/icon/set/weather/color function getSun() { @@ -152,7 +152,7 @@ function loadSettings() { loadSettings(); function weatherIcon(code) { - var ovr = Graphics.createArrayBuffer(48,56,1,{msb:true}); + var ovr = Graphics.createArrayBuffer(50,50,1,{msb:true}); if (typeof code == "number") weather.drawIcon({code:code},24,24,24,ovr); if (typeof code == "string") weather.drawIcon({code},24,24,24,ovr); var img = ovr.asImage(); diff --git a/apps/weatherClock/lib.js b/apps/weatherClock/lib.js new file mode 100644 index 000000000..14ca77ec6 --- /dev/null +++ b/apps/weatherClock/lib.js @@ -0,0 +1,399 @@ +const storage = require('Storage'); +const B2 = process.env.HWVERSION===2; + +let expiryTimeout; +function scheduleExpiry(json) { + if (expiryTimeout) { + clearTimeout(expiryTimeout); + expiryTimeout = undefined; + } + let expiry = "expiry" in json ? json.expiry : 2*3600000; + if (json.weather && json.weather.time && expiry) { + let t = json.weather.time + expiry - Date.now(); + expiryTimeout = setTimeout(update, t); + } +} + +function update(weatherEvent) { + let json = storage.readJSON('weather.json')||{}; + + if (weatherEvent) { + let weather = weatherEvent.clone(); + delete weather.t; + weather.time = Date.now(); + if (weather.wdir != null) { + // Convert numeric direction into human-readable label + let deg = weather.wdir; + while (deg<0 || deg>360) { + deg = (deg+360)%360; + } + weather.wrose = ['n','ne','e','se','s','sw','w','nw','n'][Math.floor((deg+22.5)/45)]; + } + + json.weather = weather; + } + else { + delete json.weather; + } + + storage.write('weather.json', json); + scheduleExpiry(json); + exports.emit("update", json.weather); +} + +const _GB = global.GB; +global.GB = (event) => { + if (event.t==="weather") update(event); + if (_GB) setTimeout(_GB, 0, event); +}; + +exports.get = function() { + return (storage.readJSON('weather.json')||{}).weather; +} + +scheduleExpiry(storage.readJSON('weather.json')||{}); + +function getPalette(monochrome, ovr) { + var palette; + if(monochrome) { + palette = { + sun: '#FFF', + cloud: '#FFF', + bgCloud: '#FFF', + rain: '#FFF', + lightning: '#FFF', + snow: '#FFF', + mist: '#FFF', + background: '#000' + }; + } else { + if (B2) { + if (ovr.theme.dark) { + palette = { + sun: '#FF0', + cloud: '#FFF', + bgCloud: '#777', // dithers on B2, but that's ok + rain: '#0FF', + lightning: '#FF0', + snow: '#FFF', + mist: '#FFF' + }; + } else { + palette = { + sun: '#FF0', + cloud: '#777', // dithers on B2, but that's ok + bgCloud: '#000', + rain: '#00F', + lightning: '#FF0', + snow: '#0FF', + mist: '#0FF' + }; + } + } else { + if (ovr.theme.dark) { + palette = { + sun: '#FE0', + cloud: '#BBB', + bgCloud: '#777', + rain: '#0CF', + lightning: '#FE0', + snow: '#FFF', + mist: '#FFF' + }; + } else { + palette = { + sun: '#FC0', + cloud: '#000', + bgCloud: '#777', + rain: '#07F', + lightning: '#FC0', + snow: '#CCC', + mist: '#CCC' + }; + } + } + } + return palette; +} + +exports.getColor = function(code) { + const codeGroup = Math.round(code / 100); + const palette = getPalette(0, g); + const cloud = g.blendColor(palette.cloud, palette.bgCloud, .5); //theme independent + switch (codeGroup) { + case 2: return g.blendColor(cloud, palette.lightning, .5); + case 3: return palette.rain; + case 5: + switch (code) { + case 511: return palette.snow; + case 520: return g.blendColor(palette.rain, palette.sun, .5); + case 521: return g.blendColor(palette.rain, palette.sun, .5); + case 522: return g.blendColor(palette.rain, palette.sun, .5); + case 531: return g.blendColor(palette.rain, palette.sun, .5); + default: return palette.rain; + } + case 6: return palette.snow; + case 7: return palette.mist; + case 8: + switch (code) { + case 800: return palette.sun; + case 801: return palette.sun; + case 802: return cloud; + default: return cloud; + } + default: return cloud; + } +} + +/** + * + * @param cond Weather condition, as one of: + * {number} code: (Preferred form) https://openweathermap.org/weather-conditions#Weather-Condition-Codes-2 + * {string} weather description (in English: breaks for other languages!) + * {object} use cond.code if present, or fall back to cond.txt + * @param x Left + * @param y Top + * @param r Icon Size + * @param ovr Graphics instance (or undefined for g) + */ +exports.drawIcon = function(cond, x, y, r, ovr) { + var palette; + var monochrome=1; + if(!ovr) { + ovr = g; + monochrome=0; + } + + palette = getPalette(monochrome, ovr); + + function drawSun(x, y, r) { + ovr.setColor(palette.sun); + ovr.fillCircle(x, y, r); + } + + function drawCloud(x, y, r, c) { + const u = r/12; + if (c==null) c = palette.cloud; + ovr.setColor(c); + ovr.fillCircle(x-8*u, y+3*u, 4*u); + ovr.fillCircle(x-4*u, y-2*u, 5*u); + ovr.fillCircle(x+4*u, y+0*u, 4*u); + ovr.fillCircle(x+9*u, y+4*u, 3*u); + ovr.fillPoly([ + x-8*u, y+7*u, + x-8*u, y+3*u, + x-4*u, y-2*u, + x+4*u, y+0*u, + x+9*u, y+4*u, + x+9*u, y+7*u, + ]); + } + + function drawBrokenClouds(x, y, r) { + drawCloud(x+1/8*r, y-1/8*r, 7/8*r, palette.bgCloud); + if(monochrome) + drawCloud(x-1/8*r, y+2/16*r, r, palette.background); + drawCloud(x-1/8*r, y+1/8*r, 7/8*r); + } + + function drawFewClouds(x, y, r) { + drawSun(x+3/8*r, y-1/8*r, 5/8*r); + if(monochrome) + drawCloud(x-1/8*r, y+2/16*r, r, palette.background); + drawCloud(x-1/8*r, y+1/8*r, 7/8*r); + } + + function drawRainLines(x, y, r) { + ovr.setColor(palette.rain); + const y1 = y+1/2*r; + const y2 = y+1*r; + const poly = ovr.fillPolyAA ? p => ovr.fillPolyAA(p) : p => ovr.fillPoly(p); + poly([ + x-6/12*r, y1, + x-8/12*r, y2, + x-7/12*r, y2, + x-5/12*r, y1, + ]); + poly([ + x-2/12*r, y1, + x-4/12*r, y2, + x-3/12*r, y2, + x-1/12*r, y1, + ]); + poly([ + x+2/12*r, y1, + x+0/12*r, y2, + x+1/12*r, y2, + x+3/12*r, y1, + ]); + } + + function drawShowerRain(x, y, r) { + drawFewClouds(x, y-1/3*r, r); + drawRainLines(x, y, r); + } + + function drawRain(x, y, r) { + drawBrokenClouds(x, y-1/3*r, r); + drawRainLines(x, y, r); + } + + function drawThunderstorm(x, y, r) { + function drawLightning(x, y, r) { + ovr.setColor(palette.lightning); + ovr.fillPoly([ + x-2/6*r, y-r, + x-4/6*r, y+1/6*r, + x-1/6*r, y+1/6*r, + x-3/6*r, y+1*r, + x+3/6*r, y-1/6*r, + x+0/6*r, y-1/6*r, + x+3/6*r, y-r, + ]); + } + + if(monochrome) drawBrokenClouds(x, y-1/3*r, r); + drawLightning(x-1/12*r, y+1/2*r, 1/2*r); + drawBrokenClouds(x, y-1/3*r, r); + } + + function drawSnow(x, y, r) { + function rotatePoints(points, pivotX, pivotY, angle) { + for(let i = 0; i {}; + txt = txt.toLowerCase(); + if (txt.includes("thunderstorm")) return drawThunderstorm; + if (txt.includes("freezing")||txt.includes("snow")|| + txt.includes("sleet")) { + return drawSnow; + } + if (txt.includes("drizzle")|| + txt.includes("shower")) { + return drawRain; + } + if (txt.includes("rain")) return drawShowerRain; + if (txt.includes("clear")) return drawSun; + if (txt.includes("few clouds")) return drawFewClouds; + if (txt.includes("scattered clouds")) return drawCloud; + if (txt.includes("clouds")) return drawBrokenClouds; + if (txt.includes("mist") || + txt.includes("smoke") || + txt.includes("haze") || + txt.includes("sand") || + txt.includes("dust") || + txt.includes("fog") || + txt.includes("ash") || + txt.includes("squalls") || + txt.includes("tornado")) { + return drawMist; + } + return drawUnknown; + } + + /* + * Choose weather icon to display based on weather conditition code + * https://openweathermap.org/weather-conditions#Weather-Condition-Codes-2 + */ + function chooseIconByCode(code) { + const codeGroup = Math.round(code / 100); + switch (codeGroup) { + case 2: return drawThunderstorm; + case 3: return drawRain; + case 5: + switch (code) { + case 511: return drawSnow; + case 520: return drawShowerRain; + case 521: return drawShowerRain; + case 522: return drawShowerRain; + case 531: return drawShowerRain; + default: return drawRain; + } + case 6: return drawSnow; + case 7: return drawMist; + case 8: + switch (code) { + case 800: return drawSun; + case 801: return drawFewClouds; + case 802: return drawCloud; + default: return drawBrokenClouds; + } + default: return drawUnknown; + } + } + + function chooseIcon(cond) { + if (typeof (cond)==="object") { + if ("code" in cond) return chooseIconByCode(cond.code); + if ("txt" in cond) return chooseIconByTxt(cond.txt); + } else if (typeof (cond)==="number") { + return chooseIconByCode(cond.code); + } else if (typeof (cond)==="string") { + return chooseIconByTxt(cond.txt); + } + return drawUnknown; + } + chooseIcon(cond)(x, y, r); + +}; diff --git a/apps/weatherClock/metadata.json b/apps/weatherClock/metadata.json index 270591c74..4addc67ac 100644 --- a/apps/weatherClock/metadata.json +++ b/apps/weatherClock/metadata.json @@ -15,7 +15,8 @@ "storage": [ {"name":"weatherClock.app.js","url":"app.js"}, {"name":"weatherClock.img","url":"app-icon.js","evaluate":true}, - {"name":"weatherClock.settings.js","url":"settings.js"} + {"name":"weatherClock.settings.js","url":"settings.js"}, + {"name":"weatherClock","url":"lib.js"} ], "data": [{"name":"weatherClock.json"}] } From fb88b185af5de12ab07e7388082f015096cb0c2d Mon Sep 17 00:00:00 2001 From: lunctis-viribus Date: Mon, 27 Feb 2023 20:16:44 +0100 Subject: [PATCH 21/29] weatherclock v0.06 --- apps/weatherClock/ChangeLog | 2 +- apps/weatherClock/lib.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/weatherClock/ChangeLog b/apps/weatherClock/ChangeLog index 4f66ce437..37ce11ab7 100644 --- a/apps/weatherClock/ChangeLog +++ b/apps/weatherClock/ChangeLog @@ -3,4 +3,4 @@ 0.03: Minor layout extra spaces. 0.04: Layout now compatible with Bangle.js 2. 0.05: Use weather condition code for icon selection. -0.06: Dev11-New settings to optionally hide elements. Images placed into functions for performance. +0.06: Dev12-New settings to optionally hide elements. Images placed into functions for performance. diff --git a/apps/weatherClock/lib.js b/apps/weatherClock/lib.js index 14ca77ec6..48a290824 100644 --- a/apps/weatherClock/lib.js +++ b/apps/weatherClock/lib.js @@ -158,7 +158,7 @@ exports.getColor = function(code) { */ exports.drawIcon = function(cond, x, y, r, ovr) { var palette; - var monochrome=1; + var monochrome=0; if(!ovr) { ovr = g; monochrome=0; From 97a6beab55fd1937dbe51f775da61662838d4e6b Mon Sep 17 00:00:00 2001 From: lunctis-viribus Date: Mon, 27 Feb 2023 20:18:19 +0100 Subject: [PATCH 22/29] weatherclock v0.06 --- apps/weatherClock/ChangeLog | 2 +- apps/weatherClock/app.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/weatherClock/ChangeLog b/apps/weatherClock/ChangeLog index 37ce11ab7..ceb5a7e1c 100644 --- a/apps/weatherClock/ChangeLog +++ b/apps/weatherClock/ChangeLog @@ -3,4 +3,4 @@ 0.03: Minor layout extra spaces. 0.04: Layout now compatible with Bangle.js 2. 0.05: Use weather condition code for icon selection. -0.06: Dev12-New settings to optionally hide elements. Images placed into functions for performance. +0.06: Dev13-New settings to optionally hide elements. Images placed into functions for performance. diff --git a/apps/weatherClock/app.js b/apps/weatherClock/app.js index f57d0fd80..e7bfe5220 100644 --- a/apps/weatherClock/app.js +++ b/apps/weatherClock/app.js @@ -152,7 +152,7 @@ function loadSettings() { loadSettings(); function weatherIcon(code) { - var ovr = Graphics.createArrayBuffer(50,50,1,{msb:true}); + var ovr = Graphics.createArrayBuffer(50,50,8,{msb:true}); if (typeof code == "number") weather.drawIcon({code:code},24,24,24,ovr); if (typeof code == "string") weather.drawIcon({code},24,24,24,ovr); var img = ovr.asImage(); From 5ca69aa0a44f33664b0f437b50b5c1c9f74da20a Mon Sep 17 00:00:00 2001 From: lunctis-viribus Date: Mon, 27 Feb 2023 21:38:14 +0100 Subject: [PATCH 23/29] weatherclock v0.06 --- apps/weather/lib.js | 4 +- apps/weatherClock/ChangeLog | 2 +- apps/weatherClock/app.js | 124 +++++----- apps/weatherClock/lib.js | 399 -------------------------------- apps/weatherClock/metadata.json | 3 +- apps/weatherClock/settings.js | 40 ++-- 6 files changed, 87 insertions(+), 485 deletions(-) delete mode 100644 apps/weatherClock/lib.js diff --git a/apps/weather/lib.js b/apps/weather/lib.js index 14ca77ec6..3d5fe44fd 100644 --- a/apps/weather/lib.js +++ b/apps/weather/lib.js @@ -158,10 +158,10 @@ exports.getColor = function(code) { */ exports.drawIcon = function(cond, x, y, r, ovr) { var palette; - var monochrome=1; + var monochrome = B2 ? 0 : 1; if(!ovr) { ovr = g; - monochrome=0; + monochrome = 0; } palette = getPalette(monochrome, ovr); diff --git a/apps/weatherClock/ChangeLog b/apps/weatherClock/ChangeLog index ceb5a7e1c..4c32f4a6c 100644 --- a/apps/weatherClock/ChangeLog +++ b/apps/weatherClock/ChangeLog @@ -3,4 +3,4 @@ 0.03: Minor layout extra spaces. 0.04: Layout now compatible with Bangle.js 2. 0.05: Use weather condition code for icon selection. -0.06: Dev13-New settings to optionally hide elements. Images placed into functions for performance. +0.06: Dev15-New settings to optionally hide elements. Images placed into functions for performance. diff --git a/apps/weatherClock/app.js b/apps/weatherClock/app.js index e7bfe5220..ff467cc53 100644 --- a/apps/weatherClock/app.js +++ b/apps/weatherClock/app.js @@ -2,8 +2,8 @@ const Layout = require("Layout"); const storage = require('Storage'); const locale = require("locale"); const SETTINGS_FILE = "weatherClock.json"; -let settings; -const weather = require('weatherClock'); +let s; +const w = require('weather'); // weather icons from https://icons8.com/icon/set/weather/color function getSun() { @@ -39,30 +39,28 @@ sent from gadget bridge. */ function chooseIcon(condition) { condition = condition.toLowerCase(); - if (condition.includes("thunderstorm")) return getStorm; + if (condition.includes("thunderstorm")|| + condition.includes("squalls")|| + condition.includes("tornado")) return getStorm; if (condition.includes("freezing")||condition.includes("snow")|| condition.includes("sleet")) { return getSnow; } if (condition.includes("drizzle")|| - condition.includes("shower")) { - return getRain; - } - if (condition.includes("rain")) return getRain; + condition.includes("shower")|| + condition.includes("rain")) return getRain; if (condition.includes("clear")) return getSun; - if (condition.includes("few clouds")) return getPartSun; - if (condition.includes("scattered clouds")) return getCloud; if (condition.includes("clouds")) return getCloud; - if (condition.includes("mist") || - condition.includes("smoke") || - condition.includes("haze") || - condition.includes("sand") || - condition.includes("dust") || - condition.includes("fog") || - condition.includes("ash") || - condition.includes("squalls") || - condition.includes("tornado")) { - return getCloud; + if (condition.includes("few clouds")|| + condition.includes("scattered clouds")|| + condition.includes("mist")|| + condition.includes("smoke")|| + condition.includes("haze")|| + condition.includes("sand")|| + condition.includes("dust")|| + condition.includes("fog")|| + condition.includes("ash")) { + return getPartSun; } return getCloud; } @@ -76,14 +74,18 @@ function chooseIconByCode(code) { switch (codeGroup) { case 2: return getStorm; case 3: return getRain; - case 5: return getRain; + case 5: + switch (code) { + case 511: return getSnow; + default: return getRain; + } case 6: return getSnow; - case 7: return getCloud; + case 7: return getPartSun; case 8: switch (code) { - case 800: return getSun; - case 801: return getPartSun; - default: return getCloud; + case 800: return getSun; + case 804: return getCloud; + default: return getPartSun; } default: return getCloud; } @@ -111,62 +113,62 @@ function queueDraw() { function draw() { var date = new Date(); - clockLayout.time.label = locale.time(date, 1); - clockLayout.date.label = settings.date ? locale.date(date, 1).toUpperCase() : ""; - clockLayout.dow.label = settings.day ? locale.dow(date, 1).toUpperCase() + " " : ""; - let current = weather.get(); - if(current){ - const temp = locale.temp(current.temp-273.15).match(/^(\D*\d*)(.*)$/); - clockLayout.temp.label = temp[1] + " " + temp[2]; - const code = current.code || -1; + cLayout.time.label = locale.time(date, 1); + cLayout.dow.label = s.day ? locale.dow(date, 1).toUpperCase() + " " : ""; + cLayout.date.label = s.date ? locale.date(date, 1).toUpperCase() : ""; + let curr = w.get(); // Get weather from weather app. + if(curr){ + const temp = locale.temp(curr.temp-273.15).match(/^(\D*\d*)(.*)$/); + cLayout.temp.label = temp[1] + " " + temp[2]; + const code = curr.code || -1; if (code > 0) { - let srcIconsCode = settings.src ? weatherIcon(current.code) : chooseIconByCode(current.code); - clockLayout.weatherIcon.src = settings.icon ? srcIconsCode : getDummy; + let showIconC = s.src ? wDrawIcon(curr.code) : chooseIconByCode(curr.code); + cLayout.wIcon.src = s.icon ? showIconC : getDummy; } else { - let srcIconsTxt = settings.src ? weatherIcon(current.txt) : chooseIcon(current.txt); - clockLayout.weatherIcon.src = settings.icon ? srcIconsTxt : getDummy; + let showIconT = s.src ? wDrawIcon(curr.txt) : chooseIcon(curr.txt); + cLayout.wIcon.src = s.icon ? showIconT : getDummy; } - const wind = locale.speed(current.wind).match(/^(\D*\d*)(.*)$/); - clockLayout.wind.label = wind[1] + " " + wind[2] + " " + (current.wrose||'').toUpperCase(); + const wind = locale.speed(curr.wind).match(/^(\D*\d*)(.*)$/); + cLayout.wind.label = wind[1] + " " + wind[2] + " " + (curr.wrose||'').toUpperCase(); } else{ - clockLayout.temp.label = "Err"; - clockLayout.wind.label = "No Data"; - clockLayout.weatherIcon.src = settings.icon ? getErr : getDummy; + cLayout.temp.label = "Err"; + cLayout.wind.label = "No Data"; + cLayout.wIcon.src = s.icon ? getErr : getDummy; } - clockLayout.clear(); - clockLayout.render(); + cLayout.clear(); + cLayout.render(); // queue draw in one minute queueDraw(); } function loadSettings() { - settings = storage.readJSON(SETTINGS_FILE,1)||{}; - settings.src = settings.src === undefined ? false : settings.src; - settings.icon = settings.icon === undefined ? true : settings.icon; - settings.day = settings.day === undefined ? true : settings.day; - settings.date = settings.date === undefined ? true : settings.date; - settings.wind = settings.wind === undefined ? true : settings.wind; + s = storage.readJSON(SETTINGS_FILE,1)||{}; + s.src = s.src === undefined ? false : s.src; + s.icon = s.icon === undefined ? true : s.icon; + s.day = s.day === undefined ? true : s.day; + s.date = s.date === undefined ? true : s.date; + s.wind = s.wind === undefined ? true : s.wind; } loadSettings(); -function weatherIcon(code) { +function wDrawIcon(code) { var ovr = Graphics.createArrayBuffer(50,50,8,{msb:true}); - if (typeof code == "number") weather.drawIcon({code:code},24,24,24,ovr); - if (typeof code == "string") weather.drawIcon({code},24,24,24,ovr); + if (typeof code == "number") w.drawIcon({code:code},24,24,24,ovr); + if (typeof code == "string") w.drawIcon({txt:code},24,24,24,ovr); var img = ovr.asImage(); img.transparent = 0; return img; } -let srcIcons = settings.src ? weatherIcon(800) : getSun; -let srcWeather = settings.icon ? srcIcons : getDummy; -let fontTemp = settings.wind ? "10%" : "20%"; -let fontWind = settings.wind ? "10%" : "0%"; -let labelDay = settings.day ? "THU" : ""; -let labelDate = settings.date ? "01/01/1970" : ""; -var clockLayout = new Layout( { +let srcIcons = s.src ? wDrawIcon(800) : getSun; +let srcWeather = s.icon ? srcIcons : getDummy; +let fontTemp = s.wind ? "10%" : "20%"; +let fontWind = s.wind ? "10%" : "0%"; +let labelDay = s.day ? "THU" : ""; +let labelDate = s.date ? "01/01/1970" : ""; +var cLayout = new Layout( { type:"v", c: [ {type:"txt", font:"35%", halign: 0, fillx:1, pad: 8, label:"00:00", id:"time" }, {type: "h", fillx: 1, c: [ @@ -177,7 +179,7 @@ var clockLayout = new Layout( { ] }, {type: "h", valign : 1, fillx:1, c: [ - {type: "img", filly: 1, pad: 8, id: "weatherIcon", src: srcWeather}, + {type: "img", filly: 1, pad: 8, id: "wIcon", src: srcWeather}, {type: "v", fillx:1, c: [ {type: "h", c: [ {type: "txt", font: fontTemp, id: "temp", label: "000 °C"}, @@ -194,5 +196,5 @@ g.clear(); Bangle.setUI("clock"); // Show launcher when middle button pressed Bangle.loadWidgets(); Bangle.drawWidgets(); -clockLayout.render(); +cLayout.render(); draw(); diff --git a/apps/weatherClock/lib.js b/apps/weatherClock/lib.js deleted file mode 100644 index 48a290824..000000000 --- a/apps/weatherClock/lib.js +++ /dev/null @@ -1,399 +0,0 @@ -const storage = require('Storage'); -const B2 = process.env.HWVERSION===2; - -let expiryTimeout; -function scheduleExpiry(json) { - if (expiryTimeout) { - clearTimeout(expiryTimeout); - expiryTimeout = undefined; - } - let expiry = "expiry" in json ? json.expiry : 2*3600000; - if (json.weather && json.weather.time && expiry) { - let t = json.weather.time + expiry - Date.now(); - expiryTimeout = setTimeout(update, t); - } -} - -function update(weatherEvent) { - let json = storage.readJSON('weather.json')||{}; - - if (weatherEvent) { - let weather = weatherEvent.clone(); - delete weather.t; - weather.time = Date.now(); - if (weather.wdir != null) { - // Convert numeric direction into human-readable label - let deg = weather.wdir; - while (deg<0 || deg>360) { - deg = (deg+360)%360; - } - weather.wrose = ['n','ne','e','se','s','sw','w','nw','n'][Math.floor((deg+22.5)/45)]; - } - - json.weather = weather; - } - else { - delete json.weather; - } - - storage.write('weather.json', json); - scheduleExpiry(json); - exports.emit("update", json.weather); -} - -const _GB = global.GB; -global.GB = (event) => { - if (event.t==="weather") update(event); - if (_GB) setTimeout(_GB, 0, event); -}; - -exports.get = function() { - return (storage.readJSON('weather.json')||{}).weather; -} - -scheduleExpiry(storage.readJSON('weather.json')||{}); - -function getPalette(monochrome, ovr) { - var palette; - if(monochrome) { - palette = { - sun: '#FFF', - cloud: '#FFF', - bgCloud: '#FFF', - rain: '#FFF', - lightning: '#FFF', - snow: '#FFF', - mist: '#FFF', - background: '#000' - }; - } else { - if (B2) { - if (ovr.theme.dark) { - palette = { - sun: '#FF0', - cloud: '#FFF', - bgCloud: '#777', // dithers on B2, but that's ok - rain: '#0FF', - lightning: '#FF0', - snow: '#FFF', - mist: '#FFF' - }; - } else { - palette = { - sun: '#FF0', - cloud: '#777', // dithers on B2, but that's ok - bgCloud: '#000', - rain: '#00F', - lightning: '#FF0', - snow: '#0FF', - mist: '#0FF' - }; - } - } else { - if (ovr.theme.dark) { - palette = { - sun: '#FE0', - cloud: '#BBB', - bgCloud: '#777', - rain: '#0CF', - lightning: '#FE0', - snow: '#FFF', - mist: '#FFF' - }; - } else { - palette = { - sun: '#FC0', - cloud: '#000', - bgCloud: '#777', - rain: '#07F', - lightning: '#FC0', - snow: '#CCC', - mist: '#CCC' - }; - } - } - } - return palette; -} - -exports.getColor = function(code) { - const codeGroup = Math.round(code / 100); - const palette = getPalette(0, g); - const cloud = g.blendColor(palette.cloud, palette.bgCloud, .5); //theme independent - switch (codeGroup) { - case 2: return g.blendColor(cloud, palette.lightning, .5); - case 3: return palette.rain; - case 5: - switch (code) { - case 511: return palette.snow; - case 520: return g.blendColor(palette.rain, palette.sun, .5); - case 521: return g.blendColor(palette.rain, palette.sun, .5); - case 522: return g.blendColor(palette.rain, palette.sun, .5); - case 531: return g.blendColor(palette.rain, palette.sun, .5); - default: return palette.rain; - } - case 6: return palette.snow; - case 7: return palette.mist; - case 8: - switch (code) { - case 800: return palette.sun; - case 801: return palette.sun; - case 802: return cloud; - default: return cloud; - } - default: return cloud; - } -} - -/** - * - * @param cond Weather condition, as one of: - * {number} code: (Preferred form) https://openweathermap.org/weather-conditions#Weather-Condition-Codes-2 - * {string} weather description (in English: breaks for other languages!) - * {object} use cond.code if present, or fall back to cond.txt - * @param x Left - * @param y Top - * @param r Icon Size - * @param ovr Graphics instance (or undefined for g) - */ -exports.drawIcon = function(cond, x, y, r, ovr) { - var palette; - var monochrome=0; - if(!ovr) { - ovr = g; - monochrome=0; - } - - palette = getPalette(monochrome, ovr); - - function drawSun(x, y, r) { - ovr.setColor(palette.sun); - ovr.fillCircle(x, y, r); - } - - function drawCloud(x, y, r, c) { - const u = r/12; - if (c==null) c = palette.cloud; - ovr.setColor(c); - ovr.fillCircle(x-8*u, y+3*u, 4*u); - ovr.fillCircle(x-4*u, y-2*u, 5*u); - ovr.fillCircle(x+4*u, y+0*u, 4*u); - ovr.fillCircle(x+9*u, y+4*u, 3*u); - ovr.fillPoly([ - x-8*u, y+7*u, - x-8*u, y+3*u, - x-4*u, y-2*u, - x+4*u, y+0*u, - x+9*u, y+4*u, - x+9*u, y+7*u, - ]); - } - - function drawBrokenClouds(x, y, r) { - drawCloud(x+1/8*r, y-1/8*r, 7/8*r, palette.bgCloud); - if(monochrome) - drawCloud(x-1/8*r, y+2/16*r, r, palette.background); - drawCloud(x-1/8*r, y+1/8*r, 7/8*r); - } - - function drawFewClouds(x, y, r) { - drawSun(x+3/8*r, y-1/8*r, 5/8*r); - if(monochrome) - drawCloud(x-1/8*r, y+2/16*r, r, palette.background); - drawCloud(x-1/8*r, y+1/8*r, 7/8*r); - } - - function drawRainLines(x, y, r) { - ovr.setColor(palette.rain); - const y1 = y+1/2*r; - const y2 = y+1*r; - const poly = ovr.fillPolyAA ? p => ovr.fillPolyAA(p) : p => ovr.fillPoly(p); - poly([ - x-6/12*r, y1, - x-8/12*r, y2, - x-7/12*r, y2, - x-5/12*r, y1, - ]); - poly([ - x-2/12*r, y1, - x-4/12*r, y2, - x-3/12*r, y2, - x-1/12*r, y1, - ]); - poly([ - x+2/12*r, y1, - x+0/12*r, y2, - x+1/12*r, y2, - x+3/12*r, y1, - ]); - } - - function drawShowerRain(x, y, r) { - drawFewClouds(x, y-1/3*r, r); - drawRainLines(x, y, r); - } - - function drawRain(x, y, r) { - drawBrokenClouds(x, y-1/3*r, r); - drawRainLines(x, y, r); - } - - function drawThunderstorm(x, y, r) { - function drawLightning(x, y, r) { - ovr.setColor(palette.lightning); - ovr.fillPoly([ - x-2/6*r, y-r, - x-4/6*r, y+1/6*r, - x-1/6*r, y+1/6*r, - x-3/6*r, y+1*r, - x+3/6*r, y-1/6*r, - x+0/6*r, y-1/6*r, - x+3/6*r, y-r, - ]); - } - - if(monochrome) drawBrokenClouds(x, y-1/3*r, r); - drawLightning(x-1/12*r, y+1/2*r, 1/2*r); - drawBrokenClouds(x, y-1/3*r, r); - } - - function drawSnow(x, y, r) { - function rotatePoints(points, pivotX, pivotY, angle) { - for(let i = 0; i {}; - txt = txt.toLowerCase(); - if (txt.includes("thunderstorm")) return drawThunderstorm; - if (txt.includes("freezing")||txt.includes("snow")|| - txt.includes("sleet")) { - return drawSnow; - } - if (txt.includes("drizzle")|| - txt.includes("shower")) { - return drawRain; - } - if (txt.includes("rain")) return drawShowerRain; - if (txt.includes("clear")) return drawSun; - if (txt.includes("few clouds")) return drawFewClouds; - if (txt.includes("scattered clouds")) return drawCloud; - if (txt.includes("clouds")) return drawBrokenClouds; - if (txt.includes("mist") || - txt.includes("smoke") || - txt.includes("haze") || - txt.includes("sand") || - txt.includes("dust") || - txt.includes("fog") || - txt.includes("ash") || - txt.includes("squalls") || - txt.includes("tornado")) { - return drawMist; - } - return drawUnknown; - } - - /* - * Choose weather icon to display based on weather conditition code - * https://openweathermap.org/weather-conditions#Weather-Condition-Codes-2 - */ - function chooseIconByCode(code) { - const codeGroup = Math.round(code / 100); - switch (codeGroup) { - case 2: return drawThunderstorm; - case 3: return drawRain; - case 5: - switch (code) { - case 511: return drawSnow; - case 520: return drawShowerRain; - case 521: return drawShowerRain; - case 522: return drawShowerRain; - case 531: return drawShowerRain; - default: return drawRain; - } - case 6: return drawSnow; - case 7: return drawMist; - case 8: - switch (code) { - case 800: return drawSun; - case 801: return drawFewClouds; - case 802: return drawCloud; - default: return drawBrokenClouds; - } - default: return drawUnknown; - } - } - - function chooseIcon(cond) { - if (typeof (cond)==="object") { - if ("code" in cond) return chooseIconByCode(cond.code); - if ("txt" in cond) return chooseIconByTxt(cond.txt); - } else if (typeof (cond)==="number") { - return chooseIconByCode(cond.code); - } else if (typeof (cond)==="string") { - return chooseIconByTxt(cond.txt); - } - return drawUnknown; - } - chooseIcon(cond)(x, y, r); - -}; diff --git a/apps/weatherClock/metadata.json b/apps/weatherClock/metadata.json index 4addc67ac..270591c74 100644 --- a/apps/weatherClock/metadata.json +++ b/apps/weatherClock/metadata.json @@ -15,8 +15,7 @@ "storage": [ {"name":"weatherClock.app.js","url":"app.js"}, {"name":"weatherClock.img","url":"app-icon.js","evaluate":true}, - {"name":"weatherClock.settings.js","url":"settings.js"}, - {"name":"weatherClock","url":"lib.js"} + {"name":"weatherClock.settings.js","url":"settings.js"} ], "data": [{"name":"weatherClock.json"}] } diff --git a/apps/weatherClock/settings.js b/apps/weatherClock/settings.js index bc4544b31..0aa7330c1 100644 --- a/apps/weatherClock/settings.js +++ b/apps/weatherClock/settings.js @@ -5,11 +5,11 @@ const storage = require('Storage'); let settings = storage.readJSON(SETTINGS_FILE, 1) || {}; let s = {}; - s.src = (settings.src === undefined ? false : settings.src); - s.icon = (settings.icon === undefined ? true : settings.icon); - s.day = (settings.day === undefined ? true : settings.day); s.date = (settings.date === undefined ? true : settings.date); + s.day = (settings.day === undefined ? true : settings.day); + s.icon = (settings.icon === undefined ? true : settings.icon); s.wind = (settings.wind === undefined ? true : settings.wind); + s.src = (settings.src === undefined ? false : settings.src); function save() { settings = s @@ -19,35 +19,35 @@ E.showMenu({ '': { 'title': 'Weather Clock' }, '< Back': back, - 'Weather Icon': { - value: !!s.icon, - onchange: v => { - s.icon = v; - save(); - }, - }, - 'Day Of Week': { - value: !!s.day, - onchange: v => { - s.day = v; - save(); - }, - }, - 'Date': { + 'Show date': { value: !!s.date, onchange: v => { s.date = v; save(); }, }, - 'Wind Speed': { + 'Show day Of Week': { + value: !!s.day, + onchange: v => { + s.day = v; + save(); + }, + }, + 'Show weather Icon': { + value: !!s.icon, + onchange: v => { + s.icon = v; + save(); + }, + }, + 'Show wind Speed': { value: !!s.wind, onchange: v => { s.wind = v; save(); }, }, - 'Icons from weather app': { + 'Use weather app icons': { value: !!s.src, onchange: v => { s.src = v; From f8766bcd8411340df81f732e0d7ee8e3df3eb659 Mon Sep 17 00:00:00 2001 From: lunctis-viribus Date: Mon, 27 Feb 2023 21:43:20 +0100 Subject: [PATCH 24/29] weatherclock v0.06 --- apps/weatherClock/ChangeLog | 2 +- apps/weatherClock/app.js | 14 +++----------- 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/apps/weatherClock/ChangeLog b/apps/weatherClock/ChangeLog index 4c32f4a6c..98e4b4522 100644 --- a/apps/weatherClock/ChangeLog +++ b/apps/weatherClock/ChangeLog @@ -3,4 +3,4 @@ 0.03: Minor layout extra spaces. 0.04: Layout now compatible with Bangle.js 2. 0.05: Use weather condition code for icon selection. -0.06: Dev15-New settings to optionally hide elements. Images placed into functions for performance. +0.06: Dev16-New settings to optionally hide elements. Images placed into functions for performance. diff --git a/apps/weatherClock/app.js b/apps/weatherClock/app.js index ff467cc53..8396b19a8 100644 --- a/apps/weatherClock/app.js +++ b/apps/weatherClock/app.js @@ -48,7 +48,7 @@ function chooseIcon(condition) { } if (condition.includes("drizzle")|| condition.includes("shower")|| - condition.includes("rain")) return getRain; + condition.includes("rain")) return getRain; if (condition.includes("clear")) return getSun; if (condition.includes("clouds")) return getCloud; if (condition.includes("few clouds")|| @@ -75,7 +75,7 @@ function chooseIconByCode(code) { case 2: return getStorm; case 3: return getRain; case 5: - switch (code) { + switch (code) { case 511: return getSnow; default: return getRain; } @@ -83,7 +83,7 @@ function chooseIconByCode(code) { case 7: return getPartSun; case 8: switch (code) { - case 800: return getSun; + case 800: return getSun; case 804: return getCloud; default: return getPartSun; } @@ -91,14 +91,6 @@ function chooseIconByCode(code) { } } -/** -Get weather stored in json file by weather app. -*/ -function getWeather() { - let jsonWeather = storage.readJSON('weather.json'); - return jsonWeather; -} - // timeout used to update every minute var drawTimeout; From da4113467843423cda49f2224966252c1af70af4 Mon Sep 17 00:00:00 2001 From: lunctis-viribus Date: Mon, 27 Feb 2023 22:21:09 +0100 Subject: [PATCH 25/29] weatherclock v0.06 --- apps/weatherClock/ChangeLog | 2 +- apps/weatherClock/README.md | 6 +++--- apps/weatherClock/app.js | 17 +++++++---------- 3 files changed, 11 insertions(+), 14 deletions(-) diff --git a/apps/weatherClock/ChangeLog b/apps/weatherClock/ChangeLog index 98e4b4522..31b1d4993 100644 --- a/apps/weatherClock/ChangeLog +++ b/apps/weatherClock/ChangeLog @@ -3,4 +3,4 @@ 0.03: Minor layout extra spaces. 0.04: Layout now compatible with Bangle.js 2. 0.05: Use weather condition code for icon selection. -0.06: Dev16-New settings to optionally hide elements. Images placed into functions for performance. +0.06: Add settings menu to hide elements. Images placed into functions for performance. Use lib.js of weather app for drawing weather icons. WeatherClock icons now match weather conditions better. diff --git a/apps/weatherClock/README.md b/apps/weatherClock/README.md index c72a575ec..a7f44f7f7 100644 --- a/apps/weatherClock/README.md +++ b/apps/weatherClock/README.md @@ -1,14 +1,14 @@ # Weather Clock -A clock which displays the current weather conditions. Time, day of week, date, temperature, wind speed, and an icon indicating the weather conditions are displayed. +A clock which displays the current weather conditions. Time, day of week, date, temperature, wind speed, and an icon indicating the weather condition are displayed. -As of Weather Clock v0.06 the day of week, date, temperature and/or wind speed can be hidden using settings. +As of Weather Clock v0.06 the date, day of week, temperature, weather icon and/or wind speed can be hidden in Settings. The icons can be changed to those of the Weather app. Standard widgets are displayed. ## Requirements -**This clock requires Gadgetbridge and the weather app in order to get weather data!** +**This clock requires Gadgetbridge and the Weather app in order to get weather data!** See the [Bangle.js Gadgetbridge documentation](https://www.espruino.com/Gadgetbridge) for instructions on setting up Gadgetbridge and weather. diff --git a/apps/weatherClock/app.js b/apps/weatherClock/app.js index 8396b19a8..116fa3140 100644 --- a/apps/weatherClock/app.js +++ b/apps/weatherClock/app.js @@ -134,16 +134,13 @@ function draw() { queueDraw(); } -function loadSettings() { - s = storage.readJSON(SETTINGS_FILE,1)||{}; - s.src = s.src === undefined ? false : s.src; - s.icon = s.icon === undefined ? true : s.icon; - s.day = s.day === undefined ? true : s.day; - s.date = s.date === undefined ? true : s.date; - s.wind = s.wind === undefined ? true : s.wind; -} - -loadSettings(); +// Load settings from file +s = storage.readJSON(SETTINGS_FILE,1)||{}; +s.src = s.src === undefined ? false : s.src; +s.icon = s.icon === undefined ? true : s.icon; +s.day = s.day === undefined ? true : s.day; +s.date = s.date === undefined ? true : s.date; +s.wind = s.wind === undefined ? true : s.wind; function wDrawIcon(code) { var ovr = Graphics.createArrayBuffer(50,50,8,{msb:true}); From 6e4f6c69c06b92194cc3259b8fb18f60557c0bb6 Mon Sep 17 00:00:00 2001 From: lunctis-viribus Date: Tue, 28 Feb 2023 08:36:37 +0100 Subject: [PATCH 26/29] weatherclock v0.06 --- apps/weather/lib.js | 2 +- apps/weatherClock/ChangeLog | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/weather/lib.js b/apps/weather/lib.js index 3d5fe44fd..9bc8e0291 100644 --- a/apps/weather/lib.js +++ b/apps/weather/lib.js @@ -158,7 +158,7 @@ exports.getColor = function(code) { */ exports.drawIcon = function(cond, x, y, r, ovr) { var palette; - var monochrome = B2 ? 0 : 1; + var monochrome = 1; if(!ovr) { ovr = g; monochrome = 0; diff --git a/apps/weatherClock/ChangeLog b/apps/weatherClock/ChangeLog index 31b1d4993..75f1edfa4 100644 --- a/apps/weatherClock/ChangeLog +++ b/apps/weatherClock/ChangeLog @@ -3,4 +3,4 @@ 0.03: Minor layout extra spaces. 0.04: Layout now compatible with Bangle.js 2. 0.05: Use weather condition code for icon selection. -0.06: Add settings menu to hide elements. Images placed into functions for performance. Use lib.js of weather app for drawing weather icons. WeatherClock icons now match weather conditions better. +0.06: Dev-Add settings menu to hide elements. Images placed into functions for performance. Use lib.js of weather app for drawing weather icons. WeatherClock icons now match weather conditions better. From b163721777ede23efe417a9f7a295584577935e4 Mon Sep 17 00:00:00 2001 From: lunctis-viribus Date: Tue, 28 Feb 2023 17:57:51 +0100 Subject: [PATCH 27/29] weatherclock v0.06 --- apps/weatherClock/ChangeLog | 2 +- apps/weatherClock/app.js | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/apps/weatherClock/ChangeLog b/apps/weatherClock/ChangeLog index 75f1edfa4..f31e15729 100644 --- a/apps/weatherClock/ChangeLog +++ b/apps/weatherClock/ChangeLog @@ -3,4 +3,4 @@ 0.03: Minor layout extra spaces. 0.04: Layout now compatible with Bangle.js 2. 0.05: Use weather condition code for icon selection. -0.06: Dev-Add settings menu to hide elements. Images placed into functions for performance. Use lib.js of weather app for drawing weather icons. WeatherClock icons now match weather conditions better. +0.06: WeatherClock icons now reflect weather conditions better. Add settings menu to hide elements and to use weather icons of Weather app. Images placed into functions for performance. \ No newline at end of file diff --git a/apps/weatherClock/app.js b/apps/weatherClock/app.js index 116fa3140..4896a9f49 100644 --- a/apps/weatherClock/app.js +++ b/apps/weatherClock/app.js @@ -1,11 +1,11 @@ const Layout = require("Layout"); -const storage = require('Storage'); +const storage = require("Storage"); const locale = require("locale"); const SETTINGS_FILE = "weatherClock.json"; let s; -const w = require('weather'); +const w = require("weather"); -// weather icons from https://icons8.com/icon/set/weather/color +// Weather icons from https://icons8.com/icon/set/weather/color function getSun() { return require("heatshrink").decompress(atob("mEwwhC/AH4AbhvQC6vd7ouVC4IwUCwIwUFwQwQCYgAHDZQXc9wACC6QWDDAgXN7wXF9oXPCwowDC5guGGAYXMCw4wCC5RGJJAZGTJBiNISIylQVJrLCC5owGF65fXR7AwBC5jvhC7JIILxapDFxAXOGAy9KC4owGBAQXODAgHDC54AHC8T0FAAQSOGg4qPGA4WUGAIuVC7AA/AH4AEA=")); } @@ -91,10 +91,10 @@ function chooseIconByCode(code) { } } -// timeout used to update every minute +// Timeout used to update every minute var drawTimeout; -// schedule a draw for the next minute +// Schedule a draw for the next minute function queueDraw() { if (drawTimeout) clearTimeout(drawTimeout); drawTimeout = setTimeout(function() { @@ -121,7 +121,7 @@ function draw() { cLayout.wIcon.src = s.icon ? showIconT : getDummy; } const wind = locale.speed(curr.wind).match(/^(\D*\d*)(.*)$/); - cLayout.wind.label = wind[1] + " " + wind[2] + " " + (curr.wrose||'').toUpperCase(); + cLayout.wind.label = wind[1] + " " + wind[2] + " " + (curr.wrose||"").toUpperCase(); } else{ cLayout.temp.label = "Err"; @@ -130,7 +130,7 @@ function draw() { } cLayout.clear(); cLayout.render(); - // queue draw in one minute + // Queue draw in one minute queueDraw(); } From f7e8cc46e79ea3b0f268dbad83bf42b58cf1c382 Mon Sep 17 00:00:00 2001 From: lunctis-viribus Date: Tue, 28 Feb 2023 18:32:14 +0100 Subject: [PATCH 28/29] weatherclock v0.06 --- apps/weather/lib.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/weather/lib.js b/apps/weather/lib.js index 9bc8e0291..14ca77ec6 100644 --- a/apps/weather/lib.js +++ b/apps/weather/lib.js @@ -158,10 +158,10 @@ exports.getColor = function(code) { */ exports.drawIcon = function(cond, x, y, r, ovr) { var palette; - var monochrome = 1; + var monochrome=1; if(!ovr) { ovr = g; - monochrome = 0; + monochrome=0; } palette = getPalette(monochrome, ovr); From 77aeee9462c230439bc790fa0104ffab19d9718b Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 1 Mar 2023 08:40:56 +0000 Subject: [PATCH 29/29] Revert core change --- core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core b/core index 23854083e..0d02ff376 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit 23854083e0c3f83c649073a2d85e8079efc471d3 +Subproject commit 0d02ff3763783d166ff84906af038420736aabfc