adsb enhanced

pull/2165/head
error414 2 months ago
parent 3226f68fc1
commit 03e37a3296

@ -282,6 +282,8 @@ var FC = {
this.ADSB_VEHICLES = { this.ADSB_VEHICLES = {
vehiclesCount: 0, vehiclesCount: 0,
callsignLength: 0, callsignLength: 0,
vehiclePacketCount: 0,
heartbeatPacketCount: 0,
vehicles: [] vehicles: []
}; };

@ -196,6 +196,8 @@ var mspHelper = (function () {
FC.ADSB_VEHICLES.vehicles = []; FC.ADSB_VEHICLES.vehicles = [];
FC.ADSB_VEHICLES.vehiclesCount = data.getUint8(byteOffsetCounter++); FC.ADSB_VEHICLES.vehiclesCount = data.getUint8(byteOffsetCounter++);
FC.ADSB_VEHICLES.callsignLength = data.getUint8(byteOffsetCounter++); FC.ADSB_VEHICLES.callsignLength = data.getUint8(byteOffsetCounter++);
FC.ADSB_VEHICLES.vehiclePacketCount = data.getUint32(byteOffsetCounter, true); byteOffsetCounter += 4;
FC.ADSB_VEHICLES.heartbeatPacketCount = data.getUint32(byteOffsetCounter, true); byteOffsetCounter += 4;
for(i = 0; i < FC.ADSB_VEHICLES.vehiclesCount; i++){ for(i = 0; i < FC.ADSB_VEHICLES.vehiclesCount; i++){

@ -5935,5 +5935,11 @@
}, },
"gpsAssistnowLoadDataError": { "gpsAssistnowLoadDataError": {
"message": "Error loading AssistNow data." "message": "Error loading AssistNow data."
},
"adsbVehicleTotalMessages": {
"message": "Vehicle msgs"
},
"adsbHeartbeatTotalMessages": {
"message": "Heartbeat msgs"
} }
} }

7
package-lock.json generated

@ -39,6 +39,7 @@
"@electron-forge/maker-rpm": "^7.2.0", "@electron-forge/maker-rpm": "^7.2.0",
"@electron-forge/maker-wix": "^7.2.0", "@electron-forge/maker-wix": "^7.2.0",
"@electron-forge/maker-zip": "^7.2.0", "@electron-forge/maker-zip": "^7.2.0",
"@electron/packager": "^18.3.3",
"electron": "28.1.4", "electron": "28.1.4",
"node-gyp": "^10.1.0" "node-gyp": "^10.1.0"
} }
@ -535,9 +536,9 @@
} }
}, },
"node_modules/@electron/packager": { "node_modules/@electron/packager": {
"version": "18.3.2", "version": "18.3.3",
"resolved": "https://registry.npmjs.org/@electron/packager/-/packager-18.3.2.tgz", "resolved": "https://registry.npmjs.org/@electron/packager/-/packager-18.3.3.tgz",
"integrity": "sha512-orjylavppgIh24qkNpWm2B/LQUpCS/YLOoKoU+eMK/hJgIhShLDsusPIQzgUGVwNCichu8/zPAGfdQZXHG0gtw==", "integrity": "sha512-hGXzwbUdxv49XvlYwlVPC6W6j6WaXUAzKkYyyTeiwdhxvHFMfQSEJxVHsQpqMFzZZ7wrr7iqiokOFZ/qkgEzUQ==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@electron/asar": "^3.2.1", "@electron/asar": "^3.2.1",

@ -138,6 +138,23 @@
</table> </table>
</div> </div>
</div> </div>
<div class="gui_box grey adsb_info_block">
<div class="gui_box_titlebar">
<div class="spacer_box_title">ADSB</div>
</div>
<div class="spacer_box GPS_stat">
<table class="cf_table">
<tr>
<td style="width: 85px" data-i18n="adsbVehicleTotalMessages"></td>
<td class="adsbVehicleTotalMessages">0</td>
</tr>
<tr>
<td style="width: 85px" data-i18n="adsbHeartbeatTotalMessages"></td>
<td class="adsbHeartbeatTotalMessages">0</td>
</tr>
</table>
</div>
</div>
</div> </div>
</div> </div>

@ -30,26 +30,26 @@ TABS.gps.initialize = function (callback) {
// mavlink ADSB_EMITTER_TYPE // mavlink ADSB_EMITTER_TYPE
const ADSB_VEHICLE_TYPE = { const ADSB_VEHICLE_TYPE = {
0: 'adsb_14.png', // ADSB_EMITTER_TYPE_NO_INFO 0: {icon: 'adsb_14.png', name: 'No info'}, // ADSB_EMITTER_TYPE_NO_INFO
1: 'adsb_1.png', // ADSB_EMITTER_TYPE_LIGHT 1: {icon: 'adsb_1.png', name: 'Light'}, // ADSB_EMITTER_TYPE_LIGHT
2: 'adsb_1.png', // ADSB_EMITTER_TYPE_SMALL 2: {icon: 'adsb_1.png', name: 'Small'}, // ADSB_EMITTER_TYPE_SMALL
3: 'adsb_2.png', // ADSB_EMITTER_TYPE_LARGE 3: {icon: 'adsb_2.png', name: 'Large'}, // ADSB_EMITTER_TYPE_LARGE
4: 'adsb_14.png', // ADSB_EMITTER_TYPE_HIGH_VORTEX_LARGE 4: {icon: 'adsb_14.png', name: 'High vortex large'}, // ADSB_EMITTER_TYPE_HIGH_VORTEX_LARGE
5: 'adsb_5.png', // ADSB_EMITTER_TYPE_HEAVY 5: {icon: 'adsb_5.png', name: 'Heavy'}, // ADSB_EMITTER_TYPE_HEAVY
6: 'adsb_14.png', // ADSB_EMITTER_TYPE_HIGHLY_MANUV 6: {icon: 'adsb_14.png', name: 'Manuv'}, // ADSB_EMITTER_TYPE_HIGHLY_MANUV
7: 'adsb_13.png', // ADSB_EMITTER_TYPE_ROTOCRAFT 7: {icon: 'adsb_13.png', name: 'Rotorcraft'}, // ADSB_EMITTER_TYPE_ROTOCRAFT
8: 'adsb_14.png', // ADSB_EMITTER_TYPE_UNASSIGNED 8: {icon: 'adsb_14.png', name: 'Unassigned'}, // ADSB_EMITTER_TYPE_UNASSIGNED
9: 'adsb_6.png', // ADSB_EMITTER_TYPE_GLIDER 9: {icon: 'adsb_6.png', name: 'Glider'}, // ADSB_EMITTER_TYPE_GLIDER
10: 'adsb_7.png', // ADSB_EMITTER_TYPE_LIGHTER_AIR 10:{icon: 'adsb_7.png', name: 'Lighter air'}, // ADSB_EMITTER_TYPE_LIGHTER_AIR
11: 'adsb_15.png', // ADSB_EMITTER_TYPE_PARACHUTE 11:{icon: 'adsb_15.png', name: 'Parachute'}, // ADSB_EMITTER_TYPE_PARACHUTE
12: 'adsb_1.png', // ADSB_EMITTER_TYPE_ULTRA_LIGHT 12:{icon: 'adsb_1.png', name: 'Ultra light'}, // ADSB_EMITTER_TYPE_ULTRA_LIGHT
13: 'adsb_14.png', // ADSB_EMITTER_TYPE_UNASSIGNED2 13:{icon: 'adsb_14.png', name: 'Unassigned 2'}, // ADSB_EMITTER_TYPE_UNASSIGNED2
14: 'adsb_8.png', // ADSB_EMITTER_TYPE_UAV 14:{icon: 'adsb_8.png', name: 'UAV'}, // ADSB_EMITTER_TYPE_UAV
15: 'adsb_14.png', // ADSB_EMITTER_TYPE_SPACE 15:{icon: 'adsb_14.png', name: 'Space'}, // ADSB_EMITTER_TYPE_SPACE
16: 'adsb_14.png', // ADSB_EMITTER_TYPE_UNASSGINED3 16:{icon: 'adsb_14.png', name: 'Unassigned 3'}, // ADSB_EMITTER_TYPE_UNASSGINED3
17: 'adsb_9.png', // ADSB_EMITTER_TYPE_EMERGENCY_SURFACE 17:{icon: 'adsb_9.png', name: 'Surface'}, // ADSB_EMITTER_TYPE_EMERGENCY_SURFACE
18: 'adsb_10.png', // ADSB_EMITTER_TYPE_SERVICE_SURFACE 18:{icon: 'adsb_10.png', name: 'Service surface'}, // ADSB_EMITTER_TYPE_SERVICE_SURFACE
19: 'adsb_12.png', // ADSB_EMITTER_TYPE_POINT_OBSTACLE 19:{icon: 'adsb_12.png', name: 'Pint obstacle'}, // ADSB_EMITTER_TYPE_POINT_OBSTACLE
}; };
var loadChainer = new MSPChainerClass(); var loadChainer = new MSPChainerClass();
@ -238,7 +238,7 @@ TABS.gps.initialize = function (callback) {
+ `lon: <strong>`+ (feature.get('data').lon / 10000000) + `</strong><br />` + `lon: <strong>`+ (feature.get('data').lon / 10000000) + `</strong><br />`
+ `ASL: <strong>`+ (feature.get('data').altCM ) / 100 + `m</strong><br />` + `ASL: <strong>`+ (feature.get('data').altCM ) / 100 + `m</strong><br />`
+ `heading: <strong>`+ feature.get('data').headingDegrees + `°</strong><br />` + `heading: <strong>`+ feature.get('data').headingDegrees + `°</strong><br />`
+ `type: <strong>`+ feature.get('data').emitterType + `</strong>` + `type: <strong>`+ ADSB_VEHICLE_TYPE[feature.get('data').emitterType].name + `</strong>`
).open(); ).open();
}else{ }else{
TABS.gps.toolboxAdsbVehicle.close(); TABS.gps.toolboxAdsbVehicle.close();
@ -258,10 +258,14 @@ TABS.gps.initialize = function (callback) {
} }
function get_gpsstatistics_data() { function get_gpsstatistics_data() {
MSP.send_message(MSPCodes.MSP_GPSSTATISTICS, false, false, update_ui); MSP.send_message(MSPCodes.MSP_GPSSTATISTICS, false, false, update_gps_ui);
} }
function update_ui() { function get_raw_adsb_data() {
MSP.send_message(MSPCodes.MSP2_ADSB_VEHICLE_LIST, false, false, update_adsb_ui);
}
function update_gps_ui() {
let lat = FC.GPS_DATA.lat / 10000000; let lat = FC.GPS_DATA.lat / 10000000;
let lon = FC.GPS_DATA.lon / 10000000; let lon = FC.GPS_DATA.lon / 10000000;
@ -334,64 +338,64 @@ TABS.gps.initialize = function (callback) {
iconGeometry.setCoordinates(center); iconGeometry.setCoordinates(center);
} }
}
if (semver.gte(FC.CONFIG.flightControllerVersion, "7.1.0")) { function update_adsb_ui() {
MSP.send_message(MSPCodes.MSP2_ADSB_VEHICLE_LIST, false, false, function () {
//ADSB vehicles
if (vehiclesCursorInitialized) { if (vehiclesCursorInitialized) {
vehicleVectorSource.clear(); vehicleVectorSource.clear();
} }
for (let key in FC.ADSB_VEHICLES.vehicles) { $('.adsbVehicleTotalMessages').html(FC.ADSB_VEHICLES.vehiclePacketCount);
let vehicle = FC.ADSB_VEHICLES.vehicles[key]; $('.adsbHeartbeatTotalMessages').html(FC.ADSB_VEHICLES.heartbeatPacketCount);
if (!vehiclesCursorInitialized) { for (let key in FC.ADSB_VEHICLES.vehicles) {
vehiclesCursorInitialized = true; let vehicle = FC.ADSB_VEHICLES.vehicles[key];
vehicleVectorSource = new ol.source.Vector({}); if (!vehiclesCursorInitialized) {
vehiclesCursorInitialized = true;
let vehicleLayer = new ol.layer.Vector({ vehicleVectorSource = new ol.source.Vector({});
source: vehicleVectorSource
});
mapHandler.addLayer(vehicleLayer); let vehicleLayer = new ol.layer.Vector({
} source: vehicleVectorSource
});
if (vehicle.lat != 0 && vehicle.lon != 0 && vehicle.ttl > 0) { mapHandler.addLayer(vehicleLayer);
let vehicleIconStyle = new ol.style.Style({ }
image: new ol.style.Icon(({
opacity: 1, if (vehicle.lat != 0 && vehicle.lon != 0 && vehicle.ttl > 0) {
rotation: vehicle.headingDegrees * (Math.PI / 180), let vehicleIconStyle = new ol.style.Style({
scale: 0.8, image: new ol.style.Icon(({
anchor: [0.5, 0.5], opacity: 1,
src: path.join(__dirname, './../resources/adsb/' + ADSB_VEHICLE_TYPE[vehicle.emitterType]), rotation: vehicle.headingDegrees * (Math.PI / 180),
})), scale: 0.8,
text: new ol.style.Text(({ anchor: [0.5, 0.5],
text: vehicle.callsign, src: path.join(__dirname, './../resources/adsb/' + ADSB_VEHICLE_TYPE[vehicle.emitterType].icon),
textAlign: 'center', })),
textBaseline: "bottom", text: new ol.style.Text(({
offsetY: +40, text: vehicle.callsign,
padding: [2, 2, 2, 2], textAlign: 'center',
backgroundFill: '#444444', textBaseline: "bottom",
fill: new ol.style.Fill({color: '#ffffff'}), 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, let iconGeometry = new ol.geom.Point(ol.proj.fromLonLat([vehicle.lon / 10000000, vehicle.lat / 10000000]));
type: 'adsb', let iconFeature = new ol.Feature({
data: vehicle, geometry: iconGeometry,
}); name: vehicle.callsign,
type: 'adsb',
iconFeature.setStyle(vehicleIconStyle); data: vehicle,
vehicleVectorSource.addFeature(iconFeature); });
}
} iconFeature.setStyle(vehicleIconStyle);
}); vehicleVectorSource.addFeature(iconFeature);
}
} }
} }
@ -402,14 +406,28 @@ TABS.gps.initialize = function (callback) {
interval.add('gps_pull', function gps_update() { interval.add('gps_pull', function gps_update() {
// avoid usage of the GPS commands until a GPS sensor is detected for targets that are compiled without GPS support. // avoid usage of the GPS commands until a GPS sensor is detected for targets that are compiled without GPS support.
if (!SerialBackend.have_sensor(FC.CONFIG.activeSensors, 'gps')) { if (!SerialBackend.have_sensor(FC.CONFIG.activeSensors, 'gps')) {
update_ui(); update_gps_ui();
return; return;
} }
get_raw_gps_data(); get_raw_gps_data();
}, 200); }, 200);
if (semver.gte(FC.CONFIG.flightControllerVersion, "8.0.0")) {
$('.adsb_info_block').hide();
mspHelper.loadSerialPorts(function () {
for(var i in FC.SERIAL_CONFIG.ports){
if(FC.SERIAL_CONFIG.ports[i].functions && FC.SERIAL_CONFIG.ports[i].functions.includes("TELEMETRY_MAVLINK")){
$('.adsb_info_block').show();
interval.add('adsb_pull', get_raw_adsb_data, 200);
break;
}
}
});
}
$('a.save').on('click', function () { $('a.save').on('click', function () {
serialPortHelper.set($port.val(), 'GPS', $baud.val()); serialPortHelper.set($port.val(), 'GPS', $baud.val());
features.reset(); features.reset();

Loading…
Cancel
Save