|
@@ -1,4 +1,5 @@
|
|
|
-using System;
|
|
|
+using Org.BouncyCastle.Security;
|
|
|
+using System;
|
|
|
using System.Collections.Generic;
|
|
|
using System.Configuration;
|
|
|
using System.Diagnostics;
|
|
@@ -528,22 +529,30 @@ namespace X2D1TaskServer.Service
|
|
|
await LogHelper.Error($"【任务{dto.ID}】信号[{taskSig.FreqUp / 1e6:f3}MHz],{capTime:yyyyMMddHHmmss}时刻参估结果个数和检测结果个数不匹配");
|
|
|
continue;
|
|
|
}
|
|
|
+
|
|
|
+ //执行参考信号
|
|
|
List<DetectResDto> refDetects = await DoRefAsync(dto, paramInfo, deteRes, data1, data2, cts);
|
|
|
- bool beFindRef = true;
|
|
|
- int fixedStationDto = dto.FixedStationDto != null ? dto.FixedStationDto.FixedStationId : 0;
|
|
|
- if (fixedStationDto <= 0)//无固定站,直接执行无参
|
|
|
- {
|
|
|
- beFindRef = false;
|
|
|
- }
|
|
|
- if (refDetects != null && refDetects.Count > 0)//有参考信号
|
|
|
+
|
|
|
+ //目标信号
|
|
|
+ string msg = $"【任务{dto.ID}】目标信号[{paramInfo.TaskSig.FreqUp / 1e6:f3}MHz]{capTime:yyyyMMddHHmmss}时刻";
|
|
|
+ bool beFindRef = false;
|
|
|
+ if (refDetects != null && refDetects.Count > 0)//有符合规则的固定站参考信号
|
|
|
{
|
|
|
+ beFindRef = true;
|
|
|
data1 = data1.Where(c => !refDetects.Any(r => r.Start == c.Smpstart && r.Length == c.Smplen)).ToList();
|
|
|
data2 = data2.Where(c => !refDetects.Any(r => r.Start == c.Smpstart && r.Length == c.Smplen)).ToList();
|
|
|
}
|
|
|
- string msg = $"【任务{dto.ID}】目标信号[{paramInfo.TaskSig.FreqUp / 1e6:f3}MHz]";
|
|
|
+ //构建目标信号定位模型
|
|
|
+ var tar = BuildX2D1NoXlNoParlPosDto(dto, paramInfo, deteRes, data1, data2, cts, msg);
|
|
|
|
|
|
- //目标信号
|
|
|
- await DoX2D1NoParPosAsync(dto, paramInfo, deteRes, data1, data2, cts, msg, fixedStationDto, beFindRef);
|
|
|
+ if (beFindRef)//有符合规则的固定站参考信号就把目标信号添加目标缓存中
|
|
|
+ {
|
|
|
+ await AddTarCacheAsync(tar, msg);
|
|
|
+ }
|
|
|
+ else//其他都执行原有的无参流程
|
|
|
+ {
|
|
|
+ await DoX2D1NoParPosAsync(tar, paramInfo.Minfo.CapTime, cts, msg);
|
|
|
+ }
|
|
|
|
|
|
}
|
|
|
catch (TaskCanceledException)
|
|
@@ -563,8 +572,10 @@ namespace X2D1TaskServer.Service
|
|
|
return task;
|
|
|
}
|
|
|
|
|
|
- private async Task DoX2D1NoParPosAsync(X2D1TaskHandleDto dto, BaseParamInfo paramInfo, List<DetectResDto> deteRes, List<CpuCgResDto> data1, List<CpuCgResDto> data2, CancellationTokenSource cts, string msg, int fixedStationId, bool beFindRef = false)
|
|
|
+
|
|
|
+ private List<X2D1NoXlNoParlPosDto> BuildX2D1NoXlNoParlPosDto(X2D1TaskHandleDto dto, BaseParamInfo paramInfo, List<DetectResDto> deteRes, List<CpuCgResDto> data1, List<CpuCgResDto> data2, CancellationTokenSource cts, string msg)
|
|
|
{
|
|
|
+ int fixedStationId = dto.FixedStationDto != null ? dto.FixedStationDto.FixedStationId : 0;
|
|
|
List<X2D1NoXlNoParlPosDto> list = new List<X2D1NoXlNoParlPosDto>();
|
|
|
for (int i = 0; i < data1.Count; i++)
|
|
|
{
|
|
@@ -587,7 +598,7 @@ namespace X2D1TaskServer.Service
|
|
|
CdbTxLat = dto.CdbLat,
|
|
|
FreqDown = paramInfo.Minfo.FreqHz,
|
|
|
FreqUp = paramInfo.Dinfo.FreqHz,
|
|
|
- BeFindRef = beFindRef,
|
|
|
+ FixedStationId = fixedStationId,
|
|
|
CheckRes = new CheckResDto()
|
|
|
{
|
|
|
FileName = Path.GetFileName(paramInfo.Dinfo.FilePath),
|
|
@@ -601,10 +612,6 @@ namespace X2D1TaskServer.Service
|
|
|
}
|
|
|
|
|
|
};
|
|
|
- if (fixedStationId > 0)
|
|
|
- {
|
|
|
- x2D1.FixedStationId = fixedStationId;
|
|
|
- }
|
|
|
if (data1[i].Snr > 0 && data2[i].Snr > 0)
|
|
|
{
|
|
|
//卫星转发某些频点可能有时延,无参定位由于不能抵消需要减去这个时延
|
|
@@ -627,42 +634,71 @@ namespace X2D1TaskServer.Service
|
|
|
x2D1.XdSnr = data1[i].Snr;
|
|
|
}
|
|
|
}
|
|
|
- if (beFindRef)
|
|
|
- {
|
|
|
- list.Add(x2D1);
|
|
|
- continue;
|
|
|
- }
|
|
|
+ list.Add(x2D1);
|
|
|
+ }
|
|
|
+ catch (Exception ex)
|
|
|
+ {
|
|
|
+ LogHelper.Error($"{msg},{paramInfo.Minfo.CapTime:yyyyMMddHHmmss}时刻时隙位置{data1[i].Smpstart}构建目标信号参数异常", ex).GetAwaiter();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return list;
|
|
|
+ }
|
|
|
+ private async Task DoX2D1NoParPosAsync(List<X2D1NoXlNoParlPosDto> x2D1s, DateTime capTime, CancellationTokenSource cts, string msg)
|
|
|
+ {
|
|
|
+
|
|
|
+ foreach (var x2D1 in x2D1s)
|
|
|
+ {
|
|
|
+ try
|
|
|
+ {
|
|
|
+ if (cts.IsCancellationRequested) break;
|
|
|
+
|
|
|
var result = await HttpHelper.PostRequestAsync<PosResDto>(_config.baseUrl + "Pos/PosX2D1NoXlNoParAsync", x2D1);
|
|
|
if (result.code != 200)
|
|
|
{
|
|
|
- await LogHelper.Error($"{msg},{paramInfo.Minfo.CapTime:yyyyMMddHHmmss}时刻时隙位置{data1[i].Smpstart}定位异常.{result.msg}");
|
|
|
+ await LogHelper.Error($"{msg},{x2D1.SigTime:yyyyMMddHHmmss}时刻定位异常.{result.msg}");
|
|
|
}
|
|
|
}
|
|
|
catch (Exception ex)
|
|
|
{
|
|
|
- await LogHelper.Error($"{msg},{paramInfo.Minfo.CapTime:yyyyMMddHHmmss}时刻时隙位置{data1[i].Smpstart}定位异常", ex);
|
|
|
+ await LogHelper.Error($"{msg},{x2D1.SigTime:yyyyMMddHHmmss}时刻定位异常", ex);
|
|
|
}
|
|
|
}
|
|
|
+ await LogHelper.Info($"{msg}定位完成");
|
|
|
+ }
|
|
|
+
|
|
|
+ private async Task AddTarCacheAsync(List<X2D1NoXlNoParlPosDto> x2D1s, string msg)
|
|
|
+ {
|
|
|
+ if (x2D1s.Count == 0) return;
|
|
|
try
|
|
|
{
|
|
|
- if (beFindRef)
|
|
|
+ var result = await HttpHelper.PostRequestAsync(_config.baseUrl + "FindRef/AddX2D1TarCacheAsync", x2D1s);
|
|
|
+ if (result.code != 200)
|
|
|
{
|
|
|
- var result = await HttpHelper.PostRequestAsync<PosResDto>(_config.baseUrl + "Pos/PosX2D1BeFindRefListAsync", list);
|
|
|
- if (result.code != 200)
|
|
|
- {
|
|
|
- await LogHelper.Error($"{msg},{paramInfo.Minfo.CapTime:yyyyMMddHHmmss}时刻找参考定位定位异常.{result.msg}");
|
|
|
- }
|
|
|
-
|
|
|
+ await LogHelper.Error($"{msg},添加目标信号缓存异常.{result.msg}");
|
|
|
}
|
|
|
}
|
|
|
catch (Exception ex)
|
|
|
{
|
|
|
- await LogHelper.Error($"{msg},{paramInfo.Minfo.CapTime:yyyyMMddHHmmss}时刻找参考定位异常", ex);
|
|
|
+ await LogHelper.Error($"{msg}添加目标信号缓存异常", ex);
|
|
|
}
|
|
|
-
|
|
|
- await LogHelper.Info($"{msg},{paramInfo.Minfo.CapTime:yyyyMMddHHmmss}时刻定位完成");
|
|
|
}
|
|
|
|
|
|
+ private async Task AddRefCacheAsync(List<TaskCgDto> dtos, string msg)
|
|
|
+ {
|
|
|
+ if (dtos.Count == 0) return;
|
|
|
+ try
|
|
|
+ {
|
|
|
+ var result = await HttpHelper.PostRequestAsync(_config.baseUrl + "FindRef/AddX2D1RefCacheAsync", dtos);
|
|
|
+ if (result.code != 200)
|
|
|
+ {
|
|
|
+ await LogHelper.Error($"{msg},添加参考信号缓存异常.{result.msg}");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ catch (Exception ex)
|
|
|
+ {
|
|
|
+ await LogHelper.Error($"{msg}添加参考信号缓存异常", ex);
|
|
|
+ }
|
|
|
+ }
|
|
|
/// <summary>
|
|
|
/// 做参考信号
|
|
|
/// </summary>
|
|
@@ -675,7 +711,6 @@ namespace X2D1TaskServer.Service
|
|
|
/// <returns></returns>
|
|
|
private async Task<List<DetectResDto>> DoRefAsync(X2D1TaskHandleDto dto, BaseParamInfo paramInfo, List<DetectResDto> detects, List<CpuCgResDto> cg1, List<CpuCgResDto> cg2, CancellationTokenSource cts)
|
|
|
{
|
|
|
-
|
|
|
bool beRef = false;
|
|
|
|
|
|
//没有固定站时 做无参
|
|
@@ -697,9 +732,6 @@ namespace X2D1TaskServer.Service
|
|
|
{
|
|
|
beRef = true;
|
|
|
}
|
|
|
- if (!beRef) return null;
|
|
|
-
|
|
|
-
|
|
|
//获取满足固定站条件的参考信号
|
|
|
List<DetectResDto> refDetects = new List<DetectResDto>();
|
|
|
for (int i = 0; i < detects.Count; i++)
|
|
@@ -717,21 +749,88 @@ namespace X2D1TaskServer.Service
|
|
|
refDetects.Add(nextdete);
|
|
|
}
|
|
|
}
|
|
|
- if (refDetects.Count == 0) return null;
|
|
|
+
|
|
|
var capTime = paramInfo.Minfo.CapTime;
|
|
|
+ string msg = $"【任务{dto.ID}】参考信号[{paramInfo.TaskSig.FreqUp / 1e6:f3}MHz]{capTime:yyyyMMddHHmmss}时刻";
|
|
|
+ if (refDetects.Count == 0)
|
|
|
+ {
|
|
|
+ await SendZeroRefCacheAsync(dto, capTime, msg);
|
|
|
+ beRef = false;
|
|
|
+ }
|
|
|
+ if (!beRef) return null;
|
|
|
+
|
|
|
await LogHelper.Info($"【任务{dto.ID}】参考信号[{dto.FixedStationDto.FreqUp / 1e6:f3}MHz],{capTime:yyyyMMddHHmmss}时刻{_config.checkFileTypeStr}检测完成,共{refDetects.Count}个时隙");
|
|
|
var smps = refDetects.Select(m => new SmpPosition(m.Start, m.Length)).ToList();//怎么补0?
|
|
|
var data1 = cg1.Where(c => refDetects.Any(r => r.Start == c.Smpstart && r.Length == c.Smplen)).ToList();
|
|
|
var data2 = cg2.Where(c => refDetects.Any(r => r.Start == c.Smpstart && r.Length == c.Smplen)).ToList();
|
|
|
if (data1.Count != data2.Count || data1.Count != refDetects.Count)
|
|
|
{
|
|
|
+ await SendZeroRefCacheAsync(dto, capTime, msg);
|
|
|
await LogHelper.Error($"【任务{dto.ID}】参考信号[{dto.FixedStationDto.FreqUp / 1e6:f3}MHz],{capTime:yyyyMMddHHmmss}时刻参估结果个数和检测结果个数不匹配");
|
|
|
return null;
|
|
|
}
|
|
|
- string msg = $"【任务{dto.ID}】参考信号[{paramInfo.TaskSig.FreqUp / 1e6:f3}MHz]";
|
|
|
- //参考信号要存储固定站编号,标记是参考信号
|
|
|
- await DoX2D1NoParPosAsync(dto, paramInfo, refDetects, data1, data2, cts, msg, dto.FixedStationDto.FixedStationId);
|
|
|
+ //构建参考信号定位模型
|
|
|
+ var refSigDto = BuildX2D1NoXlNoParlPosDto(dto, paramInfo, refDetects, data1, data2, cts, msg);
|
|
|
+ //执行三星无参定位
|
|
|
+ await DoX2D1NoParPosAsync(refSigDto, paramInfo.Minfo.CapTime, cts, msg);
|
|
|
+
|
|
|
+ List<TaskCgDto> cgItems = new List<TaskCgDto>();
|
|
|
+ foreach (var item in refSigDto)
|
|
|
+ {
|
|
|
+ var ephMain = await GetSatEphAsync(dto.MainSatCode, item.SigTime);
|
|
|
+ var ephAdja = await GetSatEphAsync(dto.AdjaSatCode, item.SigTime);
|
|
|
+ if (ephMain == null || ephAdja == null) continue;
|
|
|
+ var tarEcef = PhysicsHelper.GeoToEcef((dto.FixedStationDto.Lon, dto.FixedStationDto.Lat, 0));
|
|
|
+ var ecefXl1 = (ephMain.X, ephMain.Y, ephMain.Z);
|
|
|
+ var ecefXl2 = (ephAdja.X, ephAdja.Y, ephAdja.Z);
|
|
|
+ var ecefCdb = PhysicsHelper.GeoToEcef((dto.CdbLon, dto.CdbLat, 0));
|
|
|
+ var ecefRec = PhysicsHelper.GeoToEcef((dto.CapLon , dto.CapLat, 0));
|
|
|
+ var mtdt1 = PhysicsHelper.Dto(tarEcef, ecefXl1, ecefRec);
|
|
|
+ var atdt2 = PhysicsHelper.Dto(tarEcef, ecefXl2, ecefRec);
|
|
|
+ TaskCgDto cgItem = new TaskCgDto
|
|
|
+ {
|
|
|
+ TaskID = dto.ID,
|
|
|
+ FixedLon = dto.FixedStationDto.Lon,
|
|
|
+ FixedLat = dto.FixedStationDto.Lat,
|
|
|
+ SigTime = item.SigTime,
|
|
|
+ MainYbDto = mtdt1,
|
|
|
+ AdjaYbDto = atdt2,
|
|
|
+ YbSnr =40,
|
|
|
+ };
|
|
|
+ cgItems.Add(cgItem);
|
|
|
+ }
|
|
|
+ //添加参考信号缓存
|
|
|
+ await AddRefCacheAsync(cgItems, msg);
|
|
|
return refDetects;
|
|
|
}
|
|
|
+
|
|
|
+ private async Task SendZeroRefCacheAsync(X2D1TaskHandleDto dto, DateTime capTime, string msg)
|
|
|
+ {
|
|
|
+ List<TaskCgDto> cgItems = new List<TaskCgDto>();
|
|
|
+ TaskCgDto cgItem = new TaskCgDto
|
|
|
+ {
|
|
|
+ TaskID = dto.ID,
|
|
|
+ FixedLon = dto.FixedStationDto.Lon,
|
|
|
+ FixedLat = dto.FixedStationDto.Lat,
|
|
|
+ SigTime = capTime.AddSeconds(_config.capSeconds),
|
|
|
+ MainYbDto = 0,
|
|
|
+ AdjaYbDto = 0,
|
|
|
+ YbSnr = 0,
|
|
|
+ };
|
|
|
+ cgItems.Add(cgItem);
|
|
|
+ //添加参考信号缓存
|
|
|
+ await AddRefCacheAsync(cgItems, msg);
|
|
|
+ }
|
|
|
+
|
|
|
+ private async Task<SatEphResDto> GetSatEphAsync(int satcode, DateTime sigtime)
|
|
|
+ {
|
|
|
+ var result = await HttpHelper.PostRequestAsync<SatEphResDto>(_config.baseUrl + "Xl/XLCalc", new SatDto() { SatCode = satcode, SigTime = sigtime });
|
|
|
+ if (result.code != 200)
|
|
|
+ {
|
|
|
+ await LogHelper.Error($"卫星:{satcode},{sigtime:yyyyMMddHHmmss}时刻获取星历异常.{result.msg}");
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ return result.data;
|
|
|
+ }
|
|
|
}
|
|
|
}
|