using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using XdCxRhDW.Dto;
using XdCxRhDW.Entity;
using XdCxRhDW.Repostory;
namespace XdCxRhDW.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);
LogHelper.Info($"等待任务[{_taskId}]添加目标信号缓存").Wait(5000);
continue;
}
var taritem = taskTars[0];
var refcgDto = GetRefCg(taritem, out bool needWait);
if (needWait)
{
await Task.Delay(10 * 1000);
continue;
}
if (refcgDto.MainYbDto == 0 || refcgDto.AdjaYbDto == 0)
{
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 = true,
TheoryDfoCalc = true,
TaskID = taritem.TaskID,
CheckRes = taritem.CheckRes,
};
await SendX2D1RefAsync(X2D1NoXlPosDto);
}
TaskTarCache.Instance.Remove(_taskId, taritem);
TaskRefCache.Instance.ClearExpireRef(_taskId);
}
catch (Exception ex)
{
await LogHelper.Error($"【启动任务[{this._taskId}]目标取参考信号缓存异常{ex.Message}", ex);
}
}
await ClearCacheAsync(_taskId);
});
}
///
/// 获取参考参估
///
///
///
///
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;
}
///
/// 发送两星一地无参定位
///
///
private async Task SendX2D1NoXlNoParAsync(X2D1NoXlNoParlPosDto dto)
{
try
{
var result = await HttpHelper.PostRequestAsync(SysConfig.GetUrl("Pos/PosX2D1NoXlNoParAsync"), dto);
if (result.code != 200)
{
await LogHelper.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)
{
await LogHelper.Error($"找参考任务{dto.TaskID}-{dto.SigTime:yyyy-MM-dd HH:mm:ss}两星一地无参定位失败{ex.Message}");
}
}
///
/// 发送两星一地无参定位
///
///
///
private async Task SendX2D1RefAsync(X2D1NoXlPosDto dto)
{
try
{
var result = await HttpHelper.PostRequestAsync(SysConfig.GetUrl("Pos/PosX2D1NoXlAsync"), dto);
if (result.code != 200)
{
await LogHelper.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)
{
await LogHelper.Error($"找参考任务{dto.TaskID}-{dto.SigTime:yyyy-MM-dd HH:mm:ss}两星一地定位失败{ex.Message}");
}
}
public async Task ClearCacheAsync(int taskID)
{
try
{
await Task.Run(() =>
{
TaskTarCache.Instance.ClearCache(taskID);
TaskRefCache.Instance.ClearCache(taskID);
});
await LogHelper.Info($"【停止任务[{this._taskId}]目标取参考信号缓存");
}
catch (Exception ex)
{
await LogHelper.Error($"【清除任务[{taskID}]目标参考信号缓存异常{ex.Message}", ex);
}
}
public async Task ClearAllAsync()
{
try
{
await Task.Run(() =>
{
TaskTarCache.Instance.ClearAll();
TaskRefCache.Instance.ClearAll();
});
await LogHelper.Info($"【停止所有任务目标取参考信号缓存");
}
catch (Exception ex)
{
await LogHelper.Error($"【清除所有目标参考信号缓存异常{ex.Message}", ex);
}
}
}
}