diff --git a/src/stores/modules/devicesStore.js b/src/stores/modules/devicesStore.js index 2d5ccd0..357f425 100644 --- a/src/stores/modules/devicesStore.js +++ b/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 } } +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', () => { const assets = reactive({}) const docks = ref([]) @@ -187,12 +205,7 @@ export const useDeviceStore = defineStore('devices', () => { const rt = detail.realtime || {} const online = Boolean(detail.online) 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 environment = environmentValues(rt) return { @@ -226,15 +239,9 @@ export const useDeviceStore = defineStore('devices', () => { const id = String(d.id) const detail = droneDetails[i] || {} 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 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 battery = rt.batteryPercent ?? rt.batteryPct ?? d.battery return { @@ -315,5 +322,97 @@ export const useDeviceStore = defineStore('devices', () => { 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 } })