From 3207c73b4f5acd866d2ccc50686790ac5715f162 Mon Sep 17 00:00:00 2001 From: Marco H Date: Tue, 12 Jul 2022 09:25:27 +0200 Subject: [PATCH 1/4] Alternative marker icon (configurable via settings) --- apps/widgps/ChangeLog | 1 + apps/widgps/README.md | 10 +++++++--- apps/widgps/default.json | 1 + apps/widgps/metadata.json | 11 ++++++++--- apps/widgps/settings.js | 28 ++++++++++++++++++++++++++ apps/widgps/widget.js | 41 +++++++++++++++++++++++++++------------ 6 files changed, 74 insertions(+), 18 deletions(-) create mode 100644 apps/widgps/default.json create mode 100644 apps/widgps/settings.js diff --git a/apps/widgps/ChangeLog b/apps/widgps/ChangeLog index 0eb9e5692..d4a569574 100644 --- a/apps/widgps/ChangeLog +++ b/apps/widgps/ChangeLog @@ -4,3 +4,4 @@ 0.04: Show GPS fix status 0.05: Don't poll for GPS status, override setGPSPower handler (fix #1456) 0.06: Periodically update so the always on display does show current GPS fix +0.07: Alternative marker icon (configurable via settings) diff --git a/apps/widgps/README.md b/apps/widgps/README.md index 37e088bcf..e9916fe80 100644 --- a/apps/widgps/README.md +++ b/apps/widgps/README.md @@ -6,12 +6,16 @@ The GPS can quickly run the battery down if it is on all the time so it is useful to know if it has been switched on or not. - Uses Bangle.isGPSOn() -- Shows in grey when the GPS is off -- Shows in amber when the GPS is on but has no fix -- Shows in green when the GPS is on and has a fix +There are two icons which can be used to visualize the GPS/GNSS status: +1. A cross colored depending on the GPS/GNSS status +2. Different place markers depending on GPS/GNSS status + + Written by: [Hugh Barney](https://github.com/hughbarney) For support and discussion please post in the [Bangle JS Forum](http://forum.espruino.com/microcosms/1424/) Extended by Marco ([myxor](https://github.com/myxor)) + +Place marker icons from [icons8.com](https://icons8.com/icon/set/maps/material-outlined). diff --git a/apps/widgps/default.json b/apps/widgps/default.json new file mode 100644 index 000000000..d1ab3f797 --- /dev/null +++ b/apps/widgps/default.json @@ -0,0 +1 @@ +{"crossIcon": "true"} diff --git a/apps/widgps/metadata.json b/apps/widgps/metadata.json index b135c77bd..144dd6cc6 100644 --- a/apps/widgps/metadata.json +++ b/apps/widgps/metadata.json @@ -1,14 +1,19 @@ { "id": "widgps", "name": "GPS Widget", - "version": "0.06", - "description": "Tiny widget to show the power and fix status of the GPS", + "version": "0.07", + "description": "Tiny widget to show the power and fix status of the GPS/GNSS", "icon": "widget.png", "type": "widget", "tags": "widget,gps", "supports": ["BANGLEJS","BANGLEJS2"], "readme": "README.md", "storage": [ - {"name":"widgps.wid.js","url":"widget.js"} + {"name":"widgps.wid.js","url":"widget.js"}, + {"name":"widgps.default.json","url":"default.json"}, + {"name":"widgps.settings.js","url":"settings.js"} + ], + "data": [ + {"name":"widgps.json"} ] } diff --git a/apps/widgps/settings.js b/apps/widgps/settings.js new file mode 100644 index 000000000..4cd9e0b83 --- /dev/null +++ b/apps/widgps/settings.js @@ -0,0 +1,28 @@ +(function(back) { +function writeSettings(key, value) { + var s = require('Storage').readJSON(FILE, true) || {}; + s[key] = value; + require('Storage').writeJSON(FILE, s); + readSettings(); +} + +function readSettings() { + settings = Object.assign( + require('Storage').readJSON("widgps.default.json", true) || {}, + require('Storage').readJSON(FILE, true) || {}); +} + +var FILE = "widgps.json"; +var settings; +readSettings(); + +var mainmenu = { + '' : {'title' : 'GPS widget'}, + '< Back' : back, + "Cross icon" : { + value : !!settings.crossIcon , + onchange : v => { writeSettings("crossIcon", v); } + }, +}; +E.showMenu(mainmenu); +}); diff --git a/apps/widgps/widget.js b/apps/widgps/widget.js index 206096013..0c9753bce 100644 --- a/apps/widgps/widget.js +++ b/apps/widgps/widget.js @@ -1,4 +1,8 @@ (function(){ + let settings = require("Storage").readJSON("widgps.json", 1) || { + crossIcon: true + }; + var interval; // override setGPSPower so we know if GPS is on or off @@ -7,20 +11,10 @@ var isGPSon = oldSetGPSPower(on,id); WIDGETS.gps.draw(); return isGPSon; - } + }; WIDGETS.gps={area:"tr",width:24,draw:function() { g.reset(); - if (Bangle.isGPSOn()) { - const gpsObject = Bangle.getGPSFix(); - if (gpsObject && gpsObject.fix > 0) { - g.setColor("#0F0"); // on and has fix = green - } else { - g.setColor("#FD0"); // on but no fix = amber - } - } else { - g.setColor("#888"); // off = grey - } // check if we need to update the widget periodically if (Bangle.isGPSOn() && interval === undefined) { @@ -31,6 +25,29 @@ clearInterval(interval); interval = undefined; } - g.drawImage(atob("GBiBAAAAAAAAAAAAAA//8B//+BgYGBgYGBgYGBgYGBgYGBgYGB//+B//+BgYGBgYGBgYGBgYGBgYGBgYGB//+A//8AAAAAAAAAAAAA=="), this.x, 2+this.y); + if (settings.crossIcon) { + if (Bangle.isGPSOn()) { + const gpsObject = Bangle.getGPSFix(); + if (gpsObject && gpsObject.fix > 0) { + g.setColor("#0F0"); // on and has fix = green + } else { + g.setColor("#FD0"); // on but no fix = amber + } + } else { + g.setColor("#888"); // off = grey + } + g.drawImage(atob("GBiBAAAAAAAAAAAAAA//8B//+BgYGBgYGBgYGBgYGBgYGBgYGB//+B//+BgYGBgYGBgYGBgYGBgYGBgYGB//+A//8AAAAAAAAAAAAA=="), this.x, 2+this.y); + } else { // marker icons + if (Bangle.isGPSOn()) { + const gpsObject = Bangle.getGPSFix(); + if (gpsObject && gpsObject.fix > 0) { + g.drawImage(atob("GBjBAP//AAAAAAAAAAAAfgAA/wABw4ADAMAHAMAGPGAGPGAGPGAGPGADAMADAMADgcABgYABw4AAwwAAZgAAfgAAPAAAGAAAAAAAAAAAAAA="), this.x, 2+this.y); // on and has fix + } else { + g.drawImage(atob("GBjBAP//AAAAAAAAAAAIfgAN/4APgeAPAHAPgDAAPBgAfhgA5wwAwwwAwwwwwwAwZgAwfgAYPAAYGAAMAfAOAPAHgfAB/7AAfhAAAAAAAAA="), this.x, 2+this.y); // on but no fix + } + } else { + g.drawImage(atob("GBjBAP//AAAAAAAAAAAAfgAY/wAcQ4AOAMAHAMAHjGAHxGAG4GAGcGADOMADHEADjgABhwABw4AAw8AAZuAAfnAAPDgAGBgAAAAAAAAAAAA="), this.x, 2+this.y); // off + } + } }}; })(); From f532bcb5be616058b056119417841a94e86316ac Mon Sep 17 00:00:00 2001 From: Marco H Date: Tue, 12 Jul 2022 10:13:58 +0200 Subject: [PATCH 2/4] Use white icons when dark theme is enabled --- apps/widgps/widget.js | 87 +++++++++++++++++++++++++++++++------------ 1 file changed, 64 insertions(+), 23 deletions(-) diff --git a/apps/widgps/widget.js b/apps/widgps/widget.js index 0c9753bce..085e4f885 100644 --- a/apps/widgps/widget.js +++ b/apps/widgps/widget.js @@ -1,32 +1,34 @@ -(function(){ - let settings = require("Storage").readJSON("widgps.json", 1) || { - crossIcon: true - }; +(function() { +let settings = + require("Storage").readJSON("widgps.json", 1) || {crossIcon : true}; - var interval; +var interval; - // override setGPSPower so we know if GPS is on or off - var oldSetGPSPower = Bangle.setGPSPower; - Bangle.setGPSPower = function(on,id) { - var isGPSon = oldSetGPSPower(on,id); - WIDGETS.gps.draw(); - return isGPSon; - }; +// override setGPSPower so we know if GPS is on or off +var oldSetGPSPower = Bangle.setGPSPower; +Bangle.setGPSPower = function(on, id) { + var isGPSon = oldSetGPSPower(on, id); + WIDGETS.gps.draw(); + return isGPSon; +}; - WIDGETS.gps={area:"tr",width:24,draw:function() { +WIDGETS.gps = { + area : "tr", + width : 24, + draw : function() { g.reset(); // check if we need to update the widget periodically if (Bangle.isGPSOn() && interval === undefined) { - interval = setInterval(function() { - WIDGETS.gps.draw(WIDGETS.gps); - }, 10*1000); // update every 10 seconds to show gps fix/no fix + interval = setInterval( + function() { WIDGETS.gps.draw(WIDGETS.gps); }, + 10 * 1000); // update every 10 seconds to show gps fix/no fix } else if (!Bangle.isGPSOn() && interval !== undefined) { clearInterval(interval); interval = undefined; } if (settings.crossIcon) { - if (Bangle.isGPSOn()) { + if (Bangle.isGPSOn()) { const gpsObject = Bangle.getGPSFix(); if (gpsObject && gpsObject.fix > 0) { g.setColor("#0F0"); // on and has fix = green @@ -36,18 +38,57 @@ } else { g.setColor("#888"); // off = grey } - g.drawImage(atob("GBiBAAAAAAAAAAAAAA//8B//+BgYGBgYGBgYGBgYGBgYGBgYGB//+B//+BgYGBgYGBgYGBgYGBgYGBgYGB//+A//8AAAAAAAAAAAAA=="), this.x, 2+this.y); + g.drawImage( + atob( + "GBiBAAAAAAAAAAAAAA//8B//+BgYGBgYGBgYGBgYGBgYGBgYGB//+B//+BgYGBgYGBgYGBgYGBgYGBgYGB//+A//8AAAAAAAAAAAAA=="), + this.x, 2 + this.y); } else { // marker icons - if (Bangle.isGPSOn()) { + const darkTheme = g.theme.dark; + if (Bangle.isGPSOn()) { const gpsObject = Bangle.getGPSFix(); if (gpsObject && gpsObject.fix > 0) { - g.drawImage(atob("GBjBAP//AAAAAAAAAAAAfgAA/wABw4ADAMAHAMAGPGAGPGAGPGAGPGADAMADAMADgcABgYABw4AAwwAAZgAAfgAAPAAAGAAAAAAAAAAAAAA="), this.x, 2+this.y); // on and has fix + // on and has fix + if (!darkTheme) { + g.drawImage( + atob( + "GBjBAP//AAAAAAAAAAAAfgAA/wABw4ADAMAHAMAGPGAGPGAGPGAGPGADAMADAMADgcABgYABw4AAwwAAZgAAfgAAPAAAGAAAAAAAAAAAAAA="), + this.x, 2 + this.y); + } else { + g.drawImage( + atob( + "GBjBAP////8AAAAAAAAAfgAA/wABw4ADAMAHAMAGPGAGPGAGPGAGPGADAMADAMADgcABgYABw4AAwwAAZgAAfgAAPAAAGAAAAAAAAAAAAAA="), + this.x, 2 + this.y); + } + } else { - g.drawImage(atob("GBjBAP//AAAAAAAAAAAIfgAN/4APgeAPAHAPgDAAPBgAfhgA5wwAwwwAwwwwwwAwZgAwfgAYPAAYGAAMAfAOAPAHgfAB/7AAfhAAAAAAAAA="), this.x, 2+this.y); // on but no fix + // GNSS on but no fix + if (!darkTheme) { + g.drawImage( + atob( + "GBjBAP//AAAAAAAAAAAIfgAN/4APgeAPAHAPgDAAPBgAfhgA5wwAwwwAwwwwwwAwZgAwfgAYPAAYGAAMAfAOAPAHgfAB/7AAfhAAAAAAAAA="), + this.x, 2 + this.y); + } else { + g.drawImage( + atob( + "GBjBAP////8AAAAAAAAIfgAN/4APgeAPAHAPgDAAPBgAfhgA5wwAwwwAwwwwwwAwZgAwfgAYPAAYGAAMAfAOAPAHgfAB/7AAfhAAAAAAAAA="), + this.x, 2 + this.y); + } } } else { - g.drawImage(atob("GBjBAP//AAAAAAAAAAAAfgAY/wAcQ4AOAMAHAMAHjGAHxGAG4GAGcGADOMADHEADjgABhwABw4AAw8AAZuAAfnAAPDgAGBgAAAAAAAAAAAA="), this.x, 2+this.y); // off + // GNSS off + if (!darkTheme) { + g.drawImage( + atob( + "GBjBAP//AAAAAAAAAAAAfgAY/wAcQ4AOAMAHAMAHjGAHxGAG4GAGcGADOMADHEADjgABhwABw4AAw8AAZuAAfnAAPDgAGBgAAAAAAAAAAAA="), + this.x, 2 + this.y); + } else { + g.drawImage( + atob( + "GBjBAP////8AAAAAAAAAfgAY/wAcQ4AOAMAHAMAHjGAHxGAG4GAGcGADOMADHEADjgABhwABw4AAw8AAZuAAfnAAPDgAGBgAAAAAAAAAAAA="), + this.x, 2 + this.y); + } } } - }}; + } +}; })(); From 8fc24cb63c145c91a0dfed296915abe3a8c0a87f Mon Sep 17 00:00:00 2001 From: Marco H Date: Tue, 12 Jul 2022 10:40:02 +0200 Subject: [PATCH 3/4] Update README.md --- apps/widgps/README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/apps/widgps/README.md b/apps/widgps/README.md index e9916fe80..81a24100b 100644 --- a/apps/widgps/README.md +++ b/apps/widgps/README.md @@ -9,6 +9,9 @@ it is useful to know if it has been switched on or not. There are two icons which can be used to visualize the GPS/GNSS status: 1. A cross colored depending on the GPS/GNSS status + - Shows in grey when the GPS is off + - Shows in amber when the GPS is on but has no fix + - Shows in green when the GPS is on and has a fix 2. Different place markers depending on GPS/GNSS status From 67886838f8df9291401452678a8b190d29b7d24e Mon Sep 17 00:00:00 2001 From: Marco H Date: Tue, 12 Jul 2022 11:25:39 +0200 Subject: [PATCH 4/4] Use 1-bit icons --- apps/widgps/widget.js | 37 ++++++------------------------------- 1 file changed, 6 insertions(+), 31 deletions(-) diff --git a/apps/widgps/widget.js b/apps/widgps/widget.js index 085e4f885..fd9b44484 100644 --- a/apps/widgps/widget.js +++ b/apps/widgps/widget.js @@ -43,50 +43,25 @@ WIDGETS.gps = { "GBiBAAAAAAAAAAAAAA//8B//+BgYGBgYGBgYGBgYGBgYGBgYGB//+B//+BgYGBgYGBgYGBgYGBgYGBgYGB//+A//8AAAAAAAAAAAAA=="), this.x, 2 + this.y); } else { // marker icons - const darkTheme = g.theme.dark; if (Bangle.isGPSOn()) { const gpsObject = Bangle.getGPSFix(); if (gpsObject && gpsObject.fix > 0) { // on and has fix - if (!darkTheme) { - g.drawImage( - atob( - "GBjBAP//AAAAAAAAAAAAfgAA/wABw4ADAMAHAMAGPGAGPGAGPGAGPGADAMADAMADgcABgYABw4AAwwAAZgAAfgAAPAAAGAAAAAAAAAAAAAA="), + g.drawImage( + atob("GBiBAAAAAAAAAAB+AAD/AAHDgAMAwAcAwAY8YAY8YAY8YAY8YAMAwAMAwAOBwAGBgAHDgADDAABmAAB+AAA8AAAYAAAAAAAAAAAAAA=="), this.x, 2 + this.y); - } else { - g.drawImage( - atob( - "GBjBAP////8AAAAAAAAAfgAA/wABw4ADAMAHAMAGPGAGPGAGPGAGPGADAMADAMADgcABgYABw4AAwwAAZgAAfgAAPAAAGAAAAAAAAAAAAAA="), - this.x, 2 + this.y); - } } else { // GNSS on but no fix - if (!darkTheme) { - g.drawImage( - atob( - "GBjBAP//AAAAAAAAAAAIfgAN/4APgeAPAHAPgDAAPBgAfhgA5wwAwwwAwwwwwwAwZgAwfgAYPAAYGAAMAfAOAPAHgfAB/7AAfhAAAAAAAAA="), + g.drawImage( + atob("GBiBAAAAAAAAAAh+AA3/gA+B4A8AcA+AMAA8GAB+GADnDADDDADDDDDDADBmADB+ABg8ABgYAAwB8A4A8AeB8AH/sAB+EAAAAAAAAA=="), this.x, 2 + this.y); - } else { - g.drawImage( - atob( - "GBjBAP////8AAAAAAAAIfgAN/4APgeAPAHAPgDAAPBgAfhgA5wwAwwwAwwwwwwAwZgAwfgAYPAAYGAAMAfAOAPAHgfAB/7AAfhAAAAAAAAA="), - this.x, 2 + this.y); - } } } else { // GNSS off - if (!darkTheme) { - g.drawImage( - atob( - "GBjBAP//AAAAAAAAAAAAfgAY/wAcQ4AOAMAHAMAHjGAHxGAG4GAGcGADOMADHEADjgABhwABw4AAw8AAZuAAfnAAPDgAGBgAAAAAAAAAAAA="), + g.drawImage( + atob("GBiBAAAAAAAAAAB+ABj/ABxDgA4AwAcAwAeMYAfEYAbgYAZwYAM4wAMcQAOOAAGHAAHDgADDwABm4AB+cAA8OAAYGAAAAAAAAAAAAA=="), this.x, 2 + this.y); - } else { - g.drawImage( - atob( - "GBjBAP////8AAAAAAAAAfgAY/wAcQ4AOAMAHAMAHjGAHxGAG4GAGcGADOMADHEADjgABhwABw4AAw8AAZuAAfnAAPDgAGBgAAAAAAAAAAAA="), - this.x, 2 + this.y); - } } } }