diff options
author | Alberto García Hierro <alberto@garciahierro.com> | 2018-08-10 00:30:44 +0300 |
---|---|---|
committer | Alberto García Hierro <alberto@garciahierro.com> | 2018-08-10 00:30:44 +0300 |
commit | 6a7df4372b81bd7c110b91443eb6580ff75adc39 (patch) | |
tree | 2da8e58211badcd97abbf02779e77254d4768095 | |
parent | 0642472960cd9bcb7b427fd84a03cb5958cc2d0f (diff) |
Add support for per-uart options for inversion and full/half duplexagh_port_options
- Removed note about not disabling MSP from the top port, just not
allow the user to do it.
- Add port options as a button in a new column
- Use a modal overlay to select the port options
Version checks test for > 2.0.0, since this should be merged only
for 2.1
-rwxr-xr-x | _locales/en/messages.json | 59 | ||||
-rw-r--r-- | js/msp/MSPHelper.js | 15 | ||||
-rw-r--r-- | src/css/tabs/ports.css | 23 | ||||
-rw-r--r-- | tabs/ports.html | 46 | ||||
-rw-r--r-- | tabs/ports.js | 196 |
5 files changed, 285 insertions, 54 deletions
diff --git a/_locales/en/messages.json b/_locales/en/messages.json index f54b8c73..d11a1761 100755 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -880,10 +880,7 @@ "message": "Until first arm" }, "portsHelp": { - "message": "<strong>Note:</strong> not all combinations are valid. When the flight controller firmware detects this the serial port configuration will be reset." - }, - "portsMSPHelp": { - "message": "<strong>Note:</strong> Do <span style=\"color: red\">NOT</span> disable MSP on the first serial port unless you know what you are doing. You may have to reflash and erase your configuration if you do." + "message": "<strong>Note:</strong> Not all combinations are valid. When the flight controller firmware detects a problem, it might change the serial port configuration." }, "portsFirmwareUpgradeRequired": { "message": "Firmware upgrade <span style=\"color: red\">required</span>. Serial port configurations of firmware < 1.8.0 is not supported." @@ -2602,9 +2599,63 @@ "osdSettingMainVoltageDecimals": { "message": "Main Voltage Decimals" }, + "portColumnIdentifier": { + "message": "Port" + }, + "portColumnMSP": { + "message": "MSP" + }, + "portColumnTelemetry": { + "message": "Telemetry" + }, + "portColumnSerialRX": { + "message": "Serial RX" + }, "portColumnSensors": { "message": "Sensors" }, + "portColumnPeripherals": { + "message": "Peripherals" + }, + "portColumnOptions": { + "message": "Options" + }, + "portOptionsTitle": { + "message": "$1 Options" + }, + "portOptionsSerialInversion": { + "message": "Serial Inversion:" + }, + "portOptionAuto": { + "message": "Auto" + }, + "portOptionNotInverted": { + "message": "Not Inverted" + }, + "portOptionNotInvertedAbbr": { + "message": "NI" + }, + "portOptionInverted": { + "message": "Inverted" + }, + "portOptionInvertedAbbr": { + "message": "I" + }, + "portOptionsFullHalfDuplex": { + "message": "Full/Half Duplex:" + }, + "portOptionFullDuplex": { + "message": "Full Duplex" + }, + "portOptionFullDuplexAbbr": { + "message": "FD" + }, + "portOptionHalfDuplex": { + "message": "Half Duplex" + }, + "portOptionHalfDuplexAbbr": { + "message": "HD" + }, "appUpdateNotificationHeader": { "message": "New Configurator version available." }, diff --git a/js/msp/MSPHelper.js b/js/msp/MSPHelper.js index 363630c1..ab33caf5 100644 --- a/js/msp/MSPHelper.js +++ b/js/msp/MSPHelper.js @@ -746,18 +746,26 @@ var mspHelper = (function (gui) { case MSPCodes.MSP_CF_SERIAL_CONFIG: SERIAL_CONFIG.ports = []; var bytesPerPort = 1 + 2 + 4; + if (semver.gt(CONFIG.flightControllerVersion, "2.0.0")) { + bytesPerPort += 1; + } var serialPortCount = data.byteLength / bytesPerPort; for (i = 0; i < serialPortCount; i++) { var BAUD_RATES = (semver.gte(CONFIG.flightControllerVersion, "1.6.3")) ? mspHelper.BAUD_RATES_post1_6_3 : mspHelper.BAUD_RATES_pre1_6_3; + var options = 0; + if (semver.gt(CONFIG.flightControllerVersion, "2.0.0")) { + options = data.getUint8(offset + 7); + } var serialPort = { identifier: data.getUint8(offset), functions: mspHelper.serialPortFunctionMaskToFunctions(data.getUint16(offset + 1, true)), msp_baudrate: BAUD_RATES[data.getUint8(offset + 3)], sensors_baudrate: BAUD_RATES[data.getUint8(offset + 4)], telemetry_baudrate: BAUD_RATES[data.getUint8(offset + 5)], - blackbox_baudrate: BAUD_RATES[data.getUint8(offset + 6)] + peripheral_baudrate: BAUD_RATES[data.getUint8(offset + 6)], + options: options, }; offset += bytesPerPort; @@ -1710,7 +1718,10 @@ var mspHelper = (function (gui) { buffer.push(BAUD_RATES.indexOf(serialPort.msp_baudrate)); buffer.push(BAUD_RATES.indexOf(serialPort.sensors_baudrate)); buffer.push(BAUD_RATES.indexOf(serialPort.telemetry_baudrate)); - buffer.push(BAUD_RATES.indexOf(serialPort.blackbox_baudrate)); + buffer.push(BAUD_RATES.indexOf(serialPort.peripheral_baudrate)); + if (semver.gt(CONFIG.flightControllerVersion, "2.0.0")) { + buffer.push(serialPort.options); + } } break; diff --git a/src/css/tabs/ports.css b/src/css/tabs/ports.css index ab40e07a..2359be2f 100644 --- a/src/css/tabs/ports.css +++ b/src/css/tabs/ports.css @@ -90,6 +90,29 @@ border-right: 0px; } +.tab-ports .functionsCell-options a { + background-color: #37a8db; + border-radius: 3px; + border: 1px solid #3394b5; + color: #fff; + padding: 1px 5px; +} + +#tab-ports-options-modal .port-option { + margin: 15px 15px 0; +} + +#tab-ports-options-modal .port-option span { + display: inline-block; + width: 150px; +} + +#tab-ports-options-modal .port-option select { + font-size: 100%; + display: inline-block; + width: 100px; +} + @media only screen and (max-width: 1055px) , only screen and (max-device-width: 1055px) { .tab-ports table thead tr:first-child { font-size: 12px; diff --git a/tabs/ports.html b/tabs/ports.html index 75bf8a7b..941ee1c3 100644 --- a/tabs/ports.html +++ b/tabs/ports.html @@ -9,18 +9,18 @@ <div class="note spacebottom"> <div class="note_spacer"> <p data-i18n="portsHelp"></p> - <p data-i18n="portsMSPHelp"></p> </div> </div> <table class="ports spacebottom"> <thead> <tr> - <td>Identifier</td> - <td>Data</td> - <td>Telemetry</td> - <td>RX</td> + <td data-i18n="portColumnIdentifier"></td> + <td data-i18n="portColumnMSP">MSP</td> + <td data-i18n="portColumnTelemetry"></td> + <td data-i18n="portColumnSerialRX"></td> <td data-i18n="portColumnSensors"></td> - <td class='peripherls-column'>Peripherals</td> + <td data-i18n="portColumnPeripherals" class="peripherls-column"></td> + <td data-i18n="portColumnOptions"></td> </tr> </thead> <tbody> @@ -49,20 +49,36 @@ <td class="identifierCell"> <p class="identifier"></p> </td> - <td class="functionsCell-data"><select class="msp_baudrate"> + <td class="functionsCell-msp"> + <input type="checkbox" value="MSP" class="togglemedium msp_enabled" /> + <select class="msp_baudrate"> <!-- list generated here --> - </select></td> - <td class="functionsCell-telemetry"><select class="telemetry_baudrate"> + </select> + </td> + <td class="functionsCell-telemetry"> + <select class="telemetry_baudrate"> <!-- list generated here --> - </select></td> - <td class="functionsCell-rx"></td> - <td class="functionsCell-sensors"><select class="sensors_baudrate"> + </select> + </td> + <td class="functionsCell-rx"> + <input type="checkbox" value="RX_SERIAL" class="togglemedium rx_serial_enabled" /> + </td> + <td class="functionsCell-sensors"> + <select class="sensors_baudrate"> <!-- list generated here --> - </select></td> - <td class="functionsCell-peripherals"><select class="blackbox_baudrate"> + </select> + </td> + <td class="functionsCell-peripherals"> + <select class="peripheral_baudrate"> <!-- list generated here --> - </select></td> + </select> + </td> + <td class="functionsCell-options"> + <a class="options" href="#"></a> + </td> </tr> </tbody> </table> </div> +<div id="tab-ports-options-modal"> +</div> diff --git a/tabs/ports.js b/tabs/ports.js index 4b348a81..3cf140ae 100644 --- a/tabs/ports.js +++ b/tabs/ports.js @@ -99,7 +99,7 @@ TABS.ports.initialize = function (callback) { '115200' ]; - var blackboxBaudRates = [ + var peripheralBaudRates = [ '19200', '38400', '57600', @@ -108,7 +108,40 @@ TABS.ports.initialize = function (callback) { '250000' ]; - var columns = ['data', 'logging', 'sensors', 'telemetry', 'rx', 'peripherals']; + var portOptions = [ + { + title: 'portOptionsSerialInversion', + entries: [ + { + title: 'portOptionNotInverted', + abbr: 'portOptionNotInvertedAbbr', + bit: 0, + }, + { + title: 'portOptionInverted', + abbr: 'portOptionInvertedAbbr', + bit: 1, + }, + ] + }, + { + title: 'portOptionsFullHalfDuplex', + entries: [ + { + title: 'portOptionFullDuplex', + abbr: 'portOptionFullDuplexAbbr', + bit: 2, + }, + { + title: 'portOptionHalfDuplex', + abbr: 'portOptionHalfDuplexAbbr', + bit: 3, + }, + ] + }, + ]; + + var columns = ['telemetry', 'sensors', 'peripherals']; if (GUI.active_tab != 'ports') { GUI.active_tab = 'ports'; @@ -129,6 +162,101 @@ TABS.ports.initialize = function (callback) { function update_ui() { + function getPortName(serialPort) { + return portIdentifierToNameMapping[serialPort.identifier]; + } + + function updatePortOptionsDescription(serialPort, element) { + var titles = []; + var abbrs = []; + for (var ii = 0; ii < portOptions.length; ii++) { + for (var jj = 0; jj < portOptions[ii].entries.length; jj++) { + var opt = portOptions[ii].entries[jj]; + if (serialPort.options & (1 << opt.bit)) { + titles.push(chrome.i18n.getMessage(opt.title)); + abbrs.push(chrome.i18n.getMessage(opt.abbr)); + break; + } + } + } + var text; + var title; + if (abbrs.length > 0) { + text = abbrs.join(', '); + title = titles.join(', '); + } else { + text = chrome.i18n.getMessage('portOptionAuto'); + title = ''; + } + element.text(text); + element.attr('title', title); + } + + function updatePortOptionsSelect(serialPort, selects) { + selects.find('option').prop('selected', false); + selects.find('option:first').prop('selected', true); + selects.find('option').each(function() { + var bit = $(this).data('bit'); + if (bit !== undefined) { + if (serialPort.options & (1 << bit)) { + $(this).prop('selected', true); + } + } + }); + } + + var portOptionsContent = $('#tab-ports-options-modal'); + for (var ii = 0; ii < portOptions.length; ii++) { + var option = $('<h3>').addClass('port-option'); + $('<span>').text(chrome.i18n.getMessage(portOptions[ii].title)).appendTo(option); + var select = $('<select>').appendTo(option); + $('<option>').text(chrome.i18n.getMessage('portOptionAuto')).appendTo(select); + for (var jj = 0; jj < portOptions[ii].entries.length; jj++) { + var opt = portOptions[ii].entries[jj]; + $('<option>').text(chrome.i18n.getMessage(opt.title)).data('bit', opt.bit).appendTo(select); + } + option.appendTo(portOptionsContent); + } + var portOptionsSelects = portOptionsContent.find('select'); + + function showPortOptions(serialPort, portIndex) { + return function() { + var anchor = $(this); + updatePortOptionsSelect(serialPort, portOptionsSelects); + portOptionsSelects.prop('disabled', serialPort.options == 0 && portIndex == 0); + portOptionsSelects.on('change', function() { + var mask = 0; + var set = 0; + var select = $(this); + select.find('option').each(function() { + var option = $(this); + var bit = option.data('bit'); + if (bit !== undefined) { + mask |= 1 << bit; + if (option.prop('selected')) { + set |= 1 << bit; + } + } + serialPort.options &= ~mask; + serialPort.options |= set; + }); + updatePortOptionsDescription(serialPort, anchor); + }); + var jbox = new jBox('Modal', { + width: 280, + height: 100, + closeButton: 'title', + animation: false, + title: chrome.i18n.getMessage('portOptionsTitle', [getPortName(serialPort)]), + content: portOptionsContent, + onClose: function() { + portOptionsSelects.off('change') + } + }); + jbox.open(); + } + } + $(".tab-ports").addClass("supported"); var portIdentifierToNameMapping = { @@ -164,9 +292,9 @@ TABS.ports.initialize = function (callback) { $elements.append('<option value="' + telemetryBaudRates[i] + '">' + telemetryBaudRates[i] + '</option>'); } - $elements = $('select.blackbox_baudrate'); - for (i = 0; i < blackboxBaudRates.length; i++) { - $elements.append('<option value="' + blackboxBaudRates[i] + '">' + blackboxBaudRates[i] + '</option>'); + $elements = $('select.peripheral_baudrate'); + for (i = 0; i < peripheralBaudRates.length; i++) { + $elements.append('<option value="' + peripheralBaudRates[i] + '">' + peripheralBaudRates[i] + '</option>'); } var ports_e = $('.tab-ports .ports'); @@ -181,13 +309,27 @@ TABS.ports.initialize = function (callback) { port_configuration_e.find('select.msp_baudrate').val(serialPort.msp_baudrate); port_configuration_e.find('select.telemetry_baudrate').val(serialPort.telemetry_baudrate); port_configuration_e.find('select.sensors_baudrate').val(serialPort.sensors_baudrate); - port_configuration_e.find('select.blackbox_baudrate').val(serialPort.blackbox_baudrate); + port_configuration_e.find('select.peripheral_baudrate').val(serialPort.peripheral_baudrate); - port_configuration_e.find('.identifier').text(portIdentifierToNameMapping[serialPort.identifier]); + port_configuration_e.find('.identifier').text(getPortName(serialPort)); port_configuration_e.data('index', portIndex); port_configuration_e.data('port', serialPort); + var optionsAnchor = port_configuration_e.find('.options'); + optionsAnchor.click(showPortOptions(serialPort, portIndex)); + updatePortOptionsDescription(serialPort, optionsAnchor); + + if (serialPort.functions.indexOf('MSP') >= 0) { + port_configuration_e.find('.msp_enabled').prop('checked', true); + if (portIndex == 0) { + port_configuration_e.find('.msp_enabled').prop('disabled', true); + } + } + + if (serialPort.functions.indexOf('RX_SERIAL') >= 0) { + port_configuration_e.find('.rx_serial_enabled').prop('checked', true); + } for (var columnIndex = 0; columnIndex < columns.length; columnIndex++) { var column = columns[columnIndex]; @@ -202,33 +344,20 @@ TABS.ports.initialize = function (callback) { continue; } - var select_e; - if (column !== 'telemetry' && column !== 'peripherals' && column !== 'sensors') { - var checkboxId = 'functionCheckbox-' + portIndex + '-' + columnIndex + '-' + i; - functions_e.prepend('<span class="function"><input type="checkbox" class="togglemedium" id="' + checkboxId + '" value="' + functionName + '" /><label for="' + checkboxId + '"> ' + functionRule.displayName + '</label></span>'); - - if (serialPort.functions.indexOf(functionName) >= 0) { - var checkbox_e = functions_e.find('#' + checkboxId); - checkbox_e.prop("checked", true); - } - - } else { + var selectElementName = 'function-' + column; + var selectElementSelector = 'select[name=' + selectElementName + ']'; + var select_e = functions_e.find(selectElementSelector); - var selectElementName = 'function-' + column; - var selectElementSelector = 'select[name=' + selectElementName + ']'; + if (select_e.size() == 0) { + functions_e.prepend('<span class="function"><select name="' + selectElementName + '" /></span>'); select_e = functions_e.find(selectElementSelector); + var disabledText = chrome.i18n.getMessage('portsTelemetryDisabled'); + select_e.append('<option value="">' + disabledText + '</option>'); + } + select_e.append('<option value="' + functionName + '">' + functionRule.displayName + '</option>'); - if (select_e.size() == 0) { - functions_e.prepend('<span class="function"><select name="' + selectElementName + '" /></span>'); - select_e = functions_e.find(selectElementSelector); - var disabledText = chrome.i18n.getMessage('portsTelemetryDisabled'); - select_e.append('<option value="">' + disabledText + '</option>'); - } - select_e.append('<option value="' + functionName + '">' + functionRule.displayName + '</option>'); - - if (serialPort.functions.indexOf(functionName) >= 0) { - select_e.val(functionName); - } + if (serialPort.functions.indexOf(functionName) >= 0) { + select_e.val(functionName); } } } @@ -287,8 +416,9 @@ TABS.ports.initialize = function (callback) { msp_baudrate: $(portConfiguration_e).find('.msp_baudrate').val(), telemetry_baudrate: $(portConfiguration_e).find('.telemetry_baudrate').val(), sensors_baudrate: $(portConfiguration_e).find('.sensors_baudrate').val(), - blackbox_baudrate: $(portConfiguration_e).find('.blackbox_baudrate').val(), - identifier: oldSerialPort.identifier + peripheral_baudrate: $(portConfiguration_e).find('.peripheral_baudrate').val(), + identifier: oldSerialPort.identifier, + options: oldSerialPort.options, }; SERIAL_CONFIG.ports.push(serialPort); }); |