| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231 | using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using DevExpress.Xpo;using Ips.AdcAlgorithm;using Ips.Library.Basic;using Ips.Library.Entity;using Ips.Library.LocLib;using Ips.Library.Signals;using Ips.Sps.Scheduling.Entities;using Ips.Sps.TskResults.Pases;using Ips.Sps.Tsks;namespace Ips.Sps.Scheduling.SigAds{    public abstract class AdWorkerBase    {        public AdWorkerBase(RunTsk Tsk)        {            this.CurrentTsk = Tsk;            _adController = new AdcController();        }        public RunTsk CurrentTsk { get; protected set; }        protected IAdController _adController;        public event EventHandler<AdSigGroupStartEventArgs> AdSigGroupStart;        public event EventHandler<AdSigCompletedEventArgs> AdSigCompleted;        public event EventHandler<AdSigGroupCompletedEventArgs> AdSigGroupCompleted;        public abstract void Execute(CancellationToken token);        protected virtual void OnAdSigGroupStart(AdSigGroupStartEventArgs arg)        {            AdSigGroupStart?.Invoke(this, arg);        }        protected virtual void OnAdSigCompleted(AdSigCompletedEventArgs arg)        {            AdSigCompleted?.Invoke(this, arg);        }        protected virtual void OnAdSigGroupCompleted(AdSigGroupCompletedEventArgs arg)        {            AdSigGroupCompleted?.Invoke(this, arg);        }        protected virtual ExeResult<AdcResult> ExecuteAdc(RunAdCard adCard, RunSig sig, CancellationToken token)        {            var adcAndCfq = AdSigUtil.GetAdcAndCfqOptions(adCard, sig, true);            if (adcAndCfq.AdOptions == null) return null;            if (adcAndCfq.CfOptions.IsNotNullOrEmpty()) AdSigUtil.SetCfqList(adcAndCfq.CfOptions, token);            var adcOpt = adcAndCfq.AdOptions;            adcOpt.StartTime = DateTime.Now.AddSeconds(AdcConst.MinWaitTime);            if (sig.HasSample)            {                var sigSamples = sig.SigSamples.Where(m => m.Fs == sig.Fs && (m.EndSec - m.StartSec) >= sig.SigLen);                if (sigSamples.IsNotNullOrEmpty())                {                    int startSec = adcOpt.StartTime.Second;                    int endSec = startSec + sig.SigLen;                    if (!sigSamples.Any(m => m.StartSec <= startSec && m.EndSec >= startSec))                    {                        adcOpt.StartTime.AddMinutes(1).ClearSecond().AddSeconds(sigSamples.Min(m => m.StartSec));                    }                }            }            IpsLogger.Info($"信号频点:{sig.SigFreq.E6m()}开始采集,任务:【{CurrentTsk.TskName}】,开始时间:{adcOpt.StartTime:yyyy-MM-dd HH:mm:ss}");            ExeResult<AdcResult> adcRes = null;            try            {                adcRes = _adController.StartAdc(adcOpt, null, token).Result;            }            catch (Exception ex)            {                ex.HandleCancelEx(error =>                {                    IpsLogger.Error("执行采集出错",error);                }, exCancel =>                {                    IpsLogger.Error("采集取消或超时退出," + exCancel.Message);                });                Thread.Sleep(2000);            }            IpsLogger.Info($"信号频点:{sig.SigFreq.E6m()}采集完成,任务:【{CurrentTsk.TskName}】");            return adcRes;        }        protected virtual ExeResult<AdcResult> ExecuteDdc(RunAdCard adCard, List<RunSig> allSig, List<DxSig> dxSig, bool isKeep, Action<AdcResult> resultCallback, CancellationToken token)        {            AdcOptionsBuilder optionsBuilder = new AdcOptionsBuilder();            optionsBuilder.SetCard(adCard.CardType, adCard.ClockType, adCard.TriggerMode, adCard.DdcFreq, adCard.ClockFreq, adCard.Mutil, adCard.StorePath);            optionsBuilder.SetStart(DateTime.MinValue, allSig.Max(m => m.SigLen));            adCard.Channels.ForEach(ch =>            {                if (ch.FixCenter)                    optionsBuilder.SetChannel(ch.AntCode, ch.AdcCode, ch.ChNum, ch.CenterFreq);            });            FreqPointInfo mainSatFreq = null;            allSig.ForEach(sig =>            {                if (sig.MainSatId > 0)                {                    var ch = adCard.Channels.Find(m => m.Sats.Any(m => m.SatId == sig.MainSatId));                    if (ch != null)                    {                        var sat = ch.Sats.Find(m => m.SatId == sig.MainSatId);                        mainSatFreq = SigCalcUtil.GetFreqPointBySigFreq(sig.SigFreq, sat.SatType, sat.SatTurn, ch.FrqTurn);                        optionsBuilder.AddSignal(ch.AntCode, ch.AdcCode, ch.ChNum, mainSatFreq.DownFreq, sig.BandWidth, sat.SatNum.ToString(), mainSatFreq.UpFreq);                    }                }                sig.AdjaSatIds.ForEach(adjaSatId =>                {                    var ch = adCard.Channels.Find(m => m.Sats.Any(m => m.SatId == adjaSatId));                    if (ch != null)                    {                        var sat = ch.Sats.Find(m => m.SatId == adjaSatId);                        var adjaSatFreq = SigCalcUtil.GetFreqPointBySigFreq(mainSatFreq?.UpFreq ?? sig.SigFreq, sat.SatType, sat.SatTurn, ch.FrqTurn);                        optionsBuilder.AddSignal(ch.AntCode, ch.AdcCode, ch.ChNum, adjaSatFreq.DownFreq, sig.BandWidth, sat.SatNum.ToString(), adjaSatFreq.UpFreq);                    }                });            });            dxSig.ForEach(dxSig =>            {                dxSig.AdjaSatIds.ForEach(adjaSatId =>                {                    var ch = adCard.Channels.Find(m => m.Sats.Any(m => m.SatId == adjaSatId));                    if (ch != null)                    {                        var sat = ch.Sats.Find(m => m.SatId == adjaSatId);                        var adjaSatFreq = SigCalcUtil.GetFreqPointBySigFreq(dxSig.SigFreq, sat.SatType, sat.SatTurn, ch.FrqTurn);                        optionsBuilder.AddDXSignal(ch.AntCode, ch.AdcCode, ch.ChNum, adjaSatFreq.DownFreq, dxSig.BandWidth, (int)dxSig.SigType, adjaSatFreq.UpFreq);                    }                });            });            var adcOptions = optionsBuilder.Build();            adcOptions.UseGpuDdc = SpsConst.UseGpuDdc;            adcOptions.Real = adcOptions.Mutil < 2;            adcOptions.StartTime = DateTime.Now.AddSeconds(AdcConst.MinWaitTime);            AdSigUtil.SetAdCardFreq(adCard, adcOptions, token);            ExeResult<AdcResult> adcResult = null;            try            {                if (!isKeep)                {                    adcResult = _adController.StartDdcOne(adcOptions, null, token).Result;                }                else                {                    var ddcController = new AdgController();                    adcResult = ddcController.StartDdcKeep(adcOptions, resultCallback, null, token).Result;                }            }            catch (Exception ex)            {                ex.HandleCancelEx(error =>                {                    IpsLogger.Error("执行采集出错", error);                }, exCancel =>                {                    IpsLogger.Error("采集取消或超时退出," + exCancel.Message);                });                Thread.Sleep(2000);            }                      return adcResult;        }        protected virtual Pas CreatePas(RunTsk tsk, AdSigGroup adGroup, RunSig sig, RunSat sat, RunAdCard adCard, RunAdCh adCh, SignalFile adFile, UnitOfWork uow)        {            Pas pas = uow != null ? new Pas(uow) : new Pas();            pas.TskId = tsk.TskId;            pas.GroupTime = adGroup.GroupTime;            pas.SigId = sig.SigId;            pas.EmtId = sig.EmtId;            pas.SigTime = adFile.SigTime.ClearMillisecond();            pas.SigFreq = sig.SigFreq;            pas.BandWidth = sig.BandWidth;            pas.CreateTime = DateTime.Now;            pas.SatId = sat.SatId;            pas.SatNum = sat.SatNum;            pas.UpFreq = sig.SigFreq;            pas.DownFreq = adFile.SigFreq;            pas.SigCategory = sig.SigCategory;            pas.SigType = sig.SigType;            pas.SigLen = sig.SigLen;            pas.Fs = SigCalcUtil.CalcFs(adCard.ClockFreq, sig.BandWidth, adCard.Mutil);            pas.SatCode = sat.SatCode;            pas.AdCardId = adCard.CardId;            pas.AdChId = adCh.ChId;            pas.ChNum = adFile.ChNum;            pas.FolderName = adFile.DirectoryName;            pas.FileName = adFile.FileName;            pas.AntId = adCh.AntId;            pas.AntLon = adCh.AntLon;            pas.AntLat = adCh.AntLat;            pas.AntAlt = adCh.AntAlt;            return pas;        }        protected virtual AdSigResult WrapSigAdResult(RunTsk runTsk, AdSigGroup adGroup, RunAdCard adCard, RunSig sig, AdcResult adRes)        {            AdSigResult result = new AdSigResult(adGroup.TskId, adGroup.GroupTime, sig, adRes.StartTime);            if (adRes == null || adRes.FileList.IsNullOrEmpty())                return result;            result.AdFileDownloadUrl = adRes.FileList.First().DownloadUrl;            using var uow = new UnitOfWork();            {                foreach (var satid in sig.GetSatList())                {                    var adch = adCard.Channels.Find(m => m.Sats.Any(sat => sat.SatId == satid));                    if (adch == null) continue;                    var sat = adch.Sats.Find(m => m.SatId == satid);                    var adFile = adRes.FileList.Find(m => m.ChNum == adch.ChNum && m.SigFreq == sig.SigFreq && m.BandWidth == sig.BandWidth);                    if (adFile == null) continue;                    var pas = CreatePas(CurrentTsk, adGroup, sig, sat, adCard, adch, adFile, uow);                    result.PasList.Add(pas);                }                uow.CommitChanges();            }            return result;        }    }}
 |