Skip to content

Commit 1f5ba4c

Browse files
committed
Signal Function OPP_SIG_ID_TRAINPATH
1 parent ebafd5d commit 1f5ba4c

File tree

4 files changed

+96
-0
lines changed

4 files changed

+96
-0
lines changed

Source/Orts.Formats.Msts/SignalScripts.cs

+1
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ public enum SCRExternalFunctions
7878
NEXT_SIG_ID,
7979
NEXT_NSIG_ID,
8080
OPP_SIG_ID,
81+
OPP_SIG_ID_TRAINPATH,
8182
ID_SIG_ENABLED,
8283
ID_SIG_LR,
8384
SIG_FEATURE,

Source/Orts.Simulation/Simulation/Signalling/SIGSCRfile.cs

+37
Original file line numberDiff line numberDiff line change
@@ -861,6 +861,43 @@ public int SH_function_value(SignalHead thisHead, SignalScripts.SCRScripts.SCRSt
861861

862862
break;
863863

864+
// opp_sig_id_trainpath
865+
866+
case SignalScripts.SCRExternalFunctions.OPP_SIG_ID_TRAINPATH:
867+
return_value = (int)thisHead.opp_sig_id_trainpath(function1);
868+
#if DEBUG_PRINT_ENABLED
869+
if (thisHead.mainSignal.enabledTrain != null)
870+
{
871+
File.AppendAllText(dpe_fileLoc + @"printproc.txt",
872+
" OPP_SIG_LR : Located signal : " + return_value + "\n");
873+
}
874+
#endif
875+
#if DEBUG_PRINT_PROCESS
876+
if (TDB_debug_ref.Contains(thisHead.TDBIndex) || OBJ_debug_ref.Contains(thisHead.mainSignal.thisRef))
877+
{
878+
var sob = new StringBuilder();
879+
sob.AppendFormat(" OPP_SIG_LR : Located signal : {0}", return_value.ToString());
880+
881+
if (return_value > 0)
882+
{
883+
SignalObject otherSignal = thisHead.mainSignal.signalRef.SignalObjects[return_value];
884+
sob.AppendFormat(" (");
885+
886+
foreach (SignalHead otherHead in otherSignal.SignalHeads)
887+
{
888+
sob.AppendFormat(" {0} ", otherHead.TDBIndex);
889+
}
890+
891+
sob.AppendFormat(") ");
892+
}
893+
sob.AppendFormat("\n");
894+
895+
File.AppendAllText(dpr_fileLoc + @"printproc.txt", sob.ToString());
896+
}
897+
#endif
898+
899+
break;
900+
864901
// id_sig_enabled
865902

866903
case SignalScripts.SCRExternalFunctions.ID_SIG_ENABLED:

Source/Orts.Simulation/Simulation/Signalling/SignalHead.cs

+4
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,10 @@ public int opp_sig_id(SignalFunction function)
242242
{
243243
return mainSignal.opp_sig_id(function);
244244
}
245+
public int opp_sig_id_trainpath(SignalFunction function)
246+
{
247+
return mainSignal.opp_sig_id_trainpath(function);
248+
}
245249

246250
public MstsSignalAspect id_sig_lr(int sigId, SignalFunction function)
247251
{

Source/Orts.Simulation/Simulation/Signalling/SignalObject.cs

+54
Original file line numberDiff line numberDiff line change
@@ -1005,6 +1005,15 @@ public int opp_sig_id(SignalFunction function)
10051005
return SONextSignalOpp(function);
10061006
}
10071007

1008+
/// <summary>
1009+
/// opp_sig_id : returns ident of next opposite signal of required type
1010+
/// search using trainpath of enabled train
1011+
/// </summary>
1012+
public int opp_sig_id_trainpath(SignalFunction function)
1013+
{
1014+
return SONextSignalOppTrainpath(function);
1015+
}
1016+
10081017
/// <summary>
10091018
/// this_sig_noSpeedReduction : Returns the setting if speed must be reduced on RESTRICTED or STOP_AND_PROCEED
10101019
/// returns TRUE if speed reduction must be suppressed
@@ -1664,6 +1673,51 @@ public int SONextSignalOpp(SignalFunction function)
16641673
return signalFound;
16651674
}
16661675

1676+
/// <summary>
1677+
/// Find next signal in opp direction using path of enabled train
1678+
/// </summary>
1679+
public int SONextSignalOppTrainpath(SignalFunction function)
1680+
{
1681+
int signalFound = -1;
1682+
1683+
// if enabled train is set
1684+
if (enabledTrain != null)
1685+
{
1686+
var pathposindex = enabledTrain.Train.PresentPosition[1].RouteListIndex;
1687+
1688+
// get route index of signal
1689+
var signalindex = enabledTrain.Train.ValidRoute[enabledTrain.TrainRouteDirectionIndex].GetRouteIndex(TCReference, pathposindex);
1690+
1691+
while (signalFound < 0 && signalindex >= 0)
1692+
{
1693+
int tcindex = enabledTrain.Train.ValidRoute[enabledTrain.TrainRouteDirectionIndex][signalindex].TCSectionIndex;
1694+
int direction = enabledTrain.Train.ValidRoute[enabledTrain.TrainRouteDirectionIndex][signalindex].Direction;
1695+
TrackCircuitSection thisSection = signalRef.TrackCircuitList[tcindex];
1696+
1697+
// check if required type of signal is along this section
1698+
if (function == SignalFunction.NORMAL)
1699+
{
1700+
signalFound = thisSection.EndSignals[direction == 0 ? 1 : 0] != null ? thisSection.EndSignals[direction].thisRef : -1;
1701+
}
1702+
else
1703+
{
1704+
TrackCircuitSignalList thisListrev = thisSection.CircuitItems.TrackCircuitSignals[direction == 0 ? 1 : 0][function];
1705+
if (thisListrev.TrackCircuitItem.Count > 0)
1706+
{
1707+
signalFound = thisListrev.TrackCircuitItem[0].SignalRef.thisRef;
1708+
}
1709+
}
1710+
1711+
if (signalFound < 0)
1712+
{
1713+
signalindex -= 1;
1714+
}
1715+
}
1716+
}
1717+
1718+
return signalFound;
1719+
}
1720+
16671721
/// <summary>
16681722
/// Perform route check and state update
16691723
/// </summary>

0 commit comments

Comments
 (0)