PosWithRefFind.cs 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading;
  6. using System.Threading.Tasks;
  7. using XdCxRhDW.Dto;
  8. using XdCxRhDW.Entity;
  9. using XdCxRhDW.Repostory;
  10. namespace XdCxRhDW.App
  11. {
  12. public class PosWithRefFind
  13. {
  14. /// <summary>
  15. /// 任务编号
  16. /// </summary>
  17. private int _taskId;
  18. public void Start(int taskId, CancellationToken token)
  19. {
  20. this._taskId = taskId;
  21. Task.Run(async () =>
  22. {
  23. while (!token.IsCancellationRequested)
  24. {
  25. try
  26. {
  27. var taskTars = TaskTarCache.Instance.GetTaskTar(_taskId);
  28. if (taskTars.Count == 0)
  29. {
  30. await Task.Delay(5000);
  31. LogHelper.Info($"等待任务[{_taskId}]添加目标信号缓存").Wait(5000);
  32. continue;
  33. }
  34. var taritem = taskTars[0];
  35. var refcgDto = GetRefCg(taritem, out bool needWait);
  36. if (needWait)
  37. {
  38. await Task.Delay(10 * 1000);
  39. continue;
  40. }
  41. if (refcgDto.MainYbDto == 0 || refcgDto.AdjaYbDto == 0)
  42. {
  43. await SendX2D1NoXlNoParAsync(taritem);
  44. }
  45. else
  46. { //执行两星一地有参定位
  47. X2D1NoXlPosDto X2D1NoXlPosDto = new X2D1NoXlPosDto()
  48. {
  49. SigTime = taritem.SigTime,
  50. MainCode = taritem.MainCode,
  51. AdjaCode = taritem.AdjaCode,
  52. SxDto = taritem.SxDto,
  53. XdDto = taritem.XdDto,
  54. MainYbDto = refcgDto.MainYbDto,
  55. AdjaYbDto = refcgDto.AdjaYbDto,
  56. SatTxLon = taritem.SatTxLon,
  57. SatTxLat = taritem.SatTxLat,
  58. CdbTxLon = taritem.CdbTxLon,
  59. CdbTxLat = taritem.CdbTxLat,
  60. RefLon = refcgDto.FixedLon,
  61. RefLat = refcgDto.FixedLat,
  62. FreqDown = taritem.FreqDown,
  63. FreqUp = taritem.FreqUp,
  64. XdDfo = taritem.XdDfo,
  65. XdSnr = taritem.XdSnr,
  66. SxDfo = taritem.SxDfo,
  67. SxSnr = taritem.SxSnr,
  68. CalcConfidence = true,
  69. TheoryDfoCalc = true,
  70. TaskID = taritem.TaskID,
  71. CheckRes = taritem.CheckRes,
  72. };
  73. await SendX2D1RefAsync(X2D1NoXlPosDto);
  74. }
  75. TaskTarCache.Instance.Remove(_taskId, taritem);
  76. TaskRefCache.Instance.ClearExpireRef(_taskId);
  77. }
  78. catch (Exception ex)
  79. {
  80. await LogHelper.Error($"【启动任务[{this._taskId}]目标取参考信号缓存异常{ex.Message}", ex);
  81. }
  82. }
  83. await ClearCacheAsync(_taskId);
  84. });
  85. }
  86. /// <summary>
  87. /// 获取参考参估
  88. /// </summary>
  89. /// <param name="taritem"></param>
  90. /// <param name="needWait"></param>
  91. /// <returns></returns>
  92. public TaskCgDto GetRefCg(X2D1NoXlNoParlPosDto taritem, out bool needWait)
  93. {
  94. needWait = true;
  95. var cgdto = new TaskCgDto();
  96. var _tarkRefTime = TaskTarCache.Instance.TakeRefTimeSeconds;
  97. DateTime startTime = taritem.SigTime.AddSeconds(-_tarkRefTime);
  98. DateTime endTime = taritem.SigTime.AddSeconds(_tarkRefTime);
  99. //获取指定任务时间范围内的参考信号
  100. var taskRefs = TaskRefCache.Instance.GetTaskRef(_taskId, startTime, endTime);
  101. //没有参考信号时 做无参考
  102. if (taskRefs.Count == 0)
  103. {
  104. needWait = false;
  105. return cgdto;
  106. }
  107. var cgOrderList = taskRefs.OrderBy(d => d.SigTime).ToList();//注意记得时间排序,根据时间取最接近的信号时刻
  108. var point1s = cgOrderList.Where(c => c.SigTime <= taritem.SigTime);
  109. var point2s = cgOrderList.Where(c => c.SigTime >= taritem.SigTime);
  110. if (point2s == null || point2s.Count() == 0)//若没有比目标信号时刻大的参考信号则需要等待
  111. {
  112. needWait = true;
  113. return null;
  114. }
  115. var point1 = point1s.Where(c => c.YbSnr != 0).FirstOrDefault();
  116. var point2 = point2s.Where(c => c.YbSnr != 0).FirstOrDefault();
  117. if (point2 == null || point1 == null)//若查找到比目标信号时刻大的参考信号信噪比为0则表示参考信号已经做过了
  118. {
  119. cgdto.MainYbDto = 0;
  120. cgdto.AdjaYbDto = 0;
  121. }
  122. else
  123. {
  124. double refMainYbDto = LinearInterpolation.CalSigTimeDto(taritem.SigTime, point1.SigTime, point2.SigTime, point1.MainYbDto, point2.MainYbDto);
  125. double refAdjaYbDto = LinearInterpolation.CalSigTimeDto(taritem.SigTime, point1.SigTime, point2.SigTime, point1.AdjaYbDto, point2.AdjaYbDto);
  126. cgdto.MainYbDto = refMainYbDto;
  127. cgdto.AdjaYbDto = refAdjaYbDto;
  128. cgdto.FixedLon = point1.FixedLon;
  129. cgdto.FixedLat = point1.FixedLat;
  130. }
  131. needWait = false;
  132. return cgdto;
  133. }
  134. /// <summary>
  135. /// 发送两星一地无参定位
  136. /// </summary>
  137. /// <param name="dto"></param>
  138. private async Task SendX2D1NoXlNoParAsync(X2D1NoXlNoParlPosDto dto)
  139. {
  140. try
  141. {
  142. var result = await HttpHelper.PostRequestAsync<PosResDto>(SysConfig.GetUrl("Pos/PosX2D1NoXlNoParAsync"), dto);
  143. if (result.code != 200)
  144. {
  145. await LogHelper.Error($"找参考任务{dto.TaskID}-{dto.SigTime:yyyy-MM-dd HH:mm:ss}两星一地无参定位失败{result.msg}");
  146. }
  147. else
  148. {
  149. await LogHelper.Info($"找参考任务{dto.TaskID}-{dto.SigTime:yyyy-MM-dd HH:mm:ss}两星一地无参定位完成{result.msg}");
  150. }
  151. }
  152. catch (Exception ex)
  153. {
  154. await LogHelper.Error($"找参考任务{dto.TaskID}-{dto.SigTime:yyyy-MM-dd HH:mm:ss}两星一地无参定位失败{ex.Message}");
  155. }
  156. }
  157. /// <summary>
  158. /// 发送两星一地无参定位
  159. /// </summary>
  160. /// <param name="dto"></param>
  161. /// <returns></returns>
  162. private async Task SendX2D1RefAsync(X2D1NoXlPosDto dto)
  163. {
  164. try
  165. {
  166. var result = await HttpHelper.PostRequestAsync<PosResDto>(SysConfig.GetUrl("Pos/PosX2D1NoXlAsync"), dto);
  167. if (result.code != 200)
  168. {
  169. await LogHelper.Error($"找参考任务{dto.TaskID}-{dto.SigTime:yyyy-MM-dd HH:mm:ss}两星一地定位失败{result.msg}");
  170. }
  171. else
  172. {
  173. await LogHelper.Info($"找参考任务{dto.TaskID}-{dto.SigTime:yyyy-MM-dd HH:mm:ss}两星一地定位完成{result.msg}");
  174. }
  175. }
  176. catch (Exception ex)
  177. {
  178. await LogHelper.Error($"找参考任务{dto.TaskID}-{dto.SigTime:yyyy-MM-dd HH:mm:ss}两星一地定位失败{ex.Message}");
  179. }
  180. }
  181. public async Task ClearCacheAsync(int taskID)
  182. {
  183. try
  184. {
  185. await Task.Run(() =>
  186. {
  187. TaskTarCache.Instance.ClearCache(taskID);
  188. TaskRefCache.Instance.ClearCache(taskID);
  189. });
  190. await LogHelper.Info($"【停止任务[{this._taskId}]目标取参考信号缓存");
  191. }
  192. catch (Exception ex)
  193. {
  194. await LogHelper.Error($"【清除任务[{taskID}]目标参考信号缓存异常{ex.Message}", ex);
  195. }
  196. }
  197. public async Task ClearAllAsync()
  198. {
  199. try
  200. {
  201. await Task.Run(() =>
  202. {
  203. TaskTarCache.Instance.ClearAll();
  204. TaskRefCache.Instance.ClearAll();
  205. });
  206. await LogHelper.Info($"【停止所有任务目标取参考信号缓存");
  207. }
  208. catch (Exception ex)
  209. {
  210. await LogHelper.Error($"【清除所有目标参考信号缓存异常{ex.Message}", ex);
  211. }
  212. }
  213. }
  214. }