void IDispatcher.SetOccupiedBlocks(OccupiedBlocksMessage pMessage) { IDispatcher target; lock (this) { target = Target; } if (target != null) { target.SetOccupiedBlocks(pMessage); } }
/// <summary> /// Updates the occupancy of all track circuits in a sub-area in this region. /// </summary> /// <param name="message">The received data.</param> public void UpdateFromRun8(OccupiedBlocksMessage message) { SubArea subArea; if (SubAreas.TryGetValue((ushort)message.Route, out subArea)) { subArea.UpdateFromRun8(message); } else if (squelchUnknownSubAreas.Add(message.Route)) { Debug.Print("Received update for unknown sub-area " + message.Route + "."); } }
/// <summary> /// Updates the occupancy of all track circuits in this sub-area. /// </summary> /// <param name="message">The received data.</param> public void UpdateFromRun8(OccupiedBlocksMessage message) { message.OccupiedBlocks.Sort(); message.OpenManualSwitchBlocks.Sort(); IReadOnlyList <TrackCircuit> tcs = TrackCircuits; IEnumerator <int> occupiedEnum = message.OccupiedBlocks.GetEnumerator(), reversedEnum = message.OpenManualSwitchBlocks.GetEnumerator(); occupiedEnum = occupiedEnum.MoveNext() ? occupiedEnum : null; reversedEnum = reversedEnum.MoveNext() ? reversedEnum : null; for (int i = 0; i != tcs.Count; ++i) { bool occupied = occupiedEnum != null && occupiedEnum.Current == i; bool reversed = reversedEnum != null && reversedEnum.Current == i; if (tcs[i] != null) { tcs[i].UpdateFromRun8(occupied, reversed); if (occupied) { occupiedEnum = occupiedEnum.MoveNext() ? occupiedEnum : null; } if (reversed) { reversedEnum = reversedEnum.MoveNext() ? reversedEnum : null; } } else { Debug.Assert(!occupied && !reversed); } } if (occupiedEnum != null) { Debug.Print("Run8 sent occupied track circuit number " + occupiedEnum.Current + " which sub-area " + ID + " doesn't know about."); } if (reversedEnum != null) { Debug.Print("Run8 sent track circuit with reversed hand points number " + reversedEnum.Current + " which sub-area " + ID + " doesn't know about."); } }
public virtual void SetOccupiedBlocks(OccupiedBlocksMessage pMessage) { }
public override void SetOccupiedBlocks(OccupiedBlocksMessage pMessage) { CompletionSource.TrySetResult(pMessage.Route); }
void IDispatcher.SetOccupiedBlocks(OccupiedBlocksMessage pMessage) { MessageReceived = true; SyncContext.Post((object state) => Region.UpdateFromRun8(pMessage), null); }