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 @Override
47 public void check(final Double value, final Parameters params) throws ParameterException
48 {
49 Double saMax = params.getParameterOrNull(SA_MAX);
50 Throw.when(saMax != null && value > saMax, ParameterException.class,
51 "Value for SA_MIN should not be larger than SA_MAX.");
52 }
53 };
54
55
56 public static final ParameterTypeDouble SA_MAX =
57 new ParameterTypeDouble("SAmax", "Max. situational awareness", 1.0, POSITIVE)
58 {
59
60 private static final long serialVersionUID = 20180403L;
61
62 @Override
63 public void check(final Double value, final Parameters params) throws ParameterException
64 {
65 Double saMin = params.getParameterOrNull(SA_MIN);
66 Throw.when(saMin != null && value < saMin, ParameterException.class,
67 "Value for SA_MAX should not be larger than SA_MIN.");
68 }
69 };
70
71
72 public static final ParameterTypeDuration TR_MAX =
73 new ParameterTypeDuration("TRmax", "Maximum reaction time", Duration.instantiateSI(2.0), POSITIVE);
74
75 @Override
76 public void adapt(final Parameters parameters, final double taskSaturation) throws ParameterException
77 {
78
79 double tsCrit = parameters.getParameter(Fuller.TS_CRIT);
80 double tsMax = parameters.getParameter(Fuller.TS_MAX);
81 double saMin = parameters.getParameter(SA_MIN);
82 double saMax = parameters.getParameter(SA_MAX);
83 double sa = taskSaturation < tsCrit ? saMax
84 : (taskSaturation >= tsMax ? saMin : saMax - (saMax - saMin) * (taskSaturation - tsCrit) / (tsMax - tsCrit));
85 parameters.setParameter(SA, sa);
86
87 parameters.setParameter(ParameterTypes.TR, parameters.getParameter(TR_MAX).times(saMax - sa));
88 }
89
90 }