Example #1
0
        internal override void Update(double TimeElapsed, double currentSpeed, TrainManager.AbstractHandle brakeHandle, out double deceleration)
        {
            airSound = null;
            double targetPressure;

            if (emergencyHandle.Actual == true)
            {
                if (brakeType == BrakeType.Main)
                {
                    double r = equalizingReservoir.EmergencyRate;
                    double d = equalizingReservoir.CurrentPressure;
                    double m = equalizingReservoir.NormalPressure;
                    r = GetRate(d / m, r * TimeElapsed);
                    if (r > equalizingReservoir.CurrentPressure)
                    {
                        r = equalizingReservoir.CurrentPressure;
                    }

                    equalizingReservoir.CurrentPressure -= r;
                }
                targetPressure = brakeCylinder.EmergencyMaximumPressure;
            }
            else
            {
                targetPressure  = (double)brakeHandle.Actual / (double)brakeHandle.MaximumNotch;
                targetPressure *= brakeCylinder.ServiceMaximumPressure;
            }

            if (!emergencyHandle.Actual & reverserHandle.Actual != 0)
            {
                // brake control system
                if (isMotorCar & Math.Abs(currentSpeed) > brakeControlSpeed)
                {
                    switch (electropneumaticBrakeType)
                    {
                    case EletropneumaticBrakeType.ClosingElectromagneticValve:
                        // closing electromagnetic valve (lock-out valve)
                        targetPressure = 0.0;
                        break;

                    case EletropneumaticBrakeType.DelayFillingControl:
                        // delay-filling control
                        double a  = motorDeceleration;
                        double pr = targetPressure / brakeCylinder.ServiceMaximumPressure;
                        double b;
                        b = pr * DecelerationAtServiceMaximumPressure(brakeHandle.Actual, currentSpeed);
                        double d = b - a;
                        if (d > 0.0)
                        {
                            targetPressure = d / DecelerationAtServiceMaximumPressure(brakeHandle.Actual, currentSpeed);
                            if (targetPressure > 1.0)
                            {
                                targetPressure = 1.0;
                            }
                            targetPressure *= brakeCylinder.ServiceMaximumPressure;
                        }
                        else
                        {
                            targetPressure = 0.0;
                        }

                        break;
                    }
                }
            }

            if (brakeCylinder.CurrentPressure > targetPressure + Tolerance | targetPressure == 0.0)
            {
                // brake cylinder exhaust valve
                double r = brakeCylinder.ReleaseRate;
                double d = brakeCylinder.CurrentPressure;
                double m = brakeCylinder.EmergencyMaximumPressure;
                r = GetRate(d / m, r * TimeElapsed);
                if (r > d)
                {
                    r = d;
                }
                // air sound
                if (r > 0.0 & brakeCylinder.CurrentPressure < brakeCylinder.SoundPlayedForPressure)
                {
                    brakeCylinder.SoundPlayedForPressure = targetPressure;
                    airSound = targetPressure <Tolerance?AirZero : brakeCylinder.CurrentPressure> m - Tolerance ? AirHigh : Air;
                }

                // pressure change
                brakeCylinder.CurrentPressure -= r;
            }
            else if ((brakeCylinder.CurrentPressure + Tolerance < targetPressure | targetPressure == brakeCylinder.EmergencyMaximumPressure) & brakeCylinder.CurrentPressure + Tolerance < mainReservoir.CurrentPressure)
            {
                // fill brake cylinder from main reservoir
                double r;
                if (emergencyHandle.Actual)
                {
                    r = 2.0 * brakeCylinder.EmergencyChargeRate;
                }
                else
                {
                    r = 2.0 * brakeCylinder.ServiceChargeRate;
                }

                double pm = targetPressure < mainReservoir.CurrentPressure ? targetPressure : mainReservoir.CurrentPressure;
                double d  = pm - brakeCylinder.CurrentPressure;
                double m  = brakeCylinder.EmergencyMaximumPressure;
                r = GetRate(d / m, r * TimeElapsed);
                if (r > d)
                {
                    r = d;
                }
                double f1 = auxiliaryReservoir.BrakeCylinderCoefficient;
                double f2 = mainReservoir.BrakePipeCoefficient;
                double f3 = auxiliaryReservoir.BrakePipeCoefficient;
                double f  = f1 * f2 / f3;                // MainReservoirBrakeCylinderCoefficient
                double s  = r * f;
                if (s > mainReservoir.CurrentPressure)
                {
                    r *= mainReservoir.CurrentPressure / s;
                    s  = mainReservoir.CurrentPressure;
                }

                brakeCylinder.CurrentPressure += 0.5 * r;
                mainReservoir.CurrentPressure -= 0.5 * s;
                // air sound
                brakeCylinder.SoundPlayedForPressure = brakeCylinder.EmergencyMaximumPressure;
            }
            else
            {
                // air sound
                brakeCylinder.SoundPlayedForPressure = brakeCylinder.EmergencyMaximumPressure;
            }
            double pp;

            if (emergencyHandle.Actual)
            {
                pp = brakeCylinder.EmergencyMaximumPressure;
            }
            else
            {
                pp  = (double)brakeHandle.Actual / (double)brakeHandle.MaximumNotch;
                pp *= brakeCylinder.ServiceMaximumPressure;
            }
            straightAirPipe.CurrentPressure = pp;
            double pressureratio = brakeCylinder.CurrentPressure / brakeCylinder.ServiceMaximumPressure;

            deceleration = pressureratio * DecelerationAtServiceMaximumPressure(brakeHandle.Actual, currentSpeed);
        }
        internal override void Update(double TimeElapsed, double currentSpeed, TrainManager.AbstractHandle brakeHandle, out double deceleration)
        {
            airSound = null;
            if (emergencyHandle.Actual == true)
            {
                if (brakeType == BrakeType.Main)
                {
                    double r = equalizingReservoir.EmergencyRate;
                    double d = equalizingReservoir.CurrentPressure;
                    double m = equalizingReservoir.NormalPressure;
                    r = GetRate(d / m, r * TimeElapsed);
                    if (r > equalizingReservoir.CurrentPressure)
                    {
                        r = equalizingReservoir.CurrentPressure;
                    }
                    equalizingReservoir.CurrentPressure -= r;
                }
            }
            //First update the main reservoir pressure
            {
                double r = equalizingReservoir.ChargeRate;
                double d = equalizingReservoir.NormalPressure - equalizingReservoir.CurrentPressure;
                double m = equalizingReservoir.NormalPressure;
                r = GetRate(d / m, r * TimeElapsed);
                if (r > d)
                {
                    r = d;
                }
                d = mainReservoir.CurrentPressure - equalizingReservoir.CurrentPressure;
                if (r > d)
                {
                    r = d;
                }
                double f = mainReservoir.EqualizingReservoirCoefficient;
                double s = r * f * TimeElapsed;
                if (s > mainReservoir.CurrentPressure)
                {
                    r *= mainReservoir.CurrentPressure / s;
                    s  = mainReservoir.CurrentPressure;
                }

                equalizingReservoir.CurrentPressure += 0.5 * r;
                mainReservoir.CurrentPressure       -= 0.5 * s;
            }
            //Fill the brake pipe from the main reservoir
            if (brakeType == BrakeType.Main)
            {
                if (brakePipe.CurrentPressure > equalizingReservoir.CurrentPressure + Tolerance)
                {
                    // brake pipe exhaust valve
                    double r = emergencyHandle.Actual ? brakePipe.EmergencyRate : brakePipe.ServiceRate;
                    double d = brakePipe.CurrentPressure - equalizingReservoir.CurrentPressure;
                    double m = equalizingReservoir.NormalPressure;
                    r = (0.5 + 1.5 * d / m) * r * TimeElapsed;
                    if (r > d)
                    {
                        r = d;
                    }
                    brakePipe.CurrentPressure -= r;
                }
                else if (brakePipe.CurrentPressure + Tolerance < equalizingReservoir.CurrentPressure)
                {
                    // fill brake pipe from main reservoir
                    double r = brakePipe.ChargeRate;
                    double d = equalizingReservoir.CurrentPressure - brakePipe.CurrentPressure;
                    double m = equalizingReservoir.NormalPressure;
                    r = (0.5 + 1.5 * d / m) * r * TimeElapsed;
                    if (r > d)
                    {
                        r = d;
                    }
                    d = brakePipe.NormalPressure - brakePipe.CurrentPressure;
                    if (r > d)
                    {
                        r = d;
                    }
                    double f = mainReservoir.BrakePipeCoefficient;
                    double s = r * f;
                    if (s > mainReservoir.CurrentPressure)
                    {
                        r *= mainReservoir.CurrentPressure / s;
                        s  = mainReservoir.CurrentPressure;
                    }
                    brakePipe.CurrentPressure     += 0.5 * r;
                    mainReservoir.CurrentPressure -= 0.5 * s;
                }
            }

            // refill auxillary reservoir from brake pipe
            if (brakePipe.CurrentPressure > auxiliaryReservoir.CurrentPressure + Tolerance)
            {
                double r = 2.0 * auxiliaryReservoir.ChargeRate;
                double d = brakePipe.CurrentPressure - auxiliaryReservoir.CurrentPressure;
                double m = auxiliaryReservoir.MaximumPressure;
                r = GetRate(d / m, r * TimeElapsed);
                if (r > brakePipe.CurrentPressure)
                {
                    r = brakePipe.CurrentPressure;
                }

                if (r > d)
                {
                    r = d;
                }
                d = auxiliaryReservoir.MaximumPressure - auxiliaryReservoir.CurrentPressure;
                if (r > d)
                {
                    r = d;
                }
                double f = auxiliaryReservoir.BrakePipeCoefficient;
                double s = r / f;
                if (s > brakePipe.CurrentPressure)
                {
                    r *= brakePipe.CurrentPressure / s;
                    s  = brakePipe.CurrentPressure;
                }

                if (s > d)
                {
                    r *= d / s;
                    s  = d;
                }

                auxiliaryReservoir.CurrentPressure += 0.5 * r;
                brakePipe.CurrentPressure          -= 0.5 * s;
            }

            // electric command
            bool emergency;

            if (brakePipe.CurrentPressure + Tolerance < auxiliaryReservoir.CurrentPressure)
            {
                emergency = true;
            }
            else
            {
                emergency = emergencyHandle.Actual;
            }

            double targetPressure;

            if (emergency)
            {
                //If EB is selected, then target pressure must be that required for EB
                targetPressure = brakeCylinder.EmergencyMaximumPressure;
            }
            else
            {
                //Otherwise [BVE2 / BVE4 train.dat format] work out target pressure as a proportion of the max notch:
                targetPressure  = (double)brakeHandle.Actual / (double)brakeHandle.MaximumNotch;
                targetPressure *= brakeCylinder.ServiceMaximumPressure;
            }

            if (isMotorCar & !emergencyHandle.Actual & reverserHandle.Actual != 0)
            {
                //If we meet the conditions for brake control system to activate
                if (Math.Abs(currentSpeed) > brakeControlSpeed)
                {
                    if (electropneumaticBrakeType == EletropneumaticBrakeType.ClosingElectromagneticValve)
                    {
                        //When above the brake control speed, pressure to the BC is nil & electric brakes are used
                        //Thus target pressure must be zero
                        targetPressure = 0.0;
                    }
                    else if (electropneumaticBrakeType == EletropneumaticBrakeType.DelayFillingControl)
                    {
                        //Motor is used to brake the train, until not enough deceleration, at which point the air brake is also used
                        double a  = motorDeceleration;
                        double pr = targetPressure / brakeCylinder.ServiceMaximumPressure;
                        double b  = pr * DecelerationAtServiceMaximumPressure(brakeHandle.Actual, currentSpeed);

                        double d = b - a;
                        if (d > 0.0)
                        {
                            //Deceleration provided by the motor is not enough, so increase the BC target pressure
                            targetPressure = d / DecelerationAtServiceMaximumPressure(brakeHandle.Actual, currentSpeed);
                            if (targetPressure > 1.0)
                            {
                                targetPressure = 1.0;
                            }
                            targetPressure *= brakeCylinder.ServiceMaximumPressure;
                        }
                        else
                        {
                            //Motor deceleration is enough, BC target pressure to zero
                            targetPressure = 0.0;
                        }
                    }
                }
            }

            if (brakeCylinder.CurrentPressure > targetPressure + Tolerance | targetPressure == 0.0)
            {
                //BC pressure is greater than the target pressure, so release pressure
                double r = brakeCylinder.ReleaseRate;
                double d = brakeCylinder.CurrentPressure - targetPressure;
                double m = brakeCylinder.EmergencyMaximumPressure;
                r = GetRate(d / m, r * TimeElapsed);
                if (r > brakeCylinder.CurrentPressure)
                {
                    r = brakeCylinder.CurrentPressure;
                }
                if (r > d)
                {
                    r = d;
                }
                // air sound
                if (r > 0.0 & brakeCylinder.CurrentPressure < brakeCylinder.SoundPlayedForPressure)
                {
                    brakeCylinder.SoundPlayedForPressure = targetPressure;
                    airSound = targetPressure <Tolerance?AirZero : brakeCylinder.CurrentPressure> m - Tolerance ? AirHigh : Air;
                }

                // pressure change
                brakeCylinder.CurrentPressure -= r;
            }
            else if (brakeCylinder.CurrentPressure + Tolerance < targetPressure)
            {
                //BC pressure is less than target pressure, so increase pressure
                double f = auxiliaryReservoir.BrakeCylinderCoefficient;
                double r;
                if (emergency)
                {
                    r = 2.0 * brakeCylinder.EmergencyChargeRate * f;
                }
                else
                {
                    r = 2.0 * brakeCylinder.ServiceChargeRate * f;
                }

                double d = auxiliaryReservoir.CurrentPressure - brakeCylinder.CurrentPressure;
                double m = brakeCylinder.EmergencyMaximumPressure;
                r = GetRate(d / m, r * TimeElapsed);
                if (r > auxiliaryReservoir.CurrentPressure)
                {
                    r = auxiliaryReservoir.CurrentPressure;
                }

                if (r > d)
                {
                    r = d;
                }
                double s = r / f;
                if (s > d)
                {
                    r *= d / s;
                    s  = d;
                }

                d = brakeCylinder.EmergencyMaximumPressure - brakeCylinder.CurrentPressure;
                if (s > d)
                {
                    r *= d / s;
                    s  = d;
                }

                auxiliaryReservoir.CurrentPressure -= 0.5 * r;
                brakeCylinder.CurrentPressure      += 0.5 * s;
                // air sound
                brakeCylinder.SoundPlayedForPressure = brakeCylinder.EmergencyMaximumPressure;
            }
            else
            {
                // air sound
                brakeCylinder.SoundPlayedForPressure = brakeCylinder.EmergencyMaximumPressure;
            }

            double p;

            if (emergencyHandle.Actual)
            {
                p = 0.0;
            }
            else
            {
                p  = (double)brakeHandle.Actual / (double)brakeHandle.MaximumNotch;
                p *= brakeCylinder.ServiceMaximumPressure;
            }

            if (p + Tolerance < straightAirPipe.CurrentPressure)
            {
                double r;
                if (emergencyHandle.Actual)
                {
                    r = straightAirPipe.EmergencyRate;
                }
                else
                {
                    r = straightAirPipe.ReleaseRate;
                }

                double d = straightAirPipe.CurrentPressure - p;
                double m = brakeCylinder.EmergencyMaximumPressure;
                r = GetRate(d / m, r * TimeElapsed);
                if (r > d)
                {
                    r = d;
                }
                straightAirPipe.CurrentPressure -= r;
            }
            else if (p > straightAirPipe.CurrentPressure + Tolerance)
            {
                double r = straightAirPipe.ServiceRate;
                double d = p - straightAirPipe.CurrentPressure;
                double m = brakeCylinder.EmergencyMaximumPressure;
                r = GetRate(d / m, r * TimeElapsed);
                if (r > d)
                {
                    r = d;
                }
                straightAirPipe.CurrentPressure += r;
            }

            double pressureratio = brakeCylinder.CurrentPressure / brakeCylinder.ServiceMaximumPressure;

            deceleration = pressureratio * DecelerationAtServiceMaximumPressure(brakeHandle.Actual, currentSpeed);
        }
Example #3
0
        internal override void Update(double TimeElapsed, double currentSpeed, TrainManager.AbstractHandle brakeHandle, out double deceleration)
        {
            airSound = null;
            if (emergencyHandle.Actual == true)
            {
                if (brakeType == BrakeType.Main)
                {
                    double r = equalizingReservoir.EmergencyRate;
                    double d = equalizingReservoir.CurrentPressure;
                    double m = equalizingReservoir.NormalPressure;
                    r = GetRate(d / m, r * TimeElapsed);
                    if (r > equalizingReservoir.CurrentPressure)
                    {
                        r = equalizingReservoir.CurrentPressure;
                    }
                    equalizingReservoir.CurrentPressure -= r;
                }
            }
            //First update the main reservoir pressure from the equalizing reservoir
            TrainManager.AirBrakeHandleState state = (TrainManager.AirBrakeHandleState)brakeHandle.Actual;
            switch (state)
            {
            case TrainManager.AirBrakeHandleState.Service:
            {
                double r = equalizingReservoir.ServiceRate;                         //50000
                double d = equalizingReservoir.CurrentPressure;
                double m = equalizingReservoir.NormalPressure;                      //1.05 * max service pressure from train.dat in pascals
                r = GetRate(d / m, r * TimeElapsed);
                if (r > equalizingReservoir.CurrentPressure)
                {
                    r = equalizingReservoir.CurrentPressure;
                }

                equalizingReservoir.CurrentPressure -= r;
                break;
            }

            case TrainManager.AirBrakeHandleState.Release:
            {
                double r = equalizingReservoir.ChargeRate;
                double d = equalizingReservoir.NormalPressure - equalizingReservoir.CurrentPressure;
                double m = equalizingReservoir.NormalPressure;
                r = GetRate(d / m, r * TimeElapsed);
                if (r > d)
                {
                    r = d;
                }

                d = mainReservoir.CurrentPressure - equalizingReservoir.CurrentPressure;
                if (r > d)
                {
                    r = d;
                }

                double f = mainReservoir.EqualizingReservoirCoefficient;
                double s = r * f * TimeElapsed;
                if (s > mainReservoir.CurrentPressure)
                {
                    r *= mainReservoir.CurrentPressure / s;
                    s  = mainReservoir.CurrentPressure;
                }

                equalizingReservoir.CurrentPressure += 0.5 * r;
                mainReservoir.CurrentPressure       -= 0.5 * s;
                break;
            }
            }
            //Fill the brake pipe from the main reservoir
            if (brakeType == BrakeType.Main)
            {
                if (brakePipe.CurrentPressure > equalizingReservoir.CurrentPressure + Tolerance)
                {
                    // brake pipe exhaust valve
                    double r = emergencyHandle.Actual ? brakePipe.EmergencyRate : brakePipe.ServiceRate;
                    double d = brakePipe.CurrentPressure - equalizingReservoir.CurrentPressure;
                    double m = equalizingReservoir.NormalPressure;
                    r = (0.5 + 1.5 * d / m) * r * TimeElapsed;
                    if (r > d)
                    {
                        r = d;
                    }
                    brakePipe.CurrentPressure -= r;
                }
                else if (brakePipe.CurrentPressure + Tolerance < equalizingReservoir.CurrentPressure)
                {
                    // fill brake pipe from main reservoir
                    double r = brakePipe.ChargeRate;
                    double d = equalizingReservoir.CurrentPressure - brakePipe.CurrentPressure;
                    double m = equalizingReservoir.NormalPressure;
                    r = (0.5 + 1.5 * d / m) * r * TimeElapsed;
                    if (r > d)
                    {
                        r = d;
                    }
                    d = brakePipe.NormalPressure - brakePipe.CurrentPressure;
                    if (r > d)
                    {
                        r = d;
                    }
                    double f = mainReservoir.BrakePipeCoefficient;
                    double s = r * f;
                    if (s > mainReservoir.CurrentPressure)
                    {
                        r *= mainReservoir.CurrentPressure / s;
                        s  = mainReservoir.CurrentPressure;
                    }
                    brakePipe.CurrentPressure     += 0.5 * r;
                    mainReservoir.CurrentPressure -= 0.5 * s;
                }
            }

            if (brakePipe.CurrentPressure + Tolerance < auxiliaryReservoir.CurrentPressure)
            {
                if (auxiliaryReservoir.CurrentPressure + Tolerance < brakeCylinder.CurrentPressure)
                {
                    // back-flow from brake cylinder to auxillary reservoir
                    double u = (brakeCylinder.CurrentPressure - auxiliaryReservoir.CurrentPressure - Tolerance) / Tolerance;
                    if (u > 1.0)
                    {
                        u = 1.0;
                    }
                    double f = auxiliaryReservoir.BrakeCylinderCoefficient;
                    double r = brakeCylinder.ServiceChargeRate * f;
                    double d = brakeCylinder.CurrentPressure - auxiliaryReservoir.CurrentPressure;
                    double m = auxiliaryReservoir.MaximumPressure;
                    r = GetRate(d * u / m, r * TimeElapsed);
                    if (auxiliaryReservoir.CurrentPressure + r > m)
                    {
                        r = m - auxiliaryReservoir.CurrentPressure;
                    }
                    if (r > d)
                    {
                        r = d;
                    }
                    double s = r / f;
                    if (s > d)
                    {
                        r *= d / s;
                        s  = d;
                    }
                    if (s > brakeCylinder.CurrentPressure)
                    {
                        r *= brakeCylinder.CurrentPressure / s;
                        s  = brakeCylinder.CurrentPressure;
                    }
                    auxiliaryReservoir.CurrentPressure += 0.5 * r;
                    brakeCylinder.CurrentPressure      -= 0.5 * s;
                }
                else if (auxiliaryReservoir.CurrentPressure > brakeCylinder.CurrentPressure + Tolerance)
                {
                    // refill brake cylinder from auxillary reservoir
                    double u = (auxiliaryReservoir.CurrentPressure - brakeCylinder.CurrentPressure - Tolerance) / Tolerance;
                    if (u > 1.0)
                    {
                        u = 1.0;
                    }
                    double f = auxiliaryReservoir.BrakeCylinderCoefficient;
                    double r = brakeCylinder.ServiceChargeRate * f;
                    double d = auxiliaryReservoir.CurrentPressure - brakeCylinder.CurrentPressure;
                    double m = auxiliaryReservoir.MaximumPressure;
                    r = GetRate(d * u / m, r * TimeElapsed);
                    if (r > auxiliaryReservoir.CurrentPressure)
                    {
                        r = auxiliaryReservoir.CurrentPressure;
                    }
                    if (r > d)
                    {
                        r = d;
                    }
                    double s = r / f;
                    if (s > d)
                    {
                        r *= d / s;
                        s  = d;
                    }
                    d = brakeCylinder.EmergencyMaximumPressure - brakeCylinder.CurrentPressure;
                    if (s > d)
                    {
                        r *= d / s;
                        s  = d;
                    }
                    auxiliaryReservoir.CurrentPressure -= 0.5 * r;
                    brakeCylinder.CurrentPressure      += 0.5 * s;
                }
                // air sound
                brakeCylinder.SoundPlayedForPressure = brakeCylinder.EmergencyMaximumPressure;
            }
            else if (brakePipe.CurrentPressure > auxiliaryReservoir.CurrentPressure + Tolerance)
            {
                double u = (brakePipe.CurrentPressure - auxiliaryReservoir.CurrentPressure - Tolerance) / Tolerance;
                if (u > 1.0)
                {
                    u = 1.0;
                }
                {
                    // refill auxillary reservoir from brake pipe
                    double r = auxiliaryReservoir.ChargeRate;
                    double d = brakePipe.CurrentPressure - auxiliaryReservoir.CurrentPressure;
                    double m = auxiliaryReservoir.MaximumPressure;
                    r = GetRate(d * u / m, r * TimeElapsed);
                    if (r > brakePipe.CurrentPressure)
                    {
                        r = brakePipe.CurrentPressure;
                    }

                    if (r > d)
                    {
                        r = d;
                    }
                    d = auxiliaryReservoir.MaximumPressure - auxiliaryReservoir.CurrentPressure;
                    if (r > d)
                    {
                        r = d;
                    }
                    double f = auxiliaryReservoir.BrakePipeCoefficient;
                    double s = r / f;
                    if (s > brakePipe.CurrentPressure)
                    {
                        r *= brakePipe.CurrentPressure / s;
                        s  = brakePipe.CurrentPressure;
                    }

                    if (s > d)
                    {
                        r *= d / s;
                        s  = d;
                    }

                    auxiliaryReservoir.CurrentPressure += 0.5 * r;
                    brakePipe.CurrentPressure          -= 0.5 * s;
                }
                {
                    // brake cylinder release
                    double r = brakeCylinder.ReleaseRate;
                    double d = brakeCylinder.CurrentPressure;
                    double m = brakeCylinder.EmergencyMaximumPressure;
                    r = GetRate(d * u / m, r * TimeElapsed);
                    if (r > brakeCylinder.CurrentPressure)
                    {
                        r = brakeCylinder.CurrentPressure;
                    }
                    brakeCylinder.CurrentPressure -= r;
                    // air sound
                    if (r > 0.0 & brakeCylinder.CurrentPressure < brakeCylinder.SoundPlayedForPressure)
                    {
                        double p = 0.8 * brakeCylinder.CurrentPressure - 0.2 * brakeCylinder.EmergencyMaximumPressure;
                        if (p < 0.0)
                        {
                            p = 0.0;
                        }
                        brakeCylinder.SoundPlayedForPressure = p;
                        airSound = p <Tolerance?AirZero : brakeCylinder.CurrentPressure> m - Tolerance ? AirHigh : Air;
                    }
                }
            }
            else
            {
                // air sound
                brakeCylinder.SoundPlayedForPressure = brakeCylinder.EmergencyMaximumPressure;
            }
            double pressureratio = brakeCylinder.CurrentPressure / brakeCylinder.ServiceMaximumPressure;

            deceleration = pressureratio * DecelerationAtServiceMaximumPressure(brakeHandle.Actual, currentSpeed);
        }
Example #4
0
 /// <summary>Updates the brake system</summary>
 /// <param name="TimeElapsed">The frame time elapsed</param>
 /// <param name="currentSpeed">The current speed of the train</param>
 /// <param name="brakeHandle">The controlling brake handle (NOTE: May either be the loco brake if fitted or the train brake)</param>
 /// <param name="Deceleration">The deceleration output provided</param>
 internal abstract void Update(double TimeElapsed, double currentSpeed, TrainManager.AbstractHandle brakeHandle, out double Deceleration);