|
@@ -1,7 +1,7 @@
|
|
|
<template>
|
|
<template>
|
|
|
<div class="g-map-wrapper">
|
|
<div class="g-map-wrapper">
|
|
|
<!-- 地图区域 -->
|
|
<!-- 地图区域 -->
|
|
|
- <div id="g-container" :style="{ width: '100%', height: '100%' }" />
|
|
|
|
|
|
|
+ <div id="g-container" :style="{ width: '100%', height: '100%' }"></div>
|
|
|
<!-- 绘制面板 -->
|
|
<!-- 绘制面板 -->
|
|
|
<div class="g-action-panel">
|
|
<div class="g-action-panel">
|
|
|
<div :class="state.currentType === 'pin' ? 'g-action-item selection' : 'g-action-item'"
|
|
<div :class="state.currentType === 'pin' ? 'g-action-item selection' : 'g-action-item'"
|
|
@@ -20,7 +20,6 @@
|
|
|
<BorderOutlined class="fz18" />
|
|
<BorderOutlined class="fz18" />
|
|
|
</a>
|
|
</a>
|
|
|
</div>
|
|
</div>
|
|
|
- <!-- <FlightAreaActionIcon class="g-action-item mt10" :class="{'selection': mouseMode && state.isFlightArea}" @select-action="selectFlightAreaAction" @click="selectFlightAreaAction"/> -->
|
|
|
|
|
<div v-if="mouseMode" class="g-action-item" @click="draw('off', false)">
|
|
<div v-if="mouseMode" class="g-action-item" @click="draw('off', false)">
|
|
|
<a style="color: red;">
|
|
<a style="color: red;">
|
|
|
<CloseOutlined />
|
|
<CloseOutlined />
|
|
@@ -40,368 +39,17 @@
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
<!-- 机场OSD -->
|
|
<!-- 机场OSD -->
|
|
|
- <!-- <AirportOsdInfoModal :osdInfo="osdVisible" :deviceInfo="deviceInfo"
|
|
|
|
|
- v-if="osdVisible.visible && osdVisible.is_dock" /> -->
|
|
|
|
|
- <div v-if="osdVisible.visible && osdVisible.is_dock" v-drag-window class="osd-panel fz12">
|
|
|
|
|
- <div class="drag-title fz16 pl5 pr5 flex-align-center flex-row flex-justify-between"
|
|
|
|
|
- style="border-bottom: 1px solid #515151; height: 10%;">
|
|
|
|
|
- <span>{{ osdVisible.gateway_callsign }}</span>
|
|
|
|
|
- </div>
|
|
|
|
|
- <span><a style="color: white; position: absolute; top: 5px; right: 5px;"
|
|
|
|
|
- @click="() => osdVisible.visible = false">
|
|
|
|
|
- <CloseOutlined />
|
|
|
|
|
- </a></span>
|
|
|
|
|
- <!-- 机场 -->
|
|
|
|
|
- <div class="flex-display" style="border-bottom: 1px solid #515151;">
|
|
|
|
|
- <div class="flex-column flex-align-stretch flex-justify-center" style="width: 60px; background: #2d2d2d;">
|
|
|
|
|
- <a-tooltip :title="osdVisible.model">
|
|
|
|
|
- <div class="flex-column flex-align-center flex-justify-center" style="width: 90%;">
|
|
|
|
|
- <span>
|
|
|
|
|
- <RobotFilled style="font-size: 48px;" />
|
|
|
|
|
- </span>
|
|
|
|
|
- <span class="mt10">Dock</span>
|
|
|
|
|
- </div>
|
|
|
|
|
- </a-tooltip>
|
|
|
|
|
- </div>
|
|
|
|
|
- <div class="osd flex-1" style="flex: 1">
|
|
|
|
|
- <a-row>
|
|
|
|
|
- <a-col span="16"
|
|
|
|
|
- :style="deviceInfo.dock.basic_osd?.mode_code === EDockModeCode.Disconnected ? 'color: red; font-weight: 700;' : 'color: rgb(25,190,107)'">
|
|
|
|
|
- {{ EDockModeCode[deviceInfo.dock.basic_osd?.mode_code] }}</a-col>
|
|
|
|
|
- </a-row>
|
|
|
|
|
- <a-row>
|
|
|
|
|
- <a-col span="12">
|
|
|
|
|
- <a-tooltip title="Accumulated Running Time">
|
|
|
|
|
- <span>
|
|
|
|
|
- <HistoryOutlined />
|
|
|
|
|
- </span>
|
|
|
|
|
- <span class="ml10">
|
|
|
|
|
- <span v-if="deviceInfo.dock.work_osd?.acc_time >= 2592000"> {{
|
|
|
|
|
- Math.floor(deviceInfo.dock.work_osd?.acc_time / 2592000) }}m </span>
|
|
|
|
|
- <span v-if="(deviceInfo.dock.work_osd?.acc_time % 2592000) >= 86400"> {{
|
|
|
|
|
- Math.floor((deviceInfo.dock.work_osd?.acc_time % 2592000) / 86400) }}d </span>
|
|
|
|
|
- <span v-if="(deviceInfo.dock.work_osd?.acc_time % 2592000 % 86400) >= 3600"> {{
|
|
|
|
|
- Math.floor((deviceInfo.dock.work_osd?.acc_time % 2592000 % 86400) / 3600) }}h </span>
|
|
|
|
|
- <span v-if="(deviceInfo.dock.work_osd?.acc_time % 2592000 % 86400 % 3600) >= 60"> {{
|
|
|
|
|
- Math.floor((deviceInfo.dock.work_osd?.acc_time % 2592000 % 86400 % 3600) / 60) }}min </span>
|
|
|
|
|
- <span>{{ Math.floor(deviceInfo.dock.work_osd?.acc_time % 2592000 % 86400 % 3600 % 60) }} s</span>
|
|
|
|
|
- </span>
|
|
|
|
|
- </a-tooltip>
|
|
|
|
|
- </a-col>
|
|
|
|
|
- <a-col span="12">
|
|
|
|
|
- <a-tooltip title="Activation time">
|
|
|
|
|
- <span>
|
|
|
|
|
- <FieldTimeOutlined />
|
|
|
|
|
- </span>
|
|
|
|
|
- <span class="ml10">{{ new Date((deviceInfo.dock.work_osd?.activation_time ?? 0) * 1000).toLocaleString()
|
|
|
|
|
- }}
|
|
|
|
|
- </span>
|
|
|
|
|
- </a-tooltip>
|
|
|
|
|
- </a-col>
|
|
|
|
|
- </a-row>
|
|
|
|
|
- <a-row>
|
|
|
|
|
- <a-col span="6">
|
|
|
|
|
- <a-tooltip title="Network State">
|
|
|
|
|
- <span :style="qualityStyle">
|
|
|
|
|
- <span v-if="deviceInfo.dock.basic_osd?.network_state?.type === NetworkStateTypeEnum.FOUR_G">
|
|
|
|
|
- <SignalFilled />
|
|
|
|
|
- </span>
|
|
|
|
|
- <span v-else>
|
|
|
|
|
- <GlobalOutlined />
|
|
|
|
|
- </span>
|
|
|
|
|
- </span>
|
|
|
|
|
- <span class="ml10">{{ deviceInfo.dock.basic_osd?.network_state?.rate }} kb/s</span>
|
|
|
|
|
- </a-tooltip>
|
|
|
|
|
- </a-col>
|
|
|
|
|
- <a-col span="6">
|
|
|
|
|
- <a-tooltip title="The total number of times the dock has performed missions.">
|
|
|
|
|
- <span>
|
|
|
|
|
- <CarryOutOutlined />
|
|
|
|
|
- </span>
|
|
|
|
|
- <span class="ml10">{{ deviceInfo.dock.work_osd?.job_number }} </span>
|
|
|
|
|
- </a-tooltip>
|
|
|
|
|
- </a-col>
|
|
|
|
|
- <a-col span="6">
|
|
|
|
|
- <a-tooltip title="Media File Remain Upload">
|
|
|
|
|
- <span>
|
|
|
|
|
- <CloudUploadOutlined class="fz14" />
|
|
|
|
|
- </span>
|
|
|
|
|
- <span class="ml10">{{ deviceInfo.dock.link_osd?.media_file_detail?.remain_upload }}</span>
|
|
|
|
|
- </a-tooltip>
|
|
|
|
|
- </a-col>
|
|
|
|
|
- <a-col span="6">
|
|
|
|
|
- <a-tooltip>
|
|
|
|
|
- <template #title>
|
|
|
|
|
- <p>total: {{ deviceInfo.dock.basic_osd?.storage?.total }}</p>
|
|
|
|
|
- <p>used: {{ deviceInfo.dock.basic_osd?.storage?.used }}</p>
|
|
|
|
|
- </template>
|
|
|
|
|
- <span>
|
|
|
|
|
- <FolderOpenOutlined />
|
|
|
|
|
- </span>
|
|
|
|
|
- <span class="ml10" v-if="deviceInfo.dock.basic_osd?.storage?.total > 0">
|
|
|
|
|
- <a-progress type="circle" :width="20"
|
|
|
|
|
- :percent="deviceInfo.dock.basic_osd?.storage?.used * 100 / deviceInfo.dock.basic_osd?.storage?.total"
|
|
|
|
|
- :strokeWidth="20" :showInfo="false"
|
|
|
|
|
- :strokeColor="deviceInfo.dock.basic_osd?.storage?.used * 100 / deviceInfo.dock.basic_osd?.storage?.total > 80 ? 'red' : '#00ee8b'" />
|
|
|
|
|
- </span>
|
|
|
|
|
- </a-tooltip>
|
|
|
|
|
- </a-col>
|
|
|
|
|
- </a-row>
|
|
|
|
|
- <a-row>
|
|
|
|
|
- <a-col span="6">
|
|
|
|
|
- <a-tooltip title="Wind Speed">
|
|
|
|
|
- <span>W.S</span>
|
|
|
|
|
- <span class="ml10">{{ (deviceInfo.dock.basic_osd?.wind_speed ?? str) + ' m/s' }}</span>
|
|
|
|
|
- </a-tooltip>
|
|
|
|
|
- </a-col>
|
|
|
|
|
- <a-col span="6">
|
|
|
|
|
- <a-tooltip title="Rainfall">
|
|
|
|
|
- <span>🌧</span>
|
|
|
|
|
- <span class="ml10">{{ RainfallEnum[deviceInfo.dock.basic_osd?.rainfall] }}</span>
|
|
|
|
|
- </a-tooltip>
|
|
|
|
|
- </a-col>
|
|
|
|
|
- <a-col span="6">
|
|
|
|
|
- <a-tooltip title="Environment Temperature">
|
|
|
|
|
- <span>°C</span>
|
|
|
|
|
- <span class="ml10">{{ deviceInfo.dock.basic_osd?.environment_temperature }}</span>
|
|
|
|
|
- </a-tooltip>
|
|
|
|
|
- </a-col>
|
|
|
|
|
- <a-col span="6">
|
|
|
|
|
- <a-tooltip title="Dock Temperature">
|
|
|
|
|
- <span>°C</span>
|
|
|
|
|
- <span class="ml10">{{ deviceInfo.dock.basic_osd?.temperature }}</span>
|
|
|
|
|
- </a-tooltip>
|
|
|
|
|
- </a-col>
|
|
|
|
|
- </a-row>
|
|
|
|
|
- <a-row>
|
|
|
|
|
- <a-col span="6">
|
|
|
|
|
- <a-tooltip title="Dock Humidity">
|
|
|
|
|
- <span>💦</span>
|
|
|
|
|
- <span class="ml10">{{ deviceInfo.dock.basic_osd?.humidity }}</span>
|
|
|
|
|
- </a-tooltip>
|
|
|
|
|
- </a-col>
|
|
|
|
|
- <a-col span="6">
|
|
|
|
|
- <a-tooltip title="Working Voltage">
|
|
|
|
|
- <span
|
|
|
|
|
- style="border: 1px solid; border-radius: 50%; width: 18px; height: 18px; line-height: 16px; text-align: center; float: left;">V</span>
|
|
|
|
|
- <span class="ml10">{{ (deviceInfo.dock.work_osd?.working_voltage ?? str) + ' mV' }}</span>
|
|
|
|
|
- </a-tooltip>
|
|
|
|
|
- </a-col>
|
|
|
|
|
- <a-col span="6">
|
|
|
|
|
- <a-tooltip title="Working Current">
|
|
|
|
|
- <span
|
|
|
|
|
- style="border: 1px solid; border-radius: 50%; width: 18px; height: 18px; line-height: 15px; text-align: center; float: left;">A</span>
|
|
|
|
|
- <span class="ml10">{{ (deviceInfo.dock.work_osd?.working_current ?? str) + ' mA' }}</span>
|
|
|
|
|
- </a-tooltip>
|
|
|
|
|
- </a-col>
|
|
|
|
|
- <a-col span="6">
|
|
|
|
|
- <a-tooltip title="Drone in dock">
|
|
|
|
|
- <span>
|
|
|
|
|
- <RocketOutlined />
|
|
|
|
|
- </span>
|
|
|
|
|
- <span class="ml10">{{ deviceInfo.dock.basic_osd?.drone_in_dock }}</span>
|
|
|
|
|
- </a-tooltip>
|
|
|
|
|
- </a-col>
|
|
|
|
|
- </a-row>
|
|
|
|
|
- <a-row class="p5">
|
|
|
|
|
- <a-col span="24">
|
|
|
|
|
- <a-button type="primary" :disabled="dockControlPanelVisible" size="small"
|
|
|
|
|
- @click="setDockControlPanelVisible(true)">
|
|
|
|
|
- Actions
|
|
|
|
|
- </a-button>
|
|
|
|
|
- </a-col>
|
|
|
|
|
- </a-row>
|
|
|
|
|
- <!-- 机场控制面板 -->
|
|
|
|
|
- <DockControlPanel v-if="dockControlPanelVisible" :sn="osdVisible.gateway_sn" :deviceInfo="deviceInfo"
|
|
|
|
|
- @close-control-panel="onCloseControlPanel">
|
|
|
|
|
- </DockControlPanel>
|
|
|
|
|
- </div>
|
|
|
|
|
- </div>
|
|
|
|
|
- <!-- 飞机-->
|
|
|
|
|
- <div class="flex-display">
|
|
|
|
|
- <div class="flex-column flex-align-stretch flex-justify-center" style="width: 60px; background: #2d2d2d;">
|
|
|
|
|
- <a-tooltip :title="osdVisible.model">
|
|
|
|
|
- <div style="width: 90%;" class="flex-column flex-align-center flex-justify-center">
|
|
|
|
|
- <span><a-image :src="M30" :preview="false" /></span>
|
|
|
|
|
- <span>M30</span>
|
|
|
|
|
- </div>
|
|
|
|
|
- </a-tooltip>
|
|
|
|
|
- </div>
|
|
|
|
|
- <div class="osd flex-1">
|
|
|
|
|
- <a-row>
|
|
|
|
|
- <a-col span="16"
|
|
|
|
|
- :style="!deviceInfo.device || deviceInfo.device?.mode_code === EModeCode.Disconnected ? 'color: red; font-weight: 700;' : 'color: rgb(25,190,107)'">
|
|
|
|
|
- {{ !deviceInfo.device ? EModeCode[EModeCode.Disconnected] : EModeCode[deviceInfo.device?.mode_code] }}
|
|
|
|
|
- </a-col>
|
|
|
|
|
- </a-row>
|
|
|
|
|
- <a-row>
|
|
|
|
|
- <a-col span="6">
|
|
|
|
|
- <a-tooltip title="Upward Quality">
|
|
|
|
|
- <span>
|
|
|
|
|
- <SignalFilled />
|
|
|
|
|
- <ArrowUpOutlined style="font-size: 9px; vertical-align: top;" />
|
|
|
|
|
- </span>
|
|
|
|
|
- <span class="ml10">{{ deviceInfo.dock.link_osd?.sdr?.up_quality }}</span>
|
|
|
|
|
- </a-tooltip>
|
|
|
|
|
- </a-col>
|
|
|
|
|
- <a-col span="6">
|
|
|
|
|
- <a-tooltip title="Downward Quality">
|
|
|
|
|
- <span>
|
|
|
|
|
- <SignalFilled />
|
|
|
|
|
- <ArrowDownOutlined style="font-size: 9px; vertical-align: top;" />
|
|
|
|
|
- </span>
|
|
|
|
|
- <span class="ml10">{{ deviceInfo.dock.link_osd?.sdr?.down_quality }}</span>
|
|
|
|
|
- </a-tooltip>
|
|
|
|
|
- </a-col>
|
|
|
|
|
- <a-col span="6">
|
|
|
|
|
- <a-tooltip title="Drone Battery Level">
|
|
|
|
|
- <span>
|
|
|
|
|
- <ThunderboltOutlined class="fz14" />
|
|
|
|
|
- </span>
|
|
|
|
|
- <span class="ml10">{{ deviceInfo.device && deviceInfo.device.battery.capacity_percent !== str ?
|
|
|
|
|
- deviceInfo.device?.battery.capacity_percent + ' %' : str }}</span>
|
|
|
|
|
- </a-tooltip>
|
|
|
|
|
- </a-col>
|
|
|
|
|
- <a-col span="6">
|
|
|
|
|
- <a-tooltip>
|
|
|
|
|
- <template #title>
|
|
|
|
|
- <p>total: {{ deviceInfo.device?.storage?.total }}</p>
|
|
|
|
|
- <p>used: {{ deviceInfo.device?.storage?.used }}</p>
|
|
|
|
|
- </template>
|
|
|
|
|
- <span>
|
|
|
|
|
- <FolderOpenOutlined />
|
|
|
|
|
- </span>
|
|
|
|
|
- <span class="ml10" v-if="deviceInfo.device?.storage?.total > 0">
|
|
|
|
|
- <a-progress type="circle" :width="20"
|
|
|
|
|
- :percent="deviceInfo.device?.storage?.used * 100 / deviceInfo.device?.storage?.total"
|
|
|
|
|
- :strokeWidth="20" :showInfo="false"
|
|
|
|
|
- :strokeColor="deviceInfo.device?.storage?.used * 100 / deviceInfo.device?.storage?.total > 80 ? 'red' : '#00ee8b'" />
|
|
|
|
|
- </span>
|
|
|
|
|
- </a-tooltip>
|
|
|
|
|
- </a-col>
|
|
|
|
|
- </a-row>
|
|
|
|
|
- <a-row>
|
|
|
|
|
- <a-tooltip title="RTK Fixed">
|
|
|
|
|
- <a-col span="6" class="flex-row flex-align-center flex-justify-start">
|
|
|
|
|
- <span>Fixed</span>
|
|
|
|
|
- <span class="ml10 circle"
|
|
|
|
|
- :style="deviceInfo.device?.position_state.is_fixed === 1 ? 'backgroud: rgb(25,190,107);' : ' background: red;'"></span>
|
|
|
|
|
- </a-col>
|
|
|
|
|
- </a-tooltip>
|
|
|
|
|
- <a-col span="6">
|
|
|
|
|
- <a-tooltip title="GPS">
|
|
|
|
|
- <span>GPS</span>
|
|
|
|
|
- <span class="ml10">{{ deviceInfo.device ? deviceInfo.device.position_state.gps_number : str }}</span>
|
|
|
|
|
- </a-tooltip>
|
|
|
|
|
- </a-col>
|
|
|
|
|
- <a-col span="6">
|
|
|
|
|
- <a-tooltip title="RTK">
|
|
|
|
|
- <span>
|
|
|
|
|
- <TrademarkOutlined class="fz14" />
|
|
|
|
|
- </span>
|
|
|
|
|
- <span class="ml10">{{ deviceInfo.device ? deviceInfo.device.position_state.rtk_number : str }}</span>
|
|
|
|
|
- </a-tooltip>
|
|
|
|
|
- </a-col>
|
|
|
|
|
- </a-row>
|
|
|
|
|
- <a-row>
|
|
|
|
|
- <a-col span="6">
|
|
|
|
|
- <a-tooltip title="Flight Mode">
|
|
|
|
|
- <span>
|
|
|
|
|
- <ControlOutlined class="fz16" />
|
|
|
|
|
- </span>
|
|
|
|
|
- <span class="ml10">{{ deviceInfo.device ? EGear[deviceInfo.device?.gear] : str }}</span>
|
|
|
|
|
- </a-tooltip>
|
|
|
|
|
- </a-col>
|
|
|
|
|
- <a-col span="6">
|
|
|
|
|
- <a-tooltip title="Altitude above sea level">
|
|
|
|
|
- <span>ASL</span>
|
|
|
|
|
- <span class="ml10">{{ !deviceInfo.device || deviceInfo.device.height === str ? str :
|
|
|
|
|
- deviceInfo.device?.height.toFixed(2) + ' m' }}</span>
|
|
|
|
|
- </a-tooltip>
|
|
|
|
|
- </a-col>
|
|
|
|
|
- <a-col span="6">
|
|
|
|
|
- <a-tooltip title="Altitude above takeoff level">
|
|
|
|
|
- <span>ALT</span>
|
|
|
|
|
- <span class="ml10">{{ !deviceInfo.device || deviceInfo.device.elevation === str ? str :
|
|
|
|
|
- deviceInfo.device?.elevation.toFixed(2) + ' m' }}</span>
|
|
|
|
|
- </a-tooltip>
|
|
|
|
|
- </a-col>
|
|
|
|
|
- <a-col span="6">
|
|
|
|
|
- <a-tooltip title="Distance to Home Point">
|
|
|
|
|
- <span
|
|
|
|
|
- style="border: 1px solid; border-radius: 50%; width: 18px; height: 18px; line-height: 15px; text-align: center; display: block; float: left;">H</span>
|
|
|
|
|
- <span class="ml10">{{ !deviceInfo.device || deviceInfo.device.home_distance === str ? str :
|
|
|
|
|
- deviceInfo.device?.home_distance.toFixed(2) + ' m' }}</span>
|
|
|
|
|
- </a-tooltip>
|
|
|
|
|
- </a-col>
|
|
|
|
|
- </a-row>
|
|
|
|
|
- <a-row>
|
|
|
|
|
- <a-col span="6">
|
|
|
|
|
- <a-tooltip title="Horizontal Speed">
|
|
|
|
|
- <span>H.S</span>
|
|
|
|
|
- <span class="ml10">{{ !deviceInfo.device || deviceInfo.device?.horizontal_speed === str ? str :
|
|
|
|
|
- deviceInfo.device?.horizontal_speed.toFixed(2) + ' m/s' }}</span>
|
|
|
|
|
- </a-tooltip>
|
|
|
|
|
- </a-col>
|
|
|
|
|
- <a-col span="6">
|
|
|
|
|
- <a-tooltip title="Vertical Speed">
|
|
|
|
|
- <span>V.S</span>
|
|
|
|
|
- <span class="ml10">{{ !deviceInfo.device || deviceInfo.device.vertical_speed === str ? str :
|
|
|
|
|
- deviceInfo.device?.vertical_speed.toFixed(2) + ' m/s' }}</span>
|
|
|
|
|
- </a-tooltip>
|
|
|
|
|
- </a-col>
|
|
|
|
|
- <a-col span="6">
|
|
|
|
|
- <a-tooltip title="Wind Speed">
|
|
|
|
|
- <span>W.S</span>
|
|
|
|
|
- <span class="ml10">{{ !deviceInfo.device || deviceInfo.device.wind_speed === str ? str :
|
|
|
|
|
- (deviceInfo.device?.wind_speed / 10).toFixed(2) + ' m/s' }}</span>
|
|
|
|
|
- </a-tooltip>
|
|
|
|
|
- </a-col>
|
|
|
|
|
- </a-row>
|
|
|
|
|
- </div>
|
|
|
|
|
- </div>
|
|
|
|
|
- <div class="battery-slide" v-if="deviceInfo.device && deviceInfo.device.battery.remain_flight_time !== 0"
|
|
|
|
|
- style="border: 1px solid red">
|
|
|
|
|
- <div style="background: #535759;" class="width-100"></div>
|
|
|
|
|
- <div class="capacity-percent" :style="{ width: deviceInfo.device.battery.capacity_percent + '%' }"></div>
|
|
|
|
|
- <div class="return-home" :style="{ width: deviceInfo.device.battery.return_home_power + '%' }"></div>
|
|
|
|
|
- <div class="landing" :style="{ width: deviceInfo.device.battery.landing_power + '%' }"></div>
|
|
|
|
|
- <div class="white-point" :style="{ left: deviceInfo.device.battery.landing_power + '%' }"></div>
|
|
|
|
|
- <div class="battery" :style="{ left: deviceInfo.device.battery.capacity_percent + '%' }">
|
|
|
|
|
- {{ Math.floor(deviceInfo.device.battery.remain_flight_time / 60) }}:
|
|
|
|
|
- {{ 10 > (deviceInfo.device.battery.remain_flight_time % 60) ? '0' :
|
|
|
|
|
- '' }}{{ deviceInfo.device.battery.remain_flight_time % 60 }}
|
|
|
|
|
- </div>
|
|
|
|
|
- </div>
|
|
|
|
|
- <!-- 飞行指令 -->
|
|
|
|
|
- <DroneControlPanel :sn="osdVisible.gateway_sn" :deviceInfo="deviceInfo" :payloads="osdVisible.payloads">
|
|
|
|
|
- </DroneControlPanel>
|
|
|
|
|
- </div>
|
|
|
|
|
|
|
+ <AirportOsdInfoModal :osdInfo="osdVisible" :deviceInfo="deviceInfo"
|
|
|
|
|
+ v-if="osdVisible.visible && osdVisible.is_dock" />
|
|
|
<!-- 飞机OSD -->
|
|
<!-- 飞机OSD -->
|
|
|
<DeviceOsdInfoModal :osdInfo="osdVisible" :deviceInfo="deviceInfo"
|
|
<DeviceOsdInfoModal :osdInfo="osdVisible" :deviceInfo="deviceInfo"
|
|
|
v-if="osdVisible.visible && !osdVisible.is_dock" />
|
|
v-if="osdVisible.visible && !osdVisible.is_dock" />
|
|
|
- <!-- liveview -->
|
|
|
|
|
- <div class="liveview" v-if="livestreamOthersVisible" v-drag-window>
|
|
|
|
|
- <div style="height: 40px; width: 100%" class="drag-title"></div>
|
|
|
|
|
- <a style="position: absolute; right: 10px; top: 10px; font-size: 16px; color: white;"
|
|
|
|
|
- @click="closeLivestreamOthers">
|
|
|
|
|
- <CloseOutlined />
|
|
|
|
|
- </a>
|
|
|
|
|
- <LivestreamOthers />
|
|
|
|
|
- </div>
|
|
|
|
|
- <div class="liveview" v-if="livestreamAgoraVisible" v-drag-window>
|
|
|
|
|
- <div style="height: 40px; width: 100%" class="drag-title"></div>
|
|
|
|
|
- <a style="position: absolute; right: 10px; top: 10px; font-size: 16px; color: white;"
|
|
|
|
|
- @click="closeLivestreamAgora">
|
|
|
|
|
- <CloseOutlined />
|
|
|
|
|
- </a>
|
|
|
|
|
- <LivestreamAgora />
|
|
|
|
|
- </div>
|
|
|
|
|
</div>
|
|
</div>
|
|
|
</template>
|
|
</template>
|
|
|
|
|
|
|
|
<script lang="ts">
|
|
<script lang="ts">
|
|
|
import { computed, defineComponent, onMounted, reactive, ref, watch, onUnmounted } from 'vue'
|
|
import { computed, defineComponent, onMounted, reactive, ref, watch, onUnmounted } from 'vue'
|
|
|
|
|
+import { BorderOutlined, LineOutlined, CloseOutlined, AimOutlined } from '@ant-design/icons-vue'
|
|
|
import {
|
|
import {
|
|
|
generateLineContent,
|
|
generateLineContent,
|
|
|
generatePointContent,
|
|
generatePointContent,
|
|
@@ -421,31 +69,17 @@ import { GeojsonCoordinate } from '/@/types/map'
|
|
|
import { MapDoodleEnum } from '/@/types/map-enum'
|
|
import { MapDoodleEnum } from '/@/types/map-enum'
|
|
|
import { PostElementsBody } from '/@/types/mapLayer'
|
|
import { PostElementsBody } from '/@/types/mapLayer'
|
|
|
import { uuidv4 } from '/@/utils/uuid'
|
|
import { uuidv4 } from '/@/utils/uuid'
|
|
|
-import { gcj02towgs84, wgs84togcj02 } from '/@/vendors/coordtransform'
|
|
|
|
|
|
|
+import { gcj02towgs84, wgs84togcj02 } from '../vendors/coordtransform'
|
|
|
import { deviceTsaUpdate } from '/@/hooks/use-g-map-tsa'
|
|
import { deviceTsaUpdate } from '/@/hooks/use-g-map-tsa'
|
|
|
-import {
|
|
|
|
|
- DeviceOsd, DeviceStatus, DockOsd, EGear, EModeCode, GatewayOsd, EDockModeCode,
|
|
|
|
|
- NetworkStateQualityEnum, NetworkStateTypeEnum, RainfallEnum, DroneInDockEnum
|
|
|
|
|
-} from '/@/types/device'
|
|
|
|
|
import pin from '/@/assets/icons/pin-2d8cf0.svg'
|
|
import pin from '/@/assets/icons/pin-2d8cf0.svg'
|
|
|
-import M30 from '/@/assets/icons/m30.png'
|
|
|
|
|
import planeSrc from '/@/assets/icons/plane.png'
|
|
import planeSrc from '/@/assets/icons/plane.png'
|
|
|
import satelliteSrc from '/@/assets/icons/satellite.png'
|
|
import satelliteSrc from '/@/assets/icons/satellite.png'
|
|
|
-import {
|
|
|
|
|
- BorderOutlined, LineOutlined, CloseOutlined, AimOutlined, ControlOutlined, TrademarkOutlined, ArrowDownOutlined,
|
|
|
|
|
- ThunderboltOutlined, SignalFilled, GlobalOutlined, HistoryOutlined, CloudUploadOutlined, RocketOutlined,
|
|
|
|
|
- FieldTimeOutlined, CloudOutlined, CloudFilled, FolderOpenOutlined, RobotFilled, ArrowUpOutlined, CarryOutOutlined
|
|
|
|
|
-} from '@ant-design/icons-vue'
|
|
|
|
|
import { EDeviceTypeName, ELocalStorageKey } from '../types'
|
|
import { EDeviceTypeName, ELocalStorageKey } from '../types'
|
|
|
-import DockControlPanel from './g-map/DockControlPanel.vue'
|
|
|
|
|
-import { useDockControl } from './g-map/use-dock-control'
|
|
|
|
|
-import DroneControlPanel from './g-map/DroneControlPanel.vue'
|
|
|
|
|
-import { useConnectMqtt } from './g-map/use-connect-mqtt'
|
|
|
|
|
-import LivestreamOthers from './livestream-others.vue'
|
|
|
|
|
-import FlightAreaActionIcon from './flight-area/FlightAreaActionIcon.vue'
|
|
|
|
|
import { EFlightAreaType } from '../types/flight-area'
|
|
import { EFlightAreaType } from '../types/flight-area'
|
|
|
import { useFlightArea } from './flight-area/use-flight-area'
|
|
import { useFlightArea } from './flight-area/use-flight-area'
|
|
|
|
|
+import { useConnectMqtt } from './g-map/use-connect-mqtt'
|
|
|
import { useFlightAreaDroneLocationEvent } from './flight-area/use-flight-area-drone-location-event'
|
|
import { useFlightAreaDroneLocationEvent } from './flight-area/use-flight-area-drone-location-event'
|
|
|
|
|
+import { DeviceOsd, DeviceStatus, DockOsd, EModeCode, GatewayOsd } from '/@/types/device'
|
|
|
|
|
|
|
|
export default defineComponent({
|
|
export default defineComponent({
|
|
|
components: {
|
|
components: {
|
|
@@ -453,28 +87,8 @@ export default defineComponent({
|
|
|
LineOutlined,
|
|
LineOutlined,
|
|
|
CloseOutlined,
|
|
CloseOutlined,
|
|
|
AimOutlined,
|
|
AimOutlined,
|
|
|
- ControlOutlined,
|
|
|
|
|
- TrademarkOutlined,
|
|
|
|
|
- ThunderboltOutlined,
|
|
|
|
|
- SignalFilled,
|
|
|
|
|
- GlobalOutlined,
|
|
|
|
|
- HistoryOutlined,
|
|
|
|
|
- CloudUploadOutlined,
|
|
|
|
|
- FieldTimeOutlined,
|
|
|
|
|
- CloudOutlined,
|
|
|
|
|
- CloudFilled,
|
|
|
|
|
- FolderOpenOutlined,
|
|
|
|
|
- RobotFilled,
|
|
|
|
|
- ArrowUpOutlined,
|
|
|
|
|
- ArrowDownOutlined,
|
|
|
|
|
AirportOsdInfoModal,
|
|
AirportOsdInfoModal,
|
|
|
DeviceOsdInfoModal,
|
|
DeviceOsdInfoModal,
|
|
|
- DockControlPanel,
|
|
|
|
|
- DroneControlPanel,
|
|
|
|
|
- CarryOutOutlined,
|
|
|
|
|
- RocketOutlined,
|
|
|
|
|
- LivestreamOthers,
|
|
|
|
|
- FlightAreaActionIcon,
|
|
|
|
|
},
|
|
},
|
|
|
name: 'GMap',
|
|
name: 'GMap',
|
|
|
props: {},
|
|
props: {},
|
|
@@ -501,15 +115,14 @@ export default defineComponent({
|
|
|
useMouseToolHook.onChangeMapType(mapType);
|
|
useMouseToolHook.onChangeMapType(mapType);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- const str: string = '--'
|
|
|
|
|
|
|
+ const str: string = '--';
|
|
|
|
|
+
|
|
|
const deviceInfo: any = reactive({
|
|
const deviceInfo: any = reactive({
|
|
|
gateway: {
|
|
gateway: {
|
|
|
capacity_percent: str,
|
|
capacity_percent: str,
|
|
|
transmission_signal_quality: str,
|
|
transmission_signal_quality: str,
|
|
|
} as GatewayOsd,
|
|
} as GatewayOsd,
|
|
|
- dock: {
|
|
|
|
|
-
|
|
|
|
|
- } as DockOsd,
|
|
|
|
|
|
|
+ dock: {} as DockOsd,
|
|
|
device: {
|
|
device: {
|
|
|
gear: -1,
|
|
gear: -1,
|
|
|
mode_code: EModeCode.Disconnected,
|
|
mode_code: EModeCode.Disconnected,
|
|
@@ -540,29 +153,10 @@ export default defineComponent({
|
|
|
return store.state.layerBaseInfo.share
|
|
return store.state.layerBaseInfo.share
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
- const livestreamOthersVisible = computed(() => {
|
|
|
|
|
- return store.state.livestreamOthersVisible
|
|
|
|
|
- })
|
|
|
|
|
-
|
|
|
|
|
- const livestreamAgoraVisible = computed(() => {
|
|
|
|
|
- return store.state.livestreamAgoraVisible
|
|
|
|
|
- })
|
|
|
|
|
-
|
|
|
|
|
const osdVisible = computed(() => {
|
|
const osdVisible = computed(() => {
|
|
|
return store.state.osdVisible
|
|
return store.state.osdVisible
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
- const qualityStyle = computed(() => {
|
|
|
|
|
- if (deviceInfo.dock.basic_osd?.network_state?.type === NetworkStateTypeEnum.ETHERNET ||
|
|
|
|
|
- (deviceInfo.dock.basic_osd?.network_state?.quality || 0) > NetworkStateQualityEnum.FAIR) {
|
|
|
|
|
- return 'color: #00ee8b'
|
|
|
|
|
- }
|
|
|
|
|
- if ((deviceInfo.dock.basic_osd?.network_state?.quality || 0) === NetworkStateQualityEnum.FAIR) {
|
|
|
|
|
- return 'color: yellow'
|
|
|
|
|
- }
|
|
|
|
|
- return 'color: red'
|
|
|
|
|
- })
|
|
|
|
|
-
|
|
|
|
|
watch(() => store.state.trajectoryList, (list: any) => {
|
|
watch(() => store.state.trajectoryList, (list: any) => {
|
|
|
setTimeout(() => {
|
|
setTimeout(() => {
|
|
|
if (list.length >= 2) {// 至少要有起点终点两个坐标才可以绘制轨迹
|
|
if (list.length >= 2) {// 至少要有起点终点两个坐标才可以绘制轨迹
|
|
@@ -683,13 +277,6 @@ export default defineComponent({
|
|
|
useMouseToolHook.mouseTool(type, getDrawCallback, flightAreaType)
|
|
useMouseToolHook.mouseTool(type, getDrawCallback, flightAreaType)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- // dock 控制面板
|
|
|
|
|
- const {
|
|
|
|
|
- dockControlPanelVisible,
|
|
|
|
|
- setDockControlPanelVisible,
|
|
|
|
|
- onCloseControlPanel,
|
|
|
|
|
- } = useDockControl()
|
|
|
|
|
-
|
|
|
|
|
// 连接或断开drc
|
|
// 连接或断开drc
|
|
|
useConnectMqtt()
|
|
useConnectMqtt()
|
|
|
|
|
|
|
@@ -707,11 +294,8 @@ export default defineComponent({
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
const { getDrawFlightAreaCallback, onFlightAreaDroneLocationWs } = useFlightArea()
|
|
const { getDrawFlightAreaCallback, onFlightAreaDroneLocationWs } = useFlightArea()
|
|
|
- useFlightAreaDroneLocationEvent(onFlightAreaDroneLocationWs)
|
|
|
|
|
|
|
|
|
|
- function selectFlightAreaAction({ type, isCircle }: { type: EFlightAreaType, isCircle: boolean }) {
|
|
|
|
|
- draw(isCircle ? MapDoodleEnum.CIRCLE : MapDoodleEnum.POLYGON, true, type)
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ useFlightAreaDroneLocationEvent(onFlightAreaDroneLocationWs)
|
|
|
|
|
|
|
|
function getDrawCallback({ obj }: { obj: any }) {
|
|
function getDrawCallback({ obj }: { obj: any }) {
|
|
|
if (state.isFlightArea) {
|
|
if (state.isFlightArea) {
|
|
@@ -733,6 +317,7 @@ export default defineComponent({
|
|
|
}
|
|
}
|
|
|
draw('off', false)
|
|
draw('off', false)
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
async function postPinPositionResource(obj: any) {
|
|
async function postPinPositionResource(obj: any) {
|
|
|
const req: any = getPinPositionResource(obj)
|
|
const req: any = getPinPositionResource(obj)
|
|
|
const userName = localStorage.getItem(ELocalStorageKey.Username) || ''
|
|
const userName = localStorage.getItem(ELocalStorageKey.Username) || ''
|
|
@@ -775,6 +360,7 @@ export default defineComponent({
|
|
|
});
|
|
});
|
|
|
});
|
|
});
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
async function postPolylineResource(obj: any) {
|
|
async function postPolylineResource(obj: any) {
|
|
|
const req: any = getPolylineResource(obj)
|
|
const req: any = getPolylineResource(obj)
|
|
|
const userName = localStorage.getItem(ELocalStorageKey.Username) || ''
|
|
const userName = localStorage.getItem(ELocalStorageKey.Username) || ''
|
|
@@ -845,6 +431,7 @@ export default defineComponent({
|
|
|
});
|
|
});
|
|
|
});
|
|
});
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
async function postPolygonResource(obj: any) {
|
|
async function postPolygonResource(obj: any) {
|
|
|
const req: any = getPoygonResource(obj)
|
|
const req: any = getPoygonResource(obj)
|
|
|
const userName = localStorage.getItem(ELocalStorageKey.Username) || ''
|
|
const userName = localStorage.getItem(ELocalStorageKey.Username) || ''
|
|
@@ -928,6 +515,7 @@ export default defineComponent({
|
|
|
resource
|
|
resource
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
function getPolylineResource(obj: any) {
|
|
function getPolylineResource(obj: any) {
|
|
|
const path = obj.getPath()
|
|
const path = obj.getPath()
|
|
|
const resource = generateLineContent(path)
|
|
const resource = generateLineContent(path)
|
|
@@ -938,6 +526,7 @@ export default defineComponent({
|
|
|
resource
|
|
resource
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
function getPoygonResource(obj: any) {
|
|
function getPoygonResource(obj: any) {
|
|
|
const path = obj.getPath()
|
|
const path = obj.getPath()
|
|
|
const resource = generatePolyContent(path)
|
|
const resource = generatePolyContent(path)
|
|
@@ -948,11 +537,13 @@ export default defineComponent({
|
|
|
resource
|
|
resource
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
function getBaseInfo(obj: any) {
|
|
function getBaseInfo(obj: any) {
|
|
|
const name = obj.title
|
|
const name = obj.title
|
|
|
const id = uuidv4()
|
|
const id = uuidv4()
|
|
|
return { name, id }
|
|
return { name, id }
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
function setLayers(resource: PostElementsBody) {
|
|
function setLayers(resource: PostElementsBody) {
|
|
|
const layers = store.state.Layers
|
|
const layers = store.state.Layers
|
|
|
const layer: any = layers.find((item: any) => item.id.includes(shareId.value))
|
|
const layer: any = layers.find((item: any) => item.id.includes(shareId.value))
|
|
@@ -961,12 +552,7 @@ export default defineComponent({
|
|
|
}
|
|
}
|
|
|
store.commit('SET_LAYER_INFO', layers)
|
|
store.commit('SET_LAYER_INFO', layers)
|
|
|
}
|
|
}
|
|
|
- function closeLivestreamOthers() {
|
|
|
|
|
- store.commit('SET_LIVESTREAM_OTHERS_VISIBLE', false)
|
|
|
|
|
- }
|
|
|
|
|
- function closeLivestreamAgora() {
|
|
|
|
|
- store.commit('SET_LIVESTREAM_AGORA_VISIBLE', false)
|
|
|
|
|
- }
|
|
|
|
|
|
|
+
|
|
|
function updateCoordinates(transformType: string, element: any) {
|
|
function updateCoordinates(transformType: string, element: any) {
|
|
|
const type = element.resource?.type as number
|
|
const type = element.resource?.type as number
|
|
|
if (element.resource) {
|
|
if (element.resource) {
|
|
@@ -1031,31 +617,15 @@ export default defineComponent({
|
|
|
return {
|
|
return {
|
|
|
draw,
|
|
draw,
|
|
|
mouseMode,
|
|
mouseMode,
|
|
|
- livestreamOthersVisible,
|
|
|
|
|
- livestreamAgoraVisible,
|
|
|
|
|
osdVisible,
|
|
osdVisible,
|
|
|
pin,
|
|
pin,
|
|
|
state,
|
|
state,
|
|
|
- M30,
|
|
|
|
|
planeSrc,
|
|
planeSrc,
|
|
|
satelliteSrc,
|
|
satelliteSrc,
|
|
|
deviceInfo,
|
|
deviceInfo,
|
|
|
onClickSwitchMapType,
|
|
onClickSwitchMapType,
|
|
|
- EGear,
|
|
|
|
|
EModeCode,
|
|
EModeCode,
|
|
|
str,
|
|
str,
|
|
|
- EDockModeCode,
|
|
|
|
|
- dockControlPanelVisible,
|
|
|
|
|
- setDockControlPanelVisible,
|
|
|
|
|
- onCloseControlPanel,
|
|
|
|
|
- NetworkStateTypeEnum,
|
|
|
|
|
- NetworkStateQualityEnum,
|
|
|
|
|
- RainfallEnum,
|
|
|
|
|
- DroneInDockEnum,
|
|
|
|
|
- closeLivestreamOthers,
|
|
|
|
|
- closeLivestreamAgora,
|
|
|
|
|
- qualityStyle,
|
|
|
|
|
- selectFlightAreaAction,
|
|
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
})
|
|
})
|
|
@@ -1134,80 +704,6 @@ export default defineComponent({
|
|
|
justify-content: flex-end;
|
|
justify-content: flex-end;
|
|
|
align-items: center;
|
|
align-items: center;
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
-.osd-panel {
|
|
|
|
|
- position: absolute;
|
|
|
|
|
- margin-left: 10px;
|
|
|
|
|
- left: 0;
|
|
|
|
|
- top: 10px;
|
|
|
|
|
- width: 480px;
|
|
|
|
|
- background: #000;
|
|
|
|
|
- color: #fff;
|
|
|
|
|
- border-radius: 2px;
|
|
|
|
|
- background-color: rgba(0, 0, 0, 0.8);
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-.osd>div:not(.dock-control-panel) {
|
|
|
|
|
- margin-top: 5px;
|
|
|
|
|
- padding: 5px;
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-.circle {
|
|
|
|
|
- border-radius: 50%;
|
|
|
|
|
- width: 10px;
|
|
|
|
|
- height: 10px;
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-.battery-slide {
|
|
|
|
|
- .capacity-percent {
|
|
|
|
|
- background: #00ee8b;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- .return-home {
|
|
|
|
|
- background: #ff9f0a;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- .landing {
|
|
|
|
|
- background: #f5222d;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- .white-point {
|
|
|
|
|
- width: 4px;
|
|
|
|
|
- height: 4px;
|
|
|
|
|
- border-radius: 50%;
|
|
|
|
|
- background: white;
|
|
|
|
|
- bottom: -0.5px;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- .battery {
|
|
|
|
|
- background: #141414;
|
|
|
|
|
- color: #00ee8b;
|
|
|
|
|
- margin-top: -10px;
|
|
|
|
|
- height: 20px;
|
|
|
|
|
- width: auto;
|
|
|
|
|
- border-left: 1px solid #00ee8b;
|
|
|
|
|
- padding: 0 5px;
|
|
|
|
|
- }
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-.battery-slide>div {
|
|
|
|
|
- position: absolute;
|
|
|
|
|
- min-height: 2px;
|
|
|
|
|
- border-radius: 2px;
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-.liveview {
|
|
|
|
|
- position: absolute;
|
|
|
|
|
- color: #fff;
|
|
|
|
|
- z-index: 1;
|
|
|
|
|
- left: 0;
|
|
|
|
|
- margin-left: 10px;
|
|
|
|
|
- top: 10px;
|
|
|
|
|
- text-align: center;
|
|
|
|
|
- width: 800px;
|
|
|
|
|
- height: 660px;
|
|
|
|
|
- background: #232323;
|
|
|
|
|
-}
|
|
|
|
|
</style>
|
|
</style>
|
|
|
|
|
|
|
|
<style lang="scss">
|
|
<style lang="scss">
|