1 package org.opentrafficsim.road.gtu.lane.perception.mental;
2
3 import static org.opentrafficsim.base.parameters.constraint.NumericConstraint.POSITIVE;
4 import static org.opentrafficsim.base.parameters.constraint.NumericConstraint.POSITIVEZERO;
5
6 import org.djunits.value.vdouble.scalar.Duration;
7 import org.djutils.exceptions.Throw;
8 import org.opentrafficsim.base.parameters.ParameterException;
9 import org.opentrafficsim.base.parameters.ParameterTypeDouble;
10 import org.opentrafficsim.base.parameters.ParameterTypeDuration;
11 import org.opentrafficsim.base.parameters.ParameterTypes;
12 import org.opentrafficsim.base.parameters.Parameters;
13 import org.opentrafficsim.road.gtu.lane.perception.mental.Fuller.BehavioralAdaptation;
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 public class AdaptationSituationalAwareness implements BehavioralAdaptation
34 {
35
36
37 public static final ParameterTypeDouble SA = new ParameterTypeDouble("SA", "Situational awareness", 1.0, POSITIVEZERO);
38
39
40 public static final ParameterTypeDouble SA_MIN =
41 new ParameterTypeDouble("SAmin", "Min. situational awareness", 0.5, POSITIVE)
42 {
43
44 private static final long serialVersionUID = 20180403L;
45
46
47 @Override
48 public void check(final Double value, final Parameters params) throws ParameterException
49 {
50 Double saMax = params.getParameterOrNull(SA_MAX);
51 Throw.when(saMax != null && value > saMax, ParameterException.class,
52 "Value for SA_MIN should not be larger than SA_MAX.");
53 }
54 };
55
56
57 public static final ParameterTypeDouble SA_MAX =
58 new ParameterTypeDouble("SAmax", "Max. situational awareness", 1.0, POSITIVE)
59 {
60
61 private static final long serialVersionUID = 20180403L;
62
63
64 @Override
65 public void check(final Double value, final Parameters params) throws ParameterException
66 {
67 Double saMin = params.getParameterOrNull(SA_MIN);
68 Throw.when(saMin != null && value < saMin, ParameterException.class,
69 "Value for SA_MAX should not be larger than SA_MIN.");
70 }
71 };
72
73
74 public static final ParameterTypeDuration TR_MAX =
75 new ParameterTypeDuration("TRmax", "Maximum reaction time", Duration.instantiateSI(2.0), POSITIVE);
76
77
78 @Override
79 public void adapt(final Parameters parameters, final double taskSaturation) throws ParameterException
80 {
81
82 double tsCrit = parameters.getParameter(Fuller.TS_CRIT);
83 double tsMax = parameters.getParameter(Fuller.TS_MAX);
84 double saMin = parameters.getParameter(SA_MIN);
85 double saMax = parameters.getParameter(SA_MAX);
86 double sa = taskSaturation < tsCrit ? saMax
87 : (taskSaturation >= tsMax ? saMin : saMax - (saMax - saMin) * (taskSaturation - tsCrit) / (tsMax - tsCrit));
88 parameters.setParameter(SA, sa);
89
90 parameters.setParameter(ParameterTypes.TR, parameters.getParameter(TR_MAX).times(saMax - sa));
91 }
92
93 }