From 7c0a30f912ba7a7b1efd2665ee698c87c72c1ea4 Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Fri, 21 Jul 2023 17:50:53 +0100 Subject: [PATCH 01/11] gps-scramble: new app --- apps/gps-scramble/ChangeLog | 1 + apps/gps-scramble/README.md | 19 ++++++++++++++++ apps/gps-scramble/metadata.json | 14 ++++++++++++ apps/gps-scramble/recorder.js | 29 ++++++++++++++++++++++++ apps/gps-scramble/recorder.ts | 40 +++++++++++++++++++++++++++++++++ 5 files changed, 103 insertions(+) create mode 100644 apps/gps-scramble/ChangeLog create mode 100644 apps/gps-scramble/README.md create mode 100644 apps/gps-scramble/metadata.json create mode 100644 apps/gps-scramble/recorder.js create mode 100644 apps/gps-scramble/recorder.ts diff --git a/apps/gps-scramble/ChangeLog b/apps/gps-scramble/ChangeLog new file mode 100644 index 0000000000..90161ac985 --- /dev/null +++ b/apps/gps-scramble/ChangeLog @@ -0,0 +1 @@ +0.01: Initial app diff --git a/apps/gps-scramble/README.md b/apps/gps-scramble/README.md new file mode 100644 index 0000000000..44b8b3a190 --- /dev/null +++ b/apps/gps-scramble/README.md @@ -0,0 +1,19 @@ +# GPS Scramble + +This app wraps the existing [GPS recorder] and "scrambles" the GPS recording so, if lost, a read of the GPS files on the watch won't give away your home, work or other locations. + +## Tech + +The scrambling works by shifting your GPS records so they start in the middle of the pacific ocean, making it very difficult for someone to attempt to guess where the GPS track originated. To restore your track, the recorder app can unscramble these coordinates when provided with the starting location for your track. + +The constraints on this design are: +- Avoid needing to enter a password whenever the watch loads +- Avoid storing true GPS coordinates (to prevent SWD reads) +- Avoid heavy crypto +- Avoid reliance on an external device, e.g. a phone + +## Discussion + +Initial discussion took place on the [espruino forum](https://forum.espruino.com/conversations/388489/). + +[GPS recorder]: https://github.com/espruino/BangleApps/blob/0eea248390f5245c8d5bceb3eb2e976fab193a45/apps/recorder/widget.js#L22-L58 diff --git a/apps/gps-scramble/metadata.json b/apps/gps-scramble/metadata.json new file mode 100644 index 0000000000..f8d70ca5a5 --- /dev/null +++ b/apps/gps-scramble/metadata.json @@ -0,0 +1,14 @@ +{ + "id": "gps-scramble", + "name": "GPS Scrambler", + "shortName": "GPS Scramble", + "version": "0.01", + "description": "Scramble GPS to maintain privacy if your watch is lost", + "icon": "TODO.png", + "tags": "tool,outdoors,gps", + "supports": ["BANGLEJS", "BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name": "gps-scramble.recorder.js", "url": "recorder.js"} + ] +} diff --git a/apps/gps-scramble/recorder.js b/apps/gps-scramble/recorder.js new file mode 100644 index 0000000000..72a624206c --- /dev/null +++ b/apps/gps-scramble/recorder.js @@ -0,0 +1,29 @@ +(function (recorders) { + var __assign = Object.assign; + var pacific = { lat: -4.21, lon: -146.25 }; + var gpsRecorder = recorders.gps; + if (!gpsRecorder) + return; + recorders.gps = function () { + var gps = gpsRecorder(); + var offset; + return __assign(__assign({}, gps), { name: "GPS (scramble)", getValues: function () { + var values = gps.getValues(); + if (!values[0].length) { + } + else if (offset) { + values[0] = (Number(values[0]) + offset[0]).toFixed(6); + values[1] = (Number(values[1]) + offset[1]).toFixed(6); + } + else { + offset = [ + pacific.lat - Number(values[0]), + pacific.lon - Number(values[1]), + ]; + values[0] = "" + pacific.lat; + values[1] = "" + pacific.lon; + } + return values; + } }); + }; +}); diff --git a/apps/gps-scramble/recorder.ts b/apps/gps-scramble/recorder.ts new file mode 100644 index 0000000000..00cf3f3da9 --- /dev/null +++ b/apps/gps-scramble/recorder.ts @@ -0,0 +1,40 @@ +((recorders: Recorders) => { + // @ts-ignore helper + const __assign = Object.assign; + + const pacific = { lat: -4.21, lon: -146.25 }; + + // @ts-ignore index signature + const gpsRecorder = recorders.gps; + if (!gpsRecorder) return; + + // @ts-ignore index signature + recorders.gps = () => { + const gps = gpsRecorder(); + let offset: undefined | [number, number]; + + return { + ...gps, + name: "GPS (scramble)", + getValues: () => { + const values = gps.getValues() as string[]; + + if (!values[0]!.length) { + // no change + } else if (offset) { + values[0] = (Number(values[0]) + offset[0]).toFixed(6); + values[1] = (Number(values[1]) + offset[1]).toFixed(6); + } else { + offset = [ + pacific.lat - Number(values[0]), + pacific.lon - Number(values[1]), + ]; + values[0] = "" + pacific.lat; + values[1] = "" + pacific.lon; + } + + return values; + }, + }; + }; +}) From ac1fc2fc9db4b45d57d4423530870ea691dfd283 Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Fri, 21 Jul 2023 17:51:09 +0100 Subject: [PATCH 02/11] gps-scramble: allow unscrambling in recorder's interface --- apps/recorder/interface.html | 40 ++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/apps/recorder/interface.html b/apps/recorder/interface.html index cc9762d203..73e84f8818 100644 --- a/apps/recorder/interface.html +++ b/apps/recorder/interface.html @@ -160,11 +160,28 @@ function downloadTrack(filename, callback) { Util.showModal("Downloading Track..."); + + const pacific = { lat: -4.21, lon: -146.25 }; + const offset = { + lat: Number(document.getElementById("unscramble-lat").value), + lon: Number(document.getElementById("unscramble-lon").value), + }; + Util.readStorageFile(filename,data=>{ Util.hideModal(); var lines = data.trim().split("\n"); var headers = lines.shift().split(","); var track = lines.map(l=>trackLineToObject(headers, l)); + + if (localStorage.getItem("recorder-unscramble-gps")=="true") { + for (const entry of track) { + if (entry.Latitude.length) { + entry.Latitude = Number(entry.Latitude) - pacific.lat + offset.lat; + entry.Longitude = Number(entry.Longitude) - pacific.lon + offset.lon; + } + } + } + callback(track); }); } @@ -264,6 +281,20 @@

Settings

Include GPX/KML entries even when there's no GPS info +
+ + +
+ + + + + +
+
`; domTracks.innerHTML = html; @@ -271,6 +302,15 @@

Settings

var allowNoGPS = event.target.checked; localStorage.setItem("recorder-allow-no-gps", allowNoGPS); }); + document.getElementById("settings-unscramble-gps").addEventListener("change",event=>{ + var unscramble = event.target.checked; + localStorage.setItem("recorder-unscramble-gps", unscramble); + + document.getElementById("unscramble-cfg").classList.toggle("d-hide", !unscramble); + }); + if (localStorage.getItem("recorder-unscramble-gps")=="true") { + document.getElementById("settings-unscramble-gps").click(); // trigger listener + } Util.hideModal(); var buttons = domTracks.querySelectorAll("button"); for (var i=0;i Date: Fri, 21 Jul 2023 17:54:29 +0100 Subject: [PATCH 03/11] gps-scramble: add "recorder" type --- apps/gps-scramble/metadata.json | 1 + bin/sanitycheck.js | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/gps-scramble/metadata.json b/apps/gps-scramble/metadata.json index f8d70ca5a5..ecbcd4c494 100644 --- a/apps/gps-scramble/metadata.json +++ b/apps/gps-scramble/metadata.json @@ -8,6 +8,7 @@ "tags": "tool,outdoors,gps", "supports": ["BANGLEJS", "BANGLEJS2"], "readme": "README.md", + "type": "recorder", "storage": [ {"name": "gps-scramble.recorder.js", "url": "recorder.js"} ] diff --git a/bin/sanitycheck.js b/bin/sanitycheck.js index d5c7554437..009edad965 100755 --- a/bin/sanitycheck.js +++ b/bin/sanitycheck.js @@ -81,7 +81,7 @@ const APP_KEYS = [ const STORAGE_KEYS = ['name', 'url', 'content', 'evaluate', 'noOverwite', 'supports', 'noOverwrite']; const DATA_KEYS = ['name', 'wildcard', 'storageFile', 'url', 'content', 'evaluate']; const SUPPORTS_DEVICES = ["BANGLEJS","BANGLEJS2"]; // device IDs allowed for 'supports' -const METADATA_TYPES = ["app","clock","widget","bootloader","RAM","launch","scheduler","notify","locale","settings","waypoints","textinput","module","clkinfo"]; // values allowed for "type" field +const METADATA_TYPES = ["app","clock","widget","bootloader","RAM","launch","scheduler","notify","locale","settings","waypoints","textinput","module","clkinfo","recorder"]; // values allowed for "type" field const FORBIDDEN_FILE_NAME_CHARS = /[,;]/; // used as separators in appid.info const VALID_DUPLICATES = [ '.tfmodel', '.tfnames' ]; const GRANDFATHERED_ICONS = ["s7clk", "snek", "astral", "alpinenav", "slomoclock", "arrow", "pebble", "rebble"]; From 19979544d4628aed8a0cf8c9228524ea10645581 Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Fri, 21 Jul 2023 18:44:37 +0100 Subject: [PATCH 04/11] gps-scramble: icons --- apps/gps-scramble/icon.js | 1 + apps/gps-scramble/icon.png | Bin 0 -> 2048 bytes apps/gps-scramble/metadata.json | 5 +++-- 3 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 apps/gps-scramble/icon.js create mode 100644 apps/gps-scramble/icon.png diff --git a/apps/gps-scramble/icon.js b/apps/gps-scramble/icon.js new file mode 100644 index 0000000000..4bb85a53f3 --- /dev/null +++ b/apps/gps-scramble/icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("lEoxH+AG2IwWCrwADAwIMCy4AEEimIxOtxIADFwV6z2e5IACzwpPxFexGt2YADFIolFFIomLJQIlFAAQmDz4mIFBhMBIggqFO4ZzFAAQHDE5CNBEwgoFO4ZOEz2l6/X0oIEFAxNGAAZ2GEw4oGE4x0HJIRQCE5AmDAAInJr2DTZJ3EBQOXE6WCwRxHABJ3TdRDADE4/CY5fCzxOJEIImDFA+mDwYoBAAQHEJxIAIUwutD4gAHE6ZQGPAgAGOxgmN2esKBWeEYInPOopQNJwInDOxWtEpIABwRQIEwOJrwnLEhTICxLqFegYaBE5ZMLAAIPBKA5OCE5gmME4QoGz2BBQQnHM4YmPAAOfFAR1DE4juDOQYnSUQPCdYIIEE4xQEEyJ5CTgYHCwQnBxGIOYSdSAAmBTgYnFKAIYKE54AGOwQnCOIgoOMQYnOPARBKPqdeOwYABrzuEAA7PKKg5OEKAShDMxZQOJwyhCDIYnYwROGPIwnYExJ5CFALhKZJlexAnJFAJRCEyQTCExh6DEyezH4ImOZgTNBEx+tCYIlPPYhTDEpRMSKQwpBxGJfQQjCxLaBwQlWfIwsCAAIkdADYA==")) diff --git a/apps/gps-scramble/icon.png b/apps/gps-scramble/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..fc3ea7f5fbb150b4875ca238c0014da72a037f94 GIT binary patch literal 2048 zcmV+b2>ENK*EHu2{0f-Fq=ULNeE#;2Ba$iu|Z~$(87+lm_-7Ek$#=u z0WFs+2|+XIOwY`B=5o)u_kQ?o=XVqp_5V1s0De)Sw*5^kn~@8eCzi6MqdV!9I!|iZ zFc6jNfLCSoWJxEs1+C_(qVD+&d~Srr`U4dmT~5WsEa+IQU6ej1Wtt6`K%Kp!<&$=ctv!p`z7!@*WhOBJY+RYLq>%j zS}t)t`nWUuwv-h2k2yKuDkvbrYy0KP`xKk)(y`gqCJyKA6NBAWn15L)o9^RP={+T? zIRd0z1DXa`0lLg@K&V`&sX+c5G=IMWlbh0ih(t_ zL%E=0$O+{Sols}oh8~AIC}e@k5BHsP0(2k6(=4|s5WrMY5>T;mM0ouwH z`@ahdm)~wNawSF(bUkBO1y$Iy0kYXW8k~CGOm?_&Jy65%@$o=U(DAzinOuGf@ z09Ut~{D9KYZP3TY(cFtJMXMbJ#Cue1EX~b&7V9-L<`gUMawP`O&9+5)CaTs!Zg~?n zL9}ZJSzOe+LH+^!ThC@k4j30l1JtotdkjE9%Z&AUy@?TTHI$11Gq4&QvVXt22RH73ea8eFMj>5pj@dbri~f&u8Yh&K^14$-PrIv4aU`GJm#y2^!> zYuEfA&dntWfj~!-Wc}t%-@295R4~TIYUtK$HCr<8P6f@_rpK?z2Rmo?K&0NF&6Pi7 z7HzMFzVC*qe_W*1Im}i}2#h%tS}qU{HJNn5J@UZ^7kzL5@D{hq;1P7L1urS8b&?Rl z=7d;`&B5dIp=BMYkK@Uf7D~($%Y=OuPglr6bJ;nAc*S#!dY+aFxT(kO@PqIPe(8IG;rfXgJ4#B4H;8+U86? zz)b1HHg+B-0sHpBCP^M_5{@fB!(SxBYHI4SaJZ&F@gnJhGVe~he1O=y@jIU$3spL} z1znamps*bjY;6S6EV!Yvau}$ye+e6luEIi~&YpwHiid!?fJ{EXv~nHk;lja{4Q|nD zT%?j)4q7l(G7l{OOb!W%bIN2cS(`6^30U%cfY(ZgNuwDKFp`}_8$@-6ZSs6^vlT|- zKBDc-fqSnm_6!u?vmAc!6{MDp_yMs^$D4tj3bs^%rDfn0*6UmHfT+h`H|q*Iz{p8} z?SS48uZ^6~pkCPSTbHl+kq*eM)Oqp)T--A0FB=$hw>6umvR=dZ4#N}5%hzEpImHKv z*Q!ftv^Dwi7jzfnp{G{ow;*n3fgh?hY@ZlTv*@N-&nr>KG7O#Nz#5kePkB5Tia!V9 z`%APn{Ek)N)r`7*fc)mk#qW*JNI!>rEN*AmUiB{@xK(+AtkoW>esm{v?Ud+9r;VzR zj4meUbWt>u+ZbKd6Iq*Vg&rKlUNGR#F0SaNifvA z1f5Swc@Zn^zhMB9wo5kCeyi0)dtvL7@PNWYVNx~zaM0L>6UJ^ZS7YpD)cgSX?dGwl zP~%R&{hb`?xT}6-mFAYf!+1EA4sJzcMcmhqKAUsT3cTu3cUHgsosfVeqkFBaj4HiH zHobLhq6m*jGQvDu1yj=_dR+56R)}khdlvs170LKkY0bV~Z2)gPD((9b0k%B}|JzMq z3G+UaN8*lxLb<&*>LjCBVJ`Wq+5nwX2m5gGG1*uAU^8rIeN?3bTZfjTpg?AoN1bMr zsOGZpCpU~qtY@L%szzL-F^v=sH-sYPJaMZ??x;Q$oDWj%_*3@XF=uY$V-U!gr@k7! zE26gFt8TLk@|q_hTRQH#-Mf$&^;3*2lj-e3*{mA>V=Sat?XfJB4s1o_R;Dl#9bC>G(H2_%og-5yn%sL50PeJkKAiC zJcAPD9Nefi0=9HTUFNoi{^egq{T!oAN`0000 Date: Fri, 21 Jul 2023 21:56:03 +0100 Subject: [PATCH 05/11] main.d.ts adjustment for Number(...) --- typescript/types/main.d.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/typescript/types/main.d.ts b/typescript/types/main.d.ts index ecf509f708..6277d63956 100644 --- a/typescript/types/main.d.ts +++ b/typescript/types/main.d.ts @@ -10589,6 +10589,11 @@ interface NumberConstructor { * @url http://www.espruino.com/Reference#l_Number_Number */ new(...value: any[]): any; + + /** + * Converts the given argument to a number + */ + (value: any): number; } interface Number { From 64712f681cac374b3cc6165c17587b973c79675b Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Sat, 22 Jul 2023 15:25:33 +0100 Subject: [PATCH 06/11] recorder: interface remembers scramble coords --- apps/recorder/interface.html | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/apps/recorder/interface.html b/apps/recorder/interface.html index 73e84f8818..121145c8d8 100644 --- a/apps/recorder/interface.html +++ b/apps/recorder/interface.html @@ -186,6 +186,28 @@ }); } +function scrambleInit() { + document.getElementById("settings-unscramble-gps").addEventListener("change", event => { + var unscramble = event.target.checked; + localStorage.setItem("recorder-unscramble-gps", unscramble); + + document.getElementById("unscramble-cfg").classList.toggle("d-hide", !unscramble); + }); + + if (localStorage.getItem("recorder-unscramble-gps")=="true") + document.getElementById("settings-unscramble-gps").click(); // trigger listener + + const bind = (el, storeKey) => { + el.value = localStorage.getItem(storeKey); + el.addEventListener("change", event => { + localStorage.setItem(storeKey, event.target.value); + }); + }; + + bind(document.getElementById("unscramble-lat"), "recorder-unscramble-gps-lat"); + bind(document.getElementById("unscramble-lon"), "recorder-unscramble-gps-lon"); +} + function getTrackList() { Util.showModal("Loading Track List..."); domTracks.innerHTML = ""; @@ -302,15 +324,8 @@

Settings

var allowNoGPS = event.target.checked; localStorage.setItem("recorder-allow-no-gps", allowNoGPS); }); - document.getElementById("settings-unscramble-gps").addEventListener("change",event=>{ - var unscramble = event.target.checked; - localStorage.setItem("recorder-unscramble-gps", unscramble); + scrambleInit(); - document.getElementById("unscramble-cfg").classList.toggle("d-hide", !unscramble); - }); - if (localStorage.getItem("recorder-unscramble-gps")=="true") { - document.getElementById("settings-unscramble-gps").click(); // trigger listener - } Util.hideModal(); var buttons = domTracks.querySelectorAll("button"); for (var i=0;i Date: Sat, 22 Jul 2023 17:30:11 +0100 Subject: [PATCH 07/11] gps-scramble: separate self from gps recorder --- apps/gps-scramble/recorder.js | 2 +- apps/gps-scramble/recorder.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/gps-scramble/recorder.js b/apps/gps-scramble/recorder.js index 72a624206c..11dca17f8d 100644 --- a/apps/gps-scramble/recorder.js +++ b/apps/gps-scramble/recorder.js @@ -4,7 +4,7 @@ var gpsRecorder = recorders.gps; if (!gpsRecorder) return; - recorders.gps = function () { + recorders.gpsScramble = function () { var gps = gpsRecorder(); var offset; return __assign(__assign({}, gps), { name: "GPS (scramble)", getValues: function () { diff --git a/apps/gps-scramble/recorder.ts b/apps/gps-scramble/recorder.ts index 00cf3f3da9..28b9bacf30 100644 --- a/apps/gps-scramble/recorder.ts +++ b/apps/gps-scramble/recorder.ts @@ -9,7 +9,7 @@ if (!gpsRecorder) return; // @ts-ignore index signature - recorders.gps = () => { + recorders.gpsScramble = () => { const gps = gpsRecorder(); let offset: undefined | [number, number]; From 145e04733bba960c82f322b0cd4a3f2fe866c296 Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Sat, 22 Jul 2023 17:30:22 +0100 Subject: [PATCH 08/11] gps-scramble: use String() --- apps/gps-scramble/recorder.js | 4 ++-- apps/gps-scramble/recorder.ts | 4 ++-- typescript/types/main.d.ts | 5 +++++ 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/apps/gps-scramble/recorder.js b/apps/gps-scramble/recorder.js index 11dca17f8d..3e988f5641 100644 --- a/apps/gps-scramble/recorder.js +++ b/apps/gps-scramble/recorder.js @@ -20,8 +20,8 @@ pacific.lat - Number(values[0]), pacific.lon - Number(values[1]), ]; - values[0] = "" + pacific.lat; - values[1] = "" + pacific.lon; + values[0] = String(pacific.lat); + values[1] = String(pacific.lon); } return values; } }); diff --git a/apps/gps-scramble/recorder.ts b/apps/gps-scramble/recorder.ts index 28b9bacf30..c25af41851 100644 --- a/apps/gps-scramble/recorder.ts +++ b/apps/gps-scramble/recorder.ts @@ -29,8 +29,8 @@ pacific.lat - Number(values[0]), pacific.lon - Number(values[1]), ]; - values[0] = "" + pacific.lat; - values[1] = "" + pacific.lon; + values[0] = String(pacific.lat); + values[1] = String(pacific.lon); } return values; diff --git a/typescript/types/main.d.ts b/typescript/types/main.d.ts index 6277d63956..c7591658ea 100644 --- a/typescript/types/main.d.ts +++ b/typescript/types/main.d.ts @@ -10255,6 +10255,11 @@ interface StringConstructor { * @url http://www.espruino.com/Reference#l_String_String */ new(...str: any[]): any; + + /** + * Converts the given argument to a string + */ + (s: any): string; } interface String { From 3f21612d6b3f4ff625a2e03636027c78132fe0cb Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Sat, 22 Jul 2023 17:30:34 +0100 Subject: [PATCH 09/11] gps-scramble: add scramble-start entry for detection / re-offsetting possibility --- apps/gps-scramble/recorder.js | 3 ++- apps/gps-scramble/recorder.ts | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/apps/gps-scramble/recorder.js b/apps/gps-scramble/recorder.js index 3e988f5641..f29ec2e7aa 100644 --- a/apps/gps-scramble/recorder.js +++ b/apps/gps-scramble/recorder.js @@ -7,8 +7,9 @@ recorders.gpsScramble = function () { var gps = gpsRecorder(); var offset; - return __assign(__assign({}, gps), { name: "GPS (scramble)", getValues: function () { + return __assign(__assign({}, gps), { name: "GPS (scramble)", fields: gps.fields.concat("ScrambleStart"), getValues: function () { var values = gps.getValues(); + values.push(String(!offset)); if (!values[0].length) { } else if (offset) { diff --git a/apps/gps-scramble/recorder.ts b/apps/gps-scramble/recorder.ts index c25af41851..2c0f3d7b22 100644 --- a/apps/gps-scramble/recorder.ts +++ b/apps/gps-scramble/recorder.ts @@ -16,8 +16,10 @@ return { ...gps, name: "GPS (scramble)", + fields: gps.fields.concat("ScrambleStart"), getValues: () => { const values = gps.getValues() as string[]; + values.push(String(!offset)); if (!values[0]!.length) { // no change From 86348b7b9e067ba4925f15c0d50d817e11e45e59 Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Sat, 22 Jul 2023 17:40:12 +0100 Subject: [PATCH 10/11] gps-scramble: update readme --- apps/gps-scramble/README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apps/gps-scramble/README.md b/apps/gps-scramble/README.md index 44b8b3a190..34b556f826 100644 --- a/apps/gps-scramble/README.md +++ b/apps/gps-scramble/README.md @@ -16,4 +16,8 @@ The constraints on this design are: Initial discussion took place on the [espruino forum](https://forum.espruino.com/conversations/388489/). +## Todo + +- [ ] Handle unscrambling a restart of GPS recording at a new location + [GPS recorder]: https://github.com/espruino/BangleApps/blob/0eea248390f5245c8d5bceb3eb2e976fab193a45/apps/recorder/widget.js#L22-L58 From d31ef879aa738c2e298aedf371eef392d09c851a Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Sat, 22 Jul 2023 17:51:55 +0100 Subject: [PATCH 11/11] gps-scramble: replace GPS We want to replace to avoid accidentally enabling both, or having recorder's interface having to deal with two different lon/lat fields. --- apps/gps-scramble/recorder.js | 1 + apps/gps-scramble/recorder.ts | 3 +++ 2 files changed, 4 insertions(+) diff --git a/apps/gps-scramble/recorder.js b/apps/gps-scramble/recorder.js index f29ec2e7aa..7ac02ab9b1 100644 --- a/apps/gps-scramble/recorder.js +++ b/apps/gps-scramble/recorder.js @@ -4,6 +4,7 @@ var gpsRecorder = recorders.gps; if (!gpsRecorder) return; + delete recorders.gps; recorders.gpsScramble = function () { var gps = gpsRecorder(); var offset; diff --git a/apps/gps-scramble/recorder.ts b/apps/gps-scramble/recorder.ts index 2c0f3d7b22..eb0e7978dc 100644 --- a/apps/gps-scramble/recorder.ts +++ b/apps/gps-scramble/recorder.ts @@ -8,6 +8,9 @@ const gpsRecorder = recorders.gps; if (!gpsRecorder) return; + // @ts-ignore index signature + delete recorders.gps; + // @ts-ignore index signature recorders.gpsScramble = () => { const gps = gpsRecorder();