Skip to content

Commit

Permalink
Merge pull request #3697 from nravanelli/patch-1
Browse files Browse the repository at this point in the history
[gpssetup] Bangle.js2 support
  • Loading branch information
bobrippling authored Dec 20, 2024
2 parents f43971e + ee3df97 commit c37a0e1
Show file tree
Hide file tree
Showing 5 changed files with 113 additions and 44 deletions.
1 change: 1 addition & 0 deletions apps/gpssetup/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
0.01: First version of GPS Setup app
0.02: Created gppsetup module
0.03: Added support for Bangle.js2
6 changes: 5 additions & 1 deletion apps/gpssetup/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,13 +48,17 @@ used. These settings will remain for all apps that use the GPS.
the interval the more time the GPS will spend sleeping in low
power mode (7mA) between obtaining fixes (35mA). For walking in
open country an update once every 60 seconds is adequate to put
you within a 6 digit grid refernce sqaure.
you within a 6 digit grid refernce sqaure.

**Note:** For the Bangle.js2, the GPS module does not have a PSMOO mode, and thus this is emulated using on/off timeouts specified using the update and search options.

- update - the time between two position fix attempts.

- search - the time between two acquisition attempts if the receiver
is unable to get a position fix.

- fix_req (Bangle.js2 only) - the number of fixes required before the GPS turns off until next search for GPS signal. default is 1.

## Module

A module is provided that'll allow you to set GPS configuration from your own
Expand Down
11 changes: 11 additions & 0 deletions apps/gpssetup/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ function loadSettings() {
settings = require("Storage").readJSON(SETTINGS_FILE,1)||{};
settings.update = settings.update||120;
settings.search = settings.search||5;
settings.fix_req = settings.fix_req||1;
settings.power_mode = settings.power_mode||"SuperE";
log_debug(settings);
}
Expand Down Expand Up @@ -85,6 +86,16 @@ function showMainMenu() {
settings.search = v;
updateSettings();
}
},
'Fix Req (#)': {
value: settings.fix_req,
min: 1,
max: 100,
step: 1,
onchange: v => {
settings.fix_req = v;
updateSettings();
}
}
};

Expand Down
135 changes: 94 additions & 41 deletions apps/gpssetup/gpssetup.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
const SETTINGS_FILE = "gpssetup.settings.json";

const BANGLE_VER = process.env.HWVERSION; //BangleJS2 support
function log_debug(o) {
//let timestamp = new Date().getTime();
//console.log(timestamp + " : " + o);
Expand Down Expand Up @@ -106,49 +106,97 @@ function delay(ms) {

function setupSuperE() {
log_debug("setupGPS() Super-E");
return Promise.resolve().then(function() {
UBX_CFG_RESET();
return delay(100);
}).then(function() {
UBX_CFG_PMS();
return delay(20);
}).then(function() {
UBX_CFG_SAVE();
return delay(20);
}).then(function() {
log_debug("Powering GPS Off");
/*
* must be part of the promise chain to ensure that
* setup does not return and powerOff before config functions
* have run
*/
return delay(20);
});
switch(BANGLE_VER){
case(1): {
return Promise.resolve().then(function() {
UBX_CFG_RESET();
return delay(100);
}).then(function() {
UBX_CFG_PMS();
return delay(20);
}).then(function() {
UBX_CFG_SAVE();
return delay(20);
}).then(function() {
log_debug("Powering GPS Off");
/*
* must be part of the promise chain to ensure that
* setup does not return and powerOff before config functions
* have run
*/
return delay(20);
});
}
case(2):{
//nothing more to do.
return;
}
}

}

function setupPSMOO(settings) {
log_debug("setupGPS() PSMOO");
return Promise.resolve().then(function() {
UBX_CFG_RESET();
return delay(100);
}).then(function() {
UBX_CFG_PM2(settings.update, settings.search);
return delay(20);
}).then(function() {
UBX_CFG_RXM();
return delay(20);
}).then(function() {
UBX_CFG_SAVE();
return delay(20);
}).then(function() {
log_debug("Powering GPS Off");
/*
* must be part of the promise chain to ensure that
* setup does not return and powerOff before config functions
* have run
*/
return delay(20);
});
switch(BANGLE_VER){
case(1):{
return Promise.resolve().then(function() {
UBX_CFG_RESET();
return delay(100);
}).then(function() {
UBX_CFG_PM2(settings.update, settings.search);
return delay(20);
}).then(function() {
UBX_CFG_RXM();
return delay(20);
}).then(function() {
UBX_CFG_SAVE();
return delay(20);
}).then(function() {
log_debug("Powering GPS Off");
/*
* must be part of the promise chain to ensure that
* setup does not return and powerOff before config functions
* have run
*/
return delay(20);
});
}
case(2): {
var gpsTimeout = null;
var gpsActive = false;
var fix = 0;
function cb(f){
if(parseInt(f.fix) === 1){
fix++;
if(fix >= settings.fix_req){
fix = 0;
turnOffGPS();
}
}
}
function turnOffGPS() {
if (!gpsActive) return;
gpsActive = false;
clearTimeout(gpsTimeout);
Bangle.setGPSPower(0,settings.appName);
Bangle.removeListener('GPS', cb); // cleaning it up
gpsTimeout = setTimeout(() => {
turnOnGPS();
}, settings.update * 1000);
}
function turnOnGPS(){
if (gpsActive) return;
if(!Bangle.isGPSOn()) Bangle.setGPSPower(1,settings.appName);
Bangle.on('GPS',cb);
gpsActive = true;
gpsTimeout = setTimeout(() => {
turnOffGPS();
}, settings.search * 1000);
}
turnOnGPS();
break;
}
}
}

/** Set GPS power mode (assumes GPS on), returns a promise.
Expand All @@ -161,16 +209,21 @@ require("gpssetup").setPowerMode({power_mode:"SuperE"}) // <-- Super E mode
See the README for more information
*/
exports.setPowerMode = function(options) {
settings = require("Storage").readJSON(SETTINGS_FILE,1)||{};
var settings = require("Storage").readJSON(SETTINGS_FILE,1)||{};
if (options) {
if (options.update) settings.update = options.update;
if (options.search) settings.search = options.search;
if (options.fix_req) settings.fix_req = options.fix_req;
if (options.power_mode) settings.power_mode = options.power_mode;
if (options.appName) settings.appName = options.appName;
}
settings.update = settings.update||120;
settings.search = settings.search||5;
settings.fix_req = settings.fix_req||1; //default to just one fix and will turn off
settings.power_mode = settings.power_mode||"SuperE";
settings.appName = settings.appName || "gpssetup";
if (options) require("Storage").write(SETTINGS_FILE, settings);
if(!Bangle.isGPSOn()) Bangle.setGPSPower(1,settings.appName); //always know its on - no point calling this otherwise!!!
if (settings.power_mode === "PSMOO") {
return setupPSMOO(settings);
} else {
Expand Down
4 changes: 2 additions & 2 deletions apps/gpssetup/metadata.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@
"id": "gpssetup",
"name": "GPS Setup",
"shortName": "GPS Setup",
"version": "0.02",
"version": "0.03",
"description": "Configure the GPS power options and store them in the GPS nvram",
"icon": "gpssetup.png",
"tags": "gps,tools,outdoors",
"supports": ["BANGLEJS"],
"supports": ["BANGLEJS","BANGLEJS2"],
"readme": "README.md",
"storage": [
{"name":"gpssetup","url":"gpssetup.js"},
Expand Down

0 comments on commit c37a0e1

Please sign in to comment.