diff --git a/src/Devices/AtcBombardier.cs b/src/Devices/AtcBombardier.cs index f988743..6bf3766 100644 --- a/src/Devices/AtcBombardier.cs +++ b/src/Devices/AtcBombardier.cs @@ -45,18 +45,6 @@ namespace OpenbveFcmbTrainPlugin /// The current state of the ATC control. private AtcControlStates AtcControlState; - /// Represents the state of the track. - private enum TrackStates - { - Unprotected, - Enable, - ATC, - Disable - } - - /// The current state of the track. - private TrackStates TrackState; - /// The time needed by the ATC device to initialize, in seconds. private double InitializationTime; @@ -372,30 +360,11 @@ namespace OpenbveFcmbTrainPlugin } } - /// Is called to inform about signals. - /// The signal data. - internal override void SetSignal(SignalData[] signal) - { - - } - /// Is called when a beacon is passed. /// The beacon data. internal override void SetBeacon(BeaconData beacon) { - int type = beacon.Type; - switch (type) - { - case -16777215: - { - if (!(beacon.Optional >= 0 & beacon.Optional <= 3)) - { - break; - } - TrackState = (TrackStates)beacon.Optional; - return; - } - } + } /// Is called when the device should perform the AI. diff --git a/src/Devices/AtcDimetronic.cs b/src/Devices/AtcDimetronic.cs deleted file mode 100644 index 3f834f8..0000000 --- a/src/Devices/AtcDimetronic.cs +++ /dev/null @@ -1,410 +0,0 @@ -using OpenBveApi.Runtime; - -namespace OpenbveFcmbTrainPlugin -{ - /// A device simulating ATC by Dimetronic. - internal class AtcDimetronic : Device - { - /// Represents the state of the device. - private enum DeviceStates - { - /// The device is being overriden. - Override, - /// The device has been initialized and no driving mode is selected. - NoMode, - /// The device is in YARD (M+25) driving mode. - YARD, - /// The device is in ATP (M+ATP) driving mode. - ATP, - /// The device is in ATO mode. - ATO, - } - - /// The current state of the device. - private DeviceStates DeviceState; - - /// Represents the state of the ATC control. - private enum AtcControlStates - { - /// The brakes are released. - Released, - /// The power is cut. - NoPower, - /// The emergency brake is applied. - BrakeEmergency, - } - - /// The current state of the ATC control. - private AtcControlStates AtcControlState; - - /// Represents the state of the track. - private enum TrackStates - { - Unprotected, - Enable, - ATC, - Disable - } - - /// The current state of the track. - private TrackStates TrackState; - - /// The maximum speed in YARD mode, in km/h. - private double YardMaximumSpeed; - - /// Represents an ATC speed code. - private class SpeedCode - { - internal Speed CurrentLimit { get; private set; } - internal Speed WarningOn { get; private set; } - internal Speed WarningOff { get; private set; } - internal Speed TargetLimit { get; private set; } - - internal SpeedCode(Speed limit, Speed target) - { - CurrentLimit = limit; - TargetLimit = target; - if (limit == target) - { - // Constant speed - WarningOn = new Speed(limit.MetersPerSecond - 3 / 3.6); - WarningOff = new Speed(limit.MetersPerSecond - 5 / 3.6); - } - else - { - // Reduce speed - WarningOn = target; - WarningOff = new Speed(target.MetersPerSecond - 2 / 3.6); - } - } - } - - /// The current speed code received by the train. - private SpeedCode CurrentSpeedCode; - - /// The ideal power notch for the AI. - private int AiPowerNotch; - - /// The ideal brake notch for the AI. - private int AiBrakeNotch; - - /// Creates an instance of the Bombardier ATC device. - /// The maximum speed in YARD mode, in km/h. - internal AtcDimetronic(double yardMaxSpeed) - { - YardMaximumSpeed = yardMaxSpeed; - } - - /// Is called when the device state should be updated. - /// The current train. - /// The current route. - /// Whether the device should initialize. - /// The time elapsed since the previous call. - internal override void Update(Train train, Route route, bool init, Time elapsedTime) - { - if (init) - { - // Initialize device on start - DeviceState = DeviceStates.NoMode; - } - - // Update ATC movement permission - UpdateSpeedCode(); - - double speed = train.State.Speed.KilometersPerHour; - bool stopped = speed < 0.05; - - // Speed limit enforcement - if (DeviceState == DeviceStates.YARD || DeviceState == DeviceStates.ATP || DeviceState == DeviceStates.ATO) - { - if (AtcControlState == AtcControlStates.Released && speed > CurrentSpeedCode.WarningOn.KilometersPerHour) - { - // Cut power above warning on threshold - AtcControlState = AtcControlStates.NoPower; - } - if (AtcControlState == AtcControlStates.NoPower && speed < CurrentSpeedCode.WarningOff.KilometersPerHour) - { - // Stop cutting power below warning off threshold - AtcControlState = AtcControlStates.Released; - } - if (speed > CurrentSpeedCode.CurrentLimit.KilometersPerHour) - { - // Unselect driving mode to apply emergency brake if overspeeding - DeviceState = DeviceStates.NoMode; - } - } - - // Brake application - switch (AtcControlState) - { - case AtcControlStates.Released: - RequestedBrakeNotch = -1; - RequestedPowerNotch = -1; - break; - case AtcControlStates.NoPower: - RequestedBrakeNotch = -1; - RequestedPowerNotch = 0; - break; - case AtcControlStates.BrakeEmergency: - RequestedBrakeNotch = train.Specs.BrakeNotches + 1; - RequestedPowerNotch = 0; - break; - } - - switch (DeviceState) - { - // ATC device is disabled (also called "Special Mode") - case DeviceStates.Override: - train.ContinuousProtection = false; - train.VigilanceOverride = false; - // Release control of the brakes and power - AtcControlState = AtcControlStates.Released; - break; - // ATC device is initialized and a driving mode is required - case DeviceStates.NoMode: - train.ContinuousProtection = false; - train.VigilanceOverride = false; - // Apply service/emergency brake while no driving mode is selected - AtcControlState = AtcControlStates.BrakeEmergency; - // ATC movement permission - CurrentSpeedCode = new SpeedCode(new Speed(0), new Speed(0)); - break; - // ATC device is in YARD (M+25) driving mode - case DeviceStates.YARD: - train.ContinuousProtection = false; - train.VigilanceOverride = false; - // Apply brake if any door opens - if (train.DoorState != DoorStates.None) - { - RequestedBrakeNotch = stopped ? train.Specs.BrakeNotches + 1 : train.ServiceBrakeNotch; - } - // If the train is not moving, brakes are released - if (stopped) - { - AtcControlState = AtcControlStates.Released; - } - break; - // ATC device is in ATP (M+ATP) driving mode - case DeviceStates.ATP: - train.ContinuousProtection = true; - train.VigilanceOverride = false; - break; - // ATC device is in ATO driving mode - case DeviceStates.ATO: - train.ContinuousProtection = true; - train.VigilanceOverride = true; - break; - } - - // Panel indicators - train.Panel[25] = DeviceState == DeviceStates.Override ? 1 : 0; - train.Panel[26] = DeviceState == DeviceStates.YARD ? 1 : 0; - train.Panel[27] = DeviceState == DeviceStates.ATP ? 1 : 0; - train.Panel[34] = (int)CurrentSpeedCode.CurrentLimit.KilometersPerHour * 1000; - } - - - /// Is called when the state of a key changes. - /// The key. - /// Whether the key is pressed or released. - /// The current train. - internal override void KeyChange(VirtualKeys key, bool pressed, Train train) - { - double speed = train.State.Speed.KilometersPerHour; - bool stopped = speed < 0.05; - - if (pressed) - { - switch (key) - { - case VirtualKeys.I: - // YARD (M+25) mode selection button - if (!OpenbveFcmbTrainPlugin.KeysPressed[(int)key]) - { - if (DeviceState == DeviceStates.NoMode && stopped) - { - DeviceState = DeviceStates.YARD; - } - } - break; - case VirtualKeys.J: - // ATP (M+ATP) mode selection button - if (!OpenbveFcmbTrainPlugin.KeysPressed[(int)key]) - { - } - break; - case VirtualKeys.K: - // ATO mode selection button - if (!OpenbveFcmbTrainPlugin.KeysPressed[(int)key]) - { - } - break; - case VirtualKeys.L: - // ATO start button - if (!OpenbveFcmbTrainPlugin.KeysPressed[(int)key]) - { - } - break; - case VirtualKeys.B1: - // ATC alarm acknowledge - if (!OpenbveFcmbTrainPlugin.KeysPressed[(int)key]) - { - } - break; - case VirtualKeys.C1: - // Override toggle - if (!OpenbveFcmbTrainPlugin.KeysPressed[(int)key]) - { - switch (DeviceState) - { - case DeviceStates.NoMode: - case DeviceStates.YARD: - // Override device if possible - if (stopped && train.PhysicalHandles.PowerNotch == 0) - { - DeviceState = DeviceStates.Override; - } - break; - case DeviceStates.Override: - // Disable override if possible - if (stopped && train.PhysicalHandles.PowerNotch == 0) - { - DeviceState = DeviceStates.NoMode; - } - break; - } - } - break; - } - } - } - - /// Is called to inform about signals. - /// The signal data. - internal override void SetSignal(SignalData[] signal) - { - - } - - /// Is called when a beacon is passed. - /// The beacon data. - internal override void SetBeacon(BeaconData beacon) - { - int type = beacon.Type; - switch (type) - { - case -16777215: - { - if (!(beacon.Optional >= 0 & beacon.Optional <= 3)) - { - break; - } - TrackState = (TrackStates)beacon.Optional; - return; - } - } - } - - /// Is called when the device should perform the AI. - /// The AI data. - /// The current train. - /// The current route. - internal override void PerformAI(AIData data, Train train, Route route) - { - // Set AI notches to what the AI is doing right now - AiBrakeNotch = data.Handles.BrakeNotch; - AiPowerNotch = data.Handles.PowerNotch; - - double speed = train.State.Speed.KilometersPerHour; - bool stopped = speed < 0.05; - - switch (DeviceState) - { - case DeviceStates.NoMode: - // Apply brake - data.Handles.BrakeNotch = train.Specs.BrakeNotches; - data.Response = AIResponse.Short; - // If the train is stopped, select YARD (M+25) mode - if (stopped) - { - KeyChange(VirtualKeys.I, true, train); - data.Response = AIResponse.Short; - KeyChange(VirtualKeys.I, false, train); - } - break; - case DeviceStates.YARD: - case DeviceStates.ATP: - // Calculate ideal notch for AI when approaching the speed limit - if (speed > CurrentSpeedCode.WarningOn.KilometersPerHour - 2 && train.Acceleration > 0.1) - { - if (data.Handles.PowerNotch > 0) - { - AiPowerNotch -= 1; - } - else if (train.Specs.HasHoldBrake) - { - data.Handles.HoldBrake = true; - } - else - { - AiBrakeNotch += 1; - } - } - else if (speed < CurrentSpeedCode.WarningOff.KilometersPerHour - 2 && train.Acceleration < 0.25) - { - if (data.Handles.BrakeNotch > 0) - { - AiBrakeNotch -= 1; - } - else - { - AiPowerNotch += 1; - } - } - // If still far from next station, take control of AI handles - if (speed / (route.CurrentStation.StopPosition - train.State.Location) < 0.2) - { - if (speed > CurrentSpeedCode.CurrentLimit.KilometersPerHour - 5) - { - data.Handles.PowerNotch = AiPowerNotch; - data.Handles.BrakeNotch = AiBrakeNotch; - data.Response = AIResponse.Medium; - } - } - break; - } - } - - /// Updates the data for the current speed code. - internal void UpdateSpeedCode() - { - Speed zero = new Speed(0); - Speed yard = new Speed(YardMaximumSpeed / 3.6); - - switch (DeviceState) - { - case DeviceStates.Override: - case DeviceStates.NoMode: - if (CurrentSpeedCode == null || CurrentSpeedCode.CurrentLimit != zero || CurrentSpeedCode.TargetLimit != zero) - { - CurrentSpeedCode = new SpeedCode(zero, zero); - } - break; - case DeviceStates.YARD: - if (CurrentSpeedCode == null || CurrentSpeedCode.CurrentLimit != yard || CurrentSpeedCode.TargetLimit != yard) - { - CurrentSpeedCode = new SpeedCode(yard, yard); - } - break; - case DeviceStates.ATP: - case DeviceStates.ATO: - if (CurrentSpeedCode == null || CurrentSpeedCode.CurrentLimit != zero || CurrentSpeedCode.TargetLimit != zero) - { - CurrentSpeedCode = new SpeedCode(zero, zero); - } - break; - } - } - - } -} diff --git a/src/OpenbveFcmbTrainPlugin.cs b/src/OpenbveFcmbTrainPlugin.cs index 218f572..a0ded43 100644 --- a/src/OpenbveFcmbTrainPlugin.cs +++ b/src/OpenbveFcmbTrainPlugin.cs @@ -118,7 +118,6 @@ namespace OpenbveFcmbTrainPlugin /// The signal array is guaranteed to have at least one element. When accessing elements other than index 0, you must check the bounds of the array first. public void SetSignal(SignalData[] signal) { - Train.SetSignal(signal); } /// Is called when the train passes a beacon. diff --git a/src/OpenbveFcmbTrainPlugin.csproj b/src/OpenbveFcmbTrainPlugin.csproj index b9f9dea..c15573a 100644 --- a/src/OpenbveFcmbTrainPlugin.csproj +++ b/src/OpenbveFcmbTrainPlugin.csproj @@ -45,7 +45,6 @@ - diff --git a/src/Train/Train.cs b/src/Train/Train.cs index 08f4560..1809cf7 100644 --- a/src/Train/Train.cs +++ b/src/Train/Train.cs @@ -69,8 +69,7 @@ namespace OpenbveFcmbTrainPlugin Devices.Add(new Doors(false, 5, 15, 10)); Devices.Add(new Deadman(5.0, false)); Devices.Add(new TrainStop()); - //Devices.Add(new AtcBombardier(30, 60, 20, 500)); - Devices.Add(new AtcDimetronic(25)); + Devices.Add(new AtcBombardier(30, 60, 20, 500)); } /// Is called when the train should initialize. @@ -184,13 +183,7 @@ namespace OpenbveFcmbTrainPlugin /// Is called to inform about signals. /// The signal data. - internal void SetSignal(SignalData[] signal) - { - foreach (Device dev in Devices) - { - dev.SetSignal(signal); - } - } + internal void SetSignal(SignalData[] signal) { } /// Is called when a beacon is passed. /// The beacon data.