Skip to content

Commit 9d8cbea

Browse files
committed
Adding Configurator support for the Camera Angle Reference OSD feature
This is an OSD visual reference for current camera angle (open to name changes) intended to be used with a single axis tilt gimbal, like those shown on medlindrone.com For 'Camera Angle Reference' there are five new cli parameters: -osd_car_pos (osd element position) -osd_car_channel (channel controlling the gimbal/car) -osd_car_scale (scale for adjusting vertical scale/sensitivity) -osd_car_width (width for adjusting witdh between dots) -osd_car_dots (number of dots on each side) For 'Camera Angle Reference Sidebar' there are seven new cli parameters: -osd_car_sbar_pos; (osd element position) -osd_car_sbar_scale; (scale for adjusting vertical scale) -osd_car_sbar_low; (angle 1/5) -osd_car_sbar_mid_low; (angle 2/5) -osd_car_sbar_mid; (angle 3/5) -osd_car_sbar_mid_high; (angle 4/5) -osd_car_sbar_high; (angle 5/5) Added UI in OSD tab to changes CLI values, "Camera Angle Reference' section on right side
1 parent 5a633c9 commit 9d8cbea

File tree

5 files changed

+173
-2
lines changed

5 files changed

+173
-2
lines changed

Diff for: locales/en/messages.json

+60-1
Original file line numberDiff line numberDiff line change
@@ -5110,6 +5110,9 @@
51105110
"osdSetupAlarmsTitle": {
51115111
"message": "Alarms"
51125112
},
5113+
"osdSetupCarTitle": {
5114+
"message": "Camera Angle Reference"
5115+
},
51135116
"osdSetupStatsTitle": {
51145117
"message": "Post Flight Statistics"
51155118
},
@@ -5290,6 +5293,20 @@
52905293
"osdDescElementHorizonSidebars": {
52915294
"message": "Sidebars around artificial horizon indicator"
52925295
},
5296+
"osdTextElementCameraAngleReference": {
5297+
"message": "Camera Angle Reference",
5298+
"description": "One of the elements of the OSD"
5299+
},
5300+
"osdDescElementCameraAngleReference": {
5301+
"message": "Camera angle reference for flying with FPV tilt gimbal"
5302+
},
5303+
"osdTextElementCameraAngleReferenceSidebar": {
5304+
"message": "Camera Angle Reference Sidebar",
5305+
"description": "One of the elements of the OSD"
5306+
},
5307+
"osdDescElementCameraAngleReferenceSidebar": {
5308+
"message": "Sidebar for Camera angle reference"
5309+
},
52935310
"osdTextElementCurrentDraw": {
52945311
"message": "Battery current draw",
52955312
"description": "One of the elements of the OSD"
@@ -6164,7 +6181,46 @@
61646181
"message": "Altitude",
61656182
"description": "Text of the altitude alarm"
61666183
},
6167-
6184+
"osdCarOptionScale": {
6185+
"message": "Scale",
6186+
"description": "Scale"
6187+
},
6188+
"osdCarOptionWidth": {
6189+
"message": "Width",
6190+
"description": "Width"
6191+
},
6192+
"osdCarOptionChannel": {
6193+
"message": "Channel",
6194+
"description": "Channel"
6195+
},
6196+
"osdCarOptionDots": {
6197+
"message": "Dots",
6198+
"description": "Dots"
6199+
},
6200+
"osdCarOptionSbarScale": {
6201+
"message": "Sidebar Scale",
6202+
"description": "Sidebar Scale"
6203+
},
6204+
"osdCarOptionSbarLow": {
6205+
"message": "Sidebar Angle 1/5",
6206+
"description": "Sidebar Scale"
6207+
},
6208+
"osdCarOptionSbarMidLow": {
6209+
"message": "Sidebar Angle 2/5",
6210+
"description": "Sidebar Scale"
6211+
},
6212+
"osdCarOptionSbarMid": {
6213+
"message": "Sidebar Angle 3/5",
6214+
"description": "Sidebar Scale"
6215+
},
6216+
"osdCarOptionSbarMidHigh": {
6217+
"message": "Sidebar Angle 4/5",
6218+
"description": "Sidebar Scale"
6219+
},
6220+
"osdCarOptionSbarHigh": {
6221+
"message": "Sidebar Angle 5/5",
6222+
"description": "Sidebar Scale"
6223+
},
61686224
"osdWarningTextArmingDisabled": {
61696225
"message": "Arming disabled",
61706226
"description": "One of the warnings that can be selected to be shown in the OSD"
@@ -6313,6 +6369,9 @@
63136369
"osdSectionHelpAlarms": {
63146370
"message": "Set the thresholds used for OSD elements with alarm states."
63156371
},
6372+
"osdSectionHelpCar": {
6373+
"message": "Set the Camera Angle Reference parameter values"
6374+
},
63166375
"osdSectionHelpStats": {
63176376
"message": "Set the values dispalyed on the post flight statistics screen."
63186377
},

Diff for: src/css/tabs/osd.less

+24
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,30 @@
347347
font-weight: normal;
348348
}
349349
}
350+
.car {
351+
label {
352+
display: block;
353+
width: 100%;
354+
border-bottom: 1px solid var(--subtleAccent);
355+
margin-top: 5px;
356+
padding-bottom: 5px;
357+
&:last-child {
358+
border-bottom: none;
359+
padding-bottom: 0;
360+
}
361+
}
362+
input {
363+
width: 55px;
364+
padding-left: 3px;
365+
height: 18px;
366+
line-height: 20px;
367+
text-align: left;
368+
border-radius: 3px;
369+
margin-right: 11px;
370+
font-size: 11px;
371+
font-weight: normal;
372+
}
373+
}
350374
.grid-row {
351375
justify-content: flex-start;
352376
gap: 7px;

Diff for: src/js/VirtualFC.js

+12
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,18 @@ const VirtualFC = {
233233
alt: { display_name: i18n.getMessage('osdTimerAlarmOptionAltitude'), value: 0 },
234234
time: { display_name: 'Minutes', value: 0 },
235235
};
236+
virtualOSD.data.car = {
237+
scale: { display_name: i18n.getMessage('osdCarOptionScale'), value: 0 },
238+
width: { display_name: i18n.getMessage('osdCarOptionWidth'), value: 0 },
239+
channel: { display_name: i18n.getMessage('osdCarOptionChannel'), value: 0 },
240+
dots: { display_name: i18n.getMessage('osdCarOptionDots'), value: 0 },
241+
sbar_scale: { display_name: i18n.getMessage('osdCarOptionSbarScale'), value: 0 },
242+
sbar_low: { display_name: i18n.getMessage('osdCarOptionSbarLow'), value: 0 },
243+
sbar_mid_low: { display_name: i18n.getMessage('osdCarOptionSbarMidLow'), value: 0 },
244+
sbar_mid: { display_name: i18n.getMessage('osdCarOptionSbarMid'), value: 0 },
245+
sbar_mid_high: { display_name: i18n.getMessage('osdCarOptionSbarMidHigh'), value: 0 },
246+
sbar_high: { display_name: i18n.getMessage('osdCarOptionSbarHigh'), value: 0 },
247+
};
236248
},
237249
};
238250

Diff for: src/js/tabs/osd.js

+69-1
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,7 @@ OSD.initData = function() {
309309
video_system: null,
310310
unit_mode: null,
311311
alarms: [],
312+
car: [],
312313
statItems: [],
313314
warnings: [],
314315
displayItems: [],
@@ -1536,6 +1537,24 @@ OSD.loadDisplayFields = function() {
15361537
positionable: true,
15371538
preview: '1:23.456',
15381539
},
1540+
CAM_ANGLE_REFERENCE: {
1541+
name: 'CAM_ANGLE_REFERENCE',
1542+
text: 'osdTextElementCameraAngleReference',
1543+
desc: 'osdDescElementCameraAngleReference',
1544+
defaultPosition: -1,
1545+
draw_order: 555,
1546+
positionable: true,
1547+
preview: '***CAR***',
1548+
},
1549+
CAM_ANGLE_REFERENCE_SBAR: {
1550+
name: 'CAM_ANGLE_REFERENCE_SBAR',
1551+
text: 'osdTextElementCameraAngleReferenceSidebar',
1552+
desc: 'osdDescElementCameraAngleReferenceSidebar',
1553+
defaultPosition: -1,
1554+
draw_order: 560,
1555+
positionable: true,
1556+
preview: '***SBR***||',
1557+
},
15391558
};
15401559
};
15411560

@@ -1970,6 +1989,8 @@ OSD.chooseFields = function() {
19701989
F.GPS_LAP_TIME_CURRENT,
19711990
F.GPS_LAP_TIME_PREVIOUS,
19721991
F.GPS_LAP_TIME_BEST3,
1992+
F.CAM_ANGLE_REFERENCE,
1993+
F.CAM_ANGLE_REFERENCE_SBAR,
19731994
]);
19741995
}
19751996

@@ -2188,6 +2209,7 @@ OSD.msp = {
21882209
result.push16(OSD.data.alarms.cap.value);
21892210
result.push16(0); // This value is unused by the firmware with configurable timers
21902211
result.push16(OSD.data.alarms.alt.value);
2212+
21912213

21922214
let warningFlags = 0;
21932215
for (let i = 0; i < OSD.data.warnings.length; i++) {
@@ -2212,6 +2234,19 @@ OSD.msp = {
22122234
result.push8(OSD.data.parameters.cameraFrameWidth);
22132235
result.push8(OSD.data.parameters.cameraFrameHeight);
22142236
}
2237+
if (semver.gte(FC.CONFIG.apiVersion, API_VERSION_1_46)) {
2238+
result.push8(OSD.data.car.scale.value);
2239+
result.push8(OSD.data.car.width.value);
2240+
result.push8(OSD.data.car.channel.value);
2241+
result.push8(OSD.data.car.dots.value);
2242+
2243+
result.push8(OSD.data.car.sbar_scale.value);
2244+
result.push8(OSD.data.car.sbar_low.value);
2245+
result.push8(OSD.data.car.sbar_mid_low.value);
2246+
result.push8(OSD.data.car.sbar_mid.value);
2247+
result.push8(OSD.data.car.sbar_mid_high.value);
2248+
result.push8(OSD.data.car.sbar_high.value);
2249+
}
22152250
}
22162251
return result;
22172252
},
@@ -2304,7 +2339,7 @@ OSD.msp = {
23042339
d.alarms['alt'] = { display_name: i18n.getMessage('osdTimerAlarmOptionAltitude'), value: view.readU16() };
23052340
}
23062341
}
2307-
2342+
23082343
d.state = {};
23092344
d.state.haveSomeOsd = (d.flags !== 0);
23102345
d.state.haveMax7456Configured = bit_check(d.flags, 4);
@@ -2424,6 +2459,22 @@ OSD.msp = {
24242459
d.parameters.cameraFrameHeight = view.readU8();
24252460
}
24262461

2462+
if (semver.gte(FC.CONFIG.apiVersion, API_VERSION_1_46)) {
2463+
d.car = {};
2464+
d.car['scale'] = { display_name: i18n.getMessage('osdCarOptionScale'), value: view.readU8() };
2465+
d.car['width'] = { display_name: i18n.getMessage('osdCarOptionWidth'), value: view.readU8() };
2466+
d.car['channel'] = { display_name: i18n.getMessage('osdCarOptionChannel'), value: view.readU8() };
2467+
d.car['dots'] = { display_name: i18n.getMessage('osdCarOptionDots'), value: view.readU8() };
2468+
2469+
d.car['sbar_scale'] = { display_name: i18n.getMessage('osdCarOptionSbarScale'), value: view.readU8() };
2470+
d.car['sbar_low'] = { display_name: i18n.getMessage('osdCarOptionSbarLow'), value: view.readU8() };
2471+
d.car['sbar_mid_low'] = { display_name: i18n.getMessage('osdCarOptionSbarMidLow'), value: view.readU8() };
2472+
d.car['sbar_mid'] = { display_name: i18n.getMessage('osdCarOptionSbarMid'), value: view.readU8() };
2473+
d.car['sbar_mid_high'] = { display_name: i18n.getMessage('osdCarOptionSbarMidHigh'), value: view.readU8() };
2474+
d.car['sbar_high'] = { display_name: i18n.getMessage('osdCarOptionSbarHigh'), value: view.readU8() };
2475+
2476+
}
2477+
24272478
this.processOsdElements(d, itemsPositionsRead);
24282479

24292480
OSD.updateDisplaySize();
@@ -2684,6 +2735,7 @@ osd.initialize = function(callback) {
26842735
$('.units-container div.cf_tip').attr('title', i18n.getMessage('osdSectionHelpUnits'));
26852736
$('.timers-container div.cf_tip').attr('title', i18n.getMessage('osdSectionHelpTimers'));
26862737
$('.alarms-container div.cf_tip').attr('title', i18n.getMessage('osdSectionHelpAlarms'));
2738+
$('.car-container div.cf_tip').attr('title', i18n.getMessage('osdSectionHelpCar'));
26872739
$('.stats-container div.cf_tip').attr('title', i18n.getMessage('osdSectionHelpStats'));
26882740
$('.warnings-container div.cf_tip').attr('title', i18n.getMessage('osdSectionHelpWarnings'));
26892741

@@ -2802,6 +2854,22 @@ osd.initialize = function(callback) {
28022854
$alarms.append($input);
28032855
}
28042856

2857+
// Camera Angle Reference
2858+
$('.car-container').show();
2859+
const $car = $('.car').empty();
2860+
for (const k in OSD.data.car) {
2861+
const car = OSD.data.car[k];
2862+
const carInput = $(`<input name="car" type="number" id="${k}"/>${car.display_name}</label>`);
2863+
carInput.val(car.value);
2864+
carInput.focusout(function() {
2865+
OSD.data.car[$(this)[0].id].value = $(this)[0].value;
2866+
MSP.promise(MSPCodes.MSP_SET_OSD_CONFIG, OSD.msp.encodeOther())
2867+
.then(updateOsdView);
2868+
});
2869+
const $input = $('<label/>').append(carInput);
2870+
$car.append($input);
2871+
}
2872+
28052873
// Timers
28062874
$('.timers-container').show();
28072875
const $timers = $('#timer-fields').empty();

Diff for: src/tabs/osd.html

+8
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,14 @@ <h1 class="tab_title">
111111
<div class="alarms"></div>
112112
</div>
113113
</div>
114+
<div class="gui_box grey car-container requires-osd-feature" style="display:none;">
115+
<div class="gui_box_titlebar cf_tip">
116+
<div class="spacer_box_title" i18n="osdSetupCarTitle"></div>
117+
</div>
118+
<div class="spacer_box">
119+
<div class="car"></div>
120+
</div>
121+
</div>
114122
<div class="gui_box grey warnings-container requires-osd-feature" style="display:none;">
115123
<div class="gui_box_titlebar cf_tip" style="margin-bottom: 0px;">
116124
<div class="spacer_box_title">

0 commit comments

Comments
 (0)