ATC Dimetronic: Overspeed alarm
This commit is contained in:
parent
fa6235cfb2
commit
7f3388b24a
3 changed files with 37 additions and 5 deletions
|
@ -32,6 +32,8 @@ namespace OpenbveFcmbTrainPlugin
|
||||||
Released,
|
Released,
|
||||||
/// <summary>The power is cut.</summary>
|
/// <summary>The power is cut.</summary>
|
||||||
NoPower,
|
NoPower,
|
||||||
|
/// <summary>The power is cut and an alarm plays.</summary>
|
||||||
|
NoPowerAlarm,
|
||||||
/// <summary>The emergency brake is applied.</summary>
|
/// <summary>The emergency brake is applied.</summary>
|
||||||
BrakeEmergency,
|
BrakeEmergency,
|
||||||
}
|
}
|
||||||
|
@ -78,6 +80,9 @@ namespace OpenbveFcmbTrainPlugin
|
||||||
/// <summary>Whether ATO is available or not on the train.</summary>
|
/// <summary>Whether ATO is available or not on the train.</summary>
|
||||||
private readonly bool AtoAvailable;
|
private readonly bool AtoAvailable;
|
||||||
|
|
||||||
|
/// <summary>The index of the alarm sound.</summary>
|
||||||
|
private readonly int AlarmSoundIndex;
|
||||||
|
|
||||||
/// <summary>Represents an ATC speed code.</summary>
|
/// <summary>Represents an ATC speed code.</summary>
|
||||||
private class SpeedCode
|
private class SpeedCode
|
||||||
{
|
{
|
||||||
|
@ -190,14 +195,16 @@ namespace OpenbveFcmbTrainPlugin
|
||||||
/// <param name="runbackDistance">The distance after which the runback protection is triggered, in meters.</param>
|
/// <param name="runbackDistance">The distance after which the runback protection is triggered, in meters.</param>
|
||||||
/// <param name="rollforwardDistance">The distance after which the rollforward protection is triggered, in meters.</param>
|
/// <param name="rollforwardDistance">The distance after which the rollforward protection is triggered, in meters.</param>
|
||||||
/// <param name="signalCodes">The list of signal codes recognised by the device.</param>
|
/// <param name="signalCodes">The list of signal codes recognised by the device.</param>
|
||||||
|
/// <param name="alarmSoundIndex">The index of the alarm sound.</param>
|
||||||
/// <param name="atoAvailable">Whether ATO is available or not.</param>
|
/// <param name="atoAvailable">Whether ATO is available or not.</param>
|
||||||
internal AtcDimetronic(double trainLength, Speed yardMaxSpeed, double runbackDistance, double rollforwardDistance, List<SignalCode> signalCodes, bool atoAvailable)
|
internal AtcDimetronic(double trainLength, Speed yardMaxSpeed, double runbackDistance, double rollforwardDistance, List<SignalCode> signalCodes, int alarmSoundIndex, bool atoAvailable)
|
||||||
{
|
{
|
||||||
TrainLength = trainLength;
|
TrainLength = trainLength;
|
||||||
YardMaximumSpeed = yardMaxSpeed;
|
YardMaximumSpeed = yardMaxSpeed;
|
||||||
RunbackDistance = runbackDistance;
|
RunbackDistance = runbackDistance;
|
||||||
RollforwardDistance = rollforwardDistance;
|
RollforwardDistance = rollforwardDistance;
|
||||||
SignalCodes = signalCodes;
|
SignalCodes = signalCodes;
|
||||||
|
AlarmSoundIndex = alarmSoundIndex;
|
||||||
AtoAvailable = atoAvailable;
|
AtoAvailable = atoAvailable;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -228,10 +235,10 @@ namespace OpenbveFcmbTrainPlugin
|
||||||
// Speed limit enforcement
|
// Speed limit enforcement
|
||||||
if (AtcControlState == AtcControlStates.Released && speed > CurrentSpeedCode.WarningOn.KilometersPerHour)
|
if (AtcControlState == AtcControlStates.Released && speed > CurrentSpeedCode.WarningOn.KilometersPerHour)
|
||||||
{
|
{
|
||||||
// Cut power above warning on threshold
|
// Cut power above warning on threshold and play alarm
|
||||||
AtcControlState = AtcControlStates.NoPower;
|
AtcControlState = AtcControlStates.NoPowerAlarm;
|
||||||
}
|
}
|
||||||
if (AtcControlState == AtcControlStates.NoPower && speed < CurrentSpeedCode.WarningOff.KilometersPerHour)
|
if ((AtcControlState == AtcControlStates.NoPower || AtcControlState == AtcControlStates.NoPowerAlarm) && speed < CurrentSpeedCode.WarningOff.KilometersPerHour)
|
||||||
{
|
{
|
||||||
// Stop cutting power below warning off threshold
|
// Stop cutting power below warning off threshold
|
||||||
AtcControlState = AtcControlStates.Released;
|
AtcControlState = AtcControlStates.Released;
|
||||||
|
@ -281,6 +288,7 @@ namespace OpenbveFcmbTrainPlugin
|
||||||
RequestedPowerNotch = -1;
|
RequestedPowerNotch = -1;
|
||||||
break;
|
break;
|
||||||
case AtcControlStates.NoPower:
|
case AtcControlStates.NoPower:
|
||||||
|
case AtcControlStates.NoPowerAlarm:
|
||||||
RequestedBrakeNotch = -1;
|
RequestedBrakeNotch = -1;
|
||||||
RequestedPowerNotch = 0;
|
RequestedPowerNotch = 0;
|
||||||
break;
|
break;
|
||||||
|
@ -345,6 +353,17 @@ namespace OpenbveFcmbTrainPlugin
|
||||||
train.Panel[34] = (int)CurrentSpeedCode.CurrentLimit.KilometersPerHour * 1000;
|
train.Panel[34] = (int)CurrentSpeedCode.CurrentLimit.KilometersPerHour * 1000;
|
||||||
train.Panel[33] = 1;
|
train.Panel[33] = 1;
|
||||||
train.Panel[35] = (int)CurrentSpeedCode.TargetLimit.KilometersPerHour * 1000;
|
train.Panel[35] = (int)CurrentSpeedCode.TargetLimit.KilometersPerHour * 1000;
|
||||||
|
|
||||||
|
// Play alarm sound
|
||||||
|
if (AtcControlState == AtcControlStates.NoPowerAlarm)
|
||||||
|
{
|
||||||
|
SoundManager.Play(AlarmSoundIndex, 1.0, 1.0, true);
|
||||||
|
}
|
||||||
|
// Stop alarm sound
|
||||||
|
if (AtcControlState != AtcControlStates.NoPowerAlarm && SoundManager.Playing(AlarmSoundIndex))
|
||||||
|
{
|
||||||
|
SoundManager.Stop(AlarmSoundIndex);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -415,6 +434,10 @@ namespace OpenbveFcmbTrainPlugin
|
||||||
// ATC alarm acknowledge
|
// ATC alarm acknowledge
|
||||||
if (!OpenbveFcmbTrainPlugin.KeysPressed[(int)key])
|
if (!OpenbveFcmbTrainPlugin.KeysPressed[(int)key])
|
||||||
{
|
{
|
||||||
|
if (AtcControlState == AtcControlStates.NoPowerAlarm)
|
||||||
|
{
|
||||||
|
AtcControlState = AtcControlStates.NoPower;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case VirtualKeys.C1:
|
case VirtualKeys.C1:
|
||||||
|
|
|
@ -38,6 +38,7 @@ namespace OpenbveFcmbTrainPlugin
|
||||||
internal double AtcDimetronicRunbackDistance = 3;
|
internal double AtcDimetronicRunbackDistance = 3;
|
||||||
internal double AtcDimetronicRollforwardDistance = 100;
|
internal double AtcDimetronicRollforwardDistance = 100;
|
||||||
internal bool AtcDimetronicAtoAvailable;
|
internal bool AtcDimetronicAtoAvailable;
|
||||||
|
internal int AtcDimetronicAlarmSoundIndex = 11;
|
||||||
internal List<AtcDimetronic.SignalCode> AtcDimetronicSignalCodes = new List<AtcDimetronic.SignalCode>();
|
internal List<AtcDimetronic.SignalCode> AtcDimetronicSignalCodes = new List<AtcDimetronic.SignalCode>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -240,6 +241,14 @@ namespace OpenbveFcmbTrainPlugin
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case "alarmsoundindex":
|
||||||
|
{
|
||||||
|
if (int.TryParse(Value, out int a))
|
||||||
|
{
|
||||||
|
PluginSettings.AtcDimetronicAlarmSoundIndex = a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
case "atoavailable":
|
case "atoavailable":
|
||||||
PluginSettings.AtcDimetronicAtoAvailable = string.Compare(Value, "false", StringComparison.OrdinalIgnoreCase) != 0;
|
PluginSettings.AtcDimetronicAtoAvailable = string.Compare(Value, "false", StringComparison.OrdinalIgnoreCase) != 0;
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -98,7 +98,7 @@ namespace OpenbveFcmbTrainPlugin
|
||||||
}
|
}
|
||||||
if (settings.AtcDimetronicDeviceEnabled)
|
if (settings.AtcDimetronicDeviceEnabled)
|
||||||
{
|
{
|
||||||
Devices.Add(new AtcDimetronic(settings.TrainLength, settings.AtcDimetronicYardSpeedLimit, settings.AtcDimetronicRunbackDistance, settings.AtcDimetronicRollforwardDistance, settings.AtcDimetronicSignalCodes, settings.AtcDimetronicAtoAvailable));
|
Devices.Add(new AtcDimetronic(settings.TrainLength, settings.AtcDimetronicYardSpeedLimit, settings.AtcDimetronicRunbackDistance, settings.AtcDimetronicRollforwardDistance, settings.AtcDimetronicSignalCodes, settings.AtcDimetronicAlarmSoundIndex, settings.AtcDimetronicAtoAvailable));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue