Browse Source

完善机场详情

李富豪 1 year ago
parent
commit
980a948f91

+ 524 - 360
Web/src/components/airport/components/InfoModal.vue

@@ -28,315 +28,279 @@
           </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>
+      <div class="content-dock-info">
+        <div class="content-dock-info-cell">
+          <div class="content-dock-info-cell-style">
+            {{ getTextByDockModeCode(deviceInfo.dock.basic_osd?.mode_code) }}
+          </div>
+          <div class="content-dock-info-cell-status">
+            <div v-if="deviceInfo.device">
+              获取机场状态
+            </div>
+            <div v-else>
+              N/A
+            </div>
+          </div>
+        </div>
+        <div class="content-dock-info-cell">
+          <div class="content-dock-info-cell-style">
+            <div v-if="1">
+              <img :src="weatherSrc">
+              适合飞行
+            </div>
+            <div v-else>
+              <img :src="weatherSrc">
+              不适合飞行
+            </div>
+          </div>
+          <div class="content-dock-info-cell-row">
+            <a-row>
+              <a-col span="8">
+                <a-tooltip title="温度">
+                  <div style="display: flex;align-items: center;">
+                    <img :src="temperatureSrc">
+                    <span>
+                      {{ deviceInfo.dock.basic_osd?.temperature }}
+                    </span>
+                    <span>
+                      °C
+                    </span>
+                  </div>
+                </a-tooltip>
+              </a-col>
+              <a-col span="8">
+                <a-tooltip title="网速">
+                  <div style="display: flex;align-items: center;">
+                    <img :src="networkSrc">
+                    <span>
+                      {{ deviceInfo.dock.basic_osd?.network_state?.rate }}
+                    </span>
+                    <span>
+                      kb/s
+                    </span>
+                  </div>
+                </a-tooltip>
+              </a-col>
+              <a-col span="8">
+                <a-tooltip title="文件上传">
+                  <div style="display: flex;align-items: center;">
+                    <img :src="uploadSrc">
+                    <div>
+                      {{ 0 }}
+                    </div>
+                  </div>
+                </a-tooltip>
+              </a-col>
+            </a-row>
+          </div>
+        </div>
+        <div class="content-dock-info-cell">
+          <div class="content-dock-info-cell-button">
+            监控直播
+          </div>
+          <div class="content-dock-info-cell-icon">
+            <a-tooltip title="操作">
+              <img :src="actionSelectedSrc" @click="setDockControlPanelVisible(false)" v-if="dockControlPanelVisible">
+              <img :src="actionSrc" @click="setDockControlPanelVisible(true)" v-else>
             </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)">
-              操作
-            </a-button>
-          </a-col>
-        </a-row>
+          </div>
+        </div>
       </div>
     </div>
     <!--  飞机-->
     <div class="content-aircraft">
-      <div class="content-dock-left">
-        <div class="content-dock-left-image">
-          <a-image :src="M3tdSrc" :preview="false" v-if="osdInfo.model === 'M3TD'" />
-          <a-image :src="M30Src" :preview="false" v-else />
+      <div class="content-aircraft-head">
+        <div class="content-aircraft-head-icon">
+          <div class="content-aircraft-head-icon-image">
+            <a-image :src="M3tdSrc" :preview="false" v-if="osdInfo.model === 'M3TD'" />
+            <a-image :src="M30Src" :preview="false" v-else />
+          </div>
+          <a-tooltip :title="osdInfo.model">
+            <div class="content-aircraft-head-icon-text">
+              {{ osdInfo.model }}
+            </div>
+          </a-tooltip>
         </div>
-        <a-tooltip :title="osdInfo.model">
-          <div class="content-dock-left-image-text">
-            {{ osdInfo.model }}
+        <div class="content-aircraft-head-right">
+          <div class="content-aircraft-head-right-top">
+            <div class="content-aircraft-head-right-top-style">
+              舱内关闭
+            </div>
+            <div class="content-aircraft-head-right-top-status">
+              <div v-if="deviceInfo.device">
+                {{ getTextByModeCode(deviceInfo.device.mode_code) }}
+              </div>
+              <div v-else>
+                N/A
+              </div>
+            </div>
           </div>
-        </a-tooltip>
+          <div class="content-aircraft-head-right-bottom">
+            <div class="content-aircraft-head-right-bottom-button">
+              开启直播
+            </div>
+            <div class="content-aircraft-head-right-bottom-icon">
+              <a-tooltip title="操作">
+                <img :src="aircraftSelectedSrc" @click="setDockControlPanelVisible(false)"
+                  v-if="dockControlPanelVisible">
+                <img :src="aircraftSrc" @click="setDockControlPanelVisible(true)" v-else>
+              </a-tooltip>
+            </div>
+          </div>
+          <div class="content-aircraft-head-right-select">
+            <div v-if="state.deviceLiveStatus">
+              <a-select style="width: 125px;margin-right: 5px;" placeholder="摄像头" v-model:value="state.cameraValue">
+                <a-select-option v-for="item in state.cameraList" :key="item.value" :value="item.value"
+                  @click="onCameraSelect(item)">
+                  {{ item.label }}
+                </a-select-option>
+              </a-select>
+              <a-select style="width: 125px;margin-right: 5px;" placeholder="清晰度" v-model:value="state.clarityValue"
+                @select="onClaritySelect">
+                <a-select-option v-for="item in clarityList" :key="item.value" :value="item.value">
+                  {{ item.label }}
+                </a-select-option>
+              </a-select>
+              <a-button style="margin-right: 5px;" :icon="h(PlaySquareOutlined)" @click="onStart" />
+              <a-button :icon="h(PoweroffOutlined)" @click="onStop" />
+            </div>
+          </div>
+        </div>
       </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>
+      <div class="battery-slide">
+        <div style="background: #535759;" class="width-100"></div>
+        <div class="capacity-percent" :style="{ width: deviceInfo.device?.battery.capacity_percent + '%' }"></div>
+      </div>
+      <LivePlayer :text="state.playerText" :url="state.playerUrl" v-if="state.deviceLiveStatus" />
+      <div class="content-aircraft-info">
+        <a-row style="margin-bottom: 5px;">
           <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>
+            <div style="margin-top: -3px;" class="content-aircraft-info-item">
+              <a-tooltip title="遥控器信号">
+                <div style="display: flex;align-items: flex-end;">
+                  <img style="margin-right: 5px;" :src="controllerSrc" v-if="controllerSignal > 0">
+                  <img style="margin-right: 5px;" :src="controllerErrorSrc" v-else>
+                  <div>
+                    <img :src="signalThreeSrc" v-if="controllerSignal <= 3">
+                    <img :src="signalFourSrc" v-else-if="controllerSignal === 4">
+                    <img :src="signalFiveSrc" v-else-if="controllerSignal === 5">
+                  </div>
+                </div>
+              </a-tooltip>
+              <a-tooltip title="飞行器信号">
+                <div style="display: flex;align-items: flex-end;">
+                  <img style="width: 15px;margin-right: 5px;" :src="fourGSrc" v-if="aircraftSignal > 0">
+                  <img style="width: 15px;margin-right: 5px;" :src="fourGErrorSrc" v-else>
+                  <div>
+                    <img :src="signalThreeSrc" v-if="aircraftSignal <= 3">
+                    <img :src="signalFourSrc" v-else-if="aircraftSignal === 4">
+                    <img :src="signalFiveSrc" v-else-if="aircraftSignal === 5">
+                  </div>
+                </div>
+              </a-tooltip>
+            </div>
           </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>
+            <div class="content-aircraft-info-item">
+              <a-tooltip title="RTK">
+                <div style="display: flex;align-items: center;margin-right: 5px;">
+                  <img style="width: 24px;margin-right: 5px;" :src="rtkSrc" v-if="RTK > 0">
+                  <img style="width: 24px; margin-right: 5px;" :src="rtkErrorSrc" v-else>
+                  <div>
+                    {{ RTK }}
+                  </div>
+                </div>
+              </a-tooltip>
+              <a-tooltip title="GPS">
+                <div style="display: flex;align-items: center;">
+                  <img style="margin-right: 5px;" :src="gpsSrc" v-if="GPS > 0">
+                  <img style="margin-right: 5px;" :src="gpsErrorSrc" v-else>
+                  <div>
+                    {{ GPS }}
+                  </div>
+                </div>
+              </a-tooltip>
+            </div>
           </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 title="电量">
+              <div class="content-aircraft-info-item">
+                <div style="margin-right: 5px;">
+                  <img :src="batteryOneSrc" v-if="capacity >= 75">
+                  <img :src="batteryTwoSrc" v-else-if="capacity >= 50 && capacity < 75">
+                  <img :src="batteryThreeSrc" v-else-if="capacity >= 25 && capacity < 50">
+                  <img :src="batteryFourSrc" v-else-if="capacity < 25">
+                </div>
+                <div>
+                  {{ capacity + '%' }}
+                </div>
+              </div>
             </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 title="风向速度">
+              <div class="content-aircraft-info-item">
+                <img style="margin-right: 5px;" :src="windSrc">
+                <div style="font-weight: bold;margin-right: 5px;">
+                  W.S
+                </div>
+                <div>
+                  {{ windSpeed }}
+                </div>
+              </div>
             </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 title="海拔高度">
+              <div class="content-aircraft-info-item">
+                <div style="font-weight: bold;margin-right: 5px;">
+                  ASL
+                </div>
+                <div>
+                  {{ ASL }}
+                </div>
+              </div>
             </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 title="离地高度">
+              <div class="content-aircraft-info-item">
+                <div style="font-weight: bold;margin-right: 5px;">
+                  AGL
+                </div>
+                <div>
+                  {{ AGL }}
+                </div>
+              </div>
             </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 title="水平速度">
+              <div class="content-aircraft-info-item">
+                <div style="font-weight: bold;margin-right: 5px;">
+                  H.S
+                </div>
+                <div>
+                  {{ HS }}
+                </div>
+              </div>
             </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 title="当前高度">
+              <div class="content-aircraft-info-item">
+                <img style="margin-right: 5px;" :src="homeSrc">
+                <div>
+                  {{ homeDistance }}
+                </div>
+              </div>
             </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>
     <!-- 机场控制面板 -->
     <DockControlPanel v-if="dockControlPanelVisible" :sn="osdInfo.gateway_sn" :deviceInfo="deviceInfo"
       @close-control-panel="onCloseControlPanel" />
@@ -346,22 +310,26 @@
 </template>
 
 <script lang="ts" setup>
-import { computed, reactive, onMounted } from 'vue';
+import { h, computed, reactive, onMounted } from 'vue';
 import { message } from 'ant-design-vue';
-import {
-  CloseOutlined, ControlOutlined, TrademarkOutlined, ArrowDownOutlined,
-  ThunderboltOutlined, SignalFilled, GlobalOutlined, HistoryOutlined, CloudUploadOutlined, RocketOutlined,
-  FieldTimeOutlined, FolderOpenOutlined, ArrowUpOutlined, CarryOutOutlined
-} from '@ant-design/icons-vue'
+import { CloseOutlined, PlaySquareOutlined, PoweroffOutlined } from '@ant-design/icons-vue'
 import LivePlayer from '/@/components/livePlayer/index.vue';
 import taskSrc from '../icons/info/task.svg';
 import dock2Src from '../icons/info/dock2.png';
 import M30Src from '../icons/info/m30.png';
 import M3tdSrc from '../icons/info/m3td.png';
+import weatherSrc from '../icons/info/weather.svg';
+import temperatureSrc from '../icons/info/temperature.svg';
+import networkSrc from '../icons/info/network.svg';
+import uploadSrc from '../icons/info/upload.svg';
+import actionSrc from '../icons/info/action.svg';
+import actionSelectedSrc from '../icons/info/action_selected.svg';
+import aircraftSrc from '../icons/aircraft.svg';
+import aircraftSelectedSrc from '../icons/aircraft_selected.svg';
 import controllerSrc from '../icons/info/controller.svg';
 import controllerErrorSrc from '../icons/info/controllerError.svg';
-import networkSrc from '../icons/info/network.svg';
-import networkErrorSrc from '../icons/info/networkError.svg';
+import fourGSrc from '../icons/info/fourG.svg';
+import fourGErrorSrc from '../icons/info/fourGError.svg';
 import signalThreeSrc from '../icons/info/signalThree.svg';
 import signalFourSrc from '../icons/info/signalFour.svg';
 import signalFiveSrc from '../icons/info/signalFive.svg';
@@ -369,21 +337,18 @@ import rtkSrc from '../icons/info/rtk.svg';
 import rtkErrorSrc from '../icons/info/rtkError.svg';
 import gpsSrc from '../icons/info/gps.svg';
 import gpsErrorSrc from '../icons/info/gpsError.svg';
-// import batteryOneSrc from '../icons/batteryOne.svg';
-// import batteryTwoSrc from '../icons/batteryTwo.svg';
-// import batteryThreeSrc from '../icons/batteryThree.svg';
-// import batteryFourSrc from '../icons/batteryFour.svg';
+import batteryOneSrc from '../icons/info/batteryOne.svg';
+import batteryTwoSrc from '../icons/info/batteryTwo.svg';
+import batteryThreeSrc from '../icons/info/batteryThree.svg';
+import batteryFourSrc from '../icons/info/batteryFour.svg';
 import windSrc from '../icons/info/wind.svg';
 import homeSrc from '../icons/info/home.svg';
 import { CURRENT_CONFIG as config } from '/@/api/http/config';
 import { getLiveCapacity, startLivestream, stopLivestream } from '/@/api/manage';
 import DockControlPanel from '../../g-map/DockControlPanel.vue'
 import DroneControlPanel from '../../g-map/DroneControlPanel.vue'
-import {
-  DeviceOsd, DeviceStatus, DockOsd, EGear, EModeCode, GatewayOsd, EDockModeCode,
-  NetworkStateQualityEnum, NetworkStateTypeEnum, RainfallEnum, DroneInDockEnum
-} from '/@/types/device'
 import { useDockControl } from '../../g-map/use-dock-control';
+import { getTextByModeCode, getTextByDockModeCode } from '/@/utils/index'
 
 interface Props {
   osdInfo: any
@@ -399,18 +364,17 @@ const { dockControlPanelVisible, setDockControlPanelVisible, onCloseControlPanel
 
 // 遥控器信号
 const controllerSignal = computed(() => {
-  // const info = props.deviceInfo.gateway;
-  // if (info && info.wireless_link) {
-  //   return info.wireless_link['4g_gnd_quality'];
-  // } else {
-  //   return 0;
-  // }
+  const info = props.deviceInfo?.gateway;
+  if (info && info.wireless_link) {
+    return info.wireless_link['4g_gnd_quality'];
+  } else {
+    return 0;
+  }
 });
-console.log(props.osdInfo, 'dev');
 
 // 飞机信号
 const aircraftSignal = computed(() => {
-  const info = props.deviceInfo.gateway;
+  const info = props.deviceInfo?.gateway;
   if (info && info.wireless_link) {
     return info.wireless_link['4g_uav_quality'];
   } else {
@@ -418,18 +382,98 @@ const aircraftSignal = computed(() => {
   }
 });
 
-const str: string = '--'
+const RTK = computed(() => {
+  const info = props.deviceInfo?.device;
+  if (info) {
+    return info.position_state.rtk_number;
+  } else {
+    return '';
+  }
+});
 
-const qualityStyle = computed(() => {
-  if (props.deviceInfo.dock.basic_osd?.network_state?.type === NetworkStateTypeEnum.ETHERNET ||
-    (props.deviceInfo.dock.basic_osd?.network_state?.quality || 0) > NetworkStateQualityEnum.FAIR) {
-    return 'color: #00ee8b'
+const GPS = computed(() => {
+  const info = props.deviceInfo?.device;
+  if (info) {
+    return info.position_state.gps_number;
+  } else {
+    return 0;
   }
-  if ((props.deviceInfo.dock.basic_osd?.network_state?.quality || 0) === NetworkStateQualityEnum.FAIR) {
-    return 'color: yellow'
+});
+
+// 电池容量
+const capacity = computed(() => {
+  const info = props.deviceInfo?.device;
+  if (info) {
+    return info.battery.capacity_percent;
+  } else {
+    return 0;
   }
-  return 'color: red'
-})
+});
+
+const windSpeed = computed(() => {
+  const info = props.deviceInfo?.device;
+  if (info) {
+    if (info.wind_speed === '--') {
+      return info.wind_speed;
+    } else {
+      return (info.wind_speed / 10).toFixed(2) + ' m/s';
+    }
+  } else {
+    return '';
+  }
+});
+
+const ASL = computed(() => {
+  const info = props.deviceInfo?.device;
+  if (info) {
+    if (info.height === '--') {
+      return info.height;
+    } else {
+      return info.height.toFixed(2) + ' m';
+    }
+  } else {
+    return '';
+  }
+});
+
+const AGL = computed(() => {
+  const info = props.deviceInfo?.device;
+  if (info) {
+    if (info.elevation === '--') {
+      return info.elevation;
+    } else {
+      return info.elevation.toFixed(2) + ' m';
+    }
+  } else {
+    return '';
+  }
+});
+
+const HS = computed(() => {
+  const info = props.deviceInfo?.device;
+  if (info) {
+    if (info.horizontal_speed === '--') {
+      return info.horizontal_speed;
+    } else {
+      return info.horizontal_speed.toFixed(2) + ' m/s';
+    }
+  } else {
+    return '';
+  }
+});
+
+const homeDistance = computed(() => {
+  const info = props.deviceInfo?.device;
+  if (info) {
+    if (info.home_distance === '--') {
+      return info.home_distance;
+    } else {
+      return info.home_distance.toFixed(2) + ' m';
+    }
+  } else {
+    return '';
+  }
+});
 
 interface SelectOption {
   value: any,
@@ -614,6 +658,7 @@ const onStop = async () => {
   }
 
   &-dock {
+    font-size: 12px;
     display: flex;
     border-bottom: 1px solid #535759;
     position: relative;
@@ -638,59 +683,186 @@ const onStop = async () => {
         overflow: hidden;
       }
     }
+
+    &-info {
+      flex: 1;
+      padding: 5px;
+
+      &-cell {
+        display: flex;
+        align-items: center;
+        margin: 10px 0;
+
+        &-style {
+          width: 100px;
+          border-right: 1px solid #535759;
+          margin-right: 5px;
+
+          img {
+            width: 14px;
+            height: 14px;
+            margin-right: 2px
+          }
+        }
+
+        &-row {
+          flex: 1;
+
+          img {
+            width: 14px;
+            height: 14px;
+            margin-right: 5px;
+          }
+        }
+
+        &-status {
+          flex: 1;
+          padding-left: 5px;
+          background: #4a4d4e;
+        }
+
+        &-button {
+          flex: 1;
+          height: 24px;
+          padding: 2px 4px;
+          border: 1.5px solid #535759;
+          border-radius: 2px;
+          cursor: pointer;
+          margin-right: 5px;
+          display: flex;
+          justify-content: center;
+          align-items: center;
+        }
+
+        &-icon {
+          width: 24px;
+          height: 24px;
+          padding: 2px 4px;
+          border: 1.5px solid #535759;
+          border-radius: 2px;
+          cursor: pointer;
+          display: flex;
+          justify-content: center;
+          align-items: center;
+
+          img {
+            width: 14px;
+            height: 14px;
+          }
+        }
+      }
+    }
   }
 
   &-aircraft {
-    display: flex;
-    border-bottom: 1px solid #535759;
+    font-size: 12px;
 
-    &-left {
-      width: 80px;
-      padding: 5px;
-      background: #3d3d3d;
+    &-head {
       display: flex;
-      flex-direction: column;
-      justify-content: center;
-      align-items: center;
 
-      &-image {
-        width: 80%;
-        margin-bottom: 10px;
+      &-icon {
+        width: 80px;
+        padding: 5px;
+        background: #3d3d3d;
+        display: flex;
+        flex-direction: column;
+        justify-content: center;
+        align-items: center;
+
+        &-image {
+          width: 80%;
+        }
+
+        &-text {
+          text-align: center;
+          white-space: nowrap;
+          overflow: hidden;
+        }
       }
 
-      &-text {
-        text-align: center;
-        white-space: nowrap;
-        overflow: hidden;
+      &-right {
+        flex: 1;
+        padding: 5px;
+
+        &-top {
+          margin: 10px 0;
+          display: flex;
+          align-items: center;
+
+          &-style {
+            width: 100px;
+            color: #2a994b;
+            border-right: 1px solid #535759;
+            margin-right: 5px;
+          }
+
+          &-status {
+            flex: 1;
+            padding-left: 5px;
+            background: #4a4d4e;
+          }
+        }
+
+        &-bottom {
+          display: flex;
+          align-items: center;
+
+          &-button {
+            flex: 1;
+            height: 24px;
+            padding: 2px 4px;
+            border: 1.5px solid #535759;
+            border-radius: 2px;
+            cursor: pointer;
+            margin-right: 5px;
+            display: flex;
+            justify-content: center;
+            align-items: center;
+          }
+
+          &-icon {
+            width: 24px;
+            height: 24px;
+            padding: 2px 4px;
+            border: 1.5px solid #535759;
+            border-radius: 2px;
+            cursor: pointer;
+            display: flex;
+            justify-content: center;
+            align-items: center;
+
+            img {
+              width: 14px;
+              height: 14px;
+            }
+          }
+        }
+
+        &-select {
+          margin: 10px 0 5px;
+        }
       }
     }
-  }
-}
 
-.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);
-}
+    &-info {
+      padding: 5px;
 
-.osd>div:not(.dock-control-panel) {
-  margin-top: 5px;
-  padding: 5px;
-}
+      &-item {
+        display: flex;
+        align-items: center;
 
-.circle {
-  border-radius: 50%;
-  width: 10px;
-  height: 10px;
+        img {
+          width: 13px;
+          height: 13px;
+        }
+      }
+    }
+  }
 }
 
 .battery-slide {
+  width: 100%;
+
   .capacity-percent {
     background: #00ee8b;
   }
@@ -703,28 +875,20 @@ const onStop = async () => {
     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;
+    background: white;
+    border-radius: 1px;
+    width: 8px;
+    height: 4px;
+    margin-top: -3px;
   }
 }
 
 .battery-slide>div {
-  position: absolute;
+  position: relative;
+  margin-top: -2px;
   min-height: 2px;
   border-radius: 2px;
+  white-space: nowrap;
 }
 </style>

File diff suppressed because it is too large
+ 5 - 0
Web/src/components/airport/icons/aircraft_selected.svg


File diff suppressed because it is too large
+ 0 - 0
Web/src/components/airport/icons/info/action.svg


File diff suppressed because it is too large
+ 0 - 0
Web/src/components/airport/icons/info/action_selected.svg


+ 10 - 0
Web/src/components/airport/icons/info/batteryFour.svg

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="32px" height="32px" viewBox="0 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>Icons/battery 4</title>
+    <g id="Icons/battery" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="编组" transform="translate(16.039062, 16.000000) rotate(-90.000000) translate(-16.039062, -16.000000) translate(1.039062, 8.460938)" fill-rule="nonzero">
+            <polygon id="路径" fill="#E02020" points="3.6 3.23125 7.6 3.23125 7.6 11.846875 3.6 11.846875"></polygon>
+            <path d="M28.9924124,4.309375 L27.6835528,4.309375 L27.6835528,1.078125 C27.6835528,0.484375 27.1646954,0 26.5286766,0 L1.15487614,0 C0.522204865,0 0,0.484375 0,1.078125 L0,14 C0,14.590625 0.518857398,15.078125 1.15487614,15.078125 L26.5353716,15.078125 C27.1680428,15.078125 27.6902477,14.59375 27.6902477,14 L27.6902477,10.771875 L28.9991073,10.771875 C29.5514394,10.771875 30,10.353125 30,9.8375 L30,5.24375 C29.9933051,4.73125 29.5447445,4.309375 28.9924124,4.309375 Z M25.3804954,12.925 L2.30640482,12.925 L2.30640482,2.15625 L25.377148,2.15625 L25.377148,12.925 L25.3804954,12.925 Z" id="形状" fill="#FFFFFF"></path>
+        </g>
+    </g>
+</svg>

+ 13 - 0
Web/src/components/airport/icons/info/batteryOne.svg

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="32px" height="32px" viewBox="0 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>Icons/battery</title>
+    <g id="Icons/battery" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="编组" transform="translate(16.039062, 16.000000) rotate(-90.000000) translate(-16.039062, -16.000000) translate(1.039062, 8.460938)" fill="#FFFFFF" fill-rule="nonzero">
+            <polygon id="路径" points="3.6 3.23125 7.6 3.23125 7.6 11.846875 3.6 11.846875"></polygon>
+            <polygon id="路径" points="9.06666667 3.23125 13.0666667 3.23125 13.0666667 11.846875 9.06666667 11.846875"></polygon>
+            <polygon id="路径" points="14.5333333 3.23125 18.5333333 3.23125 18.5333333 11.846875 14.5333333 11.846875"></polygon>
+            <polygon id="路径" points="20 3.23125 24 3.23125 24 11.846875 20 11.846875"></polygon>
+            <path d="M28.9924124,4.309375 L27.6835528,4.309375 L27.6835528,1.078125 C27.6835528,0.484375 27.1646954,0 26.5286766,0 L1.15487614,0 C0.522204865,0 0,0.484375 0,1.078125 L0,14 C0,14.590625 0.518857398,15.078125 1.15487614,15.078125 L26.5353716,15.078125 C27.1680428,15.078125 27.6902477,14.59375 27.6902477,14 L27.6902477,10.771875 L28.9991073,10.771875 C29.5514394,10.771875 30,10.353125 30,9.8375 L30,5.24375 C29.9933051,4.73125 29.5447445,4.309375 28.9924124,4.309375 Z M25.3804954,12.925 L2.30640482,12.925 L2.30640482,2.15625 L25.377148,2.15625 L25.377148,12.925 L25.3804954,12.925 Z" id="形状"></path>
+        </g>
+    </g>
+</svg>

+ 11 - 0
Web/src/components/airport/icons/info/batteryThree.svg

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="32px" height="32px" viewBox="0 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>Icons/battery 3</title>
+    <g id="Icons/battery" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="编组" transform="translate(16.039062, 16.000000) rotate(-90.000000) translate(-16.039062, -16.000000) translate(1.039062, 8.460938)" fill="#FFFFFF" fill-rule="nonzero">
+            <polygon id="路径" points="3.6 3.23125 7.6 3.23125 7.6 11.846875 3.6 11.846875"></polygon>
+            <polygon id="路径" points="9.06666667 3.23125 13.0666667 3.23125 13.0666667 11.846875 9.06666667 11.846875"></polygon>
+            <path d="M28.9924124,4.309375 L27.6835528,4.309375 L27.6835528,1.078125 C27.6835528,0.484375 27.1646954,0 26.5286766,0 L1.15487614,0 C0.522204865,0 0,0.484375 0,1.078125 L0,14 C0,14.590625 0.518857398,15.078125 1.15487614,15.078125 L26.5353716,15.078125 C27.1680428,15.078125 27.6902477,14.59375 27.6902477,14 L27.6902477,10.771875 L28.9991073,10.771875 C29.5514394,10.771875 30,10.353125 30,9.8375 L30,5.24375 C29.9933051,4.73125 29.5447445,4.309375 28.9924124,4.309375 Z M25.3804954,12.925 L2.30640482,12.925 L2.30640482,2.15625 L25.377148,2.15625 L25.377148,12.925 L25.3804954,12.925 Z" id="形状"></path>
+        </g>
+    </g>
+</svg>

+ 12 - 0
Web/src/components/airport/icons/info/batteryTwo.svg

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="32px" height="32px" viewBox="0 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>Icons/battery 2</title>
+    <g id="Icons/battery" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="编组" transform="translate(16.039062, 16.000000) rotate(-90.000000) translate(-16.039062, -16.000000) translate(1.039062, 8.460938)" fill="#FFFFFF" fill-rule="nonzero">
+            <polygon id="路径" points="3.6 3.23125 7.6 3.23125 7.6 11.846875 3.6 11.846875"></polygon>
+            <polygon id="路径" points="9.06666667 3.23125 13.0666667 3.23125 13.0666667 11.846875 9.06666667 11.846875"></polygon>
+            <polygon id="路径" points="14.5333333 3.23125 18.5333333 3.23125 18.5333333 11.846875 14.5333333 11.846875"></polygon>
+            <path d="M28.9924124,4.309375 L27.6835528,4.309375 L27.6835528,1.078125 C27.6835528,0.484375 27.1646954,0 26.5286766,0 L1.15487614,0 C0.522204865,0 0,0.484375 0,1.078125 L0,14 C0,14.590625 0.518857398,15.078125 1.15487614,15.078125 L26.5353716,15.078125 C27.1680428,15.078125 27.6902477,14.59375 27.6902477,14 L27.6902477,10.771875 L28.9991073,10.771875 C29.5514394,10.771875 30,10.353125 30,9.8375 L30,5.24375 C29.9933051,4.73125 29.5447445,4.309375 28.9924124,4.309375 Z M25.3804954,12.925 L2.30640482,12.925 L2.30640482,2.15625 L25.377148,2.15625 L25.377148,12.925 L25.3804954,12.925 Z" id="形状"></path>
+        </g>
+    </g>
+</svg>

+ 10 - 0
Web/src/components/airport/icons/info/fourG.svg

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="50px" height="32px" viewBox="0 0 50 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>Icons/4G</title>
+    <g id="Icons/4G" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="4G" transform="translate(1.000000, 2.000000)" fill="#FFFFFF" fill-rule="nonzero">
+            <path d="M36.331924,0 C39.7917375,0 42.5015915,0.824955542 44.4514864,2.47486662 C46.4013814,4.12477771 47.5613189,6.52964814 47.9212995,9.68447805 L42.066615,9.68447805 C41.7966295,8.014568 41.2066613,6.78963406 40.2917106,6.01467586 C39.3767599,5.23971766 38.1168278,4.85473833 36.5119143,4.85473833 C34.4620248,4.85473833 32.9121083,5.61969711 31.8371663,7.15461442 C30.7722236,8.6945314 30.227253,10.9844081 30.2172536,14.0142448 L30.2172536,15.8791442 C30.2172536,18.9439791 30.7972223,21.2538546 31.9571598,22.8187703 C33.122097,24.383686 34.8270052,25.1686436 37.0718841,25.1686436 C39.3317623,25.1686436 40.9416756,24.6836697 41.9066236,23.7187218 L41.9066236,18.6939926 L36.4319187,18.6939926 L36.4319187,14.2642313 L47.9212995,14.2642313 L47.9212995,25.9136034 C46.8363579,27.2135333 45.3064404,28.2134795 43.3315468,28.928441 C41.2173229,29.6653271 38.9906737,30.0274114 36.7519013,29.9983833 C34.2270374,29.9983833 32.0121568,29.448413 30.1022598,28.3484722 C28.1818149,27.2277754 26.6447461,25.5530326 25.6924974,23.5437311 C24.6575532,21.4438443 24.1275817,18.9739775 24.0975834,16.14413 L24.0975834,14.1592369 C24.0975834,11.244394 24.5925567,8.71953013 25.5725039,6.58964491 C26.45906,4.56298594 27.9412943,2.85405694 29.8222748,1.68990889 C31.6721751,0.564969514 33.8420582,0 36.331924,0 L36.331924,0 Z" id="路径"></path>
+            <path d="M18.0290284,0.399978405 L18.0290284,18.6089971 L21.3338503,18.6089971 L21.3338503,23.2787455 L18.0290284,23.2787455 L18.0290284,29.5984049 L12.229341,29.5984049 L12.229341,23.2787455 L0.26498568,23.2787455 L0,19.6289421 L12.1693442,0.399978405 L18.0290284,0.399978405 Z M12.2343406,8.29955276 L12.229341,8.29955276 L11.8493614,8.96451685 L5.77468879,18.6089971 L12.2343406,18.6089971 L12.2343406,8.29955276 Z" id="形状结合"></path>
+        </g>
+    </g>
+</svg>

+ 0 - 0
Web/src/components/airport/icons/info/networkError.svg → Web/src/components/airport/icons/info/fourGError.svg


+ 1 - 10
Web/src/components/airport/icons/info/network.svg

@@ -1,10 +1 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<svg width="50px" height="32px" viewBox="0 0 50 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
-    <title>Icons/4G</title>
-    <g id="Icons/4G" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
-        <g id="4G" transform="translate(1.000000, 2.000000)" fill="#FFFFFF" fill-rule="nonzero">
-            <path d="M36.331924,0 C39.7917375,0 42.5015915,0.824955542 44.4514864,2.47486662 C46.4013814,4.12477771 47.5613189,6.52964814 47.9212995,9.68447805 L42.066615,9.68447805 C41.7966295,8.014568 41.2066613,6.78963406 40.2917106,6.01467586 C39.3767599,5.23971766 38.1168278,4.85473833 36.5119143,4.85473833 C34.4620248,4.85473833 32.9121083,5.61969711 31.8371663,7.15461442 C30.7722236,8.6945314 30.227253,10.9844081 30.2172536,14.0142448 L30.2172536,15.8791442 C30.2172536,18.9439791 30.7972223,21.2538546 31.9571598,22.8187703 C33.122097,24.383686 34.8270052,25.1686436 37.0718841,25.1686436 C39.3317623,25.1686436 40.9416756,24.6836697 41.9066236,23.7187218 L41.9066236,18.6939926 L36.4319187,18.6939926 L36.4319187,14.2642313 L47.9212995,14.2642313 L47.9212995,25.9136034 C46.8363579,27.2135333 45.3064404,28.2134795 43.3315468,28.928441 C41.2173229,29.6653271 38.9906737,30.0274114 36.7519013,29.9983833 C34.2270374,29.9983833 32.0121568,29.448413 30.1022598,28.3484722 C28.1818149,27.2277754 26.6447461,25.5530326 25.6924974,23.5437311 C24.6575532,21.4438443 24.1275817,18.9739775 24.0975834,16.14413 L24.0975834,14.1592369 C24.0975834,11.244394 24.5925567,8.71953013 25.5725039,6.58964491 C26.45906,4.56298594 27.9412943,2.85405694 29.8222748,1.68990889 C31.6721751,0.564969514 33.8420582,0 36.331924,0 L36.331924,0 Z" id="路径"></path>
-            <path d="M18.0290284,0.399978405 L18.0290284,18.6089971 L21.3338503,18.6089971 L21.3338503,23.2787455 L18.0290284,23.2787455 L18.0290284,29.5984049 L12.229341,29.5984049 L12.229341,23.2787455 L0.26498568,23.2787455 L0,19.6289421 L12.1693442,0.399978405 L18.0290284,0.399978405 Z M12.2343406,8.29955276 L12.229341,8.29955276 L11.8493614,8.96451685 L5.77468879,18.6089971 L12.2343406,18.6089971 L12.2343406,8.29955276 Z" id="形状结合"></path>
-        </g>
-    </g>
-</svg>
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1726210113490" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6402" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M919.864407 0H399.186441v104.135593h520.677966v590.101695H277.694915v104.135593h234.305085v121.491526H303.728814v104.135593h520.677966v-104.135593H616.135593V798.372881h407.864407V0h-104.135593z" p-id="6403" fill="#ffffff"></path><path d="M329.762712 433.898305V173.559322h-34.711865V0H34.711864v173.559322H0v260.338983a86.779661 86.779661 0 0 0 86.779661 86.779661h34.711864v503.322034h86.779661V520.677966h34.711865a86.779661 86.779661 0 0 0 86.779661-86.779661zM121.491525 86.779661h86.779661v86.779661H121.491525z m-34.711864 173.559322h156.20339v173.559322H86.779661z" p-id="6404" fill="#ffffff"></path></svg>

File diff suppressed because it is too large
+ 0 - 0
Web/src/components/airport/icons/info/temperature.svg


+ 1 - 0
Web/src/components/airport/icons/info/upload.svg

@@ -0,0 +1 @@
+<svg t="1726212498174" class="icon" viewBox="0 0 1137 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5485" width="200" height="200"><path d="M524.970667 0c37.319111 0 72.021333 18.773333 91.591111 49.493333l110.364444 131.185778h249.457778c68.721778 0 161.393778 24.348444 161.393778 120.490667v566.670222C1137.777778 954.083556 1065.528889 1024 976.384 1024H161.393778C72.248889 1024 0 954.083556 0 867.84V104.106667C0 46.648889 48.184889 0 107.576889 0h417.393778z m447.715555 268.174222H74.183111v591.246222c0 50.517333 40.732444 91.420444 90.908445 91.420445h807.594666c50.176 0 90.908444-40.96 90.908445-91.420445V359.594667c0-50.403556-40.732444-91.420444-90.908445-91.420445zM541.752889 478.435556c29.752889-30.606222 22.414222-32.483556 56.604444 2.56l129.934223 133.12a40.391111 40.391111 0 0 1 0 55.864888 37.262222 37.262222 0 0 1-27.306667 11.491556 38.684444 38.684444 0 0 1-27.136-11.377778l-0.170667-0.113778-50.858666-52.224c-5.575111-5.745778-15.132444-1.706667-15.132445 6.428445v132.778667a39.082667 39.082667 0 0 1-35.669333 39.367111c-22.755556 1.763556-41.358222-17.066667-41.358222-40.504889v-135.793778c0-6.940444-7.964444-10.24-12.629334-5.461333l-53.987555 55.409777a36.977778 36.977778 0 0 1-27.136 11.491556 38.798222 38.798222 0 0 1-27.136-11.320889 41.415111 41.415111 0 0 1-11.548445-28.046222c0-10.410667 3.925333-20.309333 11.264-27.875556z m-24.348445-405.276445h-386.275555a56.888889 56.888889 0 0 0-56.888889 56.888889v61.838222h569.059556L561.038222 93.525333a56.888889 56.888889 0 0 0-43.633778-20.366222z" fill="#ffffff" p-id="5486"></path></svg>

+ 1 - 0
Web/src/components/airport/icons/info/weather.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1726210901925" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="16906" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M880.96 520.832s-0.064 0 0 0a164.672 164.672 0 0 0-156.928-214.08c-39.04 0-75.264 13.632-103.744 36.864a278.4 278.4 0 0 0-42.176-93.376 273.92 273.92 0 0 0-177.792-112.896 274.624 274.624 0 0 0-318.72 223.616 273.088 273.088 0 0 0 25.856 172.096l0.256-0.128-0.128 0.64A187.776 187.776 0 0 0 0 703.168a188.032 188.032 0 0 0 187.776 187.776h648.512a187.968 187.968 0 0 0 187.776-187.776 188.16 188.16 0 0 0-143.104-182.336z m-44.736 304.576H187.776a122.368 122.368 0 0 1-122.24-122.24c0-53.76 34.88-99.456 83.136-115.776l-0.064-0.064a40.512 40.512 0 0 0 47.36-38.976v-0.96a40.64 40.64 0 0 0-16-32.256h0.064a202.496 202.496 0 0 1-27.328-141.76 202.688 202.688 0 0 1 235.072-164.992 201.6 201.6 0 0 1 131.2 83.456 201.6 201.6 0 0 1 32.256 159.04 37.248 37.248 0 0 0 73.088 13.888 41.216 41.216 0 0 1 0.576-5.504 99.712 99.712 0 0 1 116.544-86.72 100.352 100.352 0 0 1 72.448 143.168h0.064a39.936 39.936 0 0 0-8.64 24.96c0 22.464 18.048 40.768 40.448 40.768l0.832-0.128-0.256 0.256c62.656 5.12 112.128 57.792 112.128 121.728a122.24 122.24 0 0 1-122.24 122.112z" fill="#ffffff" p-id="16907"></path><path d="M281.088 279.232c-30.016 12.928-61.056 29.504-76.864 59.584-14.336 27.264-7.744 58.944 3.072 86.08 9.664 24.256 49.344 13.696 39.488-10.88-7.424-18.56-15.04-39.552-5.12-58.56 11.072-21.12 39.616-32.064 60.032-40.896 24.256-10.368 3.392-45.632-20.608-35.328z" fill="#ffffff" p-id="16908"></path></svg>

+ 1 - 1
Web/src/components/g-map/DockControlPanel.vue

@@ -128,7 +128,7 @@ async function sendControlCmd(cmdItem: DeviceCmdItem, index: number) {
   top: 0px;
   width: 480px;
   padding: 0 !important;
-  background: #000;
+  background: #232323;
   color: #fff;
   border-radius: 2px;
 

+ 94 - 29
Web/src/components/onLineDevice/components/InfoModal.vue

@@ -26,7 +26,12 @@
               手动飞行
             </div>
             <div class="content-osd-head-right-top-status">
-              {{ getTextByModeCode(deviceInfo.device.mode_code) }}
+              <div v-if="deviceInfo.device">
+                {{ getTextByModeCode(deviceInfo.device.mode_code) }}
+              </div>
+              <div v-else>
+                N/A
+              </div>
             </div>
           </div>
           <div class="content-osd-head-right-bottom">
@@ -64,7 +69,7 @@
       </div>
       <div class="battery-slide">
         <div style="background: #535759;" class="width-100"></div>
-        <div class="capacity-percent" :style="{ width: deviceInfo.device.battery.capacity_percent + '%' }"></div>
+        <div class="capacity-percent" :style="{ width: deviceInfo.device?.battery.capacity_percent + '%' }"></div>
       </div>
       <LivePlayer :text="state.playerText" :url="state.playerUrl" v-if="state.deviceLiveStatus" />
       <div class="content-osd-info">
@@ -237,7 +242,7 @@ const props = withDefaults(defineProps<Props>(), {
 
 // 遥控器信号
 const controllerSignal = computed(() => {
-  const info = props.deviceInfo.gateway;
+  const info = props.deviceInfo?.gateway;
   if (info && info.wireless_link) {
     return info.wireless_link['4g_gnd_quality'];
   } else {
@@ -247,7 +252,7 @@ const controllerSignal = computed(() => {
 
 // 飞机信号
 const aircraftSignal = computed(() => {
-  const info = props.deviceInfo.gateway;
+  const info = props.deviceInfo?.gateway;
   if (info && info.wireless_link) {
     return info.wireless_link['4g_uav_quality'];
   } else {
@@ -256,18 +261,26 @@ const aircraftSignal = computed(() => {
 });
 
 const RTK = computed(() => {
-  const info = props.deviceInfo.device;
-  return info.position_state.rtk_number;
+  const info = props.deviceInfo?.device;
+  if (info) {
+    return info.position_state.rtk_number;
+  } else {
+    return '';
+  }
 });
 
 const GPS = computed(() => {
-  const info = props.deviceInfo.device;
-  return info.position_state.gps_number;
+  const info = props.deviceInfo?.device;
+  if (info) {
+    return info.position_state.gps_number;
+  } else {
+    return 0;
+  }
 });
 
 // 电池容量
 const capacity = computed(() => {
-  const info = props.deviceInfo.device;
+  const info = props.deviceInfo?.device;
   if (info) {
     return info.battery.capacity_percent;
   } else {
@@ -276,47 +289,67 @@ const capacity = computed(() => {
 });
 
 const windSpeed = computed(() => {
-  const info = props.deviceInfo.device;
-  if (info.wind_speed === '--') {
-    return info.wind_speed;
+  const info = props.deviceInfo?.device;
+  if (info) {
+    if (info.wind_speed === '--') {
+      return info.wind_speed;
+    } else {
+      return (info.wind_speed / 10).toFixed(2) + ' m/s';
+    }
   } else {
-    return (info.wind_speed / 10).toFixed(2) + ' m/s';
+    return '';
   }
 });
 
 const ASL = computed(() => {
-  const info = props.deviceInfo.device;
-  if (info.height === '--') {
-    return info.height;
+  const info = props.deviceInfo?.device;
+  if (info) {
+    if (info.height === '--') {
+      return info.height;
+    } else {
+      return info.height.toFixed(2) + ' m';
+    }
   } else {
-    return info.height.toFixed(2) + ' m';
+    return '';
   }
 });
 
 const AGL = computed(() => {
-  const info = props.deviceInfo.device;
-  if (info.elevation === '--') {
-    return info.elevation;
+  const info = props.deviceInfo?.device;
+  if (info) {
+    if (info.elevation === '--') {
+      return info.elevation;
+    } else {
+      return info.elevation.toFixed(2) + ' m';
+    }
   } else {
-    return info.elevation.toFixed(2) + ' m';
+    return '';
   }
 });
 
 const HS = computed(() => {
-  const info = props.deviceInfo.device;
-  if (info.horizontal_speed === '--') {
-    return info.horizontal_speed;
+  const info = props.deviceInfo?.device;
+  if (info) {
+    if (info.horizontal_speed === '--') {
+      return info.horizontal_speed;
+    } else {
+      return info.horizontal_speed.toFixed(2) + ' m/s';
+    }
   } else {
-    return info.horizontal_speed.toFixed(2) + ' m/s';
+    return '';
   }
 });
 
 const homeDistance = computed(() => {
-  const info = props.deviceInfo.device;
-  if (info.home_distance === '--') {
-    return info.home_distance;
+  const info = props.deviceInfo?.device;
+  if (info) {
+    if (info.home_distance === '--') {
+      return info.home_distance;
+    } else {
+      return info.home_distance.toFixed(2) + ' m';
+    }
   } else {
-    return info.home_distance.toFixed(2) + ' m';
+    return '';
   }
 });
 
@@ -578,6 +611,38 @@ const onStop = async () => {
     }
   }
 }
+
+.battery-slide {
+  width: 100%;
+
+  .capacity-percent {
+    background: #00ee8b;
+  }
+
+  .return-home {
+    background: #ff9f0a;
+  }
+
+  .landing {
+    background: #f5222d;
+  }
+
+  .battery {
+    background: white;
+    border-radius: 1px;
+    width: 8px;
+    height: 4px;
+    margin-top: -3px;
+  }
+}
+
+.battery-slide>div {
+  position: relative;
+  margin-top: -2px;
+  min-height: 2px;
+  border-radius: 2px;
+  white-space: nowrap;
+}
 </style>
 
 <style lang="scss">

Some files were not shown because too many files changed in this diff