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, } }