forked from drone/command-center-dashboard

shuishen
2025-04-15 01f329228c55cdbe3c1391b427c7a54c891efada
src/hooks/controlDrone/useManualControl.js
New file
@@ -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,
   }
}