forked from drone/command-center-dashboard

罗广辉
2025-04-15 2888173145d91e465a25bea276acaa41f9a7b124
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
<template>
    <div class="pointControl">
        <div class="direction">
            <div class="blackBg directionUp">
                <el-button type="primary" @click="control">控制</el-button>
                <el-button type="primary" @click="cancelControl">取消控制</el-button>
                <el-button type="primary" ghost @mousedown="onMouseDown(KeyCode.KEY_Q)" @mouseup="onMouseUp">q</el-button>
            </div>
            <div class="blackBg directionDown"></div>
        </div>
 
        <ControlComPass />
    </div>
</template>
<script setup>
import ControlComPass from './ControlComPass/ControlComPass.vue'
import {
    KeyCode,
    useManualControl,
} from '@/hooks/controlDrone/useManualControl'
import { useMqtt } from '@/hooks/controlDrone/useMqtt'
import { useConnectDrone } from '@/hooks/controlDrone/useConnectDrone'
import { droneController, exitController, postDrcExit } from '@/api/drc'
import { ElMessage } from 'element-plus'
import { useStore } from 'vuex'
 
const deviceOsdInfo = inject('deviceOsdInfo')
const taskDetails = inject('taskDetails')
 
 
const deviceTopicInfo = ref({
    sn: deviceOsdInfo.value?.data?.sn,
    pubTopic: '',
    subTopic: '',
})
const flightController = ref(false)
console.log('控制面板')
 
// 连接无人机mqtt 成功获得有效控制
useConnectDrone()
 
// 订阅消息
useMqtt(deviceTopicInfo.value)
 
// 使用手动控制
const { handleKeyup, handleEmergencyStop, resetControlState } = useManualControl(
    deviceTopicInfo.value,
    flightController
)
 
function onMouseDown(type) {
    console.log('anxia')
    handleKeyup(type)
}
 
const store = useStore()
const clientId = computed(() => store.state.common.clientId)
const dock_sn = computed(() => taskDetails.value.device_sns[0])
 
function cancelControl() {
    exitController({ client_id: clientId.value, dock_sn:dock_sn.value })
        .then(res => {
            flightController.value = false
            deviceTopicInfo.value.subTopic = ''
            deviceTopicInfo.value.pubTopic = ''
            ElMessage.success('退出飞行控制成功')
        })
        .catch(e => {})
}
 
// 控制
function control() {
    if (!clientId.value) return ElMessage.error('无人机不在空中,不能进入指挥飞行模式。')
    if (!dock_sn.value) return ElMessage.error('系统错误,未获取到dock_sn')
    droneController({ client_id: clientId.value, dock_sn:dock_sn.value }).then(res => {
        flightController.value = true
        const { data } = res.data
        if (data.sub && data.sub?.length > 0) {
            deviceTopicInfo.value.subTopic = data.sub[0]
        }
        if (data.pub && data.pub?.length > 0) {
            deviceTopicInfo.value.pubTopic = data.pub[0]
        }
        ElMessage.success('控制成功')
    })
}
 
function onMouseUp() {
    console.log('弹起')
    resetControlState()
}
</script>
 
<style scoped lang="scss">
.f-c {
    display: flex;
    align-items: center;
}
 
.pointControl {
    position: absolute;
    bottom: 0;
    right: 0;
    width: 1540px;
    height: 217px;
    background: rgba(255, 255, 255, 0.3);
    border-radius: 40px 0px 40px 40px;
    display: flex;
    justify-content: center;
    align-items: flex-end;
    color: white;
    gap: 0 10px;
    pointer-events: all;
}
</style>