1 package org.opentrafficsim.demo.trafficcontrol;
2
3 import java.awt.BorderLayout;
4 import java.awt.Dimension;
5 import java.io.ByteArrayInputStream;
6 import java.io.IOException;
7 import java.net.URL;
8 import java.nio.charset.StandardCharsets;
9 import java.rmi.RemoteException;
10 import java.util.Scanner;
11
12 import javax.naming.NamingException;
13 import javax.swing.JPanel;
14 import javax.swing.JScrollPane;
15
16 import org.djunits.value.vdouble.scalar.Duration;
17 import org.djunits.value.vdouble.scalar.Length;
18 import org.djunits.value.vdouble.scalar.Time;
19 import org.djutils.io.URLResource;
20 import org.opentrafficsim.core.dsol.AbstractOTSModel;
21 import org.opentrafficsim.core.dsol.OTSAnimator;
22 import org.opentrafficsim.core.dsol.OTSSimulatorInterface;
23 import org.opentrafficsim.core.gtu.GTUType;
24 import org.opentrafficsim.demo.trafficcontrol.TrafCODDemo2.TrafCODModel;
25 import org.opentrafficsim.draw.core.OTSDrawingException;
26 import org.opentrafficsim.road.network.OTSRoadNetwork;
27 import org.opentrafficsim.road.network.factory.xml.parser.XmlNetworkLaneParser;
28 import org.opentrafficsim.road.network.lane.conflict.ConflictBuilder;
29 import org.opentrafficsim.swing.gui.OTSAnimationPanel;
30 import org.opentrafficsim.swing.gui.OTSSimulationApplication;
31 import org.opentrafficsim.trafficcontrol.TrafficController;
32 import org.opentrafficsim.trafficcontrol.trafcod.TrafCOD;
33
34 import nl.tudelft.simulation.dsol.SimRuntimeException;
35 import nl.tudelft.simulation.event.EventInterface;
36 import nl.tudelft.simulation.event.EventListenerInterface;
37 import nl.tudelft.simulation.event.EventType;
38
39
40
41
42
43
44
45
46
47
48
49 public class TrafCODDemo2 extends OTSSimulationApplication<TrafCODModel>
50 {
51
52 private static final long serialVersionUID = 20161118L;
53
54
55
56
57
58
59
60
61 public TrafCODDemo2(final String title, final OTSAnimationPanel panel, final TrafCODModel model) throws OTSDrawingException
62 {
63 super(model, panel);
64 }
65
66
67
68
69
70
71 public static void main(final String[] args) throws IOException
72 {
73 demo(true);
74 }
75
76
77
78
79
80
81
82
83 public static String readStringFromURL(final URL url) throws IOException
84 {
85 try (Scanner scanner = new Scanner(url.openStream(), StandardCharsets.UTF_8.toString()))
86 {
87 scanner.useDelimiter("\\A");
88 return scanner.hasNext() ? scanner.next() : "";
89 }
90 }
91
92
93
94
95
96
97 public static void demo(final boolean exitOnClose) throws IOException
98 {
99 try
100 {
101 OTSAnimator simulator = new OTSAnimator();
102 URL url = URLResource.getResource("/TrafCODDemo2/Network.xml");
103 String xml = readStringFromURL(url);
104 final TrafCODModel trafcodModel = new TrafCODModel(simulator, "TrafCODModel", "TrafCOD demonstration Model", xml);
105 simulator.initialize(Time.ZERO, Duration.ZERO, Duration.createSI(3600.0), trafcodModel);
106 OTSAnimationPanel animationPanel = new OTSAnimationPanel(trafcodModel.getNetwork().getExtent(),
107 new Dimension(800, 600), simulator, trafcodModel, DEFAULT_COLORER, trafcodModel.getNetwork());
108 TrafCODDemo2 app = new TrafCODDemo2("TrafCOD demo complex crossing", animationPanel, trafcodModel);
109 app.setExitOnClose(exitOnClose);
110 }
111 catch (SimRuntimeException | NamingException | RemoteException | OTSDrawingException exception)
112 {
113 exception.printStackTrace();
114 }
115 }
116
117
118
119
120 @Override
121 protected final void addTabs()
122 {
123 JScrollPane scrollPane = new JScrollPane(getModel().getControllerDisplayPanel());
124 JPanel wrapper = new JPanel(new BorderLayout());
125 wrapper.add(scrollPane);
126 getAnimationPanel().getTabbedPane().addTab(getAnimationPanel().getTabbedPane().getTabCount() - 1,
127 getModel().getTrafCOD().getId(), wrapper);
128 }
129
130
131
132
133 static class TrafCODModel extends AbstractOTSModel implements EventListenerInterface
134 {
135
136 private static final long serialVersionUID = 20161020L;
137
138
139 private OTSRoadNetwork network;
140
141
142 private final String xml;
143
144
145 private TrafCOD trafCOD;
146
147
148 private JPanel controllerDisplayPanel = new JPanel(new BorderLayout());
149
150
151
152
153
154
155
156 TrafCODModel(final OTSSimulatorInterface simulator, final String shortName, final String description, final String xml)
157 {
158 super(simulator, shortName, description);
159 this.xml = xml;
160 }
161
162
163 @Override
164 public void constructModel() throws SimRuntimeException
165 {
166 try
167 {
168 this.network = new OTSRoadNetwork(getShortName(), true);
169 XmlNetworkLaneParser.build(new ByteArrayInputStream(this.xml.getBytes(StandardCharsets.UTF_8)), this.network,
170 getSimulator());
171 ConflictBuilder.buildConflicts(this.network, this.network.getGtuType(GTUType.DEFAULTS.VEHICLE), getSimulator(),
172 new ConflictBuilder.FixedWidthGenerator(Length.createSI(2.0)));
173
174 String controllerName = "TrafCOD_complex";
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202 this.trafCOD = new TrafCOD(controllerName, URLResource.getResource("/TrafCODDemo2/Intersection12Dir.tfc"),
203 getSimulator(), this.controllerDisplayPanel);
204 this.trafCOD.addListener(this, TrafficController.TRAFFICCONTROL_CONTROLLER_EVALUATING);
205 this.trafCOD.addListener(this, TrafficController.TRAFFICCONTROL_CONTROLLER_WARNING);
206 this.trafCOD.addListener(this, TrafficController.TRAFFICCONTROL_CONFLICT_GROUP_CHANGED);
207 this.trafCOD.addListener(this, TrafficController.TRAFFICCONTROL_STATE_CHANGED);
208 this.trafCOD.addListener(this, TrafficController.TRAFFICCONTROL_VARIABLE_CREATED);
209 this.trafCOD.addListener(this, TrafficController.TRAFFICCONTROL_TRACED_VARIABLE_UPDATED);
210
211 addListener(this.trafCOD, TrafficController.TRAFFICCONTROL_SET_TRACING);
212
213
214
215
216
217
218
219
220
221
222
223 }
224 catch (Exception exception)
225 {
226 exception.printStackTrace();
227 }
228 }
229
230
231 @Override
232 public final OTSRoadNetwork getNetwork()
233 {
234 return this.network;
235 }
236
237
238
239
240 public final TrafCOD getTrafCOD()
241 {
242 return this.trafCOD;
243 }
244
245
246
247
248 public final JPanel getControllerDisplayPanel()
249 {
250 return this.controllerDisplayPanel;
251 }
252
253
254 @Override
255 public void notify(final EventInterface event) throws RemoteException
256 {
257 EventType type = event.getType();
258 Object[] payload = (Object[]) event.getContent();
259 if (TrafficController.TRAFFICCONTROL_CONTROLLER_EVALUATING.equals(type))
260 {
261
262 return;
263 }
264 else if (TrafficController.TRAFFICCONTROL_CONFLICT_GROUP_CHANGED.equals(type))
265 {
266 System.out.println("Conflict group changed from " + ((String) payload[1]) + " to " + ((String) payload[2]));
267 }
268 else if (TrafficController.TRAFFICCONTROL_TRACED_VARIABLE_UPDATED.equals(type))
269 {
270 System.out.println(String.format("Variable changed %s <- %d %s", payload[1], payload[4], payload[5]));
271 }
272 else if (TrafficController.TRAFFICCONTROL_CONTROLLER_WARNING.equals(type))
273 {
274 System.out.println("Warning " + payload[1]);
275 }
276 else
277 {
278 System.out.print("TrafCODDemo received event of type " + event.getType() + ", payload [");
279 String separator = "";
280 for (Object o : payload)
281 {
282 System.out.print(separator + o);
283 separator = ",";
284 }
285 System.out.println("]");
286 }
287 }
288
289 }
290
291 }