diff options
author | Paweł Spychalski <pspychalski@gmail.com> | 2022-10-01 13:49:36 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-10-01 13:49:36 +0300 |
commit | 310a263dd705d2a21ed57ee9815ca96ded5b513a (patch) | |
tree | 6ce864bedc28133526abafd1f94eb5016c358588 | |
parent | a9402f4c701e21f0dd73b10dc8ec192f8e9ad692 (diff) | |
parent | 278dc096a7cabf86c8235d5d356a7f6062098282 (diff) |
Merge pull request #1561 from iNavFlight/MrD_Autoselect-target
Implemented target autodetection
-rwxr-xr-x | _locales/en/messages.json | 3 | ||||
-rw-r--r-- | js/msp/MSPHelper.js | 21 | ||||
-rw-r--r-- | main.js | 2 | ||||
-rw-r--r-- | src/css/tabs/firmware_flasher.css | 5 | ||||
-rwxr-xr-x | tabs/firmware_flasher.html | 5 | ||||
-rwxr-xr-x | tabs/firmware_flasher.js | 157 |
6 files changed, 187 insertions, 6 deletions
diff --git a/_locales/en/messages.json b/_locales/en/messages.json index 8e6bd6c2..3bfd2856 100755 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -2179,6 +2179,9 @@ "firmwareFlasherOptionLabelSelectFirmwareVersionFor": { "message": "Choose a Firmware version for" }, + "firmwareFlasherButtonAutoSelect": { + "message": "Auto-select Target" + }, "firmwareFlasherButtonLoadLocal": { "message": "Load Firmware [Local]" }, diff --git a/js/msp/MSPHelper.js b/js/msp/MSPHelper.js index 950f1132..01b5789d 100644 --- a/js/msp/MSPHelper.js +++ b/js/msp/MSPHelper.js @@ -777,6 +777,18 @@ var mspHelper = (function (gui) { CONFIG.boardIdentifier = identifier; CONFIG.boardVersion = data.getUint16(offset, 1); offset += 2; + if (semver.gt(CONFIG.flightControllerVersion, "4.1.0")) { + CONFIG.osdUsed = data.getUint8(offset++); + CONFIG.commCompatability = data.getUint8(offset++); + let targetNameLen = data.getUint8(offset++); + let targetName = ""; + targetNameLen += offset; + for (offset = offset; offset < targetNameLen; offset++) { + targetName += String.fromCharCode(data.getUint8(offset)); + } + CONFIG.target = targetName; + } + break; case MSPCodes.MSP_SET_CHANNEL_FORWARDING: @@ -3190,6 +3202,15 @@ var mspHelper = (function (gui) { MSP.send_message(MSPCodes.MSP_MOTOR, false, false, callback); }; + self.getTarget = function(callback) { + MSP.send_message(MSPCodes.MSP_FC_VERSION, false, false, function(resp){ + var target = resp.data.readString(); + if (callback) { + callback(target); + } + }); + } + self.getCraftName = function (callback) { MSP.send_message(MSPCodes.MSP_NAME, false, false, function (resp) { var name = resp.data.readString(); @@ -657,7 +657,7 @@ function updateActivatedTab() { function updateFirmwareVersion() { if (CONFIGURATOR.connectionValid) { - $('#logo .firmware_version').text(CONFIG.flightControllerVersion); + $('#logo .firmware_version').text(CONFIG.flightControllerVersion + " [" + CONFIG.target + "]"); } else { $('#logo .firmware_version').text(chrome.i18n.getMessage('fcNotConnected')); } diff --git a/src/css/tabs/firmware_flasher.css b/src/css/tabs/firmware_flasher.css index ec488163..a57bf456 100644 --- a/src/css/tabs/firmware_flasher.css +++ b/src/css/tabs/firmware_flasher.css @@ -49,6 +49,11 @@ -webkit-appearance: none; } +.tab-firmware_flasher .autoselect_description { + margin-left: 10px; + line-height: 25px; +} + /*noinspection ALL*/ .tab-firmware_flasher .info .progress::-webkit-progress-bar { background-color: #4f4f4f; diff --git a/tabs/firmware_flasher.html b/tabs/firmware_flasher.html index e0d4a688..1bbaed9b 100755 --- a/tabs/firmware_flasher.html +++ b/tabs/firmware_flasher.html @@ -8,7 +8,10 @@ <select name="board" id="board_targets"> <option value="0">Loading ...</option> </select></td> - <td><span class="description" i18n="firmwareFlasherOnlineSelectBoardDescription"></span></td> + <td><div class="default_btn narrow"> + <a class="auto_select_target" href="#" i18n="firmwareFlasherButtonAutoSelect"></a> + </div> + <span class="autoselect_description description" i18n="firmwareFlasherOnlineSelectBoardDescription"></span></td> </tr> <tr> <td><select name="firmware_version"> diff --git a/tabs/firmware_flasher.js b/tabs/firmware_flasher.js index 21529e45..485a6753 100755 --- a/tabs/firmware_flasher.js +++ b/tabs/firmware_flasher.js @@ -50,8 +50,17 @@ TABS.firmware_flasher.initialize = function (callback) { }; } - $('input.show_development_releases').click(function(){ + $('input.show_development_releases').click(function() { + let selectedTarget = String($('select[name="board"]').val()); + GUI.log("selected target = " + selectedTarget); buildBoardOptions(); + GUI.log("toggled RCs"); + if (selectedTarget === "0") { + TABS.firmware_flasher.getTarget(); + } else { + $('select[name="board"] option[value=' + selectedTarget + ']').attr("selected", "selected"); + $('select[name="board"]').change(); + } }); $('.target_search').on('input', function(){ @@ -74,10 +83,10 @@ TABS.firmware_flasher.initialize = function (callback) { var buildBoardOptions = function(){ var boards_e = $('select[name="board"]').empty(); + var versions_e = $('select[name="firmware_version"]').empty(); var showDevReleases = ($('input.show_development_releases').is(':checked')); + boards_e.append($("<option value='0'>{0}</option>".format(chrome.i18n.getMessage('firmwareFlasherOptionLabelSelectBoard')))); - - var versions_e = $('select[name="firmware_version"]').empty(); versions_e.append($("<option value='0'>{0}</option>".format(chrome.i18n.getMessage('firmwareFlasherOptionLabelSelectFirmwareVersion')))); var releases = {}; @@ -140,6 +149,7 @@ TABS.firmware_flasher.initialize = function (callback) { releases[result.target].push(descriptor); }); }); + var selectTargets = []; Object.keys(releases) .sort() @@ -158,6 +168,7 @@ TABS.firmware_flasher.initialize = function (callback) { }); }); TABS.firmware_flasher.releases = releases; + return; }; $.get('https://api.github.com/repos/iNavFlight/inav/releases?per_page=10', function (releasesData){ @@ -198,11 +209,15 @@ TABS.firmware_flasher.initialize = function (callback) { } }); + $('a.auto_select_target').removeClass('disabled'); + TABS.firmware_flasher.getTarget(); }).fail(function (data){ if (data["responseJSON"]){ GUI.log("<b>GITHUB Query Failed: <code>{0}</code></b>".format(data["responseJSON"].message)); } - $('select[name="release"]').empty().append('<option value="0">Offline</option>'); + $('select[name="board"]').empty().append('<option value="0">Offline</option>'); + $('select[name="firmware_version"]').empty().append('<option value="0">Offline</option>'); + $('a.auto_select_target').addClass('disabled'); }); $('a.load_file').on('click', function () { @@ -561,6 +576,10 @@ TABS.firmware_flasher.initialize = function (callback) { } }); + $('a.auto_select_target').click(function () { + TABS.firmware_flasher.getTarget(); + }); + GUI.content_ready(callback); }); }; @@ -614,3 +633,133 @@ TABS.firmware_flasher.cleanup = function (callback) { if (callback) callback(); }; + +TABS.firmware_flasher.getTarget = function() { + GUI.log("Attempting automatic target selection"); + + var selected_baud = parseInt($('#baud').val()); + var selected_port = $('#port').find('option:selected').data().isManual ? $('#port-override').val() : String($('#port').val()); + + if (selected_port !== 'DFU') { + if (selected_port == '0') { + GUI.log("Cannot prefetch target: No port"); + } else { + console.log('Connecting to: ' + selected_port); + GUI.connecting_to = selected_port; + + if (selected_port == 'tcp' || selected_port == 'udp') { + CONFIGURATOR.connection.connect($portOverride.val(), {}, TABS.firmware_flasher.onOpen); + } else { + CONFIGURATOR.connection.connect(selected_port, {bitrate: selected_baud}, TABS.firmware_flasher.onOpen); + } + } + } else { + GUI.log("Cannot prefetch target: Flight Controller in DFU"); + } +}; + +TABS.firmware_flasher.onOpen = function(openInfo) { + if (openInfo) { + GUI.connected_to = GUI.connecting_to; + + // reset connecting_to + GUI.connecting_to = false; + + // save selected port with chrome.storage if the port differs + chrome.storage.local.get('last_used_port', function (result) { + if (result.last_used_port) { + if (result.last_used_port != GUI.connected_to) { + // last used port doesn't match the one found in local db, we will store the new one + chrome.storage.local.set({'last_used_port': GUI.connected_to}); + } + } else { + // variable isn't stored yet, saving + chrome.storage.local.set({'last_used_port': GUI.connected_to}); + } + }); + + chrome.storage.local.set({last_used_bps: CONFIGURATOR.connection.bitrate}); + chrome.storage.local.set({wireless_mode_enabled: $('#wireless-mode').is(":checked")}); + + CONFIGURATOR.connection.addOnReceiveListener(read_serial); + + // disconnect after 10 seconds with error if we don't get IDENT data + helper.timeout.add('connecting', function () { + if (!CONFIGURATOR.connectionValid) { + GUI.log("Cannot prefetch target: " + chrome.i18n.getMessage('noConfigurationReceived')); + + TABS.firmware_flasher.closeTempConnection(); + } + }, 10000); + + FC.resetState(); + + // request configuration data. Start with MSPv1 and + // upgrade to MSPv2 if possible. + MSP.protocolVersion = MSP.constants.PROTOCOL_V2; + MSP.send_message(MSPCodes.MSP_API_VERSION, false, false, function () { + + if (CONFIG.apiVersion === "0.0.0") { + GUI_control.prototype.log("Cannot prefetch target: <span style='color: red; font-weight: bolder'><strong>" + chrome.i18n.getMessage("illegalStateRestartRequired") + "</strong></span>"); + FC.restartRequired = true; + return; + } + + MSP.send_message(MSPCodes.MSP_FC_VARIANT, false, false, function () { + if (CONFIG.flightControllerIdentifier == 'INAV') { + MSP.send_message(MSPCodes.MSP_FC_VERSION, false, false, function () { + if (semver.gte(CONFIG.flightControllerVersion, CONFIGURATOR.minfirmwareVersionAccepted) && semver.lt(CONFIG.flightControllerVersion, CONFIGURATOR.maxFirmwareVersionAccepted)) { + if (CONFIGURATOR.connection.type == ConnectionType.BLE && semver.lt(CONFIG.flightControllerVersion, "5.0.0")) { + onBleNotSupported(); + } else { + mspHelper.getCraftName(function(name) { + if (name) { + CONFIG.name = name; + } + TABS.firmware_flasher.onValidFirmware(); + }); + } + } else { + onInvalidFirmwareVersion(); + } + }); + } else { + GUI.log("Cannot prefetch target: Non-INAV Firmware"); + onInvalidFirmwareVariant(); + } + }); + }); + } else { + GUI.log("Cannot prefetch target: " + chrome.i18n.getMessage('serialPortOpenFail')); + return; + } +}; + +TABS.firmware_flasher.onValidFirmware = function() { + MSP.send_message(MSPCodes.MSP_BUILD_INFO, false, false, function () { + MSP.send_message(MSPCodes.MSP_BOARD_INFO, false, false, function () { + $('select[name="board"] option[value=' + CONFIG.target + ']').attr("selected", "selected"); + GUI.log("Target prefetch successful: " + CONFIG.target); + + TABS.firmware_flasher.closeTempConnection(); + $('select[name="board"]').change(); + }); + }); +}; + +TABS.firmware_flasher.closeTempConnection = function() { + helper.timeout.killAll(); + helper.interval.killAll(['global_data_refresh', 'msp-load-update']); + helper.mspBalancedInterval.flush(); + + helper.mspQueue.flush(); + helper.mspQueue.freeHardLock(); + helper.mspQueue.freeSoftLock(); + CONFIGURATOR.connection.emptyOutputBuffer(); + + CONFIGURATOR.connectionValid = false; + GUI.connected_to = false; + + CONFIGURATOR.connection.disconnect(onClosed); + MSP.disconnect_cleanup(); +};
\ No newline at end of file |