TaskService.cs 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Configuration;
  4. using System.Diagnostics;
  5. using System.IO;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading;
  9. using System.Threading.Tasks;
  10. using System.Web.Http.Results;
  11. using XdCxRhDW.Dto;
  12. namespace X3TaskServer54.Service
  13. {
  14. //业务逻辑处理类
  15. public class TaskService
  16. {
  17. private readonly string baseUrl;
  18. CancellationTokenSource cts;
  19. string DetectDir;
  20. string CapDir;
  21. string PosResDir;
  22. string StateDir;
  23. int MainSatCode, Adja1SatCode, Adja2SatCode;
  24. double[] MainSatXYZ, Adja1SatXYZ, Adja2SatXYZ;
  25. int PosDtoFactor;
  26. double DtoErrus;
  27. double EphErrm;
  28. public TaskService()
  29. {
  30. var posPlatformAddr = ConfigurationManager.AppSettings["PosPlatformAddr"].Trim();//like http://127.0.0.1:8091 or http://127.0.0.1:8091/
  31. if (posPlatformAddr.EndsWith("/"))
  32. this.baseUrl = posPlatformAddr + "api/";
  33. else
  34. this.baseUrl = posPlatformAddr + "/api/";
  35. DetectDir = ConfigurationManager.AppSettings["DetectDir"].Trim();
  36. CapDir = ConfigurationManager.AppSettings["CapDir"].Trim();
  37. PosResDir = ConfigurationManager.AppSettings["PosResDir"].Trim();
  38. StateDir = ConfigurationManager.AppSettings["StateRptDir"].Trim();
  39. var PosDtoFactorstr = ConfigurationManager.AppSettings["PosDtoFactor"].Trim();
  40. int.TryParse(PosDtoFactorstr, out PosDtoFactor);
  41. if (PosDtoFactor == 0) PosDtoFactor = 1;
  42. var DtoErrusstr = ConfigurationManager.AppSettings["DtoErrus"].Trim();
  43. double.TryParse(DtoErrusstr, out DtoErrus);
  44. var EphErrmstr = ConfigurationManager.AppSettings["EphErrm"].Trim();
  45. double.TryParse(EphErrmstr, out EphErrm);
  46. }
  47. public void StartAsync(X3NoRefTaskHandleDto dto)
  48. {
  49. cts = new CancellationTokenSource();
  50. Task.Run(async () =>
  51. {
  52. await LogHelper.Info($"【任务{dto.ID}】开始执行...");
  53. await LogHelper.Info($"【任务{dto.ID}】检测结果目录[{DetectDir}]");
  54. await LogHelper.Info($"【任务{dto.ID}】AD采集目录[{CapDir}]");
  55. await LogHelper.Info($"【任务{dto.ID}】状态上报输出目录[{StateDir}]");
  56. //点击定位平台右上角查看接口可以在浏览器中查看平台提供的所有接口详细信息
  57. while (!cts.IsCancellationRequested)
  58. {
  59. try
  60. {
  61. #region 第1步,读取需要的配置信息
  62. if (!Directory.Exists(DetectDir))
  63. {
  64. await StopTask(dto.ID, EnumTaskStopType.Error, $"检测结果目录[{DetectDir}]不存在");
  65. return;
  66. }
  67. if (!Directory.Exists(CapDir))
  68. {
  69. await StopTask(dto.ID, EnumTaskStopType.Error, $"AD采集目录[{CapDir}]不存在");
  70. return;
  71. }
  72. Directory.CreateDirectory("DdcDir");
  73. Directory.CreateDirectory(PosResDir);
  74. Directory.CreateDirectory(StateDir);
  75. try
  76. {
  77. var mainInfo = ConfigurationManager.AppSettings["MainSatInfo"].Replace(",", ",").Trim();
  78. var adja1Info = ConfigurationManager.AppSettings["Adja1SatInfo"].Replace(",", ",").Trim();
  79. var adja2Info = ConfigurationManager.AppSettings["Adja2SatInfo"].Replace(",", ",").Trim();
  80. var arr1 = mainInfo.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);
  81. var arr2 = adja1Info.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);
  82. var arr3 = adja2Info.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);
  83. MainSatCode = Convert.ToInt32(arr1[0]);
  84. Adja1SatCode = Convert.ToInt32(arr2[0]);
  85. Adja2SatCode = Convert.ToInt32(arr3[0]);
  86. MainSatXYZ = new double[3] { Convert.ToDouble(arr1[1]), Convert.ToDouble(arr1[2]), Convert.ToDouble(arr1[3]) };
  87. Adja1SatXYZ = new double[3] { Convert.ToDouble(arr2[1]), Convert.ToDouble(arr2[2]), Convert.ToDouble(arr2[3]) };
  88. Adja2SatXYZ = new double[3] { Convert.ToDouble(arr3[1]), Convert.ToDouble(arr3[2]), Convert.ToDouble(arr3[3]) };
  89. }
  90. catch
  91. {
  92. await StopTask(dto.ID, EnumTaskStopType.Error, $"任务处理服务配置文件卫星信息解析出错");
  93. return;
  94. }
  95. #endregion
  96. #region 第2步,扫描检测结果目录
  97. //同一个AD文件得到的不同频点的检测文件FlagNo相同
  98. var groupFiles = Directory.EnumerateFiles(DetectDir, "*.dat", SearchOption.TopDirectoryOnly).Select(p => StringToCheckResFile(p))
  99. .GroupBy(m => Convert.ToInt64(m.DayTime.ToString("yyyyMMdd") + m.FlagNo)).OrderBy(m => m.Key);
  100. if (!groupFiles.Any())
  101. {
  102. await LogHelper.Info($"【任务{dto.ID}】等待扫描文件...");
  103. await Task.Delay(10000, cts.Token);
  104. }
  105. foreach (var groupFile in groupFiles)//每一组文件代表同一个时刻的,gourpFile时相同时刻的不同频点的文件
  106. {
  107. if (cts.IsCancellationRequested) break;
  108. await LogHelper.Info($"【任务{dto.ID}】正在解析序号为{groupFile.First().FlagNo}的检测引导文件");
  109. List<SlotsInfo> listSlotsInfo = new List<SlotsInfo>();//多个频点的时隙结果
  110. int idx = 0;
  111. DateTime adTime = DateTime.MinValue;
  112. foreach (var item in groupFile)
  113. {
  114. if (cts.IsCancellationRequested) break;
  115. var slotsInfo = SlotHelper.GetFileSlots(item.File);//某个频点的所有时隙
  116. adTime = slotsInfo.AdTime;
  117. if (idx == 0)
  118. await LogHelper.Info($"【任务{dto.ID}】序号为{groupFile.First().FlagNo}的检测引导文件对应采集时刻{slotsInfo.AdTime:yyyyMMddHHmmss}");
  119. idx++;
  120. if (slotsInfo.Slots.Any())
  121. listSlotsInfo.Add(slotsInfo);
  122. else
  123. File.Delete(item.File);//删除没有信号的检测引导文件
  124. }
  125. var adFiles = Directory.EnumerateFiles(CapDir, "*.dat", SearchOption.TopDirectoryOnly).Select(p => StringToAdFile(p))
  126. .Where(p => p.AdTime == adTime);
  127. if (!listSlotsInfo.Any())
  128. {
  129. //没有突发信号,删除所有对应时刻的采集文件
  130. foreach (var item in adFiles)
  131. {
  132. File.Delete(item.File);
  133. }
  134. continue;
  135. }
  136. if (adFiles.Count() != 3)
  137. {
  138. await LogHelper.Warning($"【任务{dto.ID}】{adTime:yyyyMMddHHmmss}时刻原始AD文件个数不为3,跳过此组文件");
  139. //AD数据不全,删除所有对应时刻的采集文件
  140. foreach (var item in adFiles)
  141. {
  142. File.Delete(item.File);
  143. }
  144. continue;
  145. }
  146. var first = listSlotsInfo.First();
  147. var sigs = listSlotsInfo.Select(p => new DDCSig() { FreqDownHz = (int)(p.FreqDownMHz * 1e6), Mult = (int)first.Multi, Slots = p });
  148. List<DDCFile> chDDCFiles = new List<DDCFile>();//同一个时刻多个频点多个通道的DDC数据
  149. await LogHelper.Info($"【任务{dto.ID}】{listSlotsInfo.First().AdTime:yyyyMMddHHmmss}时刻3路AD文件开始DDC处理开始,共{sigs.Count()}个频点...");
  150. Stopwatch sw = new Stopwatch();
  151. sw.Start();
  152. var listTask = new List<Task>();
  153. foreach (var adFile in adFiles)
  154. {
  155. var task = Task.Run(() =>
  156. {
  157. var ddcRes = DDCHelper.DDC(adFile.File, adFile.AdTime, adFile.ChNo, (long)(first.FsampleM * 1e6), (long)(227 * 1e6), "DdcDir", sigs);
  158. chDDCFiles.AddRange(StringToDDCFile(ddcRes));
  159. }, cts.Token);
  160. listTask.Add(task);
  161. }
  162. await Task.WhenAll(listTask);
  163. if (cts.IsCancellationRequested) break;
  164. sw.Stop();
  165. await LogHelper.Info($"【任务{dto.ID}】{listSlotsInfo.First().AdTime:yyyyMMddHHmmss}时刻3路AD文件DDC处理完成,耗时{sw.ElapsedMilliseconds}ms");
  166. if (!chDDCFiles.Any())
  167. {
  168. await LogHelper.Error($"【任务{dto.ID}】{listSlotsInfo.First().AdTime:yyyyMMddHHmmss}时刻3路AD文件DDC处理无结果");
  169. continue;
  170. }
  171. var groupDDCFiles = chDDCFiles.GroupBy(p => p.FreqDownMHz);
  172. listTask.Clear();
  173. foreach (var group in groupDDCFiles)
  174. {
  175. //group:同一个时刻同一个频点的多个通道数据
  176. var task = Task.Run(async () =>
  177. {
  178. var ch0File = group.Where(p => p.ChNo == 0).FirstOrDefault();
  179. var ch1File = group.Where(p => p.ChNo == 1).FirstOrDefault();
  180. var ch2File = group.Where(p => p.ChNo == 2).FirstOrDefault();
  181. if (ch0File == null)
  182. {
  183. await LogHelper.Warning($"【任务{dto.ID}】{adTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-未找到主星信号ch0文件,跳过此组数据");
  184. return;
  185. }
  186. if (ch1File == null)
  187. {
  188. await LogHelper.Warning($"【任务{dto.ID}】{adTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-未找到邻1星信号ch1文件,跳过此组数据");
  189. return;
  190. }
  191. if (ch2File == null)
  192. {
  193. await LogHelper.Warning($"【任务{dto.ID}】{adTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-未找到邻2星信号ch2文件,跳过此组数据");
  194. return;
  195. }
  196. var sig = sigs.FirstOrDefault(p => p.FreqDownHz == (int)(group.Key * 1e6));
  197. if (cts.IsCancellationRequested) return;
  198. await LogHelper.Info($"【任务{dto.ID}】{adTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-CPU参估开始,共{sig.Slots.Slots.Count}个突发...");
  199. sw.Start();
  200. string mainFile = await HttpHelper.UploadFileAsync(ch0File.File, baseUrl, token: cts.Token);//主星文件
  201. string adja1File = await HttpHelper.UploadFileAsync(ch1File.File, baseUrl, token: cts.Token);//邻1星文件
  202. string adja2File = await HttpHelper.UploadFileAsync(ch2File.File, baseUrl, token: cts.Token);//邻2星文件
  203. var cgDto = new CpuCgMultiDto()
  204. {
  205. dtCenter = 0,
  206. dtRange = 40000,
  207. file1 = mainFile,
  208. file2 = adja1File,
  209. samplingRate = ch0File.Fs,
  210. smpPositions = sig.Slots.Slots.Select(p => new SmpPosition() { TimeSeconds = p.TimeSeconds, smpStart = p.StartPoint, smpCount = p.Len }).ToList(),
  211. snrThreshold = 15,
  212. };
  213. var result1 = await HttpHelper.PostRequestAsync<List<CpuCgResDto>>(baseUrl + "DetectCg/CpuCgMultiCalc", cgDto, token: cts.Token);
  214. if (result1.code != 200)
  215. {
  216. await LogHelper.Error($"【任务{dto.ID}】{adTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-主星邻1星CPU参估出错.{result1.msg}");
  217. return;
  218. }
  219. cgDto = new CpuCgMultiDto()
  220. {
  221. dtCenter = 0,
  222. dtRange = 40000,
  223. file1 = mainFile,
  224. file2 = adja2File,
  225. samplingRate = ch0File.Fs,
  226. smpPositions = sig.Slots.Slots.Select(p => new SmpPosition() { TimeSeconds = p.TimeSeconds, smpStart = p.StartPoint, smpCount = p.Len }).ToList(),
  227. snrThreshold = 15,
  228. };
  229. var result2 = await HttpHelper.PostRequestAsync<List<CpuCgResDto>>(baseUrl + "DetectCg/CpuCgMultiCalc", cgDto, token: cts.Token);
  230. sw.Stop();
  231. if (result2.code != 200)
  232. {
  233. await LogHelper.Error($"【任务{dto.ID}】{adTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-主星邻2星CPU参估出错.{result2.msg}");
  234. return;
  235. }
  236. await LogHelper.Info($"【任务{dto.ID}】{adTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-CPU参估完成,耗时{sw.ElapsedMilliseconds}ms");
  237. var data1 = result1.data;
  238. var data2 = result2.data;
  239. if (data1.Count != data2.Count || data1.Count != cgDto.smpPositions.Count)
  240. {
  241. await LogHelper.Error($"【任务{dto.ID}】{adTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-参估结果个数和检测结果个数不匹配");
  242. return;
  243. }
  244. var signaldto = new SignalProcDto()
  245. {
  246. File = mainFile,
  247. Fs = ch0File.Fs,
  248. Smps = cgDto.smpPositions,
  249. };
  250. var signalResult = await HttpHelper.PostRequestAsync<List<SignalProcResDto>>(baseUrl + "DetectCg/SignalProc", signaldto);
  251. if (signalResult.code != 200)
  252. {
  253. await LogHelper.Error($"【任务{dto.ID}】{adTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-主星信号识别出错.{signalResult.msg}");
  254. return;
  255. }
  256. sw.Start();
  257. for (int i = 0; i < data1.Count; i++)
  258. {
  259. try
  260. {
  261. if (cts.IsCancellationRequested) break;
  262. X3TwoDtoNoParPosDto x3 = new X3TwoDtoNoParPosDto()
  263. {
  264. TaskID = dto.ID,
  265. //SigTime = adTime.AddSeconds(data1[i].Smpstart / (double)ch0File.Fs),
  266. SigTime = adTime.AddSeconds(data1[i].TimeSeconds),
  267. MainCode = MainSatCode,
  268. Adja1Code = Adja1SatCode,
  269. Adja2Code = Adja2SatCode,
  270. MainX = MainSatXYZ[0],
  271. MainY = MainSatXYZ[1],
  272. MainZ = MainSatXYZ[2],
  273. Adja1X = Adja1SatXYZ[0],
  274. Adja1Y = Adja1SatXYZ[1],
  275. Adja1Z = Adja1SatXYZ[2],
  276. Adja2X = Adja2SatXYZ[0],
  277. Adja2Y = Adja2SatXYZ[1],
  278. Adja2Z = Adja2SatXYZ[2],
  279. Dto1 = PosDtoFactor * data1[i].Dt,
  280. Dfo1 = data1[i].Df,
  281. Snr1 = data1[i].Snr,
  282. Dto2 = PosDtoFactor * data2[i].Dt,
  283. Dfo2 = data2[i].Df,
  284. Snr2 = data2[i].Snr,
  285. SatTxLon = dto.CapLon,
  286. SatTxLat = dto.CapLat,
  287. FreqDown = ch0File.FreqDownMHz * 1e6,
  288. FreqUp = (ch0File.FreqDownMHz + 44) * 1e6,
  289. CheckRes = new CheckResDto()
  290. {
  291. FileName = Path.GetFileName(ch0File.File),
  292. SmpStart = sig.Slots.Slots[i].StartPoint,
  293. SmpCount = sig.Slots.Slots[i].Len,
  294. PosCheckType = EnumPosCheckTypeDto.DAMA,
  295. }
  296. };
  297. var result = await HttpHelper.PostRequestAsync<PosResDto>(baseUrl + "Pos/PosX3TwoDtoNoParAsync", x3);
  298. if (result.code != 200)
  299. {
  300. await LogHelper.Error($"【任务{dto.ID}】{adTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-时隙位置{data1[i].Smpstart}定位异常.{result.msg}");
  301. }
  302. else
  303. {
  304. var posRes = result.data;
  305. double posLon = posRes.PosLon;
  306. double posLat = posRes.PosLat;
  307. if (x3.Snr1 == 0 || x3.Snr2 == 0)
  308. {
  309. posLon = 0;
  310. posLat = 0;
  311. }
  312. ErrEllipseResDto errRes = new ErrEllipseResDto();
  313. if (posLon != 0 && posLat != 0 && posLon != 999 && posLat != 999)
  314. {
  315. var errDto = new ErrEllipseX3NoRefDto()
  316. {
  317. PosLon = posLon,
  318. PosLat = posLat,
  319. MainX = MainSatXYZ[0],
  320. MainY = MainSatXYZ[1],
  321. MainZ = MainSatXYZ[2],
  322. Adja1X = Adja1SatXYZ[0],
  323. Adja1Y = Adja1SatXYZ[1],
  324. Adja1Z = Adja1SatXYZ[2],
  325. Adja2X = Adja2SatXYZ[0],
  326. Adja2Y = Adja2SatXYZ[1],
  327. Adja2Z = Adja2SatXYZ[2],
  328. DtoErrus = DtoErrus,
  329. EphErr = EphErrm,
  330. OutputErrPoint = false,
  331. };
  332. var errResRsp = await HttpHelper.PostRequestAsync<ErrEllipseResDto>(baseUrl + "Ellipse/X3TwoDtoNoRef", errDto);
  333. if (errResRsp.code != 200)
  334. {
  335. await LogHelper.Error(errResRsp.msg);
  336. }
  337. else
  338. {
  339. errRes = errResRsp.data;
  340. }
  341. }
  342. StringBuilder sb = new StringBuilder();
  343. sb.Append($"{x3.SigTime:yyyy}\t");
  344. sb.Append($"{x3.SigTime:MM}\t");
  345. sb.Append($"{x3.SigTime:dd}\t");
  346. sb.Append($"{x3.SigTime:HH}\t");
  347. sb.Append($"{x3.SigTime:mm}\t");
  348. sb.Append($"{x3.SigTime:ss}\t");
  349. sb.Append($"{x3.SigTime:fff}\t");
  350. sb.Append($"{x3.CheckRes.SmpCount * 1000 / ch0File.Fs:D4}\t");//信号持续时间ms
  351. sb.Append($"{Convert.ToInt64(group.First().FreqDownMHz * 1e6):D12}\t");//下行频点
  352. sb.Append($"{Convert.ToInt64((group.First().FreqDownMHz + 44) * 1e6):D12}\t");//上行频点
  353. sb.Append($"{GetSignalType(signalResult.data[i].ModType)}\t");//信号样式(暂定有这些1:CPM,2:BPSK,4:QPSK,9:其他),
  354. sb.Append($"{0:D4}\t");//目标序号
  355. sb.Append($"res\t");
  356. sb.Append($"{Convert.ToInt64(posLon * 1e6):D10}\t");
  357. sb.Append($"{Convert.ToInt64(posLat * 1e6):D10}\t");
  358. sb.Append($"{Convert.ToInt64(0 * 1e3):D8}\t");//定位误差km
  359. sb.Append($"{Convert.ToInt64(x3.Dto1 * 1e2):D10}\t");
  360. sb.Append($"{Convert.ToInt64(x3.Dfo1 * 1e2):D10}\t");
  361. sb.Append($"{Convert.ToInt64(x3.Snr1 * 1e2):D6}\t");
  362. sb.Append($"{Convert.ToInt64(x3.Dto2 * 1e2):D10}\t");
  363. sb.Append($"{Convert.ToInt64(x3.Dfo2 * 1e2):D10}\t");
  364. sb.Append($"{Convert.ToInt64(x3.Snr2 * 1e2):D6}\t");
  365. sb.Append($"{Convert.ToInt64(0 * 1e2):D10}\t");
  366. sb.Append($"{Convert.ToInt64(0 * 1e2):D10}\t");
  367. sb.Append($"{Convert.ToInt64(0 * 1e2):D6}\t");
  368. sb.Append($"{0:D8}\t");//长轴
  369. sb.Append($"{0:D8}\t");//短轴
  370. sb.Append($"{0:D7}\t");//倾角
  371. sb.Append($"{data1.Count:D2}\t");//时隙属性
  372. sb.Append($"{1}\t");//所属卫星
  373. sb.Append($"{100:D3}\t");//置信度
  374. sb.Append($"{1}\t");//定位体制(0未知,1高轨多星,2高低轨,3星地,4星座)
  375. sb.Append($"{(long)signalResult.data[i].Rate:D12}");//符号速率bps
  376. sb.Append("\r\n");
  377. string resFile = Path.Combine(PosResDir, $"高轨三星定位结果_{posRes.SigTime:yyyyMMdd}.txt");
  378. lock (this)
  379. {
  380. File.AppendAllText(resFile, sb.ToString());
  381. }
  382. }
  383. }
  384. catch (Exception ex)
  385. {
  386. await LogHelper.Error($"【任务{dto.ID}】{adTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-时隙位置{data1[i].Smpstart}定位异常", ex);
  387. }
  388. }
  389. sw.Stop();
  390. await LogHelper.Info($"【任务{dto.ID}】{adTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-定位完成,耗时{sw.ElapsedMilliseconds}ms");
  391. //删除DDC文件
  392. File.Delete(ch0File.File);
  393. File.Delete(ch1File.File);
  394. File.Delete(ch2File.File);
  395. }, cts.Token);
  396. listTask.Add(task);
  397. }
  398. await Task.WhenAll(listTask);
  399. }
  400. #endregion
  401. }
  402. catch (TaskCanceledException ex)
  403. {
  404. await LogHelper.Warning($"【任务{dto.ID}】处理结束,用户手动终止", ex.InnerException);
  405. }
  406. catch (Exception ex)
  407. {
  408. if (ex.InnerException != null && ex.InnerException.GetType() == typeof(TaskCanceledException))
  409. await LogHelper.Warning($"【任务{dto.ID}】处理结束,用户手动终止", ex.InnerException);
  410. else
  411. await LogHelper.Error($"【任务{dto.ID}】任务执行出错", ex);
  412. continue;
  413. }
  414. }
  415. }, cts.Token);
  416. }
  417. public void Stop()
  418. {
  419. cts?.Cancel();
  420. }
  421. private int GetSignalType(EnumSignalTypeDto modType)
  422. {
  423. //1:CPM,2:BPSK,4:QPSK,9:其他
  424. int signalType = 9;
  425. if (modType == EnumSignalTypeDto.BPSK)
  426. {
  427. signalType = 2;
  428. }
  429. else if (modType == EnumSignalTypeDto.QPSK)
  430. {
  431. signalType = 4;
  432. }
  433. return signalType;
  434. }
  435. private async Task StopTask(int taskID, EnumTaskStopType type, string stopReason)
  436. {
  437. cts?.Cancel();
  438. await Task.Delay(2000);
  439. if (type == EnumTaskStopType.Properly)
  440. {
  441. await LogHelper.Info($"【任务{taskID}】{stopReason}");
  442. }
  443. else
  444. {
  445. await LogHelper.Error($"【任务{taskID}】{stopReason}");
  446. }
  447. TaskStopHandleDto stopDto = new TaskStopHandleDto() { ID = taskID, StopType = type, StopReason = stopReason };
  448. var stopResp = await HttpHelper.PostRequestAsync(baseUrl + "Task/StopTask", stopDto);
  449. if (stopResp.code != 200)
  450. {
  451. await LogHelper.Error($"【任务{taskID}】停止异常.{stopResp.msg}");
  452. }
  453. }
  454. private CheckResFile StringToCheckResFile(string file)
  455. {
  456. //YUFO_252.050MHz_20240409_1398.dat
  457. string fileName = Path.GetFileNameWithoutExtension(file).ToUpper();
  458. var arr = fileName.Split(new string[] { "_", "MHZ" }, StringSplitOptions.RemoveEmptyEntries);
  459. var dayTime = DateTime.ParseExact(arr[2], "yyyyMMdd", null);
  460. CheckResFile res = new CheckResFile()
  461. {
  462. DayTime = dayTime,
  463. File = file,
  464. FreqDownMHz = Convert.ToDouble(arr[1]),
  465. FlagNo = Convert.ToInt64(arr[3]),
  466. };
  467. return res;
  468. }
  469. private AdFile StringToAdFile(string file)
  470. {
  471. //20240409094240_ADC_ch02.dat
  472. var name = Path.GetFileNameWithoutExtension(file).ToUpper();
  473. var arr = name.Split(new string[] { "_", "CH" }, StringSplitOptions.RemoveEmptyEntries);
  474. var time = DateTime.ParseExact(arr[0], "yyyyMMddHHmmss", null);
  475. AdFile adFile = new AdFile()
  476. {
  477. File = file,
  478. AdTime = time,
  479. ChNo = Convert.ToInt32(arr[2]),
  480. };
  481. return adFile;
  482. }
  483. public DDCFile StringToDDCFile(string file)
  484. {
  485. //20240409094240_252.025_C109375_ch0.dat
  486. var name = Path.GetFileNameWithoutExtension(file).ToUpper();
  487. var arr = name.Split(new string[] { "_", "MHz", "C", "H" }, StringSplitOptions.RemoveEmptyEntries);
  488. var time = DateTime.ParseExact(arr[0], "yyyyMMddHHmmss", null);
  489. double freqDown = Convert.ToDouble(arr[1]);
  490. int fs = Convert.ToInt32(arr[2]);
  491. int chNo = Convert.ToInt32(arr[3]);
  492. return new DDCFile()
  493. {
  494. AdTime = time,
  495. ChNo = chNo,
  496. File = file,
  497. FreqDownMHz = freqDown,
  498. Fs = fs
  499. };
  500. }
  501. public List<DDCFile> StringToDDCFile(List<string> files)
  502. {
  503. List<DDCFile> list = new List<DDCFile>();
  504. foreach (var item in files)
  505. {
  506. list.Add(StringToDDCFile(item));
  507. }
  508. return list;
  509. }
  510. }
  511. }