Ejemplo n.º 1
0
        public override void InitializeMoving()
        {
            RSState               = RSStateType.Off;
            RSEmergencyBraking    = false;
            VACMAEmergencyBraking = false;

            if (CurrentPostSpeedLimitMpS() > MpS.FromKpH(221f))
            {
                TVMArmed = true;
                UpdateTVMAspect(NextSignalAspect(0), false);
            }
        }
Ejemplo n.º 2
0
        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;
            }
        }