Skip to content

Commit

Permalink
More TTL debugging
Browse files Browse the repository at this point in the history
  • Loading branch information
VictorPhilipp committed Jun 10, 2017
1 parent 32ff38b commit ad91f4c
Show file tree
Hide file tree
Showing 14 changed files with 348 additions and 150 deletions.
12 changes: 5 additions & 7 deletions TLM/TLM/Geometry/NodeGeometry.cs
Original file line number Diff line number Diff line change
Expand Up @@ -259,15 +259,13 @@ public override int GetHashCode() {
}

internal void NotifyObservers() {
try {
Monitor.Enter(Lock);
List<IObserver<NodeGeometry>> myObservers = new List<IObserver<NodeGeometry>>(observers); // in case somebody unsubscribes while iterating over subscribers

foreach (IObserver<NodeGeometry> observer in myObservers) {
List<IObserver<NodeGeometry>> myObservers = new List<IObserver<NodeGeometry>>(observers); // in case somebody unsubscribes while iterating over subscribers
foreach (IObserver<NodeGeometry> observer in myObservers) {
try {
observer.OnUpdate(this);
} catch (Exception e) {
Log.Error($"SegmentGeometry.NotifyObservers: An exception occured while notifying an observer of node {NodeId}: {e}");
}
} finally {
Monitor.Exit(Lock);
}
}

Expand Down
60 changes: 6 additions & 54 deletions TLM/TLM/Geometry/SegmentGeometry.cs
Original file line number Diff line number Diff line change
Expand Up @@ -163,59 +163,7 @@ public static bool IsValid(ushort segmentId) {
public bool IsValid() {
return IsValid(SegmentId);
}

/*public LaneGeometry GetLane(int laneIndex, bool recalcIfNecessary=true) {
if (LaneGeometries == null || laneIndex >= LaneGeometries.Length) {
if (recalcIfNecessary) {
RecalculateLaneGeometries();
} else {
return null;
}
}
return LaneGeometries[laneIndex];
}
public void RecalculateLaneGeometries(GeometryCalculationMode calcMode) {
#if DEBUGGEO
bool output = GlobalConfig.Instance.DebugSwitches[5];
if (output)
Log._Debug($">>> SegmentGeometry.RecalculateLaneGeometries({calcMode}): called for segment {SegmentId}. IsValid()={IsValid()}, wasValid={valid}");
#endif
if (!IsValid()) {
if (valid) {
valid = false;
LaneGeometries = null;
if (calcMode == GeometryCalculationMode.Propagate) {
PropagateLaneGeometryRebuild();
}
Cleanup();
}
return;
}
RecalculateLaneGeometries();
if (calcMode == GeometryCalculationMode.Propagate) {
PropagateLaneGeometryRebuild();
}
}
private void PropagateLaneGeometryRebuild() {
foreach (bool b in new bool[] { true, false }) {
foreach (ushort otherSegmentId in GetConnectedSegments(b)) {
if (otherSegmentId == 0) {
continue;
}
SegmentGeometry.Get(otherSegmentId, true).RecalculateLaneGeometries();
}
}
}*/


public void StartRecalculation(GeometryCalculationMode calcMode) {
Recalculate(calcMode);
//RecalculateLaneGeometries(calcMode);
Expand Down Expand Up @@ -1380,7 +1328,11 @@ public static SegmentGeometry Get(ushort segmentId, bool ignoreInvalid=false) {
private void NotifyObservers() {
List<IObserver<SegmentGeometry>> myObservers = new List<IObserver<SegmentGeometry>>(observers); // in case somebody unsubscribes while iterating over subscribers
foreach (IObserver<SegmentGeometry> observer in myObservers) {
observer.OnUpdate(this);
try {
observer.OnUpdate(this);
} catch (Exception e) {
Log.Error($"SegmentGeometry.NotifyObservers: An exception occured while notifying an observer of segment {SegmentId}: {e}");
}
}
}
}
Expand Down
39 changes: 37 additions & 2 deletions TLM/TLM/Manager/AbstractNodeGeometryObservingManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
using System.Text;
using System.Threading;
using TrafficManager.Geometry;
using TrafficManager.State;
using TrafficManager.Util;

namespace TrafficManager.Manager {
Expand All @@ -18,6 +19,11 @@ protected override void InternalPrintDebugInfo() {
}

protected void UnsubscribeFromNodeGeometry(ushort nodeId) {
#if DEBUGGEO
if (GlobalConfig.Instance.DebugSwitches[5])
Log._Debug($"AbstractNodeGeometryObservingManager.UnsubscribeFromNodeGeometry({nodeId}) called.");
#endif

try {
Monitor.Enter(geoLock);

Expand All @@ -26,18 +32,32 @@ protected void UnsubscribeFromNodeGeometry(ushort nodeId) {
unsubscriber.Dispose();
nodeGeometryUnsubscribers.Remove(nodeId);
}
#if DEBUGGEO
if (GlobalConfig.Instance.DebugSwitches[5])
Log._Debug($"AbstractNodeGeometryObservingManager.UnsubscribeFromNodeGeometry({nodeId}): watched nodes: {String.Join(",", nodeGeometryUnsubscribers.Keys.Select(x => x.ToString()).ToArray())}");
#endif
} finally {
Monitor.Exit(geoLock);
}
}

protected void UnsubscribeFromAllNodeGeometries() {
#if DEBUGGEO
if (GlobalConfig.Instance.DebugSwitches[5])
Log._Debug($"AbstractNodeGeometryObservingManager.UnsubscribeFromAllNodeGeometries() called.");
#endif

List<ushort> nodeIds = new List<ushort>(nodeGeometryUnsubscribers.Keys);
foreach (ushort nodeId in nodeIds)
UnsubscribeFromNodeGeometry(nodeId);
}

protected void SubscribeToNodeGeometry(ushort nodeId) {
#if DEBUGGEO
if (GlobalConfig.Instance.DebugSwitches[5])
Log._Debug($"AbstractNodeGeometryObservingManager.SubscribeToNodeGeometry({nodeId}) called.");
#endif

try {
Monitor.Enter(geoLock);

Expand All @@ -47,6 +67,11 @@ protected void SubscribeToNodeGeometry(ushort nodeId) {
} finally {
Monitor.Exit(geoLock);
}

#if DEBUGGEO
if (GlobalConfig.Instance.DebugSwitches[5])
Log._Debug($"AbstractNodeGeometryObservingManager.SubscribeToNodeGeometry({nodeId}): watched nodes: {String.Join(",", nodeGeometryUnsubscribers.Keys.Select(x => x.ToString()).ToArray())}");
#endif
}

public override void OnLevelUnloading() {
Expand All @@ -58,16 +83,26 @@ public override void OnLevelUnloading() {

public void OnUpdate(NodeGeometry geometry) {
if (!geometry.IsValid()) {
Log._Debug($"{this.GetType().Name}.HandleInvalidNode({geometry.NodeId})");
#if DEBUGGEO
if (GlobalConfig.Instance.DebugSwitches[5])
Log._Debug($"{this.GetType().Name}.HandleInvalidNode({geometry.NodeId})");
#endif
HandleInvalidNode(geometry);
UnsubscribeFromNodeGeometry(geometry.NodeId);
} else {
Log._Debug($"{this.GetType().Name}.HandleValidNode({geometry.NodeId})");
#if DEBUGGEO
if (GlobalConfig.Instance.DebugSwitches[5])
Log._Debug($"{this.GetType().Name}.HandleValidNode({geometry.NodeId})");
#endif
HandleValidNode(geometry);
}
}

~AbstractNodeGeometryObservingManager() {
#if DEBUGGEO
if (GlobalConfig.Instance.DebugSwitches[5])
Log._Debug($"~AbstractNodeGeometryObservingManager() called.");
#endif
UnsubscribeFromAllNodeGeometries();
}
}
Expand Down
55 changes: 38 additions & 17 deletions TLM/TLM/Manager/AbstractSegmentGeometryObservingManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
using System.Text;
using System.Threading;
using TrafficManager.Geometry;
using TrafficManager.State;
using TrafficManager.Util;

namespace TrafficManager.Manager {
Expand All @@ -20,8 +21,9 @@ protected override void InternalPrintDebugInfo() {
}

protected void UnsubscribeFromSegmentGeometry(ushort segmentId) {
#if DEBUGCONN
Log._Debug($"AbstractSegmentGeometryObservingManager.UnsubscribeFromSegmentGeometry({segmentId}) called.");
#if DEBUGGEO
if (GlobalConfig.Instance.DebugSwitches[5])
Log._Debug($"AbstractSegmentGeometryObservingManager.UnsubscribeFromSegmentGeometry({segmentId}) called.");
#endif
try {
Monitor.Enter(geoLock);
Expand All @@ -31,40 +33,52 @@ protected void UnsubscribeFromSegmentGeometry(ushort segmentId) {
unsubscriber.Dispose();
segGeometryUnsubscribers.Remove(segmentId);
}
#if DEBUGCONN
Log._Debug($"AbstractSegmentGeometryObservingManager.UnsubscribeFromSegmentGeometry({segmentId}): watched segments: {String.Join(",", segGeometryUnsubscribers.Keys.Select(x => x.ToString()).ToArray())}");
#if DEBUGGEO
if (GlobalConfig.Instance.DebugSwitches[5])
Log._Debug($"AbstractSegmentGeometryObservingManager.UnsubscribeFromSegmentGeometry({segmentId}): watched segments: {String.Join(",", segGeometryUnsubscribers.Keys.Select(x => x.ToString()).ToArray())}");
#endif
} finally {
Monitor.Exit(geoLock);
}
}

protected void UnsubscribeFromAllSegmentGeometries() {
#if DEBUGCONN
Log._Debug($"AbstractSegmentGeometryObservingManager.UnsubscribeFromAllSegmentGeometries() called.");
#if DEBUGGEO
if (GlobalConfig.Instance.DebugSwitches[5])
Log._Debug($"AbstractSegmentGeometryObservingManager.UnsubscribeFromAllSegmentGeometries() called.");
#endif
List<ushort> segmentIds = new List<ushort>(segGeometryUnsubscribers.Keys);
foreach (ushort segmentId in segmentIds)
UnsubscribeFromSegmentGeometry(segmentId);
}

protected void SubscribeToSegmentGeometry(ushort segmentId) {
#if DEBUGCONN
Log._Debug($"AbstractSegmentGeometryObservingManager.SubscribeToSegmentGeometry({segmentId}) called.");
#if DEBUGGEO
if (GlobalConfig.Instance.DebugSwitches[5])
Log._Debug($"AbstractSegmentGeometryObservingManager.SubscribeToSegmentGeometry({segmentId}) called.");
#endif
try {
Monitor.Enter(geoLock);

if (!segGeometryUnsubscribers.ContainsKey(segmentId)) {
segGeometryUnsubscribers.Add(segmentId, SegmentGeometry.Get(segmentId, AllowInvalidSegments).Subscribe(this));
}

#if DEBUGCONN
Log._Debug($"AbstractSegmentGeometryObservingManager.SubscribeToSegmentGeometry({segmentId}): watched segments: {String.Join(",", segGeometryUnsubscribers.Keys.Select(x => x.ToString()).ToArray())}");
SegmentGeometry geo = SegmentGeometry.Get(segmentId, AllowInvalidSegments);
if (geo != null) {
segGeometryUnsubscribers.Add(segmentId, geo.Subscribe(this));
} else {
#if DEBUGGEO
if (GlobalConfig.Instance.DebugSwitches[5])
Log.Warning($"AbstractSegmentGeometryObservingManager.SubscribeToSegmentGeometry({segmentId}): geometry is null.");
#endif
}
}
} finally {
Monitor.Exit(geoLock);
}

#if DEBUGGEO
if (GlobalConfig.Instance.DebugSwitches[5])
Log._Debug($"AbstractSegmentGeometryObservingManager.SubscribeToSegmentGeometry({segmentId}): watched segments: {String.Join(",", segGeometryUnsubscribers.Keys.Select(x => x.ToString()).ToArray())}");
#endif
}

public override void OnLevelUnloading() {
Expand All @@ -77,20 +91,27 @@ public override void OnLevelUnloading() {

public void OnUpdate(SegmentGeometry geometry) {
if (!geometry.IsValid()) {
//Log._Debug($"{this.GetType().Name}.HandleInvalidSegment({geometry.SegmentId})");
#if DEBUGGEO
if (GlobalConfig.Instance.DebugSwitches[5])
Log._Debug($"{this.GetType().Name}.HandleInvalidSegment({geometry.SegmentId})");
#endif
HandleInvalidSegment(geometry);
if (!AllowInvalidSegments) {
UnsubscribeFromSegmentGeometry(geometry.SegmentId);
}
} else {
//Log._Debug($"{this.GetType().Name}.HandleValidSegment({geometry.SegmentId})");
#if DEBUGGEO
if (GlobalConfig.Instance.DebugSwitches[5])
Log._Debug($"{this.GetType().Name}.HandleValidSegment({geometry.SegmentId})");
#endif
HandleValidSegment(geometry);
}
}

~AbstractSegmentGeometryObservingManager() {
#if DEBUGCONN
Log._Debug($"~AbstractSegmentGeometryObservingManager() called.");
#if DEBUGGEO
if (GlobalConfig.Instance.DebugSwitches[5])
Log._Debug($"~AbstractSegmentGeometryObservingManager() called.");
#endif
UnsubscribeFromAllSegmentGeometries();
}
Expand Down
36 changes: 30 additions & 6 deletions TLM/TLM/Manager/CustomSegmentLightsManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -50,9 +50,8 @@ public CustomSegmentLights AddLiveSegmentLights(ushort segmentId, bool startNode
}

SegmentEndGeometry endGeometry = segGeometry.GetEnd(startNode);

if (! endGeometry.IsValid()) {
Log.Error($"CustomTrafficLightsManager.AddLiveSegmentLights: Segment {segmentId} is not connected to a node. startNode={startNode}");
if (endGeometry == null) {
Log.Error($"CustomTrafficLightsManager.AddLiveSegmentLights: Segment {segmentId} is not connected to a node @ start {startNode}");
return null;
}

Expand Down Expand Up @@ -84,6 +83,19 @@ public CustomSegmentLights AddSegmentLights(ushort segmentId, bool startNode, Ro
#if DEBUG
Log._Debug($"CustomTrafficLights.AddSegmentLights: Adding segment light: {segmentId} @ startNode={startNode}");
#endif

SegmentGeometry segGeometry = SegmentGeometry.Get(segmentId);
if (segGeometry == null) {
Log.Error($"CustomTrafficLightsManager.AddSegmentLights: Segment {segmentId} is invalid.");
return null;
}

SegmentEndGeometry endGeometry = segGeometry.GetEnd(startNode);
if (endGeometry == null) {
Log.Error($"CustomTrafficLightsManager.AddSegmentLights: Segment {segmentId} is not connected to a node @ start {startNode}");
return null;
}

CustomSegment customSegment = CustomSegments[segmentId];
if (customSegment == null) {
customSegment = new CustomSegment();
Expand Down Expand Up @@ -137,6 +149,7 @@ public void AddNodeLights(ushort nodeId) {
NodeGeometry nodeGeo = NodeGeometry.Get(nodeId);
if (!nodeGeo.IsValid())
return;

foreach (SegmentEndGeometry endGeo in nodeGeo.SegmentEndGeometries) {
if (endGeo == null)
continue;
Expand All @@ -151,8 +164,9 @@ public void AddNodeLights(ushort nodeId) {
/// <param name="nodeId"></param>
public void RemoveNodeLights(ushort nodeId) {
NodeGeometry nodeGeo = NodeGeometry.Get(nodeId);
if (!nodeGeo.IsValid())
return;
/*if (!nodeGeo.IsValid())
return;*/

foreach (SegmentEndGeometry endGeo in nodeGeo.SegmentEndGeometries) {
if (endGeo == null)
continue;
Expand Down Expand Up @@ -250,6 +264,10 @@ public CustomSegmentLights GetSegmentLights(ushort segmentId, bool startNode, bo

internal void SetLightMode(ushort segmentId, bool startNode, ExtVehicleType vehicleType, CustomSegmentLight.Mode mode) {
CustomSegmentLights liveLights = GetSegmentLights(segmentId, startNode);
if (liveLights == null) {
Log.Warning($"CustomSegmentLightsManager.SetLightMode({segmentId}, {startNode}, {vehicleType}, {mode}): Could not retrieve segment lights.");
return;
}
CustomSegmentLight liveLight = liveLights.GetCustomLight(vehicleType);
if (liveLight == null) {
Log.Error($"CustomSegmentLightsManager.SetLightMode: Cannot change light mode on seg. {segmentId} @ {startNode} for vehicle type {vehicleType} to {mode}: Vehicle light not found");
Expand All @@ -258,8 +276,13 @@ internal void SetLightMode(ushort segmentId, bool startNode, ExtVehicleType vehi
liveLight.CurrentMode = mode;
}

internal void ApplyLightModes(ushort segmentId, bool startNode, CustomSegmentLights otherLights) {
internal bool ApplyLightModes(ushort segmentId, bool startNode, CustomSegmentLights otherLights) {
CustomSegmentLights sourceLights = GetSegmentLights(segmentId, startNode);
if (sourceLights == null) {
Log.Warning($"CustomSegmentLightsManager.ApplyLightModes({segmentId}, {startNode}, {otherLights}): Could not retrieve segment lights.");
return false;
}

foreach (KeyValuePair<ExtVehicleType, CustomSegmentLight> e in sourceLights.CustomLights) {
ExtVehicleType vehicleType = e.Key;
CustomSegmentLight targetLight = e.Value;
Expand All @@ -269,6 +292,7 @@ internal void ApplyLightModes(ushort segmentId, bool startNode, CustomSegmentLig
targetLight.CurrentMode = sourceLight.CurrentMode;
}
}
return true;
}

public CustomSegmentLights GetSegmentLights(ushort nodeId, ushort segmentId) {
Expand Down
2 changes: 1 addition & 1 deletion TLM/TLM/Manager/LaneConnectionManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -281,7 +281,7 @@ internal bool AddLaneConnection(uint sourceLaneId, uint targetLaneId, bool sourc
bool ret = Flags.AddLaneConnection(sourceLaneId, targetLaneId, sourceStartNode);

#if DEBUGCONN
Log._Debug($"LaneConnectionManager.AddLaneConnection({laneId1}, {laneId2}, {startNode1}): ret={ret}");
Log._Debug($"LaneConnectionManager.AddLaneConnection({sourceLaneId}, {targetLaneId}, {sourceStartNode}): ret={ret}");
#endif
if (ret) {
ushort commonNodeId;
Expand Down
Loading

0 comments on commit ad91f4c

Please sign in to comment.