Пример #1
0
        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
        }
Пример #2
0
        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;
                    }
                }
            }
        }