1 package org.opentrafficsim.road.gtu.lane.tactical.lmrs;
2
3 import org.djunits.unit.LengthUnit;
4 import org.djunits.value.vdouble.scalar.Acceleration;
5 import org.djunits.value.vdouble.scalar.Length;
6 import org.djunits.value.vdouble.scalar.Speed;
7 import org.djunits.value.vdouble.scalar.Time;
8 import org.opentrafficsim.base.parameters.ParameterException;
9 import org.opentrafficsim.base.parameters.Parameters;
10 import org.opentrafficsim.core.gtu.GTUException;
11 import org.opentrafficsim.core.gtu.perception.EgoPerception;
12 import org.opentrafficsim.core.gtu.plan.operational.OperationalPlanException;
13 import org.opentrafficsim.road.gtu.lane.LaneBasedGTU;
14 import org.opentrafficsim.road.gtu.lane.perception.LanePerception;
15 import org.opentrafficsim.road.gtu.lane.perception.PerceptionCollectable;
16 import org.opentrafficsim.road.gtu.lane.perception.RelativeLane;
17 import org.opentrafficsim.road.gtu.lane.perception.categories.BusStopPerception;
18 import org.opentrafficsim.road.gtu.lane.perception.headway.HeadwayBusStop;
19 import org.opentrafficsim.road.gtu.lane.plan.operational.SimpleOperationalPlan;
20 import org.opentrafficsim.road.gtu.lane.tactical.following.CarFollowingModel;
21 import org.opentrafficsim.road.gtu.lane.tactical.pt.BusSchedule;
22 import org.opentrafficsim.road.gtu.lane.tactical.util.CarFollowingUtil;
23 import org.opentrafficsim.road.network.lane.object.BusStop;
24 import org.opentrafficsim.road.network.speed.SpeedLimitInfo;
25
26
27
28
29
30
31
32
33
34
35
36 public class AccelerationBusStop implements AccelerationIncentive
37 {
38
39
40
41 private static final Length STOP_DISTANCE = new Length(15.0, LengthUnit.SI);
42
43
44 @Override
45 @SuppressWarnings("checkstyle:parameternumber")
46 public final void accelerate(final SimpleOperationalPlan simplePlan, final RelativeLane lane, final LaneBasedGTU gtu,
47 final LanePerception perception, final CarFollowingModel carFollowingModel, final Speed speed,
48 final Parameters params, final SpeedLimitInfo speedLimitInfo)
49 throws OperationalPlanException, ParameterException, GTUException
50 {
51 PerceptionCollectable<HeadwayBusStop, BusStop> stops =
52 perception.getPerceptionCategory(BusStopPerception.class).getBusStops();
53 if (stops.isEmpty())
54 {
55 return;
56 }
57 BusSchedule busSchedule = (BusSchedule) gtu.getStrategicalPlanner().getRoute();
58 Time now = gtu.getSimulator().getSimulatorTime();
59 for (HeadwayBusStop stop : stops)
60 {
61 String busStopId = stop.getId();
62 if (busSchedule.isLineStop(busStopId, now))
63 {
64
65
66 boolean stoppedAtStop = stop.getRelativeLane().isCurrent() && stop.getDistance().le(STOP_DISTANCE)
67 && perception.getPerceptionCategory(EgoPerception.class).getSpeed().eq0();
68 if (busSchedule.getActualDepartureBusStop(busStopId) == null)
69 {
70 if (stoppedAtStop)
71 {
72
73 Time departureTime = now.plus(busSchedule.getDwellTime(busStopId));
74 if (busSchedule.isForceSchedule(busStopId))
75 {
76 departureTime = Time.max(departureTime, busSchedule.getDepartureTime(busStopId));
77 }
78 busSchedule.setActualDeparture(busStopId, stop.getConflictIds(), departureTime);
79 }
80 }
81
82
83 if (busSchedule.getActualDepartureBusStop(busStopId) == null
84 || now.lt(busSchedule.getActualDepartureBusStop(busStopId)))
85 {
86 if (stoppedAtStop)
87 {
88
89 simplePlan.minimizeAcceleration(Acceleration.ZERO);
90 }
91 else
92 {
93
94 simplePlan.minimizeAcceleration(
95 CarFollowingUtil.stop(carFollowingModel, params, speed, speedLimitInfo, stop.getDistance()));
96 }
97 }
98 }
99 }
100 }
101
102
103 @Override
104 public final String toString()
105 {
106 return "AccelerationBusStop";
107 }
108
109 }