|
|
@ -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 } |
|
|
}) |
|
|
}) |
|
|
|