gr 1 week ago
parent
commit
9bcc45ae6d

+ 1 - 1
src/components/UeVideo.vue

@@ -55,7 +55,7 @@ const wsConnect = (sceneId, view_mode, token) => {
 		peerStreamRef.value.addEventListener('disConnected', () => (connectStatus.value = '连接断开'))
 		peerStreamRef.value.addEventListener('message', (e) => {
 			const message = JSON.parse(e.detail)
-			console.log('收到消息:', message)
+			// console.log('收到消息:', message)
 			proxy.$bus.emit('ueMsgReceived', message)
 			// connectStatus.value = ("收到消息:" + message);
 		})

+ 1 - 1
src/store/layout.js

@@ -18,7 +18,7 @@ const useLayoutStore = defineStore('layout', {
 		leftCollapse: false, // 左侧面板收缩状态
 		rightCollapse: false, // 左侧面板收缩状态
 		footerCollapse: false, // 底部收缩状态
-		sceneType: 'gis', // 场景类型 'ue' | 'gis'
+		sceneType: 'ue', // 场景类型 'ue' | 'gis'
 		mapScene: 'rs', // 底图类型 'light' | 'dark' | 'rs'
 		leftPanelType: 'default', // 左侧面板显示的内容
 		floatPanels: {

+ 10 - 2
src/utils/ueActions.js

@@ -182,11 +182,15 @@ export function initSceneDemo() {
 	})
 }
 
+let startSceneDemoBus = false
+let currentType
+
 /**
  * 场景演示
  * @param {'Near' | 'Yaw' | 'Electricity' | 'BreakInto' | 'Weather'} type
  */
 export function startSceneDemo(type) {
+	currentType = type
 	const setUav = (id) => {
 		sendMessage({
 			ModuleName: 'BluePrint',
@@ -212,12 +216,16 @@ export function startSceneDemo(type) {
 		},
 	})
 
+	if (startSceneDemoBus) return
+
+	startSceneDemoBus = true
+
 	bus.on('ueMsgReceived', async (message) => {
 		if (message.ModuleName === 'UavController' && message.ActionName === 'DemoSceneUpdateUavData') {
 			await wait(1000)
-			switch (type) {
+			switch (currentType) {
 				case 'Near': {
-					setUav('E5C734B81F9044FC99E54B361D67C487')
+					setUav('D0CECFB45F494D39ADABB5AF7A7DFEE7')
 					await wait(1000)
 					followUav('D0CECFB45F494D39ADABB5AF7A7DFEE7')
 					break

+ 92 - 42
src/views/home/cpns/FloatPanelTsjs.vue

@@ -34,8 +34,15 @@ import useLayoutStore from '@/store/layout'
 import usePanelStore from '@/store/panel'
 import useUeStore from '@/store/ue'
 import { getAssetsFile } from '@/utils/require'
-import { hexToRgb } from '@/utils/tools'
-import { clearAllShapes, startSceneDemo, toggleUav, initSceneDemo, setWeather } from '@/utils/ueActions'
+import { hexToRgb, wait } from '@/utils/tools'
+import {
+	clearAllShapes,
+	startSceneDemo,
+	toggleUav,
+	initSceneDemo,
+	renderShapes,
+	toggleTrackLine,
+} from '@/utils/ueActions'
 import { getCurrentInstance, onBeforeMount, onBeforeUnmount, reactive, ref, watch } from 'vue'
 import FloatPanelUav from './FloatPanelUav.vue'
 
@@ -55,12 +62,16 @@ const listData = ref([
 	{ label: '电量预警', value: 'Electricity', pic: 'dl', count: 0 },
 ])
 
-function handleDemo(item) {
+async function handleDemo(item) {
 	layoutStore.sceneLoading = true
+	// toggleUav(false)
+	uavInfoShow.value = false
+	Object.keys(alertInfo.value).forEach((k) => {
+		alertInfo.value[k].show = false
+	})
+	await wait(8000)
 	startSceneDemo(item.value)
 	panelStore.setWeather('Clear Skies')
-	uavInfoShow.value = false
-	alertInfo.value = {}
 }
 
 const options = reactive({
@@ -74,15 +85,13 @@ function toggleOption(target) {
 		if (!routeList.length) return
 		if (options.airLine) {
 			routeList.forEach((item) => {
-				const data = [
-					{
-						type: item.type,
-						shape: {
-							...JSON.parse(item.shape),
-							color: hexToRgb('#ffff00', 0.5),
-						},
+				const data = {
+					type: item.type,
+					shape: {
+						...JSON.parse(item.shape),
+						color: hexToRgb('#ffff00', 0.5),
 					},
-				]
+				}
 				renderShapes({
 					id: item.id,
 					data: data,
@@ -118,7 +127,8 @@ watch(
 	() => ueStore.sceneReady,
 	(val) => {
 		if (val) {
-			toggleUav(true)
+			// toggleUav(true)
+			toggleUav(false)
 		}
 	},
 	{ immediate: true }
@@ -145,9 +155,26 @@ const baseInfo = ref({
 	tel: '18000000000',
 })
 
-const alertInfo = ref({})
+const alertInfo = ref({
+	collision: {
+		show: false,
+	},
+	offCourse: {
+		show: false,
+	},
+	power: {
+		show: false,
+	},
+	area: {
+		show: false,
+	},
+	weather: {
+		show: false,
+	},
+})
 
 function handleCloseInfo() {
+	// toggleUav(true)
 	uavInfoShow.value = false
 	initSceneDemo()
 	panelStore.setWeather('Clear Skies')
@@ -165,57 +192,80 @@ onBeforeMount(() => {
 				baseInfo.value.battery = msg.Data.electricity
 				baseInfo.value.height = msg.Data.height.toFixed(2) + 'm'
 				baseInfo.value.velocity = msg.Data.speed.toFixed(2) + 'm/s'
-				if (msg.Data.overall !== 'SAFE') {
-					const { electricityWarning, weatherWarning, collision, noFlyZone, clearZone, nearstAircraft, routeDeviate } =
-						msg.Data.flightDataStatus
-					if (electricityWarning !== 'SAFE' && !('power' in alertInfo.value)) {
-						alertInfo.value.power = {}
-					}
-					if (weatherWarning !== 'SAFE' && !('weather' in alertInfo.value)) {
-						alertInfo.value.weather = {}
-					}
-					if ((nearstAircraft !== 'SAFE' || collision !== 'SAFE') && !('collision' in alertInfo.value)) {
-						alertInfo.value.collision = {}
-					}
-					if ((noFlyZone !== 'SAFE' || clearZone !== 'SAFE') && !('area' in alertInfo.value)) {
-						alertInfo.value.area = {}
-					}
-					if (routeDeviate === true && !('offCourse' in alertInfo.value)) {
-						alertInfo.value.offCourse = {}
-					}
+
+				const { electricityWarning, weatherWarning, collision, noFlyZone, clearZone, nearstAircraft, routeDeviate } =
+					msg.Data.flightDataStatus
+
+				if (electricityWarning !== 'SAFE' && electricityWarning !== '') {
+					alertInfo.value.power.show = true
+				} else {
+					alertInfo.value.power.show = false
 				}
+
+				if (weatherWarning !== 'SAFE' && weatherWarning !== '') {
+					alertInfo.value.weather.show = true
+				} else {
+					alertInfo.value.weather.show = false
+				}
+
+				if ((nearstAircraft !== 'SAFE' && nearstAircraft !== '') || (collision !== 'SAFE' && collision !== '')) {
+					alertInfo.value.collision.show = true
+				} else {
+					alertInfo.value.collision.show = false
+				}
+
+				if ((noFlyZone !== 'SAFE' && noFlyZone !== '') || (clearZone !== 'SAFE' && clearZone !== '')) {
+					alertInfo.value.area.show = true
+				} else {
+					alertInfo.value.area.show = false
+				}
+
+				if (routeDeviate === true) {
+					alertInfo.value.offCourse.show = true
+				} else {
+					alertInfo.value.offCourse.show = false
+				}
+
 				if (!uavInfoShow.value) uavInfoShow.value = true
 				if (layoutStore.sceneLoading) layoutStore.sceneLoading = false
+
 				break
 			}
 			case 'Weather': {
+				alertInfo.value.weather.show = true
 				alertInfo.value.weather.type = msg.Data.weather
-				panelStore.setWeather('Light Rain')
+				if (panelStore.weather !== 'Light Rain') panelStore.setWeather('Light Rain')
 				break
 			}
 			case 'BuildingDistance': {
+				alertInfo.value.collision.show = true
 				alertInfo.value.collision.distance = msg.Data.BuildingDistance
+					? Number(msg.Data.BuildingDistance).toFixed(2)
+					: 0
 				break
 			}
 			case 'Near': {
-				alertInfo.value.collision.distance = msg.Data.Data
+				alertInfo.value.collision.show = true
+				alertInfo.value.collision.distance = msg.Data.Data ? Number(msg.Data.Data).toFixed(2) : 0
 				break
 			}
 			case 'YawDistance': {
-				alertInfo.value.offCourse.distance = msg.Data.YawDistance.toFixed(2)
+				alertInfo.value.offCourse.show = true
+				alertInfo.value.offCourse.distance = msg.Data.YawDistance ? Number(msg.Data.YawDistance).toFixed(2) : 0
 				break
 			}
 			case 'BreakInto': {
+				alertInfo.value.area.show = true
 				alertInfo.value.area.name = msg.Data.name
+				alertInfo.value.area.type = msg.Data.name
 				break
 			}
 			case 'Electricity': {
+				alertInfo.value.power.show = true
 				const { battery, distance, flightDistance } = msg.Data
-				alertInfo.value.power = {
-					battery: battery,
-					estimation: flightDistance.toFixed(2),
-					distance: distance.toFixed(2),
-				}
+				alertInfo.value.power.battery = battery
+				alertInfo.value.power.estimation = flightDistance ? Number(flightDistance).toFixed(2) : 0
+				alertInfo.value.power.distance = distance ? Number(distance).toFixed(2) : 0
 				break
 			}
 		}
@@ -223,7 +273,7 @@ onBeforeMount(() => {
 })
 
 onBeforeUnmount(() => {
-	toggleUav(false)
+	// toggleUav(false)
 	clearAllShapes()
 	panelStore.setWeather('Clear Skies')
 	layoutStore.sceneLoading = false

+ 14 - 8
src/views/home/cpns/FloatPanelUav.vue

@@ -69,10 +69,7 @@
 
 			<ul class="alerts flex justify-center mt-5 mb-1">
 				<template v-for="item in alertTypes">
-					<li
-						v-if="Object.keys(alert).includes(item.id)"
-						:class="{ active: currentActive === item.id }"
-						@click="handlePickAlert(item)">
+					<li v-if="alert[item.id].show" :class="{ active: currentActive === item.id }" @click="handlePickAlert(item)">
 						<img
 							class="block"
 							:src="getAssetsFile(`buttons/${currentActive === item.id ? item.icon + '-h.png' : item.icon + '.png'}`)"
@@ -81,6 +78,7 @@
 					</li>
 				</template>
 			</ul>
+
 			<div class="alert-detail flex-1 flex flex-col justify-center items-center">
 				<div v-if="currentActive === 'collision'">
 					<span class="text-lg" v-if="alert.collision.distance === 0"> 警告:无人机发生碰撞,预警提示请关注 </span>
@@ -117,7 +115,7 @@
 					<span>低电量警告</span>
 					<div class="flex mt-2 items-center">
 						<ul class="battery flex-1">
-							<li v-for="item in Math.floor((alert.power.battery * 15) / 100)"></li>
+							<li v-for="item in Math.floor(((alert.power?.battery || 0) * 15) / 100)"></li>
 						</ul>
 						<div class="num-zh">
 							{{ alert.power.battery }}
@@ -188,22 +186,27 @@ const props = defineProps({
 		type: Object,
 		default: {
 			collision: {
+				show: true,
 				distance: 20,
 			},
 			offCourse: {
+				show: true,
 				distance: 20,
 				lineCode: 'MG22100WRJ',
 			},
 			power: {
+				show: true,
 				battery: 27,
 				distance: 310,
 				estimation: 720,
 			},
 			area: {
+				show: true,
 				type: '禁飞区',
 				name: '禁飞区11',
 			},
 			weather: {
+				show: true,
 				// type: '大风',
 				// type: '大雨',
 				type: '雾霾',
@@ -247,9 +250,12 @@ function handleClose() {
 watch(
 	() => props.alert,
 	(val) => {
-		const alertKeys = Object.keys(val)
-		hasAlert.value = alertKeys.length > 0
-		currentActive.value = alertTypes.value.find((i) => alertKeys.includes(i.id))?.id
+		hasAlert.value = Object.keys(val).findIndex((k) => val[k].show) > -1
+		if (!hasAlert.value) {
+			currentActive.value = null
+		} else {
+			currentActive.value = Object.keys(val).find((k) => val[k].show)
+		}
 	},
 	{ deep: true, immediate: true }
 )