1 package org.opentrafficsim.road.gtu.lane.tactical.lmrs;
2
3 import org.djunits.value.vdouble.scalar.Length;
4 import org.djunits.value.vdouble.scalar.Speed;
5 import org.opentrafficsim.base.parameters.ParameterException;
6 import org.opentrafficsim.base.parameters.Parameters;
7 import org.opentrafficsim.core.gtu.Stateless;
8 import org.opentrafficsim.core.gtu.plan.operational.OperationalPlanException;
9 import org.opentrafficsim.road.gtu.lane.LaneBasedGtu;
10 import org.opentrafficsim.road.gtu.lane.perception.FilteredIterable;
11 import org.opentrafficsim.road.gtu.lane.perception.LanePerception;
12 import org.opentrafficsim.road.gtu.lane.perception.RelativeLane;
13 import org.opentrafficsim.road.gtu.lane.perception.categories.IntersectionPerception;
14 import org.opentrafficsim.road.gtu.lane.perception.object.PerceivedTrafficLight;
15 import org.opentrafficsim.road.gtu.lane.plan.operational.SimpleOperationalPlan;
16 import org.opentrafficsim.road.gtu.lane.tactical.following.CarFollowingModel;
17 import org.opentrafficsim.road.gtu.lane.tactical.util.TrafficLightUtil;
18 import org.opentrafficsim.road.network.speed.SpeedLimitInfo;
19
20
21
22
23
24
25
26
27
28
29
30 public final class AccelerationTrafficLights implements AccelerationIncentive, Stateless<AccelerationTrafficLights>
31 {
32
33
34 public static final AccelerationTrafficLights SINGLETON = new AccelerationTrafficLights();
35
36 @Override
37 public AccelerationTrafficLights get()
38 {
39 return SINGLETON;
40 }
41
42
43
44
45 private AccelerationTrafficLights()
46 {
47
48 }
49
50 @Override
51 public void accelerate(final SimpleOperationalPlan simplePlan, final RelativeLane lane, final Length mergeDistance,
52 final LaneBasedGtu gtu, final LanePerception perception, final CarFollowingModel carFollowingModel,
53 final Speed speed, final Parameters params, final SpeedLimitInfo speedLimitInfo)
54 throws ParameterException, OperationalPlanException
55 {
56 Iterable<PerceivedTrafficLight> it =
57 perception.getPerceptionCategory(IntersectionPerception.class).getTrafficLights(lane);
58 if (!lane.isCurrent() && mergeDistance.gt0())
59 {
60 it = new FilteredIterable<>(it, (trafficLight) ->
61 {
62 return trafficLight.getDistance().gt(mergeDistance);
63 });
64 }
65 it = onRoute(it, gtu);
66 simplePlan.minimizeAcceleration(
67 TrafficLightUtil.respondToTrafficLights(params, it, carFollowingModel, speed, speedLimitInfo));
68 }
69
70 @Override
71 public String toString()
72 {
73 return "AccelerationTrafficLights";
74 }
75
76 }