mirror of https://github.com/espruino/BangleApps
80 lines
2.7 KiB
JavaScript
80 lines
2.7 KiB
JavaScript
{
|
|
const settings = Object.assign({
|
|
speed: 6, // when lower then this use direction from compass
|
|
compassSrc: 2, // [off, built-in, magnav]
|
|
resetCompassOnPwr: true, // reset compass on power on
|
|
}, require("Storage").readJSON("gpsmagcourse.json", true) || {});
|
|
const CALIBDATA = (settings.compassSrc === 2) ? require("Storage").readJSON("magnav.json",1) : undefined;
|
|
let cntAboveSpeed = 0;
|
|
let lastGPS;
|
|
|
|
// Check if magnav is installed
|
|
try {
|
|
require("magnav");
|
|
} catch(err) {
|
|
// not installed, adjust settings to work without magnav
|
|
if (settings.compassSrc === 2) {
|
|
settings.compassSrc = 1;
|
|
}
|
|
}
|
|
if (settings.compassSrc === 2 && !CALIBDATA) {
|
|
// No calibration for magnav, fallback to built-in compass
|
|
settings.compassSrc = 1;
|
|
}
|
|
|
|
// execute Bangle.resetCompass() after Bangle.setCompassPower();
|
|
if (settings.resetCompassOnPwr) {
|
|
const origSetCompassPower = Bangle.setCompassPower;
|
|
Bangle.setCompassPower = function(on, id) {
|
|
const isOn = origSetCompassPower(on, id);
|
|
if (on) {
|
|
Bangle.resetCompass();
|
|
}
|
|
return isOn;
|
|
};
|
|
} // if (settings.resetCompassOnPwr)
|
|
|
|
if (settings.compassSrc > 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) => {
|
|
cntAboveSpeed = gps.speed < settings.speed ? 0 : cntAboveSpeed+1;
|
|
if (cntAboveSpeed < 10) { // need to stay x events above or equal threshold
|
|
if (settings.compassSrc === 1 && isFaceUp(Bangle.getAccel())) { // Use built-in compass 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
|
|
gps.courseOrig = gps.course;
|
|
gps.course = require("magnav").tiltfixread(CALIBDATA.offset,CALIBDATA.scale);
|
|
}
|
|
}
|
|
return gps;
|
|
};
|
|
|
|
// Modify GPS event
|
|
Bangle.on('GPS', gps => {
|
|
lastGPS = gps;
|
|
if (!isNaN(gps.course)) {
|
|
changeGpsCourse(gps);
|
|
}
|
|
});
|
|
const origGetGPSFix = Bangle.getGPSFix;
|
|
Bangle.getGPSFix = function() {
|
|
return lastGPS === undefined ? origGetGPSFix() : lastGPS;
|
|
};
|
|
|
|
// Enable Compass with GPS
|
|
const origSetGPSPower = Bangle.setGPSPower;
|
|
Bangle.setGPSPower = function(on, id) {
|
|
const isGPSon = origSetGPSPower(on, id);
|
|
Bangle.setCompassPower(isGPSon, "gpsmagcourse" + (id || ''));
|
|
return isGPSon;
|
|
};
|
|
} // if (settings.compassSrc > 0)
|
|
}
|