1   package org.opentrafficsim.road.network.lane.object;
2   
3   import org.djunits.unit.DurationUnit;
4   import org.djunits.value.vdouble.scalar.Duration;
5   import org.djunits.value.vdouble.scalar.Length;
6   import org.djunits.value.vdouble.scalar.Speed;
7   import org.opentrafficsim.core.gtu.GTUType;
8   import org.opentrafficsim.core.network.LongitudinalDirectionality;
9   import org.opentrafficsim.core.network.NetworkException;
10  import org.opentrafficsim.road.network.lane.CrossSectionElement;
11  import org.opentrafficsim.road.network.lane.Lane;
12  
13  import nl.tudelft.simulation.dsol.simulators.SimulatorInterface;
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  
26  public class SpeedSign extends AbstractLaneBasedObject
27  {
28  
29      
30      private static final long serialVersionUID = 20170420L;
31  
32      
33      private static final Duration ENDOFDAY = new Duration(24, DurationUnit.HOUR);
34  
35      
36      private final Speed speed;
37  
38      
39      private final GTUType gtuType;
40  
41      
42      private final Duration startTimeOfDay;
43  
44      
45      private final Duration endTimeOfDay;
46  
47      
48  
49  
50  
51  
52  
53  
54  
55  
56  
57  
58  
59  
60      @SuppressWarnings("checkstyle:parameternumber")
61      public SpeedSign(final String id, final Lane lane, final LongitudinalDirectionality direction,
62              final Length longitudinalPosition, final SimulatorInterface.TimeDoubleUnit simulator, final Speed speed,
63              final GTUType gtuType, final Duration startTimeOfDay, final Duration endTimeOfDay) throws NetworkException
64      {
65          super(id, lane, direction, longitudinalPosition, LaneBasedObject.makeGeometry(lane, longitudinalPosition));
66          this.speed = speed;
67          this.gtuType = gtuType;
68          this.startTimeOfDay = startTimeOfDay;
69          this.endTimeOfDay = endTimeOfDay;
70      }
71  
72      
73  
74  
75  
76  
77  
78  
79  
80  
81  
82  
83      public SpeedSign(final String id, final Lane lane, final LongitudinalDirectionality direction,
84              final Length longitudinalPosition, final SimulatorInterface.TimeDoubleUnit simulator, final Speed speed,
85              final GTUType gtuType) throws NetworkException
86      {
87          this(id, lane, direction, longitudinalPosition, simulator, speed, gtuType, Duration.ZERO, ENDOFDAY);
88      }
89  
90      
91  
92  
93  
94  
95  
96  
97  
98  
99  
100 
101 
102     @SuppressWarnings("checkstyle:parameternumber")
103     public SpeedSign(final String id, final Lane lane, final LongitudinalDirectionality direction,
104             final Length longitudinalPosition, final SimulatorInterface.TimeDoubleUnit simulator, final Speed speed,
105             final Duration startTimeOfDay, final Duration endTimeOfDay) throws NetworkException
106     {
107         this(id, lane, direction, longitudinalPosition, simulator, speed, GTUType.VEHICLE, startTimeOfDay, endTimeOfDay);
108     }
109 
110     
111 
112 
113 
114 
115 
116 
117 
118 
119 
120     public SpeedSign(final String id, final Lane lane, final LongitudinalDirectionality direction,
121             final Length longitudinalPosition, final SimulatorInterface.TimeDoubleUnit simulator, final Speed speed)
122             throws NetworkException
123     {
124         this(id, lane, direction, longitudinalPosition, simulator, speed, GTUType.VEHICLE, Duration.ZERO, ENDOFDAY);
125     }
126 
127     
128 
129 
130 
131 
132 
133     public final boolean isActive(final GTUType gtuTypeIn, final Duration time)
134     {
135         return gtuTypeIn.isOfType(this.gtuType) && time.ge(this.startTimeOfDay) && time.le(this.endTimeOfDay);
136     }
137 
138     
139 
140 
141 
142     public final Speed getSpeed()
143     {
144         return this.speed;
145     }
146 
147     
148     @Override
149     public final AbstractLaneBasedObject clone(final CrossSectionElement newCSE,
150             final SimulatorInterface.TimeDoubleUnit newSimulator) throws NetworkException
151     {
152         return new SpeedSign(getId(), (Lane) newCSE, getDirection(), getLongitudinalPosition(), newSimulator, this.speed,
153                 this.gtuType, this.startTimeOfDay, this.endTimeOfDay);
154     }
155 
156     
157     @Override
158     public int hashCode()
159     {
160         final int prime = 31;
161         int result = 1;
162         result = prime * result + ((this.endTimeOfDay == null) ? 0 : this.endTimeOfDay.hashCode());
163         result = prime * result + ((this.gtuType == null) ? 0 : this.gtuType.hashCode());
164         result = prime * result + ((this.speed == null) ? 0 : this.speed.hashCode());
165         result = prime * result + ((this.startTimeOfDay == null) ? 0 : this.startTimeOfDay.hashCode());
166         return result;
167     }
168 
169     
170     @Override
171     public boolean equals(final Object obj)
172     {
173         if (this == obj)
174         {
175             return true;
176         }
177         if (obj == null)
178         {
179             return false;
180         }
181         if (getClass() != obj.getClass())
182         {
183             return false;
184         }
185         SpeedSign other = (SpeedSign) obj;
186         if (this.endTimeOfDay == null)
187         {
188             if (other.endTimeOfDay != null)
189             {
190                 return false;
191             }
192         }
193         else if (!this.endTimeOfDay.equals(other.endTimeOfDay))
194         {
195             return false;
196         }
197         if (this.gtuType == null)
198         {
199             if (other.gtuType != null)
200             {
201                 return false;
202             }
203         }
204         else if (!this.gtuType.equals(other.gtuType))
205         {
206             return false;
207         }
208         if (this.speed == null)
209         {
210             if (other.speed != null)
211             {
212                 return false;
213             }
214         }
215         else if (!this.speed.equals(other.speed))
216         {
217             return false;
218         }
219         if (this.startTimeOfDay == null)
220         {
221             if (other.startTimeOfDay != null)
222             {
223                 return false;
224             }
225         }
226         else if (!this.startTimeOfDay.equals(other.startTimeOfDay))
227         {
228             return false;
229         }
230         return true;
231     }
232 
233     
234     @Override
235     public final String toString()
236     {
237         return "SpeedSign [speed=" + this.speed + ", gtuType=" + this.gtuType + ", startTime=" + this.startTimeOfDay
238                 + ", endTime=" + this.endTimeOfDay + "]";
239     }
240 
241 }