Skip to content

Commit 02453dc

Browse files
authored
Merge pull request #1846 from error414/adsb
Adsb support for inav
2 parents 4643640 + 0b01651 commit 02453dc

22 files changed

+221
-1
lines changed

_locales/en/messages.json

+12
Original file line numberDiff line numberDiff line change
@@ -3593,6 +3593,12 @@
35933593
"osdAlarmGFORCE_AXIS_MAX_HELP": {
35943594
"message": "The axes g force elements will start blinking when greater than this value"
35953595
},
3596+
"osdAlarmADSB_MAX_DISTANCE_WARNING": {
3597+
"message": "Distance in meters of ADSB aircraft that is displayed"
3598+
},
3599+
"osdAlarmADSB_MAX_DISTANCE_ALERT": {
3600+
"message": "Distance inside which ADSB data flashes for proximity warning"
3601+
},
35963602
"osd_current_alarm": {
35973603
"message": "Current (A)"
35983604
},
@@ -3632,6 +3638,12 @@
36323638
"osd_rssi_dbm_alarm": {
36333639
"message": "CRSF RSSI dBm Alarm"
36343640
},
3641+
"osd_adsb_distance_warning": {
3642+
"message": "ADSB distance warning"
3643+
},
3644+
"osd_adsb_distance_alert": {
3645+
"message": "ADSB distance alert"
3646+
},
36353647
"osd_rssi_dbm_alarm_HELP": {
36363648
"message": "RSSI indicator blinks below this value. Range: [-130,0]. Zero disables this alarm."
36373649
},

js/fc.js

+7
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ var CONFIG,
2929
MOTOR_DATA,
3030
SERVO_DATA,
3131
GPS_DATA,
32+
ADSB_VEHICLES,
3233
MISSION_PLANNER,
3334
ANALOG,
3435
ARMING_CONFIG,
@@ -251,6 +252,12 @@ var FC = {
251252
packetCount: 0
252253
};
253254

255+
ADSB_VEHICLES = {
256+
vehiclesCount: 0,
257+
callsignLength: 0,
258+
vehicles: []
259+
};
260+
254261
MISSION_PLANNER = new WaypointCollection();
255262

256263
ANALOG = {

js/msp/MSPCodes.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -245,5 +245,7 @@ var MSPCodes = {
245245
MSP2_INAV_EZ_TUNE: 0x2070,
246246
MSP2_INAV_EZ_TUNE_SET: 0x2071,
247247

248-
MSP2_INAV_SELECT_MIXER_PROFILE: 0x2080
248+
MSP2_INAV_SELECT_MIXER_PROFILE: 0x2080,
249+
250+
MSP2_ADSB_VEHICLE_LIST: 0x2090,
249251
};

js/msp/MSPHelper.js

+29
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,35 @@ var mspHelper = (function (gui) {
187187
GPS_DATA.eph = data.getUint16(16, true);
188188
GPS_DATA.epv = data.getUint16(18, true);
189189
break;
190+
case MSPCodes.MSP2_ADSB_VEHICLE_LIST:
191+
var byteOffsetCounter = 0;
192+
ADSB_VEHICLES.vehicles = [];
193+
ADSB_VEHICLES.vehiclesCount = data.getUint8(byteOffsetCounter++);
194+
ADSB_VEHICLES.callsignLength = data.getUint8(byteOffsetCounter++);
195+
196+
for(i = 0; i < ADSB_VEHICLES.vehiclesCount; i++){
197+
198+
var vehicle = {callSignByteArray: [], callsign: "", icao: 0, lat: 0, lon: 0, alt: 0, heading: 0, ttl: 0, tslc: 0, emitterType: 0};
199+
200+
for(ii = 0; ii < ADSB_VEHICLES.callsignLength; ii++){
201+
vehicle.callSignByteArray.push(data.getUint8(byteOffsetCounter++));
202+
}
203+
204+
vehicle.callsign = (String.fromCharCode(...vehicle.callSignByteArray)).replace(/[^\x20-\x7E]/g, '');
205+
vehicle.icao = data.getUint32(byteOffsetCounter, true); byteOffsetCounter += 4;
206+
vehicle.lat = data.getInt32(byteOffsetCounter, true); byteOffsetCounter += 4;
207+
vehicle.lon = data.getInt32(byteOffsetCounter, true); byteOffsetCounter += 4;
208+
vehicle.altCM = data.getInt32(byteOffsetCounter, true); byteOffsetCounter += 4;
209+
vehicle.headingDegrees = data.getUint16(byteOffsetCounter, true); byteOffsetCounter += 2;
210+
vehicle.tslc = data.getUint8(byteOffsetCounter++);
211+
vehicle.emitterType = data.getUint8(byteOffsetCounter++);
212+
vehicle.ttl = data.getUint8(byteOffsetCounter++);
213+
214+
ADSB_VEHICLES.vehicles.push(vehicle);
215+
}
216+
217+
break;
218+
190219
case MSPCodes.MSP_ATTITUDE:
191220
SENSOR_DATA.kinematics[0] = data.getInt16(0, true) / 10.0; // x
192221
SENSOR_DATA.kinematics[1] = data.getInt16(2, true) / 10.0; // y

resources/adsb/adsb_1.png

953 Bytes
Loading

resources/adsb/adsb_10.png

962 Bytes
Loading

resources/adsb/adsb_11.png

982 Bytes
Loading

resources/adsb/adsb_12.png

1.98 KB
Loading

resources/adsb/adsb_13.png

1.1 KB
Loading

resources/adsb/adsb_14.png

1.14 KB
Loading

resources/adsb/adsb_15.png

1.01 KB
Loading

resources/adsb/adsb_2.png

981 Bytes
Loading

resources/adsb/adsb_3.png

1.17 KB
Loading

resources/adsb/adsb_4.png

1.43 KB
Loading

resources/adsb/adsb_5.png

1.42 KB
Loading

resources/adsb/adsb_6.png

821 Bytes
Loading

resources/adsb/adsb_7.png

1.38 KB
Loading

resources/adsb/adsb_8.png

919 Bytes
Loading

resources/adsb/adsb_9.png

963 Bytes
Loading

tabs/gps.js

+123
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,32 @@ TABS.gps.initialize = function (callback) {
99
googleAnalytics.sendAppView('GPS');
1010
}
1111

12+
// mavlink ADSB_EMITTER_TYPE
13+
const ADSB_VEHICLE_TYPE = {
14+
0: 'adsb_14.png', // ADSB_EMITTER_TYPE_NO_INFO
15+
1: 'adsb_1.png', // ADSB_EMITTER_TYPE_LIGHT
16+
2: 'adsb_1.png', // ADSB_EMITTER_TYPE_SMALL
17+
3: 'adsb_2.png', // ADSB_EMITTER_TYPE_LARGE
18+
4: 'adsb_14.png', // ADSB_EMITTER_TYPE_HIGH_VORTEX_LARGE
19+
5: 'adsb_5.png', // ADSB_EMITTER_TYPE_HEAVY
20+
6: 'adsb_14.png', // ADSB_EMITTER_TYPE_HIGHLY_MANUV
21+
7: 'adsb_13.png', // ADSB_EMITTER_TYPE_ROTOCRAFT
22+
8: 'adsb_14.png', // ADSB_EMITTER_TYPE_UNASSIGNED
23+
9: 'adsb_6.png', // ADSB_EMITTER_TYPE_GLIDER
24+
10: 'adsb_7.png', // ADSB_EMITTER_TYPE_LIGHTER_AIR
25+
11: 'adsb_15.png', // ADSB_EMITTER_TYPE_PARACHUTE
26+
12: 'adsb_1.png', // ADSB_EMITTER_TYPE_ULTRA_LIGHT
27+
13: 'adsb_14.png', // ADSB_EMITTER_TYPE_UNASSIGNED2
28+
14: 'adsb_8.png', // ADSB_EMITTER_TYPE_UAV
29+
15: 'adsb_14.png', // ADSB_EMITTER_TYPE_SPACE
30+
16: 'adsb_14.png', // ADSB_EMITTER_TYPE_UNASSGINED3
31+
17: 'adsb_9.png', // ADSB_EMITTER_TYPE_EMERGENCY_SURFACE
32+
18: 'adsb_10.png', // ADSB_EMITTER_TYPE_SERVICE_SURFACE
33+
19: 'adsb_12.png', // ADSB_EMITTER_TYPE_POINT_OBSTACLE
34+
};
35+
36+
37+
1238
var loadChainer = new MSPChainerClass();
1339

1440
var loadChain = [
@@ -58,6 +84,10 @@ TABS.gps.initialize = function (callback) {
5884
let iconGeometry;
5985
let iconFeature;
6086

87+
let vehicleVectorSource;
88+
let vehiclesCursorInitialized = false;
89+
90+
6191
function process_html() {
6292
localize();
6393

@@ -131,6 +161,36 @@ TABS.gps.initialize = function (callback) {
131161
view: mapView
132162
});
133163

164+
TABS.gps.toolboxAdsbVehicle = new jBox('Mouse', {
165+
position: {
166+
x: "right",
167+
y: "bottom"
168+
},
169+
offset: {
170+
x: -5,
171+
y: 20,
172+
},
173+
});
174+
175+
mapHandler.on('pointermove', function(evt) {
176+
var feature = mapHandler.forEachFeatureAtPixel(mapHandler.getEventPixel(evt.originalEvent), function(feature, layer) {
177+
return feature;
178+
});
179+
180+
if (feature) {
181+
TABS.gps.toolboxAdsbVehicle.setContent(
182+
`icao: <strong>` + feature.get('name') + `</strong><br />`
183+
+ `lat: <strong>`+ (feature.get('data').lat / 10000000) + `</strong><br />`
184+
+ `lon: <strong>`+ (feature.get('data').lon / 10000000) + `</strong><br />`
185+
+ `ASL: <strong>`+ (feature.get('data').altCM ) / 100 + `m</strong><br />`
186+
+ `heading: <strong>`+ feature.get('data').headingDegrees + `°</strong><br />`
187+
+ `type: <strong>`+ feature.get('data').emitterType + `</strong>`
188+
).open();
189+
}else{
190+
TABS.gps.toolboxAdsbVehicle.close();
191+
}
192+
});
193+
134194
let center = ol.proj.fromLonLat([0, 0]);
135195
mapView.setCenter(center);
136196
mapView.setZoom(2);
@@ -221,6 +281,66 @@ TABS.gps.initialize = function (callback) {
221281
iconGeometry.setCoordinates(center);
222282

223283
}
284+
285+
if (semver.gte(CONFIG.flightControllerVersion, "7.1.0")) {
286+
MSP.send_message(MSPCodes.MSP2_ADSB_VEHICLE_LIST, false, false, function () {
287+
//ADSB vehicles
288+
289+
if (vehiclesCursorInitialized) {
290+
vehicleVectorSource.clear();
291+
}
292+
293+
for (let key in ADSB_VEHICLES.vehicles) {
294+
let vehicle = ADSB_VEHICLES.vehicles[key];
295+
296+
if (!vehiclesCursorInitialized) {
297+
vehiclesCursorInitialized = true;
298+
299+
vehicleVectorSource = new ol.source.Vector({});
300+
301+
let vehicleLayer = new ol.layer.Vector({
302+
source: vehicleVectorSource
303+
});
304+
305+
mapHandler.addLayer(vehicleLayer);
306+
}
307+
308+
if (vehicle.lat > 0 && vehicle.lon > 0 && vehicle.ttl > 0) {
309+
let vehicleIconStyle = new ol.style.Style({
310+
image: new ol.style.Icon(({
311+
opacity: 1,
312+
rotation: vehicle.headingDegrees * (Math.PI / 180),
313+
scale: 0.8,
314+
anchor: [0.5, 0.5],
315+
src: '../resources/adsb/' + ADSB_VEHICLE_TYPE[vehicle.emitterType],
316+
})),
317+
text: new ol.style.Text(({
318+
text: vehicle.callsign,
319+
textAlign: 'center',
320+
textBaseline: "bottom",
321+
offsetY: +40,
322+
padding: [2, 2, 2, 2],
323+
backgroundFill: '#444444',
324+
fill: new ol.style.Fill({color: '#ffffff'}),
325+
})),
326+
});
327+
328+
329+
let iconGeometry = new ol.geom.Point(ol.proj.fromLonLat([vehicle.lon / 10000000, vehicle.lat / 10000000]));
330+
let iconFeature = new ol.Feature({
331+
geometry: iconGeometry,
332+
name: vehicle.callsign,
333+
type: 'adsb',
334+
data: vehicle,
335+
});
336+
337+
iconFeature.setStyle(vehicleIconStyle);
338+
vehicleVectorSource.addFeature(iconFeature);
339+
}
340+
}
341+
});
342+
}
343+
224344
}
225345

226346
/*
@@ -271,4 +391,7 @@ TABS.gps.initialize = function (callback) {
271391

272392
TABS.gps.cleanup = function (callback) {
273393
if (callback) callback();
394+
if(TABS.gps.toolboxAdsbVehicle){
395+
TABS.gps.toolboxAdsbVehicle.close();
396+
}
274397
};

tabs/osd.html

+10
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,16 @@ <h1 class="tab_title" data-i18n="tabOSD"></h1>
242242
<input id="osd_gforce_axis_alarm_max" data-setting="osd_gforce_axis_alarm_max" data-setting-multiplier="1" type="number" data-step="0.1" />
243243
<span data-i18n="osd_gforce_axis_alarm_max"></span>
244244
</label>
245+
<div for="adsb_distance_warning" class="helpicon cf_tip" data-i18n_title="osdAlarmADSB_MAX_DISTANCE_WARNING"></div>
246+
<label for="adsb_distance_warning">
247+
<input id="adsb_distance_warning" data-setting="osd_adsb_distance_warning" data-unit="m" data-setting-multiplier="1" type="number" data-step="1" />
248+
<span data-i18n="osd_adsb_distance_warning"></span>
249+
</label>
250+
<div for="adsb_distance_alert" class="helpicon cf_tip" data-i18n_title="osdAlarmADSB_MAX_DISTANCE_ALERT"></div>
251+
<label for="adsb_distance_alert">
252+
<input id="adsb_distance_alert" data-setting="osd_adsb_distance_alert" data-unit="m" data-setting-multiplier="1" type="number" data-step="1" />
253+
<span data-i18n="osd_adsb_distance_alert"></span>
254+
</label>
245255
</div>
246256
</div>
247257
<div class="gui_box grey dji-hd-container" id="dji_settings">

tabs/osd.js

+37
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ SYM.FLIGHT_DIST_REMAINING = 0x167;
114114
SYM.GROUND_COURSE = 0xDC;
115115
SYM.ALERT = 0xDD;
116116
SYM.CROSS_TRACK_ERROR = 0xFC;
117+
SYM.ADSB = 0xFD;
117118
SYM.PAN_SERVO_IS_OFFSET_L = 0x1C7;
118119
SYM.ODOMETER = 0X168;
119120
SYM.PILOT_LOGO_SML_L = 0x1D5;
@@ -480,6 +481,8 @@ OSD.initData = function () {
480481
imu_temp_alarm_max: null,
481482
baro_temp_alarm_min: null,
482483
baro_temp_alarm_max: null,
484+
adsb_distance_warning: null,
485+
adsb_distance_alert: null,
483486
},
484487
layouts: [],
485488
layout_count: 1, // This needs to be 1 for compatibility with < 2.0
@@ -781,6 +784,24 @@ OSD.constants = {
781784
min: -55,
782785
max: 125
783786
},
787+
{
788+
name: 'ADSB_MAX_DISTANCE_WARNING',
789+
field: 'adsb_distance_warning',
790+
step: 1,
791+
unit: "meters",
792+
min: 1,
793+
max: 64000,
794+
min_version: '7.1.0',
795+
},
796+
{
797+
name: 'ADSB_MAX_DISTANCE_ALERT',
798+
field: 'adsb_distance_alert',
799+
step: 1,
800+
unit: "meters",
801+
min: 1,
802+
max: 64000,
803+
min_version: '7.1.0',
804+
},
784805
],
785806

786807
// All display fields, from every version, do not remove elements, only add!
@@ -1654,6 +1675,18 @@ OSD.constants = {
16541675
min_version: '6.0.0',
16551676
preview: FONT.symbol(SYM.GROUND_COURSE) + '245' + FONT.symbol(SYM.DEGREES)
16561677
},
1678+
{
1679+
name: 'ADSB_WARNING_MESSAGE',
1680+
id: 147,
1681+
min_version: '7.1.0',
1682+
preview: FONT.symbol(SYM.ADSB) + '19.25' + FONT.symbol(SYM.DIR_TO_HOME+1) + '2.75',
1683+
},
1684+
{
1685+
name: 'ADSB_INFO',
1686+
id: 148,
1687+
min_version: '7.1.0',
1688+
preview: FONT.symbol(SYM.ADSB) + '2',
1689+
},
16571690
{
16581691
name: 'CROSS TRACK ERROR',
16591692
id: 141,
@@ -2264,6 +2297,8 @@ OSD.msp = {
22642297
result.push16(OSD.data.alarms.imu_temp_alarm_max);
22652298
result.push16(OSD.data.alarms.baro_temp_alarm_min);
22662299
result.push16(OSD.data.alarms.baro_temp_alarm_max);
2300+
result.push16(OSD.data.alarms.adsb_distance_warning);
2301+
result.push16(OSD.data.alarms.adsb_distance_alert);
22672302
return result;
22682303
},
22692304

@@ -2283,6 +2318,8 @@ OSD.msp = {
22832318
OSD.data.alarms.imu_temp_alarm_max = alarms.read16();
22842319
OSD.data.alarms.baro_temp_alarm_min = alarms.read16();
22852320
OSD.data.alarms.baro_temp_alarm_max = alarms.read16();
2321+
OSD.data.alarms.adsb_distance_warning = alarms.read16();
2322+
OSD.data.alarms.adsb_distance_alert = alarms.read16();
22862323
},
22872324

22882325
encodePreferences: function() {

0 commit comments

Comments
 (0)