From 34787c0d9a862e5f89583b7461dbb45b1dfe7995 Mon Sep 17 00:00:00 2001 From: hughbarney Date: Fri, 22 Jan 2021 22:13:25 +0000 Subject: [PATCH] added gps_get|set_settings, restore to SuperE setup on poweroff(), updated README --- apps.json | 2 +- apps/gpsservice/ChangeLog.txt | 2 + apps/gpsservice/README.md | 58 +++++++++++++++++++ apps/gpsservice/test-bed.js | 28 +++++++++ apps/gpsservice/widget.js | 103 +++++++++++++++++++++++----------- 5 files changed, 158 insertions(+), 35 deletions(-) create mode 100644 apps/gpsservice/ChangeLog.txt diff --git a/apps.json b/apps.json index 9c09d6050..efad19186 100644 --- a/apps.json +++ b/apps.json @@ -2624,7 +2624,7 @@ "name": "Low power GPS Service", "shortName":"GPS Service", "icon": "gpsservice.png", - "version":"0.01", + "version":"0.02", "description": "low power GPS widget", "tags": "gps outdoors navigation", "readme": "README.md", diff --git a/apps/gpsservice/ChangeLog.txt b/apps/gpsservice/ChangeLog.txt new file mode 100644 index 000000000..03b3e6f73 --- /dev/null +++ b/apps/gpsservice/ChangeLog.txt @@ -0,0 +1,2 @@ +0.01: New App +0.02: Restore to SuperE mode on power off. diff --git a/apps/gpsservice/README.md b/apps/gpsservice/README.md index 5234e0cad..b1e3e60d4 100644 --- a/apps/gpsservice/README.md +++ b/apps/gpsservice/README.md @@ -63,6 +63,64 @@ Service. Go to Settings, select App/Widgets and then 'GPS Service'. ![](osref_face.jpg) +## Interface for Apps + +The code below demonstrates how you can setup and start the gpsservice from your own App. + +```js +function test_gps_on() { + + var settings = WIDGETS.gpsservice.gps_get_settings(); + + // change the settings to what you require + settings.gpsservice = true; + settings.update = 65; + settings.search = 5; + settings.power_mode = "PSMOO"; + + WIDGETS.gpsservice.gps_set_settings(settings); + WIDGETS.gpsservice.reload(); // will power on +} +``` + +In your app can retrieve the last fix as and when required. + +```js +var fix = { + fix: 0, + alt: 0, + lat: 0, + lon: 0, + speed: 0, + time: 0, + satellites: 0 +}; + +// only attempt to get gps fix if gpsservice is loaded +if (WIDGETS.gpsservice !== undefined) { + fix = WIDGETS.gpsservice.gps_get_fix(); + gps_on = WIDGETS.gpsservice.gps_get_status(); +} + +if (fix.fix) { + var time = formatTime(fix.time); + var age = timeSince(time); +``` + +When done you can turn the gpsservice off using the code below. + +```js +function test_gps_off() { + + var settings = WIDGETS.gpsservice.gps_get_settings(); + + settings.gpsservice = false; + settings.power_mode = "SuperE"; + + WIDGETS.gpsservice.gps_set_settings(settings); + WIDGETS.gpsservice.reload(); // will power off +} +``` ## To Do List * add a logging option with options for interval between log points diff --git a/apps/gpsservice/test-bed.js b/apps/gpsservice/test-bed.js index b4e93e732..0713cab9b 100644 --- a/apps/gpsservice/test-bed.js +++ b/apps/gpsservice/test-bed.js @@ -229,3 +229,31 @@ function setupGPS() { Bangle.on('GPS',onGPS); } +function test_gps_on() { + + var settings = WIDGETS.gpsservice.gps_get_settings(); + + settings.gpsservice = true; + settings.update = 65; + settings.search = 5; + settings.power_mode = "PSMOO"; + + WIDGETS.gpsservice.gps_set_settings(settings); + WIDGETS.gpsservice.reload(); // will power on +} + + +function test_gps_off() { + + var settings = WIDGETS.gpsservice.gps_get_settings(); + + settings.gpsservice = false; + settings.power_mode = "SuperE"; + + WIDGETS.gpsservice.gps_set_settings(settings); + WIDGETS.gpsservice.reload(); // will power off +} + +// test_gps_on(); +// test_gps_off(); + diff --git a/apps/gpsservice/widget.js b/apps/gpsservice/widget.js index 89216b96d..18ad7ef17 100644 --- a/apps/gpsservice/widget.js +++ b/apps/gpsservice/widget.js @@ -2,6 +2,7 @@ var settings = {}; var fixToggle = false; // toggles once for each reading var have_fix = false; + var debug = false; var last_fix = { fix: 0, @@ -15,17 +16,20 @@ function gps_get_fix() { return last_fix; } function gps_get_status() { return WIDGETS.gpsservice.width === 24 ? true : false;} - function gps_get_version() { return "0.1"; } + function gps_get_version() { return "0.2"; } + + function log_debug(o) { + if (debug) console.log(o); + } + + function gps_set_debug(v) { + debug = v; + } // Called by the GPS widget settings to reload settings and decide what to do function reload() { - settings = require("Storage").readJSON("gpsservice.settings.json",1)||{}; - settings.gpsservice = settings.gpsservice||false; - settings.update = settings.update||120; - settings.search = settings.search||5; - settings.power_mode = settings.power_mode||"SuperE"; - //console.log(settings); - + settings = gps_get_settings(); + log_debug(settings); Bangle.removeListener('GPS',onGPS); if (settings.gpsservice) { @@ -35,6 +39,26 @@ } } + // retrieve the settings from Storage, can be called by external apps + function gps_get_settings() { + var sets = require("Storage").readJSON("gpsservice.settings.json",1)||{}; + sets.gpsservice = sets.gpsservice||false; + sets.update = sets.update||120; + sets.search = sets.search||5; + sets.power_mode = sets.power_mode||"SuperE"; + return sets; + } + + // pass in the required settings, can be called by external apps + function gps_set_settings(sets) { + settings.gpsservice = sets.gpsservice||false; + settings.update = sets.update||120; + settings.search = sets.search||5; + settings.power_mode = sets.power_mode||"SuperE"; + require("Storage").write("gpsservice.settings.json", settings); + } + + // issue: currently possible to call this without having set settings.gpsservice in settings file function gps_power_on() { have_fix = false; fixToggle = false; @@ -43,6 +67,7 @@ } function gps_power_off() { + setupSuperE(); // return to expected setup for other apps Bangle.setGPSPower(0); have_fix = false; fixToggle = false; @@ -61,35 +86,42 @@ function setupGPS() { Bangle.setGPSPower(1); - //console.log(settings); if (settings.power_mode === "PSMOO") { - //console.log("setupGPS() PSMOO"); - UBX_CFG_RESET(); - wait(100); - - UBX_CFG_PM2(settings.update, settings.search); - wait(20); - - UBX_CFG_RXM(); - wait(20); - - UBX_CFG_SAVE(); - wait(20); + setupPSMOO(); } else { - //console.log("setupGPS() Super-E"); - UBX_CFG_RESET(); - wait(100); - - UBX_CFG_PMS(); - wait(20); - - UBX_CFG_SAVE(); - wait(20); + setupSuperE(); } Bangle.on('GPS',onGPS); } + function setupPSMOO() { + log_debug("setupGPS() PSMOO"); + UBX_CFG_RESET(); + wait(100); + + UBX_CFG_PM2(settings.update, settings.search); + wait(20); + + UBX_CFG_RXM(); + wait(20); + + UBX_CFG_SAVE(); + wait(20); + } + + function setupSuperE() { + log_debug("setupGPS() Super-E"); + UBX_CFG_RESET(); + wait(100); + + UBX_CFG_PMS(); + wait(20); + + UBX_CFG_SAVE(); + wait(20); + } + function writeGPScmd(cmd) { var d = [0xB5,0x62]; // sync chars d = d.concat(cmd); @@ -201,7 +233,7 @@ function onGPS(fix) { fixToggle = !fixToggle; WIDGETS.gpsservice.draw(); - + log_debug(fix); last_fix.satellites = fix.satellites; /* @@ -236,12 +268,15 @@ gps_get_status:gps_get_status, gps_get_fix:gps_get_fix, gps_get_version:gps_get_version, + gps_get_settings:gps_get_settings, + gps_set_settings:gps_set_settings, + gps_set_debug:gps_set_debug, reload:function() { - reload(); - Bangle.drawWidgets(); // relayout all widgets + reload(); + Bangle.drawWidgets(); // relayout all widgets }}; - // load settings, set correct widget width + // load settings, set correct widget width reload(); })();