| 12345678910111213141516171819202122232425262728293031 |
- /** Monitoring-point locate preset (the device tier is consumed by the later linkage ticket). */
- export const LOCATE_DEFAULTS = Object.freeze({
- point: Object.freeze({ heading: 0, pitch: -55, range: 500 }),
- device: Object.freeze({ heading: 0, pitch: -55, range: 150 }),
- })
- export function planLocateView(map = {}, tier = 'point') {
- const defaults = LOCATE_DEFAULTS[tier]
- if (!defaults) return null
- const configured = map && map.locate && map.locate[tier]
- const source = configured && typeof configured === 'object' ? configured : {}
- return {
- heading: Number.isFinite(source.heading) ? source.heading : defaults.heading,
- pitch: Number.isFinite(source.pitch) ? source.pitch : defaults.pitch,
- range: Number.isFinite(source.range) && source.range > 0 ? source.range : defaults.range,
- }
- }
- /**
- * 一次异步定位采样是否已经作废。
- *
- * 为什么单独成函数而不是在服务层写一句 `token !== mine`:地形采样要跨一次网络往返,
- * 期间用户可能已经选了别的点位、点了归位、返回全球或手动拖了图 —— 「迟到的采样不得覆盖新目标」
- * 是本票唯一的竞态纪律,写成可断言的纯函数,才能真正被闸门钉住(而不是被一段复述算法的测试糊过去)。
- * @param {number} mine 发起采样时领到的序号
- * @param {number} current 当前序号
- */
- export function isStaleLocate(mine, current) {
- return mine !== current
- }
|