Skip to content

Commit 4cad067

Browse files
authored
Merge pull request #893 from Roeterdink/SignalErrors
Signal errors
2 parents ffaeec0 + bf8876b commit 4cad067

File tree

3 files changed

+56
-24
lines changed

3 files changed

+56
-24
lines changed

Source/Orts.Formats.Msts/SignalScripts.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2115,6 +2115,7 @@ public SCRStatement(scrReadInfo Statement, IDictionary<string, uint> LocalFloats
21152115
// if only 1 part, it is a single function call without assignment
21162116

21172117
AssignType = SCRTermType.Invalid;
2118+
AssignParameter = -1; // preset assignparameter is not found
21182119

21192120
if (StatementParts.Length == 2)
21202121
{
@@ -2135,6 +2136,13 @@ public SCRStatement(scrReadInfo Statement, IDictionary<string, uint> LocalFloats
21352136
}
21362137
}
21372138

2139+
// check if parameter has been defined
2140+
if (AssignParameter < 0)
2141+
{
2142+
Trace.TraceInformation("Local variable {0} not defined for script {1}", assignPart, Statement.Scriptname);
2143+
AssignParameter = 0;
2144+
}
2145+
21382146
// Term part
21392147
// get positions of allowed operators
21402148

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

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -143,8 +143,7 @@ public void SH_process_script(SignalHead thisHead, SignalScripts.SCRScripts sign
143143
File.AppendAllText(dpe_fileLoc + @"printproc.txt", "\n\nSIGNAL : " + thisHead.TDBIndex.ToString() + "\n");
144144
File.AppendAllText(dpe_fileLoc + @"printproc.txt", "OBJECT : " + thisHead.mainSignal.thisRef.ToString() + "\n");
145145
File.AppendAllText(dpe_fileLoc + @"printproc.txt", "type : " + signalScript.scriptname + "\n");
146-
String fnstring = String.Copy(thisHead.mainSignal.signalRef.Simulator.SIGCFG.ORTSFunctionTypes[thisHead.ORTSsigFunctionIndex]);
147-
File.AppendAllText(dpr_fileLoc + @"printproc.txt", "fntype : " + thisHead.ORTSsigFunctionIndex + " = " + fnstring + "\n\n");
146+
File.AppendAllText(dpr_fileLoc + @"printproc.txt", "fntype : " + thisHead.SignalTypeName + " = " + thisHead.Function + "\n\n");
148147
}
149148
#endif
150149
#if DEBUG_PRINT_PROCESS
@@ -153,9 +152,7 @@ public void SH_process_script(SignalHead thisHead, SignalScripts.SCRScripts sign
153152
File.AppendAllText(dpr_fileLoc + @"printproc.txt", "\n\nSIGNAL : " + thisHead.TDBIndex.ToString() + "\n");
154153
File.AppendAllText(dpr_fileLoc + @"printproc.txt", "OBJECT : " + thisHead.mainSignal.thisRef.ToString() + "\n");
155154
File.AppendAllText(dpr_fileLoc + @"printproc.txt", "type : " + signalScript.scriptname + "\n");
156-
String fnstring = String.Copy(thisHead.mainSignal.signalRef.Simulator.SIGCFG.ORTSFunctionTypes[thisHead.ORTSsigFunctionIndex]);
157-
File.AppendAllText(dpr_fileLoc + @"printproc.txt", "fntype : " + thisHead.ORTSsigFunctionIndex + " = " + fnstring + "\n\n");
158-
155+
File.AppendAllText(dpr_fileLoc + @"printproc.txt", "fntype : " + thisHead.SignalTypeName + " = " + thisHead.Function + "\n\n");
159156
if (thisHead.mainSignal.localStorage.Count > 0)
160157
{
161158
File.AppendAllText(dpr_fileLoc + @"printproc.txt", "\n local storage : \n");
@@ -582,18 +579,18 @@ public int SH_function_value(SignalHead thisHead, SignalScripts.SCRScripts.SCRSt
582579
{
583580
File.AppendAllText(dpe_fileLoc + @"printproc.txt",
584581
" NEXT_SIG_LR : Located signal : " +
585-
thisHead.mainSignal.sigfound[parameter1_value].ToString() + "\n");
582+
thisHead.mainSignal.sigfound[function1].ToString() + "\n");
586583
}
587584
#endif
588585
#if DEBUG_PRINT_PROCESS
589586
if (TDB_debug_ref.Contains(thisHead.TDBIndex) || OBJ_debug_ref.Contains(thisHead.mainSignal.thisRef))
590587
{
591588
var sob = new StringBuilder();
592-
sob.AppendFormat(" NEXT_SIG_LR : Located signal : {0}", thisHead.mainSignal.sigfound[parameter1_value].ToString());
589+
sob.AppendFormat(" NEXT_SIG_LR : Located signal : {0}", thisHead.mainSignal.sigfound[function1].ToString());
593590

594-
if (thisHead.mainSignal.sigfound[parameter1_value] > 0)
591+
if (thisHead.mainSignal.sigfound[function1] > 0)
595592
{
596-
SignalObject otherSignal = thisHead.mainSignal.signalRef.SignalObjects[thisHead.mainSignal.sigfound[parameter1_value]];
593+
SignalObject otherSignal = thisHead.mainSignal.signalRef.SignalObjects[thisHead.mainSignal.sigfound[function1]];
597594
sob.AppendFormat(" (");
598595

599596
foreach (SignalHead otherHead in otherSignal.SignalHeads)
@@ -620,15 +617,15 @@ public int SH_function_value(SignalHead thisHead, SignalScripts.SCRScripts.SCRSt
620617
{
621618
File.AppendAllText(dpe_fileLoc + @"printproc.txt",
622619
" NEXT_SIG_MR : Located signal : " +
623-
thisHead.mainSignal.sigfound[parameter1_value].ToString() + "\n");
620+
thisHead.mainSignal.sigfound[function1].ToString() + "\n");
624621
}
625622
#endif
626623
#if DEBUG_PRINT_PROCESS
627624
if (TDB_debug_ref.Contains(thisHead.TDBIndex) || OBJ_debug_ref.Contains(thisHead.mainSignal.thisRef))
628625
{
629626
File.AppendAllText(dpr_fileLoc + @"printproc.txt",
630627
" NEXT_SIG_MR : Located signal : " +
631-
thisHead.mainSignal.sigfound[parameter1_value].ToString() + "\n");
628+
thisHead.mainSignal.sigfound[function1].ToString() + "\n");
632629
}
633630
#endif
634631
break;
@@ -657,7 +654,7 @@ public int SH_function_value(SignalHead thisHead, SignalScripts.SCRScripts.SCRSt
657654
if (thisHead.mainSignal.enabledTrain != null)
658655
{
659656
SignalObject foundSignal = null;
660-
int dummy = (int)thisHead.opp_sig_lr(parameter1_value, ref foundSignal);
657+
int dummy = (int)thisHead.opp_sig_lr(function1, ref foundSignal);
661658
int foundRef = foundSignal != null ? foundSignal.thisRef : -1;
662659
File.AppendAllText(dpe_fileLoc + @"printproc.txt",
663660
" OPP_SIG_LR : Located signal : " + foundRef.ToString() + "\n");
@@ -667,7 +664,7 @@ public int SH_function_value(SignalHead thisHead, SignalScripts.SCRScripts.SCRSt
667664
if (TDB_debug_ref.Contains(thisHead.TDBIndex) || OBJ_debug_ref.Contains(thisHead.mainSignal.thisRef))
668665
{
669666
SignalObject foundSignal = null;
670-
int dummy = (int)thisHead.opp_sig_lr(parameter1_value, ref foundSignal);
667+
int dummy = (int)thisHead.opp_sig_lr(function1, ref foundSignal);
671668
int foundRef = foundSignal != null ? foundSignal.thisRef : -1;
672669
File.AppendAllText(dpr_fileLoc + @"printproc.txt",
673670
" OPP_SIG_LR : Located signal : " + foundRef.ToString() + "\n");
@@ -1332,19 +1329,19 @@ public int SH_function_value(SignalHead thisHead, SignalScripts.SCRScripts.SCRSt
13321329
{
13331330
File.AppendAllText(dpe_fileLoc + @"printproc.txt",
13341331
" NEXT_SIG_LVAR : Located signal : " +
1335-
thisHead.mainSignal.sigfound[parameter1_value].ToString() + "\n");
1332+
thisHead.mainSignal.sigfound[function1].ToString() + "\n");
13361333
File.AppendAllText(dpe_fileLoc + @"printproc.txt", " returned value : " + return_value + "\n");
13371334
}
13381335
#endif
13391336
#if DEBUG_PRINT_PROCESS
13401337
if (TDB_debug_ref.Contains(thisHead.TDBIndex) || OBJ_debug_ref.Contains(thisHead.mainSignal.thisRef))
13411338
{
13421339
var sob = new StringBuilder();
1343-
sob.AppendFormat(" NEXT_SIG_LVAR : Located signal : {0}", thisHead.mainSignal.sigfound[parameter1_value].ToString());
1340+
sob.AppendFormat(" NEXT_SIG_LVAR : Located signal : {0}", thisHead.mainSignal.sigfound[function1].ToString());
13441341

1345-
if (thisHead.mainSignal.sigfound[parameter1_value] > 0)
1342+
if (thisHead.mainSignal.sigfound[function1] > 0)
13461343
{
1347-
SignalObject otherSignal = thisHead.mainSignal.signalRef.SignalObjects[thisHead.mainSignal.sigfound[parameter1_value]];
1344+
SignalObject otherSignal = thisHead.mainSignal.signalRef.SignalObjects[thisHead.mainSignal.sigfound[function1]];
13481345
sob.AppendFormat(" (");
13491346

13501347
foreach (SignalHead otherHead in otherSignal.SignalHeads)

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

Lines changed: 34 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3905,33 +3905,60 @@ public int FindReqNormalSignal(int req_value, string dumpfile)
39053905
{
39063906
int foundSignal = -1;
39073907

3908-
// signal not enabled - no route available
3909-
if (enabledTrain == null)
3908+
Train.TrainRouted acttrain = enabledTrain;
3909+
int reqTC = isSignalNormal() ? TCNextTC : TCReference; // for normal signals, use section beyond signal; for not-normal, use signal section as TCNextTC is not set
3910+
3911+
// not normal signals may not have enabled train - check for train at next normal signal (use section ahead of signal in this case)
3912+
// note - next normal signal may not have the correct normal subtype, so proper search is still required
3913+
if (enabledTrain == null && !isSignalNormal())
39103914
{
3915+
int nextSignalIdent = SONextSignal(SignalFunction.NORMAL);
3916+
39113917
if (!String.IsNullOrEmpty(dumpfile))
39123918
{
39133919
var sob = new StringBuilder();
3914-
sob.Append("FIND_REQ_NORMAL_SIGNAL : not found : signal is not enabled");
3920+
sob.AppendFormat("FIND_REQ_NORMAL_SIGNAL : using next normal signal for not enabled none-normal signal, found {0} \n", nextSignalIdent);
3921+
File.AppendAllText(dumpfile, sob.ToString());
3922+
}
3923+
3924+
if (nextSignalIdent >= 0)
3925+
{
3926+
SignalObject nextSignal = signalObjects[nextSignalIdent];
3927+
acttrain = nextSignal.enabledTrain;
3928+
reqTC = TCReference;
3929+
}
3930+
}
3931+
3932+
// no train found - no route available
3933+
if (acttrain == null || acttrain.Train.ValidRoute[acttrain.TrainRouteDirectionIndex] == null)
3934+
{
3935+
if (!String.IsNullOrEmpty(dumpfile))
3936+
{
3937+
var sob = new StringBuilder();
3938+
sob.Append("FIND_REQ_NORMAL_SIGNAL : not found : signal is not enabled or train has no valid route\n");
39153939
File.AppendAllText(dumpfile, sob.ToString());
39163940
}
39173941
}
39183942
else
39193943
{
3920-
int startIndex = enabledTrain.Train.ValidRoute[enabledTrain.TrainRouteDirectionIndex].GetRouteIndex(TCNextTC, enabledTrain.Train.PresentPosition[0].RouteListIndex);
3944+
int startIndex = acttrain.Train.ValidRoute[acttrain.TrainRouteDirectionIndex].GetRouteIndex(reqTC, acttrain.Train.PresentPosition[0].RouteListIndex);
3945+
3946+
// this signal is not on trains route
39213947
if (startIndex < 0)
39223948
{
39233949
if (!String.IsNullOrEmpty(dumpfile))
39243950
{
39253951
var sob = new StringBuilder();
3926-
sob.AppendFormat("FIND_REQ_NORMAL_SIGNAL : not found : cannot find signal {0} at section {1} in path of train {2}\n", thisRef, TCNextTC, enabledTrain.Train.Name);
3952+
sob.AppendFormat("FIND_REQ_NORMAL_SIGNAL : not found : cannot find signal {0} at section {1} in path of train {2}\n", thisRef, TCNextTC, acttrain.Train.Name);
39273953
File.AppendAllText(dumpfile, sob.ToString());
39283954
}
39293955
}
39303956
else
39313957
{
3932-
for (int iRouteIndex = startIndex; iRouteIndex < enabledTrain.Train.ValidRoute[enabledTrain.TrainRouteDirectionIndex].Count; iRouteIndex++)
3958+
// search through train route until required signal type is found, or until end of route
3959+
for (int iRouteIndex = startIndex; iRouteIndex < acttrain.Train.ValidRoute[acttrain.TrainRouteDirectionIndex].Count; iRouteIndex++)
39333960
{
3934-
Train.TCRouteElement thisElement = enabledTrain.Train.ValidRoute[enabledTrain.TrainRouteDirectionIndex][iRouteIndex];
3961+
Train.TCRouteElement thisElement = acttrain.Train.ValidRoute[acttrain.TrainRouteDirectionIndex][iRouteIndex];
39353962
TrackCircuitSection thisSection = signalRef.TrackCircuitList[thisElement.TCSectionIndex];
39363963
if (thisSection.EndSignals[thisElement.Direction] != null)
39373964
{

0 commit comments

Comments
 (0)