1
0
Fork 0
mirror of https://github.com/iNavFlight/inav-configurator.git synced 2025-07-13 03:19:54 +03:00
inav-configurator/js/ublox/UBLOX.js
2025-02-13 20:11:40 +01:00

256 lines
8.6 KiB
JavaScript

'use strict';
const semver = require('semver');
require('./../injected_methods');
const jBox = require('./../libraries/jBox/jBox.min');
const i18n = require('./../localization');
const { GUI } = require('./../gui');
const { globalSettings } = require('../globalSettings');
const Store = require('electron-store');
var ublox = (function () {
var self = {};
var assistnowOnline = null;
var assistnowOffline = null;
// m7 = aid, not supported
// m8+ = mga
const fmt="mga";;
const gnss="gps,gal,bds,glo,qzss";
const onlineServers = [
'online-live1.services.u-blox.com',
'online-live2.services.u-blox.com',
];
const period=5
const offline_gnss="gps,gal,bds,glo";
const offline_alm="gps,gal,bds,glo";
const offlineServers = [
'offline-live1.services.u-blox.com',
'offline-live2.services.u-blox.com'
];
self.init = function() {
};
var hasFirstHeader;
var hasSecondHeader;
var ubxClass;
var ubxId;
var lenLow;
var lenHigh;
var payloadLen;
var skipped;
var currentCommand;
function resetUbloxState() {
//console.log("Reset ublox state");
hasFirstHeader = false;
hasSecondHeader = false;
ubxClass = false;
ubxId = false;
lenLow = false;
lenHigh = false;
payloadLen = 0;
skipped = 0;
currentCommand = [];
}
function splitUbloxData(ubxBytesBuffer) {
//console.log("type of data: " +typeof(ubxBytesBuffer));
//console.log("splitUbloxData: " + ubxBytesBuffer.byteLength);
let ubxBytes = new DataView(ubxBytesBuffer);
var ubxCommands = []
resetUbloxState()
for(var i = 0; i < ubxBytes.byteLength;++i) {
let c = ubxBytes.getUint8(i);
//console.log("byte: 0x" + c.toString(16));
if (!hasFirstHeader) {
if (c == 0xb5) {
//console.log("First header");
hasFirstHeader = true;
currentCommand.push(c);
continue;
}
else
{
resetUbloxState();
continue;
}
}
if (!hasSecondHeader) {
if (c == 0x62) {
//console.log("Second header");
hasSecondHeader = true;
currentCommand.push(c);
continue;
}
else
{
resetUbloxState();
continue;
}
}
if (!ubxClass) {
ubxClass = true;
//console.log("ubxClass: 0x"+ (c).toString(16));
currentCommand.push(c)
continue;
}
if (!ubxId) {
ubxId = true;
//console.log("ubxId: 0x"+ (c).toString(16));
currentCommand.push(c);
continue;
}
if (!lenLow) {
//console.log("Len low");
lenLow = true;
//(int) c
payloadLen = c;
currentCommand.push(c);
continue;
}
if (!lenHigh) {
//console.log("Len high");
lenHigh = true;
// (int)c
payloadLen = (c << 8) | payloadLen;
//console.log("Payload len " + payloadLen);
payloadLen += 2; // add crc bytes;
currentCommand.push(c);
continue
}
if (skipped < payloadLen - 1) {
//console.log("payload + crc");
skipped = skipped + 1;
currentCommand.push(c);
continue;
}
if (skipped == payloadLen - 1) {
skipped = skipped + 1;
currentCommand.push(c);
ubxCommands.push(currentCommand);
//console.log("Adding command");
resetUbloxState();
continue;
}
}
return ubxCommands
}
function getBinaryData(url, successCallback, failCallback) {
const req = new XMLHttpRequest();
req.open("GET", url, true);
req.responseType = "arraybuffer";
if (successCallback != null) {
req.onload = (event) => {
if(req.status == 200) {
successCallback(req.response);
} else {
if(failCallback != null) {
var dec = new TextDecoder('utf-8');
GUI.log(`http status: ${req.status}: ${dec.decode(req.response)}`)
failCallback(req.response);
}
}
};
}
if (failCallback != null) {
req.onerror = (event) => {
var dec = new TextDecoder('utf-8');
GUI.log(i18n.getMessage("gpsAssistnowLoadDataError") + ": Received an unkonwn error when trying to download data.")
failCallback("Unknown error.");
}
}
try {
req.send(null);
} catch(error) {
GUI.alert(i18n.getMessage("gpsAssistnowLoadDataError"));
GUI.log(i18n.getMessage("gpsAssistnowLoadDataError") + ':' + error.toString());
console.log(i18n.getMessage("gpsAssistnowLoadDataError") + ':' + JSON.stringify(error));
}
}
function loadError(e) {
GUI.alert(i18n.getMessage("gpsAssistnowLoadDataError"));
var dec = new TextDecoder('utf-8');
GUI.log(JSON.stringify(e));
}
// For more info on assistnow, check:
// https://developer.thingstream.io/guides/location-services/assistnow-user-guide
// Currently only supported for M8+ units
self.loadAssistnowOffline = function(callback) {
let url = `https://${ offlineServers[0] }/GetOfflineData.ashx?token=${globalSettings.assistnowApiKey};gnss=${offline_gnss};format=${fmt};period=${period};resolution=1;alm=${offline_alm};`
//console.log(url);
function processOfflineData(data) {
if(globalSettings.assistnowOfflineData == null || ((Date.now() / 1000)-globalSettings.assistnowOfflineDate) > (60*60*24*3)) {
console.log("AssistnowOfflineData older than 3 days, refreshing.");
globalSettings.assistnowOfflineData = splitUbloxData(data);
globalSettings.assistnowOfflineDate = Math.floor(Date.now() / 1000);
globalSettings.saveAssistnowData();
} else {
console.log("AssitnowOfflineData newer than 3 days. Re-using.");
}
//console.log("Assitnow offline commands:" + globalSettings.assistnowOfflineData.length);
callback(globalSettings.assistnowOfflineData);
}
getBinaryData(url, processOfflineData, loadError);
//$.get(url, processOfflineData).fail(function() {GUI.alert("Error loading Offline data")});
};
self.loadAssistnowOnline = function(callback) {
//url = "https://online-live1.services.u-blox.com/GetOnlineData.ashx?token=" + online_token + ";gnss=" + gnss + ";datatype=eph,alm,aux,pos;format=" + fmt + ";"
let url = `https://${ onlineServers[0] }/GetOnlineData.ashx?token=${globalSettings.assistnowApiKey};gnss=${ gnss };datatype=eph,alm,aux,pos;format=${ fmt }`;
function processOnlineData(data) {
assistnowOnline = splitUbloxData(data);
//console.log("Assitnow online commands:" + assistnowOnline.length);
callback(assistnowOnline);
}
//$.get(url, processOnlineData).fail(function() {GUI.alert("Error loading Offline data")});
getBinaryData(url, processOnlineData, loadError);
}
self.isAssistnowDataRelevant = function(ubxMessage, cy, cm, cd) {
if ((ubxMessage[2] == 0x13 /*UBX_CLASS_MGA*/) && (ubxMessage[3] == 0x20 /*UBX_MGA_ANO*/))
{
// UBX-MGA-ANO
const payloadOffset = 6;
if (((ubxMessage[payloadOffset + 4] + 2000) == cy) && (ubxMessage[payloadOffset + 5] == cm) && (ubxMessage[payloadOffset + 6] == cd))
{
//console.log("UBX-MGA_ANO date matches");
return true;
}
} else {
//console.log("UBX-CMD: class: 0x" + ubxMessage[2].toString(16) + " id: 0x" + ubxMessage[3].toString(16));
return true;
}
return false;
}
return self;
})();
module.exports = ublox;