1 package org.opentrafficsim.road.gtu.strategical;
2
3 import java.util.LinkedHashMap;
4 import java.util.Map;
5 import java.util.Optional;
6
7 import org.djunits.value.vdouble.scalar.Length;
8 import org.djunits.value.vdouble.scalar.Speed;
9 import org.opentrafficsim.base.parameters.ParameterException;
10 import org.opentrafficsim.base.parameters.Parameters;
11 import org.opentrafficsim.core.gtu.GtuException;
12 import org.opentrafficsim.core.gtu.GtuType;
13 import org.opentrafficsim.core.network.Node;
14 import org.opentrafficsim.core.network.route.Route;
15 import org.opentrafficsim.core.parameters.ParameterFactory;
16 import org.opentrafficsim.core.parameters.ParameterFactoryDefault;
17 import org.opentrafficsim.road.gtu.LaneBasedGtu;
18 import org.opentrafficsim.road.gtu.tactical.LaneBasedTacticalPlanner;
19 import org.opentrafficsim.road.gtu.tactical.LaneBasedTacticalPlannerFactory;
20 import org.opentrafficsim.road.network.speed.SpeedLimits;
21
22
23
24
25
26
27
28
29
30
31
32 public class LaneBasedStrategicalRoutePlannerFactory
33 implements LaneBasedStrategicalPlannerFactory<LaneBasedStrategicalRoutePlanner>
34 {
35
36
37 private final LaneBasedTacticalPlannerFactory<? extends LaneBasedTacticalPlanner> tacticalPlannerFactory;
38
39
40 private final RouteGenerator routeGenerator;
41
42
43 private final ParameterFactory parameterFactory;
44
45
46 private Map<GtuType, Parameters> peekedParameters = new LinkedHashMap<>();
47
48
49
50
51
52 public LaneBasedStrategicalRoutePlannerFactory(
53 final LaneBasedTacticalPlannerFactory<? extends LaneBasedTacticalPlanner> tacticalPlannerFactory)
54 {
55 this.tacticalPlannerFactory = tacticalPlannerFactory;
56 this.routeGenerator = RouteGenerator.NULL;
57 this.parameterFactory = new ParameterFactoryDefault();
58 }
59
60
61
62
63
64
65 public LaneBasedStrategicalRoutePlannerFactory(
66 final LaneBasedTacticalPlannerFactory<? extends LaneBasedTacticalPlanner> tacticalPlannerFactory,
67 final ParameterFactory parametersFactory)
68 {
69 this.tacticalPlannerFactory = tacticalPlannerFactory;
70 this.routeGenerator = RouteGenerator.NULL;
71 this.parameterFactory = parametersFactory;
72 }
73
74
75
76
77
78
79
80 public LaneBasedStrategicalRoutePlannerFactory(
81 final LaneBasedTacticalPlannerFactory<? extends LaneBasedTacticalPlanner> tacticalPlannerFactory,
82 final ParameterFactory parametersFactory, final RouteGenerator routeGenerator)
83 {
84 this.tacticalPlannerFactory = tacticalPlannerFactory;
85 this.parameterFactory = parametersFactory;
86 this.routeGenerator = routeGenerator;
87 }
88
89 @Override
90 public Optional<Speed> peekDesiredSpeed(final GtuType gtuType, final SpeedLimits speedLimits, final Speed maxVehicleSpeed)
91 throws GtuException
92 {
93 return this.tacticalPlannerFactory.peekDesiredSpeed(gtuType, speedLimits, maxVehicleSpeed, peekParameters(gtuType));
94 }
95
96 @Override
97 public Optional<Length> peekDesiredHeadway(final GtuType gtuType, final Speed speed) throws GtuException
98 {
99 return this.tacticalPlannerFactory.peekDesiredHeadway(gtuType, speed, peekParameters(gtuType));
100 }
101
102
103
104
105
106
107
108 private Parameters peekParameters(final GtuType gtuType) throws GtuException
109 {
110 if (this.peekedParameters.containsKey(gtuType))
111 {
112 return this.peekedParameters.get(gtuType);
113 }
114 try
115 {
116 Parameters parameters = this.tacticalPlannerFactory.getParameters(gtuType);
117 this.parameterFactory.setValues(parameters, gtuType);
118 this.peekedParameters.put(gtuType, parameters);
119 return parameters;
120 }
121 catch (ParameterException exception)
122 {
123 throw new GtuException("Parameter was set to illegal value.", exception);
124 }
125 }
126
127 @Override
128 public final LaneBasedStrategicalRoutePlanner create(final LaneBasedGtu gtu, final Route route, final Node origin,
129 final Node destination) throws GtuException
130 {
131 LaneBasedStrategicalRoutePlanner strategicalPlanner = new LaneBasedStrategicalRoutePlanner(
132 this.tacticalPlannerFactory.create(gtu), route, gtu, origin, destination, this.routeGenerator);
133 gtu.setParameters(nextParameters(gtu.getType()));
134 return strategicalPlanner;
135 }
136
137
138
139
140
141
142
143 protected final Parameters nextParameters(final GtuType gtuType) throws GtuException
144 {
145 Parameters parameters = peekParameters(gtuType);
146 this.peekedParameters.remove(gtuType);
147 return parameters;
148 }
149
150 @Override
151 public final String toString()
152 {
153 return "LaneBasedStrategicalRoutePlannerFactory [tacticalPlannerFactory=" + this.tacticalPlannerFactory + "]";
154 }
155
156 }