123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- 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;
- }
- }
- }
|