using shjxCamera; namespace SHJX.Service.Control.Execute.TitrationController { public class ColorDataJudge { private static readonly ILogger logger = LogFactory.BuildLogger(typeof(ColorDataJudge)); #region Field private int _maxRange; internal int Count; private int currpt; private readonly int _signalTimeLen; private readonly ColorDataGraber _graber; private static List _currSignals; #endregion public ColorDataJudge(ColorDataGraber graber) { Count = 0; currpt = 0; _signalTimeLen = 10; _graber = graber; _currSignals = new(); // 信号队列 _graber.UpdateRoiPos(false); } public ColorDataJudge SetMaxRange(int maxRange) { _maxRange = maxRange; return this; } #region Public Method /// /// 颜色采集并判断 /// /// /// public TitrationEnum ColorCollectCalculate(ref double subB) { Count += 1; if (Count.Equals(_currSignals.Count - 7)) { _currSignals[^1] = _graber.GrabSignal(_signalTimeLen); } else { _currSignals.Add(_graber.GrabSignal(_signalTimeLen)); } if (_currSignals.Count < 7) { return TitrationEnum.Continue; } currpt = _currSignals.Count - 7; var currpt6 = Math.Round(_currSignals[currpt + 6].GetBSV(), 1, MidpointRounding.AwayFromZero); var currpt0 = Math.Round(_currSignals[currpt + 0].GetBSV(), 1, MidpointRounding.AwayFromZero); var currpt1 = Math.Round(_currSignals[currpt + 1].GetBSV(), 1, MidpointRounding.AwayFromZero); logger.LogDebug($"6:{currpt6},0:{currpt0},1:{currpt1}"); if (currpt6 <= 0) { return TitrationEnum.Continue; } subB = (currpt6 - (currpt0 + currpt1) / 2) * 100 / currpt6; return TitrationEnum.Normal; } /// /// 到达终点 /// /// public void ArriveTitrationEndPoint(ref double subB) { try { _currSignals[currpt + 6] = _graber.GrabSignal(_signalTimeLen); subB = (_currSignals[currpt + 6].GetBSV() - (_currSignals[currpt + 0].GetBSV() + _currSignals[currpt + 1].GetBSV()) / 2) * 100 / _currSignals[currpt + 6].GetBSV(); logger.LogDebug($"观察是否褪色,观察阈值为{subB}"); } catch (Exception ex) { logger.LogError(ex.ToString()); } } /// /// 检查是否到达阈值范围 /// public TitrationEnum CheckRangeArrive() { if (_currSignals[^1].GetBSV() >= 230 && _graber.CurrExposure < 0) { _currSignals.Clear(); InitColorList(); return TitrationEnum.Normal; } else { return TitrationEnum.End; } } #endregion #region Private Method /// /// 初始化队列 /// /// internal void InitColorList() { try { _graber.PresetLightParam(_maxRange); //调节曝光参数 Thread.Sleep(2000); logger.LogDebug("开始进行背景信号采集……"); for (int i = 0; i < 7; i++) { _currSignals.Add(_graber.GrabSignal(500)); //采集7段信号作为背景 logger.LogDebug($"第{i + 1}段信号采集"); } } catch (Exception ex) { logger.LogError(ex.ToString()); } } #endregion } }