1 package org.opentrafficsim.road.gtu.lane;
2
3 import java.util.function.Supplier;
4
5 import org.djunits.value.vdouble.scalar.Length;
6 import org.djutils.exceptions.Throw;
7 import org.opentrafficsim.road.gtu.lane.perception.PerceptionCollectable.Intermediate;
8 import org.opentrafficsim.road.gtu.lane.perception.PerceptionCollectable.PerceptionAccumulator;
9 import org.opentrafficsim.road.gtu.lane.perception.PerceptionCollectable.PerceptionCollector;
10 import org.opentrafficsim.road.gtu.lane.perception.PerceptionCollectable.PerceptionFinalizer;
11
12
13
14
15
16
17
18
19
20
21
22
23
24 public class CollisionDetector implements PerceptionCollector<Void, LaneBasedGTU, Void>
25 {
26
27
28 private final String id;
29
30
31
32
33
34 public CollisionDetector(final String id)
35 {
36 this.id = id;
37 }
38
39
40 @Override
41 public Supplier<Void> getIdentity()
42 {
43 return new Supplier<Void>()
44 {
45
46 @Override
47 public Void get()
48 {
49 return null;
50 }
51 };
52 }
53
54
55 @Override
56 public PerceptionAccumulator<LaneBasedGTU, Void> getAccumulator()
57 {
58 return new PerceptionAccumulator<LaneBasedGTU, Void>()
59 {
60
61 @SuppressWarnings("synthetic-access")
62 @Override
63 public Intermediate<Void> accumulate(final Intermediate<Void> intermediate, final LaneBasedGTU object,
64 final Length distance)
65 {
66 Throw.when(distance.lt0(), CollisionException.class, "GTU %s collided with GTU %s", CollisionDetector.this.id,
67 object.getId());
68 intermediate.stop();
69 return intermediate;
70 }
71 };
72 }
73
74
75 @Override
76 public PerceptionFinalizer<Void, Void> getFinalizer()
77 {
78 return new PerceptionFinalizer<Void, Void>()
79 {
80 @Override
81 public Void collect(final Void intermediate)
82 {
83 return null;
84 }
85 };
86 }
87
88 }