Skip to content

Commit

Permalink
Automatic merge of T1.4-68-g723f722c7 and 9 pull requests
Browse files Browse the repository at this point in the history
- Pull request #510 at ca2494d: Add performance monitoring for diesel mechanic locomotives and new parameters
- Pull request #525 at b5ac1d2: Add SignalTypeName and DrawStateName to SignalFeatures
- Pull request #527 at 46567ee: Brake cuts power refactor and new parameters
- Pull request #531 at b2affac: Bug fix for https://bugs.launchpad.net/or/+bug/1950578 Dyn Brake setup state not disappearing in cab
- Pull request #533 at 62a1c27: fix for shapes hidden by animations( 0 )
- Pull request #534 at ba3f85a: deletes RunActivityLAA.* post-build
- Pull request #537 at 2fbbe40: C# signal script extensions
- Pull request #538 at c457f11: Delete binary paths if the ascii version or the tdb was modified. Blueprint: https://blueprints.launchpad.net/or/+spec/binary-timetable-paths
- Pull request #539 at fd04274: Correct starting tractive force of steam locomotive
  • Loading branch information
openrails-bot committed Nov 29, 2021
11 parents 564ee91 + 723f722 + ca2494d + b5ac1d2 + 46567ee + b2affac + 62a1c27 + ba3f85a + 2fbbe40 + c457f11 + fd04274 commit 2c77fad
Show file tree
Hide file tree
Showing 28 changed files with 12,509 additions and 13,036 deletions.
33 changes: 11 additions & 22 deletions Source/Orts.Simulation/MultiPlayer/Message.cs
Expand Up @@ -3531,6 +3531,7 @@ public class MSGSignalChange : Message
int index;
int pick;
string sender;

//constructor to create a message from signal data
public MSGSignalChange(SignalObject signal, int p)
{
Expand All @@ -3551,40 +3552,28 @@ public MSGSignalChange(string m)
//how to handle the message?
public override void HandleMsg() //only client will get message, thus will set states
{
if (MPManager.Server != null && !MPManager.Instance().aiderList.Contains(sender)) return; //client will ignore it, also if not an aider, will ignore it
if (MPManager.Server != null && !MPManager.Instance().aiderList.Contains(sender))
return; //client will ignore it, also if not an aider, will ignore it

var signal = MPManager.Simulator.Signals.SignalObjects[index];
switch (pick)
{
case 0:
signal.holdState = SignalObject.HoldState.None;
signal.holdState = HoldState.None;
break;

case 1:
signal.holdState = SignalObject.HoldState.ManualLock;
signal.RequestMostRestrictiveAspect();
break;

case 2:
signal.holdState = SignalObject.HoldState.ManualApproach;
foreach (var sigHead in signal.SignalHeads)
{
var drawstate1 = sigHead.def_draw_state(MstsSignalAspect.APPROACH_1);
var drawstate2 = sigHead.def_draw_state(MstsSignalAspect.APPROACH_2);
var drawstate3 = sigHead.def_draw_state(MstsSignalAspect.APPROACH_3);
if (drawstate1 > 0) { sigHead.state = MstsSignalAspect.APPROACH_1; }
else if (drawstate2 > 0) { sigHead.state = MstsSignalAspect.APPROACH_2; }
else { sigHead.state = MstsSignalAspect.APPROACH_3; }
sigHead.draw_state = sigHead.def_draw_state(sigHead.state);
// Clear the text aspect so as not to leave C# scripted signals in an inconsistent state.
sigHead.TextSignalAspect = "";
}
signal.RequestApproachAspect();
break;

case 3:
signal.holdState = SignalObject.HoldState.ManualPass;
foreach (var sigHead in signal.SignalHeads)
{
sigHead.SetLeastRestrictiveAspect();
sigHead.draw_state = sigHead.def_draw_state(sigHead.state);
}
signal.RequestLeastRestrictiveAspect();
break;

case 4:
signal.SetManualCallOn(true);
break;
Expand Down
19 changes: 19 additions & 0 deletions Source/Orts.Simulation/Orts.Simulation.csproj
Expand Up @@ -146,11 +146,30 @@
<Compile Include="Simulation\RollingStocks\SubSystems\ISubSystem.cs" />
<Compile Include="Simulation\RollingStocks\SubSystems\TrainControlSystem.cs" />
<Compile Include="Simulation\RollingStocks\TrainCar.cs" />
<Compile Include="Simulation\Signalling\CrossOverItem.cs" />
<Compile Include="Simulation\Signalling\CsSignalScript.cs" />
<Compile Include="Simulation\Signalling\CsSignalScripts.cs" />
<Compile Include="Simulation\Signalling\DeadlockInfo.cs" />
<Compile Include="Simulation\Signalling\DeadlockPathInfo.cs" />
<Compile Include="Simulation\Signalling\Milepost.cs" />
<Compile Include="Simulation\Signalling\ObjectItemInfo.cs" />
<Compile Include="Simulation\Signalling\ObjectSpeedInfo.cs" />
<Compile Include="Simulation\Signalling\PlatformDetails.cs" />
<Compile Include="Simulation\Signalling\SignalHead.cs" />
<Compile Include="Simulation\Signalling\SignalObject.cs" />
<Compile Include="Simulation\Signalling\SignalRefObject.cs" />
<Compile Include="Simulation\Signalling\Signals.cs" />
<Compile Include="Simulation\Signalling\SignalWorldObject.cs" />
<Compile Include="Simulation\Signalling\SIGSCRfile.cs" />
<Compile Include="Simulation\Signalling\SpeedPostWorldObject.cs" />
<Compile Include="Simulation\Signalling\TrackCircuitItems.cs" />
<Compile Include="Simulation\Signalling\TrackCircuitMilepost.cs" />
<Compile Include="Simulation\Signalling\TrackCircuitSection.cs" />
<Compile Include="Simulation\Signalling\TrackCircuitSignalItem.cs" />
<Compile Include="Simulation\Signalling\TrackCircuitSignalList.cs" />
<Compile Include="Simulation\Signalling\TrackCircuitState.cs" />
<Compile Include="Simulation\Signalling\TrainOccupyState.cs" />
<Compile Include="Simulation\Signalling\TrainQueue.cs" />
<Compile Include="Simulation\Simulator.cs" />
<Compile Include="Simulation\SuperElevation.cs" />
<Compile Include="Simulation\Timetables\PoolInfo.cs" />
Expand Down
7 changes: 3 additions & 4 deletions Source/Orts.Simulation/Simulation/AIs/AITrain.cs
Expand Up @@ -2082,7 +2082,7 @@ public virtual void UpdateStationState(float elapsedClockSeconds, int presentTim

// first, check state of signal

if (thisStation.ExitSignal >= 0 && (thisStation.HoldSignal || signalRef.SignalObjects[thisStation.ExitSignal].holdState == SignalObject.HoldState.StationStop))
if (thisStation.ExitSignal >= 0 && (thisStation.HoldSignal || signalRef.SignalObjects[thisStation.ExitSignal].holdState == HoldState.StationStop))
{
if (HoldingSignals.Contains(thisStation.ExitSignal)) HoldingSignals.Remove(thisStation.ExitSignal);
var nextSignal = signalRef.SignalObjects[thisStation.ExitSignal];
Expand Down Expand Up @@ -4928,7 +4928,6 @@ public void TestPermission(ref int delay)

public void RequestSignalPermission(TCSubpathRoute selectedRoute, int routeIndex)
{

// check if signal at danger

TCRouteElement thisElement = selectedRoute[PresentPosition[0].RouteListIndex];
Expand All @@ -4944,7 +4943,7 @@ public void RequestSignalPermission(TCSubpathRoute selectedRoute, int routeIndex
return;

requestedSignal.enabledTrain = routeIndex == 0 ? routedForward : routedBackward;
requestedSignal.holdState = SignalObject.HoldState.None;
requestedSignal.holdState = HoldState.None;
requestedSignal.hasPermission = SignalObject.Permission.Requested;

requestedSignal.checkRouteState(false, requestedSignal.signalRoute, routedForward, false);
Expand Down Expand Up @@ -5430,7 +5429,7 @@ public void ProcessActionItem(AIActionItem thisItem)
else if (thisItem.NextAction == AIActionItem.AI_ACTION_TYPE.SIGNAL_ASPECT_STOP)
{
if (thisItem.ActiveItem.signal_state == MstsSignalAspect.STOP &&
thisItem.ActiveItem.ObjectDetails.holdState == SignalObject.HoldState.StationStop)
thisItem.ActiveItem.ObjectDetails.holdState == HoldState.StationStop)
{
actionValid = false;

Expand Down
53 changes: 24 additions & 29 deletions Source/Orts.Simulation/Simulation/Physics/Train.cs
Expand Up @@ -2667,8 +2667,10 @@ public void UpdateManual(float elapsedClockSeconds)

//the following is added by CSantucci, applying also to manual mode what Jtang implemented for activity mode: after passing a manually forced signal,
// system will take back control of the signal
if (signalObject.holdState == SignalObject.HoldState.ManualPass ||
signalObject.holdState == SignalObject.HoldState.ManualApproach) signalObject.holdState = SignalObject.HoldState.None;
if (signalObject.holdState == HoldState.ManualPass || signalObject.holdState == HoldState.ManualApproach)
{
signalObject.holdState = HoldState.None;
}

AllowedCallOnSignal = null;
}
Expand Down Expand Up @@ -2696,8 +2698,10 @@ public void UpdateExplorer(float elapsedClockSeconds)

//the following is added by CSantucci, applying also to explorer mode what Jtang implemented for activity mode: after passing a manually forced signal,
// system will take back control of the signal
if (signalObject.holdState == SignalObject.HoldState.ManualPass ||
signalObject.holdState == SignalObject.HoldState.ManualApproach) signalObject.holdState = SignalObject.HoldState.None;
if (signalObject.holdState == HoldState.ManualPass || signalObject.holdState == HoldState.ManualApproach)
{
signalObject.holdState = HoldState.None;
}

AllowedCallOnSignal = null;
}
Expand Down Expand Up @@ -7227,10 +7231,9 @@ public void UpdateRouteClearanceAhead(int signalObjectIndex, int backward, float
var signalObject = signalRef.SignalObjects[signalObjectIndex];

//the following is added by JTang, passing a hold signal, will take back control by the system
if (signalObject.holdState == SignalObject.HoldState.ManualPass ||
signalObject.holdState == SignalObject.HoldState.ManualApproach)
if (signalObject.holdState == HoldState.ManualPass || signalObject.holdState == HoldState.ManualApproach)
{
signalObject.holdState = SignalObject.HoldState.None;
signalObject.holdState = HoldState.None;
}

AllowedCallOnSignal = null;
Expand Down Expand Up @@ -7442,7 +7445,7 @@ public bool CheckTrainWaitingForSignal(SignalObject thisSignal, int direction)

if (signalRouteIndex < 0)
{
return (false);
return false;
}

// check if any other trains in section ahead of this train
Expand All @@ -7459,7 +7462,7 @@ public bool CheckTrainWaitingForSignal(SignalObject thisSignal, int direction)
// check if train is closer as signal
if (!DistanceToSignal.HasValue || foundTrain.Value < DistanceToSignal)
{
return (false);
return false;
}
}

Expand All @@ -7474,7 +7477,7 @@ public bool CheckTrainWaitingForSignal(SignalObject thisSignal, int direction)

if (nextSection.CircuitState.HasTrainsOccupying()) // train is ahead - it's not our signal //
{
return (false);
return false;
}
else if (!nextSection.IsAvailable(this)) // is section really available to us? //

Expand All @@ -7490,30 +7493,24 @@ public bool CheckTrainWaitingForSignal(SignalObject thisSignal, int direction)
}
SwitchToNodeControl(thisSection.Index);

return (false);
return false;
}
}
}

// we are waiting, but is signal clearance requested ?

if (thisSignal.enabledTrain == null)
{
thisSignal.requestClearSignal(ValidRoute[0], thisRouted, 0, false, null);
}

// we are waiting, but is it really our signal ?

else if (thisSignal.enabledTrain != thisRouted)
{

// something is wrong - we are waiting, but it is not our signal - give warning, reset signal and clear route

Trace.TraceWarning("Train {0} ({1}) waiting for signal which is enabled to train {2}",
Name, Number, thisSignal.enabledTrain.Train.Number);

// stop other train - switch other train to node control

Train otherTrain = thisSignal.enabledTrain.Train;
otherTrain.LastReservedSection[0] = -1;
if (Math.Abs(otherTrain.SpeedMpS) > 0)
Expand All @@ -7523,29 +7520,27 @@ public bool CheckTrainWaitingForSignal(SignalObject thisSignal, int direction)
otherTrain.SwitchToNodeControl(-1);

// reset signal and clear route

thisSignal.ResetSignal(false);
thisSignal.requestClearSignal(ValidRoute[0], thisRouted, 0, false, null);
return (false); // do not yet set to waiting, signal might clear //
return false; // do not yet set to waiting, signal might clear //
}

// signal is in holding list - so not really waiting - but remove from list if held for station stop

if (thisSignal.holdState == SignalObject.HoldState.ManualLock)
if (thisSignal.holdState == HoldState.ManualLock)
{
return (false);
return false;
}
else if (thisSignal.holdState == SignalObject.HoldState.StationStop && HoldingSignals.Contains(thisSignal.thisRef))
else if (thisSignal.holdState == HoldState.StationStop && HoldingSignals.Contains(thisSignal.thisRef))
{
if (StationStops != null && StationStops.Count > 0 && StationStops[0].ExitSignal != thisSignal.thisRef) // not present station stop
{
HoldingSignals.Remove(thisSignal.thisRef);
thisSignal.holdState = SignalObject.HoldState.None;
return (false);
thisSignal.holdState = HoldState.None;
return false;
}
}

return (true); // it is our signal and we are waiting //
return true; // it is our signal and we are waiting //
}

//================================================================================================//
Expand Down Expand Up @@ -7730,8 +7725,8 @@ public void UpdateManualMode(int signalObjectIndex)
var thisSignal = signalRef.SignalObjects[signalObjectIndex];
thisSignal.hasPermission = SignalObject.Permission.Denied;
//the following is added by JTang, passing a hold signal, will take back control by the system
if (thisSignal.holdState == SignalObject.HoldState.ManualPass ||
thisSignal.holdState == SignalObject.HoldState.ManualApproach) thisSignal.holdState = SignalObject.HoldState.None;
if (thisSignal.holdState == HoldState.ManualPass ||
thisSignal.holdState == HoldState.ManualApproach) thisSignal.holdState = HoldState.None;

AllowedCallOnSignal = null;

Expand Down Expand Up @@ -8249,7 +8244,7 @@ public void RequestManualSignalPermission(ref TCSubpathRoute selectedRoute, int

requestedSignal.enabledTrain = routeIndex == 0 ? routedForward : routedBackward;
requestedSignal.signalRoute.Clear();
requestedSignal.holdState = SignalObject.HoldState.None;
requestedSignal.holdState = HoldState.None;
requestedSignal.hasPermission = SignalObject.Permission.Requested;

// get route from next signal - extend to next signal or maximum length
Expand Down
27 changes: 27 additions & 0 deletions Source/Orts.Simulation/Simulation/Signalling/CrossOverItem.cs
@@ -0,0 +1,27 @@
// COPYRIGHT 2021 by the Open Rails project.
//
// This file is part of Open Rails.
//
// Open Rails is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Open Rails is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Open Rails. If not, see <http://www.gnu.org/licenses/>.

namespace Orts.Simulation.Signalling
{
public class CrossOverItem
{
public float[] Position = new float[2]; // position within track sections //
public int[] SectionIndex = new int[2]; // indices of original sections //
public int[] ItemIndex = new int[2]; // TDB item indices //
public uint TrackShape;
}
}
21 changes: 21 additions & 0 deletions Source/Orts.Simulation/Simulation/Signalling/CsSignalScript.cs
Expand Up @@ -2,9 +2,17 @@
using ORTS.Scripting.Api;
using System;
using System.Collections.Generic;
using System.IO;

namespace Orts.Simulation.Signalling
{
public enum SignalEvent
{
RequestMostRestrictiveAspect,
RequestApproachAspect,
RequestLeastRestrictiveAspect,
}

// The exchange of information is done through the TextSignalAspect property.
// The MSTS signal aspect is only used for TCS scripts that do not support TextSignalAspect.
public abstract class CsSignalScript : AbstractScriptClass
Expand Down Expand Up @@ -81,6 +89,10 @@ public enum BlockState
/// </summary>
public bool RouteSet => SignalHead.route_set() > 0;
/// <summary>
/// Hold state of the signal
/// </summary>
public HoldState HoldState => SignalObject.holdState;
/// <summary>
/// Set this variable to true to allow clear to partial route
/// </summary>
public bool AllowClearPartialRoute { set { SignalObject.AllowClearPartialRoute(value ? 1 : 0); } }
Expand Down Expand Up @@ -109,6 +121,10 @@ public enum BlockState
/// </summary>
public string SignalTypeName => SignalHead.SignalTypeName;
/// <summary>
/// Name of the signal shape, as defined in sigcfg
/// </summary>
public string SignalShapeName => Path.GetFileNameWithoutExtension(SignalObject.WorldObject.SFileName);
/// <summary>
/// Local storage of this signal, which can be accessed from other signals
/// </summary>
public Dictionary<int, int> SharedVariables => SignalObject.localStorage;
Expand Down Expand Up @@ -354,5 +370,10 @@ internal void AttachToHead(SignalHead signalHead)
/// <param name="message">Message sent to signal</param>
/// <returns></returns>
public virtual void HandleSignalMessage(int signalId, string message) {}
/// <summary>
/// Called when the simulator
/// </summary>
/// <param name="evt"></param>
public virtual void HandleEvent(SignalEvent evt, string message = "") { }
}
}

0 comments on commit 2c77fad

Please sign in to comment.