Exemple #1
0
 /// <summary>
 /// Constructs a route from its spec.
 /// </summary>
 /// <param name="schema">The schema object containing data about this route.</param>
 /// <param name="region">The region the route exists in.</param>
 /// <param name="entrance">The signal at which this route begins.</param>
 public Route(Schema.Route schema, Region region, ControlledSignal entrance)
 {
     Entrance    = entrance;
     Exit        = region.GetSignal(schema.Exit, entrance.SubArea);
     Divergence  = schema.Divergence;
     Restricting = schema.Restricting;
     DivergenceDistanceStraightOnly = schema.DivergenceDistanceStraightOnly;
     {
         RouteElement[] elts = new RouteElement[schema.TCs.Count];
         for (int i = 0; i != schema.TCs.Count; ++i)
         {
             elts[i] = new RouteElement(schema.TCs[i], region, entrance.SubArea);
         }
         Elements = Array.AsReadOnly(elts);
     }
     {
         RoutePointPosition[] elts = new RoutePointPosition[schema.Points.Count];
         for (int i = 0; i != schema.Points.Count; ++i)
         {
             elts[i] = new RoutePointPosition(schema.Points[i], region, entrance.SubArea);
         }
         PointPositions = Array.AsReadOnly(elts);
     }
     {
         TrackCircuit[] tcs = new TrackCircuit[schema.FreeTCs.Count];
         for (int i = 0; i != schema.FreeTCs.Count; ++i)
         {
             tcs[i] = region.GetTrackCircuit(schema.FreeTCs[i], entrance.SubArea);
         }
         FreeTrackCircuits = Array.AsReadOnly(tcs);
     }
 }
Exemple #2
0
 /// <summary>
 /// Checks whether this exemption applies.
 /// </summary>
 /// <returns><c>true</c> if this exemption applies, or <c>false</c> if not.</returns>
 public bool Check()
 {
     foreach (TrackCircuit i in ClearTCs)
     {
         if (i.Occupied || i.ReversedHandPoints)
         {
             return(false);
         }
     }
     foreach (RoutePointPosition i in PointPositions)
     {
         if ((i.Points.Reversed != i.Reverse) || !i.Points.Proved)
         {
             return(false);
         }
     }
     foreach (Signal i in SignalsOn)
     {
         if (i.Aspects.Off)
         {
             ControlledSignal cs = i as ControlledSignal;
             if ((cs == null) || !cs.ApproachLocked)
             {
                 return(false);
             }
         }
     }
     return(true);
 }
Exemple #3
0
        /// <summary>
        /// Constructs a new sub-area.
        /// </summary>
        /// <param name="schema">Data about this sub-area.</param>
        /// <param name="id">The sub-area ID.</param>
        /// <param name="world">The communication interface to Run8.</param>
        public SubArea(Schema.SubArea schema, ushort id, World world)
        {
            ID   = id;
            Name = schema.Name ?? string.Empty;

            {
                ushort maxID = 0;
                foreach (Schema.TrackCircuit i in schema.TrackCircuits)
                {
                    maxID = Math.Max(maxID, i.ID);
                }
                TrackCircuit[] trackCircuits = new TrackCircuit[maxID + 1];
                foreach (Schema.TrackCircuit i in schema.TrackCircuits)
                {
                    Debug.Assert(trackCircuits[i.ID] == null);
                    trackCircuits[i.ID] = new TrackCircuit(i, ID, i.ID);
                }
                TrackCircuits = Array.AsReadOnly(trackCircuits);
            }

            {
                Points[] points = new Points[schema.Points.Count];
                for (ushort i = 0; i != schema.Points.Count; ++i)
                {
                    points[i] = new Points(schema.Points[i], i, this, world);
                }
                PowerPoints = Array.AsReadOnly(points);
            }

            {
                ControlledSignal[] sigs = new ControlledSignal[schema.ControlledSignals.Count];
                for (ushort i = 0; i != schema.ControlledSignals.Count; ++i)
                {
                    sigs[i] = new ControlledSignal(schema.ControlledSignals[i], i, ID, world);
                }
                ControlledSignals = Array.AsReadOnly(sigs);
            }

            {
                AutomaticSignal[] sigs = new AutomaticSignal[schema.AutomaticSignals.Count];
                for (ushort i = 0; i != schema.AutomaticSignals.Count; ++i)
                {
                    sigs[i] = new AutomaticSignal(schema.AutomaticSignals[i], (short)(-i - 1), ID);
                }
                AutomaticSignals = Array.AsReadOnly(sigs);
            }

            Signals = new SignalsArray(this);
        }