From 05f6d3e8df78b42d7a894507b383b1078873b825 Mon Sep 17 00:00:00 2001 From: Marcelo Bezerra <23555060+mmosca@users.noreply.github.com> Date: Sun, 23 Jun 2024 13:36:08 +0200 Subject: [PATCH 01/11] Add MSP2_INAV_GPS_UBLOX_COMMAND code --- js/msp/MSPCodes.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/js/msp/MSPCodes.js b/js/msp/MSPCodes.js index 613f0f6c..abe54465 100644 --- a/js/msp/MSPCodes.js +++ b/js/msp/MSPCodes.js @@ -225,6 +225,8 @@ var MSPCodes = { MSP2_INAV_FW_APPROACH: 0x204A, MSP2_INAV_SET_FW_APPROACH: 0x204B, + MSP2_INAV_GPS_UBLOX_COMMAND: 0x2050, + MSP2_INAV_RATE_DYNAMICS: 0x2060, MSP2_INAV_SET_RATE_DYNAMICS: 0x2061, From e497b7f3608b78abb4913f14c8fcd42c84f01e4e Mon Sep 17 00:00:00 2001 From: Marcelo Bezerra <23555060+mmosca@users.noreply.github.com> Date: Sun, 23 Jun 2024 14:50:52 +0200 Subject: [PATCH 02/11] Add Assistnow Key configuration and some basic build setup --- gulpfile.js | 1 + js/configurator_main.js | 7 +++++++ js/globalSettings.js | 1 + js/msp/MSPHelper.js | 4 ++++ locale/en/messages.json | 6 ++++++ tabs/options.html | 12 ++++++++++++ 6 files changed, 31 insertions(+) diff --git a/gulpfile.js b/gulpfile.js index 91a16809..d3257b5d 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -89,6 +89,7 @@ sources.js = [ './js/msp/MSPCodes.js', './js/msp/MSPHelper.js', './js/msp/MSPchainer.js', + './js/ublox/UBLOX.js', './js/port_handler.js', './js/connection/connection.js', './js/connection/connectionBle.js', diff --git a/js/configurator_main.js b/js/configurator_main.js index 4ca94c2d..8bcf3f73 100644 --- a/js/configurator_main.js +++ b/js/configurator_main.js @@ -81,6 +81,7 @@ $(function() { globalSettings.unitType = store.get('unit_type', UnitType.none); globalSettings.mapProviderType = store.get('map_provider_type', 'osm'); globalSettings.mapApiKey = store.get('map_api_key', ''); + globalSettings.assistnowApiKey = store.get('assistnow_api_key', ''); globalSettings.proxyURL = store.get('proxyurl', 'http://192.168.1.222/mapproxy/service?'); globalSettings.proxyLayer = store.get('proxylayer', 'your_proxy_layer_name'); globalSettings.showProfileParameters = store.get('show_profile_parameters', 1); @@ -340,6 +341,7 @@ $(function() { $('#proxylayer').val(globalSettings.proxyLayer); $('#showProfileParameters').prop('checked', globalSettings.showProfileParameters); $('#cliAutocomplete').prop('checked', globalSettings.cliAutocomplete); + $('#assistnow-api-key').val(globalSettings.assistnowApiKey); i18n.getLanguages().forEach(lng => { $('#languageOption').append("".format(lng, i18n.getMessage("language_" + lng))); @@ -383,6 +385,11 @@ $(function() { store.set('proxylayer', $(this).val()); globalSettings.proxyLayer = $(this).val(); }); + $('#assistnow-api-key').on('change', function () { + store.set('assistnow_api_key', $(this).val()); + globalSettings.assistnowApiKey = $(this).val(); + }); + $('#demoModeReset').on('click', function () { SITLProcess.deleteEepromFile('demo.bin'); }); diff --git a/js/globalSettings.js b/js/globalSettings.js index 1a58268c..96b078fb 100644 --- a/js/globalSettings.js +++ b/js/globalSettings.js @@ -21,6 +21,7 @@ var globalSettings = { // tree target for documents docsTreeLocation: 'master', cliAutocomplete: true, + assistnowApiKey: null, }; module.exports = { globalSettings, UnitType }; \ No newline at end of file diff --git a/js/msp/MSPHelper.js b/js/msp/MSPHelper.js index 383b99bb..c8d64572 100644 --- a/js/msp/MSPHelper.js +++ b/js/msp/MSPHelper.js @@ -3383,6 +3383,10 @@ var mspHelper = (function () { MSP.send_message(MSPCodes.MSP2_SET_CF_SERIAL_CONFIG, mspHelper.crunch(MSPCodes.MSP2_SET_CF_SERIAL_CONFIG), false, callback); }; + self.sendUbloxCommand = function (ubloxData, callback) { + MSP.send_message(MSPCodes.MSP2_INAV_GPS_UBLOX_COMMAND, ubloxData, false, callback); + }; + return self; })(); diff --git a/locale/en/messages.json b/locale/en/messages.json index 88d11147..928351d5 100644 --- a/locale/en/messages.json +++ b/locale/en/messages.json @@ -5911,5 +5911,11 @@ }, "maintenanceFlushSettingsCache": { "message": "Flush settings cache" + }, + "gpsOptions": { + "message": "GPS Options" + }, + "gpsOptionsAssistnowToken": { + "message": "AssitNow Token" } } diff --git a/tabs/options.html b/tabs/options.html index 7c21b29d..d7e6c2f9 100644 --- a/tabs/options.html +++ b/tabs/options.html @@ -97,5 +97,17 @@ +
+
+
+
+ +
+
+ + +
+
+
\ No newline at end of file From dd3e10fd59d19ce9ecf1ba68b175e72dc3c01dd2 Mon Sep 17 00:00:00 2001 From: Marcelo Bezerra <23555060+mmosca@users.noreply.github.com> Date: Sun, 23 Jun 2024 14:51:47 +0200 Subject: [PATCH 03/11] Add new file --- js/ublox/UBLOX.js | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 js/ublox/UBLOX.js diff --git a/js/ublox/UBLOX.js b/js/ublox/UBLOX.js new file mode 100644 index 00000000..0970b020 --- /dev/null +++ b/js/ublox/UBLOX.js @@ -0,0 +1,26 @@ +'use strict'; + +const semver = require('semver'); + +require('./../injected_methods'); +const { GUI } = require('./../gui'); + +var ublox = (function () { + var self = {}; + var assistnowOnline = null; + var assitnowOffline = null; + + self.init = function() { + + }; + + self.loadAssitnowOffline = function(token) { + + }; + + self.loadAssistnowOnline = function(token) { + + } + +}); + From ee98c708075c7bcb6b010d6d3b58b7f382f856a1 Mon Sep 17 00:00:00 2001 From: Marcelo Bezerra <23555060+mmosca@users.noreply.github.com> Date: Sun, 23 Jun 2024 17:59:46 +0200 Subject: [PATCH 04/11] Add some of the basic plumbing for Assistnow handling Currently able to fetch assistnow online and offline data from the web, but breaking data down into individual ubx commands is failing. I may need to change it into fetching and treating data as binary. --- js/ublox/UBLOX.js | 176 ++++++++++++++++++++++++++++++++++++++-- locale/en/messages.json | 6 ++ tabs/gps.html | 6 ++ tabs/gps.js | 24 ++++++ 4 files changed, 207 insertions(+), 5 deletions(-) diff --git a/js/ublox/UBLOX.js b/js/ublox/UBLOX.js index 0970b020..45a5f8ac 100644 --- a/js/ublox/UBLOX.js +++ b/js/ublox/UBLOX.js @@ -3,24 +3,190 @@ 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'); + var ublox = (function () { var self = {}; var assistnowOnline = null; - var assitnowOffline = 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() { }; - self.loadAssitnowOffline = function(token) { + 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(ubxBytes) { + console.log("type of data: " +typeof(ubxBytes)); + console.log("splitUbloxData: " + ubxBytes.length); + + var ubxCommands = [] + resetUbloxState() + + for(var i = 0; i < ubxBytes.length;++i) { + let c = ubxBytes.charCodeAt(i); + //let c = ubxBytes[i]; + 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 processOnlineData(data) { + assistnowOnline = splitUbloxData(data); + + console.log("Assitnow online commands:" + assistnowOnline.length); + } + + function processOfflineData(data) { + assistnowOffline = splitUbloxData(data); + console.log("Assitnow offline commands:" + assistnowOffline.length); + } + + + + // 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) { + // offline_url = "https://offline-live1.services.u-blox.com/GetOfflineData.ashx?token=" + offline_token + ";gnss=" + offline_gnss + ";format=" + fmt + ";period=" + period + ";resolution=1;alm=" + alm + ";" + + 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); + + $.get(url, processOfflineData).fail(function() {GUI.alert("Error loading Offline data")}); + + if(callback != null) { + callback(""); + } }; - self.loadAssistnowOnline = function(token) { + 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 }`; + $.get(url, processOnlineData).fail(function() {GUI.alert("Error loading Offline data")}); + + if(callback != null) { + callback(""); + } } - -}); + return self; +})(); + + +module.exports = ublox; diff --git a/locale/en/messages.json b/locale/en/messages.json index 928351d5..26122d8f 100644 --- a/locale/en/messages.json +++ b/locale/en/messages.json @@ -5917,5 +5917,11 @@ }, "gpsOptionsAssistnowToken": { "message": "AssitNow Token" + }, + "gpsLoadAssistnowOfflineButton": { + "message": "Load AssistNow Offline" + }, + "gpsLoadAssistnowOnlineButton": { + "message": "Load AssistNow Online" } } diff --git a/tabs/gps.html b/tabs/gps.html index 3cf66f9d..c217b7b9 100644 --- a/tabs/gps.html +++ b/tabs/gps.html @@ -159,5 +159,11 @@
+
+ +
+
+ +
\ No newline at end of file diff --git a/tabs/gps.js b/tabs/gps.js index 87aee163..0441437c 100644 --- a/tabs/gps.js +++ b/tabs/gps.js @@ -18,6 +18,7 @@ const features = require('./../js/feature_framework'); const { globalSettings } = require('./../js/globalSettings'); const jBox = require('./../js/libraries/jBox/jBox.min'); const SerialBackend = require('../js/serial_backend'); +const ublox = require('../js/ublox/UBLOX'); TABS.gps = {}; @@ -418,6 +419,29 @@ TABS.gps.initialize = function (callback) { }); }); + function processUbloxData(data) { + if(data != null) { + // foreach data + //mspHelper.sendUbloxCommand(d); + } + } + + $('a.loadAssistnowOnline').on('click', function () { + if(globalSettings.assistnowApiKey != null && globalSettings.assistnowApiKey != '') { + ublox.loadAssistnowOnline(processUbloxData); + } else { + GUI.alert("Assistnow Token not set!"); + } + }); + + $('a.loadAssistnowOffline').on('click', function () { + if(globalSettings.assistnowApiKey != null && globalSettings.assistnowApiKey != '') { + ublox.loadAssistnowOffline(processUbloxData); + } else { + GUI.alert("Assistnow Token not set!"); + } + }); + GUI.content_ready(callback); } From a3f6a99d02bb0f3bad387a11eadaada87108f1be Mon Sep 17 00:00:00 2001 From: Marcelo Bezerra <23555060+mmosca@users.noreply.github.com> Date: Sun, 23 Jun 2024 19:31:57 +0200 Subject: [PATCH 05/11] We now successfully fetch and parse ublox data and send as msp messages --- js/msp/MSPHelper.js | 7 ++-- js/ublox/UBLOX.js | 80 +++++++++++++++++++++++++---------------- locale/en/messages.json | 9 +++++ tabs/gps.js | 29 +++++++++++++-- 4 files changed, 91 insertions(+), 34 deletions(-) diff --git a/js/msp/MSPHelper.js b/js/msp/MSPHelper.js index c8d64572..e872d571 100644 --- a/js/msp/MSPHelper.js +++ b/js/msp/MSPHelper.js @@ -1588,11 +1588,14 @@ var mspHelper = (function () { FC.OSD_CUSTOM_ELEMENTS .items.push(customElement) } break; + case MSPCodes.MSP2_INAV_GPS_UBLOX_COMMAND: + // Just and ACK from the fc. + break; default: - console.log('Unknown code detected: ' + dataHandler.code); + console.log('Unknown code detected: 0x' + dataHandler.code.toString(16)); } else { - console.log('FC reports unsupported message error: ' + dataHandler.code); + console.log('FC reports unsupported message error: 0x' + dataHandler.code.toString(16)); } // trigger callbacks, cleanup/remove callback after trigger diff --git a/js/ublox/UBLOX.js b/js/ublox/UBLOX.js index 45a5f8ac..e86abcf1 100644 --- a/js/ublox/UBLOX.js +++ b/js/ublox/UBLOX.js @@ -49,7 +49,7 @@ var ublox = (function () { var currentCommand; function resetUbloxState() { - console.log("Reset ublox state"); + //console.log("Reset ublox state"); hasFirstHeader = false; hasSecondHeader = false; ubxClass = false; @@ -61,19 +61,20 @@ var ublox = (function () { currentCommand = []; } - function splitUbloxData(ubxBytes) { - console.log("type of data: " +typeof(ubxBytes)); - console.log("splitUbloxData: " + ubxBytes.length); + 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.length;++i) { - let c = ubxBytes.charCodeAt(i); - //let c = ubxBytes[i]; + 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"); + //console.log("First header"); hasFirstHeader = true; currentCommand.push(c); continue; @@ -86,7 +87,7 @@ var ublox = (function () { } if (!hasSecondHeader) { if (c == 0x62) { - console.log("Second header"); + //console.log("Second header"); hasSecondHeader = true; currentCommand.push(c); continue; @@ -99,18 +100,18 @@ var ublox = (function () { } if (!ubxClass) { ubxClass = true; - console.log("ubxClass: 0x"+ (c).toString(16)); + //console.log("ubxClass: 0x"+ (c).toString(16)); currentCommand.push(c) continue; } if (!ubxId) { ubxId = true; - console.log("ubxId: 0x"+ (c).toString(16)); + //console.log("ubxId: 0x"+ (c).toString(16)); currentCommand.push(c); continue; } if (!lenLow) { - console.log("Len low"); + //console.log("Len low"); lenLow = true; //(int) c payloadLen = c; @@ -118,17 +119,17 @@ var ublox = (function () { continue; } if (!lenHigh) { - console.log("Len high"); + //console.log("Len high"); lenHigh = true; // (int)c payloadLen = (c << 8) | payloadLen; - console.log("Payload len " + payloadLen); + //console.log("Payload len " + payloadLen); payloadLen += 2; // add crc bytes; currentCommand.push(c); continue } if (skipped < payloadLen - 1) { - console.log("payload + crc"); + //console.log("payload + crc"); skipped = skipped + 1; currentCommand.push(c); continue; @@ -137,7 +138,7 @@ var ublox = (function () { skipped = skipped + 1; currentCommand.push(c); ubxCommands.push(currentCommand); - console.log("Adding command"); + //console.log("Adding command"); resetUbloxState(); continue; } @@ -145,18 +146,30 @@ var ublox = (function () { return ubxCommands } - function processOnlineData(data) { - assistnowOnline = splitUbloxData(data); + function getBinaryData(url, successCallback, failCallback) { + const req = new XMLHttpRequest(); + req.open("GET", url, true); + req.responseType = "arraybuffer"; - console.log("Assitnow online commands:" + assistnowOnline.length); - } + if (successCallback != null) { + req.onload = (event) => { + successCallback(req.response); + }; + } - function processOfflineData(data) { - assistnowOffline = splitUbloxData(data); - console.log("Assitnow offline commands:" + assistnowOffline.length); + if (failCallback != null) { + req.onerror = (event) => { + failCallback(event); + } + } + + req.send(null); } + function loadError(event) { + GUI.alert("Error loading AssistNow data"); + } // For more info on assistnow, check: // https://developer.thingstream.io/guides/location-services/assistnow-user-guide @@ -167,22 +180,29 @@ var ublox = (function () { 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); - $.get(url, processOfflineData).fail(function() {GUI.alert("Error loading Offline data")}); - - if(callback != null) { - callback(""); + function processOfflineData(data) { + assistnowOffline = splitUbloxData(data); + console.log("Assitnow offline commands:" + assistnowOffline.length); + callback(assistnowOffline); } + + 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 }`; - $.get(url, processOnlineData).fail(function() {GUI.alert("Error loading Offline data")}); + function processOnlineData(data) { + assistnowOnline = splitUbloxData(data); - if(callback != null) { - callback(""); + console.log("Assitnow online commands:" + assistnowOnline.length); + callback(assistnowOnline); } + + //$.get(url, processOnlineData).fail(function() {GUI.alert("Error loading Offline data")}); + getBinaryData(url, processOnlineData, loadError); } return self; diff --git a/locale/en/messages.json b/locale/en/messages.json index 26122d8f..d124304f 100644 --- a/locale/en/messages.json +++ b/locale/en/messages.json @@ -5923,5 +5923,14 @@ }, "gpsLoadAssistnowOnlineButton": { "message": "Load AssistNow Online" + }, + "gpsAssistnowStart": { + "message": "Assistnow data transfer starting..." + }, + "gpsAssistnowDone": { + "message": "Assistnow data transfer complete." + }, + "gpsAssistnowUpdate": { + "message": "Assistnow messages sent." } } diff --git a/tabs/gps.js b/tabs/gps.js index 0441437c..5b40e3ef 100644 --- a/tabs/gps.js +++ b/tabs/gps.js @@ -421,8 +421,33 @@ TABS.gps.initialize = function (callback) { function processUbloxData(data) { if(data != null) { - // foreach data - //mspHelper.sendUbloxCommand(d); + //console.log("processing data type: " + typeof(data)); + let totalSent = 0; + let total = data.length; + + var ubloxChainer = MSPChainerClass(); + var chain = []; + + GUI.log(i18n.getMessage('gpsAssistnowStart')); + data.forEach((item) => { + chain.push(function (callback) { + //console.log("UBX command: " + item.length); + mspHelper.sendUbloxCommand(item, callback); + totalSent++; + if((totalSent % 100) == 0) { + GUI.log(totalSent + '/' + total + ' ' + i18n.getMessage('gpsAssistnowUpdate')); + } + }); + }); + ubloxChainer.setChain(chain); + ubloxChainer.setExitPoint(function () { + if ((totalSent % 100) != 0) { + GUI.log(totalSent + '/' + total + ' ' + i18n.getMessage('gpsAssistnowUpdate')); + } + GUI.log(i18n.getMessage('gpsAssistnowDone')); + }); + + ubloxChainer.execute(); } } From a295f5cd172b71e5b8d1bc9625ec4d8036f4b511 Mon Sep 17 00:00:00 2001 From: Marcelo Bezerra <23555060+mmosca@users.noreply.github.com> Date: Sun, 23 Jun 2024 19:34:24 +0200 Subject: [PATCH 06/11] AssistNow vs Assistnow --- locale/en/messages.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/locale/en/messages.json b/locale/en/messages.json index d124304f..5f83f26d 100644 --- a/locale/en/messages.json +++ b/locale/en/messages.json @@ -5925,12 +5925,12 @@ "message": "Load AssistNow Online" }, "gpsAssistnowStart": { - "message": "Assistnow data transfer starting..." + "message": "AssistNow data transfer starting..." }, "gpsAssistnowDone": { - "message": "Assistnow data transfer complete." + "message": "AssistNow data transfer complete." }, "gpsAssistnowUpdate": { - "message": "Assistnow messages sent." + "message": "AssistNow messages sent." } } From aa6bbce308d5e0d0eb006e2bb4f9c4317c1a1593 Mon Sep 17 00:00:00 2001 From: Marcelo Bezerra <23555060+mmosca@users.noreply.github.com> Date: Sun, 23 Jun 2024 20:23:35 +0200 Subject: [PATCH 07/11] spaces --- gulpfile.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gulpfile.js b/gulpfile.js index d3257b5d..1fc549d9 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -89,7 +89,7 @@ sources.js = [ './js/msp/MSPCodes.js', './js/msp/MSPHelper.js', './js/msp/MSPchainer.js', - './js/ublox/UBLOX.js', + './js/ublox/UBLOX.js', './js/port_handler.js', './js/connection/connection.js', './js/connection/connectionBle.js', From 152124627c3aeeff9dbc2ad7ef4581d9b5efe385 Mon Sep 17 00:00:00 2001 From: Marcelo Bezerra <23555060+mmosca@users.noreply.github.com> Date: Sun, 23 Jun 2024 21:45:17 +0200 Subject: [PATCH 08/11] Only send relevant assitnow offline messages --- js/ublox/UBLOX.js | 19 +++++++++++++++++++ tabs/gps.js | 12 +++++++++++- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/js/ublox/UBLOX.js b/js/ublox/UBLOX.js index e86abcf1..bba8bc45 100644 --- a/js/ublox/UBLOX.js +++ b/js/ublox/UBLOX.js @@ -205,6 +205,25 @@ var ublox = (function () { 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; })(); diff --git a/tabs/gps.js b/tabs/gps.js index 5b40e3ef..bf0dad53 100644 --- a/tabs/gps.js +++ b/tabs/gps.js @@ -427,16 +427,26 @@ TABS.gps.initialize = function (callback) { var ubloxChainer = MSPChainerClass(); var chain = []; + let d = new Date(); GUI.log(i18n.getMessage('gpsAssistnowStart')); data.forEach((item) => { chain.push(function (callback) { //console.log("UBX command: " + item.length); - mspHelper.sendUbloxCommand(item, callback); + let callCallback = false; + if (ublox.isAssistnowDataRelevant(item, d.getUTCFullYear(), d.getUTCMonth()+1, d.getUTCDate()+1)) { + mspHelper.sendUbloxCommand(item, callback); + } else { + // Ignore msp command, but keep counter going. + callCallback = true; + } totalSent++; if((totalSent % 100) == 0) { GUI.log(totalSent + '/' + total + ' ' + i18n.getMessage('gpsAssistnowUpdate')); } + if(callCallback) { + callback(); + } }); }); ubloxChainer.setChain(chain); From a3778ae40f25e2a1ac112d532cec854429a33281 Mon Sep 17 00:00:00 2001 From: Marcelo Bezerra <23555060+mmosca@users.noreply.github.com> Date: Sun, 23 Jun 2024 22:10:53 +0200 Subject: [PATCH 09/11] Cache assitnow offline data. Allows for offline use. --- js/configurator_main.js | 3 +++ js/globalSettings.js | 7 +++++++ js/ublox/UBLOX.js | 14 +++++++++++--- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/js/configurator_main.js b/js/configurator_main.js index 8bcf3f73..aec07083 100644 --- a/js/configurator_main.js +++ b/js/configurator_main.js @@ -78,6 +78,7 @@ $(function() { $('a', activeTab).trigger('click'); } + globalSettings.store = store; globalSettings.unitType = store.get('unit_type', UnitType.none); globalSettings.mapProviderType = store.get('map_provider_type', 'osm'); globalSettings.mapApiKey = store.get('map_api_key', ''); @@ -85,6 +86,8 @@ $(function() { globalSettings.proxyURL = store.get('proxyurl', 'http://192.168.1.222/mapproxy/service?'); globalSettings.proxyLayer = store.get('proxylayer', 'your_proxy_layer_name'); globalSettings.showProfileParameters = store.get('show_profile_parameters', 1); + globalSettings.assistnowOfflineData = store.get('assistnow_offline_data', []); + globalSettings.assistnowOfflineDate = store.get('assistnow_offline_date', 0); updateProfilesHighlightColours(); var cliAutocomplete = store.get('cli_autocomplete', true); diff --git a/js/globalSettings.js b/js/globalSettings.js index 96b078fb..cc28ad85 100644 --- a/js/globalSettings.js +++ b/js/globalSettings.js @@ -22,6 +22,13 @@ var globalSettings = { docsTreeLocation: 'master', cliAutocomplete: true, assistnowApiKey: null, + assistnowOfflineData: [], + assistnowOfflineDate: 0, + store: null, + saveAssistnowData: function() { + this.store.set('assistnow_offline_data', this.assistnowOfflineData); + this.store.set('assistnow_offline_date', this.assistnowOfflineDate); + } }; module.exports = { globalSettings, UnitType }; \ No newline at end of file diff --git a/js/ublox/UBLOX.js b/js/ublox/UBLOX.js index bba8bc45..6f3ba937 100644 --- a/js/ublox/UBLOX.js +++ b/js/ublox/UBLOX.js @@ -7,6 +7,7 @@ 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 () { @@ -181,9 +182,16 @@ var ublox = (function () { console.log(url); function processOfflineData(data) { - assistnowOffline = splitUbloxData(data); - console.log("Assitnow offline commands:" + assistnowOffline.length); - callback(assistnowOffline); + 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); From ac8c7edff7b3daa6c695b1656cdbe8532ff77bd7 Mon Sep 17 00:00:00 2001 From: Marcelo Bezerra <23555060+mmosca@users.noreply.github.com> Date: Sun, 23 Jun 2024 23:44:46 +0200 Subject: [PATCH 10/11] Quiet down console logs --- js/ublox/UBLOX.js | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/js/ublox/UBLOX.js b/js/ublox/UBLOX.js index 6f3ba937..9b2f0c4c 100644 --- a/js/ublox/UBLOX.js +++ b/js/ublox/UBLOX.js @@ -63,8 +63,8 @@ var ublox = (function () { } function splitUbloxData(ubxBytesBuffer) { - console.log("type of data: " +typeof(ubxBytesBuffer)); - console.log("splitUbloxData: " + ubxBytesBuffer.byteLength); + //console.log("type of data: " +typeof(ubxBytesBuffer)); + //console.log("splitUbloxData: " + ubxBytesBuffer.byteLength); let ubxBytes = new DataView(ubxBytesBuffer); var ubxCommands = [] @@ -176,10 +176,9 @@ var ublox = (function () { // https://developer.thingstream.io/guides/location-services/assistnow-user-guide // Currently only supported for M8+ units self.loadAssistnowOffline = function(callback) { - // offline_url = "https://offline-live1.services.u-blox.com/GetOfflineData.ashx?token=" + offline_token + ";gnss=" + offline_gnss + ";format=" + fmt + ";period=" + period + ";resolution=1;alm=" + alm + ";" 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); + //console.log(url); function processOfflineData(data) { if(globalSettings.assistnowOfflineData == null || ((Date.now() / 1000)-globalSettings.assistnowOfflineDate) > (60*60*24*3)) { @@ -190,7 +189,7 @@ var ublox = (function () { } else { console.log("AssitnowOfflineData newer than 3 days. Re-using."); } - console.log("Assitnow offline commands:" + globalSettings.assistnowOfflineData.length); + //console.log("Assitnow offline commands:" + globalSettings.assistnowOfflineData.length); callback(globalSettings.assistnowOfflineData); } @@ -205,7 +204,7 @@ var ublox = (function () { function processOnlineData(data) { assistnowOnline = splitUbloxData(data); - console.log("Assitnow online commands:" + assistnowOnline.length); + //console.log("Assitnow online commands:" + assistnowOnline.length); callback(assistnowOnline); } @@ -220,11 +219,11 @@ var ublox = (function () { const payloadOffset = 6; if (((ubxMessage[payloadOffset + 4] + 2000) == cy) && (ubxMessage[payloadOffset + 5] == cm) && (ubxMessage[payloadOffset + 6] == cd)) { - console.log("UBX-MGA_ANO date matches"); + //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)); + //console.log("UBX-CMD: class: 0x" + ubxMessage[2].toString(16) + " id: 0x" + ubxMessage[3].toString(16)); return true; } From 697ebfa5f10e80ddff343074bb38549442883e9d Mon Sep 17 00:00:00 2001 From: Marcelo Bezerra <23555060+mmosca@users.noreply.github.com> Date: Sun, 23 Jun 2024 23:48:10 +0200 Subject: [PATCH 11/11] Add error message to locale. --- js/ublox/UBLOX.js | 3 ++- locale/en/messages.json | 3 +++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/js/ublox/UBLOX.js b/js/ublox/UBLOX.js index 9b2f0c4c..438f5545 100644 --- a/js/ublox/UBLOX.js +++ b/js/ublox/UBLOX.js @@ -169,7 +169,8 @@ var ublox = (function () { function loadError(event) { - GUI.alert("Error loading AssistNow data"); + GUI.alert(i18n.getMessage("gpsAssistnowLoadDataError")); + console.log(i18n.getMessage("gpsAssistnowLoadDataError") + ':' + event.toString()); } // For more info on assistnow, check: diff --git a/locale/en/messages.json b/locale/en/messages.json index 5f83f26d..bba5c8e2 100644 --- a/locale/en/messages.json +++ b/locale/en/messages.json @@ -5932,5 +5932,8 @@ }, "gpsAssistnowUpdate": { "message": "AssistNow messages sent." + }, + "gpsAssistnowLoadDataError": { + "message": "Error loading AssistNow data." } }