1 package org.opentrafficsim.road.gtu.strategical;
2
3 import java.io.Serializable;
4
5 import org.djunits.value.vdouble.scalar.Length;
6 import org.djunits.value.vdouble.scalar.Speed;
7 import org.opentrafficsim.base.parameters.ParameterException;
8 import org.opentrafficsim.base.parameters.Parameters;
9 import org.opentrafficsim.core.gtu.GtuException;
10 import org.opentrafficsim.core.gtu.GtuType;
11 import org.opentrafficsim.core.network.Node;
12 import org.opentrafficsim.core.network.route.Route;
13 import org.opentrafficsim.core.parameters.ParameterFactory;
14 import org.opentrafficsim.core.parameters.ParameterFactoryDefault;
15 import org.opentrafficsim.road.gtu.lane.LaneBasedGtu;
16 import org.opentrafficsim.road.gtu.lane.tactical.LaneBasedTacticalPlanner;
17 import org.opentrafficsim.road.gtu.lane.tactical.LaneBasedTacticalPlannerFactory;
18
19
20
21
22
23
24
25
26
27
28
29 public class LaneBasedStrategicalRoutePlannerFactory
30 implements LaneBasedStrategicalPlannerFactory<LaneBasedStrategicalRoutePlanner>, Serializable
31 {
32
33
34 private static final long serialVersionUID = 20160811L;
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 Parameters peekedParameters = null;
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 final Speed peekDesiredSpeed(final GtuType gtuType, final Speed speedLimit, final Speed maxGtuSpeed)
91 throws GtuException
92 {
93 return this.tacticalPlannerFactory.peekDesiredSpeed(gtuType, speedLimit, maxGtuSpeed, peekParameters(gtuType));
94 }
95
96 @Override
97 public final 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 != null)
111 {
112 return this.peekedParameters;
113 }
114 try
115 {
116 this.peekedParameters = this.tacticalPlannerFactory.getParameters();
117 this.parameterFactory.setValues(this.peekedParameters, gtuType);
118 }
119 catch (ParameterException exception)
120 {
121 throw new GtuException("Parameter was set to illegal value.", exception);
122 }
123 return this.peekedParameters;
124 }
125
126 @Override
127 public final LaneBasedStrategicalRoutePlanner create(final LaneBasedGtu gtu, final Route route, final Node origin,
128 final Node destination) throws GtuException
129 {
130 LaneBasedStrategicalRoutePlanner strategicalPlanner = new LaneBasedStrategicalRoutePlanner(
131 this.tacticalPlannerFactory.create(gtu), route, gtu, origin, destination, this.routeGenerator);
132 gtu.setParameters(nextParameters(gtu.getType()));
133 return strategicalPlanner;
134 }
135
136
137
138
139
140
141
142 protected final Parameters nextParameters(final GtuType gtuType) throws GtuException
143 {
144 Parameters parameters = peekParameters(gtuType);
145 this.peekedParameters = null;
146 return parameters;
147 }
148
149 @Override
150 public final String toString()
151 {
152 return "LaneBasedStrategicalRoutePlannerFactory [tacticalPlannerFactory=" + this.tacticalPlannerFactory + "]";
153 }
154
155 }