1
0
Fork 0
mirror of https://github.com/iNavFlight/inav-configurator.git synced 2025-07-23 16:25:19 +03:00

Support ADSB

This commit is contained in:
error 2023-10-09 19:20:51 +02:00
parent a659b09bb2
commit 0b01651c7d
22 changed files with 221 additions and 1 deletions

View file

@ -3590,6 +3590,12 @@
"osdAlarmGFORCE_AXIS_MAX_HELP": {
"message": "The axes g force elements will start blinking when greater than this value"
},
"osdAlarmADSB_MAX_DISTANCE_WARNING": {
"message": "Distance in meters of ADSB aircraft that is displayed"
},
"osdAlarmADSB_MAX_DISTANCE_ALERT": {
"message": "Distance inside which ADSB data flashes for proximity warning"
},
"osd_current_alarm": {
"message": "Current (A)"
},
@ -3629,6 +3635,12 @@
"osd_rssi_dbm_alarm": {
"message": "CRSF RSSI dBm Alarm"
},
"osd_adsb_distance_warning": {
"message": "ADSB distance warning"
},
"osd_adsb_distance_alert": {
"message": "ADSB distance alert"
},
"osd_rssi_dbm_alarm_HELP": {
"message": "RSSI indicator blinks below this value. Range: [-130,0]. Zero disables this alarm."
},

View file

@ -29,6 +29,7 @@ var CONFIG,
MOTOR_DATA,
SERVO_DATA,
GPS_DATA,
ADSB_VEHICLES,
MISSION_PLANNER,
ANALOG,
ARMING_CONFIG,
@ -251,6 +252,12 @@ var FC = {
packetCount: 0
};
ADSB_VEHICLES = {
vehiclesCount: 0,
callsignLength: 0,
vehicles: []
};
MISSION_PLANNER = new WaypointCollection();
ANALOG = {

View file

@ -245,5 +245,7 @@ var MSPCodes = {
MSP2_INAV_EZ_TUNE: 0x2070,
MSP2_INAV_EZ_TUNE_SET: 0x2071,
MSP2_INAV_SELECT_MIXER_PROFILE: 0x2080
MSP2_INAV_SELECT_MIXER_PROFILE: 0x2080,
MSP2_ADSB_VEHICLE_LIST: 0x2090,
};

View file

@ -186,6 +186,35 @@ var mspHelper = (function (gui) {
GPS_DATA.eph = data.getUint16(16, true);
GPS_DATA.epv = data.getUint16(18, true);
break;
case MSPCodes.MSP2_ADSB_VEHICLE_LIST:
var byteOffsetCounter = 0;
ADSB_VEHICLES.vehicles = [];
ADSB_VEHICLES.vehiclesCount = data.getUint8(byteOffsetCounter++);
ADSB_VEHICLES.callsignLength = data.getUint8(byteOffsetCounter++);
for(i = 0; i < ADSB_VEHICLES.vehiclesCount; i++){
var vehicle = {callSignByteArray: [], callsign: "", icao: 0, lat: 0, lon: 0, alt: 0, heading: 0, ttl: 0, tslc: 0, emitterType: 0};
for(ii = 0; ii < ADSB_VEHICLES.callsignLength; ii++){
vehicle.callSignByteArray.push(data.getUint8(byteOffsetCounter++));
}
vehicle.callsign = (String.fromCharCode(...vehicle.callSignByteArray)).replace(/[^\x20-\x7E]/g, '');
vehicle.icao = data.getUint32(byteOffsetCounter, true); byteOffsetCounter += 4;
vehicle.lat = data.getInt32(byteOffsetCounter, true); byteOffsetCounter += 4;
vehicle.lon = data.getInt32(byteOffsetCounter, true); byteOffsetCounter += 4;
vehicle.altCM = data.getInt32(byteOffsetCounter, true); byteOffsetCounter += 4;
vehicle.headingDegrees = data.getUint16(byteOffsetCounter, true); byteOffsetCounter += 2;
vehicle.tslc = data.getUint8(byteOffsetCounter++);
vehicle.emitterType = data.getUint8(byteOffsetCounter++);
vehicle.ttl = data.getUint8(byteOffsetCounter++);
ADSB_VEHICLES.vehicles.push(vehicle);
}
break;
case MSPCodes.MSP_ATTITUDE:
SENSOR_DATA.kinematics[0] = data.getInt16(0, true) / 10.0; // x
SENSOR_DATA.kinematics[1] = data.getInt16(2, true) / 10.0; // y

BIN
resources/adsb/adsb_1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 953 B

BIN
resources/adsb/adsb_10.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 962 B

BIN
resources/adsb/adsb_11.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 982 B

BIN
resources/adsb/adsb_12.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2 KiB

BIN
resources/adsb/adsb_13.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
resources/adsb/adsb_14.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
resources/adsb/adsb_15.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1 KiB

BIN
resources/adsb/adsb_2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 981 B

BIN
resources/adsb/adsb_3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
resources/adsb/adsb_4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
resources/adsb/adsb_5.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
resources/adsb/adsb_6.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 821 B

BIN
resources/adsb/adsb_7.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
resources/adsb/adsb_8.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 919 B

BIN
resources/adsb/adsb_9.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 963 B

View file

@ -9,6 +9,32 @@ TABS.gps.initialize = function (callback) {
googleAnalytics.sendAppView('GPS');
}
// mavlink ADSB_EMITTER_TYPE
const ADSB_VEHICLE_TYPE = {
0: 'adsb_14.png', // ADSB_EMITTER_TYPE_NO_INFO
1: 'adsb_1.png', // ADSB_EMITTER_TYPE_LIGHT
2: 'adsb_1.png', // ADSB_EMITTER_TYPE_SMALL
3: 'adsb_2.png', // ADSB_EMITTER_TYPE_LARGE
4: 'adsb_14.png', // ADSB_EMITTER_TYPE_HIGH_VORTEX_LARGE
5: 'adsb_5.png', // ADSB_EMITTER_TYPE_HEAVY
6: 'adsb_14.png', // ADSB_EMITTER_TYPE_HIGHLY_MANUV
7: 'adsb_13.png', // ADSB_EMITTER_TYPE_ROTOCRAFT
8: 'adsb_14.png', // ADSB_EMITTER_TYPE_UNASSIGNED
9: 'adsb_6.png', // ADSB_EMITTER_TYPE_GLIDER
10: 'adsb_7.png', // ADSB_EMITTER_TYPE_LIGHTER_AIR
11: 'adsb_15.png', // ADSB_EMITTER_TYPE_PARACHUTE
12: 'adsb_1.png', // ADSB_EMITTER_TYPE_ULTRA_LIGHT
13: 'adsb_14.png', // ADSB_EMITTER_TYPE_UNASSIGNED2
14: 'adsb_8.png', // ADSB_EMITTER_TYPE_UAV
15: 'adsb_14.png', // ADSB_EMITTER_TYPE_SPACE
16: 'adsb_14.png', // ADSB_EMITTER_TYPE_UNASSGINED3
17: 'adsb_9.png', // ADSB_EMITTER_TYPE_EMERGENCY_SURFACE
18: 'adsb_10.png', // ADSB_EMITTER_TYPE_SERVICE_SURFACE
19: 'adsb_12.png', // ADSB_EMITTER_TYPE_POINT_OBSTACLE
};
var loadChainer = new MSPChainerClass();
var loadChain = [
@ -58,6 +84,10 @@ TABS.gps.initialize = function (callback) {
let iconGeometry;
let iconFeature;
let vehicleVectorSource;
let vehiclesCursorInitialized = false;
function process_html() {
localize();
@ -131,6 +161,36 @@ TABS.gps.initialize = function (callback) {
view: mapView
});
TABS.gps.toolboxAdsbVehicle = new jBox('Mouse', {
position: {
x: "right",
y: "bottom"
},
offset: {
x: -5,
y: 20,
},
});
mapHandler.on('pointermove', function(evt) {
var feature = mapHandler.forEachFeatureAtPixel(mapHandler.getEventPixel(evt.originalEvent), function(feature, layer) {
return feature;
});
if (feature) {
TABS.gps.toolboxAdsbVehicle.setContent(
`icao: <strong>` + feature.get('name') + `</strong><br />`
+ `lat: <strong>`+ (feature.get('data').lat / 10000000) + `</strong><br />`
+ `lon: <strong>`+ (feature.get('data').lon / 10000000) + `</strong><br />`
+ `ASL: <strong>`+ (feature.get('data').altCM ) / 100 + `m</strong><br />`
+ `heading: <strong>`+ feature.get('data').headingDegrees + `°</strong><br />`
+ `type: <strong>`+ feature.get('data').emitterType + `</strong>`
).open();
}else{
TABS.gps.toolboxAdsbVehicle.close();
}
});
let center = ol.proj.fromLonLat([0, 0]);
mapView.setCenter(center);
mapView.setZoom(2);
@ -221,6 +281,66 @@ TABS.gps.initialize = function (callback) {
iconGeometry.setCoordinates(center);
}
if (semver.gte(CONFIG.flightControllerVersion, "7.1.0")) {
MSP.send_message(MSPCodes.MSP2_ADSB_VEHICLE_LIST, false, false, function () {
//ADSB vehicles
if (vehiclesCursorInitialized) {
vehicleVectorSource.clear();
}
for (let key in ADSB_VEHICLES.vehicles) {
let vehicle = ADSB_VEHICLES.vehicles[key];
if (!vehiclesCursorInitialized) {
vehiclesCursorInitialized = true;
vehicleVectorSource = new ol.source.Vector({});
let vehicleLayer = new ol.layer.Vector({
source: vehicleVectorSource
});
mapHandler.addLayer(vehicleLayer);
}
if (vehicle.lat > 0 && vehicle.lon > 0 && vehicle.ttl > 0) {
let vehicleIconStyle = new ol.style.Style({
image: new ol.style.Icon(({
opacity: 1,
rotation: vehicle.headingDegrees * (Math.PI / 180),
scale: 0.8,
anchor: [0.5, 0.5],
src: '../resources/adsb/' + ADSB_VEHICLE_TYPE[vehicle.emitterType],
})),
text: new ol.style.Text(({
text: vehicle.callsign,
textAlign: 'center',
textBaseline: "bottom",
offsetY: +40,
padding: [2, 2, 2, 2],
backgroundFill: '#444444',
fill: new ol.style.Fill({color: '#ffffff'}),
})),
});
let iconGeometry = new ol.geom.Point(ol.proj.fromLonLat([vehicle.lon / 10000000, vehicle.lat / 10000000]));
let iconFeature = new ol.Feature({
geometry: iconGeometry,
name: vehicle.callsign,
type: 'adsb',
data: vehicle,
});
iconFeature.setStyle(vehicleIconStyle);
vehicleVectorSource.addFeature(iconFeature);
}
}
});
}
}
/*
@ -271,4 +391,7 @@ TABS.gps.initialize = function (callback) {
TABS.gps.cleanup = function (callback) {
if (callback) callback();
if(TABS.gps.toolboxAdsbVehicle){
TABS.gps.toolboxAdsbVehicle.close();
}
};

View file

@ -242,6 +242,16 @@
<input id="osd_gforce_axis_alarm_max" data-setting="osd_gforce_axis_alarm_max" data-setting-multiplier="1" type="number" data-step="0.1" />
<span data-i18n="osd_gforce_axis_alarm_max"></span>
</label>
<div for="adsb_distance_warning" class="helpicon cf_tip" data-i18n_title="osdAlarmADSB_MAX_DISTANCE_WARNING"></div>
<label for="adsb_distance_warning">
<input id="adsb_distance_warning" data-setting="osd_adsb_distance_warning" data-unit="m" data-setting-multiplier="1" type="number" data-step="1" />
<span data-i18n="osd_adsb_distance_warning"></span>
</label>
<div for="adsb_distance_alert" class="helpicon cf_tip" data-i18n_title="osdAlarmADSB_MAX_DISTANCE_ALERT"></div>
<label for="adsb_distance_alert">
<input id="adsb_distance_alert" data-setting="osd_adsb_distance_alert" data-unit="m" data-setting-multiplier="1" type="number" data-step="1" />
<span data-i18n="osd_adsb_distance_alert"></span>
</label>
</div>
</div>
<div class="gui_box grey dji-hd-container" id="dji_settings">

View file

@ -114,6 +114,7 @@ SYM.FLIGHT_DIST_REMAINING = 0x167;
SYM.GROUND_COURSE = 0xDC;
SYM.ALERT = 0xDD;
SYM.CROSS_TRACK_ERROR = 0xFC;
SYM.ADSB = 0xFD;
SYM.PAN_SERVO_IS_OFFSET_L = 0x1C7;
SYM.ODOMETER = 0X168;
SYM.PILOT_LOGO_SML_L = 0x1D5;
@ -480,6 +481,8 @@ OSD.initData = function () {
imu_temp_alarm_max: null,
baro_temp_alarm_min: null,
baro_temp_alarm_max: null,
adsb_distance_warning: null,
adsb_distance_alert: null,
},
layouts: [],
layout_count: 1, // This needs to be 1 for compatibility with < 2.0
@ -781,6 +784,24 @@ OSD.constants = {
min: -55,
max: 125
},
{
name: 'ADSB_MAX_DISTANCE_WARNING',
field: 'adsb_distance_warning',
step: 1,
unit: "meters",
min: 1,
max: 64000,
min_version: '7.1.0',
},
{
name: 'ADSB_MAX_DISTANCE_ALERT',
field: 'adsb_distance_alert',
step: 1,
unit: "meters",
min: 1,
max: 64000,
min_version: '7.1.0',
},
],
// All display fields, from every version, do not remove elements, only add!
@ -1654,6 +1675,18 @@ OSD.constants = {
min_version: '6.0.0',
preview: FONT.symbol(SYM.GROUND_COURSE) + '245' + FONT.symbol(SYM.DEGREES)
},
{
name: 'ADSB_WARNING_MESSAGE',
id: 147,
min_version: '7.1.0',
preview: FONT.symbol(SYM.ADSB) + '19.25' + FONT.symbol(SYM.DIR_TO_HOME+1) + '2.75',
},
{
name: 'ADSB_INFO',
id: 148,
min_version: '7.1.0',
preview: FONT.symbol(SYM.ADSB) + '2',
},
{
name: 'CROSS TRACK ERROR',
id: 141,
@ -2264,6 +2297,8 @@ OSD.msp = {
result.push16(OSD.data.alarms.imu_temp_alarm_max);
result.push16(OSD.data.alarms.baro_temp_alarm_min);
result.push16(OSD.data.alarms.baro_temp_alarm_max);
result.push16(OSD.data.alarms.adsb_distance_warning);
result.push16(OSD.data.alarms.adsb_distance_alert);
return result;
},
@ -2283,6 +2318,8 @@ OSD.msp = {
OSD.data.alarms.imu_temp_alarm_max = alarms.read16();
OSD.data.alarms.baro_temp_alarm_min = alarms.read16();
OSD.data.alarms.baro_temp_alarm_max = alarms.read16();
OSD.data.alarms.adsb_distance_warning = alarms.read16();
OSD.data.alarms.adsb_distance_alert = alarms.read16();
},
encodePreferences: function() {