From 7d0d0cbc81de9087173dbee4e366c15f347d38b9 Mon Sep 17 00:00:00 2001
From: shuishen <1109946754@qq.com>
Date: Thu, 17 Apr 2025 20:45:19 +0800
Subject: [PATCH] Merge branch 'master' of http://139.196.74.78:10010/r/drone/command-center-dashboard

---
 src/hooks/controlDrone/useManualControl.js               |  134 ++++++++++++++++++++++++++++++++++----------
 src/mqtt/index.js                                        |    2 
 src/api/drc.js                                           |    9 +++
 src/components/CurrentTaskDetails/TaskDetailsRight.vue   |    4 +
 src/components/CurrentTaskDetails/CurrentTaskDetails.vue |   21 +++++--
 5 files changed, 131 insertions(+), 39 deletions(-)

diff --git a/src/api/drc.js b/src/api/drc.js
index 674f8c7..9706b3f 100644
--- a/src/api/drc.js
+++ b/src/api/drc.js
@@ -30,6 +30,15 @@
   })
 }
 
+// 无人控制
+export async function updateDroneQualityApi (data) {
+  return request({
+    url: '/drone-device-core/manage/api/v1/live/streams/update',
+    method: 'post',
+    data,
+  })
+}
+
 // 无人机退出控制
 export async function exitController(data) {
   return request({
diff --git a/src/components/CurrentTaskDetails/CurrentTaskDetails.vue b/src/components/CurrentTaskDetails/CurrentTaskDetails.vue
index 8d51880..c93ba94 100644
--- a/src/components/CurrentTaskDetails/CurrentTaskDetails.vue
+++ b/src/components/CurrentTaskDetails/CurrentTaskDetails.vue
@@ -18,8 +18,8 @@
 			<TaskDetailsRight v-if="isAutoControl" />
 			<template v-else>
 				<TaskDetailsHead />
+				<TaskDetailsLeft />
 			</template>
-			<TaskDetailsLeft />
 
 			<!--	控制面板,里面有方法需要立即执行,不可用v-if		-->
 			<ControlPanel v-show="!isAutoControl" />
@@ -45,7 +45,7 @@
 import amplifyImg from '@/assets/images/taskManagement/taskIntermediateContent/amplifyImg.png'
 import { ElMessage } from 'element-plus'
 import EventBus from '@/event-bus'
-
+import { updateDroneQualityApi } from '@/api/drc'
 
 const isAutoControl = ref(true)
 const lineQuality = ref(1) //1流畅,2标清
@@ -67,7 +67,7 @@
 const currentLiveUrl = ref('')
 const isTakeOff = ref(false)
 const isMaxMap = ref(false)
-let droneWebSocket  //WS实例
+let droneWebSocket //WS实例
 
 // 机巢直播
 const getDeviceLiveUrl = async () => {
@@ -75,10 +75,19 @@
 	currentLiveUrl.value = res.data.data.rtcs_url
 }
 
-// 无人机直播画质切换
-const changeLineQuality = async () => {
+const video_id = ref('')
+
+// 获取无人机直播url
+async function getDroneLiveUrl() {
 	const res = await liveStart(droneSn.value, lineQuality.value)
 	currentLiveUrl.value = res.data.data.rtcs_url
+	video_id.value = res.data.data.video_id
+}
+
+// 无人机直播画质切换
+const changeLineQuality = async () => {
+	const res = await updateDroneQualityApi({ video_id: video_id.value, video_quality: lineQuality.value })
+	ElMessage.success('切换画质成功')
 }
 
 // 设置当前直播地址
@@ -89,7 +98,7 @@
 	// 如果还是之前的状态,不切换
 	if (isTakeOff.value === currentIsTakeOff) return
 	isTakeOff.value = currentIsTakeOff
-	isTakeOff.value ? await changeLineQuality() : await getDeviceLiveUrl()
+	isTakeOff.value ? await getDroneLiveUrl() : await getDeviceLiveUrl()
 }
 
 // 获取任务详情获取航线文件
diff --git a/src/components/CurrentTaskDetails/TaskDetailsRight.vue b/src/components/CurrentTaskDetails/TaskDetailsRight.vue
index 32105be..61b2189 100644
--- a/src/components/CurrentTaskDetails/TaskDetailsRight.vue
+++ b/src/components/CurrentTaskDetails/TaskDetailsRight.vue
@@ -54,6 +54,10 @@
 	gap: 25px 0;
 	align-items: center;
 
+	.manualControl{
+		background: transparent !important;
+	}
+
 	.titleImg {
 		width: 224px;
 		height: 131px;
diff --git a/src/hooks/controlDrone/useManualControl.js b/src/hooks/controlDrone/useManualControl.js
index f1295a2..4ccce9f 100644
--- a/src/hooks/controlDrone/useManualControl.js
+++ b/src/hooks/controlDrone/useManualControl.js
@@ -36,10 +36,18 @@
 	}
 
 export function useManualControl(mqttState,deviceTopicInfo, isCurrentFlightController,paramsRef) {
-	const activeCodeKey = ref(null)
+	let activeCodeKey = null
 	let genPortOne = true //是一代机场
 	const mqttHooks = useMqtt(mqttState,deviceTopicInfo)
 	let seq = 0
+	const keysPressed = [
+		{key: 'KeyQ', value: false},
+		{key: 'KeyW', value: false},
+		{key: 'KeyE', value: false},
+		{key: 'KeyA', value: false},
+		{key: 'KeyS', value: false},
+		{key: 'KeyD', value: false},
+	]
 
 	function handlePublish(params) {
 		const body = {
@@ -50,7 +58,7 @@
 		myInterval = setInterval(() => {
 			body.data.seq = seq++
 			seq++
-			window.console.log('keyCode>>>>', activeCodeKey.value, body)
+			window.console.log('keyCode>>>>', activeCodeKey, body)
 			mqttHooks?.publishMqtt(deviceTopicInfo.pubTopic, body, { qos: 0 })
 		}, 50)
 	}
@@ -70,84 +78,132 @@
 		const HEIGHT = genPortOne ? 5 : 500; //  check
 		const W_SPEED = genPortOne ? 20 : 500 // 机头角速度
 
+
+		let arrList = []
+		if (genPortOne) {
+			arrList = [
+				{ Key: 'KeyQ', category: 'w', value: -W_SPEED },{ Key: 'KeyW',category: 'x', value: SPEED },
+				{ Key: 'KeyE', category: 'w', value: W_SPEED},{ Key: 'KeyA', category: 'y', value: -SPEED},
+				{ Key: 'KeyS', category: 'x', value: -SPEED},{ Key: 'KeyD', category: 'y', value: SPEED}
+			]
+		} else {
+			arrList = [
+				{ Key: 'KeyQ', category: 'yaw', value: 1024-W_SPEED },{ Key: 'KeyW',category: 'pitch', value: 1024+SPEED },
+				{ Key: 'KeyE', category: 'yaw', value: 1024+W_SPEED},{ Key: 'KeyA', category: 'roll', value: 1024-SPEED},
+				{ Key: 'KeyS', category: 'pitch', value: 1024-SPEED},{ Key: 'KeyD', category: 'roll', value: 1024+SPEED}
+			]
+		}
+		let resultObj = []
+		let resultArr = []
+		// 遍历被选中得数组
+		if (keyCode === 'assemblyKeys') {
+			keysPressed.map(key => {
+				if (key.value) {
+					let result = arrList.filter(item =>item.Key===key.key)
+					resultObj.push(result[0])
+				}
+			})
+			// 相同属性值进行计算
+			resultArr = resultObj.reduce((acc, item) => {
+				// 如果累加器中已经有这个 category,则累加 value
+				if (acc[item.category]) {
+					// acc[item.category] += item.value;
+					acc[item.category] = genPortOne ? 0 : 1024;
+				} else {
+					// 否则,初始化这个 category 的 value
+					acc[item.category] = item.value;
+				}
+				return acc;
+			}, {});
+		}
+
 		seq = 0
 		switch (keyCode) {
+			case 'assemblyKeys': // 针对Q W E A S D 组合键
+				if (activeCodeKey === keyCode) return
+				handlePublish(resultArr)
+				activeCodeKey = keyCode
+				break
 			case 'KeyQ':
-				if (activeCodeKey.value === keyCode) return
+				if (activeCodeKey === keyCode) return
 				let objQ = { yaw: 1024-W_SPEED }
 				if (genPortOne) {objQ = {w: -W_SPEED}}
 				handlePublish(objQ)
-				activeCodeKey.value = keyCode
+				activeCodeKey = keyCode
 				break
 			case 'KeyW':
-				if (activeCodeKey.value === keyCode) return
+				if (activeCodeKey === keyCode) return
 				let objW = { pitch: 1024+SPEED }
 				if (genPortOne) {objW = {x: SPEED}}
 				handlePublish(objW)
-				activeCodeKey.value = keyCode
+				activeCodeKey = keyCode
 				break
 			case 'KeyE':
-				if (activeCodeKey.value === keyCode) return
+				if (activeCodeKey === keyCode) return
 				let objE = { yaw: 1024+W_SPEED }
 				if (genPortOne) {objE = {w: W_SPEED}}
 				handlePublish(objE)
-				activeCodeKey.value = keyCode
+				activeCodeKey = keyCode
 				break
 			case 'KeyA':
-				if (activeCodeKey.value === keyCode) return
+				if (activeCodeKey === keyCode) return
 				let objA = { roll: 1024-SPEED }
 				if (genPortOne) {objA = {y: -SPEED}}
 				handlePublish(objA)
-				activeCodeKey.value = keyCode
+				activeCodeKey = keyCode
 				break
 			case 'KeyS':
-				if (activeCodeKey.value === keyCode) return
+				if (activeCodeKey === keyCode) return
 				let objS = { pitch: 1024-SPEED }
 				if (genPortOne) {objS = {x: -SPEED}}
 				handlePublish(objS)
-				activeCodeKey.value = keyCode
+				activeCodeKey = keyCode
 				break
 			case 'KeyD':
-				if (activeCodeKey.value === keyCode) return
+				if (activeCodeKey === keyCode) return
 				let objD = { roll: 1024+SPEED }
 				if (genPortOne) {objD = {y: SPEED}}
 				handlePublish(objD)
-				activeCodeKey.value = keyCode
+				activeCodeKey = keyCode
 				break
 			case 'KeyZ':
-				if (activeCodeKey.value === keyCode) return
+				if (activeCodeKey === keyCode) return
 				let objZ = { throttle: 1024-HEIGHT }
 				if (genPortOne) {objZ = {h: -HEIGHT}}
 				handlePublish(objZ)
-				activeCodeKey.value = keyCode
+				activeCodeKey = keyCode
 				break
 			// case 'ArrowDown':
 			case 'KeyC':
-				if (activeCodeKey.value === keyCode) return
+				if (activeCodeKey === keyCode) return
 				let objC = { throttle: 1024+HEIGHT }
 				if (genPortOne) {objC = {h: HEIGHT}}
 				handlePublish(objC)
-				activeCodeKey.value = keyCode
+				activeCodeKey = keyCode
 				break
 			case 'ArrowUp':
-				if (activeCodeKey.value === keyCode) return
-				myInterval = setInterval(()=>ptzControl('up'), 50)
-				activeCodeKey.value = keyCode
+				if (activeCodeKey === keyCode) return
+				clearInterval(myInterval)
+				myInterval = setInterval(()=>ptzControl('up'), 200)
+				activeCodeKey = keyCode
 				break
 			case 'ArrowDown':
-				if (activeCodeKey.value === keyCode) return
-				myInterval = setInterval(()=>ptzControl('down'), 50)
-				activeCodeKey.value = keyCode
+				if (activeCodeKey === keyCode) return
+				clearInterval(myInterval)
+				myInterval = setInterval(()=>ptzControl('down'), 200)
+				activeCodeKey = keyCode
 				break
 			case 'ArrowLeft':
-				if (activeCodeKey.value === keyCode) return
-				myInterval = setInterval(()=>ptzControl('left'), 50)
-				activeCodeKey.value = keyCode
+				if (activeCodeKey === keyCode) return
+				clearInterval(myInterval)
+				myInterval = setInterval(()=>ptzControl('left'), 200)
+				activeCodeKey = keyCode
 				break
 			case 'ArrowRight':
-				if (activeCodeKey.value === keyCode) return
-				myInterval = setInterval(()=>ptzControl('right'), 50)
-				activeCodeKey.value = keyCode
+				if (activeCodeKey === keyCode) return
+				clearInterval(myInterval)
+				myInterval = setInterval(()=>ptzControl('right'), 200)
+				activeCodeKey = keyCode
 				break
 			default:
 				break
@@ -179,7 +235,8 @@
 	}
 
 	function resetControlState() {
-		activeCodeKey.value = null
+		keysPressed.map(item => item.value = false)
+		activeCodeKey = null
 		seq = 0
 		handleClearInterval()
 	}
@@ -189,7 +246,16 @@
 	}
 
 	function onKeydown(e) {
-		handleKeyup(e.code)
+		e.preventDefault()
+		keysPressed.forEach(item => {
+			if(e.code === item.key) item.value = true
+		})
+		let result = keysPressed.filter(item=>item.value===true)
+		if (result && result.length >= 2) {
+			handleKeyup('assemblyKeys')
+		} else {
+			handleKeyup(e.code)
+		}
 	}
 
 	function startKeyboardManualControl() {
@@ -215,6 +281,10 @@
 		{ immediate: true }
 	)
 
+	onBeforeUnmount(()=>{
+		mqttHooks?.d
+	})
+
 	onUnmounted(() => {
 		closeKeyboardManualControl()
 	})
diff --git a/src/mqtt/index.js b/src/mqtt/index.js
index 896d2a5..8b53f7b 100644
--- a/src/mqtt/index.js
+++ b/src/mqtt/index.js
@@ -65,7 +65,7 @@
 
 	// 关闭 mqtt 客户端
 	destroyed = () => {
-		window.console.log('mqtt destroyed')
+		window.console.log('mqtt 销毁')
 		this._client?.end()
 	}
 

--
Gitblit v1.9.3