public bool IsBindedShape(AbstractShape shape, bool isPressed, bool isTexting = false) { if (isPressed) { if (shape.TypeString == "RectResizeHandle") { handle = shape as RectResizeHandle; return(true); } else if (shape.TypeString == "LineResizeHandle") { handle = shape as LineResizeHandle; return(true); } } return(false); }
public override void Update(double TimeElapsed, double currentSpeed, AbstractHandle brakeHandle, out double Deceleration) { Deceleration = 0.0; }
public override void Update(double TimeElapsed, double currentSpeed, 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 AirBrakeHandleState state = (AirBrakeHandleState)brakeHandle.Actual; switch (state) { case 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 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); }
public override void Update(double TimeElapsed, double currentSpeed, 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); }
/// <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> public abstract void Update(double TimeElapsed, double currentSpeed, AbstractHandle brakeHandle, out double Deceleration);
public override void Update(double TimeElapsed, double currentSpeed, 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); }