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 }