From 03e37a32968236efc6e0bd8133a5d35af91f3602 Mon Sep 17 00:00:00 2001 From: error414 Date: Tue, 6 Aug 2024 20:20:58 +0200 Subject: [PATCH] adsb enhanced --- js/fc.js | 2 + js/msp/MSPHelper.js | 2 + locale/en/messages.json | 6 ++ package-lock.json | 7 +- tabs/gps.html | 17 ++++ tabs/gps.js | 166 ++++++++++++++++++++++------------------ 6 files changed, 123 insertions(+), 77 deletions(-) diff --git a/js/fc.js b/js/fc.js index 7d777543..f43296f6 100644 --- a/js/fc.js +++ b/js/fc.js @@ -282,6 +282,8 @@ var FC = { this.ADSB_VEHICLES = { vehiclesCount: 0, callsignLength: 0, + vehiclePacketCount: 0, + heartbeatPacketCount: 0, vehicles: [] }; diff --git a/js/msp/MSPHelper.js b/js/msp/MSPHelper.js index 894daf81..be92c128 100644 --- a/js/msp/MSPHelper.js +++ b/js/msp/MSPHelper.js @@ -196,6 +196,8 @@ var mspHelper = (function () { FC.ADSB_VEHICLES.vehicles = []; FC.ADSB_VEHICLES.vehiclesCount = 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++){ diff --git a/locale/en/messages.json b/locale/en/messages.json index bba5c8e2..97e0ed57 100644 --- a/locale/en/messages.json +++ b/locale/en/messages.json @@ -5935,5 +5935,11 @@ }, "gpsAssistnowLoadDataError": { "message": "Error loading AssistNow data." + }, + "adsbVehicleTotalMessages": { + "message": "Vehicle msgs" + }, + "adsbHeartbeatTotalMessages": { + "message": "Heartbeat msgs" } } diff --git a/package-lock.json b/package-lock.json index c1d2bca7..58f0d505 100644 --- a/package-lock.json +++ b/package-lock.json @@ -39,6 +39,7 @@ "@electron-forge/maker-rpm": "^7.2.0", "@electron-forge/maker-wix": "^7.2.0", "@electron-forge/maker-zip": "^7.2.0", + "@electron/packager": "^18.3.3", "electron": "28.1.4", "node-gyp": "^10.1.0" } @@ -535,9 +536,9 @@ } }, "node_modules/@electron/packager": { - "version": "18.3.2", - "resolved": "https://registry.npmjs.org/@electron/packager/-/packager-18.3.2.tgz", - "integrity": "sha512-orjylavppgIh24qkNpWm2B/LQUpCS/YLOoKoU+eMK/hJgIhShLDsusPIQzgUGVwNCichu8/zPAGfdQZXHG0gtw==", + "version": "18.3.3", + "resolved": "https://registry.npmjs.org/@electron/packager/-/packager-18.3.3.tgz", + "integrity": "sha512-hGXzwbUdxv49XvlYwlVPC6W6j6WaXUAzKkYyyTeiwdhxvHFMfQSEJxVHsQpqMFzZZ7wrr7iqiokOFZ/qkgEzUQ==", "dev": true, "dependencies": { "@electron/asar": "^3.2.1", diff --git a/tabs/gps.html b/tabs/gps.html index c217b7b9..138f9791 100644 --- a/tabs/gps.html +++ b/tabs/gps.html @@ -138,6 +138,23 @@ +
+
+
ADSB
+
+
+ + + + + + + + + +
0
0
+
+
diff --git a/tabs/gps.js b/tabs/gps.js index bf0dad53..e5d86861 100644 --- a/tabs/gps.js +++ b/tabs/gps.js @@ -30,26 +30,26 @@ TABS.gps.initialize = function (callback) { // 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 + 0: {icon: 'adsb_14.png', name: 'No info'}, // ADSB_EMITTER_TYPE_NO_INFO + 1: {icon: 'adsb_1.png', name: 'Light'}, // ADSB_EMITTER_TYPE_LIGHT + 2: {icon: 'adsb_1.png', name: 'Small'}, // ADSB_EMITTER_TYPE_SMALL + 3: {icon: 'adsb_2.png', name: 'Large'}, // ADSB_EMITTER_TYPE_LARGE + 4: {icon: 'adsb_14.png', name: 'High vortex large'}, // ADSB_EMITTER_TYPE_HIGH_VORTEX_LARGE + 5: {icon: 'adsb_5.png', name: 'Heavy'}, // ADSB_EMITTER_TYPE_HEAVY + 6: {icon: 'adsb_14.png', name: 'Manuv'}, // ADSB_EMITTER_TYPE_HIGHLY_MANUV + 7: {icon: 'adsb_13.png', name: 'Rotorcraft'}, // ADSB_EMITTER_TYPE_ROTOCRAFT + 8: {icon: 'adsb_14.png', name: 'Unassigned'}, // ADSB_EMITTER_TYPE_UNASSIGNED + 9: {icon: 'adsb_6.png', name: 'Glider'}, // ADSB_EMITTER_TYPE_GLIDER + 10:{icon: 'adsb_7.png', name: 'Lighter air'}, // ADSB_EMITTER_TYPE_LIGHTER_AIR + 11:{icon: 'adsb_15.png', name: 'Parachute'}, // ADSB_EMITTER_TYPE_PARACHUTE + 12:{icon: 'adsb_1.png', name: 'Ultra light'}, // ADSB_EMITTER_TYPE_ULTRA_LIGHT + 13:{icon: 'adsb_14.png', name: 'Unassigned 2'}, // ADSB_EMITTER_TYPE_UNASSIGNED2 + 14:{icon: 'adsb_8.png', name: 'UAV'}, // ADSB_EMITTER_TYPE_UAV + 15:{icon: 'adsb_14.png', name: 'Space'}, // ADSB_EMITTER_TYPE_SPACE + 16:{icon: 'adsb_14.png', name: 'Unassigned 3'}, // ADSB_EMITTER_TYPE_UNASSGINED3 + 17:{icon: 'adsb_9.png', name: 'Surface'}, // ADSB_EMITTER_TYPE_EMERGENCY_SURFACE + 18:{icon: 'adsb_10.png', name: 'Service surface'}, // ADSB_EMITTER_TYPE_SERVICE_SURFACE + 19:{icon: 'adsb_12.png', name: 'Pint obstacle'}, // ADSB_EMITTER_TYPE_POINT_OBSTACLE }; var loadChainer = new MSPChainerClass(); @@ -238,7 +238,7 @@ TABS.gps.initialize = function (callback) { + `lon: `+ (feature.get('data').lon / 10000000) + `
` + `ASL: `+ (feature.get('data').altCM ) / 100 + `m
` + `heading: `+ feature.get('data').headingDegrees + `°
` - + `type: `+ feature.get('data').emitterType + `` + + `type: `+ ADSB_VEHICLE_TYPE[feature.get('data').emitterType].name + `` ).open(); }else{ TABS.gps.toolboxAdsbVehicle.close(); @@ -258,10 +258,14 @@ TABS.gps.initialize = function (callback) { } 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 lon = FC.GPS_DATA.lon / 10000000; @@ -334,64 +338,64 @@ TABS.gps.initialize = function (callback) { iconGeometry.setCoordinates(center); } + } - if (semver.gte(FC.CONFIG.flightControllerVersion, "7.1.0")) { - MSP.send_message(MSPCodes.MSP2_ADSB_VEHICLE_LIST, false, false, function () { - //ADSB vehicles + function update_adsb_ui() { - if (vehiclesCursorInitialized) { - vehicleVectorSource.clear(); - } + if (vehiclesCursorInitialized) { + vehicleVectorSource.clear(); + } - for (let key in FC.ADSB_VEHICLES.vehicles) { - let vehicle = FC.ADSB_VEHICLES.vehicles[key]; + $('.adsbVehicleTotalMessages').html(FC.ADSB_VEHICLES.vehiclePacketCount); + $('.adsbHeartbeatTotalMessages').html(FC.ADSB_VEHICLES.heartbeatPacketCount); - if (!vehiclesCursorInitialized) { - vehiclesCursorInitialized = true; + for (let key in FC.ADSB_VEHICLES.vehicles) { + let vehicle = FC.ADSB_VEHICLES.vehicles[key]; - vehicleVectorSource = new ol.source.Vector({}); + if (!vehiclesCursorInitialized) { + vehiclesCursorInitialized = true; - let vehicleLayer = new ol.layer.Vector({ - source: vehicleVectorSource - }); + vehicleVectorSource = new ol.source.Vector({}); - mapHandler.addLayer(vehicleLayer); - } + let vehicleLayer = new ol.layer.Vector({ + source: vehicleVectorSource + }); - 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: path.join(__dirname, './../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); - } - } - }); + 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: path.join(__dirname, './../resources/adsb/' + ADSB_VEHICLE_TYPE[vehicle.emitterType].icon), + })), + 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); + } } } @@ -402,14 +406,28 @@ TABS.gps.initialize = function (callback) { 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. if (!SerialBackend.have_sensor(FC.CONFIG.activeSensors, 'gps')) { - update_ui(); + update_gps_ui(); return; } get_raw_gps_data(); + }, 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 () { serialPortHelper.set($port.val(), 'GPS', $baud.val()); features.reset();