Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/iNavFlight/inav-configurator.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlberto García Hierro <alberto@garciahierro.com>2018-08-10 00:30:44 +0300
committerAlberto García Hierro <alberto@garciahierro.com>2018-08-10 00:30:44 +0300
commit6a7df4372b81bd7c110b91443eb6580ff75adc39 (patch)
tree2da8e58211badcd97abbf02779e77254d4768095
parent0642472960cd9bcb7b427fd84a03cb5958cc2d0f (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.json59
-rw-r--r--js/msp/MSPHelper.js15
-rw-r--r--src/css/tabs/ports.css23
-rw-r--r--tabs/ports.html46
-rw-r--r--tabs/ports.js196
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 &lt; 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);
});