View Javadoc
1   package org.opentrafficsim.road.network.factory.xml.parser;
2   
3   import java.util.ArrayList;
4   import java.util.HashMap;
5   import java.util.LinkedHashSet;
6   import java.util.List;
7   import java.util.Map;
8   import java.util.Set;
9   
10  import org.djunits.value.vdouble.scalar.Duration;
11  import org.djunits.value.vdouble.scalar.Length;
12  import org.opentrafficsim.core.compatibility.Compatible;
13  import org.opentrafficsim.core.dsol.OTSSimulatorInterface;
14  import org.opentrafficsim.core.gtu.RelativePosition;
15  import org.opentrafficsim.core.network.NetworkException;
16  import org.opentrafficsim.road.network.OTSRoadNetwork;
17  import org.opentrafficsim.road.network.factory.xml.utils.Transformer;
18  import org.opentrafficsim.road.network.lane.CrossSectionLink;
19  import org.opentrafficsim.road.network.lane.Lane;
20  import org.opentrafficsim.road.network.lane.object.sensor.TrafficLightSensor;
21  import org.opentrafficsim.trafficcontrol.FixedTimeController;
22  import org.opentrafficsim.trafficcontrol.FixedTimeController.SignalGroup;
23  import org.opentrafficsim.xml.generated.CONTROL;
24  import org.opentrafficsim.xml.generated.CONTROL.FIXEDTIME;
25  import org.opentrafficsim.xml.generated.CONTROL.TRAFCOD;
26  import org.opentrafficsim.xml.generated.CONTROLTYPE;
27  import org.opentrafficsim.xml.generated.CONTROLTYPE.SIGNALGROUP;
28  import org.opentrafficsim.xml.generated.RESPONSIVECONTROLTYPE.SENSOR;
29  import org.opentrafficsim.xml.generated.RESPONSIVECONTROLTYPE.SENSOR.MULTIPLELANE;
30  import org.opentrafficsim.xml.generated.RESPONSIVECONTROLTYPE.SENSOR.MULTIPLELANE.INTERMEDIATELANES;
31  import org.opentrafficsim.xml.generated.RESPONSIVECONTROLTYPE.SENSOR.SINGLELANE;
32  
33  import nl.tudelft.simulation.dsol.SimRuntimeException;
34  
35  /**
36   * NodeParser takes care of parsing the CONTROL tags for the Traffic Lights in the XML network. <br>
37   * <br>
38   * Copyright (c) 2003-2018 Delft University of Technology, Jaffalaan 5, 2628 BX Delft, the Netherlands. All rights reserved. See
39   * for project information <a href="https://www.simulation.tudelft.nl/" target="_blank">www.simulation.tudelft.nl</a>. The
40   * source code and binary code of this software is proprietary information of Delft University of Technology.
41   * @author <a href="https://www.tudelft.nl/averbraeck" target="_blank">Alexander Verbraeck</a>
42   */
43  public final class ControlParser
44  {
45      /** */
46      private ControlParser()
47      {
48          // static class
49      }
50  
51      /**
52       * Creates control objects.
53       * @param otsNetwork OTSRoadNetwork; network
54       * @param simulator OTSSimulatorInterface; simulator
55       * @param controls List&lt;CONTROL&gt;; control objects
56       * @throws NetworkException when sensors could not be added to the network
57       */
58      public static void parseControl(final OTSRoadNetwork otsNetwork, final OTSSimulatorInterface simulator,
59              final List<CONTROL> controls) throws NetworkException
60      {
61          for (CONTROL control : controls)
62          {
63              // Fixed time controllers
64              for (FIXEDTIME fixedTime : control.getFIXEDTIME())
65              {
66                  String id = fixedTime.getID();
67                  Duration cycleTime = fixedTime.getCYCLETIME();
68                  Duration offset = fixedTime.getOFFSET();
69                  Set<SignalGroup> signalGroups = new LinkedHashSet<>();
70                  Map<String, CONTROL.FIXEDTIME.CYCLE> cycles = new HashMap<>();
71                  for (CONTROL.FIXEDTIME.CYCLE cycle : fixedTime.getCYCLE())
72                  {
73                      cycles.put(cycle.getSIGNALGROUPID(), cycle);
74                  }
75                  for (SIGNALGROUP signalGroup : fixedTime.getSIGNALGROUP())
76                  {
77                      String signalGroupId = signalGroup.getID();
78                      CONTROL.FIXEDTIME.CYCLE cycle = cycles.get(signalGroupId);
79                      Duration signalGroupOffset = cycle.getOFFSET();
80                      Duration preGreen = cycle.getPREGREEN() == null ? Duration.ZERO : cycle.getPREGREEN();
81                      Duration green = cycle.getGREEN();
82                      Duration yellow = cycle.getYELLOW();
83                      List<CONTROLTYPE.SIGNALGROUP.TRAFFICLIGHT> trafficLights = signalGroup.getTRAFFICLIGHT();
84                      Set<String> trafficLightIds = new LinkedHashSet<>();
85                      for (CONTROLTYPE.SIGNALGROUP.TRAFFICLIGHT trafficLight : trafficLights)
86                      {
87                          String linkId = trafficLight.getLINK();
88                          String laneId = trafficLight.getLANE();
89                          String trafficLightId = trafficLight.getTRAFFICLIGHTID();
90                          trafficLightIds.add(linkId + "." + laneId + "." + trafficLightId);
91                      }
92                      signalGroups
93                              .add(new SignalGroup(signalGroupId, trafficLightIds, signalGroupOffset, preGreen, green, yellow));
94                  }
95                  try
96                  {
97                      new FixedTimeController(id, simulator, otsNetwork, cycleTime, offset, signalGroups);
98                  }
99                  catch (SimRuntimeException exception)
100                 {
101                     // cannot happen; parsing happens with a new simulator at time = 0
102                     throw new RuntimeException(exception);
103                 }
104             }
105 
106             for (TRAFCOD trafCod : control.getTRAFCOD())
107             {
108                 for (SENSOR sensor : trafCod.getSENSOR())
109                 {
110                     if (null != sensor.getSINGLELANE())
111                     {
112                         // Handle single lane sensor
113                         SINGLELANE singleLaneSensor = sensor.getSINGLELANE();
114                         CrossSectionLink link = (CrossSectionLink) otsNetwork.getLink(singleLaneSensor.getLINK());
115                         Lane lane = (Lane) link.getCrossSectionElement(singleLaneSensor.getLANE());
116                         Length entryPosition =
117                                 Transformer.parseLengthBeginEnd(singleLaneSensor.getENTRYPOSITION(), lane.getLength());
118                         Length exitPosition =
119                                 Transformer.parseLengthBeginEnd(singleLaneSensor.getEXITPOSITION(), lane.getLength());
120                         new TrafficLightSensor(sensor.getID(), lane, entryPosition, lane, exitPosition, null,
121                                 RelativePosition.FRONT, RelativePosition.REAR, simulator, Compatible.EVERYTHING);
122                     }
123                     else
124                     {
125                         // Handle sensor spanning multiple lanes
126                         MULTIPLELANE multiLaneSensor = sensor.getMULTIPLELANE();
127                         CrossSectionLink entryLink = (CrossSectionLink) otsNetwork.getLink(multiLaneSensor.getENTRYLINK());
128                         Lane entryLane = (Lane) entryLink.getCrossSectionElement(multiLaneSensor.getENTRYLANE());
129                         Length entryPosition =
130                                 Transformer.parseLengthBeginEnd(multiLaneSensor.getENTRYPOSITION(), entryLane.getLength());
131                         CrossSectionLink exitLink = (CrossSectionLink) otsNetwork.getLink(multiLaneSensor.getEXITLINK());
132                         Lane exitLane = (Lane) exitLink.getCrossSectionElement(multiLaneSensor.getEXITLANE());
133                         Length exitPosition =
134                                 Transformer.parseLengthBeginEnd(multiLaneSensor.getEXITPOSITION(), exitLane.getLength());
135                         List<Lane> intermediateLanes = new ArrayList<>();
136                         for (INTERMEDIATELANES linkAndLane : multiLaneSensor.getINTERMEDIATELANES())
137                         {
138                             CrossSectionLink link = (CrossSectionLink) otsNetwork.getLink(linkAndLane.getLINK());
139                             intermediateLanes.add((Lane) link.getCrossSectionElement(linkAndLane.getLANE()));
140                         }
141                         new TrafficLightSensor(sensor.getID(), entryLane, entryPosition, exitLane, exitPosition,
142                                 intermediateLanes, RelativePosition.FRONT, RelativePosition.REAR, simulator,
143                                 Compatible.EVERYTHING);
144                     }
145                 }
146                 // TODO get the TrafCOD program, etc.
147             }
148         }
149     }
150 
151 }