using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using DW5S.DTO; using DW5S.Entity; using DW5S.Repostory; using DW5S.Service; using Serilog; using static DevExpress.Xpo.Helpers.AssociatedCollectionCriteriaHelper; namespace DW5S.App { public class PosWithRefFind { /// /// 任务编号 /// private int _taskId; public void Start(int taskId, CancellationToken token) { this._taskId = taskId; Task.Run(async () => { while (!token.IsCancellationRequested) { try { var taskTars = TaskTarCache.Instance.GetTaskTar(_taskId); if (taskTars.Count == 0) { await Task.Delay(5000, token); //LogHelper.Info($"等待任务[{_taskId}]添加目标信号缓存").Wait(5000); continue; } var taritem = taskTars[0]; var refcgDto = GetRefCg(taritem, out bool needWait); if (needWait) { await Task.Delay(10 * 1000, token); continue; } if (refcgDto.MainYbDto == 0 || refcgDto.AdjaYbDto == 0 || refcgDto.MainYbDto == double.NaN || refcgDto.AdjaYbDto == double.NaN) { await SendX2D1NoXlNoParAsync(taritem); } else { //执行两星一地有参定位 X2D1NoXlPosDto X2D1NoXlPosDto = new X2D1NoXlPosDto() { SigTime = taritem.SigTime, MainCode = taritem.MainCode, AdjaCode = taritem.AdjaCode, SxDto = taritem.SxDto, XdDto = taritem.XdDto, MainYbDto = refcgDto.MainYbDto, AdjaYbDto = refcgDto.AdjaYbDto, SatTxLon = taritem.SatTxLon, SatTxLat = taritem.SatTxLat, CdbTxLon = taritem.CdbTxLon, CdbTxLat = taritem.CdbTxLat, RefLon = refcgDto.FixedLon, RefLat = refcgDto.FixedLat, FreqDown = taritem.FreqDown, FreqUp = taritem.FreqUp, XdDfo = taritem.XdDfo, XdSnr = taritem.XdSnr, SxDfo = taritem.SxDfo, SxSnr = taritem.SxSnr, CalcConfidence = false, TheoryDfoCalc = true, TaskID = taritem.TaskID, CheckRes = taritem.CheckRes, }; await SendX2D1RefAsync(X2D1NoXlPosDto); } TaskTarCache.Instance.Remove(_taskId, taritem); } catch (TaskCanceledException) { } catch (Exception ex) { IocContainer.Logger.Error(ex, $"启动任务[{this._taskId}]目标取参考信号缓存异常"); } } await ClearCacheAsync(_taskId); }); _ = ClearExpireRef(_taskId, token); } public async Task ClearExpireRef(int taskId, CancellationToken token) { while (!token.IsCancellationRequested) { try { TaskRefCache.Instance.ClearExpireRef(_taskId); await Task.Delay(60000, token); } catch { } } } /// /// 获取参考参估 /// /// /// /// public TaskCgDto GetRefCg(X2D1NoXlNoParlPosDto taritem, out bool needWait) { needWait = true; var cgdto = new TaskCgDto(); var _tarkRefTime = TaskTarCache.Instance.TakeRefTimeSeconds; DateTime startTime = taritem.SigTime.AddSeconds(-_tarkRefTime); DateTime endTime = taritem.SigTime.AddSeconds(_tarkRefTime); //获取指定任务时间范围内的参考信号 var taskRefs = TaskRefCache.Instance.GetTaskRef(_taskId, startTime, endTime); //没有参考信号时 做无参考 if (taskRefs.Count == 0) { needWait = false; return cgdto; } var cgOrderList = taskRefs.OrderBy(d => d.SigTime).ToList();//注意记得时间排序,根据时间取最接近的信号时刻 var point1s = cgOrderList.Where(c => c.SigTime <= taritem.SigTime); var point2s = cgOrderList.Where(c => c.SigTime >= taritem.SigTime); if (point2s == null || point2s.Count() == 0)//若没有比目标信号时刻大的参考信号则需要等待 { needWait = true; return null; } var point1 = point1s.Where(c => c.YbSnr != 0).FirstOrDefault(); var point2 = point2s.Where(c => c.YbSnr != 0).FirstOrDefault(); if (point2 == null || point1 == null)//若查找到比目标信号时刻大的参考信号信噪比为0则表示参考信号已经做过了 { cgdto.MainYbDto = 0; cgdto.AdjaYbDto = 0; } else { double refMainYbDto = LinearInterpolation.CalSigTimeDto(taritem.SigTime, point1.SigTime, point2.SigTime, point1.MainYbDto, point2.MainYbDto); double refAdjaYbDto = LinearInterpolation.CalSigTimeDto(taritem.SigTime, point1.SigTime, point2.SigTime, point1.AdjaYbDto, point2.AdjaYbDto); cgdto.MainYbDto = refMainYbDto; cgdto.AdjaYbDto = refAdjaYbDto; cgdto.FixedLon = point1.FixedLon; cgdto.FixedLat = point1.FixedLat; } needWait = false; return cgdto; } Random r = new Random(); /// /// 发送两星一地无参定位 /// /// private async Task SendX2D1NoXlNoParAsync(X2D1NoXlNoParlPosDto dto) { try { if (AppConfigHelper.Get("ForTest", false)) { X2D1NoParPosDto dto22 = new X2D1NoParPosDto() { AdjaCode = dto.AdjaCode, SxDto = dto.SxDto, SatTxLat = dto.SatTxLat, AdjaVX = 0, AdjaVY = 0, AdjaVZ = 0, MainVX = 0, MainVY = 0, MainVZ = 0, MainX = 10401572.0412, MainY = 40762347.5788, MainZ = 2311671.1075, AdjaX = 25526808.8297, AdjaY = 33541855.6479, AdjaZ = 65652.2217, CalcConfidence = dto.CalcConfidence, CdbTxLat = dto.CdbTxLat, CdbTxLon = dto.CdbTxLon, CheckRes = dto.CheckRes, FreqDown = dto.FreqDown, FreqUp = dto.FreqUp, MainCode = dto.MainCode, SatTxLon = dto.SatTxLon, SigTime = dto.SigTime, SxDfo = dto.SxDfo, SxSnr = dto.SxSnr, TaskID = dto.TaskID, TheoryDfoCalc = dto.TheoryDfoCalc, XdDfo = dto.XdDfo, XdDto = dto.XdDto, XdSnr = dto.XdSnr, }; dto22.SatTxLon = 43; dto22.SatTxLat = 11.57; dto22.CdbTxLon = 43; dto22.CdbTxLat = 11.57; var mainEcef = (dto22.MainX, dto22.MainY, dto22.MainZ); var adjaEcef = (dto22.AdjaX, dto22.AdjaY, dto22.AdjaZ); var lon = 42.5; var lat = 11.5; var tarEcef = PhysicsHelper.GeoToEcef((lon, lat, 0)); var recEcef = PhysicsHelper.GeoToEcef((dto22.SatTxLon, dto22.SatTxLat, 0)); var d1 = PhysicsHelper.Dto(tarEcef, mainEcef, recEcef); var d2 = PhysicsHelper.Dto(tarEcef, adjaEcef, recEcef); var d3 = PhysicsHelper.Dto(tarEcef, recEcef); var dto1 = (d1 - d2) * 1e6 + r.Next(-50, 51); var dto2 = (d1 - d3) * 1e6 + r.Next(-50, 51); dto22.SxDto = Math.Round(dto1, 3); dto22.XdDto = Math.Round(dto2, 3); var result = await HttpHelper.PostRequestAsync(SysConfig.GetUrl("Pos/PosX2D1NoParAsync"), dto22); if (result.code != 200) { IocContainer.Logger.Error($"找参考任务{dto.TaskID}-{dto.SigTime:yyyy-MM-dd HH:mm:ss}两星一地无参定位失败{result.msg}"); } else { //await LogHelper.Info($"找参考任务{dto.TaskID}-{dto.SigTime:yyyy-MM-dd HH:mm:ss}两星一地无参定位完成{result.msg}"); } } else { var result = await HttpHelper.PostRequestAsync(SysConfig.GetUrl("Pos/PosX2D1NoXlNoParAsync"), dto); if (result.code != 200) { IocContainer.Logger.Error($"找参考任务{dto.TaskID}-{dto.SigTime:yyyy-MM-dd HH:mm:ss}两星一地无参定位失败{result.msg}"); } else { //await LogHelper.Info($"找参考任务{dto.TaskID}-{dto.SigTime:yyyy-MM-dd HH:mm:ss}两星一地无参定位完成{result.msg}"); } } } catch (Exception ex) { IocContainer.Logger.Error(ex, $"找参考任务{dto.TaskID}-{dto.SigTime:yyyy-MM-dd HH:mm:ss}两星一地无参定位失败"); } } /// /// 发送两星一地有参定位 /// /// /// private async Task SendX2D1RefAsync(X2D1NoXlPosDto dto) { try { if (AppConfigHelper.Get("ForTest", false)) { X2D1PosDto dto22 = new X2D1PosDto() { AdjaCode = dto.AdjaCode, SxDto = dto.SxDto, SatTxLat = dto.SatTxLat, AdjaVX = 0, AdjaVY = 0, AdjaVZ = 0, MainVX = 0, MainVY = 0, MainVZ = 0, MainX = 10401572.0412, MainY = 40762347.5788, MainZ = 2311671.1075, AdjaX = 25526808.8297, AdjaY = 33541855.6479, AdjaZ = 65652.2217, CalcConfidence = false, CdbTxLat = dto.CdbTxLat, CdbTxLon = dto.CdbTxLon, CheckRes = dto.CheckRes, FreqDown = dto.FreqDown, FreqUp = dto.FreqUp, MainCode = dto.MainCode, SatTxLon = dto.SatTxLon, SigTime = dto.SigTime, SxDfo = dto.SxDfo, SxSnr = dto.SxSnr, TaskID = dto.TaskID, TheoryDfoCalc = dto.TheoryDfoCalc, XdDfo = dto.XdDfo, XdDto = dto.XdDto, XdSnr = dto.XdSnr, MainYbDto = dto.MainYbDto, AdjaYbDto = dto.AdjaYbDto, RefLon = dto.RefLon, RefLat = dto.RefLat, }; dto22.SatTxLon = 43; dto22.SatTxLat = 11.57; dto22.CdbTxLon = 43; dto22.CdbTxLat = 11.57; var mainEcef = (dto22.MainX, dto22.MainY, dto22.MainZ); var adjaEcef = (dto22.AdjaX, dto22.AdjaY, dto22.AdjaZ); var lon = 42.5; var lat = 11.5; var tarEcef = PhysicsHelper.GeoToEcef((lon, lat, 0)); var recEcef = PhysicsHelper.GeoToEcef((dto22.SatTxLon, dto22.SatTxLat, 0)); var d1 = PhysicsHelper.Dto(tarEcef, mainEcef, recEcef); var d2 = PhysicsHelper.Dto(tarEcef, adjaEcef, recEcef); var d3 = PhysicsHelper.Dto(tarEcef, recEcef); var dto1 = (d1 - d2) * 1e6 + r.Next(-50, 51); var dto2 = (d1 - d3) * 1e6 + r.Next(-50, 51); dto22.SxDto = Math.Round(dto1, 3); dto22.XdDto = Math.Round(dto2, 3); var result = await HttpHelper.PostRequestAsync(SysConfig.GetUrl("Pos/PosX2D1Async"), dto22); if (result.code != 200) { IocContainer.Logger.Error($"找参考任务{dto.TaskID}-{dto.SigTime:yyyy-MM-dd HH:mm:ss}两星一地定位失败{result.msg}"); } else { //await LogHelper.Info($"找参考任务{dto.TaskID}-{dto.SigTime:yyyy-MM-dd HH:mm:ss}两星一地定位完成{result.msg}"); } } else { var result = await HttpHelper.PostRequestAsync(SysConfig.GetUrl("Pos/PosX2D1NoXlAsync"), dto); if (result.code != 200) { IocContainer.Logger.Error($"找参考任务{dto.TaskID}-{dto.SigTime:yyyy-MM-dd HH:mm:ss}两星一地定位失败{result.msg}"); } else { //await LogHelper.Info($"找参考任务{dto.TaskID}-{dto.SigTime:yyyy-MM-dd HH:mm:ss}两星一地定位完成{result.msg}"); } } } catch (Exception ex) { IocContainer.Logger.Error(ex, $"找参考任务{dto.TaskID}-{dto.SigTime:yyyy-MM-dd HH:mm:ss}两星一地定位失败"); } } public async Task ClearCacheAsync(int taskID) { try { await Task.Run(() => { TaskTarCache.Instance.ClearCache(taskID); TaskRefCache.Instance.ClearCache(taskID); }); } catch (Exception ex) { string msg = "清除任务[{taskID}]目标参考信号缓存异常"; IocContainer.Logger.Error(ex, msg); } } public async Task ClearAllAsync() { try { await Task.Run(() => { TaskTarCache.Instance.ClearAll(); TaskRefCache.Instance.ClearAll(); }); } catch (Exception ex) { string msg = "清除所有目标参考信号缓存异常"; IocContainer.Logger.Error(ex, msg); } } } }