1 package org.opentrafficsim.demo.conflict;
2
3 import java.awt.Dimension;
4 import java.io.Serializable;
5 import java.net.URL;
6 import java.rmi.RemoteException;
7
8 import javax.naming.NamingException;
9
10 import org.djunits.unit.DurationUnit;
11 import org.djunits.unit.LengthUnit;
12 import org.djunits.value.vdouble.scalar.Duration;
13 import org.djunits.value.vdouble.scalar.Length;
14 import org.djunits.value.vdouble.scalar.Time;
15 import org.djutils.io.URLResource;
16 import org.opentrafficsim.core.dsol.AbstractOTSModel;
17 import org.opentrafficsim.core.dsol.OTSAnimator;
18 import org.opentrafficsim.core.dsol.OTSSimulatorInterface;
19 import org.opentrafficsim.core.gtu.GTUType;
20 import org.opentrafficsim.core.network.NetworkException;
21 import org.opentrafficsim.demo.conflict.TJunctionDemo.TJunctionModel;
22 import org.opentrafficsim.draw.core.OTSDrawingException;
23 import org.opentrafficsim.draw.road.TrafficLightAnimation;
24 import org.opentrafficsim.road.network.OTSRoadNetwork;
25 import org.opentrafficsim.road.network.factory.xml.parser.XmlNetworkLaneParser;
26 import org.opentrafficsim.road.network.lane.CrossSectionLink;
27 import org.opentrafficsim.road.network.lane.Lane;
28 import org.opentrafficsim.road.network.lane.conflict.ConflictBuilder;
29 import org.opentrafficsim.road.network.lane.object.trafficlight.SimpleTrafficLight;
30 import org.opentrafficsim.road.network.lane.object.trafficlight.TrafficLightColor;
31 import org.opentrafficsim.swing.gui.OTSAnimationPanel;
32 import org.opentrafficsim.swing.gui.OTSSimulationApplication;
33
34 import nl.tudelft.simulation.dsol.SimRuntimeException;
35 import nl.tudelft.simulation.language.DSOLException;
36
37
38
39
40
41
42
43
44
45
46
47 public class TJunctionDemo extends OTSSimulationApplication<TJunctionModel>
48 {
49
50 private static final long serialVersionUID = 20161211L;
51
52
53
54
55
56
57
58
59 public TJunctionDemo(final String title, final OTSAnimationPanel panel, final TJunctionModel model)
60 throws OTSDrawingException
61 {
62 super(model, panel);
63 }
64
65
66
67
68
69 public static void main(final String[] args)
70 {
71 demo(true);
72 }
73
74
75
76
77
78 public static void demo(final boolean exitOnClose)
79 {
80 try
81 {
82 OTSAnimator simulator = new OTSAnimator("TJunctionDemo");
83 final TJunctionModel junctionModel = new TJunctionModel(simulator);
84 simulator.initialize(Time.ZERO, Duration.ZERO, Duration.instantiateSI(3600.0), junctionModel);
85 OTSAnimationPanel animationPanel = new OTSAnimationPanel(junctionModel.getNetwork().getExtent(),
86 new Dimension(800, 600), simulator, junctionModel, DEFAULT_COLORER, junctionModel.getNetwork());
87 TJunctionDemo/TJunctionDemo.html#TJunctionDemo">TJunctionDemo app = new TJunctionDemo("T-Junction demo", animationPanel, junctionModel);
88 app.setExitOnClose(exitOnClose);
89 }
90 catch (SimRuntimeException | NamingException | RemoteException | OTSDrawingException | DSOLException exception)
91 {
92 exception.printStackTrace();
93 }
94 }
95
96
97
98
99 public static class TJunctionModel extends AbstractOTSModel
100 {
101
102 private static final long serialVersionUID = 20161211L;
103
104
105 private OTSRoadNetwork network;
106
107
108
109
110 public TJunctionModel(final OTSSimulatorInterface simulator)
111 {
112 super(simulator);
113 }
114
115
116 @Override
117 public void constructModel() throws SimRuntimeException
118 {
119 try
120 {
121 URL xmlURL = URLResource.getResource("/conflict/TJunction.xml");
122 this.network = new OTSRoadNetwork("TJunction", true, getSimulator());
123 XmlNetworkLaneParser.build(xmlURL, this.network, false);
124
125
126
127
128 ConflictBuilder.buildConflicts(this.network, this.network.getGtuType(GTUType.DEFAULTS.VEHICLE), this.simulator,
129 new ConflictBuilder.FixedWidthGenerator(new Length(2.0, LengthUnit.SI)));
130
131
132 Lane lane = ((CrossSectionLink) this.network.getLink("ECE")).getLanes().get(0);
133 SimpleTrafficLight trafficLight =
134 new SimpleTrafficLight("light", lane, new Length(50.0, LengthUnit.SI), this.simulator);
135
136 try
137 {
138 new TrafficLightAnimation(trafficLight, this.simulator);
139 }
140 catch (RemoteException | NamingException exception)
141 {
142 throw new NetworkException(exception);
143 }
144 trafficLight.setTrafficLightColor(TrafficLightColor.RED);
145 changePhase(trafficLight);
146
147 }
148 catch (Exception exception)
149 {
150 exception.printStackTrace();
151 }
152 }
153
154
155
156
157
158
159 private void changePhase(final SimpleTrafficLight trafficLight) throws SimRuntimeException
160 {
161 switch (trafficLight.getTrafficLightColor())
162 {
163 case RED:
164 {
165 trafficLight.setTrafficLightColor(TrafficLightColor.GREEN);
166 this.simulator.scheduleEventRel(new Duration(30.0, DurationUnit.SECOND), this, this, "changePhase",
167 new Object[] {trafficLight});
168 break;
169 }
170 case YELLOW:
171 {
172 trafficLight.setTrafficLightColor(TrafficLightColor.RED);
173 this.simulator.scheduleEventRel(new Duration(56.0, DurationUnit.SECOND), this, this, "changePhase",
174 new Object[] {trafficLight});
175 break;
176 }
177 case GREEN:
178 {
179 trafficLight.setTrafficLightColor(TrafficLightColor.YELLOW);
180 this.simulator.scheduleEventRel(new Duration(4.0, DurationUnit.SECOND), this, this, "changePhase",
181 new Object[] {trafficLight});
182 break;
183 }
184 default:
185 {
186
187 }
188 }
189 }
190
191
192 @Override
193 public OTSRoadNetwork getNetwork()
194 {
195 return this.network;
196 }
197
198
199 @Override
200 public Serializable getSourceId()
201 {
202 return "TJunctionModel";
203 }
204
205 }
206 }