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 }