From f1ce35362e5eae3f3c3fcef059ef133459846ee9 Mon Sep 17 00:00:00 2001 From: Erik Andresen Date: Thu, 16 Feb 2023 19:07:59 +0100 Subject: [PATCH] Adding gpsmagdir bootloader modification Replace GPS heading with compass heading when speed is slow or standing still to avoid the heading from jumping around randomly --- apps/gpsmagdir/README.md | 12 ++++++ apps/gpsmagdir/app.png | Bin 0 -> 1224 bytes apps/gpsmagdir/boot.js | 81 +++++++++++++++++++++++++++++++++++ apps/gpsmagdir/metadata.json | 17 ++++++++ 4 files changed, 110 insertions(+) create mode 100644 apps/gpsmagdir/README.md create mode 100644 apps/gpsmagdir/app.png create mode 100644 apps/gpsmagdir/boot.js create mode 100644 apps/gpsmagdir/metadata.json diff --git a/apps/gpsmagdir/README.md b/apps/gpsmagdir/README.md new file mode 100644 index 000000000..b4c3acf0c --- /dev/null +++ b/apps/gpsmagdir/README.md @@ -0,0 +1,12 @@ +TODO: +- Add Widget +- Add Settings +- Test on BangleJS +- Document settings with defaults +- Document Widget +- Write a summary why +- Drop a note about compass north vs true north +- Note that top of Bangle must point at moving direction when compass +- Document uncompensated compass only when clock is faced up +- Note to regularly calibrate compass before use +- Note compass value not when NaN after calibration diff --git a/apps/gpsmagdir/app.png b/apps/gpsmagdir/app.png new file mode 100644 index 0000000000000000000000000000000000000000..c7e990268e5962927ee471d37fadf9771a4cca2f GIT binary patch literal 1224 zcmV;(1ULJMP)cO9wm>?PxZ;CM{L|NFa>cvE}i;JKF;-c}&k9r^;Tz02kbJ*pX z>Yl-#>Y8Pyw|iXTd`TU4`t_^tdsY4F)mwlrx>&p*2KSQ(>)=WSd9a&2_yn#*PytpG zgMb)ZpaRDfmXnX!p%^>|5EAN$X^mu0Y#D?Ba~Qhji#-w1W}!{!+I zX!OAo=9#gHzatbL6DoMPW5fr?Xc<@fHLmnrBN09O+-PunD1gB?2>~8_ZJt$zvB%gp zyesuZq42$dJ#=-h26 z=Oe*`bvs%QE6IcNO$B%`P3z#gx_wCo4{?QmxK_frM6tTawuC)at=d%K|*u z>+(_dv5?qGe)ZAx0+jyNTGr2<Md;x z5DK?gAMRl%`A1+md2p^q?8JQaKdpy*iNOyw0e?{eR=Di!l+7hRlR|*rZ8>?xNy>vF zd7z2GOQwjsoL>T1N(?IDdC>=3oO4Tj)e7FnZ3{?5A$DLj5Q@s?Tif+--XR7%nx*bm zRzHE>4`-;A0Xd;}q4ReIED*i_`xS^oNc<`OA(;;gI)suRY_M-_Z95TCe`eL`gSoJE zKq&pXm4!Zqb|IABX5F|>K!?C3o@^9QEw}9?yfs;+#8&^pow+cM!IUeBQeqf;Ae&+i zomFI(5E6&2?K76z8J9RD2tUS%IcZ~`KbEc3E8$) zl9LFfPdAHFD+O3NTHVHN6WzilGVjuvj&kCH|LAQuFyeZgOTBr)c|I$YB;F>Zu9(Wvl)nxE$D(J|a_ZWq mljzhvIyZC$bkPNL1pff@&jb*6-b};*0000 0) { + const isFaceUp = (acc) => { + return (acc.z<-6700/8192) && (acc.z>-9000/8192) && Math.abs(acc.x)<2048/8192 && Math.abs(acc.y)<2048/8192; + }; + + const changeGpsCourse = (gps) => { + if (gps.speed < settings.speed) { + if (settings.compassSrc === 1 && (settings.tiltCompensation || isFaceUp(Bangle.getAccel()))) { // Use uncompensated firmware heading only if face is up + const heading = Bangle.getCompass().heading; + if (!isNaN(heading)) { + gps.courseOrig = gps.course; + gps.course = Bangle.getCompass().heading; + } + } else if (settings.compassSrc === 2) { // magnav tilt correction with magnav calibration + gps.courseOrig = gps.course; + gps.course = require("magnav").tiltfixread(CALIBDATA.offset,CALIBDATA.scale); + } + } + return gps; + }; + + // Modify GPS event + Bangle.on('GPS', gps => { + changeGpsCourse(gps); + }); + const origGetGPSFix = Bangle.getGPSFix; + Bangle.getGPSFix = function() { + return changeGpsCourse(origGetGPSFix()); + }; + + // Enable Compass with GPS + const origSetGPSPower = Bangle.setGPSPower; + Bangle.setGPSPower = function(on, id) { + const isGPSon = origSetGPSPower(on, id); + Bangle.setCompassPower(isGPSon, "gpsmagdir"); + return isGPSon; + }; + } // if (settings.compassSrc > 0) +} diff --git a/apps/gpsmagdir/metadata.json b/apps/gpsmagdir/metadata.json new file mode 100644 index 000000000..ebff8f7c9 --- /dev/null +++ b/apps/gpsmagdir/metadata.json @@ -0,0 +1,17 @@ +{ + "id": "gpsmagdir", + "name": "GPS Compass heading switcher", + "shortName":"GPS/Compass direction", + "icon": "app.png", + "version":"0.01", + "description": "Replace GPS heading with compass heading when speed is slow or standing still to avoid the heading from jumping around randomly.", + "type": "bootloader", + "tags": "outdoors", + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"gpsmagdir.boot.js","url":"boot.js"} + ], + "data": [{"name":"gpsmagdir.json"}] +} +