diff --git a/apps/magnav/ChangeLog b/apps/magnav/ChangeLog index 2b2782c7b..14a6eb2a2 100644 --- a/apps/magnav/ChangeLog +++ b/apps/magnav/ChangeLog @@ -2,6 +2,5 @@ 0.02: Course marker 0.03: Tilt compensation and calibration 0.04: Fix Font size -0.05: Inital portable version - - +0.05: Initial portable version +0.06: Outsource tilt compensation to library diff --git a/apps/magnav/lib.js b/apps/magnav/lib.js new file mode 100644 index 000000000..e3fe8fccb --- /dev/null +++ b/apps/magnav/lib.js @@ -0,0 +1,41 @@ +exports.calibrate = () => { + var max={x:-32000, y:-32000, z:-32000}, + min={x:32000, y:32000, z:32000}; + var ref = setInterval(()=>{ + var m = Bangle.getCompass(); + max.x = m.x>max.x?m.x:max.x; + max.y = m.y>max.y?m.y:max.y; + max.z = m.z>max.z?m.z:max.z; + min.x = m.x { + setTimeout(()=>{ + if(ref) clearInterval(ref); + var offset = {x:(max.x+min.x)/2,y:(max.y+min.y)/2,z:(max.z+min.z)/2}; + var delta = {x:(max.x-min.x)/2,y:(max.y-min.y)/2,z:(max.z-min.z)/2}; + var avg = (delta.x+delta.y+delta.z)/3; + var scale = {x:avg/delta.x, y:avg/delta.y, z:avg/delta.z}; + resolve({offset:offset,scale:scale}); + },20000); + }); +} + +exports.tiltfixread = (O,S) => { + "ram" + var m = Bangle.getCompass(); + var g = Bangle.getAccel(); + m.dx =(m.x-O.x)*S.x; m.dy=(m.y-O.y)*S.y; m.dz=(m.z-O.z)*S.z; + var d = Math.atan2(-m.dx,m.dy)*180/Math.PI; + if (d<0) d+=360; + var phi = Math.atan(-g.x/-g.z); + var cosphi = Math.cos(phi), sinphi = Math.sin(phi); + var theta = Math.atan(-g.y/(-g.x*sinphi-g.z*cosphi)); + var costheta = Math.cos(theta), sintheta = Math.sin(theta); + var xh = m.dy*costheta + m.dx*sinphi*sintheta + m.dz*cosphi*sintheta; + var yh = m.dz*sinphi - m.dx*cosphi; + var psi = Math.atan2(yh,xh)*180/Math.PI; + if (psi<0) psi+=360; + return psi; +} diff --git a/apps/magnav/magnav_b1.js b/apps/magnav/magnav_b1.js index 739ff881f..0ec49014f 100644 --- a/apps/magnav/magnav_b1.js +++ b/apps/magnav/magnav_b1.js @@ -61,24 +61,7 @@ function newHeading(m,h){ var candraw = false; var CALIBDATA = require("Storage").readJSON("magnav.json",1)||null; - -function tiltfixread(O,S){ - "ram" - var m = Bangle.getCompass(); - var g = Bangle.getAccel(); - m.dx =(m.x-O.x)*S.x; m.dy=(m.y-O.y)*S.y; m.dz=(m.z-O.z)*S.z; - var d = Math.atan2(-m.dx,m.dy)*180/Math.PI; - if (d<0) d+=360; - var phi = Math.atan(-g.x/-g.z); - var cosphi = Math.cos(phi), sinphi = Math.sin(phi); - var theta = Math.atan(-g.y/(-g.x*sinphi-g.z*cosphi)); - var costheta = Math.cos(theta), sintheta = Math.sin(theta); - var xh = m.dy*costheta + m.dx*sinphi*sintheta + m.dz*cosphi*sintheta; - var yh = m.dz*sinphi - m.dx*cosphi; - var psi = Math.atan2(yh,xh)*180/Math.PI; - if (psi<0) psi+=360; - return psi; -} +const tiltfixread = require("magnav").tiltfixread; // Note actual mag is 360-m, error in firmware function reading() { @@ -97,30 +80,6 @@ function reading() { flip(buf,Yoff+80); } -function calibrate(){ - var max={x:-32000, y:-32000, z:-32000}, - min={x:32000, y:32000, z:32000}; - var ref = setInterval(()=>{ - var m = Bangle.getCompass(); - max.x = m.x>max.x?m.x:max.x; - max.y = m.y>max.y?m.y:max.y; - max.z = m.z>max.z?m.z:max.z; - min.x = m.x { - setTimeout(()=>{ - if(ref) clearInterval(ref); - var offset = {x:(max.x+min.x)/2,y:(max.y+min.y)/2,z:(max.z+min.z)/2}; - var delta = {x:(max.x-min.x)/2,y:(max.y-min.y)/2,z:(max.z-min.z)/2}; - var avg = (delta.x+delta.y+delta.z)/3; - var scale = {x:avg/delta.x, y:avg/delta.y, z:avg/delta.z}; - resolve({offset:offset,scale:scale}); - },20000); - }); -} - var calibrating=false; function docalibrate(first){ calibrating=true; @@ -139,7 +98,7 @@ function docalibrate(first){ buf.drawString("Fig 8s to",120,0); buf.drawString("Calibrate",120,26); flip(buf,Yoff); - calibrate().then((r)=>{ + require("magnav").calibrate().then((r)=>{ CALIBDATA=r; require("Storage").write("magnav.json",r); restart() diff --git a/apps/magnav/metadata.json b/apps/magnav/metadata.json index cba9a1ac3..bd40a08fd 100644 --- a/apps/magnav/metadata.json +++ b/apps/magnav/metadata.json @@ -1,7 +1,7 @@ { "id": "magnav", "name": "Navigation Compass", - "version": "0.05", + "version": "0.06", "description": "Compass with linear display as for GPSNAV. Has Tilt compensation and remembers calibration.", "screenshots": [{"url":"screenshot-b2.png"},{"url":"screenshot-light-b2.png"}], "icon": "magnav.png", @@ -11,6 +11,7 @@ "storage": [ {"name":"magnav.app.js","url":"magnav_b1.js","supports":["BANGLEJS"]}, {"name":"magnav.app.js","url":"magnav_b2.js","supports":["BANGLEJS2"]}, + {"name":"magnav","url":"lib.js"}, {"name":"magnav.img","url":"magnav-icon.js","evaluate":true} ], "data": [{"name":"magnav.json"}] diff --git a/apps/waypointer/ChangeLog b/apps/waypointer/ChangeLog index 8613ef799..60e8bfab0 100644 --- a/apps/waypointer/ChangeLog +++ b/apps/waypointer/ChangeLog @@ -5,3 +5,4 @@ 0.05: Fix not displaying of wpindex = 0 0.06: Added adjustment for Bangle.js magnetometer heading fix 0.07: Add settings file with the option to disable the slow direction updates +0.08: Use tilt compensation from new magnav library diff --git a/apps/waypointer/app.js b/apps/waypointer/app.js index de6bfdcaa..40e4cf974 100644 --- a/apps/waypointer/app.js +++ b/apps/waypointer/app.js @@ -85,31 +85,22 @@ function newHeading(m,h){ } var CALIBDATA = require("Storage").readJSON("magnav.json",1) || {}; - -function tiltfixread(O,S){ - var m = Bangle.getCompass(); - if (O === undefined || S === undefined) { - // no valid calibration from magnav, use built in - return m.heading; - } - var g = Bangle.getAccel(); - m.dx =(m.x-O.x)*S.x; m.dy=(m.y-O.y)*S.y; m.dz=(m.z-O.z)*S.z; - var d = Math.atan2(-m.dx,m.dy)*180/Math.PI; - if (d<0) d+=360; - var phi = Math.atan(-g.x/-g.z); - var cosphi = Math.cos(phi), sinphi = Math.sin(phi); - var theta = Math.atan(-g.y/(-g.x*sinphi-g.z*cosphi)); - var costheta = Math.cos(theta), sintheta = Math.sin(theta); - var xh = m.dy*costheta + m.dx*sinphi*sintheta + m.dz*cosphi*sintheta; - var yh = m.dz*sinphi - m.dx*cosphi; - var psi = Math.atan2(yh,xh)*180/Math.PI; - if (psi<0) psi+=360; - return psi; +let tiltfixread; +try { + tiltfixread = require("magnav").tiltfixread; +} catch(e) { + // magnav not installed } // Note actual mag is 360-m, error in firmware function read_compass() { - var d = tiltfixread(CALIBDATA.offset,CALIBDATA.scale); + let d; + if (tiltfixread === undefined || CALIBDATA.offset === undefined || CALIBDATA.scale === undefined) { + // magnav not installed or no valid calibration, use built in + d = Bangle.getCompass().heading; + } else { + d = tiltfixread(CALIBDATA.offset,CALIBDATA.scale); + } if (isNaN(d)) return; // built in compass heading can return NaN when uncalibrated heading = newHeading(d,heading); direction = wp_bearing - heading; @@ -278,6 +269,9 @@ function doselect(){ wp = waypoints[wpindex]; require("waypoints").save(waypoints); } + if (selected) { + Bangle.resetCompass(); // reset built in compass when a waypoint is selected + } selected=!selected; drawN(); } @@ -294,6 +288,7 @@ Bangle.drawWidgets(); // load widgets can turn off GPS Bangle.setGPSPower(1); Bangle.setCompassPower(1); +Bangle.resetCompass() // reset built in compass on start in case we are not using tilt compensation drawAll(); startTimers(); Bangle.on('GPS', onGPS); diff --git a/apps/waypointer/metadata.json b/apps/waypointer/metadata.json index 0bbc42322..e21c5f10f 100644 --- a/apps/waypointer/metadata.json +++ b/apps/waypointer/metadata.json @@ -1,12 +1,12 @@ { "id": "waypointer", "name": "Way Pointer", - "version": "0.07", + "version": "0.08", "description": "Navigate to a waypoint using the GPS for bearing and compass to point way, uses the same waypoint interface as GPS Navigation", "icon": "waypointer.png", "tags": "tool,outdoors,gps", "supports": ["BANGLEJS", "BANGLEJS2"], - "dependencies" : { "waypoints":"type" }, + "dependencies" : { "waypoints":"type", "magnav" : "app" }, "readme": "README.md", "storage": [ {"name":"waypointer.app.js","url":"app.js"},