1 package org.opentrafficsim.road.gtu.lane.perception.mental;
2
3 import java.util.Iterator;
4 import java.util.LinkedHashMap;
5 import java.util.Map;
6
7 import org.djunits.value.vdouble.scalar.Length;
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.RelativePosition;
12 import org.opentrafficsim.road.gtu.lane.LaneBasedGtu;
13 import org.opentrafficsim.road.gtu.lane.perception.LanePerception;
14 import org.opentrafficsim.road.gtu.lane.perception.RelativeLane;
15 import org.opentrafficsim.road.gtu.lane.perception.structure.NavigatingIterable.Entry;
16 import org.opentrafficsim.road.network.lane.object.Distraction;
17
18
19
20
21
22
23
24
25
26
27
28 public class TaskRoadSideDistraction extends AbstractTask
29 {
30
31
32 private Map<Distraction, Double> odos = new LinkedHashMap<>();
33
34
35 public TaskRoadSideDistraction()
36 {
37 super("road-side distraction");
38 }
39
40 @Override
41 public double calculateTaskDemand(final LanePerception perception, final LaneBasedGtu gtu, final Parameters parameters)
42 throws ParameterException, GtuException
43 {
44 double odo = gtu.getOdometer().si;
45
46 for (RelativeLane lane : perception.getLaneStructure().getRootCrossSection())
47 {
48 for (Entry<Distraction> distraction : perception.getLaneStructure().getDownstreamObjects(lane, Distraction.class,
49 RelativePosition.FRONT, false))
50 {
51 this.odos.put(distraction.object(), odo + distraction.distance().si);
52 }
53 }
54
55
56 Iterator<Distraction> it = this.odos.keySet().iterator();
57 double demand = 0.0;
58 while (it.hasNext())
59 {
60 Distraction next = it.next();
61 Double distraction = next.getDistraction(Length.instantiateSI(odo - this.odos.get(next)));
62 if (distraction == null)
63 {
64 it.remove();
65 }
66 else
67 {
68 demand += distraction;
69 }
70 }
71 return demand;
72 }
73
74 }