/// <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; } }
/// <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; } } } } }