using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Ips.Library.Entity { public class AdcOptionsBuilder { public AdcOptionsBuilder() { _options = new AdcOptions(); } protected AdcOptions _options; public virtual void SetStart(DateTime startTime, int timeLen) { _options.StartTime = startTime; _options.TimeLen = timeLen; } public virtual void SetCard(AdCardType cardType, AdClockType clockType, AdTriggerMode triggerMode, int ddcFreq, long clockFreq, int mutil, string storePath) { _options.CardType = cardType; _options.ClockType = clockType; _options.TriggerMode = triggerMode; _options.DdcFreq = ddcFreq; _options.ClockFreq = clockFreq; _options.Mutil = mutil; _options.StorePath = storePath; } public virtual void SetChannel(string siteCode, string adcCode, int chNum, long centerFreq) { _options.SetChannel(siteCode, adcCode, chNum, centerFreq); } public virtual void AddSignal(string siteCode, string adcCode, int chNum, long freqAd, int bandWidth, string satNum, long freqUp) { _options.AddSingal(siteCode, adcCode, chNum, freqAd, bandWidth, satNum, freqUp); } public virtual void AddDXSignal(string siteCode, string adcCode, int chNum, long freqAd, int bandWidth, int mod, long freqUp) { _options.AddDXSingal(siteCode, adcCode, chNum, freqAd, bandWidth, mod, freqUp); } public virtual AdcOptions Build() { _options.ChCount = _options.Channels.Max(m => m.ChNum); foreach (var ch in _options.Channels) { if (ch.Signals.Count == 0) continue; CalcChannelCenter(ch); } if (ValidAdcSignals(out string errMsg) == false) { throw new Exception(errMsg); } return _options; } protected virtual void CalcChannelCenter(AdcChOptions ch) { if (ch.Signals.Count == 0 || ch.CenterFreq > 0) return; if (ch.Signals.Count == 1) { ch.CenterFreq = ch.Signals[0].FreqPoint; } else { var sigDetails = ch.Signals.Select(m => new { m.FreqPoint, m.BandWidth, startFreq = m.FreqPoint - m.BandWidth / 2, endFreq = m.FreqPoint + m.BandWidth / 2 }); var minFreq = sigDetails.Min(m => m.startFreq); var maxFreq = sigDetails.Max(m => m.endFreq); ch.CenterFreq = (minFreq + maxFreq) / 2; } } protected virtual bool ValidAdcSignals(out string errMsg) { var maxBandWidth = (long)(_options.ClockFreq / _options.Mutil); bool isValid = true; StringBuilder sb = new StringBuilder(); foreach (var ch in _options.Channels) { if (ch.Signals.Count < 2) continue; var minFreq = ch.CenterFreq - maxBandWidth / 2; var maxFreq = ch.CenterFreq + maxBandWidth / 2; foreach (var sig in ch.Signals) { if (sig.FreqPoint - sig.BandWidth / 2 < minFreq || sig.FreqPoint + sig.BandWidth / 2 > maxFreq) { sb.AppendLine($"频点:{sig.FreqPoint},带宽:{sig.BandWidth}不在通道{ch.ChNum}的采集范围内!"); isValid = false; } } } errMsg = sb.ToString(); return isValid; } } }