|
@@ -15,6 +15,7 @@ namespace X2D1NoRefTaskServer.Service
|
|
|
public class TaskService
|
|
|
{
|
|
|
private readonly string baseUrl;
|
|
|
+ int capSeconds;
|
|
|
Dictionary<int, CancellationTokenSource> dicCts = new Dictionary<int, CancellationTokenSource>();
|
|
|
public TaskService()
|
|
|
{
|
|
@@ -23,6 +24,11 @@ namespace X2D1NoRefTaskServer.Service
|
|
|
this.baseUrl = posPlatformAddr + "api/";
|
|
|
else
|
|
|
this.baseUrl = posPlatformAddr + "/api/";
|
|
|
+ var val = ConfigurationManager.AppSettings["CapSeconds"].Trim();
|
|
|
+ if (!int.TryParse(val, out capSeconds))
|
|
|
+ {
|
|
|
+ capSeconds = 60;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
@@ -156,9 +162,9 @@ namespace X2D1NoRefTaskServer.Service
|
|
|
if (delay2 == null) delay2 = 0;
|
|
|
LogHelper.Info($"【任务{dto.ID}】信号[{taskSig.FreqUp / 1e6}],主星[{minfo.SatId}],转发时延{delay1}us");
|
|
|
LogHelper.Info($"【任务{dto.ID}】信号[{taskSig.FreqUp / 1e6}],邻星[{ninfo.SatId}],转发时延{delay2}us");
|
|
|
- string mainFile = await HttpHelper.UploadFileAsync(minfo.FilePath, baseUrl + "File/UploadFileAsync", token: cts.Token);//主星文件
|
|
|
- string adjaFile = await HttpHelper.UploadFileAsync(ninfo.FilePath, baseUrl + "File/UploadFileAsync", token: cts.Token);//邻星文件
|
|
|
- string cdbFile = await HttpHelper.UploadFileAsync(dinfo.FilePath, baseUrl + "File/UploadFileAsync", token: cts.Token);//超短文件
|
|
|
+ string mainFile = await HttpHelper.UploadFileAsync(minfo.FilePath, baseUrl, token: cts.Token);//主星文件
|
|
|
+ string adjaFile = await HttpHelper.UploadFileAsync(ninfo.FilePath, baseUrl, token: cts.Token);//邻星文件
|
|
|
+ string cdbFile = await HttpHelper.UploadFileAsync(dinfo.FilePath, baseUrl, token: cts.Token);//超短文件
|
|
|
|
|
|
DetectDto detectDto = new DetectDto()
|
|
|
{
|
|
@@ -189,7 +195,7 @@ namespace X2D1NoRefTaskServer.Service
|
|
|
file2 = mainFile,
|
|
|
samplingRate = minfo.FsHz,
|
|
|
smpPositions = smps,
|
|
|
- snrThreshold = 15,
|
|
|
+ snrThreshold = taskSig.Snr,
|
|
|
};
|
|
|
var result1 = await HttpHelper.PostRequestAsync<List<CpuCgResDto>>(baseUrl + "DetectCg/CpuCgMultiCalc", cgDto, token: cts.Token);
|
|
|
if (result1.code != 200)
|
|
@@ -206,7 +212,7 @@ namespace X2D1NoRefTaskServer.Service
|
|
|
file2 = adjaFile,
|
|
|
samplingRate = minfo.FsHz,
|
|
|
smpPositions = smps,
|
|
|
- snrThreshold = 15,
|
|
|
+ snrThreshold = taskSig.Snr,
|
|
|
};
|
|
|
var result2 = await HttpHelper.PostRequestAsync<List<CpuCgResDto>>(baseUrl + "DetectCg/CpuCgMultiCalc", cgDto, token: cts.Token);
|
|
|
if (result2.code != 200)
|
|
@@ -215,6 +221,7 @@ namespace X2D1NoRefTaskServer.Service
|
|
|
continue;
|
|
|
}
|
|
|
LogHelper.Info($"【任务{dto.ID}】信号{taskSig.FreqUp / 1e6:f3},{capTime:yyyyMMddHHmmss}时刻邻星超短CPU参估完成");
|
|
|
+ await HttpHelper.DeleteFileAsync(new string[] { mainFile, adjaFile, cdbFile }, baseUrl);
|
|
|
var data1 = result1.data;
|
|
|
var data2 = result2.data;
|
|
|
if (data1.Count != data2.Count || data1.Count != deteResp.data.Count)
|
|
@@ -288,7 +295,7 @@ namespace X2D1NoRefTaskServer.Service
|
|
|
|
|
|
}
|
|
|
ResetTime(formatFlag, ref preTime);
|
|
|
- LogHelper.Info($"【任务{dto.ID}】目录[{filesDir}]中的数据处理完成");
|
|
|
+ LogHelper.Info($"【任务{dto.ID}】目录[{filesDir}]本次扫描处理完成");
|
|
|
}
|
|
|
catch (Exception ex)
|
|
|
{
|
|
@@ -331,7 +338,7 @@ namespace X2D1NoRefTaskServer.Service
|
|
|
LogHelper.Info($"【任务{dto.ID}】定位时差系数={posDtoFactor}");
|
|
|
|
|
|
bool canConnected = CanGetSatIdFromMySql();
|
|
|
- DateTime preTime = DateTime.Now;
|
|
|
+ DateTime preTime = DateTime.Now.AddSeconds(-capSeconds);
|
|
|
int formatFlag;
|
|
|
if (string.IsNullOrWhiteSpace(dto.DateDirFormat))
|
|
|
{
|
|
@@ -366,15 +373,15 @@ namespace X2D1NoRefTaskServer.Service
|
|
|
bool doNextHour = false;
|
|
|
while (!Directory.Exists(filesDir))
|
|
|
{
|
|
|
+ if (cts.IsCancellationRequested) return;
|
|
|
LogHelper.Info($"【任务{dto.ID}】目录[{filesDir}]不存在,等待5秒...");
|
|
|
- Thread.Sleep(5000);
|
|
|
+ await Task.Delay(5000, cts.Token);
|
|
|
if (DateTime.Now.Hour != preTime.Hour)
|
|
|
{
|
|
|
- preTime = DateTime.Now;
|
|
|
+ ResetTime(formatFlag, ref preTime);
|
|
|
doNextHour = true;
|
|
|
break;
|
|
|
}
|
|
|
- if (cts.IsCancellationRequested) break;
|
|
|
}
|
|
|
if (cts.IsCancellationRequested) return;
|
|
|
if (doNextHour)
|
|
@@ -382,36 +389,51 @@ namespace X2D1NoRefTaskServer.Service
|
|
|
continue;
|
|
|
}
|
|
|
LogHelper.Info($"【任务{dto.ID}】正在处理[{filesDir}]目录中的数据...");
|
|
|
- var files = Directory.EnumerateFiles(filesDir, "*.dat");
|
|
|
- if (!files.Any())
|
|
|
+ IEnumerable<string> files = null;
|
|
|
+ while (true)
|
|
|
{
|
|
|
- LogHelper.Info($"【任务{dto.ID}】目录[{filesDir}]中没有文件,跳过此目录");
|
|
|
- ResetTime(formatFlag, ref preTime);
|
|
|
- await Task.Delay(1000);
|
|
|
- continue;
|
|
|
+ if (cts.IsCancellationRequested) return;
|
|
|
+ files = Directory.EnumerateFiles(filesDir, "*.dat");
|
|
|
+ if (!files.Any())
|
|
|
+ {
|
|
|
+ LogHelper.Info($"【任务{dto.ID}】目录[{filesDir}]中没有文件,等待5秒...");
|
|
|
+ if (DateTime.Now.Hour != preTime.Hour)
|
|
|
+ {
|
|
|
+ ResetTime(formatFlag, ref preTime);
|
|
|
+ doNextHour = true;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ await Task.Delay(5000);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ break;
|
|
|
}
|
|
|
-
|
|
|
+ if (cts.IsCancellationRequested) return;
|
|
|
IOrderedEnumerable<IGrouping<DateTime, HistoryFile>> groups = null;
|
|
|
groups = files.Select(f => FileToHistoryFile(dto, f, canConnected)).GroupBy(m => m.CapTime).OrderBy(m => m.Key);
|
|
|
- TimeSpan span = abs(groups.First().Key - preTime);
|
|
|
- var closesData = groups.First();
|
|
|
- foreach (var item in groups.Skip(1))
|
|
|
+ bool hasFile = false;
|
|
|
+ foreach (var sameTimeFiles in groups)
|
|
|
{
|
|
|
- if (abs(preTime - item.Key) < span)
|
|
|
+ if (cts.IsCancellationRequested) return;
|
|
|
+ var capTime = sameTimeFiles.First().CapTime;
|
|
|
+ if (capTime <= preTime) continue;
|
|
|
+ if ((DateTime.Now - capTime).TotalMinutes > 10)
|
|
|
{
|
|
|
- span = abs(preTime - item.Key);
|
|
|
- closesData = item;
|
|
|
+ preTime = capTime;
|
|
|
+ LogHelper.Warning("处理速度过慢,丢弃数据");
|
|
|
+ continue;
|
|
|
}
|
|
|
- }
|
|
|
- //if (cts.IsCancellationRequested) break;
|
|
|
- var xdgbInfos = closesData.GroupBy(m => m.XdIndex);
|
|
|
- foreach (var xdInfos in xdgbInfos)
|
|
|
- {
|
|
|
- var finfos = xdInfos.ToList();
|
|
|
- var capTime = finfos.First().CapTime;
|
|
|
- //if (capTime < dto.StartTime) continue;
|
|
|
- //if (capTime > dto.EndTime) break;
|
|
|
- if (finfos.Count < 3)
|
|
|
+ if (!await WaitFileEnd(dto.ID, sameTimeFiles.First(), capSeconds, cts))//采集完成,仍然不能某个文件,做下一个信号
|
|
|
+ {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ hasFile = true;
|
|
|
+ var xdgbInfos = sameTimeFiles.GroupBy(m => m.XdIndex);
|
|
|
+ foreach (var xdInfos in xdgbInfos)
|
|
|
+ {
|
|
|
+ if (cts.IsCancellationRequested) return;
|
|
|
+ var finfos = xdInfos.ToList();
|
|
|
+ if (finfos.Count < 3)
|
|
|
{
|
|
|
LogHelper.Warning($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻文件数量只有{finfos.Count}个,跳过此组数据");
|
|
|
continue;
|
|
@@ -448,30 +470,13 @@ namespace X2D1NoRefTaskServer.Service
|
|
|
var delay2 = taskSig.SigDelay.FirstOrDefault(p => p.SatInfoSatCode == ninfo.SatId)?.Delay;
|
|
|
if (delay1 == null) delay1 = 0;
|
|
|
if (delay2 == null) delay2 = 0;
|
|
|
- LogHelper.Info($"【任务{dto.ID}】信号[{taskSig.FreqUp / 1e6}],主星[{minfo.SatId}],转发时延{delay1}us");
|
|
|
- LogHelper.Info($"【任务{dto.ID}】信号[{taskSig.FreqUp / 1e6}],邻星[{ninfo.SatId}],转发时延{delay2}us");
|
|
|
-
|
|
|
- while (true)
|
|
|
- {
|
|
|
- if (!IsFileInUse(minfo.FilePath))
|
|
|
- break;
|
|
|
- }
|
|
|
- string mainFile = await HttpHelper.UploadFileAsync(minfo.FilePath, baseUrl + "File/UploadFileAsync", token: cts.Token);//主星文件
|
|
|
- while (true)
|
|
|
- {
|
|
|
- if (!IsFileInUse(ninfo.FilePath))
|
|
|
- break;
|
|
|
- }
|
|
|
- string adjaFile = await HttpHelper.UploadFileAsync(ninfo.FilePath, baseUrl + "File/UploadFileAsync", token: cts.Token);//邻星文件
|
|
|
- while (true)
|
|
|
- {
|
|
|
- if (!IsFileInUse(dinfo.FilePath))
|
|
|
- break;
|
|
|
- }
|
|
|
- string cdbFile = await HttpHelper.UploadFileAsync(dinfo.FilePath, baseUrl + "File/UploadFileAsync", token: cts.Token);//超短文件
|
|
|
-
|
|
|
- DetectDto detectDto = new DetectDto()
|
|
|
- {
|
|
|
+ LogHelper.Info($"【任务{dto.ID}】信号[{taskSig.FreqUp / 1e6}],主星[{minfo.SatId}],转发时延{delay1}us");
|
|
|
+ LogHelper.Info($"【任务{dto.ID}】信号[{taskSig.FreqUp / 1e6}],邻星[{ninfo.SatId}],转发时延{delay2}us");
|
|
|
+ string mainFile = await HttpHelper.UploadFileAsync(minfo.FilePath, baseUrl, token: cts.Token);//主星文件
|
|
|
+ string adjaFile = await HttpHelper.UploadFileAsync(ninfo.FilePath, baseUrl, token: cts.Token);//邻星文件
|
|
|
+ string cdbFile = await HttpHelper.UploadFileAsync(dinfo.FilePath, baseUrl, token: cts.Token);//超短文件
|
|
|
+ DetectDto detectDto = new DetectDto()
|
|
|
+ {
|
|
|
file1 = cdbFile,//11局使用上行泄露信号进行检测
|
|
|
dmcType = taskSig.SigType,//上行信号检测目前的算法只能使用基于能量的KY或IBS检测
|
|
|
fsHz = minfo.FsHz,
|
|
@@ -498,7 +503,7 @@ namespace X2D1NoRefTaskServer.Service
|
|
|
file2 = mainFile,
|
|
|
samplingRate = minfo.FsHz,
|
|
|
smpPositions = smps,
|
|
|
- snrThreshold = 15,
|
|
|
+ snrThreshold = taskSig.Snr,
|
|
|
};
|
|
|
var result1 = await HttpHelper.PostRequestAsync<List<CpuCgResDto>>(baseUrl + "DetectCg/CpuCgMultiCalc", cgDto, token: cts.Token);
|
|
|
if (result1.code != 200)
|
|
@@ -515,7 +520,7 @@ namespace X2D1NoRefTaskServer.Service
|
|
|
file2 = adjaFile,
|
|
|
samplingRate = minfo.FsHz,
|
|
|
smpPositions = smps,
|
|
|
- snrThreshold = 15,
|
|
|
+ snrThreshold = taskSig.Snr,
|
|
|
};
|
|
|
var result2 = await HttpHelper.PostRequestAsync<List<CpuCgResDto>>(baseUrl + "DetectCg/CpuCgMultiCalc", cgDto, token: cts.Token);
|
|
|
if (result2.code != 200)
|
|
@@ -524,6 +529,7 @@ namespace X2D1NoRefTaskServer.Service
|
|
|
continue;
|
|
|
}
|
|
|
LogHelper.Info($"【任务{dto.ID}】信号{taskSig.FreqUp / 1e6:f3},{capTime:yyyyMMddHHmmss}时刻邻星超短CPU参估完成");
|
|
|
+ await HttpHelper.DeleteFileAsync(new string[] { mainFile, adjaFile, cdbFile }, baseUrl);
|
|
|
var data1 = result1.data;
|
|
|
var data2 = result2.data;
|
|
|
if (data1.Count != data2.Count || data1.Count != deteResp.data.Count)
|
|
@@ -535,7 +541,7 @@ namespace X2D1NoRefTaskServer.Service
|
|
|
{
|
|
|
try
|
|
|
{
|
|
|
- if (cts.IsCancellationRequested) break;
|
|
|
+ if (cts.IsCancellationRequested) return;
|
|
|
X2D1NoXlNoParlPosDto x2D1 = new X2D1NoXlNoParlPosDto()
|
|
|
{
|
|
|
TaskID = dto.ID,
|
|
@@ -581,6 +587,7 @@ namespace X2D1NoRefTaskServer.Service
|
|
|
}
|
|
|
}
|
|
|
LogHelper.Info($"【任务{dto.ID}】信号{taskSig.FreqUp / 1e6:f3},{capTime:yyyyMMddHHmmss}时刻定位完成");
|
|
|
+ LogHelper.Info($"-----------------------------------------------------------------");
|
|
|
|
|
|
}
|
|
|
catch (Exception ex)
|
|
@@ -590,8 +597,17 @@ namespace X2D1NoRefTaskServer.Service
|
|
|
}
|
|
|
|
|
|
}
|
|
|
- ResetTime(formatFlag, ref preTime);
|
|
|
- LogHelper.Info($"【任务{dto.ID}】目录[{filesDir}]中的数据处理完成");
|
|
|
+ ResetTime(formatFlag, ref preTime);
|
|
|
+ preTime = capTime;
|
|
|
+ LogHelper.Info($"【任务{dto.ID}】目录[{filesDir}]中的数据处理完成");
|
|
|
+
|
|
|
+ }
|
|
|
+ if (!hasFile)
|
|
|
+ {
|
|
|
+ LogHelper.Info($"【任务{dto.ID}】缺少最新的采集文件,等待5秒...");
|
|
|
+ preTime = DateTime.Now;
|
|
|
+ await Task.Delay(5000, cts.Token);
|
|
|
+ }
|
|
|
}
|
|
|
catch (Exception ex)
|
|
|
{
|
|
@@ -602,28 +618,39 @@ namespace X2D1NoRefTaskServer.Service
|
|
|
StopTask(dto.ID, EnumTaskStopType.Properly, "数据处理完成,任务结束");
|
|
|
}, cts.Token);
|
|
|
}
|
|
|
- TimeSpan abs(TimeSpan t)
|
|
|
- {
|
|
|
- return (t.TotalSeconds >= 0) ? t : -t;
|
|
|
- }
|
|
|
- private bool IsFileInUse(string fileName)
|
|
|
+
|
|
|
+ private async Task<bool> WaitFileEnd(int taskID, HistoryFile file, int capSeconds, CancellationTokenSource cts)
|
|
|
{
|
|
|
- bool inUse = true;
|
|
|
- FileStream fs = null;
|
|
|
- try
|
|
|
+ while (true)
|
|
|
{
|
|
|
- fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.None);
|
|
|
- inUse = false;
|
|
|
+ FileInfo s = new FileInfo(file.FilePath);
|
|
|
+ var len = (int)(DateTime.Now - s.CreationTime).TotalSeconds;
|
|
|
+ if (len < capSeconds + 2)
|
|
|
+ {
|
|
|
+ LogHelper.Info($"【任务{taskID}】等待[{file.CapTime:yyyyMMddHHmmss}]时刻文件采集完成...");
|
|
|
+ var sleepTime = (capSeconds - len) / 2 * 1000;
|
|
|
+ if (sleepTime < 2000)
|
|
|
+ sleepTime = 2000;
|
|
|
+ await Task.Delay(sleepTime, cts.Token);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ break;
|
|
|
}
|
|
|
- catch
|
|
|
+
|
|
|
+ try
|
|
|
{
|
|
|
+ using (var fs = new FileStream(file.FilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
|
|
|
+ {
|
|
|
+ }
|
|
|
}
|
|
|
- finally
|
|
|
+ catch (Exception ex)
|
|
|
{
|
|
|
- if (fs != null)
|
|
|
- fs.Close();
|
|
|
+ LogHelper.Error($"【任务{taskID}】文件[{file.FilePath}]尝试打开失败", ex);
|
|
|
+ return false;
|
|
|
}
|
|
|
- return inUse;//true表示正在使用,false没有使用
|
|
|
+ LogHelper.Info($"【任务{taskID}】[{file.CapTime:yyyyMMddHHmmss}]时刻文件采集完成");
|
|
|
+ return true;
|
|
|
+
|
|
|
}
|
|
|
private void ResetTime(int formatFlag, ref DateTime time)
|
|
|
{
|
|
@@ -688,19 +715,21 @@ namespace X2D1NoRefTaskServer.Service
|
|
|
{
|
|
|
if (ch == 2)
|
|
|
{
|
|
|
- historyFile.SatId = GetSatId(historyFile.FreqHz / 1e6);
|
|
|
+ if (canConnected)
|
|
|
+ historyFile.SatId = GetSatId(historyFile.FreqHz / 1e6);
|
|
|
if (historyFile.SatId == 0)
|
|
|
{
|
|
|
- LogHelper.Warning($"【任务{dto.ID}】频点{historyFile.FreqHz / 1e6:f3}无法通过MySql查询到卫星编号,使用任务中的卫星[{dto.MainSatCode}]");
|
|
|
+ //LogHelper.Warning($"【任务{dto.ID}】频点{historyFile.FreqHz / 1e6:f3}无法通过MySql查询到卫星编号,使用任务中的卫星[{dto.MainSatCode}]");
|
|
|
historyFile.SatId = dto.MainSatCode;
|
|
|
}
|
|
|
}
|
|
|
else if (ch == 3)
|
|
|
{
|
|
|
- historyFile.SatId = GetSatId(historyFile.FreqHz / 1e6);
|
|
|
+ if (canConnected)
|
|
|
+ historyFile.SatId = GetSatId(historyFile.FreqHz / 1e6);
|
|
|
if (historyFile.SatId == 0)
|
|
|
{
|
|
|
- LogHelper.Warning($"【任务{dto.ID}】频点{historyFile.FreqHz / 1e6:f3}无法通过MySql查询到卫星编号,使用任务中的卫星[{dto.AdjaSatCode}]");
|
|
|
+ //LogHelper.Warning($"【任务{dto.ID}】频点{historyFile.FreqHz / 1e6:f3}无法通过MySql查询到卫星编号,使用任务中的卫星[{dto.AdjaSatCode}]");
|
|
|
historyFile.SatId = dto.AdjaSatCode;
|
|
|
}
|
|
|
}
|
|
@@ -719,7 +748,7 @@ namespace X2D1NoRefTaskServer.Service
|
|
|
var res = MySqlTools.ExecuteScalar(System.Data.CommandType.Text, sql);
|
|
|
if (res == null || res == DBNull.Value)
|
|
|
{
|
|
|
- LogHelper.Warning($"下行频点{freqdownMHz}未能从MySql中找到对应的卫星编号.SQL={sql}");
|
|
|
+ //LogHelper.Warning($"下行频点{freqdownMHz}未能从MySql中找到对应的卫星编号.SQL={sql}");
|
|
|
}
|
|
|
else
|
|
|
{
|
|
@@ -746,6 +775,7 @@ namespace X2D1NoRefTaskServer.Service
|
|
|
}
|
|
|
catch
|
|
|
{
|
|
|
+ LogHelper.Warning($"无法连接到MySql,将使用任务中的卫星编号.SQL={sql}");
|
|
|
return false;
|
|
|
}
|
|
|
}
|