diff --git a/_locales/en/messages.json b/_locales/en/messages.json index 4f2e40d9..f9006afb 100755 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -850,7 +850,7 @@ "message": "External PWM servo driver" }, "featurePWM_SERVO_DRIVERTip": { - "message": "Use external PCA9685 PMW driver to connect up to 16 servos to flight controller. PCA9685 has to be connected to enable this feature." + "message": "Use external PCA9685 PWM driver to connect up to 16 servos to flight controller. PCA9685 has to be connected to enable this feature." }, "featureRSSI_ADCTip": { "message": "RSSI is a measurement of signal strength and is very handy so you know when your aircraft is going out of range or if it is suffering RF interference." @@ -3503,6 +3503,12 @@ "osd_hud_settings": { "message": "Heads up Display settings" }, + "osd_custom_element_settings": { + "message": "Custom OSD elements" + }, + "custom_element": { + "message": "Custom element" + }, "osd_hud_settings_HELP": { "message": "This section allows tweaking the behavior of HUD elements." }, diff --git a/js/fc.js b/js/fc.js index a11e4b7b..bb95b325 100644 --- a/js/fc.js +++ b/js/fc.js @@ -66,7 +66,9 @@ var CONFIG, CURRENT_METER_CONFIG, FEATURES, RATE_DYNAMICS, - FW_APPROACH; + FW_APPROACH, + OSD_CUSTOM_ELEMENTS; + var FC = { restartRequired: false, @@ -566,7 +568,14 @@ var FC = { expo: null }; + FW_APPROACH = new FwApproachCollection(); + + OSD_CUSTOM_ELEMENTS = { + settings: {customElementsCount: 0, customElementTextSize: 0}, + items: [], + }; + }, getOutputUsages: function() { return { diff --git a/js/msp/MSPCodes.js b/js/msp/MSPCodes.js index 9982688f..f1746c8f 100644 --- a/js/msp/MSPCodes.js +++ b/js/msp/MSPCodes.js @@ -249,8 +249,13 @@ var MSPCodes = { MSP2_INAV_EZ_TUNE_SET: 0x2071, MSP2_INAV_SELECT_MIXER_PROFILE: 0x2080, + MSP2_INAV_SET_LED_STRIP_CONFIG_EX: 0x2049, MSP2_INAV_FW_APPROACH: 0x204A, MSP2_INAV_SET_FW_APPROACH: 0x204B + + MSP2_INAV_CUSTOM_OSD_ELEMENTS: 0x2100, + MSP2_INAV_SET_CUSTOM_OSD_ELEMENTS: 0x2101, + }; diff --git a/js/msp/MSPHelper.js b/js/msp/MSPHelper.js index 6778431c..2825b138 100644 --- a/js/msp/MSPHelper.js +++ b/js/msp/MSPHelper.js @@ -90,7 +90,7 @@ var mspHelper = (function (gui) { CONFIG.armingFlags = data.getUint32(offset, true); offset += 4; - + //As there are 8 bytes for mspBoxModeFlags (number of bytes is actually variable) //read mixer profile as the last byte in the the message profile_byte = data.getUint8(dataHandler.message_length_expected - 1); @@ -1500,6 +1500,9 @@ var mspHelper = (function (gui) { case MSPCodes.MSP2_INAV_SELECT_BATTERY_PROFILE: console.log('Battery profile selected'); break; + case MSPCodes.MSP2_INAV_SET_CUSTOM_OSD_ELEMENTS: + console.log('OSD custom elements preferences saved'); + break; case MSPCodes.MSPV2_INAV_OUTPUT_MAPPING: OUTPUT_MAPPING.flush(); for (i = 0; i < data.byteLength; ++i) @@ -1627,6 +1630,48 @@ var mspHelper = (function (gui) { console.log('EzTune settings saved'); break; + case MSPCodes.MSP2_INAV_CUSTOM_OSD_ELEMENTS: + OSD_CUSTOM_ELEMENTS.items = []; + + var index = 0; + + OSD_CUSTOM_ELEMENTS.settings.customElementsCount = data.getUint8(index++); + OSD_CUSTOM_ELEMENTS.settings.customElementTextSize = data.getUint8(index++); + + for (i = 0; i < OSD_CUSTOM_ELEMENTS.settings.customElementsCount; i++){ + var customElement = { + customElementItems: [], + customElementVisibility: {type: 0, value: 0}, + customElementText: [], + }; + + for (let ii = 0; ii < OSD_CUSTOM_ELEMENTS.settings.customElementsCount; ii++){ + var customElementPart = {type: 0, value: 0,}; + customElementPart.type = data.getUint8(index++); + customElementPart.value = data.getUint16(index, true); + index += 2; + customElement.customElementItems.push(customElementPart); + } + + customElement.customElementVisibility.type = data.getUint8(index++); + customElement.customElementVisibility.value = data.getUint16(index, true); + index += 2; + + for (let ii = 0; ii < OSD_CUSTOM_ELEMENTS.settings.customElementTextSize; ii++){ + var char = data.getUint8(index++); + if(char === 0){ + index += (OSD_CUSTOM_ELEMENTS.settings.customElementTextSize - 1) - ii; + break; + } + customElement.customElementText[ii] = char; + } + + customElement.customElementText = String.fromCharCode(...customElement.customElementText); + + OSD_CUSTOM_ELEMENTS.items.push(customElement) + } + break; + default: console.log('Unknown code detected: ' + dataHandler.code); } else { @@ -2571,6 +2616,10 @@ var mspHelper = (function (gui) { } }; + self.loadOsdCustomElements = function (callback) { + MSP.send_message(MSPCodes.MSP2_INAV_CUSTOM_OSD_ELEMENTS, false, false, callback); + } + self.sendModeRanges = function (onCompleteCallback) { var nextFunction = send_next_mode_range; @@ -2948,7 +2997,7 @@ var mspHelper = (function (gui) { MSP.send_message(MSPCodes.MSP2_INAV_TIMER_OUTPUT_MODE, false, false, callback); } - self.sendTimerOutputModes = function(onCompleteCallback) { + self.sendTimerOutputModes = function(callback) { var nextFunction = send_next_output_mode; var idIndex = 0; @@ -2973,7 +3022,7 @@ var mspHelper = (function (gui) { // prepare for next iteration idIndex++; if (idIndex == overrideIds.length) { - nextFunction = onCompleteCallback; + nextFunction = callback; } MSP.send_message(MSPCodes.MSP2_INAV_SET_TIMER_OUTPUT_MODE, buffer, false, nextFunction); @@ -3366,12 +3415,6 @@ var mspHelper = (function (gui) { self.encodeSetting = function (name, value) { return this._getSetting(name).then(function (setting) { - - if (!setting) { - console.log("Setting invalid: " + name); - return null; - } - if (setting.table && !Number.isInteger(value)) { var found = false; for (var ii = 0; ii < setting.table.values.length; ii++) { @@ -3419,11 +3462,7 @@ var mspHelper = (function (gui) { self.setSetting = function (name, value, callback) { this.encodeSetting(name, value).then(function (data) { - if (data) { - return MSP.promise(MSPCodes.MSPV2_SET_SETTING, data).then(callback); - } else { - return Promise.resolve().then(callback); - } + return MSP.promise(MSPCodes.MSPV2_SET_SETTING, data).then(callback); }); }; diff --git a/src/css/tabs/osd.css b/src/css/tabs/osd.css index b565865e..cebffd63 100644 --- a/src/css/tabs/osd.css +++ b/src/css/tabs/osd.css @@ -719,4 +719,18 @@ button { .tab-osd .osd_settings .switchery, .tab-osd .unit_wrapper { vertical-align: top; +} + +.osdCustomElement_main_table { + width: 100%; + table-layout: fixed; + max-width: 400px; +} + +.osdCustomElement_main_table td{ + max-width: 80px; +} + +.osdCustomElement_main_table select, .osdCustomElement_main_table input{ + width: 100% !important; } \ No newline at end of file diff --git a/tabs/osd.html b/tabs/osd.html index 99d215b5..062a56ea 100644 --- a/tabs/osd.html +++ b/tabs/osd.html @@ -316,7 +316,17 @@ -
+ + +
+
+
+
+
+
+ + +
@@ -425,6 +435,12 @@
+
diff --git a/tabs/osd.js b/tabs/osd.js index 95393953..4fc1cd56 100644 --- a/tabs/osd.js +++ b/tabs/osd.js @@ -340,7 +340,7 @@ FONT.preview = function ($el) { $el.empty(); for (var i = 1; i <= SYM.LAST_CHAR; i++) { var url = FONT.data.character_image_urls[i]; - $el.append(' '); + $el.append(' '); } }; @@ -1832,7 +1832,28 @@ OSD.constants = { id: 116, positionable: true, preview: 'G3:30126' - } + }, + { + name: 'CUSTOM ELEMENT 1', + id: 147, + min_version: '7.1.0', + positionable: true, + preview: "CE_1", + }, + { + name: 'CUSTOM ELEMENT 2', + id: 148, + min_version: '7.1.0', + positionable: true, + preview: "CE_2", + }, + { + name: 'CUSTOM ELEMENT 3', + id: 149, + min_version: '7.1.0', + positionable: true, + preview: "CE_3", + }, ] }, { @@ -2125,6 +2146,8 @@ OSD.reload = function(callback) { }); }); }); + + MSP.send_message(MSPCodes.MSP2_INAV_CUSTOM_OSD_ELEMENTS); }; OSD.updateSelectedLayout = function(new_layout) { @@ -3360,9 +3383,261 @@ TABS.osd.initialize = function (callback) { usePitot = (SENSOR_CONFIG.pitot != 0); GUI.content_ready(callback); }); + + mspHelper.loadOsdCustomElements(createCustomElements); })); }; +function createCustomElements(){ + if(OSD_CUSTOM_ELEMENTS.settings.customElementsCount == 0){ + $('.custom-element-container').remove(); + } + + var customElementsContainer = $('#osdCustomElements'); + + for(var i = 0; i < OSD_CUSTOM_ELEMENTS.settings.customElementsCount; i++){ + var label = $('