AdcOptionsBuilder.cs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace Ips.Library.Entity
  7. {
  8. public class AdcOptionsBuilder
  9. {
  10. public AdcOptionsBuilder()
  11. {
  12. _options = new AdcOptions();
  13. }
  14. protected AdcOptions _options;
  15. public virtual void SetStart(DateTime startTime, int timeLen)
  16. {
  17. _options.StartTime = startTime;
  18. _options.TimeLen = timeLen;
  19. }
  20. public virtual void SetCard(AdCardType cardType, AdClockType clockType, AdTriggerMode triggerMode, int ddcFreq, long clockFreq, int mutil, string storePath)
  21. {
  22. _options.CardType = cardType;
  23. _options.ClockType = clockType;
  24. _options.TriggerMode = triggerMode;
  25. _options.DdcFreq = ddcFreq;
  26. _options.ClockFreq = clockFreq;
  27. _options.Mutil = mutil;
  28. _options.StorePath = storePath;
  29. }
  30. public virtual void SetChannel(string siteCode, string adcCode, int chNum, long centerFreq)
  31. {
  32. _options.SetChannel(siteCode, adcCode, chNum, centerFreq);
  33. }
  34. public virtual void AddSignal(string siteCode, string adcCode, int chNum, long freqAd, int bandWidth, string satNum, long freqUp)
  35. {
  36. _options.AddSingal(siteCode, adcCode, chNum, freqAd, bandWidth, satNum, freqUp);
  37. }
  38. public virtual void AddDXSignal(string siteCode, string adcCode, int chNum, long freqAd, int bandWidth, int mod, long freqUp)
  39. {
  40. _options.AddDXSingal(siteCode, adcCode, chNum, freqAd, bandWidth, mod, freqUp);
  41. }
  42. public virtual AdcOptions Build()
  43. {
  44. _options.ChCount = _options.Channels.Max(m => m.ChNum);
  45. foreach (var ch in _options.Channels)
  46. {
  47. if (ch.Signals.Count == 0) continue;
  48. CalcChannelCenter(ch);
  49. }
  50. if (ValidAdcSignals(out string errMsg) == false)
  51. {
  52. throw new Exception(errMsg);
  53. }
  54. return _options;
  55. }
  56. protected virtual void CalcChannelCenter(AdcChOptions ch)
  57. {
  58. if (ch.Signals.Count == 0 || ch.CenterFreq > 0) return;
  59. if (ch.Signals.Count == 1)
  60. {
  61. ch.CenterFreq = ch.Signals[0].FreqPoint;
  62. }
  63. else
  64. {
  65. var sigDetails = ch.Signals.Select(m => new { m.FreqPoint, m.BandWidth, startFreq = m.FreqPoint - m.BandWidth / 2, endFreq = m.FreqPoint + m.BandWidth / 2 });
  66. var minFreq = sigDetails.Min(m => m.startFreq);
  67. var maxFreq = sigDetails.Max(m => m.endFreq);
  68. ch.CenterFreq = (minFreq + maxFreq) / 2;
  69. }
  70. }
  71. protected virtual bool ValidAdcSignals(out string errMsg)
  72. {
  73. var maxBandWidth = (long)(_options.ClockFreq / _options.Mutil);
  74. bool isValid = true;
  75. StringBuilder sb = new StringBuilder();
  76. foreach (var ch in _options.Channels)
  77. {
  78. if (ch.Signals.Count < 2) continue;
  79. var minFreq = ch.CenterFreq - maxBandWidth / 2;
  80. var maxFreq = ch.CenterFreq + maxBandWidth / 2;
  81. foreach (var sig in ch.Signals)
  82. {
  83. if (sig.FreqPoint - sig.BandWidth / 2 < minFreq || sig.FreqPoint + sig.BandWidth / 2 > maxFreq)
  84. {
  85. sb.AppendLine($"频点:{sig.FreqPoint},带宽:{sig.BandWidth}不在通道{ch.ChNum}的采集范围内!");
  86. isValid = false;
  87. }
  88. }
  89. }
  90. errMsg = sb.ToString();
  91. return isValid;
  92. }
  93. }
  94. }