2022-07-11 11:39:14 +00:00
|
|
|
function readSettings() {
|
|
|
|
settings = Object.assign(
|
|
|
|
require('Storage').readJSON("agpsdata.default.json", true) || {},
|
|
|
|
require('Storage').readJSON(FILE, true) || {});
|
|
|
|
}
|
|
|
|
|
|
|
|
var FILE = "agpsdata.settings.json";
|
|
|
|
var settings;
|
|
|
|
readSettings();
|
|
|
|
|
2022-11-05 19:39:51 +00:00
|
|
|
function setAGPS(b64) {
|
|
|
|
return new Promise(function(resolve, reject) {
|
|
|
|
var initCommands = "Bangle.setGPSPower(1);\n"; // turn GPS on
|
|
|
|
const gnsstype = settings.gnsstype || 1; // default GPS
|
|
|
|
initCommands += `Serial1.println("${CASIC_CHECKSUM("$PCAS04," + gnsstype)}")\n`; // set GNSS mode
|
|
|
|
// What about:
|
|
|
|
// NAV-TIMEUTC (0x01 0x10)
|
|
|
|
// NAV-PV (0x01 0x03)
|
|
|
|
// or AGPS.zip uses AID-INI (0x0B 0x01)
|
|
|
|
|
|
|
|
eval(initCommands);
|
|
|
|
|
|
|
|
try {
|
|
|
|
writeChunks(atob(b64), resolve);
|
|
|
|
} catch (e) {
|
|
|
|
console.log("error:", e);
|
|
|
|
reject();
|
|
|
|
}
|
|
|
|
});
|
2022-07-06 12:03:35 +00:00
|
|
|
}
|
|
|
|
|
2022-11-05 19:39:51 +00:00
|
|
|
var chunkI = 0;
|
|
|
|
function writeChunks(bin, resolve) {
|
|
|
|
return new Promise(function(resolve2) {
|
|
|
|
const chunkSize = 128;
|
|
|
|
setTimeout(function() {
|
|
|
|
if (chunkI < bin.length) {
|
|
|
|
var chunk = bin.substr(chunkI, chunkSize);
|
|
|
|
js = `Serial1.write(atob("${btoa(chunk)}"))\n`;
|
|
|
|
eval(js);
|
2022-07-06 12:03:35 +00:00
|
|
|
|
2022-11-05 19:39:51 +00:00
|
|
|
chunkI += chunkSize;
|
|
|
|
writeChunks(bin, resolve);
|
|
|
|
} else {
|
|
|
|
if (resolve)
|
|
|
|
resolve(); // call outer resolve
|
|
|
|
}
|
|
|
|
}, 200);
|
|
|
|
});
|
2022-07-06 12:03:35 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function CASIC_CHECKSUM(cmd) {
|
|
|
|
var cs = 0;
|
2022-11-05 19:39:51 +00:00
|
|
|
for (var i = 1; i < cmd.length; i++)
|
2022-07-06 12:03:35 +00:00
|
|
|
cs = cs ^ cmd.charCodeAt(i);
|
2022-11-05 19:39:51 +00:00
|
|
|
return cmd + "*" + cs.toString(16).toUpperCase().padStart(2, '0');
|
2022-07-06 12:03:35 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function updateLastUpdate() {
|
2022-07-07 07:51:57 +00:00
|
|
|
const file = "agpsdata.json";
|
|
|
|
let data = require("Storage").readJSON(file, 1) || {};
|
|
|
|
data.lastUpdate = Math.round(Date.now());
|
|
|
|
require("Storage").writeJSON(file, data);
|
2022-07-06 12:03:35 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
exports.pull = function(successCallback, failureCallback) {
|
2022-11-05 19:39:51 +00:00
|
|
|
const uri = "https://www.espruino.com/agps/casic.base64";
|
|
|
|
if (Bangle.http) {
|
|
|
|
Bangle.http(uri, {timeout : 10000})
|
|
|
|
.then(event => {
|
|
|
|
setAGPS(event.resp)
|
|
|
|
.then(r => {
|
|
|
|
updateLastUpdate();
|
|
|
|
if (successCallback)
|
|
|
|
successCallback();
|
|
|
|
})
|
|
|
|
.catch((e) => {
|
|
|
|
console.log("error", e);
|
|
|
|
if (failureCallback)
|
|
|
|
failureCallback(e);
|
|
|
|
});
|
|
|
|
})
|
|
|
|
.catch((e) => {
|
|
|
|
console.log("error", e);
|
|
|
|
if (failureCallback)
|
|
|
|
failureCallback(e);
|
|
|
|
});
|
2022-07-06 12:03:35 +00:00
|
|
|
} else {
|
|
|
|
console.log("error: No http method found");
|
2022-11-05 19:39:51 +00:00
|
|
|
if (failureCallback)
|
|
|
|
failureCallback(/*LANG*/ "No http method");
|
2022-07-06 12:03:35 +00:00
|
|
|
}
|
|
|
|
};
|