From 01f329228c55cdbe3c1391b427c7a54c891efada Mon Sep 17 00:00:00 2001
From: shuishen <1109946754@qq.com>
Date: Tue, 15 Apr 2025 20:42:08 +0800
Subject: [PATCH] Merge branch 'master' of http://139.196.74.78:10010/r/drone/command-center-dashboard

---
 src/hooks/controlDrone/useManualControl.js |  159 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 159 insertions(+), 0 deletions(-)

diff --git a/src/hooks/controlDrone/useManualControl.js b/src/hooks/controlDrone/useManualControl.js
new file mode 100644
index 0000000..91417c9
--- /dev/null
+++ b/src/hooks/controlDrone/useManualControl.js
@@ -0,0 +1,159 @@
+import { DRC_METHOD } from '@/const/drc.js'
+import { useMqtt } from '@/hooks/controlDrone/useMqtt'
+import { ElMessage } from 'element-plus'
+
+let myInterval
+
+export const KeyCode = {
+	KEY_W: 'KeyW',
+	KEY_A: 'KeyA',
+	KEY_S: 'KeyS',
+	KEY_D: 'KeyD',
+	KEY_Q: 'KeyQ',
+	KEY_E: 'KeyE',
+	ARROW_UP: 'ArrowUp',
+	ARROW_DOWN: 'ArrowDown',
+}
+
+export function useManualControl(mqttState,deviceTopicInfo, isCurrentFlightController) {
+	const activeCodeKey = ref(null)
+
+	const mqttHooks = useMqtt(mqttState,deviceTopicInfo)
+	let seq = 0
+
+	function handlePublish(params) {
+		const body = {
+			method: DRC_METHOD.DRONE_CONTROL,
+			data: params,
+		}
+		handleClearInterval()
+		myInterval = setInterval(() => {
+			body.data.seq = seq++
+			seq++
+			window.console.log('keyCode>>>>', activeCodeKey.value, body)
+			mqttHooks?.publishMqtt(deviceTopicInfo.pubTopic, body, { qos: 0 })
+		}, 50)
+	}
+
+	function handleKeyup(keyCode) {
+		if (!deviceTopicInfo.pubTopic) {
+			ElMessage.error('请确保已经建立DRC链路')
+			return
+		}
+		const SPEED = 5 //  check
+		const HEIGHT = 5 //  check
+		const W_SPEED = 20 // 机头角速度
+		seq = 0
+		switch (keyCode) {
+			case 'KeyA':
+				if (activeCodeKey.value === keyCode) return
+				handlePublish({ y: -SPEED })
+				activeCodeKey.value = keyCode
+				break
+			case 'KeyW':
+				if (activeCodeKey.value === keyCode) return
+				handlePublish({ x: SPEED })
+				activeCodeKey.value = keyCode
+				break
+			case 'KeyS':
+				if (activeCodeKey.value === keyCode) return
+				handlePublish({ x: -SPEED })
+				activeCodeKey.value = keyCode
+				break
+			case 'KeyD':
+				if (activeCodeKey.value === keyCode) return
+				handlePublish({ y: SPEED })
+				activeCodeKey.value = keyCode
+				break
+			case 'ArrowUp':
+				if (activeCodeKey.value === keyCode) return
+				handlePublish({ h: HEIGHT })
+				activeCodeKey.value = keyCode
+				break
+			case 'ArrowDown':
+				if (activeCodeKey.value === keyCode) return
+				handlePublish({ h: -HEIGHT })
+				activeCodeKey.value = keyCode
+				break
+			case 'KeyQ':
+				if (activeCodeKey.value === keyCode) return
+				handlePublish({ w: -W_SPEED })
+				activeCodeKey.value = keyCode
+				break
+			case 'KeyE':
+				if (activeCodeKey.value === keyCode) return
+				handlePublish({ w: W_SPEED })
+				activeCodeKey.value = keyCode
+				break
+			default:
+				break
+		}
+	}
+
+	function handleClearInterval() {
+		clearInterval(myInterval)
+		myInterval = undefined
+	}
+
+	function resetControlState() {
+		activeCodeKey.value = null
+		seq = 0
+		handleClearInterval()
+	}
+
+	function onKeyup() {
+		resetControlState()
+	}
+
+	function onKeydown(e) {
+		handleKeyup(e.code)
+	}
+
+	function startKeyboardManualControl() {
+		window.addEventListener('keydown', onKeydown)
+		window.addEventListener('keyup', onKeyup)
+	}
+
+	function closeKeyboardManualControl() {
+		resetControlState()
+		window.removeEventListener('keydown', onKeydown)
+		window.removeEventListener('keyup', onKeyup)
+	}
+
+	watch(
+		() => isCurrentFlightController.value,
+		val => {
+			if (val && deviceTopicInfo.pubTopic) {
+				startKeyboardManualControl()
+			} else {
+				closeKeyboardManualControl()
+			}
+		},
+		{ immediate: true }
+	)
+
+	onUnmounted(() => {
+		closeKeyboardManualControl()
+	})
+
+	function handleEmergencyStop() {
+		if (!deviceTopicInfo.pubTopic) {
+			ElMessage.error('请确保已经建立DRC链路')
+			return
+		}
+		const body = {
+			method: DRC_METHOD.DRONE_EMERGENCY_STOP,
+			data: {},
+		}
+		resetControlState()
+		window.console.log('handleEmergencyStop>>>>', deviceTopicInfo.pubTopic, body)
+		mqttHooks?.publishMqtt(deviceTopicInfo.pubTopic, body, { qos: 1 })
+	}
+
+	return {
+		activeCodeKey,
+		handleKeyup,
+		handleEmergencyStop,
+		resetControlState,
+	}
+}

--
Gitblit v1.9.3