AdWorkerBase.cs 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using DevExpress.Xpo;
  7. using Ips.AdcAlgorithm;
  8. using Ips.Library.Basic;
  9. using Ips.Library.Entity;
  10. using Ips.Library.LocLib;
  11. using Ips.Library.Signals;
  12. using Ips.Sps.Scheduling.Entities;
  13. using Ips.Sps.TskResults.Pases;
  14. using Ips.Sps.Tsks;
  15. namespace Ips.Sps.Scheduling.SigAds
  16. {
  17. public abstract class AdWorkerBase
  18. {
  19. public AdWorkerBase(RunTsk Tsk)
  20. {
  21. this.CurrentTsk = Tsk;
  22. _adController = new AdcController();
  23. }
  24. public RunTsk CurrentTsk { get; protected set; }
  25. protected IAdController _adController;
  26. public event EventHandler<AdSigGroupStartEventArgs> AdSigGroupStart;
  27. public event EventHandler<AdSigCompletedEventArgs> AdSigCompleted;
  28. public event EventHandler<AdSigGroupCompletedEventArgs> AdSigGroupCompleted;
  29. public abstract void Execute(CancellationToken token);
  30. protected virtual void OnAdSigGroupStart(AdSigGroupStartEventArgs arg)
  31. {
  32. AdSigGroupStart?.Invoke(this, arg);
  33. }
  34. protected virtual void OnAdSigCompleted(AdSigCompletedEventArgs arg)
  35. {
  36. AdSigCompleted?.Invoke(this, arg);
  37. }
  38. protected virtual void OnAdSigGroupCompleted(AdSigGroupCompletedEventArgs arg)
  39. {
  40. AdSigGroupCompleted?.Invoke(this, arg);
  41. }
  42. protected virtual ExeResult<AdcResult> ExecuteAdc(RunAdCard adCard, RunSig sig, CancellationToken token)
  43. {
  44. var adcAndCfq = AdSigUtil.GetAdcAndCfqOptions(adCard, sig, true);
  45. if (adcAndCfq.AdOptions == null) return null;
  46. if (adcAndCfq.CfOptions.IsNotNullOrEmpty()) AdSigUtil.SetCfqList(adcAndCfq.CfOptions, token);
  47. var adcOpt = adcAndCfq.AdOptions;
  48. adcOpt.StartTime = DateTime.Now.AddSeconds(AdcConst.MinWaitTime);
  49. if (sig.HasSample)
  50. {
  51. var sigSamples = sig.SigSamples.Where(m => m.Fs == sig.Fs && (m.EndSec - m.StartSec) >= sig.SigLen);
  52. if (sigSamples.IsNotNullOrEmpty())
  53. {
  54. int startSec = adcOpt.StartTime.Second;
  55. int endSec = startSec + sig.SigLen;
  56. if (!sigSamples.Any(m => m.StartSec <= startSec && m.EndSec >= startSec))
  57. {
  58. adcOpt.StartTime.AddMinutes(1).ClearSecond().AddSeconds(sigSamples.Min(m => m.StartSec));
  59. }
  60. }
  61. }
  62. IpsLogger.Info($"信号频点:{sig.SigFreq.E6m()}开始采集,任务:【{CurrentTsk.TskName}】,开始时间:{adcOpt.StartTime:yyyy-MM-dd HH:mm:ss}");
  63. ExeResult<AdcResult> adcRes = null;
  64. try
  65. {
  66. adcRes = _adController.StartAdc(adcOpt, null, token).Result;
  67. }
  68. catch (Exception ex)
  69. {
  70. ex.HandleCancelEx(error =>
  71. {
  72. IpsLogger.Error("执行采集出错",error);
  73. }, exCancel =>
  74. {
  75. IpsLogger.Error("采集取消或超时退出," + exCancel.Message);
  76. });
  77. Thread.Sleep(2000);
  78. }
  79. IpsLogger.Info($"信号频点:{sig.SigFreq.E6m()}采集完成,任务:【{CurrentTsk.TskName}】");
  80. return adcRes;
  81. }
  82. protected virtual ExeResult<AdcResult> ExecuteDdc(RunAdCard adCard, List<RunSig> allSig, List<DxSig> dxSig, bool isKeep, Action<AdcResult> resultCallback, CancellationToken token)
  83. {
  84. AdcOptionsBuilder optionsBuilder = new AdcOptionsBuilder();
  85. optionsBuilder.SetCard(adCard.CardType, adCard.ClockType, adCard.TriggerMode, adCard.DdcFreq, adCard.ClockFreq, adCard.Mutil, adCard.StorePath);
  86. optionsBuilder.SetStart(DateTime.MinValue, allSig.Max(m => m.SigLen));
  87. adCard.Channels.ForEach(ch =>
  88. {
  89. if (ch.FixCenter)
  90. optionsBuilder.SetChannel(ch.AntCode, ch.AdcCode, ch.ChNum, ch.CenterFreq);
  91. });
  92. FreqPointInfo mainSatFreq = null;
  93. allSig.ForEach(sig =>
  94. {
  95. if (sig.MainSatId > 0)
  96. {
  97. var ch = adCard.Channels.Find(m => m.Sats.Any(m => m.SatId == sig.MainSatId));
  98. if (ch != null)
  99. {
  100. var sat = ch.Sats.Find(m => m.SatId == sig.MainSatId);
  101. mainSatFreq = SigCalcUtil.GetFreqPointBySigFreq(sig.SigFreq, sat.SatType, sat.SatTurn, ch.FrqTurn);
  102. optionsBuilder.AddSignal(ch.AntCode, ch.AdcCode, ch.ChNum, mainSatFreq.DownFreq, sig.BandWidth, sat.SatNum.ToString(), mainSatFreq.UpFreq);
  103. }
  104. }
  105. sig.AdjaSatIds.ForEach(adjaSatId =>
  106. {
  107. var ch = adCard.Channels.Find(m => m.Sats.Any(m => m.SatId == adjaSatId));
  108. if (ch != null)
  109. {
  110. var sat = ch.Sats.Find(m => m.SatId == adjaSatId);
  111. var adjaSatFreq = SigCalcUtil.GetFreqPointBySigFreq(mainSatFreq?.UpFreq ?? sig.SigFreq, sat.SatType, sat.SatTurn, ch.FrqTurn);
  112. optionsBuilder.AddSignal(ch.AntCode, ch.AdcCode, ch.ChNum, adjaSatFreq.DownFreq, sig.BandWidth, sat.SatNum.ToString(), adjaSatFreq.UpFreq);
  113. }
  114. });
  115. });
  116. dxSig.ForEach(dxSig =>
  117. {
  118. dxSig.AdjaSatIds.ForEach(adjaSatId =>
  119. {
  120. var ch = adCard.Channels.Find(m => m.Sats.Any(m => m.SatId == adjaSatId));
  121. if (ch != null)
  122. {
  123. var sat = ch.Sats.Find(m => m.SatId == adjaSatId);
  124. var adjaSatFreq = SigCalcUtil.GetFreqPointBySigFreq(dxSig.SigFreq, sat.SatType, sat.SatTurn, ch.FrqTurn);
  125. optionsBuilder.AddDXSignal(ch.AntCode, ch.AdcCode, ch.ChNum, adjaSatFreq.DownFreq, dxSig.BandWidth, (int)dxSig.SigType, adjaSatFreq.UpFreq);
  126. }
  127. });
  128. });
  129. var adcOptions = optionsBuilder.Build();
  130. adcOptions.UseGpuDdc = SpsConst.UseGpuDdc;
  131. adcOptions.Real = adcOptions.Mutil < 2;
  132. adcOptions.StartTime = DateTime.Now.AddSeconds(AdcConst.MinWaitTime);
  133. AdSigUtil.SetAdCardFreq(adCard, adcOptions, token);
  134. ExeResult<AdcResult> adcResult = null;
  135. try
  136. {
  137. if (!isKeep)
  138. {
  139. adcResult = _adController.StartDdcOne(adcOptions, null, token).Result;
  140. }
  141. else
  142. {
  143. var ddcController = new AdgController();
  144. adcResult = ddcController.StartDdcKeep(adcOptions, resultCallback, null, token).Result;
  145. }
  146. }
  147. catch (Exception ex)
  148. {
  149. ex.HandleCancelEx(error =>
  150. {
  151. IpsLogger.Error("执行采集出错", error);
  152. }, exCancel =>
  153. {
  154. IpsLogger.Error("采集取消或超时退出," + exCancel.Message);
  155. });
  156. Thread.Sleep(2000);
  157. }
  158. return adcResult;
  159. }
  160. protected virtual Pas CreatePas(RunTsk tsk, AdSigGroup adGroup, RunSig sig, RunSat sat, RunAdCard adCard, RunAdCh adCh, SignalFile adFile, UnitOfWork uow)
  161. {
  162. Pas pas = uow != null ? new Pas(uow) : new Pas();
  163. pas.TskId = tsk.TskId;
  164. pas.GroupTime = adGroup.GroupTime;
  165. pas.SigId = sig.SigId;
  166. pas.EmtId = sig.EmtId;
  167. pas.SigTime = adFile.SigTime.ClearMillisecond();
  168. pas.SigFreq = sig.SigFreq;
  169. pas.BandWidth = sig.BandWidth;
  170. pas.CreateTime = DateTime.Now;
  171. pas.SatId = sat.SatId;
  172. pas.SatNum = sat.SatNum;
  173. pas.UpFreq = sig.SigFreq;
  174. pas.DownFreq = adFile.SigFreq;
  175. pas.SigCategory = sig.SigCategory;
  176. pas.SigType = sig.SigType;
  177. pas.SigLen = sig.SigLen;
  178. pas.Fs = SigCalcUtil.CalcFs(adCard.ClockFreq, sig.BandWidth, adCard.Mutil);
  179. pas.SatCode = sat.SatCode;
  180. pas.AdCardId = adCard.CardId;
  181. pas.AdChId = adCh.ChId;
  182. pas.ChNum = adFile.ChNum;
  183. pas.FolderName = adFile.DirectoryName;
  184. pas.FileName = adFile.FileName;
  185. pas.AntId = adCh.AntId;
  186. pas.AntLon = adCh.AntLon;
  187. pas.AntLat = adCh.AntLat;
  188. pas.AntAlt = adCh.AntAlt;
  189. return pas;
  190. }
  191. protected virtual AdSigResult WrapSigAdResult(RunTsk runTsk, AdSigGroup adGroup, RunAdCard adCard, RunSig sig, AdcResult adRes)
  192. {
  193. AdSigResult result = new AdSigResult(adGroup.TskId, adGroup.GroupTime, sig, adRes.StartTime);
  194. if (adRes == null || adRes.FileList.IsNullOrEmpty())
  195. return result;
  196. result.AdFileDownloadUrl = adRes.FileList.First().DownloadUrl;
  197. using var uow = new UnitOfWork();
  198. {
  199. foreach (var satid in sig.GetSatList())
  200. {
  201. var adch = adCard.Channels.Find(m => m.Sats.Any(sat => sat.SatId == satid));
  202. if (adch == null) continue;
  203. var sat = adch.Sats.Find(m => m.SatId == satid);
  204. var adFile = adRes.FileList.Find(m => m.ChNum == adch.ChNum && m.SigFreq == sig.SigFreq && m.BandWidth == sig.BandWidth);
  205. if (adFile == null) continue;
  206. var pas = CreatePas(CurrentTsk, adGroup, sig, sat, adCard, adch, adFile, uow);
  207. result.PasList.Add(pas);
  208. }
  209. uow.CommitChanges();
  210. }
  211. return result;
  212. }
  213. }
  214. }