Skip to content

Commit 73efb72

Browse files
committed
Improvements to the PBL2 controller
1 parent 9119bf1 commit 73efb72

File tree

2 files changed

+93
-64
lines changed

2 files changed

+93
-64
lines changed

Source/Orts.Simulation/Simulation/RollingStocks/SubSystems/Controllers/BrakeController.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -367,7 +367,8 @@ public void Initialize()
367367
{
368368
if (!Activated)
369369
{
370-
if (ScriptName != null && ScriptName != "MSTS")
370+
if (ScriptName == "PBL2") Script = new PBL2BrakeController();
371+
else if (ScriptName != null && ScriptName != "MSTS")
371372
{
372373
var pathArray = new string[] { Path.Combine(Path.GetDirectoryName(Locomotive.WagFilePath), "Script") };
373374
Script = Simulator.ScriptManager.Load(pathArray, ScriptName) as BrakeController;

Source/Orts.Simulation/Simulation/RollingStocks/SubSystems/Controllers/PBL2BrakeController.cs

Lines changed: 91 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,9 @@
1616
// along with Open Rails. If not, see <http://www.gnu.org/licenses/>.
1717

1818
using System;
19-
using Orts.Simulation.RollingStocks.SubSystems.Controllers;
2019
using ORTS.Scripting.Api;
2120

22-
namespace ORTS.Scripting.Script
21+
namespace Orts.Simulation.RollingStocks.SubSystems.Controllers
2322
{
2423
public class PBL2BrakeController : BrakeController
2524
{
@@ -54,10 +53,9 @@ public enum ControllerPosition
5453
private Timer ResetTimer { get; set; }
5554

5655
// brake controller values
57-
private float OverchargePressureBar = 0.4f;
58-
private float OverchargeEleminationPressureRateBarpS = 0.0025f;
5956
private float FirstDepressureBar = 0.5f;
6057
private float BrakeReleasedDepressureBar = 0.2f;
58+
private float EpActivationThresholdBar = 0.15f;
6159

6260
private State CurrentState;
6361
private ControllerPosition CurrentPosition = ControllerPosition.Hold;
@@ -67,8 +65,6 @@ public enum ControllerPosition
6765
private bool OverchargeElimination = false;
6866
private bool QuickRelease = false;
6967

70-
private float RegulatorPressureBar = 0.0f;
71-
7268
private float? AiBrakeTargetPercent = null;
7369

7470
public override void Initialize()
@@ -84,8 +80,10 @@ public override void Initialize()
8480
ReleaseValue = notch.Value;
8581
ReleaseNotch = Notches().IndexOf(notch);
8682
break;
87-
case ControllerState.FullQuickRelease:
83+
case ControllerState.Overcharge:
8884
OverchargeValue = notch.Value;
85+
break;
86+
case ControllerState.FullQuickRelease:
8987
QuickReleaseValue = notch.Value;
9088
break;
9189
case ControllerState.Lap:
@@ -146,104 +144,129 @@ public override float Update(float elapsedSeconds)
146144

147145
public override void UpdatePressure(ref float pressureBar, float elapsedClockSeconds, ref float epPressureBar)
148146
{
149-
RegulatorPressureBar = Math.Min(MaxPressureBar(), MainReservoirPressureBar());
150-
151147
if (AiBrakeTargetPercent != null)
152148
{
153-
pressureBar = RegulatorPressureBar - (float)AiBrakeTargetPercent * FullServReductionBar();
154-
epPressureBar = (float)AiBrakeTargetPercent * MaxPressureBar();
149+
pressureBar = MaxPressureBar() - (float)AiBrakeTargetPercent / 100 * FullServReductionBar();
150+
epPressureBar = (float)AiBrakeTargetPercent / 100;
155151
return;
156152
}
157153

158-
if (!FirstDepression && CurrentPosition == ControllerPosition.Apply && pressureBar > Math.Max(RegulatorPressureBar - FirstDepressureBar, 0))
154+
if (!FirstDepression && CurrentPosition == ControllerPosition.Apply && pressureBar > Math.Max(MaxPressureBar() - FirstDepressureBar, 0))
159155
FirstDepression = true;
160-
else if (FirstDepression && pressureBar <= Math.Max(RegulatorPressureBar - FirstDepressureBar, 0))
156+
else if (FirstDepression && pressureBar <= Math.Max(MaxPressureBar() - FirstDepressureBar, 0))
161157
FirstDepression = false;
162158

159+
if (QuickReleaseButtonPressed())
160+
QuickRelease = true;
161+
if (OverchargeButtonPressed())
162+
{
163+
Overcharge = true;
164+
OverchargeElimination = false;
165+
}
166+
else if (Overcharge)
167+
{
168+
Overcharge = false;
169+
OverchargeElimination = true;
170+
}
163171
if (CurrentPosition == ControllerPosition.Apply && Overcharge)
164172
Overcharge = false;
165173
if (CurrentPosition == ControllerPosition.Apply && QuickRelease)
166174
QuickRelease = false;
167175

168176
if (EmergencyBrakingPushButton() || TCSEmergencyBraking())
169177
CurrentState = State.Emergency;
178+
else if (TCSFullServiceBraking() && pressureBar > MaxPressureBar() - FullServReductionBar())
179+
CurrentState = State.Apply;
170180
else if (
171-
CurrentPosition == ControllerPosition.Apply && pressureBar > RegulatorPressureBar - FullServReductionBar()
172-
|| FirstDepression && CurrentPosition != ControllerPosition.Release && !QuickRelease && pressureBar > RegulatorPressureBar - FirstDepressureBar
181+
CurrentPosition == ControllerPosition.Apply && pressureBar > MaxPressureBar() - FullServReductionBar()
182+
|| FirstDepression && CurrentPosition != ControllerPosition.Release && !QuickRelease && pressureBar > MaxPressureBar() - FirstDepressureBar
173183
)
174184
CurrentState = State.Apply;
175-
else if (OverchargeElimination && pressureBar > RegulatorPressureBar)
185+
else if (OverchargeElimination && pressureBar > MaxPressureBar())
176186
CurrentState = State.OverchargeElimination;
177-
else if (Overcharge && pressureBar <= RegulatorPressureBar + OverchargePressureBar)
187+
else if (Overcharge && pressureBar <= Math.Min(MaxOverchargePressureBar(), MainReservoirPressureBar()))
178188
CurrentState = State.Overcharge;
179-
else if (QuickRelease && !NeutralModeOn && pressureBar < RegulatorPressureBar)
189+
else if (QuickRelease && !NeutralModeOn && pressureBar < Math.Min(MaxPressureBar(), MainReservoirPressureBar()))
180190
CurrentState = State.QuickRelease;
181191
else if (
182192
!NeutralModeOn && (
183-
CurrentPosition == ControllerPosition.Release && pressureBar < RegulatorPressureBar
184-
|| !FirstDepression && pressureBar > RegulatorPressureBar - BrakeReleasedDepressureBar && pressureBar < RegulatorPressureBar
185-
|| pressureBar < RegulatorPressureBar - FullServReductionBar()
193+
CurrentPosition == ControllerPosition.Release && pressureBar < Math.Min(MaxPressureBar(), MainReservoirPressureBar())
194+
|| !FirstDepression && pressureBar > MaxPressureBar() - BrakeReleasedDepressureBar && pressureBar < Math.Min(MaxPressureBar(), MainReservoirPressureBar())
195+
|| pressureBar < MaxPressureBar() - FullServReductionBar()
186196
)
187197
)
188198
CurrentState = State.Release;
189199
else
190200
CurrentState = State.Hold;
191201

202+
float targetPressureBar = pressureBar;
192203
switch (CurrentState)
193204
{
194205
case State.Overcharge:
195-
SetUpdateValue(-1);
196-
197-
pressureBar += QuickReleaseRateBarpS() * elapsedClockSeconds;
198-
epPressureBar -= QuickReleaseRateBarpS() * elapsedClockSeconds;
206+
{
207+
SetUpdateValue(-1);
199208

200-
if (pressureBar > MaxPressureBar() + OverchargePressureBar)
201-
pressureBar = MaxPressureBar() + OverchargePressureBar;
202-
break;
209+
float dp = QuickReleaseRateBarpS() * elapsedClockSeconds;
210+
if (pressureBar + dp > MaxOverchargePressureBar())
211+
dp = MaxOverchargePressureBar() - pressureBar;
212+
if (pressureBar + dp > MainReservoirPressureBar())
213+
dp = Math.Max(MainReservoirPressureBar() - pressureBar, 0);
214+
pressureBar += dp;
203215

216+
break;
217+
}
204218
case State.OverchargeElimination:
205-
SetUpdateValue(-1);
206-
207-
pressureBar -= OverchargeEleminationPressureRateBarpS * elapsedClockSeconds;
219+
{
220+
SetUpdateValue(-1);
208221

209-
if (pressureBar < MaxPressureBar())
210-
pressureBar = MaxPressureBar();
211-
break;
222+
float dp = OverchargeEliminationRateBarpS() * elapsedClockSeconds;
223+
if (pressureBar - dp < MaxPressureBar())
224+
dp = Math.Max(pressureBar - MaxPressureBar(), 0);
225+
pressureBar -= dp;
212226

227+
break;
228+
}
213229
case State.QuickRelease:
214-
SetUpdateValue(-1);
215-
216-
pressureBar += QuickReleaseRateBarpS() * elapsedClockSeconds;
217-
epPressureBar -= QuickReleaseRateBarpS() * elapsedClockSeconds;
230+
{
231+
SetUpdateValue(-1);
218232

219-
if (pressureBar > RegulatorPressureBar)
220-
pressureBar = RegulatorPressureBar;
221-
break;
233+
float dp = QuickReleaseRateBarpS() * elapsedClockSeconds;
234+
if (pressureBar + dp > MaxPressureBar())
235+
dp = MaxPressureBar() - pressureBar;
236+
if (pressureBar + dp > MainReservoirPressureBar())
237+
dp = Math.Max(MainReservoirPressureBar() - pressureBar, 0);
238+
pressureBar += dp;
222239

240+
break;
241+
}
223242
case State.Release:
224-
SetUpdateValue(-1);
243+
{
244+
SetUpdateValue(-1);
225245

226-
pressureBar += ReleaseRateBarpS() * elapsedClockSeconds;
227-
epPressureBar -= ReleaseRateBarpS() * elapsedClockSeconds;
228-
229-
if (pressureBar > RegulatorPressureBar)
230-
pressureBar = RegulatorPressureBar;
231-
break;
246+
float dp = ReleaseRateBarpS() * elapsedClockSeconds;
247+
if (pressureBar + dp > MaxPressureBar())
248+
dp = MaxPressureBar() - pressureBar;
249+
if (pressureBar + dp > MainReservoirPressureBar())
250+
dp = Math.Max(MainReservoirPressureBar() - pressureBar, 0);
251+
pressureBar += dp;
232252

253+
break;
254+
}
233255
case State.Hold:
234256
SetUpdateValue(0);
235257
break;
236258

237259
case State.Apply:
238-
SetUpdateValue(1);
239-
240-
pressureBar -= ApplyRateBarpS() * elapsedClockSeconds;
241-
epPressureBar += ApplyRateBarpS() * elapsedClockSeconds;
260+
{
261+
SetUpdateValue(1);
242262

243-
if (pressureBar < Math.Max(RegulatorPressureBar - FullServReductionBar(), 0.0f))
244-
pressureBar = Math.Max(RegulatorPressureBar - FullServReductionBar(), 0.0f);
245-
break;
263+
float dp = ApplyRateBarpS() * elapsedClockSeconds;
264+
if (pressureBar - dp < MaxPressureBar() - FullServReductionBar())
265+
dp = Math.Max(pressureBar - (MaxPressureBar() - FullServReductionBar()), 0);
266+
pressureBar -= dp;
246267

268+
break;
269+
}
247270
case State.Emergency:
248271
SetUpdateValue(1);
249272

@@ -254,12 +277,14 @@ public override void UpdatePressure(ref float pressureBar, float elapsedClockSec
254277
break;
255278
}
256279

257-
if (epPressureBar > MaxPressureBar())
258-
epPressureBar = MaxPressureBar();
259-
if (epPressureBar < 0)
260-
epPressureBar = 0;
280+
if (BrakePipePressureBar() > Math.Max(MaxPressureBar() - FullServReductionBar(), pressureBar) + EpActivationThresholdBar)
281+
epPressureBar = 1; // EP application wire
282+
else if (CurrentState != State.Emergency && BrakePipePressureBar() >= MaxPressureBar() - FullServReductionBar() && BrakePipePressureBar() < Math.Min(MaxPressureBar(), pressureBar) - EpActivationThresholdBar)
283+
epPressureBar = 0; // EP release wire
284+
else
285+
epPressureBar = -1;
261286

262-
if (QuickRelease && pressureBar == RegulatorPressureBar)
287+
if (QuickRelease && pressureBar >= Math.Min(MaxPressureBar(), MainReservoirPressureBar()))
263288
QuickRelease = false;
264289
}
265290

@@ -365,6 +390,8 @@ public override bool IsValid()
365390

366391
public override ControllerState GetState()
367392
{
393+
if (CurrentState != State.Emergency && NeutralModeOn)
394+
return ControllerState.Neutral;
368395
switch (CurrentState)
369396
{
370397
case State.Overcharge:
@@ -383,15 +410,16 @@ public override ControllerState GetState()
383410
return ControllerState.Hold;
384411

385412
case State.Apply:
386-
return ControllerState.Apply;
413+
if (TCSFullServiceBraking())
414+
return ControllerState.TCSFullServ;
415+
else
416+
return ControllerState.Apply;
387417

388418
case State.Emergency:
389419
if (EmergencyBrakingPushButton())
390420
return ControllerState.EBPB;
391421
else if (TCSEmergencyBraking())
392422
return ControllerState.TCSEmergency;
393-
else if (TCSFullServiceBraking())
394-
return ControllerState.TCSFullServ;
395423
else
396424
return ControllerState.Emergency;
397425

0 commit comments

Comments
 (0)