private void errorInData() { //v-log data bevat fout if (_periodResult != null) { //resultaten beschikbaar: deze nog opslaan PeriodResultTellen pr = new PeriodResultTellen(); pr.DataComplete = false; pr.PeriodStart = _startPeriod; pr.PeriodLength = _endPeriod - _startPeriod; pr.Result = _periodResult; pr.DetError = _periodDetError; periodResults.Add(pr); //volgende periode mag pas gestart worden na deze getelde periode _nextPeriodMinimalDT = _endPeriod; _waitUntilNextPeriodMinimalDT = true; _periodResult = null; _periodDetError = null; } dtGetHigh = null; //resetten status info }
bool[] _periodDetError = null; //fout in periode per individuele detector private void analyse() { //wordt uitgevoerd indien er geldige V-Log informatie aanwezig is in stateNew, na latere aanroepen bevat stateCurrent ook informatie //telt per interval periode het aantal afgevallen detectoren dat langer dan de ingesteld duur hoog is if (dtGetHigh == null) { //1e run geldige v-log data aantalDet = stateNew.Detectors.Length; dtGetHigh = new DateTime[aantalDet]; _firstDtInData = stateNew.Time; //initieel de al hoge detectoren opnemen zodat het voertuig bij de afgaande flank geteld wordt. for (int i = 0; i < aantalDet; i++) { if (stateNew.Detectors[i] == 1) { dtGetHigh[i] = stateNew.Time; } } if (_periodResult == null && allowedToStartPeriodResult()) { //nog geen resultaten beschikbaar _waitUntilNextPeriodMinimalDT = false; //aanmaken eerste perioderesultaat _periodResult = new int[aantalDet]; _periodDetError = new bool[aantalDet]; _startPeriod = startMomentPeriod(stateNew.Time); _endPeriod = _startPeriod.Add(intervalMin); _dataFromStartPeriod = (stateNew.Time == _startPeriod); //bepalen of vanaf begin van periode data aanwezig is } } else { //latere runs if (_periodResult == null) { if (allowedToStartPeriodResult()) { //nieuwe periode aangebroken waarin geteld mag worden _waitUntilNextPeriodMinimalDT = false; //aanmaken eerste perioderesultaat _periodResult = new int[aantalDet]; _periodDetError = new bool[aantalDet]; _startPeriod = startMomentPeriod(stateNew.Time); _endPeriod = _startPeriod.Add(intervalMin); _dataFromStartPeriod = (_firstDtInData <= _startPeriod); //bepalen of vanaf begin van periode data aanwezig is } } else { if (stateNew.Time >= _startPeriod && stateNew.Time < _endPeriod) { //huidige perioderesultaat gebruiken } else if (stateNew.Time >= _endPeriod) { //nieuwe perioderesultaat aangebroken //oude resultaat opslaan PeriodResultTellen pr = new PeriodResultTellen(); pr.DataComplete = _dataFromStartPeriod; pr.PeriodStart = _startPeriod; pr.PeriodLength = _endPeriod - _startPeriod; pr.Result = _periodResult; pr.DetError = _periodDetError; periodResults.Add(pr); //nieuwe periode aanmaken _periodResult = new int[aantalDet]; _periodDetError = new bool[aantalDet]; _startPeriod = startMomentPeriod(stateNew.Time); _endPeriod = _startPeriod.Add(intervalMin); _dataFromStartPeriod = true; //hier wordt niet gecontroleerd of de periode aansluitend aan de voorgaande ligt, maar wel vanuit gegaan. Bij de controle van V-Log data wordt namelijk al gecontroleerd op data gaten en dus mogen we ervanuit gaan dat het aaneengesloten data is. } else if (stateNew.Time < _startPeriod) { //nieuwe tijd in een eerdere periode: dit wordt niet ondersteund en situatie wordt eerder afgevangen door controle van V-Log data //deze conditie zou dus niet mogen voorkomen throw new Exception("Nieuwe tijd eerder dan oude tijd: wordt niet ondersteund"); } } //het daadwerkelijke tellen for (int i = 0; i < aantalDet; i++) { bool detUp = (stateCurrent.Detectors[i] == 0 && stateNew.Detectors[i] == 1); bool detDown = (stateCurrent.Detectors[i] == 1 && stateNew.Detectors[i] == 0); bool error = stateNew.Detectors[i] > 1; if (detUp) { dtGetHigh[i] = stateNew.Time; } if (detDown) { if (dtGetHigh[i].Ticks > 0 && _periodResult != null) { TimeSpan duration = stateNew.Time - dtGetHigh[i]; if (duration.TotalMilliseconds >= settings.DetFilterMs) { //tellen _periodResult[i]++; } } } if (error && _periodDetError != null) { _periodDetError[i] = true; } } } }