1 package org.opentrafficsim.road.gtu.lane.perception.mental.channel;
2
3 import java.util.Set;
4 import java.util.function.BiFunction;
5 import java.util.function.Function;
6
7 import org.djutils.exceptions.Throw;
8 import org.opentrafficsim.base.parameters.ParameterException;
9 import org.opentrafficsim.core.network.LateralDirectionality;
10 import org.opentrafficsim.road.gtu.lane.LaneBasedGtu;
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.mental.AbstractTask;
14 import org.opentrafficsim.road.gtu.lane.perception.mental.DistractionField;
15 import org.opentrafficsim.road.network.lane.object.RoadSideDistraction;
16
17
18
19
20
21
22
23
24
25 public class ChannelTaskRoadSideDistraction extends AbstractTask implements ChannelTask
26 {
27
28
29 private final DistractionField distractionField;
30
31
32 private final LateralDirectionality direction;
33
34
35 private final BiFunction<RelativeLane, RoadSideDistraction, Boolean> filter;
36
37
38
39
40
41
42
43
44
45
46
47 public ChannelTaskRoadSideDistraction(final DistractionField distractionField, final LateralDirectionality direction)
48 {
49 super("road-side distraction (" + direction + ")");
50 Throw.whenNull(distractionField, "distractionField");
51 Throw.whenNull(direction, "direction");
52 this.distractionField = distractionField;
53 this.direction = direction;
54
55
56 this.filter = (lane, distraction) -> (lane.isCurrent() && this.direction.equals(distraction.getSide()))
57 || (this.direction.equals(lane.getLateralDirectionality()) && distraction.getSide().isNone());
58 }
59
60 @Override
61 protected double calculateTaskDemand(final LanePerception perception) throws ParameterException
62 {
63 return this.distractionField.getDistraction(this.filter);
64 }
65
66 @Override
67 public Object getChannel()
68 {
69 return this.direction.isLeft() ? LEFT : (this.direction.isRight() ? RIGHT : FRONT);
70 }
71
72
73
74
75
76 public static class Supplier implements Function<LanePerception, Set<ChannelTask>>
77 {
78
79 private final Set<ChannelTask> set;
80
81
82
83
84
85 public Supplier(final LaneBasedGtu gtu)
86 {
87 DistractionField distractionField = new DistractionField(gtu);
88 this.set = Set.of(new ChannelTaskRoadSideDistraction(distractionField, LateralDirectionality.LEFT),
89 new ChannelTaskRoadSideDistraction(distractionField, LateralDirectionality.NONE),
90 new ChannelTaskRoadSideDistraction(distractionField, LateralDirectionality.RIGHT));
91 }
92
93 @Override
94 public Set<ChannelTask> apply(final LanePerception t)
95 {
96 return this.set;
97 }
98 }
99
100 }