/** 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 }