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 init();
72 }
73
74
75
76
77
78
79
80
81
82
83
84
85 public SpeedSign(final String id, final Lane lane, final LongitudinalDirectionality direction,
86 final Length longitudinalPosition, final SimulatorInterface.TimeDoubleUnit simulator, final Speed speed,
87 final GTUType gtuType) throws NetworkException
88 {
89 this(id, lane, direction, longitudinalPosition, simulator, speed, gtuType, Duration.ZERO, ENDOFDAY);
90 }
91
92
93
94
95
96
97
98
99
100
101
102
103
104 @SuppressWarnings("checkstyle:parameternumber")
105 public SpeedSign(final String id, final Lane lane, final LongitudinalDirectionality direction,
106 final Length longitudinalPosition, final SimulatorInterface.TimeDoubleUnit simulator, final Speed speed,
107 final Duration startTimeOfDay, final Duration endTimeOfDay) throws NetworkException
108 {
109 this(id, lane, direction, longitudinalPosition, simulator, speed,
110 lane.getNetwork().getGtuType(GTUType.DEFAULTS.VEHICLE), startTimeOfDay, endTimeOfDay);
111 }
112
113
114
115
116
117
118
119
120
121
122
123 public SpeedSign(final String id, final Lane lane, final LongitudinalDirectionality direction,
124 final Length longitudinalPosition, final SimulatorInterface.TimeDoubleUnit simulator, final Speed speed)
125 throws NetworkException
126 {
127 this(id, lane, direction, longitudinalPosition, simulator, speed,
128 lane.getNetwork().getGtuType(GTUType.DEFAULTS.VEHICLE), Duration.ZERO, ENDOFDAY);
129 }
130
131
132
133
134
135
136
137 public final boolean isActive(final GTUType gtuTypeIn, final Duration time)
138 {
139 return gtuTypeIn.isOfType(this.gtuType) && time.ge(this.startTimeOfDay) && time.le(this.endTimeOfDay);
140 }
141
142
143
144
145
146 public final Speed getSpeed()
147 {
148 return this.speed;
149 }
150
151
152 @Override
153 public final AbstractLaneBasedObject clone(final CrossSectionElement newCSE,
154 final SimulatorInterface.TimeDoubleUnit newSimulator) throws NetworkException
155 {
156 return new SpeedSign(getId(), (Lane) newCSE, getDirection(), getLongitudinalPosition(), newSimulator, this.speed,
157 this.gtuType, this.startTimeOfDay, this.endTimeOfDay);
158 }
159
160
161 @Override
162 public int hashCode()
163 {
164 final int prime = 31;
165 int result = 1;
166 result = prime * result + ((this.endTimeOfDay == null) ? 0 : this.endTimeOfDay.hashCode());
167 result = prime * result + ((this.gtuType == null) ? 0 : this.gtuType.hashCode());
168 result = prime * result + ((this.speed == null) ? 0 : this.speed.hashCode());
169 result = prime * result + ((this.startTimeOfDay == null) ? 0 : this.startTimeOfDay.hashCode());
170 return result;
171 }
172
173
174 @Override
175 public boolean equals(final Object obj)
176 {
177 if (this == obj)
178 {
179 return true;
180 }
181 if (obj == null)
182 {
183 return false;
184 }
185 if (getClass() != obj.getClass())
186 {
187 return false;
188 }
189 SpeedSign/../../../../../org/opentrafficsim/road/network/lane/object/SpeedSign.html#SpeedSign">SpeedSign other = (SpeedSign) obj;
190 if (this.endTimeOfDay == null)
191 {
192 if (other.endTimeOfDay != null)
193 {
194 return false;
195 }
196 }
197 else if (!this.endTimeOfDay.equals(other.endTimeOfDay))
198 {
199 return false;
200 }
201 if (this.gtuType == null)
202 {
203 if (other.gtuType != null)
204 {
205 return false;
206 }
207 }
208 else if (!this.gtuType.equals(other.gtuType))
209 {
210 return false;
211 }
212 if (this.speed == null)
213 {
214 if (other.speed != null)
215 {
216 return false;
217 }
218 }
219 else if (!this.speed.equals(other.speed))
220 {
221 return false;
222 }
223 if (this.startTimeOfDay == null)
224 {
225 if (other.startTimeOfDay != null)
226 {
227 return false;
228 }
229 }
230 else if (!this.startTimeOfDay.equals(other.startTimeOfDay))
231 {
232 return false;
233 }
234 return true;
235 }
236
237
238 @Override
239 public final String toString()
240 {
241 return "SpeedSign [speed=" + this.speed + ", gtuType=" + this.gtuType + ", startTime=" + this.startTimeOfDay
242 + ", endTime=" + this.endTimeOfDay + "]";
243 }
244
245 }