Skip to content

Commit 1d15fa0

Browse files
authored
Merge pull request #525 from Sharpe49/tcs-extensions
TCS extensions
2 parents dece9b3 + 614b222 commit 1d15fa0

File tree

3 files changed

+67
-22
lines changed

3 files changed

+67
-22
lines changed

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

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,10 @@ public abstract class TrainControlSystem : AbstractTrainScriptClass
225225
/// </summary>
226226
public Func<float> ThrottlePercent;
227227
/// <summary>
228+
/// Returns maximum throttle percent
229+
/// </summary>
230+
public Func<float> MaxThrottlePercent;
231+
/// <summary>
228232
/// Returns dynamic brake percent
229233
/// </summary>
230234
public Func<float> DynamicBrakePercent;
@@ -367,6 +371,11 @@ public abstract class TrainControlSystem : AbstractTrainScriptClass
367371
/// </summary>
368372
public Action<bool> SetTractionAuthorization;
369373
/// <summary>
374+
/// Set the maximum throttle percent
375+
/// Range: 0 to 100
376+
/// </summary>
377+
public Action<float> SetMaxThrottlePercent;
378+
/// <summary>
370379
/// Switch vigilance alarm sound on (true) or off (false).
371380
/// </summary>
372381
public Action<bool> SetVigilanceAlarm;
@@ -688,16 +697,20 @@ public enum MonitoringStatus
688697
public struct SignalFeatures
689698
{
690699
public readonly string MainHeadSignalTypeName;
700+
public readonly string SignalTypeName;
691701
public readonly Aspect Aspect;
702+
public readonly string DrawStateName;
692703
public readonly float DistanceM;
693704
public readonly float SpeedLimitMpS;
694705
public readonly float AltitudeM;
695706
public readonly string TextAspect;
696707

697-
public SignalFeatures(string mainHeadSignalTypeName, Aspect aspect, float distanceM, float speedLimitMpS, float altitudeM, string textAspect = "")
708+
public SignalFeatures(string mainHeadSignalTypeName, string signalTypeName, Aspect aspect, string drawStateName, float distanceM, float speedLimitMpS, float altitudeM, string textAspect = "")
698709
{
699710
MainHeadSignalTypeName = mainHeadSignalTypeName;
711+
SignalTypeName = signalTypeName;
700712
Aspect = aspect;
713+
DrawStateName = drawStateName;
701714
DistanceM = distanceM;
702715
SpeedLimitMpS = speedLimitMpS;
703716
AltitudeM = altitudeM;

Source/Orts.Simulation/Simulation/RollingStocks/SubSystems/TrainControlSystem.cs

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@ protected set
152152
public bool CircuitBreakerClosingOrder { get; private set; }
153153
public bool CircuitBreakerOpeningOrder { get; private set; }
154154
public bool TractionAuthorization { get; private set; }
155+
public float MaxThrottlePercent { get; private set; } = 100f;
155156
public bool FullDynamicBrakingOrder { get; private set; }
156157

157158
public float[] CabDisplayControls = new float[TCSCabviewControlCount];
@@ -348,7 +349,7 @@ public void Initialize()
348349
Script.PantographCount = () => Locomotive.Pantographs.Count;
349350
Script.GetPantographState = (pantoID) =>
350351
{
351-
if (pantoID >= Pantographs.MinPantoID && pantoID <= Pantographs.MaxPantoID)
352+
if (pantoID >= Pantographs.MinPantoID && pantoID <= Pantographs.MaxPantoID)
352353
{
353354
return Locomotive.Pantographs[pantoID].State;
354355
}
@@ -360,6 +361,7 @@ public void Initialize()
360361
};
361362
Script.ArePantographsDown = () => Locomotive.Pantographs.State == PantographState.Down;
362363
Script.ThrottlePercent = () => Locomotive.ThrottleController.CurrentValue * 100;
364+
Script.MaxThrottlePercent = () => MaxThrottlePercent;
363365
Script.DynamicBrakePercent = () => Locomotive.DynamicBrakeController == null ? 0 : Locomotive.DynamicBrakeController.CurrentValue * 100;
364366
Script.TractionAuthorization = () => TractionAuthorization;
365367
Script.BrakePipePressureBar = () => Locomotive.BrakeSystem != null ? Bar.FromPSI(Locomotive.BrakeSystem.BrakeLine1PressurePSI) : float.MaxValue;
@@ -456,6 +458,13 @@ public void Initialize()
456458
Script.SetCircuitBreakerClosingOrder = (value) => CircuitBreakerClosingOrder = value;
457459
Script.SetCircuitBreakerOpeningOrder = (value) => CircuitBreakerOpeningOrder = value;
458460
Script.SetTractionAuthorization = (value) => TractionAuthorization = value;
461+
Script.SetMaxThrottlePercent = (value) =>
462+
{
463+
if (value >= 0 && value <= 100f)
464+
{
465+
MaxThrottlePercent = value;
466+
}
467+
};
459468
Script.SetVigilanceAlarm = (value) => Locomotive.SignalEvent(value ? Event.VigilanceAlarmOn : Event.VigilanceAlarmOff);
460469
Script.SetHorn = (value) => Locomotive.TCSHorn = value;
461470
Script.TriggerSoundAlert1 = () => this.SignalEvent(Event.TrainControlSystemAlert1, Script);
@@ -599,10 +608,12 @@ T NextGenericSignalItem<T>(int itemSequenceIndex, ref T retval, float maxDistanc
599608
return retval;
600609
}
601610

602-
SignalFeatures NextGenericSignalFeatures(string signalTypeName, int itemSequenceIndex, float maxDistanceM, Train.TrainObjectItem.TRAINOBJECTTYPE type)
611+
SignalFeatures NextGenericSignalFeatures(string signalFunctionTypeName, int itemSequenceIndex, float maxDistanceM, Train.TrainObjectItem.TRAINOBJECTTYPE type)
603612
{
604613
var mainHeadSignalTypeName = "";
614+
var signalTypeName = "";
605615
var aspect = Aspect.None;
616+
var drawStateName = "";
606617
var distanceM = float.MaxValue;
607618
var speedLimitMpS = -1f;
608619
var altitudeM = float.MinValue;
@@ -615,7 +626,7 @@ SignalFeatures NextGenericSignalFeatures(string signalTypeName, int itemSequence
615626

616627
int index = dir == 0 ? Locomotive.Train.PresentPosition[dir].RouteListIndex :
617628
Locomotive.Train.ValidRoute[dir].GetRouteIndex(Locomotive.Train.PresentPosition[dir].TCSectionIndex, 0);
618-
int fn_type = Locomotive.Train.signalRef.ORTSSignalTypes.IndexOf(signalTypeName);
629+
int fn_type = Locomotive.Train.signalRef.ORTSSignalTypes.IndexOf(signalFunctionTypeName);
619630
if (index < 0)
620631
goto Exit;
621632
if (type == Train.TrainObjectItem.TRAINOBJECTTYPE.SIGNAL)
@@ -635,7 +646,7 @@ SignalFeatures NextGenericSignalFeatures(string signalTypeName, int itemSequence
635646
// All OK, we can retrieve the data for the required signal;
636647
distanceM = trainSignal.DistanceToTrainM;
637648
mainHeadSignalTypeName = trainSignal.SignalObject.SignalHeads[0].SignalTypeName;
638-
if (signalTypeName == "NORMAL")
649+
if (signalFunctionTypeName == "NORMAL")
639650
{
640651
aspect = (Aspect)trainSignal.SignalState;
641652
speedLimitMpS = trainSignal.AllowedSpeedMpS;
@@ -645,7 +656,13 @@ SignalFeatures NextGenericSignalFeatures(string signalTypeName, int itemSequence
645656
{
646657
aspect = (Aspect)Locomotive.Train.signalRef.TranslateToTCSAspect(trainSignal.SignalObject.this_sig_lr(fn_type));
647658
}
659+
648660
var functionHead = trainSignal.SignalObject.SignalHeads.Find(head => head.ORTSsigFunctionIndex == fn_type);
661+
signalTypeName = functionHead.SignalTypeName;
662+
if (functionHead.draw_state >= 0)
663+
{
664+
drawStateName = functionHead.signalType.DrawStates.First(d => d.Value.Index == functionHead.draw_state).Value.Name;
665+
}
649666
textAspect = functionHead?.TextSignalAspect ?? "";
650667
}
651668
else if (type == Train.TrainObjectItem.TRAINOBJECTTYPE.SPEEDPOST)
@@ -663,7 +680,7 @@ SignalFeatures NextGenericSignalFeatures(string signalTypeName, int itemSequence
663680
}
664681

665682
Exit:
666-
return new SignalFeatures(mainHeadSignalTypeName: mainHeadSignalTypeName, aspect: aspect, distanceM: distanceM, speedLimitMpS: speedLimitMpS,
683+
return new SignalFeatures(mainHeadSignalTypeName: mainHeadSignalTypeName, signalTypeName: signalTypeName, aspect: aspect, drawStateName: drawStateName, distanceM: distanceM, speedLimitMpS: speedLimitMpS,
667684
altitudeM: altitudeM, textAspect: textAspect);
668685
}
669686

Source/Orts.Simulation/Simulation/RollingStocks/TrainCar.cs

Lines changed: 31 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -467,19 +467,29 @@ public float ThrottlePercent
467467
{
468468
if (RemoteControlGroup == 0 && Train != null)
469469
{
470-
if (Train.LeadLocomotive != null && !((MSTSLocomotive)Train.LeadLocomotive).TrainControlSystem.TractionAuthorization && Train.MUThrottlePercent > 0)
470+
if (Train.LeadLocomotive is MSTSLocomotive locomotive)
471471
{
472-
return 0;
473-
}
474-
else
475-
{
476-
return Train.MUThrottlePercent;
472+
if (!locomotive.TrainControlSystem.TractionAuthorization
473+
|| Train.MUThrottlePercent <= 0)
474+
{
475+
return 0;
476+
}
477+
else if (Train.MUThrottlePercent > locomotive.TrainControlSystem.MaxThrottlePercent)
478+
{
479+
return Math.Max(locomotive.TrainControlSystem.MaxThrottlePercent, 0);
480+
}
477481
}
482+
483+
return Train.MUThrottlePercent;
478484
}
479485
else if (RemoteControlGroup == 1 && Train != null)
486+
{
480487
return Train.DPThrottlePercent;
488+
}
481489
else
490+
{
482491
return LocalThrottlePercent;
492+
}
483493
}
484494
set
485495
{
@@ -514,21 +524,26 @@ public float DynamicBrakePercent
514524
{
515525
get
516526
{
517-
if (RemoteControlGroup >= 0 && Train != null)
527+
if (RemoteControlGroup == 0 && Train != null)
518528
{
519-
if (Train.LeadLocomotive != null && ((MSTSLocomotive) Train.LeadLocomotive).TrainControlSystem.FullDynamicBrakingOrder)
529+
if (Train.LeadLocomotive is MSTSLocomotive locomotive)
520530
{
521-
return 100;
522-
}
523-
else if (RemoteControlGroup == 1 && Train != null)
524-
return Train.DPDynamicBrakePercent;
525-
else
526-
{
527-
return Train.MUDynamicBrakePercent;
531+
if (locomotive.TrainControlSystem.FullDynamicBrakingOrder)
532+
{
533+
return 100;
534+
}
528535
}
529-
}
536+
537+
return Train.MUDynamicBrakePercent;
538+
}
539+
else if (RemoteControlGroup == 1 && Train != null)
540+
{
541+
return Train.DPDynamicBrakePercent;
542+
}
530543
else
544+
{
531545
return LocalDynamicBrakePercent;
546+
}
532547
}
533548
set
534549
{

0 commit comments

Comments
 (0)