From 539ea488247bea4eceebb3d92319383259ef6b6d Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Fri, 6 Jan 2023 18:37:38 +0100 Subject: [PATCH 01/15] android - Stop GPS on phone if not activated inside 3 seconds after boot --- apps/android/boot.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apps/android/boot.js b/apps/android/boot.js index c5a9dd746..96e79c67e 100644 --- a/apps/android/boot.js +++ b/apps/android/boot.js @@ -227,6 +227,10 @@ Bangle.isGPSOn = () => { return Bangle._PWR && Bangle._PWR.GPS && Bangle._PWR.GPS.length>0; } + // stop GPS on boot if not activated + setTimeout(()=>{ + if (!Bangle.isGPSOn()) gbSend({ t: "gps_power", status: false }); + },3000); } // remove settings object so it's not taking up RAM From d74c2c40431a8198598925b3bd91d3f54270bf04 Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Fri, 6 Jan 2023 19:01:09 +0100 Subject: [PATCH 02/15] android - Use more compact way of overriding gps power function --- apps/android/boot.js | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/apps/android/boot.js b/apps/android/boot.js index 96e79c67e..814e35aa1 100644 --- a/apps/android/boot.js +++ b/apps/android/boot.js @@ -207,12 +207,10 @@ }; // GPS overwrite logic if (settings.overwriteGps) { // if the overwrite option is set../ - // Save current logic - const originalSetGpsPower = Bangle.setGPSPower; // Replace set GPS power logic to suppress activation of gps (and instead request it from the phone) - Bangle.setGPSPower = (isOn, appID) => { + Bangle.setGPSPower = (o => (isOn, appID) => { // if not connected, use old logic - if (!NRF.getSecurityStatus().connected) return originalSetGpsPower(isOn, appID); + if (!NRF.getSecurityStatus().connected) return o(isOn, appID); // Emulate old GPS power logic if (!Bangle._PWR) Bangle._PWR={}; if (!Bangle._PWR.GPS) Bangle._PWR.GPS=[]; @@ -222,7 +220,7 @@ let pwr = Bangle._PWR.GPS.length>0; gbSend({ t: "gps_power", status: pwr }); return pwr; - } + })(Bangle.setGPSPower); // Replace check if the GPS is on to check the _PWR variable Bangle.isGPSOn = () => { return Bangle._PWR && Bangle._PWR.GPS && Bangle._PWR.GPS.length>0; From 4e991fb72927f3ed9162cfe26f8beff0b1129735 Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Sat, 7 Jan 2023 11:41:01 +0100 Subject: [PATCH 03/15] android - Handle connection events and switch GPS use over --- apps/android/boot.js | 57 ++++++++++++++++++++++++++++++++------------ 1 file changed, 42 insertions(+), 15 deletions(-) diff --git a/apps/android/boot.js b/apps/android/boot.js index 814e35aa1..9ae75e228 100644 --- a/apps/android/boot.js +++ b/apps/android/boot.js @@ -141,7 +141,7 @@ Bangle.emit('GPS', event); }, "is_gps_active": function() { - gbSend({ t: "gps_power", status: Bangle._PWR && Bangle._PWR.GPS && Bangle._PWR.GPS.length>0 }); + gbSend({ t: "gps_power", status: Bangle.isGBGPSOn() }); } }; var h = HANDLERS[event.t]; @@ -207,27 +207,54 @@ }; // GPS overwrite logic if (settings.overwriteGps) { // if the overwrite option is set../ - // Replace set GPS power logic to suppress activation of gps (and instead request it from the phone) - Bangle.setGPSPower = (o => (isOn, appID) => { - // if not connected, use old logic - if (!NRF.getSecurityStatus().connected) return o(isOn, appID); - // Emulate old GPS power logic + const origIsGPSOn = Bangle.isGPSOn; + const origSetGPSPower = Bangle.setGPSPower; + // migrate all GPS clients to the other variant on connection events + let handleConnect = () => { + if (origIsGPSOn()){ + for (let c of Bangle._PWR.GPS){ + Bangle.setGBGPSPower(1, c); + origSetGPSPower(0, c); + } + } + }; + let handleDisconnect = () => { + if (Bangle.isGBGPSOn()){ + for (let c of Bangle._PWR.GBGPS){ + origSetGPSPower(1, c); + Bangle.setGBGPSPower(0, c); + } + } + }; + NRF.on('connect', handleConnect); + NRF.on('disconnect', handleDisconnect); + Bangle.setGBGPSPower = (isOn, appID) => { if (!Bangle._PWR) Bangle._PWR={}; - if (!Bangle._PWR.GPS) Bangle._PWR.GPS=[]; + if (!Bangle._PWR.GBGPS) Bangle._PWR.GBGPS=[]; if (!appID) appID="?"; - if (isOn && !Bangle._PWR.GPS.includes(appID)) Bangle._PWR.GPS.push(appID); - if (!isOn && Bangle._PWR.GPS.includes(appID)) Bangle._PWR.GPS.splice(Bangle._PWR.GPS.indexOf(appID),1); - let pwr = Bangle._PWR.GPS.length>0; + if (isOn && !Bangle._PWR.GBGPS.includes(appID)) Bangle._PWR.GBGPS.push(appID); + if (!isOn && Bangle._PWR.GBGPS.includes(appID)) Bangle._PWR.GBGPS.splice(Bangle._PWR.GBGPS.indexOf(appID),1); + let pwr = Bangle._PWR.GBGPS.length>0; gbSend({ t: "gps_power", status: pwr }); return pwr; - })(Bangle.setGPSPower); - // Replace check if the GPS is on to check the _PWR variable + }; + // Replace set GPS power logic to suppress activation of gps (and instead request it from the phone) + Bangle.setGPSPower = (isOn, appID) => { + // if not connected use internal GPS power function + if (!NRF.getSecurityStatus().connected) return origSetGPSPower(isOn, appID); + return Bangle.setGBGPSPower(isOn, appID); + }; + // Allow checking for GPS via GadgetBridge + Bangle.isGBGPSOn = () => { + return !!(Bangle._PWR && Bangle._PWR.GBGPS && Bangle._PWR.GBGPS.length>0); + }; + // Replace check if the GPS is on to check both internal and external GPS Bangle.isGPSOn = () => { - return Bangle._PWR && Bangle._PWR.GPS && Bangle._PWR.GPS.length>0; - } + return Bangle.isGBGPSOn() || origIsGPSOn(); + }; // stop GPS on boot if not activated setTimeout(()=>{ - if (!Bangle.isGPSOn()) gbSend({ t: "gps_power", status: false }); + if (!Bangle.isGBGPSOn()) gbSend({ t: "gps_power", status: false }); },3000); } From 85ef12aa58c9ac20614212012d1d04828d3129d1 Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Sun, 8 Jan 2023 11:56:01 +0100 Subject: [PATCH 04/15] android - Bump version --- apps/android/ChangeLog | 1 + apps/android/metadata.json | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/android/ChangeLog b/apps/android/ChangeLog index db5c0b057..de70af79f 100644 --- a/apps/android/ChangeLog +++ b/apps/android/ChangeLog @@ -20,3 +20,4 @@ 0.19: Add automatic translation for a couple of strings. 0.20: Fix wrong event used for forwarded GPS data from Gadgetbridge and add mapper to map longitude value correctly. 0.21: Fix broken 'Messages' button in menu +0.22: Handle connection events for GPS forwarding from phone diff --git a/apps/android/metadata.json b/apps/android/metadata.json index 63fd7759a..94c24afd5 100644 --- a/apps/android/metadata.json +++ b/apps/android/metadata.json @@ -2,7 +2,7 @@ "id": "android", "name": "Android Integration", "shortName": "Android", - "version": "0.21", + "version": "0.22", "description": "Display notifications/music/etc sent from the Gadgetbridge app on Android. This replaces the old 'Gadgetbridge' Bangle.js widget.", "icon": "app.png", "tags": "tool,system,messages,notifications,gadgetbridge", From 88712724bc85860028c1afad0c16a8762c08496f Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Sun, 8 Jan 2023 13:35:56 +0100 Subject: [PATCH 05/15] android - Add test code for manual execution --- apps/android/test.js | 140 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 140 insertions(+) create mode 100644 apps/android/test.js diff --git a/apps/android/test.js b/apps/android/test.js new file mode 100644 index 000000000..412c55524 --- /dev/null +++ b/apps/android/test.js @@ -0,0 +1,140 @@ +let result = true; + +function assertTrue(condition, text) { + if (!condition) { + result = false; + print("FAILURE: " + text); + } else print("OK: " + text); +} + +function assertFalse(condition, text) { + assertTrue(!condition, text); +} + +function assertUndefinedOrEmpty(array, text) { + assertTrue(!array || array.length == 0, text); +} + +function assertNotEmpty(array, text) { + assertTrue(array && array.length > 0, text); +} + +let sec = { + connected: false +}; + +NRF.getSecurityStatus = () => sec; + +setTimeout(() => { + print(Bangle._PWR); + + print("Not connected, should use internal GPS"); + assertTrue(!NRF.getSecurityStatus().connected, "Not connected"); + + assertUndefinedOrEmpty(Bangle._PWR.GBGPS, "No GBGPS"); + assertUndefinedOrEmpty(Bangle._PWR.GPS, "No GPS"); + assertFalse(Bangle.isGPSOn(), "isGPSOn"); + assertFalse(Bangle.isGBGPSOn(), "isGBGPSOn"); + + assertTrue(Bangle.setGPSPower(1), "Switch GPS on"); + + assertUndefinedOrEmpty(Bangle._PWR.GBGPS, "No GBGPS"); + assertNotEmpty(Bangle._PWR.GPS, "GPS"); + assertTrue(Bangle.isGPSOn(), "isGPSOn"); + assertFalse(Bangle.isGBGPSOn(), "isGBGPSOn"); + + assertFalse(Bangle.setGPSPower(0), "Switch GPS off"); + + assertUndefinedOrEmpty(Bangle._PWR.GBGPS, "No GBGPS"); + assertUndefinedOrEmpty(Bangle._PWR.GPS, "No GPS"); + assertFalse(Bangle.isGPSOn(), "isGPSOn"); + assertFalse(Bangle.isGBGPSOn(), "isGBGPSOn"); + + assertTrue(Bangle.setGBGPSPower(1), "Switch GBGPS on"); + + assertUndefinedOrEmpty(Bangle._PWR.GPS, "No GPS"); + assertNotEmpty(Bangle._PWR.GBGPS, "GBGPS"); + assertTrue(Bangle.isGPSOn(), "isGPSOn"); + assertTrue(Bangle.isGBGPSOn(), "isGBGPSOn"); + + assertFalse(Bangle.setGBGPSPower(0), "Switch GBGPS off"); + + assertUndefinedOrEmpty(Bangle._PWR.GBGPS, "No GBGPS"); + assertUndefinedOrEmpty(Bangle._PWR.GPS, "No GPS"); + assertFalse(Bangle.isGPSOn(), "isGPSOn"); + assertFalse(Bangle.isGBGPSOn(), "isGBGPSOn"); + + print("Connected, should use GB GPS"); + sec.connected = true; + + assertTrue(NRF.getSecurityStatus().connected, "Connected"); + + assertUndefinedOrEmpty(Bangle._PWR.GBGPS, "No GBGPS"); + assertUndefinedOrEmpty(Bangle._PWR.GPS, "No GPS"); + assertFalse(Bangle.isGPSOn(), "isGPSOn"); + assertFalse(Bangle.isGBGPSOn(), "isGBGPSOn"); + + assertTrue(Bangle.setGPSPower(1), "Switch GPS on"); + + assertUndefinedOrEmpty(Bangle._PWR.GPS, "No GPS"); + assertNotEmpty(Bangle._PWR.GBGPS, "GBGPS"); + assertTrue(Bangle.isGPSOn(), "isGPSOn"); + assertTrue(Bangle.isGBGPSOn(), "isGBGPSOn"); + + assertFalse(Bangle.setGPSPower(0), "Switch GPS off"); + + assertUndefinedOrEmpty(Bangle._PWR.GBGPS, "No GBGPS"); + assertUndefinedOrEmpty(Bangle._PWR.GPS, "No GPS"); + assertFalse(Bangle.isGPSOn(), "isGPSOn"); + assertFalse(Bangle.isGBGPSOn(), "isGBGPSOn"); + + print("Connected, then reconnect cycle"); + sec.connected = true; + + assertTrue(NRF.getSecurityStatus().connected, "Connected"); + + assertUndefinedOrEmpty(Bangle._PWR.GBGPS, "No GBGPS"); + assertUndefinedOrEmpty(Bangle._PWR.GPS, "No GPS"); + assertFalse(Bangle.isGPSOn(), "isGPSOn"); + assertFalse(Bangle.isGBGPSOn(), "isGBGPSOn"); + + assertTrue(Bangle.setGPSPower(1), "Switch GPS on"); + + assertUndefinedOrEmpty(Bangle._PWR.GPS, "No GPS"); + assertNotEmpty(Bangle._PWR.GBGPS, "GBGPS"); + assertTrue(Bangle.isGPSOn(), "isGPSOn"); + assertTrue(Bangle.isGBGPSOn(), "isGBGPSOn"); + + print("disconnect"); + NRF.emit("disconnect", {}); + sec.connected = false; + + setTimeout(() => { + + assertNotEmpty(Bangle._PWR.GPS, "GPS"); + assertUndefinedOrEmpty(Bangle._PWR.GBGPS, "No GBGPS"); + assertTrue(Bangle.isGPSOn(), "isGPSOn"); + assertFalse(Bangle.isGBGPSOn(), "isGBGPSOn"); + + print("connect"); + NRF.emit("connect", {}); + sec.connected = true; + + setTimeout(() => { + assertUndefinedOrEmpty(Bangle._PWR.GPS, "No GPS"); + assertNotEmpty(Bangle._PWR.GBGPS, "GBGPS"); + assertTrue(Bangle.isGPSOn(), "isGPSOn"); + assertTrue(Bangle.isGBGPSOn(), "isGBGPSOn"); + + assertFalse(Bangle.setGPSPower(0), "Switch GPS off"); + + assertUndefinedOrEmpty(Bangle._PWR.GBGPS, "No GBGPS"); + assertUndefinedOrEmpty(Bangle._PWR.GPS, "No GPS"); + assertFalse(Bangle.isGPSOn(), "isGPSOn"); + assertFalse(Bangle.isGBGPSOn(), "isGBGPSOn"); + + + print("Result Overall is " + (result ? "OK" : "FAIL")); + }, 0); + }, 0); +}, 5000); \ No newline at end of file From 0038e517760b559c57b5ade5ca63c57be907bcc5 Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Thu, 12 Jan 2023 21:52:27 +0100 Subject: [PATCH 06/15] android - Adds additional test steps --- apps/android/test.js | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/apps/android/test.js b/apps/android/test.js index 412c55524..064d2d20b 100644 --- a/apps/android/test.js +++ b/apps/android/test.js @@ -133,8 +133,16 @@ setTimeout(() => { assertFalse(Bangle.isGPSOn(), "isGPSOn"); assertFalse(Bangle.isGBGPSOn(), "isGBGPSOn"); + setTimeout(() => { + print("Test disconnect without gps on"); - print("Result Overall is " + (result ? "OK" : "FAIL")); + assertUndefinedOrEmpty(Bangle._PWR.GBGPS, "No GBGPS"); + assertUndefinedOrEmpty(Bangle._PWR.GPS, "No GPS"); + assertFalse(Bangle.isGPSOn(), "isGPSOn"); + assertFalse(Bangle.isGBGPSOn(), "isGBGPSOn"); + + print("Result Overall is " + (result ? "OK" : "FAIL")); + }, 0); }, 0); }, 0); }, 5000); \ No newline at end of file From e55c1566ee0ea9b8b943a4ae154f08272c210efa Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Fri, 13 Jan 2023 09:34:11 +0100 Subject: [PATCH 07/15] android - Fix GPS switched of when connected while writing to Serial1 --- apps/android/boot.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/apps/android/boot.js b/apps/android/boot.js index 9ae75e228..a2c0acad9 100644 --- a/apps/android/boot.js +++ b/apps/android/boot.js @@ -228,6 +228,18 @@ }; NRF.on('connect', handleConnect); NRF.on('disconnect', handleDisconnect); + + // Work around Serial1 for GPS not working when connected to something + // + Serial1.println = (o => s => { + origSetGPSPower(1,"android_gpsserial"); + o(s); + })(Serial1.println); + Serial1.write = (o => s => { + origSetGPSPower(1,"android_gpsserial"); + o(s); + })(Serial1.println); + Bangle.setGBGPSPower = (isOn, appID) => { if (!Bangle._PWR) Bangle._PWR={}; if (!Bangle._PWR.GBGPS) Bangle._PWR.GBGPS=[]; @@ -240,6 +252,8 @@ }; // Replace set GPS power logic to suppress activation of gps (and instead request it from the phone) Bangle.setGPSPower = (isOn, appID) => { + // disable our own request for GPS power first + if (!isOn) origSetGPSPower(0,"android_gpsserial"); // if not connected use internal GPS power function if (!NRF.getSecurityStatus().connected) return origSetGPSPower(isOn, appID); return Bangle.setGBGPSPower(isOn, appID); From 2675783aae5424d64b302172e9616495737e96ba Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Fri, 13 Jan 2023 10:14:36 +0100 Subject: [PATCH 08/15] android - Fix typo (wrong function as parameter) --- apps/android/boot.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/android/boot.js b/apps/android/boot.js index a2c0acad9..fe3aa5380 100644 --- a/apps/android/boot.js +++ b/apps/android/boot.js @@ -238,7 +238,7 @@ Serial1.write = (o => s => { origSetGPSPower(1,"android_gpsserial"); o(s); - })(Serial1.println); + })(Serial1.write); Bangle.setGBGPSPower = (isOn, appID) => { if (!Bangle._PWR) Bangle._PWR={}; From 436a3dfd9789173a94aee13c39aac6d5410b7e0c Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Fri, 13 Jan 2023 10:31:42 +0100 Subject: [PATCH 09/15] android - Remove GBGPS tracking --- apps/android/boot.js | 52 +++++++++++++++++--------------------------- apps/android/test.js | 47 +++++---------------------------------- 2 files changed, 25 insertions(+), 74 deletions(-) diff --git a/apps/android/boot.js b/apps/android/boot.js index fe3aa5380..1d3ef7e3a 100644 --- a/apps/android/boot.js +++ b/apps/android/boot.js @@ -141,7 +141,7 @@ Bangle.emit('GPS', event); }, "is_gps_active": function() { - gbSend({ t: "gps_power", status: Bangle.isGBGPSOn() }); + gbSend({ t: "gps_power", status: Bangle.isGPSOn() }); } }; var h = HANDLERS[event.t]; @@ -207,24 +207,19 @@ }; // GPS overwrite logic if (settings.overwriteGps) { // if the overwrite option is set../ - const origIsGPSOn = Bangle.isGPSOn; const origSetGPSPower = Bangle.setGPSPower; // migrate all GPS clients to the other variant on connection events let handleConnect = () => { - if (origIsGPSOn()){ - for (let c of Bangle._PWR.GPS){ - Bangle.setGBGPSPower(1, c); - origSetGPSPower(0, c); - } - } + let orig = Bangle._PWR.GPS; + delete Bangle._PWR.GPS; + origSetGPSPower(0); + Bangle._PWR.GPS = orig; }; let handleDisconnect = () => { - if (Bangle.isGBGPSOn()){ - for (let c of Bangle._PWR.GBGPS){ - origSetGPSPower(1, c); - Bangle.setGBGPSPower(0, c); - } - } + let orig = Bangle._PWR.GPS; + delete Bangle._PWR.GPS; + origSetGPSPower(1); + Bangle._PWR.GPS = orig; }; NRF.on('connect', handleConnect); NRF.on('disconnect', handleDisconnect); @@ -240,35 +235,28 @@ o(s); })(Serial1.write); - Bangle.setGBGPSPower = (isOn, appID) => { - if (!Bangle._PWR) Bangle._PWR={}; - if (!Bangle._PWR.GBGPS) Bangle._PWR.GBGPS=[]; - if (!appID) appID="?"; - if (isOn && !Bangle._PWR.GBGPS.includes(appID)) Bangle._PWR.GBGPS.push(appID); - if (!isOn && Bangle._PWR.GBGPS.includes(appID)) Bangle._PWR.GBGPS.splice(Bangle._PWR.GBGPS.indexOf(appID),1); - let pwr = Bangle._PWR.GBGPS.length>0; - gbSend({ t: "gps_power", status: pwr }); - return pwr; - }; // Replace set GPS power logic to suppress activation of gps (and instead request it from the phone) Bangle.setGPSPower = (isOn, appID) => { - // disable our own request for GPS power first + // disable our own request for GPS power first and always if (!isOn) origSetGPSPower(0,"android_gpsserial"); // if not connected use internal GPS power function if (!NRF.getSecurityStatus().connected) return origSetGPSPower(isOn, appID); - return Bangle.setGBGPSPower(isOn, appID); + if (!Bangle._PWR) Bangle._PWR={}; + if (!Bangle._PWR.GPS) Bangle._PWR.GPS=[]; + if (!appID) appID="?"; + if (isOn && !Bangle._PWR.GPS.includes(appID)) Bangle._PWR.GPS.push(appID); + if (!isOn && Bangle._PWR.GPS.includes(appID)) Bangle._PWR.GPS.splice(Bangle._PWR.GPS.indexOf(appID),1); + let pwr = Bangle._PWR.GPS.length>0; + gbSend({ t: "gps_power", status: pwr }); + return pwr; }; // Allow checking for GPS via GadgetBridge - Bangle.isGBGPSOn = () => { - return !!(Bangle._PWR && Bangle._PWR.GBGPS && Bangle._PWR.GBGPS.length>0); - }; - // Replace check if the GPS is on to check both internal and external GPS Bangle.isGPSOn = () => { - return Bangle.isGBGPSOn() || origIsGPSOn(); + return !!(Bangle._PWR && Bangle._PWR.GPS && Bangle._PWR.GPS.length>0); }; // stop GPS on boot if not activated setTimeout(()=>{ - if (!Bangle.isGBGPSOn()) gbSend({ t: "gps_power", status: false }); + if (!Bangle.isGPSOn()) gbSend({ t: "gps_power", status: false }); },3000); } diff --git a/apps/android/test.js b/apps/android/test.js index 064d2d20b..2bbeebb9d 100644 --- a/apps/android/test.js +++ b/apps/android/test.js @@ -26,84 +26,55 @@ let sec = { NRF.getSecurityStatus = () => sec; setTimeout(() => { - print(Bangle._PWR); + // add an empty starting point to make the asserts work + Bangle._PWR={}; print("Not connected, should use internal GPS"); assertTrue(!NRF.getSecurityStatus().connected, "Not connected"); - assertUndefinedOrEmpty(Bangle._PWR.GBGPS, "No GBGPS"); assertUndefinedOrEmpty(Bangle._PWR.GPS, "No GPS"); assertFalse(Bangle.isGPSOn(), "isGPSOn"); - assertFalse(Bangle.isGBGPSOn(), "isGBGPSOn"); assertTrue(Bangle.setGPSPower(1), "Switch GPS on"); - assertUndefinedOrEmpty(Bangle._PWR.GBGPS, "No GBGPS"); assertNotEmpty(Bangle._PWR.GPS, "GPS"); assertTrue(Bangle.isGPSOn(), "isGPSOn"); - assertFalse(Bangle.isGBGPSOn(), "isGBGPSOn"); assertFalse(Bangle.setGPSPower(0), "Switch GPS off"); - assertUndefinedOrEmpty(Bangle._PWR.GBGPS, "No GBGPS"); assertUndefinedOrEmpty(Bangle._PWR.GPS, "No GPS"); assertFalse(Bangle.isGPSOn(), "isGPSOn"); - assertFalse(Bangle.isGBGPSOn(), "isGBGPSOn"); - - assertTrue(Bangle.setGBGPSPower(1), "Switch GBGPS on"); - - assertUndefinedOrEmpty(Bangle._PWR.GPS, "No GPS"); - assertNotEmpty(Bangle._PWR.GBGPS, "GBGPS"); - assertTrue(Bangle.isGPSOn(), "isGPSOn"); - assertTrue(Bangle.isGBGPSOn(), "isGBGPSOn"); - - assertFalse(Bangle.setGBGPSPower(0), "Switch GBGPS off"); - - assertUndefinedOrEmpty(Bangle._PWR.GBGPS, "No GBGPS"); - assertUndefinedOrEmpty(Bangle._PWR.GPS, "No GPS"); - assertFalse(Bangle.isGPSOn(), "isGPSOn"); - assertFalse(Bangle.isGBGPSOn(), "isGBGPSOn"); print("Connected, should use GB GPS"); sec.connected = true; assertTrue(NRF.getSecurityStatus().connected, "Connected"); - assertUndefinedOrEmpty(Bangle._PWR.GBGPS, "No GBGPS"); assertUndefinedOrEmpty(Bangle._PWR.GPS, "No GPS"); assertFalse(Bangle.isGPSOn(), "isGPSOn"); - assertFalse(Bangle.isGBGPSOn(), "isGBGPSOn"); assertTrue(Bangle.setGPSPower(1), "Switch GPS on"); - assertUndefinedOrEmpty(Bangle._PWR.GPS, "No GPS"); - assertNotEmpty(Bangle._PWR.GBGPS, "GBGPS"); + assertNotEmpty(Bangle._PWR.GPS, "GPS"); assertTrue(Bangle.isGPSOn(), "isGPSOn"); - assertTrue(Bangle.isGBGPSOn(), "isGBGPSOn"); assertFalse(Bangle.setGPSPower(0), "Switch GPS off"); - assertUndefinedOrEmpty(Bangle._PWR.GBGPS, "No GBGPS"); assertUndefinedOrEmpty(Bangle._PWR.GPS, "No GPS"); assertFalse(Bangle.isGPSOn(), "isGPSOn"); - assertFalse(Bangle.isGBGPSOn(), "isGBGPSOn"); print("Connected, then reconnect cycle"); sec.connected = true; assertTrue(NRF.getSecurityStatus().connected, "Connected"); - assertUndefinedOrEmpty(Bangle._PWR.GBGPS, "No GBGPS"); assertUndefinedOrEmpty(Bangle._PWR.GPS, "No GPS"); assertFalse(Bangle.isGPSOn(), "isGPSOn"); - assertFalse(Bangle.isGBGPSOn(), "isGBGPSOn"); assertTrue(Bangle.setGPSPower(1), "Switch GPS on"); - assertUndefinedOrEmpty(Bangle._PWR.GPS, "No GPS"); - assertNotEmpty(Bangle._PWR.GBGPS, "GBGPS"); + assertNotEmpty(Bangle._PWR.GPS, "GPS"); assertTrue(Bangle.isGPSOn(), "isGPSOn"); - assertTrue(Bangle.isGBGPSOn(), "isGBGPSOn"); print("disconnect"); NRF.emit("disconnect", {}); @@ -112,34 +83,26 @@ setTimeout(() => { setTimeout(() => { assertNotEmpty(Bangle._PWR.GPS, "GPS"); - assertUndefinedOrEmpty(Bangle._PWR.GBGPS, "No GBGPS"); assertTrue(Bangle.isGPSOn(), "isGPSOn"); - assertFalse(Bangle.isGBGPSOn(), "isGBGPSOn"); print("connect"); NRF.emit("connect", {}); sec.connected = true; setTimeout(() => { - assertUndefinedOrEmpty(Bangle._PWR.GPS, "No GPS"); - assertNotEmpty(Bangle._PWR.GBGPS, "GBGPS"); + assertNotEmpty(Bangle._PWR.GPS, "GPS"); assertTrue(Bangle.isGPSOn(), "isGPSOn"); - assertTrue(Bangle.isGBGPSOn(), "isGBGPSOn"); assertFalse(Bangle.setGPSPower(0), "Switch GPS off"); - assertUndefinedOrEmpty(Bangle._PWR.GBGPS, "No GBGPS"); assertUndefinedOrEmpty(Bangle._PWR.GPS, "No GPS"); assertFalse(Bangle.isGPSOn(), "isGPSOn"); - assertFalse(Bangle.isGBGPSOn(), "isGBGPSOn"); setTimeout(() => { print("Test disconnect without gps on"); - assertUndefinedOrEmpty(Bangle._PWR.GBGPS, "No GBGPS"); assertUndefinedOrEmpty(Bangle._PWR.GPS, "No GPS"); assertFalse(Bangle.isGPSOn(), "isGPSOn"); - assertFalse(Bangle.isGBGPSOn(), "isGBGPSOn"); print("Result Overall is " + (result ? "OK" : "FAIL")); }, 0); From 966a867d6082990f0bfba0743f55442ec6dd0aad Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Fri, 13 Jan 2023 13:32:28 +0100 Subject: [PATCH 10/15] android - Combine connection handler methods --- apps/android/boot.js | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/apps/android/boot.js b/apps/android/boot.js index 1d3ef7e3a..2b430b9dc 100644 --- a/apps/android/boot.js +++ b/apps/android/boot.js @@ -178,7 +178,7 @@ },options.timeout||30000)}; }); return promise; - } + }; // Battery monitor function sendBattery() { gbSend({ t: "status", bat: E.getBattery(), chg: Bangle.isCharging()?1:0 }); } @@ -209,20 +209,16 @@ if (settings.overwriteGps) { // if the overwrite option is set../ const origSetGPSPower = Bangle.setGPSPower; // migrate all GPS clients to the other variant on connection events - let handleConnect = () => { - let orig = Bangle._PWR.GPS; - delete Bangle._PWR.GPS; - origSetGPSPower(0); - Bangle._PWR.GPS = orig; + let handleConnection = (state) => { + if (Bangle.isGPSOn()){ + let orig = Bangle._PWR.GPS; + delete Bangle._PWR.GPS; + origSetGPSPower(state); + Bangle._PWR.GPS = orig; + } }; - let handleDisconnect = () => { - let orig = Bangle._PWR.GPS; - delete Bangle._PWR.GPS; - origSetGPSPower(1); - Bangle._PWR.GPS = orig; - }; - NRF.on('connect', handleConnect); - NRF.on('disconnect', handleDisconnect); + NRF.on('connect', ()=>{handleConnection(1);}); + NRF.on('disconnect', ()=>{handleConnection(0);}); // Work around Serial1 for GPS not working when connected to something // From b58bf716b35e99a721daf2035952b3f238ff6a8c Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Fri, 13 Jan 2023 21:45:20 +0100 Subject: [PATCH 11/15] android - More compact serial method wrapping --- apps/android/boot.js | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/apps/android/boot.js b/apps/android/boot.js index 2b430b9dc..1dd92bcc0 100644 --- a/apps/android/boot.js +++ b/apps/android/boot.js @@ -221,15 +221,14 @@ NRF.on('disconnect', ()=>{handleConnection(0);}); // Work around Serial1 for GPS not working when connected to something - // - Serial1.println = (o => s => { - origSetGPSPower(1,"android_gpsserial"); - o(s); - })(Serial1.println); - Serial1.write = (o => s => { - origSetGPSPower(1,"android_gpsserial"); - o(s); - })(Serial1.write); + let wrap = function(f){ + return (s)=>{ + origSetGPSPower(1,"android_gpsserial"); + f(s); + }; + } + Serial.println = wrap(Serial1.println); + Serial.write = wrap(Serial1.write); // Replace set GPS power logic to suppress activation of gps (and instead request it from the phone) Bangle.setGPSPower = (isOn, appID) => { From 75be0f45e1bcc491d9531f75b89d164a48be3a43 Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Sat, 14 Jan 2023 01:00:26 +0100 Subject: [PATCH 12/15] android - Fix GPS power state targets for serial workaround --- apps/android/boot.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/android/boot.js b/apps/android/boot.js index 1dd92bcc0..a8de61452 100644 --- a/apps/android/boot.js +++ b/apps/android/boot.js @@ -217,8 +217,8 @@ Bangle._PWR.GPS = orig; } }; - NRF.on('connect', ()=>{handleConnection(1);}); - NRF.on('disconnect', ()=>{handleConnection(0);}); + NRF.on('connect', ()=>{handleConnection(0);}); + NRF.on('disconnect', ()=>{handleConnection(1);}); // Work around Serial1 for GPS not working when connected to something let wrap = function(f){ From faca786436ff5ed03ae4aa60ab49278f0ebacb3f Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Sat, 14 Jan 2023 01:01:05 +0100 Subject: [PATCH 13/15] android - Switch of internal GPS after timeout when serial was used --- apps/android/boot.js | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/apps/android/boot.js b/apps/android/boot.js index a8de61452..412f27a69 100644 --- a/apps/android/boot.js +++ b/apps/android/boot.js @@ -221,19 +221,24 @@ NRF.on('disconnect', ()=>{handleConnection(1);}); // Work around Serial1 for GPS not working when connected to something + let serialTimeout; let wrap = function(f){ return (s)=>{ + if (serialTimeout) clearTimeout(serialTimeout); origSetGPSPower(1,"android_gpsserial"); f(s); + serialTimeout = setTimeout(()=>{ + serialTimeout = undefined; + origSetGPSPower(0,"android_gpsserial"); + },5000); }; - } - Serial.println = wrap(Serial1.println); - Serial.write = wrap(Serial1.write); + }; + Serial1.println = wrap(Serial1.println); + Serial1.write = wrap(Serial1.write); // Replace set GPS power logic to suppress activation of gps (and instead request it from the phone) Bangle.setGPSPower = (isOn, appID) => { // disable our own request for GPS power first and always - if (!isOn) origSetGPSPower(0,"android_gpsserial"); // if not connected use internal GPS power function if (!NRF.getSecurityStatus().connected) return origSetGPSPower(isOn, appID); if (!Bangle._PWR) Bangle._PWR={}; From d85e884e2a9934d6872de3c75c2ca50d921dcafe Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Sat, 14 Jan 2023 01:01:33 +0100 Subject: [PATCH 14/15] android - Check for internal GPS by using the pin state --- apps/android/test.js | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/apps/android/test.js b/apps/android/test.js index 2bbeebb9d..88a7c0566 100644 --- a/apps/android/test.js +++ b/apps/android/test.js @@ -19,6 +19,10 @@ function assertNotEmpty(array, text) { assertTrue(array && array.length > 0, text); } +let internalOn = () => { + return getPinMode((process.env.HWVERSION==2)?D30:D26) == "input"; +}; + let sec = { connected: false }; @@ -35,15 +39,17 @@ setTimeout(() => { assertUndefinedOrEmpty(Bangle._PWR.GPS, "No GPS"); assertFalse(Bangle.isGPSOn(), "isGPSOn"); - assertTrue(Bangle.setGPSPower(1), "Switch GPS on"); + assertTrue(Bangle.setGPSPower(1, "test"), "Switch GPS on"); assertNotEmpty(Bangle._PWR.GPS, "GPS"); assertTrue(Bangle.isGPSOn(), "isGPSOn"); + assertTrue(internalOn(), "Internal GPS on"); - assertFalse(Bangle.setGPSPower(0), "Switch GPS off"); + assertFalse(Bangle.setGPSPower(0, "test"), "Switch GPS off"); assertUndefinedOrEmpty(Bangle._PWR.GPS, "No GPS"); assertFalse(Bangle.isGPSOn(), "isGPSOn"); + assertFalse(internalOn(), "Internal GPS off"); print("Connected, should use GB GPS"); sec.connected = true; @@ -52,16 +58,19 @@ setTimeout(() => { assertUndefinedOrEmpty(Bangle._PWR.GPS, "No GPS"); assertFalse(Bangle.isGPSOn(), "isGPSOn"); + assertFalse(internalOn(), "Internal GPS off"); - assertTrue(Bangle.setGPSPower(1), "Switch GPS on"); + assertTrue(Bangle.setGPSPower(1, "test"), "Switch GPS on"); assertNotEmpty(Bangle._PWR.GPS, "GPS"); assertTrue(Bangle.isGPSOn(), "isGPSOn"); + assertFalse(internalOn(), "Internal GPS off"); - assertFalse(Bangle.setGPSPower(0), "Switch GPS off"); + assertFalse(Bangle.setGPSPower(0, "test"), "Switch GPS off"); assertUndefinedOrEmpty(Bangle._PWR.GPS, "No GPS"); assertFalse(Bangle.isGPSOn(), "isGPSOn"); + assertFalse(internalOn(), "Internal GPS off"); print("Connected, then reconnect cycle"); sec.connected = true; @@ -70,39 +79,45 @@ setTimeout(() => { assertUndefinedOrEmpty(Bangle._PWR.GPS, "No GPS"); assertFalse(Bangle.isGPSOn(), "isGPSOn"); + assertFalse(internalOn(), "Internal GPS off"); - assertTrue(Bangle.setGPSPower(1), "Switch GPS on"); + assertTrue(Bangle.setGPSPower(1, "test"), "Switch GPS on"); assertNotEmpty(Bangle._PWR.GPS, "GPS"); assertTrue(Bangle.isGPSOn(), "isGPSOn"); + assertFalse(internalOn(), "Internal GPS off"); - print("disconnect"); NRF.emit("disconnect", {}); + print("disconnect"); sec.connected = false; setTimeout(() => { assertNotEmpty(Bangle._PWR.GPS, "GPS"); assertTrue(Bangle.isGPSOn(), "isGPSOn"); + assertTrue(internalOn(), "Internal GPS on"); print("connect"); - NRF.emit("connect", {}); sec.connected = true; + NRF.emit("connect", {}); setTimeout(() => { assertNotEmpty(Bangle._PWR.GPS, "GPS"); assertTrue(Bangle.isGPSOn(), "isGPSOn"); + assertFalse(internalOn(), "Internal GPS off"); - assertFalse(Bangle.setGPSPower(0), "Switch GPS off"); + assertFalse(Bangle.setGPSPower(0, "test"), "Switch GPS off"); assertUndefinedOrEmpty(Bangle._PWR.GPS, "No GPS"); assertFalse(Bangle.isGPSOn(), "isGPSOn"); + assertFalse(internalOn(), "Internal GPS off"); setTimeout(() => { print("Test disconnect without gps on"); assertUndefinedOrEmpty(Bangle._PWR.GPS, "No GPS"); assertFalse(Bangle.isGPSOn(), "isGPSOn"); + assertFalse(internalOn(), "Internal GPS off"); print("Result Overall is " + (result ? "OK" : "FAIL")); }, 0); From e5f6ea674f880520784a3040cf32d9b7a06eb06c Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Sat, 14 Jan 2023 09:25:05 +0100 Subject: [PATCH 15/15] android - Use handler method to switch to internal GPS when Serial is accessed --- apps/android/boot.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/apps/android/boot.js b/apps/android/boot.js index 412f27a69..fa1beacd2 100644 --- a/apps/android/boot.js +++ b/apps/android/boot.js @@ -225,12 +225,12 @@ let wrap = function(f){ return (s)=>{ if (serialTimeout) clearTimeout(serialTimeout); - origSetGPSPower(1,"android_gpsserial"); + handleConnection(1); f(s); serialTimeout = setTimeout(()=>{ serialTimeout = undefined; - origSetGPSPower(0,"android_gpsserial"); - },5000); + if (NRF.getSecurityStatus().connected) handleConnection(0); + }, 10000); }; }; Serial1.println = wrap(Serial1.println); @@ -238,7 +238,6 @@ // Replace set GPS power logic to suppress activation of gps (and instead request it from the phone) Bangle.setGPSPower = (isOn, appID) => { - // disable our own request for GPS power first and always // if not connected use internal GPS power function if (!NRF.getSecurityStatus().connected) return origSetGPSPower(isOn, appID); if (!Bangle._PWR) Bangle._PWR={};