Ejemplo n.º 1
0
 /// <summary>Call this function from the traction manager to attempt to reset a Vigilante intervention</summary>
 internal void VigilanteReset()
 {
     if (Train.CurrentSpeed == 0 && VigilanteState == VigilanteStates.EbApplied)
     {
         if (SCMT.tpwswarningsound != -1)
         {
             SoundManager.Stop(SCMT.tpwswarningsound);
         }
         Train.TractionManager.ResetBrakeApplication();
         SCMT.spiarossi_act = false;
         VigilanteState     = VigilanteStates.None;
     }
 }
Ejemplo n.º 2
0
        /// <summary>Is called every frame.</summary>
        /// <param name="data">The data.</param>
        /// <param name="blocking">Whether the device is blocked or will block subsequent devices.</param>
        internal override void Elapse(ElapseData data, ref bool blocking)
        {
            OverspeedDevice.Update(data.ElapsedTime.Milliseconds);
            {
                //Deadman's Handle
                if (deadmanshandle != 0)
                {
                    //Initialise and set the start state
                    if (Train.StartupSelfTestManager != null &&
                        Train.StartupSelfTestManager.SequenceState != StartupSelfTestManager.SequenceStates.Initialised)
                    {
                        //Startup self-test has not been performed, no systems active
                        DeadmansHandleState = DeadmanStates.None;
                    }
                    else if (Train.ElectricEngine != null && Train.ElectricEngine.FrontPantograph.State != PantographStates.OnService &&
                             Train.ElectricEngine.RearPantograph.State != PantographStates.OnService && Train.CurrentSpeed == 0)
                    {
                        //Stationary with no available pantographs
                        DeadmansHandleState = DeadmanStates.None;
                    }
                    else if (vigilanceinactivespeed == -2 && Train.Handles.Reverser == 0)
                    {
                        //Set to no action if inactive speed is -2 & in neutral
                        DeadmansHandleState = DeadmanStates.None;
                    }
                    else if (vigilanceinactivespeed == -2 && Train.Handles.Reverser != 0)
                    {
                        //Otherwise set to the timer state
                        DeadmansHandleState = DeadmanStates.OnTimer;
                    }
                    else if (vigilanceinactivespeed == -1)
                    {
                        //If inactive speed is -1 always set to the timer state
                        DeadmansHandleState = DeadmanStates.OnTimer;
                    }
                    else if (Train.CurrentSpeed < vigilanceinactivespeed && DeadmansHandleState == DeadmanStates.OnTimer)
                    {
                        //If train speed is than the inactive speed and we're in the timer mode
                        //Set to no action
                        DeadmansHandleState = DeadmanStates.None;
                    }
                    else if (Train.CurrentSpeed > vigilanceinactivespeed && DeadmansHandleState == DeadmanStates.None)
                    {
                        //Set to the timer state
                        DeadmansHandleState = DeadmanStates.OnTimer;
                    }

                    //Calculate vigilance time from the array
                    int vigilancelength = vigilancearray.Length;
                    if (Train.Handles.PowerNotch == 0)
                    {
                        vigilancetime = vigilancearray[0];
                    }
                    else if (Train.Handles.PowerNotch <= vigilancelength)
                    {
                        vigilancetime = vigilancearray[(Train.Handles.PowerNotch - 1)];
                    }
                    else
                    {
                        vigilancetime = vigilancearray[(vigilancelength - 1)];
                    }



                    if (DeadmansHandleState == DeadmanStates.OnTimer)
                    {
                        //Reset other timers
                        deadmansalarmtimer = 0.0;
                        deadmansbraketimer = 0.0;
                        //Elapse Timer
                        this.deadmanstimer += data.ElapsedTime.Milliseconds;
                        if (this.deadmanstimer > vigilancetime)
                        {
                            DeadmansHandleState = DeadmanStates.TimerExpired;
                        }
                    }
                    else if (DeadmansHandleState == DeadmanStates.TimerExpired)
                    {
                        //Start the next timer
                        deadmansalarmtimer += data.ElapsedTime.Milliseconds;
                        if (deadmansalarmtimer > vigilancedelay1)
                        {
                            DeadmansHandleState = DeadmanStates.OnAlarm;
                        }
                    }
                    else if (DeadmansHandleState == DeadmanStates.OnAlarm)
                    {
                        //Trigger the alarm sound and move on
                        if (vigilancealarm != -1)
                        {
                            SoundManager.Play(vigilancealarm, 1.0, 1.0, true);
                        }
                        DeadmansHandleState = DeadmanStates.AlarmTimer;
                    }
                    else if (DeadmansHandleState == DeadmanStates.AlarmTimer)
                    {
                        //Start the next timer
                        deadmansbraketimer += data.ElapsedTime.Milliseconds;
                        if (deadmansbraketimer > vigilancedelay2)
                        {
                            DeadmansHandleState = DeadmanStates.BrakesApplied;
                        }
                    }
                    else if (DeadmansHandleState == DeadmanStates.BrakesApplied)
                    {
                        //Demand brake application
                        Train.TractionManager.DemandBrakeApplication(this.Train.Specs.BrakeNotches + 1, "Brake application demanded by the deadman's handle");
                        //If we auto-release on coming to a full-stop
                        if (AutoRelease == true && Train.CurrentSpeed == 0)
                        {
                            Train.TractionManager.ResetBrakeApplication();
                            deadmansalarmtimer  = 0.0;
                            deadmansbraketimer  = 0.0;
                            deadmanstimer       = 0.0;
                            DeadmansHandleState = DeadmanStates.OnTimer;
                        }
                    }
                }
            }
            if (Train.SCMT != null)
            {
                if (vigilanteEnabled == true && SCMT.testscmt == 4)
                {
                    if (Train.CurrentSpeed > 2 && VigilanteState == VigilanteStates.None)
                    {
                        VigilanteState = VigilanteStates.AlarmSounding;
                    }
                    else if (VigilanteState == VigilanteStates.AlarmSounding)
                    {
                        if (vigilancealarm != -1)
                        {
                            SoundManager.Play(vigilancealarm, 1.0, 1.0, true);
                        }
                        if (Train.CurrentSpeed != 0)
                        {
                            vigilanteTimer += data.ElapsedTime.Milliseconds;
                            if (vigilanteTimer > vigilancedelay1)
                            {
                                VigilanteState = VigilanteStates.EbApplied;
                            }
                        }
                    }
                    else if (VigilanteState == VigilanteStates.EbApplied)
                    {
                        vigilanteTimer = 0.0;
                        Train.TractionManager.DemandBrakeApplication(this.Train.Specs.BrakeNotches + 1, "Brake application demanded by the SCMT vigilante");
                        if (vigilancealarm != -1)
                        {
                            SoundManager.Stop(vigilancealarm);
                        }
                        if (SCMT.tpwswarningsound != -1)
                        {
                            SoundManager.Play(SCMT.tpwswarningsound, 1.0, 1.0, true);
                        }
                    }
                    else if (VigilanteState == VigilanteStates.OnService)
                    {
                        vigilanteTimer = 0.0;
                        if (Train.CurrentSpeed == 0)
                        {
                            VigilanteState = VigilanteStates.None;
                        }
                    }
                }
            }

            {
                //Set Panel Variables
                if (DRAIndicator != -1)
                {
                    if (Train.drastate == true)
                    {
                        this.Train.Panel[(DRAIndicator)] = 1;
                    }
                    else
                    {
                        this.Train.Panel[(DRAIndicator)] = 0;
                    }
                }

                if (vigilancelamp != -1)
                {
                    if (DeadmansHandleState == DeadmanStates.None || DeadmansHandleState == DeadmanStates.OnTimer)
                    {
                        this.Train.Panel[(vigilancelamp)] = 0;
                    }
                    else
                    {
                        this.Train.Panel[(vigilancelamp)] = 1;
                    }
                    if (vigilanteEnabled == true)
                    {
                        if (VigilanteState == VigilanteStates.AlarmSounding || VigilanteState == VigilanteStates.EbApplied)
                        {
                            this.Train.Panel[(vigilancelamp)] = 1;
                        }
                        else
                        {
                            this.Train.Panel[(vigilancelamp)] = 0;
                        }
                    }
                }
            }
        }