Train stop
parent
b32c1aafeb
commit
3aae76416c
|
@ -1,10 +1,125 @@
|
||||||
using System;
|
using System;
|
||||||
|
using OpenBveApi.Runtime;
|
||||||
|
|
||||||
namespace OpenbveFcmbTrainPlugin
|
namespace OpenbveFcmbTrainPlugin
|
||||||
{
|
{
|
||||||
/// <summary>A train stop device to stop the train if a stop signal is passed.</summary>
|
/// <summary>A train stop device to stop the train if a stop signal is passed.</summary>
|
||||||
internal class TrainStop : Device
|
internal class TrainStop : Device
|
||||||
{
|
{
|
||||||
|
/// <summary>Represents the state of the device.</summary>
|
||||||
|
private enum DeviceStates
|
||||||
|
{
|
||||||
|
/// <summary>The device is inactive.</summary>
|
||||||
|
Inactive,
|
||||||
|
/// <summary>The device is active.</summary>
|
||||||
|
Active,
|
||||||
|
/// <summary>The device is in emergency state.</summary>
|
||||||
|
Emergency,
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>The current state of the device.</summary>
|
||||||
|
private DeviceStates DeviceState;
|
||||||
|
|
||||||
|
/// <summary>Is called when the device state should be updated.</summary>
|
||||||
|
/// <param name="train">The current train.</param>
|
||||||
|
/// <param name="route">The current route.</param>
|
||||||
|
/// <param name="init">Whether the device should initialize.</param>
|
||||||
|
/// <param name="elapsedTime">The time elapsed since the previous call.</param>
|
||||||
|
internal override void Update(Train train, Route route, bool init, Time elapsedTime)
|
||||||
|
{
|
||||||
|
if (init)
|
||||||
|
{
|
||||||
|
// Activate the device during initialization
|
||||||
|
DeviceState = DeviceStates.Active;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (train.VigilanceOverride)
|
||||||
|
{
|
||||||
|
// If the train requires a vigilance override, deactivate the device
|
||||||
|
DeviceState = DeviceStates.Inactive;
|
||||||
|
}
|
||||||
|
else if (DeviceState != DeviceStates.Emergency)
|
||||||
|
{
|
||||||
|
// Activate the device if there is no emergency
|
||||||
|
DeviceState = DeviceStates.Active;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (DeviceState)
|
||||||
|
{
|
||||||
|
case DeviceStates.Emergency:
|
||||||
|
// Emergency stop required, potential SPAD
|
||||||
|
RequestedBrakeNotch = train.Specs.BrakeNotches + 1;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
RequestedBrakeNotch = -1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>Is called when the state of a key changes.</summary>
|
||||||
|
/// <param name="key">The key.</param>
|
||||||
|
/// <param name="pressed">Whether the key is pressed or released.</param>
|
||||||
|
/// <param name="train">The current train.</param>
|
||||||
|
internal override void KeyChange(VirtualKeys key, bool pressed, Train train)
|
||||||
|
{
|
||||||
|
if (pressed)
|
||||||
|
{
|
||||||
|
switch (key)
|
||||||
|
{
|
||||||
|
case VirtualKeys.C2:
|
||||||
|
// Reset the train stop device
|
||||||
|
if (!OpenbveFcmbTrainPlugin.KeysPressed[(int)key])
|
||||||
|
{
|
||||||
|
// Reset only possible with train stopped
|
||||||
|
if (train.State.Speed.KilometersPerHour < 0.05)
|
||||||
|
{
|
||||||
|
if (DeviceState == DeviceStates.Emergency)
|
||||||
|
{
|
||||||
|
DeviceState = DeviceStates.Active;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>Is called when a beacon is passed.</summary>
|
||||||
|
/// <param name="beacon">The beacon data.</param>
|
||||||
|
internal override void SetBeacon(BeaconData beacon)
|
||||||
|
{
|
||||||
|
switch (beacon.Type)
|
||||||
|
{
|
||||||
|
// Accidental departure beacon/transponder
|
||||||
|
case 2:
|
||||||
|
// Check if there is a potential SPAD and change to emergency mode
|
||||||
|
if (beacon.Signal.Aspect == 0)
|
||||||
|
{
|
||||||
|
if (DeviceState == DeviceStates.Active)
|
||||||
|
{
|
||||||
|
DeviceState = DeviceStates.Emergency;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>Is called when the device should perform the AI.</summary>
|
||||||
|
/// <param name="data">The AI data.</param>
|
||||||
|
/// <param name="train">The current train.</param>
|
||||||
|
/// <param name="route">The current route.</param>
|
||||||
|
internal override void PerformAI(AIData data, Train train, Route route)
|
||||||
|
{
|
||||||
|
// Reset device in case of emergency, once the train has stopped
|
||||||
|
if (DeviceState == DeviceStates.Emergency && train.State.Speed.KilometersPerHour < 0.05)
|
||||||
|
{
|
||||||
|
data.Handles.BrakeNotch = train.Specs.BrakeNotches;
|
||||||
|
KeyChange(VirtualKeys.C2, true, train);
|
||||||
|
data.Response = AIResponse.Long;
|
||||||
|
KeyChange(VirtualKeys.C2, false, train);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -137,7 +137,13 @@ namespace OpenbveFcmbTrainPlugin
|
||||||
|
|
||||||
/// <summary>Is called when a beacon is passed.</summary>
|
/// <summary>Is called when a beacon is passed.</summary>
|
||||||
/// <param name="beacon">The beacon data.</param>
|
/// <param name="beacon">The beacon data.</param>
|
||||||
internal void SetBeacon(BeaconData beacon) { }
|
internal void SetBeacon(BeaconData beacon)
|
||||||
|
{
|
||||||
|
foreach (Device dev in Devices)
|
||||||
|
{
|
||||||
|
dev.SetBeacon(beacon);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>Is called when the plugin should perform the AI.</summary>
|
/// <summary>Is called when the plugin should perform the AI.</summary>
|
||||||
/// <param name="data">The AI data.</param>
|
/// <param name="data">The AI data.</param>
|
||||||
|
|
Loading…
Reference in New Issue