|
@@ -87,7 +87,9 @@ namespace X2D1TaskServer54.Service
|
|
|
await StopTask(dto.ID, EnumTaskStopType.Error, $"执行异常,不支持的日期目录格式");
|
|
|
return;
|
|
|
}
|
|
|
-
|
|
|
+ HistoryFile mainFileTmp = null;
|
|
|
+ HistoryFile adjaFileTmp = null;
|
|
|
+ HistoryFile cdbFileTmp = null;
|
|
|
while (!cts.IsCancellationRequested && preTime <= dto.EndTime)
|
|
|
{
|
|
|
if (!dicCts.Values.Contains(cts)) return;
|
|
@@ -135,6 +137,12 @@ namespace X2D1TaskServer54.Service
|
|
|
List<Task> listTask = new List<Task>();
|
|
|
foreach (var item in splitXdgbInfos)//splitXdgbInfos中的数据并行处理
|
|
|
{
|
|
|
+ if (mainFileTmp == null)
|
|
|
+ mainFileTmp = item[0].FirstOrDefault(m => m.SatId == dto.MainSatCode);
|
|
|
+ if (adjaFileTmp == null)
|
|
|
+ adjaFileTmp = item[0].FirstOrDefault(m => m.SatId == dto.AdjaSatCode);
|
|
|
+ if (cdbFileTmp == null)
|
|
|
+ cdbFileTmp = item[0].FirstOrDefault(m => m.SatId == dto.CDBSatCode);
|
|
|
if (cts.IsCancellationRequested) return;
|
|
|
var task = GetPosTask(dto, item, isLocal, cts);
|
|
|
listTask.Add(task);
|
|
@@ -142,6 +150,7 @@ namespace X2D1TaskServer54.Service
|
|
|
await Task.WhenAll(listTask);
|
|
|
preTime = sameTimeFiles.First().CapTime;
|
|
|
}
|
|
|
+
|
|
|
ResetTime(formatFlag, ref preTime);
|
|
|
await XdCxRhDW.UI.Lib.LogHelper.Info($"【任务{dto.ID}】目录[{filesDir}]本次扫描的数据处理完成");
|
|
|
}
|
|
@@ -156,11 +165,303 @@ namespace X2D1TaskServer54.Service
|
|
|
ResetTime(formatFlag, ref preTime);
|
|
|
}
|
|
|
}
|
|
|
+#warning 历史数据文件太少,对105导出的csv结果重新定位
|
|
|
+ var csvFile = Directory.GetFiles(dto.CapDir, "*.csv").Where(p=>!p.Contains("副本")).FirstOrDefault();
|
|
|
+ if (csvFile != null && mainFileTmp != null && adjaFileTmp != null && cdbFileTmp != null)
|
|
|
+ {
|
|
|
+ var lines = File.ReadAllLines(csvFile).Skip(1).ToList();
|
|
|
+ for (int i = 0; i < lines.Count; i += 2)
|
|
|
+ {
|
|
|
+ var arr1 = lines[i].Split(',');
|
|
|
+ var arr2 = lines[i + 1].Split(',');
|
|
|
+ var capTime = DateTime.ParseExact(arr1[0], "yyyy-MM-dd HH:mm:ss.fff", null);
|
|
|
+ var upFreqHz = (long)(Convert.ToDouble(arr1[1]) * 1e6);
|
|
|
+ var dt1 = Convert.ToDouble(arr1[24])*1e6;//主邻1时差
|
|
|
+ var df1 = Convert.ToDouble(arr1[25]);//Hz
|
|
|
+ var snr1 = Convert.ToDouble(arr1[26]);
|
|
|
+
|
|
|
+ var dt2 = Convert.ToDouble(arr2[24])*1e6;//主超短时差
|
|
|
+ var df2 = Convert.ToDouble(arr2[25]);//Hz
|
|
|
+ var snr2 = Convert.ToDouble(arr2[26]);
|
|
|
+
|
|
|
+ var refDto1= Convert.ToDouble(arr1[37])*1e6;//样本主星时差
|
|
|
+ var refDto2= Convert.ToDouble(arr1[39])*1e6;//样本邻星时差
|
|
|
+
|
|
|
+ var mainX = Convert.ToDouble(arr1[27]);
|
|
|
+ var mainY = Convert.ToDouble(arr1[28]);
|
|
|
+ var mainZ = Convert.ToDouble(arr1[29]);
|
|
|
+ var adjaX = Convert.ToDouble(arr1[30]);
|
|
|
+ var adjaY = Convert.ToDouble(arr1[31]);
|
|
|
+ var adjaZ = Convert.ToDouble(arr1[32]);
|
|
|
+ double[] mainEph = new double[3] { mainX, mainY, mainZ };
|
|
|
+ double[] adjaEph = new double[3] { adjaX, adjaY, adjaZ };
|
|
|
+
|
|
|
+
|
|
|
+ var taskSig = dto.Sigs.FirstOrDefault(p => p.FreqUp == cdbFileTmp.UpFreqHz);
|
|
|
+ if (taskSig == null)
|
|
|
+ {
|
|
|
+ continue;//跳过不是任务处理的频点
|
|
|
+ }
|
|
|
+ string mainFile = await HttpHelper.UploadFileAsync(mainFileTmp.FilePath, _config.baseUrl, token: cts.Token);//主星文件
|
|
|
+ string adjaFile = await HttpHelper.UploadFileAsync(adjaFileTmp.FilePath, _config.baseUrl, token: cts.Token);//邻星文件
|
|
|
+ string cdbFile = await HttpHelper.UploadFileAsync(cdbFileTmp.FilePath, _config.baseUrl, token: cts.Token);//超短文件
|
|
|
+ var paramInfo = new BaseParamInfo(taskSig, cdbFileTmp, mainFileTmp, adjaFileTmp);
|
|
|
+ (bool deret, List<DetectResDto> deteRes) = await DetectCalc(cdbFile, mainFile, paramInfo, cts);
|
|
|
+ if (!deret) continue;
|
|
|
+ deteRes = deteRes.Take(1).ToList();
|
|
|
+ var smps = deteRes.Select(m => new SmpPosition(m.Start, m.Length)).ToList();//怎么补0?
|
|
|
+ var cgDto = new CpuCgMultiDto()
|
|
|
+ {
|
|
|
+ dtCenter = -260000,
|
|
|
+ dtRange = 60000,
|
|
|
+ file1 = cdbFile,
|
|
|
+ file2 = mainFile,
|
|
|
+ samplingRate = mainFileTmp.FsHz,
|
|
|
+ smpPositions = smps,
|
|
|
+ snrThreshold = taskSig.Snr,
|
|
|
+ BandHz = 0,
|
|
|
+ dfRange = 16384,
|
|
|
+ };
|
|
|
+ if (_config.checkFileType != 0)
|
|
|
+ {
|
|
|
+ cgDto.file1 = mainFile;
|
|
|
+ cgDto.file2 = cdbFile;
|
|
|
+ }
|
|
|
+ Stopwatch sw2 = new Stopwatch();
|
|
|
+ sw2.Start();
|
|
|
+ var result1 = await HttpHelper.PostRequestAsync<List<CpuCgResDto>>(_config.baseUrl + "DetectCg/CpuCgMultiCalc", cgDto, token: cts.Token);
|
|
|
+ if (result1.code != 200)
|
|
|
+ {
|
|
|
+ if (result1.msg.Contains("超时"))
|
|
|
+ await XdCxRhDW.UI.Lib.LogHelper.Error($"【任务{dto.ID}】信号[{taskSig.FreqUp / 1e6:f3}MHz],{capTime:yyyyMMddHHmmss.fff}时刻主星超短{result1.msg}");
|
|
|
+ else
|
|
|
+ await XdCxRhDW.UI.Lib.LogHelper.Error($"【任务{dto.ID}】信号[{taskSig.FreqUp / 1e6:f3}MHz],{capTime:yyyyMMddHHmmss.fff}时刻主星超短CPU参估出错.{result1.msg}");
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ sw2.Stop();
|
|
|
+ await XdCxRhDW.UI.Lib.LogHelper.Info($"【任务{dto.ID}】信号[{taskSig.FreqUp / 1e6:f3}MHz],{capTime:yyyyMMddHHmmss.fff}时刻主星超短CPU参估完成,耗时{sw2.ElapsedMilliseconds}ms");
|
|
|
+ cgDto = new CpuCgMultiDto()
|
|
|
+ {
|
|
|
+ dtCenter = -260000,
|
|
|
+ dtRange = 60000,
|
|
|
+ file1 = cdbFile,
|
|
|
+ file2 = adjaFile,
|
|
|
+ samplingRate = mainFileTmp.FsHz,
|
|
|
+ smpPositions = smps,
|
|
|
+ snrThreshold = taskSig.Snr,
|
|
|
+ BandHz = 0,
|
|
|
+ dfRange = 16384,
|
|
|
+ };
|
|
|
+ if (_config.checkFileType != 0)
|
|
|
+ {
|
|
|
+ cgDto.file1 = mainFile;
|
|
|
+ cgDto.file2 = adjaFile;
|
|
|
+ cgDto.dtCenter = 0;
|
|
|
+ cgDto.dtRange = 60000;
|
|
|
+ }
|
|
|
+ sw2.Restart();
|
|
|
+ var result2 = await HttpHelper.PostRequestAsync<List<CpuCgResDto>>(_config.baseUrl + "DetectCg/CpuCgMultiCalc", cgDto, token: cts.Token);
|
|
|
+ if (result2.code != 200)
|
|
|
+ {
|
|
|
+ if (_config.checkFileType == 0)
|
|
|
+ {
|
|
|
+ if (result2.msg.Contains("超时"))
|
|
|
+ await XdCxRhDW.UI.Lib.LogHelper.Error($"【任务{dto.ID}】信号[{taskSig.FreqUp / 1e6:f3}MHz],{capTime:yyyyMMddHHmmss}时刻邻星超短{result2.msg}");
|
|
|
+ else
|
|
|
+ await XdCxRhDW.UI.Lib.LogHelper.Error($"【任务{dto.ID}】信号[{taskSig.FreqUp / 1e6:f3}MHz],{capTime:yyyyMMddHHmmss}时刻邻星超短CPU参估出错.{result2.msg}");
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if (result2.msg.Contains("超时"))
|
|
|
+ await XdCxRhDW.UI.Lib.LogHelper.Error($"【任务{dto.ID}】信号[{taskSig.FreqUp / 1e6:f3}MHz],{capTime:yyyyMMddHHmmss}时刻主星邻星{result2.msg}");
|
|
|
+ else
|
|
|
+ await XdCxRhDW.UI.Lib.LogHelper.Error($"【任务{dto.ID}】信号[{taskSig.FreqUp / 1e6:f3}MHz],{capTime:yyyyMMddHHmmss}时刻主星邻星CPU参估出错.{result2.msg}");
|
|
|
+ }
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ sw2.Stop();
|
|
|
+ if (_config.checkFileType == 0)
|
|
|
+ await XdCxRhDW.UI.Lib.LogHelper.Info($"【任务{dto.ID}】信号[{taskSig.FreqUp / 1e6:f3}MHz],{capTime:yyyyMMddHHmmss.fff}时刻邻星超短CPU参估完成,耗时{sw2.ElapsedMilliseconds}ms");
|
|
|
+ else
|
|
|
+ await XdCxRhDW.UI.Lib.LogHelper.Info($"【任务{dto.ID}】信号[{taskSig.FreqUp / 1e6:f3}MHz],{capTime:yyyyMMddHHmmss.fff}时刻主星邻星CPU参估完成,耗时{sw2.ElapsedMilliseconds}ms");
|
|
|
+ await HttpHelper.DeleteFileAsync(_config.baseUrl, mainFile, adjaFile, cdbFile);
|
|
|
+ var data1 = result1.data.Take(1).ToList();
|
|
|
+ var data2 = result2.data.Take(1).ToList();
|
|
|
+ data1[0].Dt = -dt2;
|
|
|
+ data1[0].Df = df2;
|
|
|
+ data1[0].Snr = snr2;
|
|
|
+ data2[0].Dt = -dt1;
|
|
|
+ data2[0].Df = df1;
|
|
|
+ data2[0].Snr = snr1;
|
|
|
+ if (data1.Count != data2.Count || data1.Count != deteRes.Count)
|
|
|
+ {
|
|
|
+ await XdCxRhDW.UI.Lib.LogHelper.Error($"【任务{dto.ID}】信号[{taskSig.FreqUp / 1e6:f3}MHz],{capTime:yyyyMMddHHmmss.fff}时刻参估结果个数和检测结果个数不匹配");
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ string msg = $"【任务{dto.ID}】目标信号[{paramInfo.TaskSig.FreqUp / 1e6:f3}MHz]";
|
|
|
+ await Pos(dto, paramInfo, deteRes, data1, data2, cts, msg, capTime, mainEph, adjaEph, refDto1, refDto2);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
await StopTask(dto.ID, EnumTaskStopType.Properly, "数据处理完成,任务结束");
|
|
|
}, cts.Token);
|
|
|
}
|
|
|
|
|
|
+ public async Task Pos(X2D1TaskHandleDto dto, BaseParamInfo paramInfo, List<DetectResDto> deteRes, List<CpuCgResDto> data1, List<CpuCgResDto> data2, CancellationTokenSource cts, string msg, DateTime sigTime, double[] mainEph, double[] adjaEph, double refDto1, double refDto2)
|
|
|
+ {
|
|
|
|
|
|
+ for (int i = 0; i < data1.Count; i++)
|
|
|
+ {
|
|
|
+ try
|
|
|
+ {
|
|
|
+ if (cts.IsCancellationRequested) break;
|
|
|
+ var detect = deteRes.First(r => r.Start == data1[i].Smpstart && r.Length == data1[i].Smplen);
|
|
|
+ X2D1PosDto x2D1 = new X2D1PosDto()
|
|
|
+ {
|
|
|
+ TaskID = dto.ID,
|
|
|
+ SigTime = sigTime,
|
|
|
+ MainCode = paramInfo.Minfo.SatId,
|
|
|
+ AdjaCode = paramInfo.Ninfo.SatId,
|
|
|
+ MainX = mainEph[0],
|
|
|
+ MainY = mainEph[1],
|
|
|
+ MainZ = mainEph[2],
|
|
|
+ AdjaX = adjaEph[0],
|
|
|
+ AdjaY = adjaEph[1],
|
|
|
+ AdjaZ = adjaEph[2],
|
|
|
+ XdDfo = data2[i].Df,
|
|
|
+ XdSnr = data2[i].Snr,
|
|
|
+ MSatTxLon = dto.MSatCapLon,
|
|
|
+ MSatTxLat = dto.MSatCapLat,
|
|
|
+ NSatTxLon = dto.NSatCapLon,
|
|
|
+ NSatTxLat = dto.NSatCapLat,
|
|
|
+ CdbTxLon = dto.CdbLon,
|
|
|
+ CdbTxLat = dto.CdbLat,
|
|
|
+ RefLon = dto.RefLon,
|
|
|
+ RefLat = dto.RefLat,
|
|
|
+ FreqDown = paramInfo.Minfo.DownFreqHz,
|
|
|
+ FreqUp = paramInfo.Minfo.UpFreqHz,
|
|
|
+ MainYbDto = refDto1,
|
|
|
+ AdjaYbDto = refDto2,
|
|
|
+ CheckRes = new CheckResDto()
|
|
|
+ {
|
|
|
+ FileName = Path.GetFileName(paramInfo.Dinfo.FilePath),
|
|
|
+ ModRate = detect.ModRate,
|
|
|
+ ModType = detect.ModType,
|
|
|
+ SmpCount = detect.Length,
|
|
|
+ SmpStart = detect.Start,
|
|
|
+ UserName = detect.UserName,
|
|
|
+ FfcHz = detect.FfcHz,
|
|
|
+ PosCheckType = detect.DmcType.GetEnumByDisplayName<EnumPosCheckTypeDto>(),
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ };
|
|
|
+
|
|
|
+ if (data1[i].Snr > 0 && data2[i].Snr > 0)
|
|
|
+ {
|
|
|
+ //卫星转发某些频点可能有时延,无参定位由于不能抵消需要减去这个时延
|
|
|
+ if (_config.checkFileType == 0)
|
|
|
+ {
|
|
|
+ x2D1.SxDto = data1[i].Dt * _config.posDtoFactor - data2[i].Dt * _config.posDtoFactor - paramInfo.Delay1.Value + paramInfo.Delay2.Value;
|
|
|
+ x2D1.SxDfo = data1[i].Df - data2[i].Df;
|
|
|
+ x2D1.SxSnr = (data1[i].Snr + data2[i].Snr) / 2;
|
|
|
+ x2D1.XdDto = data1[i].Dt * _config.posDtoFactor - paramInfo.Delay1.Value;
|
|
|
+ x2D1.XdDfo = data1[i].Df;
|
|
|
+ x2D1.XdSnr = data1[i].Snr;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ x2D1.SxDto = data2[i].Dt * _config.posDtoFactor;
|
|
|
+ x2D1.SxDfo = data2[i].Df;
|
|
|
+ x2D1.SxSnr = data2[i].Snr;
|
|
|
+ x2D1.XdDto = data1[i].Dt * _config.posDtoFactor;
|
|
|
+ x2D1.XdDfo = data1[i].Df;
|
|
|
+ x2D1.XdSnr = data1[i].Snr;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ var result = await HttpHelper.PostRequestAsync<PosResDto>(_config.baseUrl + "Pos/PosX2D1Async", x2D1);
|
|
|
+ if (result.code != 200)
|
|
|
+ {
|
|
|
+ await XdCxRhDW.UI.Lib.LogHelper.Error($"{msg},{paramInfo.Minfo.CapTime:yyyyMMddHHmmss}时刻时隙位置{data1[i].Smpstart}定位异常.{result.msg}");
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ var posRes = result.data;
|
|
|
+ double posLon = posRes.PosLon;
|
|
|
+ double posLat = posRes.PosLat;
|
|
|
+ if (x2D1.SxSnr == 0 || x2D1.XdSnr == 0)
|
|
|
+ {
|
|
|
+ posLon = 0;
|
|
|
+ posLat = 0;
|
|
|
+ }
|
|
|
+ ErrEllipseResDto errRes = new ErrEllipseResDto();
|
|
|
+ if (posLon != 0 && posLat != 0 && posLon != 999 && posLat != 999)
|
|
|
+ {
|
|
|
+ var errDto = new ErrEllipseX2D1Dto()
|
|
|
+ {
|
|
|
+ MainX = mainEph[0],
|
|
|
+ MainY = mainEph[1],
|
|
|
+ MainZ = mainEph[2],
|
|
|
+ AdjaX = adjaEph[0],
|
|
|
+ AdjaY = adjaEph[1],
|
|
|
+ AdjaZ = adjaEph[2],
|
|
|
+ CdbLon = dto.CdbLon,
|
|
|
+ CdbLat = dto.CdbLat,
|
|
|
+ PosLon = posLon,
|
|
|
+ PosLat = posLat,
|
|
|
+ RefLon = dto.RefLon,
|
|
|
+ RefLat = dto.RefLat,
|
|
|
+ OutputErrPoint = false,
|
|
|
+ DtoErrus = _config.DtoErrus,
|
|
|
+ EphErr = _config.EphErrm,
|
|
|
+
|
|
|
+ };
|
|
|
+ var errResRsp = await HttpHelper.PostRequestAsync<ErrEllipseResDto>(_config.baseUrl + "Ellipse/X2D1", errDto);
|
|
|
+ if (errResRsp.code != 200)
|
|
|
+ {
|
|
|
+ await XdCxRhDW.UI.Lib.LogHelper.Error(errResRsp.msg);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ errRes = errResRsp.data;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ PosResWriteDto wDto = new PosResWriteDto()
|
|
|
+ {
|
|
|
+ PosTypeDto = EnumPosTypeDto.X2D1,
|
|
|
+ SigTime = x2D1.SigTime,
|
|
|
+ SigTimeLenMs = x2D1.CheckRes.SmpCount / (long)paramInfo.Minfo.FsHz * 1000,
|
|
|
+ FreqDownMHz = paramInfo.Minfo.DownFreqHz * 1e-6,
|
|
|
+ FreqUpMHz = paramInfo.Minfo.UpFreqHz * 1e-6,
|
|
|
+ SigModType = detect.ModType,
|
|
|
+ PosLon = posLon,
|
|
|
+ PosLat = posLat,
|
|
|
+ Dto1 = x2D1.SxDto,
|
|
|
+ Dfo1 = x2D1.SxDfo,
|
|
|
+ Snr1 = x2D1.SxSnr,
|
|
|
+ Dto2 = x2D1.XdDto,
|
|
|
+ Dfo2 = x2D1.XdDfo,
|
|
|
+ Snr2 = x2D1.XdSnr,
|
|
|
+ LongRadius = errRes.LongRadius,
|
|
|
+ ShortRadius = errRes.ShortRadius,
|
|
|
+ DipAngle = errRes.DipAngle,
|
|
|
+ TsCount = data1.Count,
|
|
|
+ PosType = 3,
|
|
|
+ ModRate = detect.ModRate.HasValue ? detect.ModRate.Value : 0,
|
|
|
+ CdbLon = x2D1.CdbTxLon,
|
|
|
+ CdbLat = x2D1.CdbTxLat,
|
|
|
+ };
|
|
|
+ await HttpHelper.PostRequestAsync(_config.baseUrl + "Result/WritePosResToFile", wDto);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ catch (Exception ex)
|
|
|
+ {
|
|
|
+ await XdCxRhDW.UI.Lib.LogHelper.Error($"{msg},{paramInfo.Minfo.CapTime:yyyyMMddHHmmss}时刻时隙位置{data1[i].Smpstart}定位异常", ex);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ await XdCxRhDW.UI.Lib.LogHelper.Info($"{msg},{paramInfo.Minfo.CapTime:yyyyMMddHHmmss}时刻定位完成");
|
|
|
+ }
|
|
|
public bool Stop(int taskID)
|
|
|
{
|
|
|
if (!dicCts.ContainsKey(taskID)) return false;
|