From 93bb0eba4fc1256e9d533247d6986e79d94b18dc Mon Sep 17 00:00:00 2001 From: "Pawel Spychalski (DzikuVx)" Date: Fri, 26 Apr 2024 12:05:17 +0200 Subject: [PATCH 01/20] Deduplicatrion of the queue and delayed release of hard lock --- js/msp.js | 8 +++++++- js/serial_backend.js | 2 ++ js/serial_queue.js | 23 +++++++++++++++++++++++ 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/js/msp.js b/js/msp.js index d8553f0d2..85a51a5e5 100644 --- a/js/msp.js +++ b/js/msp.js @@ -2,6 +2,8 @@ const MSPCodes = require('./msp/MSPCodes') const mspQueue = require('./serial_queue'); +const eventFrequencyAnalyzer = require('./eventFrequencyAnalyzer'); +const timeout = require('./timeouts'); /** * @@ -265,7 +267,9 @@ var MSP = { /* * Free port */ - mspQueue.freeHardLock(); + timeout.add('delayedFreeHardLock', function() { + mspQueue.freeHardLock(); + }, 50); // Reset variables this.message_length_received = 0; @@ -301,6 +305,8 @@ var MSP = { var checksum; var ii; + eventFrequencyAnalyzer.put('MPS ' + code); + if (!protocolVersion) { protocolVersion = this.protocolVersion; } diff --git a/js/serial_backend.js b/js/serial_backend.js index 3589ed920..554110753 100755 --- a/js/serial_backend.js +++ b/js/serial_backend.js @@ -35,6 +35,8 @@ var SerialBackend = (function () { privateScope.isDemoRunning = false; + privateScope.isWirelessMode = false; + /* * Handle "Wireless" mode with strict queueing of messages */ diff --git a/js/serial_queue.js b/js/serial_queue.js index 3f2a1df96..7ad0af2df 100644 --- a/js/serial_queue.js +++ b/js/serial_queue.js @@ -59,6 +59,15 @@ var mspQueue = function () { privateScope.queueLocked = false; + privateScope.isMessageInQueue = function (code) { + for (var i = 0; i < privateScope.queue.length; i++) { + if (privateScope.queue[i].code == code) { + return true; + } + } + return false; + }; + publicScope.setremoveCallback = function(cb) { privateScope.removeCallback = cb; } @@ -86,6 +95,10 @@ var mspQueue = function () { privateScope.lockMethod = method; }; + publicScope.getLockMethod = function () { + return privateScope.lockMethod; + }; + publicScope.setSoftLock = function () { privateScope.softLock = new Date().getTime(); }; @@ -223,6 +236,12 @@ var mspQueue = function () { */ publicScope.put = function (mspRequest) { + console.log(mspRequest.code); + if (privateScope.isMessageInQueue(mspRequest.code)) { + console.log('Message already in queue: ' + mspRequest.code); + return false; + } + if (privateScope.queueLocked === true) { return false; } @@ -317,6 +336,10 @@ var mspQueue = function () { } }; + publicScope.getQueue = function () { + return privateScope.queue; + }; + setInterval(publicScope.executor, Math.round(1000 / privateScope.handlerFrequency)); setInterval(publicScope.balancer, Math.round(1000 / privateScope.balancerFrequency)); From 2156090a0d70366baf9198230434782ab2fbfb8b Mon Sep 17 00:00:00 2001 From: "Pawel Spychalski (DzikuVx)" Date: Fri, 26 Apr 2024 12:38:28 +0200 Subject: [PATCH 02/20] Run message deduplication based on full roundtrip, not only input queue --- js/msp/MSPHelper.js | 3 +++ js/serial_backend.js | 2 ++ js/serial_queue.js | 51 +++++++++++++++++++++++++++++++--------- tabs/cli.js | 1 + tabs/firmware_flasher.js | 1 + 5 files changed, 47 insertions(+), 11 deletions(-) diff --git a/js/msp/MSPHelper.js b/js/msp/MSPHelper.js index 61a17cb4c..d96dc2054 100644 --- a/js/msp/MSPHelper.js +++ b/js/msp/MSPHelper.js @@ -1621,6 +1621,9 @@ var mspHelper = (function () { mspQueue.putHardwareRoundtrip(new Date().getTime() - dataHandler.callbacks[i].sentOn); } + //remove message from queue as received + mspQueue.removeMessage(dataHandler.code); + // remove object from array dataHandler.callbacks.splice(i, 1); diff --git a/js/serial_backend.js b/js/serial_backend.js index 554110753..73ed68df4 100755 --- a/js/serial_backend.js +++ b/js/serial_backend.js @@ -239,6 +239,7 @@ var SerialBackend = (function () { mspQueue.flush(); mspQueue.freeHardLock(); mspQueue.freeSoftLock(); + mspQueue.flushMessages(); CONFIGURATOR.connection.disconnect(privateScope.onClosed); MSP.disconnect_cleanup(); @@ -376,6 +377,7 @@ var SerialBackend = (function () { mspQueue.flush(); mspQueue.freeHardLock(); mspQueue.freeSoftLock(); + mspQueue.flushMessages(); CONFIGURATOR.connection.emptyOutputBuffer(); $('div.connect_controls a').click(); // disconnect diff --git a/js/serial_queue.js b/js/serial_queue.js index 7ad0af2df..dc3979b88 100644 --- a/js/serial_queue.js +++ b/js/serial_queue.js @@ -42,6 +42,38 @@ var mspQueue = function () { privateScope.removeCallback = null; privateScope.putCallback = null; + /** + * This is the list of all messages that are currently in queue, including being already dispatched via radio and waiting for response + */ + privateScope.messagesInQueue = []; + + //Store new code in the queue + publicScope.storeMessage = function (code) { + privateScope.messagesInQueue.push(code); + }; + + //Remove code from the queue + publicScope.removeMessage = function (code) { + var index = privateScope.messagesInQueue.indexOf(code); + if (index > -1) { + privateScope.messagesInQueue.splice(index, 1); + } + }; + + //List all messages in the queue + publicScope.getMessages = function () { + return privateScope.messagesInQueue; + }; + + //Check if message is in the queue + publicScope.isMessageInQueue = function (code) { + return privateScope.messagesInQueue.indexOf(code) > -1; + }; + + publicScope.flushMessages = function () { + privateScope.messagesInQueue = []; + }; + publicScope.computeDropRatio = function () { privateScope.dropRatio = privateScope.loadPidController.run(publicScope.getLoad()); }; @@ -59,15 +91,6 @@ var mspQueue = function () { privateScope.queueLocked = false; - privateScope.isMessageInQueue = function (code) { - for (var i = 0; i < privateScope.queue.length; i++) { - if (privateScope.queue[i].code == code) { - return true; - } - } - return false; - }; - publicScope.setremoveCallback = function(cb) { privateScope.removeCallback = cb; } @@ -173,6 +196,7 @@ var mspQueue = function () { request.timer = setTimeout(function () { console.log('MSP data request timed-out: ' + request.code); + publicScope.removeMessage(request.code); /* * Remove current callback */ @@ -236,12 +260,17 @@ var mspQueue = function () { */ publicScope.put = function (mspRequest) { - console.log(mspRequest.code); - if (privateScope.isMessageInQueue(mspRequest.code)) { + console.log('Received message ', mspRequest.code); + + const isMessageInQueue = publicScope.isMessageInQueue(mspRequest.code); + + if (isMessageInQueue) { console.log('Message already in queue: ' + mspRequest.code); return false; } + publicScope.storeMessage(mspRequest.code); + if (privateScope.queueLocked === true) { return false; } diff --git a/tabs/cli.js b/tabs/cli.js index abde85033..310906b6e 100644 --- a/tabs/cli.js +++ b/tabs/cli.js @@ -94,6 +94,7 @@ TABS.cli.initialize = function (callback) { // Flush MSP queue as well as all MSP registered callbacks mspQueue.flush(); + mspQueue.flushMessages(); MSP.callbacks_cleanup(); self.outputHistory = ""; diff --git a/tabs/firmware_flasher.js b/tabs/firmware_flasher.js index bcd4a4834..cb34094fe 100755 --- a/tabs/firmware_flasher.js +++ b/tabs/firmware_flasher.js @@ -780,6 +780,7 @@ TABS.firmware_flasher.closeTempConnection = function() { mspQueue.flush(); mspQueue.freeHardLock(); mspQueue.freeSoftLock(); + mspQueue.flushMessages(); CONFIGURATOR.connection.emptyOutputBuffer(); CONFIGURATOR.connectionValid = false; From 040b0cec529ee19992ed5617c1434f77871901bd Mon Sep 17 00:00:00 2001 From: "Pawel Spychalski (DzikuVx)" Date: Fri, 26 Apr 2024 13:10:29 +0200 Subject: [PATCH 03/20] Extract mspDeduplicationQueue to separate file --- js/msp/MSPHelper.js | 3 ++- js/msp/mspDeduplicationQueue.js | 41 +++++++++++++++++++++++++++++++++ js/serial_backend.js | 5 ++-- js/serial_queue.js | 41 ++++----------------------------- tabs/cli.js | 3 ++- tabs/firmware_flasher.js | 3 ++- 6 files changed, 55 insertions(+), 41 deletions(-) create mode 100644 js/msp/mspDeduplicationQueue.js diff --git a/js/msp/MSPHelper.js b/js/msp/MSPHelper.js index d96dc2054..60ac4ef0f 100644 --- a/js/msp/MSPHelper.js +++ b/js/msp/MSPHelper.js @@ -18,6 +18,7 @@ const ProgrammingPid = require('./../programmingPid'); const Safehome = require('./../safehome'); const { FwApproach } = require('./../fwApproach'); const Waypoint = require('./../waypoint'); +const mspDeduplicationQueue = require('./mspDeduplicationQueue'); var mspHelper = (function () { var self = {}; @@ -1622,7 +1623,7 @@ var mspHelper = (function () { } //remove message from queue as received - mspQueue.removeMessage(dataHandler.code); + mspDeduplicationQueue.remove(dataHandler.code); // remove object from array dataHandler.callbacks.splice(i, 1); diff --git a/js/msp/mspDeduplicationQueue.js b/js/msp/mspDeduplicationQueue.js new file mode 100644 index 000000000..4ea151692 --- /dev/null +++ b/js/msp/mspDeduplicationQueue.js @@ -0,0 +1,41 @@ +'use strict'; + +/** + * This module is a queue for deduplication of MSP requests. + * We do not want to process the same request multiple times unless response is received. + * This improves wireless handling and lower amount of data that is put on the air + */ +var mspDeduplicationQueue = function() { + + let publicScope = {}, + privateScope = {}; + + privateScope.queue = []; + + publicScope.put = function(item) { + privateScope.queue.push(item); + }; + + publicScope.remove = function(item) { + const index = privateScope.queue.indexOf(item); + if (index > -1) { + privateScope.queue.splice(index, 1); + } + }; + + publicScope.check = function(item) { + return privateScope.queue.includes(item); + }; + + publicScope.flush = function() { + privateScope.queue = []; + }; + + publicScope.get = function() { + return privateScope.queue; + }; + + return publicScope; +}(); + +module.exports = mspDeduplicationQueue; \ No newline at end of file diff --git a/js/serial_backend.js b/js/serial_backend.js index 73ed68df4..942d09b6a 100755 --- a/js/serial_backend.js +++ b/js/serial_backend.js @@ -27,6 +27,7 @@ const BOARD = require('./boards'); const jBox = require('./libraries/jBox/jBox.min'); const groundstation = require('./groundstation'); const ltmDecoder = require('./ltmDecoder'); +const mspDeduplicationQueue = require('./msp/mspDeduplicationQueue'); var SerialBackend = (function () { @@ -239,7 +240,7 @@ var SerialBackend = (function () { mspQueue.flush(); mspQueue.freeHardLock(); mspQueue.freeSoftLock(); - mspQueue.flushMessages(); + mspDeduplicationQueue.flush(); CONFIGURATOR.connection.disconnect(privateScope.onClosed); MSP.disconnect_cleanup(); @@ -377,7 +378,7 @@ var SerialBackend = (function () { mspQueue.flush(); mspQueue.freeHardLock(); mspQueue.freeSoftLock(); - mspQueue.flushMessages(); + mspDeduplicationQueue.flush(); CONFIGURATOR.connection.emptyOutputBuffer(); $('div.connect_controls a').click(); // disconnect diff --git a/js/serial_queue.js b/js/serial_queue.js index dc3979b88..8cf22edf4 100644 --- a/js/serial_queue.js +++ b/js/serial_queue.js @@ -5,6 +5,7 @@ const MSPCodes = require('./msp/MSPCodes'); const SimpleSmoothFilter = require('./simple_smooth_filter'); const PidController = require('./pid_controller'); const eventFrequencyAnalyzer = require('./eventFrequencyAnalyzer'); +const mspDeduplicationQueue = require('./msp/mspDeduplicationQueue'); var mspQueue = function () { @@ -42,38 +43,6 @@ var mspQueue = function () { privateScope.removeCallback = null; privateScope.putCallback = null; - /** - * This is the list of all messages that are currently in queue, including being already dispatched via radio and waiting for response - */ - privateScope.messagesInQueue = []; - - //Store new code in the queue - publicScope.storeMessage = function (code) { - privateScope.messagesInQueue.push(code); - }; - - //Remove code from the queue - publicScope.removeMessage = function (code) { - var index = privateScope.messagesInQueue.indexOf(code); - if (index > -1) { - privateScope.messagesInQueue.splice(index, 1); - } - }; - - //List all messages in the queue - publicScope.getMessages = function () { - return privateScope.messagesInQueue; - }; - - //Check if message is in the queue - publicScope.isMessageInQueue = function (code) { - return privateScope.messagesInQueue.indexOf(code) > -1; - }; - - publicScope.flushMessages = function () { - privateScope.messagesInQueue = []; - }; - publicScope.computeDropRatio = function () { privateScope.dropRatio = privateScope.loadPidController.run(publicScope.getLoad()); }; @@ -196,7 +165,7 @@ var mspQueue = function () { request.timer = setTimeout(function () { console.log('MSP data request timed-out: ' + request.code); - publicScope.removeMessage(request.code); + mspDeduplicationQueue.remove(request.code); /* * Remove current callback */ @@ -262,19 +231,19 @@ var mspQueue = function () { console.log('Received message ', mspRequest.code); - const isMessageInQueue = publicScope.isMessageInQueue(mspRequest.code); + const isMessageInQueue = mspDeduplicationQueue.check(mspRequest.code); if (isMessageInQueue) { console.log('Message already in queue: ' + mspRequest.code); return false; } - publicScope.storeMessage(mspRequest.code); - if (privateScope.queueLocked === true) { return false; } + mspDeduplicationQueue.put(mspRequest.code); + privateScope.queue.push(mspRequest); return true; }; diff --git a/tabs/cli.js b/tabs/cli.js index 310906b6e..eef500134 100644 --- a/tabs/cli.js +++ b/tabs/cli.js @@ -13,6 +13,7 @@ const { globalSettings } = require('./../js/globalSettings'); const CliAutoComplete = require('./../js/CliAutoComplete'); const { ConnectionType } = require('./../js/connection/connection'); const jBox = require('./../js/libraries/jBox/jBox.min'); +const mspDeduplicationQueue = require('./msp/mspDeduplicationQueue'); TABS.cli = { lineDelayMs: 50, @@ -94,7 +95,7 @@ TABS.cli.initialize = function (callback) { // Flush MSP queue as well as all MSP registered callbacks mspQueue.flush(); - mspQueue.flushMessages(); + mspDeduplicationQueue.flush(); MSP.callbacks_cleanup(); self.outputHistory = ""; diff --git a/tabs/firmware_flasher.js b/tabs/firmware_flasher.js index cb34094fe..68363ab9e 100755 --- a/tabs/firmware_flasher.js +++ b/tabs/firmware_flasher.js @@ -22,6 +22,7 @@ const mspQueue = require('./../js/serial_queue'); const mspHelper = require('./../js/msp/MSPHelper'); const STM32 = require('./../js/protocols/stm32'); const STM32DFU = require('./../js/protocols/stm32usbdfu'); +const mspDeduplicationQueue = require('./msp/mspDeduplicationQueue'); TABS.firmware_flasher = {}; TABS.firmware_flasher.initialize = function (callback) { @@ -780,7 +781,7 @@ TABS.firmware_flasher.closeTempConnection = function() { mspQueue.flush(); mspQueue.freeHardLock(); mspQueue.freeSoftLock(); - mspQueue.flushMessages(); + mspDeduplicationQueue.flush(); CONFIGURATOR.connection.emptyOutputBuffer(); CONFIGURATOR.connectionValid = false; From 2efebecb61c8379cd74cc63f1b2e308453d9855b Mon Sep 17 00:00:00 2001 From: Scavanger Date: Fri, 26 Apr 2024 08:52:52 -0300 Subject: [PATCH 04/20] [Electron] MacOs and MessageBox fix MacOS: - Nice icon for DMG - Fix bug when Configurator was minimized and dock icon is clicked Fix (Workaround): After a MessageBox (alert()) was displayed, all input fields stopped working. --- forge.config.js | 3 ++- js/gui.js | 9 +++++++++ js/main.js | 6 +++++- tabs/mission_control.js | 34 +++++++++++++++++----------------- tabs/sitl.js | 6 +++--- 5 files changed, 36 insertions(+), 22 deletions(-) diff --git a/forge.config.js b/forge.config.js index 092043bee..223287f53 100644 --- a/forge.config.js +++ b/forge.config.js @@ -74,7 +74,8 @@ module.exports = { name: '@electron-forge/maker-dmg', config: { name: "INAV Configurator", - background: "./assets/osx/dmg-background.png" + background: "./assets/osx/dmg-background.png", + icon: "./images/inav.icns" } }, { diff --git a/js/gui.js b/js/gui.js index b388a9c3a..3d48048cf 100644 --- a/js/gui.js +++ b/js/gui.js @@ -1,4 +1,6 @@ 'use strict'; +const { dialog } = require("@electron/remote"); + const CONFIGURATOR = require('./data_storage'); const Switchery = require('./libraries/switchery/switchery') @@ -529,6 +531,13 @@ GUI_control.prototype.update_dataflash_global = function () { } }; +/** +* Don't use alert() in Electron, it has a nasty bug: https://github.com/electron/electron/issues/31917 +*/ +GUI_control.prototype.alert = function(message) { + dialog.showMessageBoxSync({ message: message, icon: "./images/inav_icon_128.png" }); +} + // initialize object into GUI variable var GUI = new GUI_control(); diff --git a/js/main.js b/js/main.js index e3a6b2323..df9f05c0b 100644 --- a/js/main.js +++ b/js/main.js @@ -53,6 +53,10 @@ function createDeviceChooser() { } app.on('ready', () => { + createWindow(); +}); + +function createWindow() { let mainWindowState = windowStateKeeper({ defaultWidth: 800, @@ -147,7 +151,7 @@ app.on('ready', () => { if (process.env.NODE_ENV === 'development') { mainWindow.webContents.openDevTools(); } -}); +} app.on('window-all-closed', () => { diff --git a/tabs/mission_control.js b/tabs/mission_control.js index d07ecd57c..65aec1774 100644 --- a/tabs/mission_control.js +++ b/tabs/mission_control.js @@ -483,7 +483,7 @@ TABS.mission_control.initialize = function (callback) { function checkApproachAltitude(altitude, isSeaLevelRef, sealevel) { if (altitude - (isSeaLevelRef ? sealevel * 100 : 0 ) < 0) { - alert(i18n.getMessage('MissionPlannerAltitudeChangeReset')); + GUI.alert(i18n.getMessage('MissionPlannerAltitudeChangeReset')); return false; } @@ -493,7 +493,7 @@ TABS.mission_control.initialize = function (callback) { function checkLandingAltitude(altitude, isSeaLevelRef, sealevel) { if (altitude - (isSeaLevelRef ? sealevel * 100 : 0 ) < MAX_NEG_FW_LAND_ALT) { - alert(i18n.getMessage('MissionPlannerFwLAndingAltitudeChangeReset')); + GUI.alert(i18n.getMessage('MissionPlannerFwLAndingAltitudeChangeReset')); return false; } @@ -1489,26 +1489,26 @@ TABS.mission_control.initialize = function (callback) { if ($(this).val() >= 360 || ($(this).val() < 0 && $(this).val() != -1)) { $(this).val(-1); - alert(i18n.getMessage('MissionPlannerHeadSettingsCheck')); + GUI.alert(i18n.getMessage('MissionPlannerHeadSettingsCheck')); } } else if (MWNP.WPTYPE.REV[element.getAction()] == "RTH") { if ($(this).val() != 0 && $(this).val() != 1) { $(this).val(0); - alert(i18n.getMessage('MissionPlannerRTHSettingsCheck')); + GUI.alert(i18n.getMessage('MissionPlannerRTHSettingsCheck')); } } else if (MWNP.WPTYPE.REV[element.getAction()] == "JUMP") { if ($(this).val() > mission.getNonAttachedList().length || $(this).val() < 1) { $(this).val(1); - alert(i18n.getMessage('MissionPlannerJumpSettingsCheck')); + GUI.alert(i18n.getMessage('MissionPlannerJumpSettingsCheck')); } else if (mission.getPoiList().length != 0 && mission.getPoiList()) { if (mission.getPoiList().includes(mission.convertJumpNumberToWaypoint(Number($(this).val())-1))) { $(this).val(1); - alert(i18n.getMessage('MissionPlannerJump3SettingsCheck')); + GUI.alert(i18n.getMessage('MissionPlannerJump3SettingsCheck')); } } } @@ -1523,7 +1523,7 @@ TABS.mission_control.initialize = function (callback) { if ($(this).val() > 10 || ($(this).val() < 0 && $(this).val() != -1)) { $(this).val(0); - alert(i18n.getMessage('MissionPlannerJump2SettingsCheck')); + GUI.alert(i18n.getMessage('MissionPlannerJump2SettingsCheck')); } } element.setP2(Number($(this).val())); @@ -2310,7 +2310,7 @@ TABS.mission_control.initialize = function (callback) { let found = false; mission.get().forEach(wp => { if (wp.getAction() == MWNP.WPTYPE.LAND) { - alert(i18n.getMessage('MissionPlannerOnlyOneLandWp')); + GUI.alert(i18n.getMessage('MissionPlannerOnlyOneLandWp')); found = true; $(event.currentTarget).val(selectedMarker.getAction()); } @@ -2684,7 +2684,7 @@ TABS.mission_control.initialize = function (callback) { $('#addSafehome').on('click', () => { if (FC.SAFEHOMES.safehomeCount() + 1 > FC.SAFEHOMES.getMaxSafehomeCount()){ - alert(i18n.getMessage('missionSafehomeMaxSafehomesReached')); + GUI.alert(i18n.getMessage('missionSafehomeMaxSafehomesReached')); return; } @@ -3016,7 +3016,7 @@ TABS.mission_control.initialize = function (callback) { $('#removePoint').on('click', function () { if (selectedMarker) { if (mission.isJumpTargetAttached(selectedMarker)) { - alert(i18n.getMessage('MissionPlannerJumpTargetRemoval')); + GUI.alert(i18n.getMessage('MissionPlannerJumpTargetRemoval')); } else if (mission.getAttachedFromWaypoint(selectedMarker) && mission.getAttachedFromWaypoint(selectedMarker).length != 0) { if (confirm(i18n.getMessage('confirm_delete_point_with_options'))) { @@ -3096,7 +3096,7 @@ TABS.mission_control.initialize = function (callback) { $('#saveMissionButton').on('click', function () { if (mission.isEmpty()) { - alert(i18n.getMessage('no_waypoints_to_save')); + GUI.alert(i18n.getMessage('no_waypoints_to_save')); return; } $(this).addClass('disabled'); @@ -3115,7 +3115,7 @@ TABS.mission_control.initialize = function (callback) { $('#saveEepromMissionButton').on('click', function () { if (mission.isEmpty()) { - alert(i18n.getMessage('no_waypoints_to_save')); + GUI.alert(i18n.getMessage('no_waypoints_to_save')); return; } $(this).addClass('disabled'); @@ -3445,7 +3445,7 @@ TABS.mission_control.initialize = function (callback) { $('#loadMissionButton').removeClass('disabled'); } if (!FC.MISSION_PLANNER.getCountBusyPoints()) { - alert(i18n.getMessage('no_waypoints_to_load')); + GUI.alert(i18n.getMessage('no_waypoints_to_load')); return; } mission.reinit(); @@ -3555,7 +3555,7 @@ TABS.mission_control.initialize = function (callback) { if (AbsAltCheck) { if (checkAltitude < 100 * elevation) { if (resetAltitude) { - alert(i18n.getMessage('MissionPlannerAltitudeChangeReset')); + GUI.alert(i18n.getMessage('MissionPlannerAltitudeChangeReset')); altitude = selectedMarker.getAlt(); } else { altitude = settings.alt + 100 * elevation; @@ -3566,7 +3566,7 @@ TABS.mission_control.initialize = function (callback) { let elevationAtHome = HOME.getAlt(); if ((checkAltitude / 100 + elevationAtHome) < elevation) { if (resetAltitude) { - alert(i18n.getMessage('MissionPlannerAltitudeChangeReset')); + GUI.alert(i18n.getMessage('MissionPlannerAltitudeChangeReset')); altitude = selectedMarker.getAlt(); } else { let currentGroundClearance = 100 * Number($('#groundClearanceValueAtWP').text()); @@ -3702,9 +3702,9 @@ TABS.mission_control.setBit = function(bits, bit, value) { // function handleError(evt) { // if (evt.message) { // Chrome sometimes provides this - // alert("error: "+evt.message +" at linenumber: "+evt.lineno+" of file: "+evt.filename); + // GUI.alert("error: "+evt.message +" at linenumber: "+evt.lineno+" of file: "+evt.filename); // } else { - // alert("error: "+evt.type+" from element: "+(evt.srcElement || evt.target)); + // GUI.alert("error: "+evt.type+" from element: "+(evt.srcElement || evt.target)); // } // } diff --git a/tabs/sitl.js b/tabs/sitl.js index 81ef58b74..d967f7144 100644 --- a/tabs/sitl.js +++ b/tabs/sitl.js @@ -253,7 +253,7 @@ TABS.sitl.initialize = (callback) => { return; if (profiles.find(e => { return e.name == name })) { - alert(i18n.getMessage('sitlProfileExists')) + GUI.alert(i18n.getMessage('sitlProfileExists')) return; } var eerpromName = name.replace(/[^a-z0-9]/gi, '_').toLowerCase() + ".bin"; @@ -284,7 +284,7 @@ TABS.sitl.initialize = (callback) => { profileDeleteBtn_e.on('click', function () { if (currentProfile.isStdProfile) { - alert(i18n.getMessage('sitlStdProfileCantDeleted')); + GUI.alert(i18n.getMessage('sitlStdProfileCantDeleted')); return; } @@ -385,7 +385,7 @@ TABS.sitl.initialize = (callback) => { function saveProfiles() { if (currentProfile.isStdProfile) { - alert(i18n.getMessage('sitlStdProfileCantOverwritten')); + GUI.alert(i18n.getMessage('sitlStdProfileCantOverwritten')); return; } var profilesToSave = []; From 3e637c1c5486dd4cb770509350497112521aa7dc Mon Sep 17 00:00:00 2001 From: "Pawel Spychalski (DzikuVx)" Date: Fri, 26 Apr 2024 14:14:22 +0200 Subject: [PATCH 05/20] Fix forced lock removal and add frame mspStatistics --- js/connection/connection.js | 4 +++- js/msp/MSPHelper.js | 9 ++++++++- js/msp/mspStatistics.js | 37 +++++++++++++++++++++++++++++++++++++ js/serial_queue.js | 10 +++++++--- 4 files changed, 55 insertions(+), 5 deletions(-) create mode 100644 js/msp/mspStatistics.js diff --git a/js/connection/connection.js b/js/connection/connection.js index 157f239a2..cffaf41c9 100644 --- a/js/connection/connection.js +++ b/js/connection/connection.js @@ -255,8 +255,10 @@ class Connection { getTimeout() { if (this._bitrate >= 57600) { return 3000; - } else { + } if (this._bitrate >= 19200) { return 4000; + } else { + return 6000; } } } diff --git a/js/msp/MSPHelper.js b/js/msp/MSPHelper.js index 60ac4ef0f..6f14254db 100644 --- a/js/msp/MSPHelper.js +++ b/js/msp/MSPHelper.js @@ -19,6 +19,7 @@ const Safehome = require('./../safehome'); const { FwApproach } = require('./../fwApproach'); const Waypoint = require('./../waypoint'); const mspDeduplicationQueue = require('./mspDeduplicationQueue'); +const mspStatistics = require('./mspStatistics'); var mspHelper = (function () { var self = {}; @@ -1619,7 +1620,12 @@ var mspHelper = (function () { */ if (dataHandler.callbacks[i]) { mspQueue.putRoundtrip(new Date().getTime() - dataHandler.callbacks[i].createdOn); - mspQueue.putHardwareRoundtrip(new Date().getTime() - dataHandler.callbacks[i].sentOn); + + const hardwareRountrip = new Date().getTime() - dataHandler.callbacks[i].sentOn; + + mspQueue.putHardwareRoundtrip(hardwareRountrip); + + mspStatistics.add(dataHandler.code, hardwareRountrip); } //remove message from queue as received @@ -3069,6 +3075,7 @@ var mspHelper = (function () { }; self._getSetting = function (name) { + console.log("Getting setting " + name); if (FC.SETTINGS[name]) { return Promise.resolve(FC.SETTINGS[name]); } diff --git a/js/msp/mspStatistics.js b/js/msp/mspStatistics.js new file mode 100644 index 000000000..c86e598ff --- /dev/null +++ b/js/msp/mspStatistics.js @@ -0,0 +1,37 @@ +'use strict'; + +var mspStatistics = function() { + + let publicScope = {}, + privateScope = {}; + + privateScope.statistics = {}; + + + publicScope.add = function(code, duration) { + if (!privateScope.statistics[code]) { + privateScope.statistics[code] = { + ctime: new Date().getTime(), + count: 0, + duration: 0, + average: 0 + }; + } + privateScope.statistics[code].count++; + privateScope.statistics[code].duration += duration; + privateScope.statistics[code].average = privateScope.statistics[code].duration / privateScope.statistics[code].count; + }; + + publicScope.get = function() { + return privateScope.statistics; + }; + + publicScope.reset = function() { + privateScope.statistics = {}; + }; + + return publicScope; + +}(); + +module.exports = mspStatistics; \ No newline at end of file diff --git a/js/serial_queue.js b/js/serial_queue.js index 8cf22edf4..c01e8b8f6 100644 --- a/js/serial_queue.js +++ b/js/serial_queue.js @@ -294,16 +294,20 @@ var mspQueue = function () { var currentTimestamp = new Date().getTime(), threshold = publicScope.getHardwareRoundtrip() * 3; - if (threshold > 1000) { + if (threshold > 5000) { + threshold = 5000; + } + if (threshold < 1000) { threshold = 1000; } if (privateScope.softLock !== false && currentTimestamp - privateScope.softLock > threshold) { - privateScope.softLock = false; + publicScope.freeSoftLock(); eventFrequencyAnalyzer.put('force free soft lock'); } if (privateScope.hardLock !== false && currentTimestamp - privateScope.hardLock > threshold) { - privateScope.hardLock = false; + console.log('Force free hard lock'); + publicScope.freeHardLock(); eventFrequencyAnalyzer.put('force free hard lock'); } From aa9457a96ac663726a00d23e87849ddb6b30e391 Mon Sep 17 00:00:00 2001 From: "Pawel Spychalski (DzikuVx)" Date: Fri, 26 Apr 2024 14:19:27 +0200 Subject: [PATCH 06/20] Add calls per second to the msp statistics page --- js/msp/mspStatistics.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/js/msp/mspStatistics.js b/js/msp/mspStatistics.js index c86e598ff..a2dc18489 100644 --- a/js/msp/mspStatistics.js +++ b/js/msp/mspStatistics.js @@ -14,12 +14,14 @@ var mspStatistics = function() { ctime: new Date().getTime(), count: 0, duration: 0, - average: 0 + average: 0, + callsPerSecond: 0 }; } privateScope.statistics[code].count++; privateScope.statistics[code].duration += duration; privateScope.statistics[code].average = privateScope.statistics[code].duration / privateScope.statistics[code].count; + privateScope.statistics[code].callsPerSecond = privateScope.statistics[code].count / ((new Date().getTime() - privateScope.statistics[code].ctime) / 1000); }; publicScope.get = function() { From 94cc87d3845fb2884900ff611f636628b8082512 Mon Sep 17 00:00:00 2001 From: "Pawel Spychalski (DzikuVx)" Date: Fri, 26 Apr 2024 14:27:13 +0200 Subject: [PATCH 07/20] Replace status balanced interval with simple deduplication --- tabs/setup.js | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/tabs/setup.js b/tabs/setup.js index f8a56199f..3656e80f2 100755 --- a/tabs/setup.js +++ b/tabs/setup.js @@ -123,9 +123,9 @@ TABS.setup.initialize = function (callback) { /* * Enable balancer */ - if (mspQueue.shouldDrop()) { - return; - } + // if (mspQueue.shouldDrop()) { + // return; + // } MSP.send_message(MSPCodes.MSP_RAW_GPS, false, false, function () { var gpsFixType = i18n.getMessage('gpsFixNone'); @@ -146,9 +146,9 @@ TABS.setup.initialize = function (callback) { /* * Enable balancer */ - if (mspQueue.shouldDrop()) { - return; - } + // if (mspQueue.shouldDrop()) { + // return; + // } MSP.send_message(MSPCodes.MSP_ATTITUDE, false, false, function () { roll_e.text(i18n.getMessage('initialSetupAttitude', [FC.SENSOR_DATA.kinematics[0]])); @@ -159,9 +159,10 @@ TABS.setup.initialize = function (callback) { }); } - mspBalancedInterval.add('setup_data_pull_fast', 40, 1, get_fast_data); mspBalancedInterval.add('setup_data_pull_slow', 250, 1, get_slow_data); + interval.add('setup_data_pull_fast', get_fast_data, 50); + interval.add('gui_analog_update', function () { bat_cells_e.text(i18n.getMessage('initialSetupBatteryDetectedCellsValue', [FC.ANALOG.cell_count])); bat_voltage_e.text(i18n.getMessage('initialSetupBatteryVoltageValue', [FC.ANALOG.voltage])); From 6b5440f437d92b95ecfe6f948241518516e9a13a Mon Sep 17 00:00:00 2001 From: "Pawel Spychalski (DzikuVx)" Date: Fri, 26 Apr 2024 20:46:31 +0200 Subject: [PATCH 08/20] remove msp_balanced_interval --- js/gui.js | 2 - js/msp_balanced_interval.js | 75 ------------------------------------- js/serial_backend.js | 2 - tabs/adjustments.js | 11 +----- tabs/auxiliary.js | 11 +----- tabs/firmware_flasher.js | 2 - tabs/gps.js | 12 ++---- tabs/logging.js | 2 - tabs/magnetometer.js | 8 +--- tabs/mission_control.js | 6 +-- tabs/mixer.js | 6 +-- tabs/outputs.js | 2 - tabs/programming.js | 7 ++-- tabs/receiver.js | 16 +------- tabs/setup.js | 21 +---------- 15 files changed, 21 insertions(+), 162 deletions(-) delete mode 100644 js/msp_balanced_interval.js diff --git a/js/gui.js b/js/gui.js index b388a9c3a..445a05aae 100644 --- a/js/gui.js +++ b/js/gui.js @@ -5,7 +5,6 @@ const Switchery = require('./libraries/switchery/switchery') const MSP = require('./msp'); const FC = require('./fc'); const interval = require('./intervals'); -const mspBalancedInterval = require('./msp_balanced_interval'); const { scaleRangeInt } = require('./helpers'); const i18n = require('./localization'); @@ -92,7 +91,6 @@ GUI_control.prototype.tab_switch_cleanup = function (callback) { MSP.callbacks_cleanup(); // we don't care about any old data that might or might not arrive interval.killAll(['global_data_refresh', 'msp-load-update', 'ltm-connection-check']); - mspBalancedInterval.flush(); if (this.active_tab) { TABS[this.active_tab].cleanup(callback); diff --git a/js/msp_balanced_interval.js b/js/msp_balanced_interval.js deleted file mode 100644 index a0d0aef68..000000000 --- a/js/msp_balanced_interval.js +++ /dev/null @@ -1,75 +0,0 @@ -'use strict'; - -const mspQueue = require('./serial_queue'); -const interval = require('./intervals'); - -var mspBalancedInterval = (function (mspQueue, intervalHandler) { - - var publicScope = {}, - privateScope = {}; - - /** - * How often balancing should be executed [Hz] - * @type {number} - */ - privateScope.balancingFrequency = 0.5; - - privateScope.intervals = []; - - /** - * - * @param {string} name - * @param {number} requestedInterval - * @param {number} messagesInInterval - * @param {function} code - */ - publicScope.add = function (name, requestedInterval, messagesInInterval, code) { - privateScope.intervals.push({ - name: name, - requestedInterval: requestedInterval, - messagesInInterval: messagesInInterval, - code: code - }); - - intervalHandler.add(name, code, mspQueue.getIntervalPrediction(requestedInterval, messagesInInterval)); - }; - - /** - * Periodically executed balancing handler - */ - publicScope.balancer = function () { - - var interval; - - for (var i in privateScope.intervals) { - if (privateScope.intervals.hasOwnProperty(i)) { - interval = privateScope.intervals[i]; - - intervalHandler.remove(interval.name); - intervalHandler.add( - interval.name, - interval.code, - mspQueue.getIntervalPrediction( - interval.requestedInterval, - interval.messagesInInterval - ) - ); - } - } - - }; - - /** - * Real interval cleaning happens win interval.killAll method - * both methods have to be executed - */ - publicScope.flush = function () { - privateScope.intervals = []; - }; - - setInterval(publicScope.balancer, Math.round(1000 / privateScope.balancingFrequency)); - - return publicScope; -})(mspQueue, interval); - -module.exports = mspBalancedInterval; diff --git a/js/serial_backend.js b/js/serial_backend.js index 942d09b6a..04eb60a99 100755 --- a/js/serial_backend.js +++ b/js/serial_backend.js @@ -18,7 +18,6 @@ const interval = require('./intervals'); const periodicStatusUpdater = require('./periodicStatusUpdater'); const mspQueue = require('./serial_queue'); const timeout = require('./timeouts'); -const mspBalancedInterval = require('./msp_balanced_interval'); const defaultsDialog = require('./defaults_dialog'); const { SITLProcess } = require('./sitl'); const update = require('./globalUpdates'); @@ -218,7 +217,6 @@ var SerialBackend = (function () { timeout.killAll(); interval.killAll(['global_data_refresh', 'msp-load-update']); - mspBalancedInterval.flush(); if (CONFIGURATOR.cliActive) { GUI.tab_switch_cleanup(finishDisconnect); diff --git a/tabs/adjustments.js b/tabs/adjustments.js index 164bb6ee2..c8dcc1ce4 100644 --- a/tabs/adjustments.js +++ b/tabs/adjustments.js @@ -6,12 +6,10 @@ const wNumb = require('wnumb/wNumb') const mspHelper = require('./../js/msp/MSPHelper'); const MSPCodes = require('./../js/msp/MSPCodes'); const MSP = require('./../js/msp'); -const mspQueue = require('./../js/serial_queue'); const { GUI, TABS } = require('./../js/gui'); const FC = require('./../js/fc'); -const mspBalancedInterval = require('./../js/msp_balanced_interval'); const i18n = require('./../js/localization'); - +const interval = require('./../js/intervals'); TABS.adjustments = {}; @@ -260,11 +258,6 @@ TABS.adjustments.initialize = function (callback) { // data pulling functions used inside interval timer function get_rc_data() { - - if (mspQueue.shouldDrop()) { - return; - } - MSP.send_message(MSPCodes.MSP_RC, false, false, update_ui); } @@ -280,7 +273,7 @@ TABS.adjustments.initialize = function (callback) { update_ui(); // enable data pulling - mspBalancedInterval.add('aux_data_pull', 50, 1, get_rc_data); + interval.add('aux_data_pull', get_rc_data, 50); GUI.content_ready(callback); } diff --git a/tabs/auxiliary.js b/tabs/auxiliary.js index 7fd39225a..7d66e3897 100644 --- a/tabs/auxiliary.js +++ b/tabs/auxiliary.js @@ -9,13 +9,11 @@ const store = new Store(); const mspHelper = require('./../js/msp/MSPHelper'); const MSPCodes = require('./../js/msp/MSPCodes'); const MSP = require('./../js/msp'); -const mspQueue = require('./../js/serial_queue'); -const mspBalancedInterval = require('./../js/msp_balanced_interval'); const { GUI, TABS } = require('./../js/gui'); const FC = require('./../js/fc'); const adjustBoxNameIfPeripheralWithModeID = require('./../js/peripherals'); const i18n = require('./../js/localization'); - +const interval = require('./../js/intervals'); var ORIG_AUX_CONFIG_IDS = []; @@ -375,11 +373,6 @@ TABS.auxiliary.initialize = function (callback) { // data pulling functions used inside interval timer function get_rc_data() { - - if (mspQueue.shouldDrop()) { - return; - } - MSP.send_message(MSPCodes.MSP_RC, false, false, update_ui); } @@ -516,7 +509,7 @@ TABS.auxiliary.initialize = function (callback) { update_ui(); // enable data pulling - mspBalancedInterval.add('aux_data_pull', 50, 1, get_rc_data); + interval.add('aux_data_pull', get_rc_data, 50); $(".tab-auxiliary .acroEnabled").width($("#mode-0 .info").width()); diff --git a/tabs/firmware_flasher.js b/tabs/firmware_flasher.js index 68363ab9e..5c88263c3 100755 --- a/tabs/firmware_flasher.js +++ b/tabs/firmware_flasher.js @@ -17,7 +17,6 @@ const CONFIGURATOR = require('./../js/data_storage'); const SerialBackend = require('./../js/serial_backend'); const timeout = require('./../js/timeouts'); const interval = require('./../js/intervals'); -const mspBalancedInterval = require('./../js/msp_balanced_interval'); const mspQueue = require('./../js/serial_queue'); const mspHelper = require('./../js/msp/MSPHelper'); const STM32 = require('./../js/protocols/stm32'); @@ -776,7 +775,6 @@ TABS.firmware_flasher.onValidFirmware = function() { TABS.firmware_flasher.closeTempConnection = function() { timeout.killAll(); interval.killAll(['global_data_refresh', 'msp-load-update', 'ltm-connection-check']); - mspBalancedInterval.flush(); mspQueue.flush(); mspQueue.freeHardLock(); diff --git a/tabs/gps.js b/tabs/gps.js index f77d9dd1c..3362f3b9b 100644 --- a/tabs/gps.js +++ b/tabs/gps.js @@ -8,8 +8,7 @@ const MSPChainerClass = require('./../js/msp/MSPchainer'); const mspHelper = require('./../js/msp/MSPHelper'); const MSPCodes = require('./../js/msp/MSPCodes'); const MSP = require('./../js/msp'); -const mspBalancedInterval = require('./../js/msp_balanced_interval'); -const mspQueue = require('./../js/serial_queue'); +const interval = require('./../js/intervals'); const { GUI, TABS } = require('./../js/gui'); const FC = require('./../js/fc'); const i18n = require('./../js/localization'); @@ -262,7 +261,6 @@ TABS.gps.initialize = function (callback) { } function update_ui() { - let lat = FC.GPS_DATA.lat / 10000000; let lon = FC.GPS_DATA.lon / 10000000; @@ -400,19 +398,15 @@ TABS.gps.initialize = function (callback) { * enable data pulling * GPS is usually refreshed at 5Hz, there is no reason to pull it much more often, really... */ - mspBalancedInterval.add('gps_pull', 200, 3, function gps_update() { + interval.add('gps_pull', function gps_update() { // avoid usage of the GPS commands until a GPS sensor is detected for targets that are compiled without GPS support. if (!SerialBackend.have_sensor(FC.CONFIG.activeSensors, 'gps')) { update_ui(); return; } - if (mspQueue.shouldDrop()) { - return; - } - get_raw_gps_data(); - }); + }, 200); $('a.save').on('click', function () { diff --git a/tabs/logging.js b/tabs/logging.js index 43de37094..6f515658b 100644 --- a/tabs/logging.js +++ b/tabs/logging.js @@ -7,7 +7,6 @@ const store = new Store(); const MSPCodes = require('./../js/msp/MSPCodes'); const MSP = require('./../js/msp'); -const mspBalancedInterval = require('./../js/msp_balanced_interval'); const { GUI, TABS } = require('./../js/gui'); const FC = require('./../js/fc'); const CONFIGURATOR = require('./../js/data_storage'); @@ -106,7 +105,6 @@ TABS.logging.initialize = function (callback) { } } else { interval.killAll(['global_data_refresh', 'msp-load-update', 'ltm-connection-check']); - mspBalancedInterval.flush(); $('.speed').prop('disabled', false); $(this).text(i18n.getMessage('loggingStart')); diff --git a/tabs/magnetometer.js b/tabs/magnetometer.js index 586798fd1..ec9d27cd7 100644 --- a/tabs/magnetometer.js +++ b/tabs/magnetometer.js @@ -6,12 +6,11 @@ const MSPChainerClass = require('./../js/msp/MSPchainer'); const MSP = require('./../js/msp'); const MSPCodes = require('./../js/msp/MSPCodes'); const mspHelper = require('./../js/msp/MSPHelper'); -const mspBalancedInterval = require('./../js/msp_balanced_interval'); -const mspQueue = require('./../js/serial_queue'); const FC = require('./../js/fc'); const { GUI, TABS } = require('./../js/gui'); const i18n = require('./../js/localization'); const { mixer } = require('./../js/model'); +const interval = require('./../js/intervals'); TABS.magnetometer = {}; @@ -524,9 +523,6 @@ TABS.magnetometer.initialize = function (callback) { }); function get_fast_data() { - if (mspQueue.shouldDrop()) { - return; - } MSP.send_message(MSPCodes.MSP_ATTITUDE, false, false, function () { self.roll_e.text(i18n.getMessage('initialSetupAttitude', [FC.SENSOR_DATA.kinematics[0]])); @@ -536,7 +532,7 @@ TABS.magnetometer.initialize = function (callback) { }); } - mspBalancedInterval.add('setup_data_pull_fast', 40, 1, get_fast_data); + interval.add('setup_data_pull_fast', get_fast_data, 40); GUI.content_ready(callback); } diff --git a/tabs/mission_control.js b/tabs/mission_control.js index d07ecd57c..27b181836 100644 --- a/tabs/mission_control.js +++ b/tabs/mission_control.js @@ -10,7 +10,6 @@ const MSPChainerClass = require('./../js/msp/MSPchainer'); const mspHelper = require('./../js/msp/MSPHelper'); const MSPCodes = require('./../js/msp/MSPCodes'); const MSP = require('./../js/msp'); -const mspBalancedInterval = require('./../js/msp_balanced_interval'); const mspQueue = require('./../js/serial_queue'); const { GUI, TABS } = require('./../js/gui'); const FC = require('./../js/fc'); @@ -27,6 +26,7 @@ const FwApproachCollection = require('./../js/fwApproachCollection'); const SerialBackend = require('./../js/serial_backend'); const { distanceOnLine, wrap_360, calculate_new_cooridatnes } = require('./../js/helpers'); const Plotly = require('./../js/libraries/plotly-latest.min'); +const interval = require('./../js/intervals'); var MAX_NEG_FW_LAND_ALT = -2000; // cm @@ -334,7 +334,7 @@ TABS.mission_control.initialize = function (callback) { */ if(!isOffline) { - mspBalancedInterval.add('gps_pull', 200, 3, function gps_update() { + interval.add('gps_pull', function gps_update() { // avoid usage of the GPS commands until a GPS sensor is detected for targets that are compiled without GPS support. if (!SerialBackend.have_sensor(FC.CONFIG.activeSensors, 'gps')) { update_gpsTrack(); @@ -346,7 +346,7 @@ TABS.mission_control.initialize = function (callback) { } get_raw_gps_data(); - }); + }, 200); } GUI.content_ready(callback); diff --git a/tabs/mixer.js b/tabs/mixer.js index a6ccebe87..a5ac2a83d 100644 --- a/tabs/mixer.js +++ b/tabs/mixer.js @@ -11,8 +11,8 @@ const FC = require('./../js/fc'); const i18n = require('./../js/localization'); const { mixer, platform, PLATFORM, INPUT, STABILIZED } = require('./../js/model'); const Settings = require('./../js/settings'); -const mspBalancedInterval = require('./../js/msp_balanced_interval'); const jBox = require('../js/libraries/jBox/jBox.min'); +const interval = require('./../js/intervals'); TABS.mixer = {}; @@ -823,9 +823,9 @@ TABS.mixer.initialize = function (callback, scrollPosition) { FC.LOGIC_CONDITIONS.init($('#logic-wrapper')); - i18n.localize();; + i18n.localize();; - mspBalancedInterval.add('logic_conditions_pull', 350, 1, getLogicConditionsStatus); + interval.add('logic_conditions_pull', getLogicConditionsStatus, 350); GUI.content_ready(callback); } diff --git a/tabs/outputs.js b/tabs/outputs.js index e868f4fef..72269f72c 100644 --- a/tabs/outputs.js +++ b/tabs/outputs.js @@ -5,7 +5,6 @@ const path = require('path'); const MSPChainerClass = require('./../js/msp/MSPchainer'); const mspHelper = require('./../js/msp/MSPHelper'); const MSPCodes = require('./../js/msp/MSPCodes'); -const mspBalancedInterval = require('./../js/msp_balanced_interval'); const mspQueue = require('./../js/serial_queue') const MSP = require('./../js/msp'); const { GUI, TABS } = require('./../js/gui'); @@ -430,7 +429,6 @@ TABS.outputs.initialize = function (callback) { // timer initialization interval.killAll(['motor_and_status_pull', 'global_data_refresh', 'msp-load-update', 'ltm-connection-check']); - mspBalancedInterval.flush(); interval.add('IMU_pull', function () { diff --git a/tabs/programming.js b/tabs/programming.js index 8ca1ca587..fe59c1b55 100644 --- a/tabs/programming.js +++ b/tabs/programming.js @@ -3,13 +3,12 @@ const path = require('path'); const MSPChainerClass = require('./../js/msp/MSPchainer'); -const mspBalancedInterval = require('./../js/msp_balanced_interval'); const mspHelper = require('./../js/msp/MSPHelper'); const { GUI, TABS } = require('./../js/gui'); const FC = require('./../js/fc'); const tabs = require('./../js/tabs'); const i18n = require('./../js/localization'); - +const interval = require('./../js/intervals'); TABS.programming = {}; @@ -68,9 +67,9 @@ TABS.programming.initialize = function (callback, scrollPosition) { GUI.log(i18n.getMessage('programmingEepromSaved')); }); - mspBalancedInterval.add('logic_conditions_pull', 100, 1, function () { + interval.add('logic_conditions_pull', function () { statusChainer.execute(); - }); + }, 100); GUI.content_ready(callback); } diff --git a/tabs/receiver.js b/tabs/receiver.js index 0d1c36965..f1eb46168 100644 --- a/tabs/receiver.js +++ b/tabs/receiver.js @@ -4,8 +4,6 @@ const path = require('path'); const MSPChainerClass = require('./../js/msp/MSPchainer'); const mspHelper = require('./../js/msp/MSPHelper'); -const mspQueue = require('./../js/serial_queue'); -const mspBalancedInterval = require('./../js/msp_balanced_interval'); const MSPCodes = require('./../js/msp/MSPCodes'); const MSP = require('./../js/msp'); const { GUI, TABS } = require('./../js/gui'); @@ -13,6 +11,7 @@ const FC = require('./../js/fc'); const CONFIGURATOR = require('./../js/data_storage'); const Settings = require('./../js/settings'); const i18n = require('./../js/localization'); +const interval = require('./../js/intervals'); TABS.receiver = { rateChartHeight: 117 @@ -370,21 +369,10 @@ TABS.receiver.initialize = function (callback) { }); function get_rc_data() { - - /* - * Throttling - */ - if (mspQueue.shouldDrop()) { - update_ui(); - return; - } - MSP.send_message(MSPCodes.MSP_RC, false, false, update_ui); } function update_ui() { - var i; - // update bars with latest data for (let i = 0; i < FC.RC.active_channels; i++) { meter_fill_array[i].css('width', ((FC.RC.channels[i] - meter_scale.min) / (meter_scale.max - meter_scale.min) * 100).clamp(0, 100) + '%'); @@ -393,7 +381,7 @@ TABS.receiver.initialize = function (callback) { } - mspBalancedInterval.add('receiver_pull', 35, 1, get_rc_data); + interval.add('receiver_pull', get_rc_data, 25); GUI.content_ready(callback); } diff --git a/tabs/setup.js b/tabs/setup.js index 3656e80f2..7579998fb 100755 --- a/tabs/setup.js +++ b/tabs/setup.js @@ -9,9 +9,7 @@ const MSP = require('./../js/msp'); const MSPCodes = require('./../js/msp/MSPCodes'); const i18n = require('./../js/localization'); const mspHelper = require('./../js/msp/MSPHelper'); -const mspBalancedInterval = require('./../js/msp_balanced_interval'); const interval = require('./../js/intervals'); -const mspQueue = require('./../js/serial_queue'); const SerialBackend = require('./../js/serial_backend'); const { mixer } = require('./../js/model'); const BitHelper = require('./../js/bitHelper') @@ -119,14 +117,6 @@ TABS.setup.initialize = function (callback) { function get_slow_data() { if (SerialBackend.have_sensor(FC.CONFIG.activeSensors, 'gps')) { - - /* - * Enable balancer - */ - // if (mspQueue.shouldDrop()) { - // return; - // } - MSP.send_message(MSPCodes.MSP_RAW_GPS, false, false, function () { var gpsFixType = i18n.getMessage('gpsFixNone'); if (FC.GPS_DATA.fix >= 2) @@ -142,14 +132,6 @@ TABS.setup.initialize = function (callback) { } function get_fast_data() { - - /* - * Enable balancer - */ - // if (mspQueue.shouldDrop()) { - // return; - // } - MSP.send_message(MSPCodes.MSP_ATTITUDE, false, false, function () { roll_e.text(i18n.getMessage('initialSetupAttitude', [FC.SENSOR_DATA.kinematics[0]])); pitch_e.text(i18n.getMessage('initialSetupAttitude', [FC.SENSOR_DATA.kinematics[1]])); @@ -159,9 +141,8 @@ TABS.setup.initialize = function (callback) { }); } - mspBalancedInterval.add('setup_data_pull_slow', 250, 1, get_slow_data); - interval.add('setup_data_pull_fast', get_fast_data, 50); + interval.add('setup_data_pull_slow', get_slow_data, 250); interval.add('gui_analog_update', function () { bat_cells_e.text(i18n.getMessage('initialSetupBatteryDetectedCellsValue', [FC.ANALOG.cell_count])); From 5e66e9e1b06e03e6a23ac68bd42ffab6852d5429 Mon Sep 17 00:00:00 2001 From: Scavanger Date: Fri, 26 Apr 2024 16:25:36 -0300 Subject: [PATCH 09/20] Reame, Context menu, Blackbox tab fix --- README.md | 28 +++++++++++++++++----------- js/main.js | 22 +++++++++++++++++++++- tabs/onboard_logging.html | 1 - tabs/onboard_logging.js | 2 ++ 4 files changed, 40 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 7f07253b9..7394edaf8 100644 --- a/README.md +++ b/README.md @@ -20,32 +20,32 @@ everything, the hardware is not working, or you have any other _support_ problem ## Installation -Depending on the target operating system, _INAV Configurator_ is distributed as a _standalone_ application or Chrome App. + _INAV Configurator_ is distributed as a _standalone_ application. ### Windows 1. Visit [release page](https://github.com/iNavFlight/inav-configurator/releases) -2. Download Configurator for Windows platform (win32 or win64 is present) +2. Download Configurator for Windows platform (ia32 or win64 is present) 3. Install * Extract ZIP archive and run the INAV Configurator app from the unpacked folder - * OR just use the setup program `INAV Configurator.msi` + * OR just use the setup program `INAV-Configurator_win32_arch_x.y.z.msi`, **arch** is your computer architecture (ia32 (32bit) or x64 (64bit)), **x.y.z** is the INAV Configurator version number. 4. Configurator is not signed, so you have to allow Windows to run untrusted applications. There might be a monit for it during the first run ### Linux 1. Visit [release page](https://github.com/iNavFlight/inav-configurator/releases) -2. Download Configurator for Linux platform (linux32 and linux64 are present) - * **.rpm** is the Fedora installation file. Just download and install using `sudo dnf localinstall /path/to/INAV-Configurator_linux64-x.y.z-x86_64.rpm` or open it with a package manager (e.g. via Files) - * **.deb** is the Debian/Ubuntu installation file. Just download and install using `sudo apt install /path/to/INAV-Configurator_linux64_x.y.z.deb` or open it with a package manager (e.g. via the File Manager) +2. Download Configurator for Linux platform (only linux64 is present) + * **.rpm** is the Fedora installation file. Just download and install using `sudo dnf localinstall /path/to/INAV-Configurator_linux_x64-x.y.z.rpm` or open it with a package manager (e.g. via Files) + * **.deb** is the Debian/Ubuntu installation file. Just download and install using `sudo apt install /path/to/INAV-Configurator_linux_x64_x.y.z.deb` or open it with a package manager (e.g. via the File Manager) * **.zip** is a universal archive. Download and continue with these instructions to install 3. Change to the directory containing the downloaded **zip** file 4. download [this](https://raw.githubusercontent.com/iNavFlight/inav-configurator/master/assets/linux/inav-configurator.desktop) file to the same directory. Its filename should be `inav-configurator.desktop`. 5. Extract **zip** archive ``` -unzip INAV-Configurator_linuxNN_x.y.z.tar.gz -d /tmp/ +unzip INAV-Configurator_linux_arch_x.y.z.zip -d /tmp/ ``` - **NN** is the bits of your OS. **x.y.z** is the INAV Configurator version number. + **arch** is your computer architecture (x64, armv7l, ...), **x.y.z** is the INAV Configurator version number. 6. If this is the first time installing INAV Configurator, create a home for its files ``` @@ -93,21 +93,27 @@ Options: See [Electron Forge CLI Documentation](https://www.electronforge.io/cli#options-2) for details +Note: Not all architectures are available for all platforms. For example, ia32 (32bit) support is not available for Linux. +Tested architectures: +- Windows: x64 and ia32 +- Linux: x64 and armv7l +- MacOS: x64 and arm64 + To build the setup program for windows, you have to install [WiX Toolset V3](https://github.com/wixtoolset/wix3/releases) and add the `bin` folder to you `PATH`, e.g. ```C:\Program Files (x86)\WiX Toolset v3.14\bin``` To build deb and rpm packages for Linux, you have to install the following packages: -- Ubuntu/Debian: `dpkg, fakeroot, rpmbuild, build-essential, libudev-dev` +- Ubuntu/Debian: `dpkg, fakeroot, rpm, build-essential, libudev-dev` - OpenSuse/Fedora: `dpkg, fakeroot, rpmbuild, systemd-devel, devel-basis (zypper install -t pattern devel_basis), zip` Example (note the double -- ): -``` npm run make -- --arch="x64" ``` +```npm run make -- --arch="x64"``` ### Running with debug | Inspector To be able to open Inspector, set envorinment variable `NODE_ENV` to `develpoment` or set the flag directly when run `npm start`: -```NODE_ENV=development npm start``` +```NODE_ENV=development npm start``` or ```$env:NODE_ENV="development" | npm start``` for Windows PowerShell Or use vscode and start a debug session `Debug Configurator` (Just hit F5!) diff --git a/js/main.js b/js/main.js index df9f05c0b..60eb4e6de 100644 --- a/js/main.js +++ b/js/main.js @@ -1,4 +1,4 @@ -const { app, BrowserWindow, ipcMain } = require('electron'); +const { app, BrowserWindow, ipcMain, Menu, MenuItem } = require('electron'); const windowStateKeeper = require('electron-window-state'); const path = require('path'); const Store = require('electron-store'); @@ -76,6 +76,26 @@ function createWindow() { }, }); + mainWindow.webContents.on('context-menu', (_, props) => { + const menu = new Menu() ; + menu.append(new MenuItem({ label: "Undo", role: "undo", accelerator: 'CmdOrCtrl+Z', visible: props.isEditable })); + menu.append(new MenuItem({ label: "Redo", role: "redo", accelerator: 'CmdOrCtrl+Y', visible: props.isEditable })); + menu.append(new MenuItem({ type: "separator", visible: props.isEditable })); + menu.append(new MenuItem({ label: 'Cut', role: 'cut', accelerator: 'CmdOrCtrl+X', visible: props.isEditable && props.selectionText })); + menu.append(new MenuItem({ label: 'Copy', role: 'copy', accelerator: 'CmdOrCtrl+C', visible: props.selectionText })); + menu.append(new MenuItem({ label: 'Paste', role: 'paste', accelerator: 'CmdOrCtrl+V', visible: props.isEditable })); + menu.append(new MenuItem({ label: "Select all", role: 'selectAll', accelerator: 'CmdOrCtrl+A', visible: props.isEditable})); + + + + menu.items.forEach(item => { + if (item.visible) { + menu.popup(); + return; + } + }); + }); + mainWindow.webContents.on('select-bluetooth-device', (event, deviceList, callback) => { event.preventDefault(); selectBluetoothCallback = callback; diff --git a/tabs/onboard_logging.html b/tabs/onboard_logging.html index 7df3f776e..c1e976c0d 100644 --- a/tabs/onboard_logging.html +++ b/tabs/onboard_logging.html @@ -152,7 +152,6 @@

- diff --git a/tabs/onboard_logging.js b/tabs/onboard_logging.js index ebfd519f3..fb99b5eec 100644 --- a/tabs/onboard_logging.js +++ b/tabs/onboard_logging.js @@ -1,9 +1,11 @@ 'use strict'; +const { dialog } = require("@electron/remote"); const path = require('path'); const MSPCodes = require('./../js/msp/MSPCodes'); const MSP = require('./../js/msp'); +const mspHelper = require("./../js/msp/MSPHelper"); const { GUI, TABS } = require('./../js/gui'); const FC = require('./../js/fc'); const CONFIGURATOR = require('./../js/data_storage'); From 20e36b9b65f21d85bbd2795689a516322ec62881 Mon Sep 17 00:00:00 2001 From: "Pawel Spychalski (DzikuVx)" Date: Fri, 26 Apr 2024 21:36:02 +0200 Subject: [PATCH 10/20] Status updated changes --- js/msp.js | 2 +- js/periodicStatusUpdater.js | 5 ----- js/serial_queue.js | 8 -------- tabs/mission_control.js | 4 ---- 4 files changed, 1 insertion(+), 18 deletions(-) diff --git a/js/msp.js b/js/msp.js index 85a51a5e5..820b7d55c 100644 --- a/js/msp.js +++ b/js/msp.js @@ -269,7 +269,7 @@ var MSP = { */ timeout.add('delayedFreeHardLock', function() { mspQueue.freeHardLock(); - }, 50); + }, 10); // Reset variables this.message_length_received = 0; diff --git a/js/periodicStatusUpdater.js b/js/periodicStatusUpdater.js index e28959509..084da4a2a 100644 --- a/js/periodicStatusUpdater.js +++ b/js/periodicStatusUpdater.js @@ -104,11 +104,6 @@ const mspQueue = require('./serial_queue'); if (!stoppped && GUI.active_tab != 'cli') { - if (mspQueue.shouldDropStatus()) { - return; - } - - MSP.send_message(MSPCodes.MSP_SENSOR_STATUS, false, false); MSP.send_message(MSPCodes.MSPV2_INAV_STATUS, false, false); MSP.send_message(MSPCodes.MSP_ACTIVEBOXES, false, false); diff --git a/js/serial_queue.js b/js/serial_queue.js index c01e8b8f6..f4cf1bc19 100644 --- a/js/serial_queue.js +++ b/js/serial_queue.js @@ -313,14 +313,6 @@ var mspQueue = function () { }; - publicScope.shouldDrop = function () { - return (Math.round(Math.random()*100) < privateScope.dropRatio); - }; - - publicScope.shouldDropStatus = function () { - return (Math.round(Math.random()*100) < (privateScope.dropRatio * privateScope.statusDropFactor)); - }; - /** * This method return periodic for polling interval that should populate queue in 80% or less * @param {number} requestedInterval diff --git a/tabs/mission_control.js b/tabs/mission_control.js index 27b181836..19c377860 100644 --- a/tabs/mission_control.js +++ b/tabs/mission_control.js @@ -341,10 +341,6 @@ TABS.mission_control.initialize = function (callback) { return; } - if (mspQueue.shouldDrop()) { - return; - } - get_raw_gps_data(); }, 200); } From 9f9aa84170512bfc9aad39607c16938583c47a01 Mon Sep 17 00:00:00 2001 From: "Pawel Spychalski (DzikuVx)" Date: Fri, 26 Apr 2024 21:46:57 +0200 Subject: [PATCH 11/20] On connect load in series, not in parallel --- js/serial_backend.js | 51 ++++++++++++++++++++++---------------------- 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/js/serial_backend.js b/js/serial_backend.js index 04eb60a99..2fb26e803 100755 --- a/js/serial_backend.js +++ b/js/serial_backend.js @@ -454,35 +454,36 @@ var SerialBackend = (function () { $('.mode-disconnected').hide(); $('.mode-connected').show(); - MSP.send_message(MSPCodes.MSP_DATAFLASH_SUMMARY, false, false); - - $('#sensor-status').show(); - $('#portsinput').hide(); - $('#dataflash_wrapper_global').show(); - - /* - * Get BOXNAMES since it is used for some reason.... - */ - MSP.send_message(MSPCodes.MSP_BOXNAMES, false, false); + MSP.send_message(MSPCodes.MSP_DATAFLASH_SUMMARY, false, false, function () { + $('#sensor-status').show(); + $('#portsinput').hide(); + $('#dataflash_wrapper_global').show(); + + /* + * Get BOXNAMES since it is used for some reason.... + */ + MSP.send_message(MSPCodes.MSP_BOXNAMES, false, false, function () { + /* + * Init PIDs bank with a length that depends on the version + */ + let pidCount = 11; - /* - * Init PIDs bank with a length that depends on the version - */ - let pidCount = 11; + for (let i = 0; i < pidCount; i++) { + FC.PIDs.push(new Array(4)); + } - for (let i = 0; i < pidCount; i++) { - FC.PIDs.push(new Array(4)); - } + interval.add('msp-load-update', function () { + $('#msp-version').text("MSP version: " + MSP.protocolVersion.toFixed(0)); + $('#msp-load').text("MSP load: " + mspQueue.getLoad().toFixed(1)); + $('#msp-roundtrip').text("MSP round trip: " + mspQueue.getRoundtrip().toFixed(0)); + $('#hardware-roundtrip').text("HW round trip: " + mspQueue.getHardwareRoundtrip().toFixed(0)); + $('#drop-rate').text("Drop ratio: " + mspQueue.getDropRatio().toFixed(0) + "%"); + }, 100); - interval.add('msp-load-update', function () { - $('#msp-version').text("MSP version: " + MSP.protocolVersion.toFixed(0)); - $('#msp-load').text("MSP load: " + mspQueue.getLoad().toFixed(1)); - $('#msp-roundtrip').text("MSP round trip: " + mspQueue.getRoundtrip().toFixed(0)); - $('#hardware-roundtrip').text("HW round trip: " + mspQueue.getHardwareRoundtrip().toFixed(0)); - $('#drop-rate').text("Drop ratio: " + mspQueue.getDropRatio().toFixed(0) + "%"); - }, 100); + interval.add('global_data_refresh', periodicStatusUpdater.run, periodicStatusUpdater.getUpdateInterval(CONFIGURATOR.connection.bitrate), false); + }); + }); - interval.add('global_data_refresh', periodicStatusUpdater.run, periodicStatusUpdater.getUpdateInterval(CONFIGURATOR.connection.bitrate), false); } privateScope.onClosed = function (result) { From c50c28919b934e81a66df5dc1777aee43fb34ffa Mon Sep 17 00:00:00 2001 From: "Pawel Spychalski (DzikuVx)" Date: Fri, 26 Apr 2024 22:20:41 +0200 Subject: [PATCH 12/20] get rid of drop ratio and PID controller --- index.html | 3 - js/pid_controller.js | 130 ------------------------------------------- js/serial_backend.js | 1 - js/serial_queue.js | 26 +-------- 4 files changed, 1 insertion(+), 159 deletions(-) delete mode 100644 js/pid_controller.js diff --git a/index.html b/index.html index 0ac68c831..4b0d8aec5 100644 --- a/index.html +++ b/index.html @@ -339,9 +339,6 @@

-
- -
-
diff --git a/js/pid_controller.js b/js/pid_controller.js deleted file mode 100644 index b1df68709..000000000 --- a/js/pid_controller.js +++ /dev/null @@ -1,130 +0,0 @@ -'use strict'; - - -var PidController = function () { - - var self = {}, - privateScope = {}; - - /** - * - * @type {number} - */ - privateScope.target = null; - - /** - * - * @type {{P: null, I: null, D: null}} - */ - privateScope.gains = { - P: null, - I: null, - D: null - }; - - /** - * - * @type {number} - */ - privateScope.Iterm = 0; - - /** - * - * @type {{min: number, max: number}} - */ - privateScope.ItermLimit = { - min: -1000, - max: 1000 - }; - - /** - * - * @type {number} - */ - privateScope.previousError = 0; - - /** - * - * @type {{min: number, max: number, minThreshold: number}} - */ - privateScope.output = { - min: null, - max: null, - minThreshold: null - }; - - /** - * - * @param {number} value - */ - self.setTarget = function (value) { - privateScope.target = value; - }; - - /** - * @param {number} Pgain - * @param {number} Igain - * @param {number} Dgain - */ - self.setGains = function (Pgain, Igain, Dgain) { - privateScope.gains.P = Pgain; - privateScope.gains.I = Igain; - privateScope.gains.D = Dgain; - }; - - /** - * Sets min and max value for output - * @param {number} min - * @param {number} max - * @param {number} minThreshold if output is below this value, [min] is returned - */ - self.setOutput = function (min, max, minThreshold) { - privateScope.output.min = min; - privateScope.output.max = max; - privateScope.output.minThreshold = minThreshold; - }; - - /** - * Sets upper and lower limit for Iterm accumulator - * @param {number} min - * @param {number} max - */ - self.setItermLimit = function (min, max) { - privateScope.ItermLimit.min = min; - privateScope.ItermLimit.max = max; - }; - - /** - * Executes PID controller based on current value and target - * @param {number} current - * @returns {number} - */ - self.run = function (current) { - var error = current - privateScope.target, - Pterm = error * privateScope.gains.P, - Dterm = (error - privateScope.previousError) * privateScope.gains.D, - output; - - privateScope.previousError = error; - - privateScope.Iterm += error * privateScope.gains.I; - if (privateScope.Iterm > privateScope.ItermLimit.max) { - privateScope.Iterm = privateScope.ItermLimit.max; - } else if (privateScope.Iterm < privateScope.ItermLimit.min) { - privateScope.Iterm = privateScope.ItermLimit.min; - } - - output = Pterm + privateScope.Iterm + Dterm; - if (output < privateScope.output.minThreshold) { - output = privateScope.output.min; - } else if (output > privateScope.output.max) { - output = privateScope.output.max; - } - - return output; - }; - - return self; -}; - -module.exports = PidController; \ No newline at end of file diff --git a/js/serial_backend.js b/js/serial_backend.js index 2fb26e803..8f053ca90 100755 --- a/js/serial_backend.js +++ b/js/serial_backend.js @@ -477,7 +477,6 @@ var SerialBackend = (function () { $('#msp-load').text("MSP load: " + mspQueue.getLoad().toFixed(1)); $('#msp-roundtrip').text("MSP round trip: " + mspQueue.getRoundtrip().toFixed(0)); $('#hardware-roundtrip').text("HW round trip: " + mspQueue.getHardwareRoundtrip().toFixed(0)); - $('#drop-rate').text("Drop ratio: " + mspQueue.getDropRatio().toFixed(0) + "%"); }, 100); interval.add('global_data_refresh', periodicStatusUpdater.run, periodicStatusUpdater.getUpdateInterval(CONFIGURATOR.connection.bitrate), false); diff --git a/js/serial_queue.js b/js/serial_queue.js index f4cf1bc19..7dbf492b0 100644 --- a/js/serial_queue.js +++ b/js/serial_queue.js @@ -3,7 +3,6 @@ const CONFIGURATOR = require('./data_storage'); const MSPCodes = require('./msp/MSPCodes'); const SimpleSmoothFilter = require('./simple_smooth_filter'); -const PidController = require('./pid_controller'); const eventFrequencyAnalyzer = require('./eventFrequencyAnalyzer'); const mspDeduplicationQueue = require('./msp/mspDeduplicationQueue'); @@ -28,29 +27,9 @@ var mspQueue = function () { privateScope.currentLoad = 0; - /** - * PID controller used to perform throttling - * @type {PidController} - */ - privateScope.loadPidController = new PidController(); - privateScope.loadPidController.setTarget(privateScope.targetLoad); - privateScope.loadPidController.setOutput(0, 99, 0); - privateScope.loadPidController.setGains(5, 6, 3); - privateScope.loadPidController.setItermLimit(0, 90); - - privateScope.dropRatio = 0; - privateScope.removeCallback = null; privateScope.putCallback = null; - publicScope.computeDropRatio = function () { - privateScope.dropRatio = privateScope.loadPidController.run(publicScope.getLoad()); - }; - - publicScope.getDropRatio = function () { - return privateScope.dropRatio; - }; - privateScope.queue = []; privateScope.softLock = false; @@ -229,12 +208,10 @@ var mspQueue = function () { */ publicScope.put = function (mspRequest) { - console.log('Received message ', mspRequest.code); - const isMessageInQueue = mspDeduplicationQueue.check(mspRequest.code); if (isMessageInQueue) { - console.log('Message already in queue: ' + mspRequest.code); + eventFrequencyAnalyzer.put('MSP Duplicate ' + mspRequest.code); return false; } @@ -286,7 +263,6 @@ var mspQueue = function () { publicScope.balancer = function () { privateScope.currentLoad = privateScope.loadFilter.get(); - publicScope.computeDropRatio(); /* * Also, check if port lock if hanging. Free is so From 9642e8687620c4c71fb3ed96020e659f5ff231ce Mon Sep 17 00:00:00 2001 From: Scavanger Date: Fri, 26 Apr 2024 18:48:17 -0300 Subject: [PATCH 13/20] Fix Led Config --- js/msp/MSPHelper.js | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/js/msp/MSPHelper.js b/js/msp/MSPHelper.js index 61a17cb4c..00e8c4c22 100644 --- a/js/msp/MSPHelper.js +++ b/js/msp/MSPHelper.js @@ -922,7 +922,7 @@ var mspHelper = (function () { directions = []; for (directionLetterIndex = 0; directionLetterIndex < MSP.ledDirectionLetters.length; directionLetterIndex++) { - if (bit_check(directionMask, directionLetterIndex)) { + if (BitHelper.bit_check(directionMask, directionLetterIndex)) { directions.push(MSP.ledDirectionLetters[directionLetterIndex]); } } @@ -932,7 +932,7 @@ var mspHelper = (function () { functions = []; for (var functionLetterIndex = 0; functionLetterIndex < MSP.ledFunctionLetters.length; functionLetterIndex++) { - if (bit_check(functionMask, functionLetterIndex)) { + if (BitHelper.bit_check(functionMask, functionLetterIndex)) { functions.push(MSP.ledFunctionLetters[functionLetterIndex]); } } @@ -962,7 +962,7 @@ var mspHelper = (function () { var overlayMask = (mask >> 12) & 0x3F; for (var overlayLetterIndex = 0; overlayLetterIndex < MSP.ledOverlayLetters.length; overlayLetterIndex++) { - if (bit_check(overlayMask, overlayLetterIndex)) { + if (BitHelper.bit_check(overlayMask, overlayLetterIndex)) { functions.push(MSP.ledOverlayLetters[overlayLetterIndex]); } } @@ -971,7 +971,7 @@ var mspHelper = (function () { directions = []; for (directionLetterIndex = 0; directionLetterIndex < MSP.ledDirectionLetters.length; directionLetterIndex++) { - if (bit_check(directionMask, directionLetterIndex)) { + if (BitHelper.bit_check(directionMask, directionLetterIndex)) { directions.push(MSP.ledDirectionLetters[directionLetterIndex]); } } @@ -1017,7 +1017,7 @@ var mspHelper = (function () { var overlayMask = (mask >> 16) & 0xFF; for (var overlayLetterIndex = 0; overlayLetterIndex < MSP.ledOverlayLetters.length; overlayLetterIndex++) { - if (bit_check(overlayMask, overlayLetterIndex)) { + if (BitHelper.bit_check(overlayMask, overlayLetterIndex)) { functions.push(MSP.ledOverlayLetters[overlayLetterIndex]); } } @@ -1026,7 +1026,7 @@ var mspHelper = (function () { directions = []; for (directionLetterIndex = 0; directionLetterIndex < MSP.ledDirectionLetters.length; directionLetterIndex++) { - if (bit_check(directionMask, directionLetterIndex)) { + if (BitHelper.bit_check(directionMask, directionLetterIndex)) { directions.push(MSP.ledDirectionLetters[directionLetterIndex]); } } @@ -2260,7 +2260,7 @@ var mspHelper = (function () { buffer.push(BitHelper.lowByte(servoConfiguration.middle)); buffer.push(BitHelper.highByte(servoConfiguration.middle)); - buffer.push(lowByte(servoConfiguration.rate)); + buffer.push(BitHelper.lowByte(servoConfiguration.rate)); // prepare for next iteration servoIndex++; @@ -2650,7 +2650,7 @@ var mspHelper = (function () { bitIndex = MSP.ledOverlayLetters.indexOf(led.functions[overlayLetterIndex]); if (bitIndex >= 0) { - mask |= bit_set(mask, bitIndex + 16); + mask |= BitHelper.bit_set(mask, bitIndex + 16); } } @@ -2662,9 +2662,9 @@ var mspHelper = (function () { bitIndex = MSP.ledDirectionLetters.indexOf(led.directions[directionLetterIndex]); if (bitIndex >= 0) { if(bitIndex < 4) { - mask |= bit_set(mask, bitIndex + 28); + mask |= BitHelper.bit_set(mask, bitIndex + 28); } else { - extra |= bit_set(extra, bitIndex - 4); + extra |= BitHelper.bit_set(extra, bitIndex - 4); } } } From e1faf6a4a4d1868d66c3dbcf9cbb44aae07e9a6e Mon Sep 17 00:00:00 2001 From: Scavanger Date: Fri, 26 Apr 2024 18:53:50 -0300 Subject: [PATCH 14/20] Fix Github Actions --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0604722db..26bd97554 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -85,7 +85,7 @@ jobs: cache: 'npm' # Workaround due to a bug in node-gyp: https://github.com/electron/rebuild/issues/1116 - name: Install Setuptools - run: pip install setuptools + run: python3 -m pip install --break-system-packages setuptools - name: Install deps uses: nick-fields/retry@v2 with: From 303309b43703357277d464d8aa422af53080e051 Mon Sep 17 00:00:00 2001 From: Scavanger Date: Fri, 26 Apr 2024 21:07:04 -0300 Subject: [PATCH 15/20] Fix color picker --- tabs/led_strip.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/tabs/led_strip.js b/tabs/led_strip.js index b6b29e82e..f9192ca48 100644 --- a/tabs/led_strip.js +++ b/tabs/led_strip.js @@ -230,9 +230,8 @@ TABS.led_strip.initialize = function (callback, scrollPosition) { $('.colors').on('dblclick', 'button', function(e) { - var pp = $('.tab-led-strip').position(); - var moveLeft = $('.tab-led-strip').position().left + ($('.colorDefineSliders').width() / 2); - var moveUp = $('.tab-led-strip').position().top + $('.colorDefineSliders').height() + 20; + var moveLeft = $('.tab-led-strip').offset().left + ($('.colorDefineSliders').width() / 2); + var moveUp = $('.tab-led-strip').offset().top + $('.colorDefineSliders').height() + 20; $('.colorDefineSliders').css('left', e.pageX - e.offsetX - moveLeft); $('.colorDefineSliders').css('top', e.pageY - e.offsetY - moveUp); From 2f26bd1863a2f3e3290b43b648687cb61441092f Mon Sep 17 00:00:00 2001 From: Scavanger Date: Fri, 26 Apr 2024 21:22:20 -0300 Subject: [PATCH 16/20] trigger GitHub actions From 5dff190197c5c269eec29853fd4ea6a7cb7e675b Mon Sep 17 00:00:00 2001 From: breadoven <56191411+breadoven@users.noreply.github.com> Date: Sat, 27 Apr 2024 11:49:58 +0100 Subject: [PATCH 17/20] bing dem datum fix --- js/waypoint.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/waypoint.js b/js/waypoint.js index 729b19b93..ad3a0ba43 100644 --- a/js/waypoint.js +++ b/js/waypoint.js @@ -146,7 +146,7 @@ let Waypoint = function (number, action, lat, lon, alt=0, p1=0, p2=0, p3=0, endM self.getElevation = async function (globalSettings) { let elevation = "N/A"; if (globalSettings.mapProviderType == 'bing') { - let elevationEarthModel = $('#elevationEarthModel').prop("checked") ? "sealevel" : "ellipsoid"; + let elevationEarthModel = $('#elevationEarthModel').prop("checked") ? "ellipsoid" : "sealevel"; const response = await fetch('http://dev.virtualearth.net/REST/v1/Elevation/List?points='+self.getLatMap()+','+self.getLonMap()+'&heights='+elevationEarthModel+'&key='+globalSettings.mapApiKey); const myJson = await response.json(); From 686417604d94fbb66b054ce7ee473f580c804eb9 Mon Sep 17 00:00:00 2001 From: Scavanger Date: Sat, 27 Apr 2024 09:54:27 -0300 Subject: [PATCH 18/20] Fix Mission Planner, uniform fs requires --- js/main.js | 2 -- tabs/cli.js | 3 +-- tabs/firmware_flasher.js | 3 +-- tabs/logging.js | 2 +- tabs/mission_control.js | 12 ++++-------- tabs/onboard_logging.js | 2 +- tabs/osd.js | 2 +- 7 files changed, 9 insertions(+), 17 deletions(-) diff --git a/js/main.js b/js/main.js index 60eb4e6de..dd8e93da0 100644 --- a/js/main.js +++ b/js/main.js @@ -85,8 +85,6 @@ function createWindow() { menu.append(new MenuItem({ label: 'Copy', role: 'copy', accelerator: 'CmdOrCtrl+C', visible: props.selectionText })); menu.append(new MenuItem({ label: 'Paste', role: 'paste', accelerator: 'CmdOrCtrl+V', visible: props.isEditable })); menu.append(new MenuItem({ label: "Select all", role: 'selectAll', accelerator: 'CmdOrCtrl+A', visible: props.isEditable})); - - menu.items.forEach(item => { if (item.visible) { diff --git a/tabs/cli.js b/tabs/cli.js index abde85033..e22c2c622 100644 --- a/tabs/cli.js +++ b/tabs/cli.js @@ -1,6 +1,7 @@ 'use strict'; const path = require('path'); +const fs = require('fs'); const { dialog } = require("@electron/remote"); const MSP = require('./../js/msp'); @@ -170,7 +171,6 @@ TABS.cli.initialize = function (callback) { return; } - const fs = require('fs'); fs.writeFile(result.filePath, self.outputHistory, (err) => { if (err) { GUI.log(i18n.getMessage('ErrorWritingFile')); @@ -255,7 +255,6 @@ TABS.cli.initialize = function (callback) { } if (result.filePaths.length == 1) { - const fs = require('fs'); fs.readFile(result.filePaths[0], (err, data) => { if (err) { GUI.log(i18n.getMessage('ErrorReadingFile')); diff --git a/tabs/firmware_flasher.js b/tabs/firmware_flasher.js index bcd4a4834..c738347e2 100755 --- a/tabs/firmware_flasher.js +++ b/tabs/firmware_flasher.js @@ -1,6 +1,7 @@ 'use strict'; const { marked } = require('marked'); +const fs = require('fs'); const path = require('path'); const semver = require('semver'); const { dialog } = require('@electron/remote'); @@ -254,8 +255,6 @@ TABS.firmware_flasher.initialize = function (callback) { if (result.filePaths.length == 1) { filename = result.filePaths[0]; } - - const fs = require('fs'); $('div.git_info').slideUp(); diff --git a/tabs/logging.js b/tabs/logging.js index 43de37094..69a7a508d 100644 --- a/tabs/logging.js +++ b/tabs/logging.js @@ -1,6 +1,7 @@ 'use strict'; const path = require('path'); +const fs = require('fs'); const { dialog } = require("@electron/remote"); const Store = require('electron-store'); const store = new Store(); @@ -84,7 +85,6 @@ TABS.logging.initialize = function (callback) { } interval.add('log_data_poll', log_data_poll, parseInt($('select.speed').val()), true); // refresh rate goes here - const fs = require('fs'); interval.add('write_data', function write_data() { if (log_buffer.length && readyToWrite) { // only execute when there is actual data to write diff --git a/tabs/mission_control.js b/tabs/mission_control.js index 65aec1774..c7da7cc9e 100644 --- a/tabs/mission_control.js +++ b/tabs/mission_control.js @@ -1,7 +1,9 @@ 'use strict'; const path = require('path'); +const fs = require('fs'); const ol = require('openlayers'); +const xml2js = require('xml2js'); const Store = require('electron-store'); const store = new Store(); const { dialog } = require("@electron/remote"); @@ -3161,9 +3163,6 @@ TABS.mission_control.initialize = function (callback) { // ///////////////////////////////////////////// function loadMissionFile(filename) { - const fs = require('fs'); - if (!window.xml2js) return GUI.log(i18n.getMessage('errorReadingFileXml2jsNotFound')); - for (let i = FC.SAFEHOMES.getMaxSafehomeCount(); i < FC.FW_APPROACH.getMaxFwApproachCount(); i++) { FC.FW_APPROACH.clean(i); } @@ -3174,7 +3173,7 @@ TABS.mission_control.initialize = function (callback) { return console.error(err); } - window.xml2js.Parser({ 'explicitChildren': true, 'preserveChildrenOrder': true }).parseString(data, (err, result) => { + xml2js.Parser({ 'explicitChildren': true, 'preserveChildrenOrder': true }).parseString(data, (err, result) => { if (err) { GUI.log(i18n.getMessage('errorParsingFile')); return console.error(err); @@ -3344,9 +3343,6 @@ TABS.mission_control.initialize = function (callback) { } function saveMissionFile(filename) { - const fs = require('fs'); - if (!window.xml2js) return GUI.log(i18n.getMessage('errorWritingFileXml2jsNotFound')); - var center = ol.proj.toLonLat(map.getView().getCenter()); var zoom = map.getView().getZoom(); let multimission = multimissionCount && !singleMissionActive(); @@ -3408,7 +3404,7 @@ TABS.mission_control.initialize = function (callback) { approachIdx++; } - var builder = new window.xml2js.Builder({ 'rootName': 'mission', 'renderOpts': { 'pretty': true, 'indent': '\t', 'newline': '\n' } }); + var builder = new xml2js.Builder({ 'rootName': 'mission', 'renderOpts': { 'pretty': true, 'indent': '\t', 'newline': '\n' } }); var xml = builder.buildObject(data); xml = xml.replace(/missionitem mission/g, 'meta mission'); fs.writeFile(filename, xml, (err) => { diff --git a/tabs/onboard_logging.js b/tabs/onboard_logging.js index fb99b5eec..b8b692596 100644 --- a/tabs/onboard_logging.js +++ b/tabs/onboard_logging.js @@ -1,6 +1,7 @@ 'use strict'; const { dialog } = require("@electron/remote"); +const fs = require('fs'); const path = require('path'); const MSPCodes = require('./../js/msp/MSPCodes'); @@ -357,7 +358,6 @@ TABS.onboard_logging.initialize = function (callback) { const maxBytes = FC.DATAFLASH.usedSize; prepare_file(function(filename) { - const fs = require('fs'); let nextAddress = 0; show_saving_dialog(); diff --git a/tabs/osd.js b/tabs/osd.js index f60440a9c..93a71a918 100644 --- a/tabs/osd.js +++ b/tabs/osd.js @@ -1,6 +1,7 @@ 'use strict'; const inflection = require( 'inflection' ); +const fs = require('fs'); const path = require('path'); const semver = require('semver'); const mapSeries = require('promise-map-series'); @@ -269,7 +270,6 @@ FONT.openFontFile = function ($preview) { } if (result.filePaths.length == 1) { - const fs = require('fs'); const fontData = fs.readFileSync(result.filePaths[0], {flag: "r"}); FONT.parseMCMFontFile(fontData.toString()); resolve(); From 3d3f5aac8e94012a8b9d5af029bffe9f4b79cb49 Mon Sep 17 00:00:00 2001 From: Jonathan Hudson Date: Sat, 27 Apr 2024 18:42:14 +0100 Subject: [PATCH 19/20] Filter list of Linux devices to more sane set (front page and SITL) --- js/connection/connectionSerial.js | 23 ++++++++++++++++------- js/sitl.js | 15 ++++++++------- 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/js/connection/connectionSerial.js b/js/connection/connectionSerial.js index e3fb4502d..13033c8fb 100644 --- a/js/connection/connectionSerial.js +++ b/js/connection/connectionSerial.js @@ -18,13 +18,13 @@ class ConnectionSerial extends Connection { super._type = ConnectionType.Serial; } - connectImplementation(path, options, callback) { + connectImplementation(path, options, callback) { try { this._serialport = new SerialPortStream({binding, path: path, baudRate: options.bitrate, autoOpen: true}, () => { if (callback) { callback({ connectionId: ++this._connectionId, - bitrate: options.bitrate + bitrate: options.bitrate }); } }); @@ -50,12 +50,12 @@ class ConnectionSerial extends Connection { this.abort(); console.log("Serial error: " + error); this._onReceiveErrorListeners.forEach(listener => { - listener(error); + listener(error); }); }); } - disconnectImplementation(callback) { + disconnectImplementation(callback) { if (this._serialport && this._serialport.isOpen) { this._serialport.close(error => { if (error) { @@ -68,7 +68,7 @@ class ConnectionSerial extends Connection { callback(true); } } - + sendImplementation(data, callback) { if (this._serialport && this._serialport.isOpen) { this._serialport.write(Buffer.from(data), error => { @@ -105,14 +105,23 @@ class ConnectionSerial extends Connection { this._onReceiveErrorListeners = this._onReceiveErrorListeners.filter(listener => listener !== callback); } - static async getDevices(callback) { + static async getDevices(callback) { SerialPort.list().then((ports, error) => { var devices = []; if (error) { GUI.log("Unable to list serial ports."); } else { ports.forEach(port => { - devices.push(port.path); + if (GUI.operating_system == 'Linux') { + /* Limit to: USB serial, RFCOMM (BT), 6 legacy devices */ + if (port.pnpId || + port.path.match(/rfcomm\d*/) || + port.path.match(/ttyS[0-5]$/)) { + devices.push(port.path); + } + } else { + devices.push(port.path); + } }); } if (callback) diff --git a/js/sitl.js b/js/sitl.js index f9661aad0..b78aaf79e 100644 --- a/js/sitl.js +++ b/js/sitl.js @@ -138,19 +138,20 @@ var Ser2TCP = { var devices = []; if (error) { GUI.log("Unable to list serial ports."); - } else { + } else { ports.forEach((device) => { if (GUI.operating_system == 'Windows') { var m = device.path.match(/COM\d?\d/g) if (m) devices.push(m[0]); } else { - if (device.displayName != null) { - var m = device.path.match(/\/dev\/.*/) - if (m) - devices.push(m[0]); + /* Limit to: USB serial, RFCOMM (BT), 6 legacy devices */ + if (device.pnpId || + device.path.match(/rfcomm\d*/) || + device.path.match(/ttyS[0-5]$/)) { + devices.push(device.path); } - } + } }); } callback(devices); @@ -231,7 +232,7 @@ var SITLProcess = { if (err) console.log(err); }); - + } else { alert(GUI.operating_system); return; From 7ed032ad2e1c39423cabd030b3613262cea5e12b Mon Sep 17 00:00:00 2001 From: "Pawel Spychalski (DzikuVx)" Date: Sat, 27 Apr 2024 20:38:41 +0200 Subject: [PATCH 20/20] Fix additional tabs --- tabs/outputs.js | 20 ------------------ tabs/sensors.js | 54 ------------------------------------------------- 2 files changed, 74 deletions(-) diff --git a/tabs/outputs.js b/tabs/outputs.js index 72269f72c..c45d6bfa4 100644 --- a/tabs/outputs.js +++ b/tabs/outputs.js @@ -431,15 +431,6 @@ TABS.outputs.initialize = function (callback) { interval.killAll(['motor_and_status_pull', 'global_data_refresh', 'msp-load-update', 'ltm-connection-check']); interval.add('IMU_pull', function () { - - /* - * Enable balancer - */ - if (mspQueue.shouldDrop()) { - update_accel_graph(); - return; - } - MSP.send_message(MSPCodes.MSP_RAW_IMU, false, false, update_accel_graph); }, 25, true); @@ -660,21 +651,10 @@ TABS.outputs.initialize = function (callback) { $motorsEnableTestMode.trigger('change'); function getPeriodicMotorOutput() { - - if (mspQueue.shouldDrop()) { - getPeriodicServoOutput(); - return; - } - MSP.send_message(MSPCodes.MSP_MOTOR, false, false, getPeriodicServoOutput); } function getPeriodicServoOutput() { - if (mspQueue.shouldDrop()) { - update_ui(); - return; - } - MSP.send_message(MSPCodes.MSP_SERVO, false, false, update_ui); } diff --git a/tabs/sensors.js b/tabs/sensors.js index 013bb6840..a909feebe 100644 --- a/tabs/sensors.js +++ b/tabs/sensors.js @@ -442,90 +442,36 @@ TABS.sensors.initialize = function (callback) { // data pulling timers if (checkboxes[0] || checkboxes[1] || checkboxes[2]) { interval.add('IMU_pull', function () { - - /* - * Enable balancer - */ - if (mspQueue.shouldDrop()) { - update_imu_graphs(); - return; - } - MSP.send_message(MSPCodes.MSP_RAW_IMU, false, false, update_imu_graphs); }, fastest, true); } if (checkboxes[3]) { interval.add('altitude_pull', function altitude_data_pull() { - - /* - * Enable balancer - */ - if (mspQueue.shouldDrop()) { - update_altitude_graph(); - return; - } - MSP.send_message(MSPCodes.MSP_ALTITUDE, false, false, update_altitude_graph); }, rates.baro, true); } if (checkboxes[4]) { interval.add('sonar_pull', function sonar_data_pull() { - - /* - * Enable balancer - */ - if (mspQueue.shouldDrop()) { - update_sonar_graphs(); - return; - } - MSP.send_message(MSPCodes.MSP_SONAR, false, false, update_sonar_graphs); }, rates.sonar, true); } if (checkboxes[5]) { interval.add('airspeed_pull', function airspeed_data_pull() { - - /* - * Enable balancer - */ - if (mspQueue.shouldDrop()) { - update_airspeed_graphs(); - return; - } - MSP.send_message(MSPCodes.MSPV2_INAV_AIR_SPEED, false, false, update_airspeed_graphs); }, rates.airspeed, true); } if (checkboxes[6]) { interval.add('temperature_pull', function temperature_data_pull() { - - /* - * Enable balancer - */ - if (mspQueue.shouldDrop()) { - update_temperature_graphs(); - return; - } - MSP.send_message(MSPCodes.MSP2_INAV_TEMPERATURES, false, false, update_temperature_graphs); }, 1000, true); } if (checkboxes[7]) { interval.add('debug_pull', function debug_data_pull() { - - /* - * Enable balancer - */ - if (mspQueue.shouldDrop()) { - update_debug_graphs(); - return; - } - MSP.send_message(MSPCodes.MSP2_INAV_DEBUG, false, false, update_debug_graphs); }, rates.debug, true); }