Skip to content

Commit

Permalink
Automatic merge of T1.5.1-174-gd2e682132 and 13 pull requests
Browse files Browse the repository at this point in the history
- Pull request #706 at 91bcfa2: Extended door functionality
- Pull request #722 at fb9079e: Fix Windows Forms deprecations in ActivityEditor
- Pull request #732 at dc256cd: Improvements for air brakes
- Pull request #735 at b9a0ea3: Added new parameter for battery switch
- Pull request #746 at f5566d7: Website release 1.5.1
- Pull request #753 at ab8fe32: Extends CabControls for user input
- Pull request #754 at 70a1325: Container weights: https://blueprints.launchpad.net/or/+spec/container-weights
- Pull request #758 at a9e9512: Steam wheel slip#1
- Pull request #760 at 113dd63: Updated EditorConfig with .NET and StyleCop analyzer configuration
- Pull request #761 at f6a3aca: fix: Allow 100% cloud-free skys by making 0% overcast = 0% clouds
- Pull request #763 at 12e250d: build: Remove use of SolutionDir which is not supported everywhere
- Pull request #764 at 5f9a01b: fix: Improve sky dome distortion causing bug #1471416
- Pull request #765 at 083467b: Bug fix for https://bugs.launchpad.net/or/+bug/2002183 OK to proceed sound played wrongly
  • Loading branch information
openrails-bot committed Jan 12, 2023
15 parents f3d81e6 + d2e6821 + 91bcfa2 + fb9079e + dc256cd + b9a0ea3 + f5566d7 + ab8fe32 + 70a1325 + a9e9512 + 113dd63 + f6a3aca + 12e250d + 5f9a01b + 083467b commit 950bf02
Show file tree
Hide file tree
Showing 4 changed files with 65 additions and 35 deletions.
6 changes: 5 additions & 1 deletion Source/Orts.Simulation/Common/Scripting/BrakeController.cs
Expand Up @@ -359,6 +359,8 @@ public enum ControllerState
SMEFullServ, // TrainBrakesControllerSMEFullServiceStart
SMESelfLap, // TrainBrakesControllerSMEHoldStart
SMEReleaseStart, // TrainBrakesControllerSMEReleaseStart
HoldEngine, // TrainBrakesControllerHoldEngineStart
BailOff, // EngineBrakesControllerBailOffStart
};

public static class ControllerStateDictionary
Expand Down Expand Up @@ -405,7 +407,9 @@ public static class ControllerStateDictionary
{ControllerState.SMEOnly, Catalog.GetString("SME Service")},
{ControllerState.SMEFullServ, Catalog.GetString("SME Full Service")},
{ControllerState.SMESelfLap, Catalog.GetString("SME Self Lap")},
{ControllerState.SMEReleaseStart, Catalog.GetString("SME Release Start")}
{ControllerState.SMEReleaseStart, Catalog.GetString("SME Release Start")},
{ControllerState.HoldEngine, Catalog.GetString("Hold Engine")},
{ControllerState.BailOff, Catalog.GetString("Bail Off")}
};
}
}
Expand Up @@ -338,7 +338,8 @@ public override void InitializeMoving ()

public void UpdateTripleValveState(float elapsedClockSeconds)
{
if ((Car as MSTSWagon).BrakeValve == MSTSWagon.BrakeValveType.Distributor)
var valveType = (Car as MSTSWagon).BrakeValve;
if (valveType == MSTSWagon.BrakeValveType.Distributor)
{
float targetPressurePSI = (ControlResPressurePSI - BrakeLine1PressurePSI) * AuxCylVolumeRatio;
if (targetPressurePSI > AutoCylPressurePSI && EmergencyValveActuationRatePSIpS > 0 && (prevBrakePipePressurePSI - BrakeLine1PressurePSI) > Math.Max(elapsedClockSeconds, 0.0001f) * EmergencyValveActuationRatePSIpS)
Expand All @@ -351,7 +352,7 @@ public void UpdateTripleValveState(float elapsedClockSeconds)
else
TripleValveState = ValveState.Lap;
}
else
else if (valveType == MSTSWagon.BrakeValveType.TripleValve || valveType == MSTSWagon.BrakeValveType.Distributor)
{
if (BrakeLine1PressurePSI < AuxResPressurePSI - 1 && EmergencyValveActuationRatePSIpS > 0 && (prevBrakePipePressurePSI - BrakeLine1PressurePSI) > Math.Max(elapsedClockSeconds, 0.0001f) * EmergencyValveActuationRatePSIpS)
TripleValveState = ValveState.Emergency;
Expand All @@ -364,6 +365,10 @@ public void UpdateTripleValveState(float elapsedClockSeconds)
else if (TripleValveState == ValveState.Apply && BrakeLine1PressurePSI >= AuxResPressurePSI)
TripleValveState = ValveState.Lap;
}
else
{
TripleValveState = ValveState.Release;
}
prevBrakePipePressurePSI = BrakeLine1PressurePSI;
}

Expand Down Expand Up @@ -423,13 +428,16 @@ public override void Update(float elapsedClockSeconds)
AuxResPressurePSI -= dp / AuxCylVolumeRatio;
AutoCylPressurePSI += dp;

if (TripleValveState == ValveState.Emergency && (Car as MSTSWagon).EmergencyReservoirPresent)
if (TripleValveState == ValveState.Emergency)
{
dp = elapsedClockSeconds * MaxApplicationRatePSIpS;
if (EmergResPressurePSI - dp < AuxResPressurePSI + dp * EmergAuxVolumeRatio)
dp = (EmergResPressurePSI - AuxResPressurePSI) / (1 + EmergAuxVolumeRatio);
EmergResPressurePSI -= dp;
AuxResPressurePSI += dp * EmergAuxVolumeRatio;
if ((Car as MSTSWagon).EmergencyReservoirPresent)
{
dp = elapsedClockSeconds * MaxApplicationRatePSIpS;
if (EmergResPressurePSI - dp < AuxResPressurePSI + dp * EmergAuxVolumeRatio)
dp = (EmergResPressurePSI - AuxResPressurePSI) / (1 + EmergAuxVolumeRatio);
EmergResPressurePSI -= dp;
AuxResPressurePSI += dp * EmergAuxVolumeRatio;
}
}
}

Expand Down Expand Up @@ -525,15 +533,11 @@ public override void Update(float elapsedClockSeconds)
var engineBrakeStatus = loco.EngineBrakeController.Notches[loco.EngineBrakeController.CurrentNotch].Type;
var trainBrakeStatus = loco.TrainBrakeController.Notches[loco.TrainBrakeController.CurrentNotch].Type;
// BailOff
if (engineBrakeStatus == ControllerState.Release)
if (engineBrakeStatus == ControllerState.BailOff)
{
AutoCylPressurePSI -= MaxReleaseRatePSIpS * elapsedClockSeconds;
if (AutoCylPressurePSI < 0) AutoCylPressurePSI = 0;
}
// Independent air brake application
if (AutoCylPressurePSI < BrakeLine3PressurePSI)
AutoCylPressurePSI = BrakeLine3PressurePSI;
BrakeLine3PressurePSI = AutoCylPressurePSI;
// Emergency application
if (trainBrakeStatus == ControllerState.Emergency)
{
Expand All @@ -543,43 +547,61 @@ public override void Update(float elapsedClockSeconds)
AutoCylPressurePSI += dp;
}
// Release pipe open
HoldingValve = engineBrakeStatus == ControllerState.Running && trainBrakeStatus == ControllerState.Release ? ValveState.Release : ValveState.Lap;
HoldingValve = engineBrakeStatus == ControllerState.Release && trainBrakeStatus == ControllerState.Release ? ValveState.Release : ValveState.Lap;

// Independent air brake equalization
if (AutoCylPressurePSI < loco.Train.BrakeLine3PressurePSI)
AutoCylPressurePSI = loco.Train.BrakeLine3PressurePSI;
else
loco.Train.BrakeLine3PressurePSI = AutoCylPressurePSI;

// Equalization between application chamber and brake cylinders
// TODO: Drain air from main reservoir
CylPressurePSI = AutoCylPressurePSI;
}
else
{
bool bailoff = false;

if (Car is MSTSLocomotive loco && loco.EngineType != TrainCar.EngineTypes.Control) // TODO - Control cars ned to be linked to power suppy requirements.
{
bool isolateAutoBrake = false;
// if (Car is MSTSLocomotive loco && loco.LocomotivePowerSupply.MainPowerSupplyOn)
if (loco.LocomotivePowerSupply.MainPowerSupplyOn)
{
if (loco.Train.LeadLocomotiveIndex >= 0 && ((MSTSLocomotive)loco.Train.Cars[loco.Train.LeadLocomotiveIndex]).BailOff)
{
bailoff = true;
CylPressurePSI -= MaxReleaseRatePSIpS * elapsedClockSeconds;
if (CylPressurePSI < 0) CylPressurePSI = 0;
if (loco.Train.LeadLocomotiveIndex >= 0)
{
var lead = loco.Train.Cars[loco.Train.LeadLocomotiveIndex] as MSTSLocomotive;
if (lead != null && (lead.BailOff ||
(lead.EngineBrakeController != null && lead.EngineBrakeController.CurrentNotch >= 0 && lead.EngineBrakeController.Notches[lead.EngineBrakeController.CurrentNotch].Type == ControllerState.BailOff)))
{
if (loco.BrakeValve == MSTSWagon.BrakeValveType.Distributor)
{
ControlResPressurePSI = 0;
}
else
{
AutoCylPressurePSI -= MaxReleaseRatePSIpS * elapsedClockSeconds;
if (AutoCylPressurePSI < 0)
AutoCylPressurePSI = 0;
}
}
}
else if (loco.DynamicBrakeAutoBailOff && loco.DynamicBrakePercent > 0 && Car.MaxBrakeForceN > 0)
if (loco.DynamicBrakeAutoBailOff && loco.DynamicBrakePercent > 0 && Car.MaxBrakeForceN > 0)
{
bailoff = true;
var requiredBrakeForce = Math.Min(AutoCylPressurePSI / MaxCylPressurePSI, 1) * Car.MaxBrakeForceN;
var airBrakeForce = requiredBrakeForce - loco.DynamicBrakeForceN;
var requiredCylPressure = Math.Max(Math.Min(airBrakeForce / Car.MaxBrakeForceN * MaxCylPressurePSI, AutoCylPressurePSI), 0);
if (requiredCylPressure > CylPressurePSI)
CylPressurePSI = Math.Min(requiredCylPressure, CylPressurePSI + MaxApplicationRatePSIpS * elapsedClockSeconds);
if (requiredCylPressure < CylPressurePSI)
CylPressurePSI = Math.Max(requiredCylPressure, CylPressurePSI - MaxReleaseRatePSIpS * elapsedClockSeconds);
var requiredBrakeForceN = Math.Min(AutoCylPressurePSI / MaxCylPressurePSI, 1) * Car.MaxBrakeForceN;
var localBrakeForceN = loco.DynamicBrakeForceN + Math.Min(BrakeLine3PressurePSI / MaxCylPressurePSI, 1) * Car.MaxBrakeForceN;
if (localBrakeForceN > requiredBrakeForceN * 0.85f)
isolateAutoBrake = true;
}
}
if (isolateAutoBrake)
CylPressurePSI = BrakeLine3PressurePSI;
else
CylPressurePSI = Math.Max(AutoCylPressurePSI, BrakeLine3PressurePSI);
}
else
{
CylPressurePSI = Math.Max(AutoCylPressurePSI, BrakeLine3PressurePSI);
}
if (!bailoff)
CylPressurePSI = AutoCylPressurePSI;
if (CylPressurePSI < BrakeLine3PressurePSI) // Brake Cylinder pressure will be the greater of engine brake pressure or train brake pressure
CylPressurePSI = BrakeLine3PressurePSI;
}

// During braking wheelslide control is effected throughout the train by additional equipment on each vehicle. In the piping to each pair of brake cylinders are fitted electrically operated
Expand Down
Expand Up @@ -128,6 +128,7 @@ public override void UpdatePressure(ref float pressureBar, float elapsedClockSec
switch (type)
{
case ControllerState.Release:
case ControllerState.HoldEngine:
IncreasePressure(ref pressureBar, Math.Min(MaxPressureBar(), MainReservoirPressureBar()), ReleaseRateBarpS(), elapsedClockSeconds);
DecreasePressure(ref pressureBar, MaxPressureBar(), OverchargeEliminationRateBarpS(), elapsedClockSeconds);
epState = 0;
Expand Down Expand Up @@ -256,6 +257,7 @@ public override void UpdateEngineBrakePressure(ref float pressureBar, float elap
case ControllerState.Lap:
break;
case ControllerState.FullQuickRelease:
case ControllerState.BailOff:
pressureBar -= x * QuickReleaseRateBarpS() * elapsedClockSeconds;
break;
case ControllerState.Release:
Expand Down
Expand Up @@ -79,6 +79,8 @@ public MSTSNotch(float v, int s, string type, STFReader stf)
case "brakenotchstart": Type = ControllerState.BrakeNotch; break;
case "overchargestart": Type = ControllerState.Overcharge; break;
case "slowservicestart": Type = ControllerState.SlowService; break;
case "holdenginestart": Type = ControllerState.HoldEngine; break;
case "bailoffstart": Type = ControllerState.BailOff; break;
default:
STFException.TraceInformation(stf, "Skipped unknown notch type " + type);
break;
Expand Down

0 comments on commit 950bf02

Please sign in to comment.