1 package org.opentrafficsim.road.gtu.lane.tactical.following;
2
3 import java.io.Serializable;
4 import java.util.ArrayList;
5 import java.util.List;
6 import java.util.Set;
7
8 import org.djunits.unit.TimeUnit;
9 import org.djunits.value.vdouble.scalar.Acceleration;
10 import org.djunits.value.vdouble.scalar.Duration;
11 import org.djunits.value.vdouble.scalar.Length;
12 import org.djunits.value.vdouble.scalar.Speed;
13 import org.djunits.value.vdouble.scalar.Time;
14 import org.opentrafficsim.base.parameters.ParameterException;
15 import org.opentrafficsim.base.parameters.Parameters;
16 import org.opentrafficsim.core.dsol.OtsSimulatorInterface;
17 import org.opentrafficsim.road.gtu.lane.perception.PerceptionIterable;
18 import org.opentrafficsim.road.gtu.lane.perception.headway.Headway;
19 import org.opentrafficsim.road.network.speed.SpeedLimitInfo;
20
21
22
23
24
25
26
27
28
29
30
31 public class SequentialFixedAccelerationModel extends AbstractGtuFollowingModelMobil implements Serializable
32 {
33
34 private static final long serialVersionUID = 20150206L;
35
36
37 private final List<FixedAccelerationModel> steps = new ArrayList<>();
38
39
40 private final OtsSimulatorInterface simulator;
41
42
43 private final Acceleration maximumSafeDeceleration;
44
45
46
47
48
49
50 public SequentialFixedAccelerationModel(final OtsSimulatorInterface simulator, final Acceleration maximumSafeDeceleration)
51 {
52 this.simulator = simulator;
53 this.maximumSafeDeceleration = maximumSafeDeceleration;
54 }
55
56
57
58
59
60
61
62 public SequentialFixedAccelerationModel(final OtsSimulatorInterface simulator, final Acceleration maximumSafeDeceleration,
63 final Set<FixedAccelerationModel> steps)
64 {
65 this(simulator, maximumSafeDeceleration);
66 this.steps.addAll(steps);
67 }
68
69
70
71
72
73
74 public final SequentialFixedAccelerationModel addStep(final FixedAccelerationModel step)
75 {
76 this.steps.add(step);
77 return this;
78 }
79
80
81
82
83
84 public final int size()
85 {
86 return this.steps.size();
87 }
88
89
90
91
92
93
94 public final FixedAccelerationModel get(final int index)
95 {
96 return this.steps.get(index);
97 }
98
99
100
101
102
103
104 public final Time timeAfterCompletionOfStep(final int index)
105 {
106 Time sum = new Time(0, TimeUnit.DEFAULT);
107 for (int i = 0; i <= index; i++)
108 {
109 sum = sum.plus(this.steps.get(i).getDuration());
110 }
111 return sum;
112 }
113
114
115 private static final double MAXIMUMTIMEERROR = 0.001;
116
117
118
119
120
121 private FixedAccelerationModel getAccelerationModel()
122 {
123 Time when = this.simulator.getSimulatorAbsTime();
124 double remainingTime = when.getSI();
125 for (FixedAccelerationModel step : this.steps)
126 {
127 if (remainingTime < -MAXIMUMTIMEERROR)
128 {
129 throw new Error("FixedSequentialAcceleration does not have a result for " + when);
130 }
131 if (remainingTime < MAXIMUMTIMEERROR)
132 {
133 return step;
134 }
135 remainingTime -= step.getDuration().getSI();
136 }
137 throw new Error("FixedSequentialAcceleration does not have a result for " + when);
138 }
139
140 @Override
141 public final Acceleration computeAcceleration(final Speed followerSpeed, final Speed followerMaximumSpeed,
142 final Speed leaderSpeed, final Length headway, final Speed speedLimit)
143 {
144 return getAccelerationModel().getAcceleration();
145 }
146
147 @Override
148 public final Acceleration computeAcceleration(final Speed followerSpeed, final Speed followerMaximumSpeed,
149 final Speed leaderSpeed, final Length headway, final Speed speedLimit, final Duration stepSize)
150 {
151
152 return getAccelerationModel().getAcceleration();
153 }
154
155 @Override
156 public final Acceleration getMaximumSafeDeceleration()
157 {
158 return this.maximumSafeDeceleration;
159 }
160
161 @Override
162 public final Duration getStepSize()
163 {
164 return getAccelerationModel().getStepSize();
165 }
166
167 @Override
168 public final String getName()
169 {
170 return "FSAM";
171 }
172
173 @Override
174 public final String getLongName()
175 {
176 return "Fixed sequential acceleration model";
177 }
178
179 @Override
180 public final void setA(final Acceleration a)
181 {
182
183 }
184
185 @Override
186 public final void setT(final Duration t)
187 {
188
189 }
190
191 @Override
192 public final void setFspeed(final double fSpeed)
193 {
194
195 }
196
197
198
199 @Override
200 public final Speed desiredSpeed(final Parameters parameters, final SpeedLimitInfo speedInfo) throws ParameterException
201 {
202 return null;
203 }
204
205 @Override
206 public final Length desiredHeadway(final Parameters parameters, final Speed speed) throws ParameterException
207 {
208 return null;
209 }
210
211 @Override
212 public final Acceleration followingAcceleration(final Parameters parameters, final Speed speed,
213 final SpeedLimitInfo speedInfo, final PerceptionIterable<? extends Headway> leaders) throws ParameterException
214 {
215 return null;
216 }
217
218 @Override
219 public final String toString()
220 {
221 return "SequentialFixedAccelerationModel [steps=" + this.steps + ", maximumSafeDeceleration="
222 + this.maximumSafeDeceleration + "]";
223 }
224
225 }