View Javadoc
1   package org.opentrafficsim.road.network.factory.opendrive;
2   
3   import java.io.Serializable;
4   import java.util.HashMap;
5   import java.util.HashSet;
6   import java.util.Map;
7   import java.util.Set;
8   
9   import javax.naming.NamingException;
10  
11  import org.djunits.unit.TimeUnit;
12  import org.djunits.value.vdouble.scalar.Duration;
13  import org.opentrafficsim.core.dsol.OTSAnimatorInterface;
14  import org.opentrafficsim.core.dsol.OTSDEVSSimulatorInterface;
15  import org.opentrafficsim.core.gtu.GTUException;
16  import org.opentrafficsim.core.network.NetworkException;
17  import org.opentrafficsim.road.network.lane.object.trafficlight.SimpleTrafficLight;
18  import org.opentrafficsim.road.network.lane.object.trafficlight.TrafficLightColor;
19  
20  import nl.tudelft.simulation.dsol.SimRuntimeException;
21  
22  /**
23   * Traffic Light Controller
24   * <p>
25   * Copyright (c) 2013-2016 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved. <br>
26   * BSD-style license. See <a href="http://opentrafficsim.org/docs/license.html">OpenTrafficSim License</a>.
27   * <p>
28   * @version $Revision: 1155 $, $LastChangedDate: 2015-07-26 01:01:13 +0200 (Sun, 26 Jul 2015) $, by $Author: averbraeck $,
29   *          initial version 15 jul. 2015 <br>
30   * @author <a href="http://www.tbm.tudelft.nl/averbraeck">Alexander Verbraeck</a>
31   * @author <a href="http://www.tudelft.nl/pknoppers">Peter Knoppers</a>
32   */
33  public class Controller implements Serializable
34  {
35  
36      /** */
37      private static final long serialVersionUID = 20150715L;
38  
39      /** */
40      private OTSDEVSSimulatorInterface simulator;
41  
42      /** */
43      private String id;
44  
45      /** */
46      private Map<Integer, Set<SimpleTrafficLight>> trafficLights = new HashMap<Integer, Set<SimpleTrafficLight>>();
47  
48      /**
49       * @param name the name of the OnOffTrafficLight
50       * @param simulator the simulator to avoid NullPointerExceptions
51       * @throws GTUException when GTU cannot be created.
52       * @throws NamingException if an error occurs when adding the animation handler
53       * @throws NetworkException when the GTU cannot be placed on the given lane
54       */
55      public Controller(final String name, final OTSDEVSSimulatorInterface simulator) throws GTUException,
56          NetworkException, NamingException
57      {
58          this.id = name;
59          this.simulator = simulator;
60  
61          try
62          {
63              // new DefaultBlockOnOffAnimation(this, getSimulator());
64              // animation
65              if (simulator instanceof OTSAnimatorInterface)
66              {
67                  // TODO
68              }
69              simulator.scheduleEventRel(new Duration(0.0, TimeUnit.SECOND), this, this, "unBlock", null);
70          }
71          catch (SimRuntimeException exception)
72          {
73              exception.printStackTrace();
74          }
75      }
76  
77      /**
78       * 
79       */
80      protected void unBlock()
81      {
82          try
83          {
84              this.simulator.scheduleEventRel(new Duration(96.0, TimeUnit.SECOND), this, this, "unBlock", null);
85          }
86          catch (SimRuntimeException exception)
87          {
88              exception.printStackTrace();
89          }
90  
91          if (this.trafficLights.containsKey(3))
92          {
93              for (SimpleTrafficLight light : this.trafficLights.get(3))
94              {
95                  try
96                  {
97                      // System.out.println("traffic light 3 at time " + this.simulator.getSimulatorTime() + " is " +
98                      // ((TrafficLight) light).getTrafficLightColor().toString());
99                      this.simulator.scheduleEventRel(new Duration(0.0, TimeUnit.SECOND), this, light,
100                         "setTrafficLightColor", new Object[]{TrafficLightColor.GREEN});
101                     this.simulator.scheduleEventRel(new Duration(15.0, TimeUnit.SECOND), this, light,
102                         "setTrafficLightColor", new Object[]{TrafficLightColor.YELLOW});
103                     this.simulator.scheduleEventRel(new Duration(24.0, TimeUnit.SECOND), this, light,
104                         "setTrafficLightColor", new Object[]{TrafficLightColor.RED});
105                 }
106                 catch (SimRuntimeException exception)
107                 {
108                     exception.printStackTrace();
109                 }
110             }
111         }
112         if (this.trafficLights.containsKey(4))
113         {
114             for (SimpleTrafficLight light : this.trafficLights.get(4))
115             {
116                 try
117                 {
118                     this.simulator.scheduleEventRel(new Duration(0.0, TimeUnit.SECOND), this, light,
119                         "setTrafficLightColor", new Object[]{TrafficLightColor.GREEN});
120                     this.simulator.scheduleEventRel(new Duration(15.0, TimeUnit.SECOND), this, light,
121                         "setTrafficLightColor", new Object[]{TrafficLightColor.YELLOW});
122                     this.simulator.scheduleEventRel(new Duration(24.0, TimeUnit.SECOND), this, light,
123                         "setTrafficLightColor", new Object[]{TrafficLightColor.RED});
124                 }
125                 catch (SimRuntimeException exception)
126                 {
127                     exception.printStackTrace();
128                 }
129             }
130         }
131         if (this.trafficLights.containsKey(6))
132         {
133             for (SimpleTrafficLight light : this.trafficLights.get(6))
134             {
135                 try
136                 {
137                     // System.out.println("traffic light 6 at time " + this.simulator.getSimulatorTime());
138 
139                     this.simulator.scheduleEventRel(new Duration(24.0, TimeUnit.SECOND), this, light,
140                         "setTrafficLightColor", new Object[]{TrafficLightColor.GREEN});
141                     this.simulator.scheduleEventRel(new Duration(39.0, TimeUnit.SECOND), this, light,
142                         "setTrafficLightColor", new Object[]{TrafficLightColor.YELLOW});
143                     this.simulator.scheduleEventRel(new Duration(48.0, TimeUnit.SECOND), this, light,
144                         "setTrafficLightColor", new Object[]{TrafficLightColor.RED});
145                 }
146                 catch (SimRuntimeException exception)
147                 {
148                     exception.printStackTrace();
149                 }
150             }
151         }
152         if (this.trafficLights.containsKey(7))
153         {
154             for (SimpleTrafficLight light : this.trafficLights.get(7))
155             {
156                 try
157                 {
158                     this.simulator.scheduleEventRel(new Duration(24.0, TimeUnit.SECOND), this, light,
159                         "setTrafficLightColor", new Object[]{TrafficLightColor.GREEN});
160                     this.simulator.scheduleEventRel(new Duration(39.0, TimeUnit.SECOND), this, light,
161                         "setTrafficLightColor", new Object[]{TrafficLightColor.YELLOW});
162                     this.simulator.scheduleEventRel(new Duration(48.0, TimeUnit.SECOND), this, light,
163                         "setTrafficLightColor", new Object[]{TrafficLightColor.RED});
164                 }
165                 catch (SimRuntimeException exception)
166                 {
167                     exception.printStackTrace();
168                 }
169             }
170         }
171         if (this.trafficLights.containsKey(9))
172         {
173             for (SimpleTrafficLight light : this.trafficLights.get(9))
174             {
175                 try
176                 {
177                     // System.out.println("traffic light 9 at time " + this.simulator.getSimulatorTime());
178 
179                     this.simulator.scheduleEventRel(new Duration(48.0, TimeUnit.SECOND), this, light,
180                         "setTrafficLightColor", new Object[]{TrafficLightColor.GREEN});
181                     this.simulator.scheduleEventRel(new Duration(63.0, TimeUnit.SECOND), this, light,
182                         "setTrafficLightColor", new Object[]{TrafficLightColor.YELLOW});
183                     this.simulator.scheduleEventRel(new Duration(72.0, TimeUnit.SECOND), this, light,
184                         "setTrafficLightColor", new Object[]{TrafficLightColor.RED});
185                 }
186                 catch (SimRuntimeException exception)
187                 {
188                     exception.printStackTrace();
189                 }
190             }
191         }
192         if (this.trafficLights.containsKey(10))
193         {
194             for (SimpleTrafficLight light : this.trafficLights.get(10))
195             {
196                 try
197                 {
198                     this.simulator.scheduleEventRel(new Duration(48.0, TimeUnit.SECOND), this, light,
199                         "setTrafficLightColor", new Object[]{TrafficLightColor.GREEN});
200                     this.simulator.scheduleEventRel(new Duration(63.0, TimeUnit.SECOND), this, light,
201                         "setTrafficLightColor", new Object[]{TrafficLightColor.YELLOW});
202                     this.simulator.scheduleEventRel(new Duration(72.0, TimeUnit.SECOND), this, light,
203                         "setTrafficLightColor", new Object[]{TrafficLightColor.RED});
204                 }
205                 catch (SimRuntimeException exception)
206                 {
207                     exception.printStackTrace();
208                 }
209             }
210         }
211         if (this.trafficLights.containsKey(12))
212         {
213             for (SimpleTrafficLight light : this.trafficLights.get(12))
214             {
215                 try
216                 {
217                     // System.out.println("traffic light 12 at time " + this.simulator.getSimulatorTime());
218 
219                     this.simulator.scheduleEventRel(new Duration(72.0, TimeUnit.SECOND), this, light,
220                         "setTrafficLightColor", new Object[]{TrafficLightColor.GREEN});
221                     this.simulator.scheduleEventRel(new Duration(87.0, TimeUnit.SECOND), this, light,
222                         "setTrafficLightColor", new Object[]{TrafficLightColor.YELLOW});
223                     this.simulator.scheduleEventRel(new Duration(96.0, TimeUnit.SECOND), this, light,
224                         "setTrafficLightColor", new Object[]{TrafficLightColor.RED});
225                 }
226                 catch (SimRuntimeException exception)
227                 {
228                     exception.printStackTrace();
229                 }
230             }
231         }
232         if (this.trafficLights.containsKey(13))
233         {
234             for (SimpleTrafficLight light : this.trafficLights.get(13))
235             {
236                 try
237                 {
238                     this.simulator.scheduleEventRel(new Duration(72.0, TimeUnit.SECOND), this, light,
239                         "setTrafficLightColor", new Object[]{TrafficLightColor.GREEN});
240                     this.simulator.scheduleEventRel(new Duration(87.0, TimeUnit.SECOND), this, light,
241                         "setTrafficLightColor", new Object[]{TrafficLightColor.YELLOW});
242                     this.simulator.scheduleEventRel(new Duration(96.0, TimeUnit.SECOND), this, light,
243                         "setTrafficLightColor", new Object[]{TrafficLightColor.RED});
244                 }
245                 catch (SimRuntimeException exception)
246                 {
247                     exception.printStackTrace();
248                 }
249             }
250         }
251     }
252 
253     /**
254      * @param sequence2 sequence2
255      * @param trafficLight trafficLight
256      */
257     public void addTrafficLight(int sequence2, SimpleTrafficLight trafficLight)
258     {
259         if (!this.trafficLights.containsKey(sequence2))
260         {
261             Set<SimpleTrafficLight> trafficLightsSet = new HashSet<SimpleTrafficLight>();
262             this.trafficLights.put(sequence2, trafficLightsSet);
263         }
264         this.trafficLights.get(sequence2).add(trafficLight);
265     }
266 
267     /** {@inheritDoc} */
268     @Override
269     public final String toString()
270     {
271         return "Controller [id=" + this.id + ", trafficLights=" + this.trafficLights + "]";
272     }
273 
274 }