pointLocate.js 1.5 KB

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