Skip to content

Commit 253d8b5

Browse files
authored
Merge pull request #482 from Sharpe49/power-supply-fix-toggle-player-engine
Fix Toggle Player Engine command and refactor
2 parents acd8383 + 878a89e commit 253d8b5

File tree

8 files changed

+138
-67
lines changed

8 files changed

+138
-67
lines changed

Source/Orts.Simulation/Common/Commands.cs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1740,8 +1740,7 @@ public TogglePlayerEngineCommand(CommandLog log)
17401740

17411741
public override void Redo()
17421742
{
1743-
if (Receiver == null) return;
1744-
Receiver.LocomotivePowerSupply.HandleEvent(Receiver.DieselEngines.PowerOn ? PowerSupplyEvent.StopEngine : PowerSupplyEvent.StartEngine);
1743+
Receiver?.LocomotivePowerSupply.HandleEvent(PowerSupplyEvent.TogglePlayerEngine);
17451744
}
17461745
}
17471746

@@ -1759,9 +1758,7 @@ public ToggleHelpersEngineCommand(CommandLog log)
17591758

17601759
public override void Redo()
17611760
{
1762-
if (Receiver == null) return;
1763-
Receiver.ToggleHelpersEngine();
1764-
// Report();
1761+
Receiver?.LocomotivePowerSupply.HandleEvent(PowerSupplyEvent.ToggleHelperEngine);
17651762
}
17661763
}
17671764

Source/Orts.Simulation/Common/Scripting/PowerSupply/LocomotivePowerSupply.cs

Lines changed: 41 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
// You should have received a copy of the GNU General Public License
1616
// along with Open Rails. If not, see <http://www.gnu.org/licenses/>.
1717

18+
using Orts.Simulation;
1819
using System;
1920

2021
namespace ORTS.Scripting.Api
@@ -36,10 +37,18 @@ public abstract class LocomotivePowerSupply : PowerSupply
3637
/// </summary>
3738
public Func<PowerSupplyState> CurrentCabPowerSupplyState;
3839
/// <summary>
40+
/// Current state of the helper engines
41+
/// </summary>
42+
public Func<DieselEngineState> CurrentHelperEnginesState;
43+
/// <summary>
3944
/// Current availability of the dynamic brake
4045
/// </summary>
4146
public Func<bool> CurrentDynamicBrakeAvailability;
4247
/// <summary>
48+
/// Current throttle percentage
49+
/// </summary>
50+
public Func<float> ThrottlePercent;
51+
/// <summary>
4352
/// Main supply power on delay
4453
/// </summary>
4554
public Func<float> PowerOnDelayS;
@@ -115,20 +124,46 @@ public abstract class LocomotivePowerSupply : PowerSupply
115124
/// Sends an event to the power supplies of other train vehicles
116125
/// </summary>
117126
public Action<PowerSupplyEvent, int> SignalEventToOtherTrainVehiclesWithId;
127+
/// <summary>
128+
/// Sends an event to all helper engines
129+
/// </summary>
130+
public Action<PowerSupplyEvent> SignalEventToHelperEngines;
118131

119132
/// <summary>
120133
/// Called when the driver (or the train's systems) want something to happen on the power supply system
121134
/// </summary>
122135
/// <param name="evt">The event</param>
123136
public override void HandleEvent(PowerSupplyEvent evt)
124137
{
125-
base.HandleEvent(evt);
138+
switch (evt)
139+
{
140+
case PowerSupplyEvent.ToggleHelperEngine:
141+
switch (CurrentHelperEnginesState())
142+
{
143+
case DieselEngineState.Stopped:
144+
case DieselEngineState.Stopping:
145+
SignalEventToHelperEngines(PowerSupplyEvent.StartEngine);
146+
Confirm(CabControl.HelperDiesel, CabSetting.On);
147+
break;
126148

127-
// By default, send the event to every component
128-
SignalEventToMasterKey(evt);
129-
SignalEventToElectricTrainSupplySwitch(evt);
130-
SignalEventToTcs(evt);
131-
SignalEventToOtherTrainVehicles(evt);
149+
case DieselEngineState.Starting:
150+
case DieselEngineState.Running:
151+
SignalEventToHelperEngines(PowerSupplyEvent.StopEngine);
152+
Confirm(CabControl.HelperDiesel, CabSetting.Off);
153+
break;
154+
}
155+
break;
156+
157+
default:
158+
base.HandleEvent(evt);
159+
160+
// By default, send the event to every component
161+
SignalEventToMasterKey(evt);
162+
SignalEventToElectricTrainSupplySwitch(evt);
163+
SignalEventToTcs(evt);
164+
SignalEventToOtherTrainVehicles(evt);
165+
break;
166+
}
132167
}
133168

134169
public override void HandleEvent(PowerSupplyEvent evt, int id)

Source/Orts.Simulation/Common/Scripting/PowerSupply/PowerSupply.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,8 @@ public enum PowerSupplyEvent
109109
{
110110
QuickPowerOn,
111111
QuickPowerOff,
112+
TogglePlayerEngine,
113+
ToggleHelperEngine,
112114
CloseBatterySwitch,
113115
OpenBatterySwitch,
114116
CloseBatterySwitchButtonPressed,

Source/Orts.Simulation/Simulation/RollingStocks/MSTSDieselLocomotive.cs

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1009,19 +1009,6 @@ protected override void UpdateCarSteamHeat(float elapsedClockSeconds)
10091009
}
10101010
}
10111011

1012-
public void TogglePlayerEngine()
1013-
{
1014-
if (ThrottlePercent < 1)
1015-
{
1016-
DieselEngines.HandleEvent(DieselEngines.PowerOn ? PowerSupplyEvent.StopEngine : PowerSupplyEvent.StartEngine);
1017-
Simulator.Confirmer.Confirm(CabControl.PlayerDiesel, DieselEngines.PowerOn ? CabSetting.On : CabSetting.Off);
1018-
}
1019-
else
1020-
{
1021-
Simulator.Confirmer.Warning(CabControl.PlayerDiesel, CabSetting.Warn1);
1022-
}
1023-
}
1024-
10251012
//used by remote diesels to update their exhaust
10261013
public void RemoteUpdate(float exhPart, float exhMag, float exhColorR, float exhColorG, float exhColorB)
10271014
{

Source/Orts.Simulation/Simulation/RollingStocks/MSTSLocomotive.cs

Lines changed: 0 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -4114,46 +4114,6 @@ public void AlerterPressed(bool pressed)
41144114
TrainControlSystem.AlerterPressed(pressed);
41154115
}
41164116

4117-
//put here because you can have diesel helpers and electric player locomotive
4118-
public void ToggleHelpersEngine()
4119-
{
4120-
bool helperFound = false; //this avoids that locomotive engines toggle in opposite directions
4121-
bool powerOn = false;
4122-
4123-
foreach (MSTSDieselLocomotive locomotive in Train.Cars.OfType<MSTSDieselLocomotive>().Where((MSTSLocomotive locomotive) => { return locomotive.AcceptMUSignals; }))
4124-
{
4125-
if (locomotive == Simulator.PlayerLocomotive)
4126-
{
4127-
// Engine number 1 or above are helper engines
4128-
for (int i = 1; i < locomotive.DieselEngines.Count; i++)
4129-
{
4130-
if (!helperFound)
4131-
{
4132-
helperFound = true;
4133-
powerOn = !locomotive.DieselEngines[i].PowerOn;
4134-
}
4135-
4136-
locomotive.DieselEngines.HandleEvent(powerOn ? PowerSupplyEvent.StartEngine : PowerSupplyEvent.StopEngine, i);
4137-
}
4138-
}
4139-
else
4140-
{
4141-
if (!helperFound)
4142-
{
4143-
helperFound = true;
4144-
powerOn = !locomotive.DieselEngines[0].PowerOn;
4145-
}
4146-
4147-
locomotive.DieselEngines.HandleEvent(powerOn ? PowerSupplyEvent.StartEngine : PowerSupplyEvent.StopEngine);
4148-
}
4149-
}
4150-
4151-
if (helperFound)
4152-
{
4153-
Simulator.Confirmer.Confirm(CabControl.HelperDiesel, powerOn ? CabSetting.On : CabSetting.Off);
4154-
}
4155-
}
4156-
41574117
public override void SignalEvent(Event evt)
41584118
{
41594119
switch (evt)

Source/Orts.Simulation/Simulation/RollingStocks/SubSystems/PowerSupplies/DieselEngine.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -361,9 +361,9 @@ public void HandleEvent(PowerSupplyEvent evt)
361361

362362
public void HandleEvent(PowerSupplyEvent evt, int id)
363363
{
364-
if (id <= DEList.Count)
364+
if (id >= 0 && id < DEList.Count)
365365
{
366-
DEList[id - 1].HandleEvent(evt);
366+
DEList[id].HandleEvent(evt);
367367
}
368368
}
369369

@@ -383,7 +383,7 @@ public string GetStatus()
383383

384384
result.AppendFormat(Simulator.Catalog.GetString("Status"));
385385
foreach (var eng in DEList)
386-
result.AppendFormat("\t{0}", Simulator.Catalog.GetString(GetStringAttribute.GetPrettyName(eng.State)));
386+
result.AppendFormat("\t{0}", Simulator.Catalog.GetParticularString("Engine", GetStringAttribute.GetPrettyName(eng.State)));
387387

388388
result.AppendFormat("\t{0}\t{1}", Simulator.Catalog.GetParticularString("HUD", "Power"), FormatStrings.FormatPower(MaxOutputPowerW, Locomotive.IsMetric, false, false));
389389
foreach (var eng in DEList)

Source/Orts.Simulation/Simulation/RollingStocks/SubSystems/PowerSupplies/DieselPowerSupply.cs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -335,6 +335,34 @@ public override void HandleEvent(PowerSupplyEvent evt)
335335
SignalEventToBatterySwitch(PowerSupplyEvent.OpenBatterySwitch);
336336
break;
337337

338+
case PowerSupplyEvent.TogglePlayerEngine:
339+
switch (CurrentDieselEngineState(0))
340+
{
341+
case DieselEngineState.Stopped:
342+
case DieselEngineState.Stopping:
343+
SignalEventToDieselEngine(PowerSupplyEvent.StartEngine, 0);
344+
Confirm(CabControl.PlayerDiesel, CabSetting.On);
345+
break;
346+
347+
case DieselEngineState.Starting:
348+
SignalEventToDieselEngine(PowerSupplyEvent.StopEngine, 0);
349+
Confirm(CabControl.PlayerDiesel, CabSetting.Off);
350+
break;
351+
352+
case DieselEngineState.Running:
353+
if (ThrottlePercent() < 1)
354+
{
355+
SignalEventToDieselEngine(PowerSupplyEvent.StopEngine, 0);
356+
Confirm(CabControl.PlayerDiesel, CabSetting.Off);
357+
}
358+
else
359+
{
360+
Confirm(CabControl.PlayerDiesel, CabSetting.Warn1);
361+
}
362+
break;
363+
}
364+
break;
365+
338366
default:
339367
base.HandleEvent(evt);
340368
break;

Source/Orts.Simulation/Simulation/RollingStocks/SubSystems/PowerSupplies/LocomotivePowerSupply.cs

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,34 @@ protected virtual void AssignScriptFunctions()
274274
AbstractScript.CurrentLowVoltagePowerSupplyState = () => LowVoltagePowerSupplyState;
275275
AbstractScript.CurrentBatteryState = () => BatteryState;
276276
AbstractScript.CurrentCabPowerSupplyState = () => CabPowerSupplyState;
277+
AbstractScript.CurrentHelperEnginesState = () =>
278+
{
279+
DieselEngineState state = DieselEngineState.Unavailable;
280+
281+
foreach (MSTSDieselLocomotive locomotive in Train.Cars.OfType<MSTSDieselLocomotive>().Where((MSTSLocomotive locomotive) => { return locomotive.AcceptMUSignals; }))
282+
{
283+
if (locomotive == Simulator.PlayerLocomotive)
284+
{
285+
foreach (DieselEngine dieselEngine in locomotive.DieselEngines.DEList.Where(de => de != locomotive.DieselEngines[0]))
286+
{
287+
if (dieselEngine.State > state)
288+
state = dieselEngine.State;
289+
}
290+
}
291+
else
292+
{
293+
foreach (DieselEngine dieselEngine in locomotive.DieselEngines)
294+
{
295+
if (dieselEngine.State > state)
296+
state = dieselEngine.State;
297+
}
298+
}
299+
}
300+
301+
return state;
302+
};
277303
AbstractScript.CurrentDynamicBrakeAvailability = () => DynamicBrakeAvailable;
304+
AbstractScript.ThrottlePercent = () => Locomotive.ThrottlePercent;
278305
AbstractScript.PowerOnDelayS = () => PowerOnDelayS;
279306
AbstractScript.AuxPowerOnDelayS = () => AuxPowerOnDelayS;
280307
AbstractScript.BatterySwitchOn = () => BatterySwitch.On;
@@ -349,6 +376,41 @@ protected virtual void AssignScriptFunctions()
349376
}
350377
}
351378
};
379+
AbstractScript.SignalEventToHelperEngines = (evt) =>
380+
{
381+
bool helperFound = false; //this avoids that locomotive engines toggle in opposite directions
382+
383+
foreach (MSTSDieselLocomotive locomotive in Train.Cars.OfType<MSTSDieselLocomotive>().Where((MSTSLocomotive locomotive) => { return locomotive.AcceptMUSignals; }))
384+
{
385+
if (locomotive == Simulator.PlayerLocomotive)
386+
{
387+
// Engine number 1 or above are helper engines
388+
for (int i = 1; i < locomotive.DieselEngines.Count; i++)
389+
{
390+
if (!helperFound)
391+
{
392+
helperFound = true;
393+
}
394+
395+
locomotive.DieselEngines.HandleEvent(evt);
396+
}
397+
}
398+
else
399+
{
400+
if (!helperFound)
401+
{
402+
helperFound = true;
403+
}
404+
405+
locomotive.DieselEngines.HandleEvent(evt);
406+
}
407+
}
408+
409+
if (helperFound && (evt == PowerSupplyEvent.StartEngine || evt == PowerSupplyEvent.StopEngine))
410+
{
411+
Simulator.Confirmer.Confirm(CabControl.HelperDiesel, evt == PowerSupplyEvent.StartEngine ? CabSetting.On : CabSetting.Off);
412+
}
413+
};
352414
}
353415
}
354416

0 commit comments

Comments
 (0)