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
{ //执行两星一地有参定位
X2D1PosDto X2D1NoXlPosDto = new X2D1PosDto()
{
SigTime = taritem.SigTime,
MainCode = taritem.MainCode,
Adja1Code = taritem.Adja1Code,
SxDto = taritem.SxDto,
XdDto = taritem.XdDto,
MainYbDtous = refcgDto.MainYbDto,
AdjaYbDtous = refcgDto.AdjaYbDto,
SatTxLon = taritem.SatTxLon,
SatTxLat = taritem.SatTxLat,
CdbTxLon = taritem.CdbTxLon,
CdbTxLat = taritem.CdbTxLat,
RefLon = refcgDto.FixedLon,
RefLat = refcgDto.FixedLat,
FreqdownHz = taritem.FreqdownHz,
FrequpHz = taritem.FrequpHz,
XdDfo = taritem.XdDfo,
XdSnr = taritem.XdSnr,
SxDfo = taritem.SxDfo,
SxSnr = taritem.SxSnr,
CalcConfidence = false,
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(X2D1NoRefPosDto 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(X2D1NoRefPosDto dto)
{
try
{
if (AppConfigHelper.Get("ForTest", false))
{
//X2D1NoRefPosDto dto22 = new X2D1NoRefPosDto()
//{
// Adja1Code = dto.Adja1Code,
// SxDto = dto.SxDto,
// SatTxLat = dto.SatTxLat,
// CalcConfidence = dto.CalcConfidence,
// CdbTxLat = dto.CdbTxLat,
// CdbTxLon = dto.CdbTxLon,
// CheckRes = dto.CheckRes,
// FreqdownHz = dto.FreqdownHz,
// FrequpHz = dto.FrequpHz,
// MainCode = dto.MainCode,
// SatTxLon = dto.SatTxLon,
// SigTime = dto.SigTime,
// SxDfo = dto.SxDfo,
// SxSnr = dto.SxSnr,
// TaskID = dto.TaskID,
// XdDfo = dto.XdDfo,
// XdDto = dto.XdDto,
// XdSnr = dto.XdSnr,
// Adja2Code = dto.Adja2Code,
// SigInfoID = dto.SigInfoID,
//};
//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(X2D1PosDto dto)
{
try
{
if (AppConfigHelper.Get("ForTest", false))
{
//X2D1PosDto dto22 = new X2D1PosDto()
//{
// AdjaCode = dto.Adja1Code,
// 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.FreqdownHz,
// FreqUp = dto.FrequpHz,
// 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.MainYbDtous,
// AdjaYbDto = dto.AdjaYbDtous,
// 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);
}
}
}
}