Browse Source

feat: apply single dock/drone detail into devices store

main
xiaosi 2 weeks ago
parent
commit
1b67e09b0c
  1. 129
      src/stores/modules/devicesStore.js

129
src/stores/modules/devicesStore.js

@ -125,6 +125,24 @@ function project(lon, lat, bounds) {
return { x: Math.round(x * 10) / 10, y: Math.round(y * 10) / 10 } return { x: Math.round(x * 10) / 10, y: Math.round(y * 10) / 10 }
} }
function dockStatusFromDetail(registerStatus, online, rt) {
const pending = registerStatus === 'pending' && !online
if (pending) return { status: '待连接', statusClass: 'pending' }
if (!online) return DOCK_STATUS.offline
if (alarmCodes(rt).length) return { status: '告警', statusClass: 'alarm' }
return DOCK_STATUS.online
}
function droneStatusFromDetail(online, rt) {
const armed = ['1', 'true', 1, true].includes(rt.armed)
const altitude = coordinate(rt.altitude, -1000, 100000)
const flying = armed || (altitude != null && altitude > 0)
if (!online) return { status: '离线', statusClass: 'offline', altitude, flying }
if (flying) return { status: '飞行中', statusClass: 'mission', altitude, flying }
return { status: '在巢', statusClass: 'online', altitude, flying }
}
export const useDeviceStore = defineStore('devices', () => { export const useDeviceStore = defineStore('devices', () => {
const assets = reactive({}) const assets = reactive({})
const docks = ref([]) const docks = ref([])
@ -187,12 +205,7 @@ export const useDeviceStore = defineStore('devices', () => {
const rt = detail.realtime || {} const rt = detail.realtime || {}
const online = Boolean(detail.online) const online = Boolean(detail.online)
const registerStatus = d.registerStatus || 'registered' const registerStatus = d.registerStatus || 'registered'
const pending = registerStatus === 'pending' && !online
const st = pending
? { status: '待连接', statusClass: 'pending' }
: online
? alarmCodes(rt).length ? { status: '告警', statusClass: 'alarm' } : DOCK_STATUS.online
: DOCK_STATUS.offline
const st = dockStatusFromDetail(registerStatus, online, rt)
const name = d.name || d.dockId const name = d.name || d.dockId
const environment = environmentValues(rt) const environment = environmentValues(rt)
return { return {
@ -226,15 +239,9 @@ export const useDeviceStore = defineStore('devices', () => {
const id = String(d.id) const id = String(d.id)
const detail = droneDetails[i] || {} const detail = droneDetails[i] || {}
const rt = detail.realtime || {} const rt = detail.realtime || {}
const armed = ['1', 'true', 1, true].includes(rt.armed)
const altitude = coordinate(rt.altitude, -1000, 100000)
const flying = armed || (altitude != null && altitude > 0)
const online = Boolean(detail.online) const online = Boolean(detail.online)
const st = !online
? { status: '离线', statusClass: 'offline' }
: flying
? { status: '飞行中', statusClass: 'mission' }
: { status: '在巢', statusClass: 'online' }
const st = droneStatusFromDetail(online, rt)
const altitude = st.altitude
const dock = newDocks.find((dk) => dk.dockId === d.dockId) const dock = newDocks.find((dk) => dk.dockId === d.dockId)
const battery = rt.batteryPercent ?? rt.batteryPct ?? d.battery const battery = rt.batteryPercent ?? rt.batteryPct ?? d.battery
return { return {
@ -315,5 +322,97 @@ export const useDeviceStore = defineStore('devices', () => {
return { docks: newDocks, drones: newDrones } return { docks: newDocks, drones: newDrones }
} }
return { assets, docks, drones, loaded, asset, record, commandType, sendCommand, load }
function applyDockDetail(id, detail) {
const key = String(id)
const dock = docks.value.find((d) => d.id === key)
if (!dock) {
console.warn('[devices] applyDockDetail missing dock', key)
return false
}
const rt = detail?.realtime || {}
const online = Boolean(detail?.online)
const st = dockStatusFromDetail(dock.registerStatus || 'registered', online, rt)
const environment = environmentValues(rt)
const alarms = alarmCodes(rt)
Object.assign(dock, {
status: st.status,
statusClass: st.statusClass,
mode: controlModeText(rt.controlMode),
realtime: rt,
environment,
alarms,
online,
})
const assetRow = assets[key]
if (assetRow) {
Object.assign(assetRow, {
status: dock.status,
statusClass: dock.statusClass,
realtime: rt,
environment,
alarms,
online,
})
}
return true
}
function applyDroneDetail(id, detail) {
const key = String(id)
const drone = drones.value.find((d) => d.id === key)
if (!drone) {
console.warn('[devices] applyDroneDetail missing drone', key)
return false
}
const rt = detail?.realtime || {}
const online = Boolean(detail?.online)
const st = droneStatusFromDetail(online, rt)
const altitude = st.altitude
const battery = rt.batteryPercent ?? rt.batteryPct
const alarms = alarmCodes(rt)
const dock = docks.value.find((d) => d.dockId === drone.dockId)
Object.assign(drone, {
status: st.status,
statusClass: st.statusClass,
battery: battery != null && battery !== '' ? `${battery}%` : drone.battery,
mode: modeText(rt.flightMode),
mission: displayValue(rt.missionName || rt.mission),
sysid: displayValue(rt.currentSysId),
gps: gpsText(rt.gpsQuality),
realtime: rt,
alarms,
online,
_lat: coordinate(rt.latitude, -90, 90),
_lon: coordinate(rt.longitude, -180, 180),
_alt: altitude,
_speed: coordinate(rt.groundSpeed, 0, 1000),
_sats: coordinate(rt.satellites, 0, 1000),
})
const assetRow = assets[key]
if (assetRow) {
const lon = drone._lon != null ? drone._lon : dock?.longitude
const lat = drone._lat != null ? drone._lat : dock?.latitude
const hasCoordinates = lon != null && lat != null
Object.assign(assetRow, {
status: drone.status,
statusClass: drone.statusClass,
location: drone.statusClass === 'mission'
? `${dock?.location || '--'} · 飞行中`
: `停放于${dock?.name || '--'}`,
hasCoordinates,
longitude: hasCoordinates ? lon : null,
latitude: hasCoordinates ? lat : null,
inDock: drone.statusClass !== 'mission',
altitude: drone._alt,
speed: drone._speed,
satellites: drone._sats,
realtime: rt,
alarms,
online,
})
}
return true
}
return { assets, docks, drones, loaded, asset, record, commandType, sendCommand, load, applyDockDetail, applyDroneDetail }
}) })

Loading…
Cancel
Save