diff --git a/js/fc.js b/js/fc.js
index d118b9d78..fd4b28a56 100644
--- a/js/fc.js
+++ b/js/fc.js
@@ -599,7 +599,7 @@ var FC = {
this.FW_APPROACH = new FwApproachCollection();
this.OSD_CUSTOM_ELEMENTS = {
- settings: {customElementsCount: 0, customElementTextSize: 0},
+ settings: {customElementsCount: 0, customElementTextSize: 0, customElementParts: 0},
items: [],
};
diff --git a/js/msp/MSPCodes.js b/js/msp/MSPCodes.js
index abe54465b..4c36142d4 100644
--- a/js/msp/MSPCodes.js
+++ b/js/msp/MSPCodes.js
@@ -238,7 +238,8 @@ var MSPCodes = {
MSP2_ADSB_VEHICLE_LIST: 0x2090,
MSP2_INAV_CUSTOM_OSD_ELEMENTS: 0x2100,
- MSP2_INAV_SET_CUSTOM_OSD_ELEMENTS: 0x2101,
+ MSP2_INAV_CUSTOM_OSD_ELEMENT: 0x2101,
+ MSP2_INAV_SET_CUSTOM_OSD_ELEMENTS: 0x2102,
MSP2_INAV_SERVO_CONFIG: 0x2200,
MSP2_INAV_SET_SERVO_CONFIG: 0x2201,
diff --git a/js/msp/MSPHelper.js b/js/msp/MSPHelper.js
index be92c1284..8972f26e1 100644
--- a/js/msp/MSPHelper.js
+++ b/js/msp/MSPHelper.js
@@ -1544,51 +1544,54 @@ var mspHelper = (function () {
break;
case MSPCodes.MSP2_INAV_CUSTOM_OSD_ELEMENTS:
- FC.OSD_CUSTOM_ELEMENTS .items = [];
+ FC.OSD_CUSTOM_ELEMENTS.items = [];
- var index = 0;
+ let settingsIdx = 0;
- if(data.byteLength == 0){
- FC.OSD_CUSTOM_ELEMENTS .settings.customElementsCount = 0;
- FC.OSD_CUSTOM_ELEMENTS .settings.customElementTextSize = 0;
+ if(data.byteLength == 0) {
+ FC.OSD_CUSTOM_ELEMENTS.settings.customElementsCount = 0;
+ FC.OSD_CUSTOM_ELEMENTS.settings.customElementTextSize = 0;
+ FC.OSD_CUSTOM_ELEMENTS.settings.customElementParts = 0;
return;
}
- FC.OSD_CUSTOM_ELEMENTS .settings.customElementsCount = data.getUint8(index++);
- FC.OSD_CUSTOM_ELEMENTS .settings.customElementTextSize = data.getUint8(index++);
-
- for (i = 0; i < FC.OSD_CUSTOM_ELEMENTS .settings.customElementsCount; i++){
- var customElement = {
- customElementItems: [],
- customElementVisibility: {type: 0, value: 0},
- customElementText: [],
- };
+ FC.OSD_CUSTOM_ELEMENTS.settings.customElementsCount = data.getUint8(settingsIdx++);
+ FC.OSD_CUSTOM_ELEMENTS.settings.customElementTextSize = data.getUint8(settingsIdx++);
+ FC.OSD_CUSTOM_ELEMENTS.settings.customElementParts = data.getUint8(settingsIdx++);
+ break;
+ case MSPCodes.MSP2_INAV_CUSTOM_OSD_ELEMENT:
+ var customElement = {
+ customElementItems: [],
+ customElementVisibility: {type: 0, value: 0},
+ customElementText: [],
+ };
- for (let ii = 0; ii < FC.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);
- }
+ let index = 0;
- customElement.customElementVisibility.type = data.getUint8(index++);
- customElement.customElementVisibility.value = data.getUint16(index, true);
+ for (let ii = 0; ii < FC.OSD_CUSTOM_ELEMENTS.settings.customElementParts; ii++) {
+ var customElementPart = {type: 0, value: 0,};
+ customElementPart.type = data.getUint8(index++);
+ customElementPart.value = data.getUint16(index, true);
index += 2;
+ customElement.customElementItems.push(customElementPart);
+ }
- for (let ii = 0; ii < FC.OSD_CUSTOM_ELEMENTS .settings.customElementTextSize; ii++){
- var char = data.getUint8(index++);
- if(char === 0){
- index += (FC.OSD_CUSTOM_ELEMENTS .settings.customElementTextSize - 1) - ii;
- break;
- }
- customElement.customElementText[ii] = char;
+ customElement.customElementVisibility.type = data.getUint8(index++);
+ customElement.customElementVisibility.value = data.getUint16(index, true);
+ index += 2;
+
+ for (let ii = 0; ii < FC.OSD_CUSTOM_ELEMENTS.settings.customElementTextSize; ii++) {
+ var char = data.getUint8(index++);
+ if(char === 0) {
+ index += (FC.OSD_CUSTOM_ELEMENTS.settings.customElementTextSize - 1) - ii;
+ break;
}
+ customElement.customElementText[ii] = char;
+ }
- customElement.customElementText = String.fromCharCode(...customElement.customElementText);
+ customElement.customElementText = String.fromCharCode(...customElement.customElementText);
- FC.OSD_CUSTOM_ELEMENTS .items.push(customElement)
- }
+ FC.OSD_CUSTOM_ELEMENTS.items.push(customElement);
break;
case MSPCodes.MSP2_INAV_GPS_UBLOX_COMMAND:
// Just and ACK from the fc.
@@ -2475,7 +2478,17 @@ var mspHelper = (function () {
};
self.loadOsdCustomElements = function (callback) {
- MSP.send_message(MSPCodes.MSP2_INAV_CUSTOM_OSD_ELEMENTS, false, false, callback);
+ MSP.send_message(MSPCodes.MSP2_INAV_CUSTOM_OSD_ELEMENTS, false, false, nextCustomOSDElement);
+
+ var cosdeIdx = 0;
+
+ function nextCustomOSDElement() {
+ if (cosdeIdx < FC.OSD_CUSTOM_ELEMENTS .settings.customElementsCount - 1) {
+ MSP.send_message(MSPCodes.MSP2_INAV_CUSTOM_OSD_ELEMENT, [cosdeIdx++], false, nextCustomOSDElement);
+ } else {
+ MSP.send_message(MSPCodes.MSP2_INAV_CUSTOM_OSD_ELEMENT, [cosdeIdx++], false, callback);
+ }
+ }
}
self.sendModeRanges = function (onCompleteCallback) {
diff --git a/locale/en/messages.json b/locale/en/messages.json
index 203508594..2e2b4550f 100644
--- a/locale/en/messages.json
+++ b/locale/en/messages.json
@@ -3628,6 +3628,9 @@
"osd_custom_element_settings": {
"message": "Custom OSD elements"
},
+ "osd_custom_element_settings_HELP": {
+ "message": "You can find the icon numbers by clicking this help button."
+ },
"custom_element": {
"message": "Custom element"
},
@@ -4243,6 +4246,9 @@
"osdPanServoOffcentreWarning_HELP": {
"message": "Degrees either side of the pan servo centre; where it is assumed camera is wanted to be facing forwards, but isn't at 0. If in this range and not 0 for longer than 10 seconds, the pan servo offset OSD element will blink. 0 means the warning is disabled."
},
+ "osdGroupOSDCustomElements": {
+ "message": "OSD Custom Elements"
+ },
"osdGroupGVars": {
"message": "Global Variables"
},
@@ -4333,6 +4339,9 @@
"osd_switch_indicator_settings": {
"message": "Switch Indicator Settings"
},
+ "osd_switch_indicator_settings_HELP": {
+ "message": "It is recommended to use the Custom OSD Elements as a replacemtent for switch indicators. They are much more powerful. Click to see an example."
+ },
"osd_switch_indicators_align_left": {
"message": "Align switch names to left of switches"
},
diff --git a/tabs/osd.html b/tabs/osd.html
index 8488bfbd4..dbf20bdef 100644
--- a/tabs/osd.html
+++ b/tabs/osd.html
@@ -301,8 +301,10 @@
diff --git a/tabs/osd.js b/tabs/osd.js
index 00d920821..bfc8ce39b 100644
--- a/tabs/osd.js
+++ b/tabs/osd.js
@@ -19,6 +19,7 @@ const { globalSettings } = require('./../js/globalSettings');
const { PortHandler } = require('./../js/port_handler');
const i18n = require('./../js/localization');
const jBox = require('./../js/libraries/jBox/jBox.min');
+const { Console } = require('console');
var SYM = SYM || {};
@@ -554,6 +555,7 @@ OSD.DjiElements = {
"VTX",
"CRSF",
"SwitchIndicators",
+ "OSDCustomElements",
"GVars",
"PIDs",
"PIDOutputs",
@@ -1877,6 +1879,67 @@ OSD.constants = {
}
]
},
+ {
+ name: 'osdGroupOSDCustomElements',
+ items: [
+ {
+ 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",
+ },
+ {
+ name: 'CUSTOM_ELEMENT_4',
+ id: 154,
+ min_version: '8.0.0',
+ positionable: true,
+ preview: "CE_4",
+ },
+ {
+ name: 'CUSTOM_ELEMENT_5',
+ id: 155,
+ min_version: '8.0.0',
+ positionable: true,
+ preview: "CE_5",
+ },
+ {
+ name: 'CUSTOM_ELEMENT_6',
+ id: 156,
+ min_version: '8.0.0',
+ positionable: true,
+ preview: "CE_6",
+ },
+ {
+ name: 'CUSTOM_ELEMENT_7',
+ id: 157,
+ min_version: '8.0.0',
+ positionable: true,
+ preview: "CE_7",
+ },
+ {
+ name: 'CUSTOM_ELEMENT_8',
+ id: 158,
+ min_version: '8.0.0',
+ positionable: true,
+ preview: "CE_8",
+ },
+ ]
+ },
{
name: 'osdGroupGVars',
items: [
@@ -1903,27 +1966,6 @@ 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",
}
]
},
@@ -2953,176 +2995,178 @@ OSD.GUI.updatePreviews = function() {
// buffer the preview;
OSD.data.preview = [];
- // clear the buffer
- for (let i = 0; i < OSD.data.display_size.total; i++) {
- OSD.data.preview.push([null, ' '.charCodeAt(0)]);
- };
+ if (OSD.data.display_size != undefined) {
+ // clear the buffer
+ for (let i = 0; i < OSD.data.display_size.total; i++) {
+ OSD.data.preview.push([null, ' '.charCodeAt(0)]);
+ };
- // draw all the displayed items and the drag and drop preview images
- for (var ii = 0; ii < OSD.data.items.length; ii++) {
- var item = OSD.get_item(ii);
- if (!item || !OSD.is_item_displayed(item, OSD.data.groups[item.id])) {
- continue;
- }
- var itemData = OSD.data.items[ii];
- if (!itemData.isVisible) {
- continue;
- }
+ // draw all the displayed items and the drag and drop preview images
+ for (var ii = 0; ii < OSD.data.items.length; ii++) {
+ var item = OSD.get_item(ii);
+ if (!item || !OSD.is_item_displayed(item, OSD.data.groups[item.id])) {
+ continue;
+ }
+ var itemData = OSD.data.items[ii];
+ if (!itemData.isVisible) {
+ continue;
+ }
- if (itemData.x >= OSD.data.display_size.x)
- {
- continue;
- }
+ if (itemData.x >= OSD.data.display_size.x)
+ {
+ continue;
+ }
- // DJI HD FPV: Hide elements that only appear in craft name
- if (OSD.DjiElements.craftNameElements.includes(item.name) &&
- $('#djiUnsupportedElements').find('input').is(':checked')) {
- continue;
- }
- var j = (itemData.position >= 0) ? itemData.position : itemData.position + OSD.data.display_size.total;
- // create the preview image
- item.preview_img = new Image();
- var canvas = document.createElement('canvas');
- var ctx = canvas.getContext("2d");
- // fill the screen buffer
- var preview = OSD.get_item_preview(item);
- if (!preview) {
- continue;
- }
- var x = 0;
- var y = 0;
- for (let i = 0; i < preview.length; i++) {
- var charCode = preview.charCodeAt(i);
- if (charCode == '\n'.charCodeAt(0)) {
- x = 0;
- y++;
+ // DJI HD FPV: Hide elements that only appear in craft name
+ if (OSD.DjiElements.craftNameElements.includes(item.name) &&
+ $('#djiUnsupportedElements').find('input').is(':checked')) {
continue;
}
- var previewPos = j + x + (y * OSD.data.display_size.x);
- if (previewPos >= OSD.data.preview.length) {
- // Character is outside the viewport
- x++;
+ var j = (itemData.position >= 0) ? itemData.position : itemData.position + OSD.data.display_size.total;
+ // create the preview image
+ item.preview_img = new Image();
+ var canvas = document.createElement('canvas');
+ var ctx = canvas.getContext("2d");
+ // fill the screen buffer
+ var preview = OSD.get_item_preview(item);
+ if (!preview) {
continue;
}
- // test if this position already has a character placed
- if (OSD.data.preview[previewPos][0] !== null) {
- // if so set background color to red to show user double usage of position
- OSD.data.preview[previewPos] = [item, charCode, 'red'];
- } else {
- OSD.data.preview[previewPos] = [item, charCode];
+ var x = 0;
+ var y = 0;
+ for (let i = 0; i < preview.length; i++) {
+ var charCode = preview.charCodeAt(i);
+ if (charCode == '\n'.charCodeAt(0)) {
+ x = 0;
+ y++;
+ continue;
+ }
+ var previewPos = j + x + (y * OSD.data.display_size.x);
+ if (previewPos >= OSD.data.preview.length) {
+ // Character is outside the viewport
+ x++;
+ continue;
+ }
+ // test if this position already has a character placed
+ if (OSD.data.preview[previewPos][0] !== null) {
+ // if so set background color to red to show user double usage of position
+ OSD.data.preview[previewPos] = [item, charCode, 'red'];
+ } else {
+ OSD.data.preview[previewPos] = [item, charCode];
+ }
+ // draw the preview
+ var img = new Image();
+ img.src = FONT.draw(charCode);
+ ctx.drawImage(img, x*FONT.constants.SIZES.CHAR_WIDTH, y*FONT.constants.SIZES.CHAR_HEIGHT);
+ x++;
}
- // draw the preview
- var img = new Image();
- img.src = FONT.draw(charCode);
- ctx.drawImage(img, x*FONT.constants.SIZES.CHAR_WIDTH, y*FONT.constants.SIZES.CHAR_HEIGHT);
- x++;
+ item.preview_img.src = canvas.toDataURL('image/png');
+ // Required for NW.js - Otherwise the
will
+ // consume drag/drop events.
+ item.preview_img.style.pointerEvents = 'none';
}
- item.preview_img.src = canvas.toDataURL('image/png');
- // Required for NW.js - Otherwise the
will
- // consume drag/drop events.
- item.preview_img.style.pointerEvents = 'none';
- }
-
- var centerPosition = (OSD.data.display_size.x * OSD.data.display_size.y / 2);
- if (OSD.data.display_size.y % 2 == 0) {
- centerPosition += Math.floor(OSD.data.display_size.x / 2);
- }
- let hudCenterPosition = centerPosition - (OSD.constants.VIDEO_COLS[video_type] * $('#osd_horizon_offset').val());
-
- // artificial horizon
- if ($('input[name="ARTIFICIAL_HORIZON"]').prop('checked')) {
- for (let i = 0; i < 9; i++) {
- OSD.GUI.checkAndProcessSymbolPosition(hudCenterPosition - 4 + i, SYM.AH_BAR9_0 + 4);
+ var centerPosition = (OSD.data.display_size.x * OSD.data.display_size.y / 2);
+ if (OSD.data.display_size.y % 2 == 0) {
+ centerPosition += Math.floor(OSD.data.display_size.x / 2);
}
- }
- // crosshairs
- if ($('input[name="CROSSHAIRS"]').prop('checked')) {
- let crsHNumber = Settings.getInputValue('osd_crosshairs_style');
- if (crsHNumber == 1) {
- // AIRCRAFT style
- OSD.GUI.checkAndProcessSymbolPosition(hudCenterPosition - 2, SYM.AH_AIRCRAFT0);
- OSD.GUI.checkAndProcessSymbolPosition(hudCenterPosition - 1, SYM.AH_AIRCRAFT1);
- OSD.GUI.checkAndProcessSymbolPosition(hudCenterPosition, SYM.AH_AIRCRAFT2);
- OSD.GUI.checkAndProcessSymbolPosition(hudCenterPosition + 1, SYM.AH_AIRCRAFT3);
- OSD.GUI.checkAndProcessSymbolPosition(hudCenterPosition + 2, SYM.AH_AIRCRAFT4);
- } else if ((crsHNumber > 1) && (crsHNumber < 8)) {
- // TYPES 3 to 8 (zero indexed)
- OSD.GUI.checkAndProcessSymbolPosition(hudCenterPosition - 1, SYM.AH_CROSSHAIRS[crsHNumber][0]);
- OSD.GUI.checkAndProcessSymbolPosition(hudCenterPosition, SYM.AH_CROSSHAIRS[crsHNumber][1]);
- OSD.GUI.checkAndProcessSymbolPosition(hudCenterPosition + 1, SYM.AH_CROSSHAIRS[crsHNumber][2]);
- } else {
- // DEFAULT or unknown style
- OSD.GUI.checkAndProcessSymbolPosition(hudCenterPosition - 1, SYM.AH_CENTER_LINE);
- OSD.GUI.checkAndProcessSymbolPosition(hudCenterPosition, SYM.AH_CROSSHAIRS[crsHNumber]);
- OSD.GUI.checkAndProcessSymbolPosition(hudCenterPosition + 1, SYM.AH_CENTER_LINE_RIGHT);
- }
- }
+ let hudCenterPosition = centerPosition - (OSD.constants.VIDEO_COLS[video_type] * $('#osd_horizon_offset').val());
- // sidebars
- if ($('input[name="HORIZON_SIDEBARS"]').prop('checked')) {
- var hudwidth = OSD.constants.AHISIDEBARWIDTHPOSITION;
- var hudheight = OSD.constants.AHISIDEBARHEIGHTPOSITION;
- for (let i = -hudheight; i <= hudheight; i++) {
- OSD.GUI.checkAndProcessSymbolPosition(hudCenterPosition - hudwidth + (i * FONT.constants.SIZES.LINE), SYM.AH_DECORATION);
- OSD.GUI.checkAndProcessSymbolPosition(hudCenterPosition + hudwidth + (i * FONT.constants.SIZES.LINE), SYM.AH_DECORATION);
+ // artificial horizon
+ if ($('input[name="ARTIFICIAL_HORIZON"]').prop('checked')) {
+ for (let i = 0; i < 9; i++) {
+ OSD.GUI.checkAndProcessSymbolPosition(hudCenterPosition - 4 + i, SYM.AH_BAR9_0 + 4);
+ }
}
- // AH level indicators
- OSD.GUI.checkAndProcessSymbolPosition(hudCenterPosition - hudwidth + 1, SYM.AH_LEFT);
- OSD.GUI.checkAndProcessSymbolPosition(hudCenterPosition + hudwidth - 1, SYM.AH_RIGHT);
- }
- OSD.GUI.updateMapPreview(centerPosition, 'MAP_NORTH', 'N', SYM.HOME);
- OSD.GUI.updateMapPreview(centerPosition, 'MAP_TAKEOFF', 'T', SYM.HOME);
- OSD.GUI.updateMapPreview(centerPosition, 'RADAR', null, SYM.DIR_TO_HOME);
-
- // render
- var $preview = $('.display-layout .preview').empty();
- var $row = $('
');
- for (let i = 0; i < OSD.data.display_size.total;) {
- var charCode = OSD.data.preview[i];
- var colorStyle = '';
-
- if (typeof charCode === 'object') {
- var item = OSD.data.preview[i][0];
- charCode = OSD.data.preview[i][1];
- if (OSD.data.preview[i][2] !== undefined) {
- // if third field is set it contains a background color
- colorStyle = 'style="background-color: ' + OSD.data.preview[i][2] + ';"';
+ // crosshairs
+ if ($('input[name="CROSSHAIRS"]').prop('checked')) {
+ let crsHNumber = Settings.getInputValue('osd_crosshairs_style');
+ if (crsHNumber == 1) {
+ // AIRCRAFT style
+ OSD.GUI.checkAndProcessSymbolPosition(hudCenterPosition - 2, SYM.AH_AIRCRAFT0);
+ OSD.GUI.checkAndProcessSymbolPosition(hudCenterPosition - 1, SYM.AH_AIRCRAFT1);
+ OSD.GUI.checkAndProcessSymbolPosition(hudCenterPosition, SYM.AH_AIRCRAFT2);
+ OSD.GUI.checkAndProcessSymbolPosition(hudCenterPosition + 1, SYM.AH_AIRCRAFT3);
+ OSD.GUI.checkAndProcessSymbolPosition(hudCenterPosition + 2, SYM.AH_AIRCRAFT4);
+ } else if ((crsHNumber > 1) && (crsHNumber < 8)) {
+ // TYPES 3 to 8 (zero indexed)
+ OSD.GUI.checkAndProcessSymbolPosition(hudCenterPosition - 1, SYM.AH_CROSSHAIRS[crsHNumber][0]);
+ OSD.GUI.checkAndProcessSymbolPosition(hudCenterPosition, SYM.AH_CROSSHAIRS[crsHNumber][1]);
+ OSD.GUI.checkAndProcessSymbolPosition(hudCenterPosition + 1, SYM.AH_CROSSHAIRS[crsHNumber][2]);
+ } else {
+ // DEFAULT or unknown style
+ OSD.GUI.checkAndProcessSymbolPosition(hudCenterPosition - 1, SYM.AH_CENTER_LINE);
+ OSD.GUI.checkAndProcessSymbolPosition(hudCenterPosition, SYM.AH_CROSSHAIRS[crsHNumber]);
+ OSD.GUI.checkAndProcessSymbolPosition(hudCenterPosition + 1, SYM.AH_CENTER_LINE_RIGHT);
}
}
- var $img = $('
')
- .on('mouseenter', OSD.GUI.preview.onMouseEnter)
- .on('mouseleave', OSD.GUI.preview.onMouseLeave)
- .on('dragover', OSD.GUI.preview.onDragOver)
- .on('dragleave', OSD.GUI.preview.onDragLeave)
- .on('drop', OSD.GUI.preview.onDrop)
- .data('item', item)
- .data('position', i);
- // Required for NW.js - Otherwise the
will
- // consume drag/drop events.
- $img.find('img').css('pointer-events', 'none');
- if (item && item.positionable !== false) {
- var nameKey = 'osdElement_' + item.name;
- var nameMessage = i18n.getMessage(nameKey);
- if (!nameMessage) {
- nameMessage = inflection.titleize(item.name);
+ // sidebars
+ if ($('input[name="HORIZON_SIDEBARS"]').prop('checked')) {
+ var hudwidth = OSD.constants.AHISIDEBARWIDTHPOSITION;
+ var hudheight = OSD.constants.AHISIDEBARHEIGHTPOSITION;
+ for (let i = -hudheight; i <= hudheight; i++) {
+ OSD.GUI.checkAndProcessSymbolPosition(hudCenterPosition - hudwidth + (i * FONT.constants.SIZES.LINE), SYM.AH_DECORATION);
+ OSD.GUI.checkAndProcessSymbolPosition(hudCenterPosition + hudwidth + (i * FONT.constants.SIZES.LINE), SYM.AH_DECORATION);
}
+ // AH level indicators
+ OSD.GUI.checkAndProcessSymbolPosition(hudCenterPosition - hudwidth + 1, SYM.AH_LEFT);
+ OSD.GUI.checkAndProcessSymbolPosition(hudCenterPosition + hudwidth - 1, SYM.AH_RIGHT);
+ }
- $img.addClass('field-' + item.id)
+ OSD.GUI.updateMapPreview(centerPosition, 'MAP_NORTH', 'N', SYM.HOME);
+ OSD.GUI.updateMapPreview(centerPosition, 'MAP_TAKEOFF', 'T', SYM.HOME);
+ OSD.GUI.updateMapPreview(centerPosition, 'RADAR', null, SYM.DIR_TO_HOME);
+
+ // render
+ var $preview = $('.display-layout .preview').empty();
+ var $row = $('
');
+ for (let i = 0; i < OSD.data.display_size.total;) {
+ var charCode = OSD.data.preview[i];
+ var colorStyle = '';
+
+ if (typeof charCode === 'object') {
+ var item = OSD.data.preview[i][0];
+ charCode = OSD.data.preview[i][1];
+ if (OSD.data.preview[i][2] !== undefined) {
+ // if third field is set it contains a background color
+ colorStyle = 'style="background-color: ' + OSD.data.preview[i][2] + ';"';
+ }
+ }
+ var $img = $('
')
+ .on('mouseenter', OSD.GUI.preview.onMouseEnter)
+ .on('mouseleave', OSD.GUI.preview.onMouseLeave)
+ .on('dragover', OSD.GUI.preview.onDragOver)
+ .on('dragleave', OSD.GUI.preview.onDragLeave)
+ .on('drop', OSD.GUI.preview.onDrop)
.data('item', item)
- .prop('draggable', true)
- .on('dragstart', OSD.GUI.preview.onDragStart)
- .prop('title', nameMessage);
- }
+ .data('position', i);
+ // Required for NW.js - Otherwise the
will
+ // consume drag/drop events.
+ $img.find('img').css('pointer-events', 'none');
+ if (item && item.positionable !== false) {
+ var nameKey = 'osdElement_' + item.name;
+ var nameMessage = i18n.getMessage(nameKey);
+
+ if (!nameMessage) {
+ nameMessage = inflection.titleize(item.name);
+ }
- $row.append($img);
- if (++i % OSD.data.display_size.x == 0) {
- $preview.append($row);
- $row = $('
');
+ $img.addClass('field-' + item.id)
+ .data('item', item)
+ .prop('draggable', true)
+ .on('dragstart', OSD.GUI.preview.onDragStart)
+ .prop('title', nameMessage);
+ }
+
+ $row.append($img);
+ if (++i % OSD.data.display_size.x == 0) {
+ $preview.append($row);
+ $row = $('
');
+ }
}
}
};
@@ -3290,6 +3334,7 @@ TABS.osd = {};
TABS.osd.initialize = function (callback) {
mspHelper.loadServoMixRules();
+ mspHelper.loadLogicConditions();
if (GUI.active_tab != 'osd') {
GUI.active_tab = 'osd';
@@ -3326,27 +3371,27 @@ TABS.osd.initialize = function (callback) {
// Initialise guides checkbox
isGuidesChecked = store.get('showOSDGuides', false);
-
+
// Setup switch indicators
$(".osdSwitchInd_channel option").each(function() {
$(this).text("Ch " + $(this).text());
});
-
+
// Function when text for switch indicators change
$('.osdSwitchIndName').on('keyup', function() {
// Make sure that the switch hint only contains A to Z
let testExp = new RegExp('^[A-Za-z0-9]');
let testText = $(this).val();
if (testExp.test(testText.slice(-1))) {
- $(this).val(testText.toUpperCase());
+ $(this).val(testText.toUpperCase().slice(0, 4));
} else {
$(this).val(testText.slice(0, -1));
}
-
+
// Update the OSD preview
refreshOSDSwitchIndicators();
});
-
+
// Function to update the OSD layout when the switch text alignment changes
$("#switchIndicators_alignLeft").on('change', function() {
refreshOSDSwitchIndicators();
@@ -3495,30 +3540,49 @@ function createCustomElements(){
var customElementTable = $('
').addClass('osdCustomElement_main_table');
var customElementRowType = $('').data('row', i);
var customElementRowValue = $('
').data('row', i);
+
var customElementLabel = $('
');
+ customElementLabel.append($('').attr('colspan', 2).append($('').html(i18n.getMessage("custom_element") + ' ' + (i + 1))));
- for(var ii = 0; ii < 3; ii++){
-
+ for(var ii = 0; ii < FC.OSD_CUSTOM_ELEMENTS.settings.customElementParts; ii++){
var select = $(' |