import { DRC_METHOD } from '@/const/drc.js'
|
import { useMqtt } from '@/hooks/controlDrone/useMqtt'
|
import { ElMessage } from 'element-plus'
|
import { postPayloadCommands } from '@/api/payload'
|
|
let myInterval
|
|
export const KeyCode = {
|
KEY_W: 'KeyW',
|
KEY_A: 'KeyA',
|
KEY_S: 'KeyS',
|
KEY_D: 'KeyD',
|
KEY_Q: 'KeyQ',
|
KEY_E: 'KeyE',
|
KEY_J: 'KeyJ',
|
KEY_K: 'KeyK',
|
KEY_L: 'KeyL',
|
KEY_X: 'KeyX',
|
KEY_Z: 'KeyZ',
|
KEY_C: 'KeyC',
|
KEY_I: 'KeyI',
|
KEY_O: 'KeyO',
|
ARROW_UP: 'ArrowUp',
|
ARROW_DOWN: 'ArrowDown',
|
ARROW_LEFT: 'ArrowLeft',
|
ARROW_RIGHT: 'ArrowRight',
|
NUMPAD_SUBTRACT: 'NumpadSubtract',
|
NUMPAD_ADD: 'NumpadAdd',
|
// 提升速度
|
KEY_EQUAL: 'Equal',
|
KEY_MINUS: 'Minus',
|
// 录音
|
KEY_N: 'KeyN',
|
KEY_M: 'KeyM',
|
}
|
|
export function useManualControl(mqttState,deviceTopicInfo, isCurrentFlightController,paramsRef) {
|
const activeCodeKey = ref(null)
|
let genPortOne = true //是一代机场
|
const mqttHooks = useMqtt(mqttState,deviceTopicInfo)
|
let seq = 0
|
|
function handlePublish(params) {
|
const body = {
|
method: genPortOne ? DRC_METHOD.DRONE_CONTROL : DRC_METHOD.DRONE_CONTROL2,
|
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) {
|
const {droneSn,speed} = paramsRef.value
|
|
if (!deviceTopicInfo.pubTopic) {
|
ElMessage.error('请确保已经建立DRC链路')
|
return
|
}
|
if (droneSn.value === '4TADKCM0010016' || droneSn.value === 'BA0BA1C3D38157A49E1B16574FA474F7') {
|
genPortOne = true
|
}
|
|
const SPEED = genPortOne ? (speed.value || 5) : 500 // check
|
const HEIGHT = genPortOne ? 5 : 500; // check
|
const W_SPEED = genPortOne ? 20 : 500 // 机头角速度
|
|
seq = 0
|
switch (keyCode) {
|
case 'KeyQ':
|
if (activeCodeKey === keyCode) return
|
let objQ = { yaw: 1024-W_SPEED }
|
if (genPortOne) {objQ = {w: -W_SPEED}}
|
handlePublish(objQ)
|
activeCodeKey.value = keyCode
|
break
|
case 'KeyW':
|
if (activeCodeKey === keyCode) return
|
let objW = { pitch: 1024+SPEED }
|
if (genPortOne) {objW = {x: SPEED}}
|
handlePublish(objW)
|
activeCodeKey.value = keyCode
|
break
|
case 'KeyE':
|
if (activeCodeKey === keyCode) return
|
let objE = { yaw: 1024+W_SPEED }
|
if (genPortOne) {objE = {w: W_SPEED}}
|
handlePublish(objE)
|
activeCodeKey.value = keyCode
|
break
|
case 'KeyA':
|
if (activeCodeKey === keyCode) return
|
let objA = { roll: 1024-SPEED }
|
if (genPortOne) {objA = {y: -SPEED}}
|
handlePublish(objA)
|
activeCodeKey.value = keyCode
|
break
|
case 'KeyS':
|
if (activeCodeKey === keyCode) return
|
let objS = { pitch: 1024-SPEED }
|
if (genPortOne) {objS = {x: -SPEED}}
|
handlePublish(objS)
|
activeCodeKey.value = keyCode
|
break
|
case 'KeyD':
|
if (activeCodeKey === keyCode) return
|
let objD = { roll: 1024+SPEED }
|
if (genPortOne) {objD = {y: SPEED}}
|
handlePublish(objD)
|
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
|
|
default:
|
break
|
}
|
}
|
|
const handlePayloadTurn = (params) => {
|
handleClearInterval()
|
if (!this.myInterval) {
|
postPayloadCommands(this.sn, params)
|
}
|
this.myInterval = setInterval(() => {
|
postPayloadCommands(this.sn, params)
|
}, 500)
|
}
|
|
|
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,
|
}
|
}
|