| | |
| | | } |
| | | |
| | | export function useManualControl(mqttState,deviceTopicInfo, isCurrentFlightController,paramsRef) { |
| | | const activeCodeKey = ref(null) |
| | | let activeCodeKey = null |
| | | let genPortOne = true //是一代机场 |
| | | const mqttHooks = useMqtt(mqttState,deviceTopicInfo) |
| | | let seq = 0 |
| | | 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 = { |
| | |
| | | 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) |
| | | } |
| | |
| | | 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': |
| | | if (activeCodeKey.value === keyCode) return |
| | | myInterval = setInterval(()=>ptzControl('up'), 50) |
| | | activeCodeKey.value = keyCode |
| | | if (activeCodeKey === keyCode) return |
| | | clearInterval(myInterval) |
| | | myInterval = setInterval(()=>ptzControl('up'), 200) |
| | | activeCodeKey = keyCode |
| | | break |
| | | case 'ArrowDown': |
| | | if (activeCodeKey.value === keyCode) return |
| | | myInterval = setInterval(()=>ptzControl('down'), 50) |
| | | activeCodeKey.value = keyCode |
| | | if (activeCodeKey === keyCode) return |
| | | clearInterval(myInterval) |
| | | myInterval = setInterval(()=>ptzControl('down'), 200) |
| | | activeCodeKey = keyCode |
| | | break |
| | | case 'ArrowLeft': |
| | | if (activeCodeKey.value === keyCode) return |
| | | myInterval = setInterval(()=>ptzControl('left'), 50) |
| | | activeCodeKey.value = keyCode |
| | | if (activeCodeKey === keyCode) return |
| | | clearInterval(myInterval) |
| | | myInterval = setInterval(()=>ptzControl('left'), 200) |
| | | activeCodeKey = keyCode |
| | | break |
| | | case 'ArrowRight': |
| | | if (activeCodeKey.value === keyCode) return |
| | | myInterval = setInterval(()=>ptzControl('right'), 50) |
| | | activeCodeKey.value = keyCode |
| | | if (activeCodeKey === keyCode) return |
| | | clearInterval(myInterval) |
| | | myInterval = setInterval(()=>ptzControl('right'), 200) |
| | | activeCodeKey = keyCode |
| | | break |
| | | default: |
| | | break |
| | |
| | | } |
| | | |
| | | function resetControlState() { |
| | | activeCodeKey.value = null |
| | | keysPressed.map(item => item.value = false) |
| | | activeCodeKey = null |
| | | seq = 0 |
| | | handleClearInterval() |
| | | } |
| | |
| | | } |
| | | |
| | | 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() { |
| | |
| | | { immediate: true } |
| | | ) |
| | | |
| | | onBeforeUnmount(()=>{ |
| | | mqttHooks?.d |
| | | }) |
| | | |
| | | onUnmounted(() => { |
| | | closeKeyboardManualControl() |
| | | }) |