/// <summary>
 /// Reset the monitor
 /// </summary>
 public void Reset()
 {
     this.WaitTimer.Stop();
     this.WaitTimer.Reset();
     this.Queuing          = QueuingState.Normal;
     this.StoppedTimestamp = 0.0;
     this.TimeStopped      = 0.0;
     this.StartedTimer     = false;
     this.QueuingTime      = this.DefaultQueueingTime;
 }
        /// <summary>
        /// Updates the monitor with a new state of the vehicle
        /// </summary>
        /// <param name="StateMonitor"></param>
        public void Update(QueueingUpdate update, double ts)
        {
            if (update == QueueingUpdate.NotQueueing)
            {
                if (this.Queuing == QueuingState.Failed && this.NotQueuingTimer.ElapsedMilliseconds / 1000.0 > 7.0)
                {
                    this.QueuingTime = Math.Min(this.QueuingTime + 10.0, this.MaximumQueuingTime);
                }
                else if (this.TimeStopped > (3.0 / 4.0) * this.QueuingTime)
                {
                    this.QueuingTime = Math.Min(this.QueuingTime + 5.0, this.MaximumQueuingTime);
                }

                if (!this.NotQueuingTimer.IsRunning)
                {
                    this.NotQueuingTimer.Start();
                }
                else if (this.NotQueuingTimer.ElapsedMilliseconds / 1000.0 > QueuingTime)
                {
                    this.QueuingTime = Math.Max(this.QueuingTime, Math.Min(this.NotQueuingTimer.ElapsedMilliseconds / 1000.0, this.MaximumQueuingTime / 2.0));
                }

                this.Reset();
            }
            else
            {
                if (this.NotQueuingTimer.IsRunning)
                {
                    this.NotQueuingTimer.Stop();
                }

                if (!this.StartedTimer)
                {
                    this.StartedTimer     = true;
                    this.StoppedTimestamp = ts;
                }

                if (Queuing == QueuingState.Normal)
                {
                    TimeStopped = ts - StoppedTimestamp;

                    if (TimeStopped > QueuingTime)
                    {
                        Queuing = QueuingState.Failed;
                    }
                }
                else
                {
                    TimeStopped = ts - StoppedTimestamp;
                }
            }
        }
        /// <summary>
        /// Updates the monitor with a new state of the vehicle
        /// </summary>
        /// <param name="StateMonitor"></param>
        public void Update(QueueingUpdate update, double ts)
        {
            if (update == QueueingUpdate.NotQueueing)
            {
                if (this.Queuing == QueuingState.Failed && this.NotQueuingTimer.ElapsedMilliseconds / 1000.0 > 7.0)
                    this.QueuingTime = Math.Min(this.QueuingTime + 10.0, this.MaximumQueuingTime);
                else if(this.TimeStopped > (3.0/4.0) * this.QueuingTime)
                    this.QueuingTime = Math.Min(this.QueuingTime + 5.0, this.MaximumQueuingTime);

                if (!this.NotQueuingTimer.IsRunning)
                    this.NotQueuingTimer.Start();
                else if (this.NotQueuingTimer.ElapsedMilliseconds / 1000.0 > QueuingTime)
                    this.QueuingTime = Math.Max(this.QueuingTime, Math.Min(this.NotQueuingTimer.ElapsedMilliseconds / 1000.0, this.MaximumQueuingTime / 2.0));

                this.Reset();
            }
            else
            {
                if (this.NotQueuingTimer.IsRunning)
                this.NotQueuingTimer.Stop();

                if (!this.StartedTimer)
                {
                    this.StartedTimer = true;
                    this.StoppedTimestamp = ts;
                }

                if (Queuing == QueuingState.Normal)
                {
                    TimeStopped = ts - StoppedTimestamp;

                    if (TimeStopped > QueuingTime)
                        Queuing = QueuingState.Failed;
                }
                else
                {
                    TimeStopped = ts - StoppedTimestamp;
                }
            }
        }
 /// <summary>
 /// Reset the monitor
 /// </summary>
 public void Reset()
 {
     this.WaitTimer.Stop();
     this.WaitTimer.Reset();
     this.Queuing = QueuingState.Normal;
     this.StoppedTimestamp = 0.0;
     this.TimeStopped = 0.0;
     this.StartedTimer = false;
     this.QueuingTime = this.DefaultQueueingTime;
 }