ColorDataJudge.cs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. using shjxCamera;
  2. namespace SHJX.Service.Control.Execute.TitrationController
  3. {
  4. public class ColorDataJudge
  5. {
  6. private static readonly ILogger logger = LogFactory.BuildLogger(typeof(ColorDataJudge));
  7. #region Field
  8. private int _maxRange;
  9. internal int Count;
  10. private int currpt;
  11. private readonly int _signalTimeLen;
  12. private readonly ColorDataGraber _graber;
  13. private static List<ColorDataPoint> _currSignals;
  14. #endregion
  15. public ColorDataJudge(ColorDataGraber graber)
  16. {
  17. Count = 0;
  18. currpt = 0;
  19. _signalTimeLen = 10;
  20. _graber = graber;
  21. _currSignals = new(); // 信号队列
  22. _graber.UpdateRoiPos(false);
  23. }
  24. public ColorDataJudge SetMaxRange(int maxRange)
  25. {
  26. _maxRange = maxRange;
  27. return this;
  28. }
  29. #region Public Method
  30. /// <summary>
  31. /// 颜色采集并判断
  32. /// </summary>
  33. /// <param name="subB"></param>
  34. /// <returns></returns>
  35. public TitrationEnum ColorCollectCalculate(ref double subB)
  36. {
  37. Count += 1;
  38. if (Count.Equals(_currSignals.Count - 7))
  39. {
  40. _currSignals[^1] = _graber.GrabSignal(_signalTimeLen);
  41. }
  42. else
  43. {
  44. _currSignals.Add(_graber.GrabSignal(_signalTimeLen));
  45. }
  46. if (_currSignals.Count < 7)
  47. {
  48. return TitrationEnum.Continue;
  49. }
  50. currpt = _currSignals.Count - 7;
  51. var currpt6 = Math.Round(_currSignals[currpt + 6].GetBSV(), 1, MidpointRounding.AwayFromZero);
  52. var currpt0 = Math.Round(_currSignals[currpt + 0].GetBSV(), 1, MidpointRounding.AwayFromZero);
  53. var currpt1 = Math.Round(_currSignals[currpt + 1].GetBSV(), 1, MidpointRounding.AwayFromZero);
  54. logger.LogDebug($"6:{currpt6},0:{currpt0},1:{currpt1}");
  55. if (currpt6 <= 0)
  56. {
  57. return TitrationEnum.Continue;
  58. }
  59. subB = (currpt6 - (currpt0 + currpt1) / 2) * 100 / currpt6;
  60. return TitrationEnum.Normal;
  61. }
  62. /// <summary>
  63. /// 到达终点
  64. /// </summary>
  65. /// <param name="subB"></param>
  66. public void ArriveTitrationEndPoint(ref double subB)
  67. {
  68. try
  69. {
  70. _currSignals[currpt + 6] = _graber.GrabSignal(_signalTimeLen);
  71. subB = (_currSignals[currpt + 6].GetBSV() - (_currSignals[currpt + 0].GetBSV() + _currSignals[currpt + 1].GetBSV()) / 2) * 100 / _currSignals[currpt + 6].GetBSV();
  72. logger.LogDebug($"观察是否褪色,观察阈值为{subB}");
  73. }
  74. catch (Exception ex)
  75. {
  76. logger.LogError(ex.ToString());
  77. }
  78. }
  79. /// <summary>
  80. /// 检查是否到达阈值范围
  81. /// </summary>
  82. public TitrationEnum CheckRangeArrive()
  83. {
  84. if (_currSignals[^1].GetBSV() >= 230 && _graber.CurrExposure < 0)
  85. {
  86. _currSignals.Clear();
  87. InitColorList();
  88. return TitrationEnum.Normal;
  89. }
  90. else
  91. {
  92. return TitrationEnum.End;
  93. }
  94. }
  95. #endregion
  96. #region Private Method
  97. /// <summary>
  98. /// 初始化队列
  99. /// </summary>
  100. /// <param name="Graber"></param>
  101. internal void InitColorList()
  102. {
  103. try
  104. {
  105. _graber.PresetLightParam(_maxRange); //调节曝光参数
  106. Thread.Sleep(2000);
  107. logger.LogDebug("开始进行背景信号采集……");
  108. for (int i = 0; i < 7; i++)
  109. {
  110. _currSignals.Add(_graber.GrabSignal(500)); //采集7段信号作为背景
  111. logger.LogDebug($"第{i + 1}段信号采集");
  112. }
  113. }
  114. catch (Exception ex)
  115. {
  116. logger.LogError(ex.ToString());
  117. }
  118. }
  119. #endregion
  120. }
  121. }