Beispiel #1
0
        void IDispatcher.SetOccupiedBlocks(OccupiedBlocksMessage pMessage)
        {
            IDispatcher target;

            lock (this) {
                target = Target;
            }
            if (target != null)
            {
                target.SetOccupiedBlocks(pMessage);
            }
        }
Beispiel #2
0
        /// <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 + ".");
            }
        }
Beispiel #3
0
        /// <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.");
            }
        }
Beispiel #4
0
 public virtual void SetOccupiedBlocks(OccupiedBlocksMessage pMessage)
 {
 }
Beispiel #5
0
 public override void SetOccupiedBlocks(OccupiedBlocksMessage pMessage)
 {
     CompletionSource.TrySetResult(pMessage.Route);
 }
Beispiel #6
0
 void IDispatcher.SetOccupiedBlocks(OccupiedBlocksMessage pMessage)
 {
     MessageReceived = true;
     SyncContext.Post((object state) => Region.UpdateFromRun8(pMessage), null);
 }