public override void InitializeMoving() { RSState = RSStateType.Off; RSEmergencyBraking = false; VACMAEmergencyBraking = false; if (CurrentPostSpeedLimitMpS() > MpS.FromKpH(221f)) { TVMArmed = true; UpdateTVMAspect(NextSignalAspect(0), false); } }
protected void UpdateRS() { if (RSPresent && IsSpeedControlEnabled()) { // If train is about to cross a normal signal, get its information. float nextNormalSignalDistance = NextSignalDistanceM(0); Aspect nextNormalSignalAspect = Aspect.None; if (nextNormalSignalDistance <= 5f) { nextNormalSignalAspect = NextSignalAspect(0); } // If train is about to cross a distant signal, get its information. float nextDistantSignalDistance = NextDistanceSignalDistanceM(); Aspect nextDistantSignalAspect = Aspect.None; if (nextDistantSignalDistance <= 5f) { nextDistantSignalAspect = NextDistanceSignalAspect(); // Hack for Swiss signals : only approach and clear aspects are allowed on distant signals if (nextDistantSignalAspect > Aspect.Approach_1) { nextDistantSignalAspect = Aspect.Approach_1; } } if (nextNormalSignalAspect != Aspect.None || nextDistantSignalAspect != Aspect.None) { RSLastSignalAspect = Max(nextNormalSignalAspect, nextDistantSignalAspect); } RSClosedSignal = RSOpenedSignal = false; if ((NormalSignalPassed || DistantSignalPassed) && !RSType1Inhibition && !TVMArmed && SpeedMpS() > 0.1f) { if (RSLastSignalAspect == Aspect.Stop || RSLastSignalAspect == Aspect.StopAndProceed || RSLastSignalAspect == Aspect.Restricted || RSLastSignalAspect == Aspect.Approach_1 || RSLastSignalAspect == Aspect.Approach_2 || RSLastSignalAspect == Aspect.Approach_3 ) { RSClosedSignal = true; } else { RSOpenedSignal = true; } } if ((RSClosedSignal && !RSType2Inhibition) || (TVMClosedSignal && !RSType3Inhibition)) { if (RSPressed) { RSState = RSStateType.TriggeredBlinking; } else { RSEmergencyTimer.Start(); RSState = RSStateType.TriggeredSounding; } } if (RSOpenedSignal || TVMOpenedSignal || RSCancelPressed) { RSEmergencyTimer.Stop(); RSState = RSStateType.Off; } switch (RSState) { case RSStateType.Off: if (RSBlinker.Started) { RSBlinker.Stop(); } SetCabDisplayControl(LS_SF, 0); break; case RSStateType.TriggeredSounding: if (!RSBlinker.Started) { RSBlinker.Start(); } SetCabDisplayControl(LS_SF, RSBlinker.On ? 1 : 0); if (!RSPressed && RSPreviousPressed) { RSEmergencyTimer.Stop(); RSState = RSStateType.TriggeredBlinking; } break; case RSStateType.TriggeredBlinking: if (!RSBlinker.Started) { RSBlinker.Start(); } SetCabDisplayControl(LS_SF, RSBlinker.On ? 1 : 0); break; } if (RSEmergencyTimer.Triggered) { RSEmergencyBraking = true; } else if (RearmingButton) { RSEmergencyBraking = false; } if (RSClosedSignal && !RSPreviousClosedSignal && !RSType1Inhibition) { TriggerSoundPenalty1(); } if (RSOpenedSignal && !RSPreviousOpenedSignal && !RSType1Inhibition) { TriggerSoundPenalty2(); TriggerSoundInfo1(); } RSPreviousClosedSignal = RSClosedSignal; RSPreviousOpenedSignal = RSOpenedSignal; if (TVM300Present) { if (TVMClosedSignal && !TVMPreviousClosedSignal) { TriggerSoundPenalty1(); } if (TVMOpenedSignal && !TVMPreviousOpenedSignal) { TriggerSoundPenalty2(); TriggerSoundInfo1(); } TVMPreviousClosedSignal = TVMClosedSignal; TVMPreviousOpenedSignal = TVMOpenedSignal; } if ((!RSPressed && RSPreviousPressed) || RSCancelPressed) { TriggerSoundPenalty2(); } RSPreviousPressed = RSPressed; } }