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
37
38
39
40
41
42
43 public final class ControlParser
44 {
45
46 private ControlParser()
47 {
48
49 }
50
51
52
53
54
55
56
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
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
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
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
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
147 }
148 }
149 }
150
151 }