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 @@
-
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 = $('