forked from drone/command-center-dashboard

罗广辉
2025-04-21 2800fa4f32f3900509cb4d6eefaf2bfaf54efdd7
src/hooks/controlDrone/useManualControl.js
@@ -36,11 +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 mqttHooks = useMqtt(mqttState,deviceTopicInfo)
   let seq = 0
   let throttledPtz = null
   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 = {
@@ -51,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)
   }
@@ -71,84 +78,141 @@
      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':
            ptzThrottle[0]()
            if (activeCodeKey === keyCode) return
            clearInterval(myInterval)
            ptzControl('up')
            myInterval = setInterval(()=>ptzControl('up'), 200)
            activeCodeKey = keyCode
            break
         case 'ArrowDown':
            ptzThrottle[1]()
            if (activeCodeKey === keyCode) return
            clearInterval(myInterval)
            ptzControl('down')
            myInterval = setInterval(()=>ptzControl('down'), 200)
            activeCodeKey = keyCode
            break
         case 'ArrowLeft':
            ptzThrottle[2]()
            if (activeCodeKey === keyCode) return
            clearInterval(myInterval)
            ptzControl('left')
            myInterval = setInterval(()=>ptzControl('left'), 200)
            activeCodeKey = keyCode
            break
         case 'ArrowRight':
            ptzThrottle[3]()
            if (activeCodeKey === keyCode) return
            clearInterval(myInterval)
            ptzControl('right')
            myInterval = setInterval(()=>ptzControl('right'), 200)
            activeCodeKey = keyCode
            break
         default:
            break
      }
   }
   // 云台控制节流list
   const ptzThrottle = ['up','down','left','right'].map(key => throttle(()=>ptzControl(key), 500))
   // 云台上下左右
   function ptzControl(key) {
@@ -175,7 +239,8 @@
   }
   function resetControlState() {
      activeCodeKey.value = null
      keysPressed.map(item => item.value = false)
      activeCodeKey = null
      seq = 0
      handleClearInterval()
   }
@@ -185,7 +250,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() {
@@ -212,6 +286,9 @@
   )
   onUnmounted(() => {
      deviceTopicInfo.subTopic = ''
      deviceTopicInfo.pubTopic = ''
      mqttHooks = null
      closeKeyboardManualControl()
   })