1 package org.opentrafficsim.road.gtu.lane.tactical.util.lmrs;
2
3 import java.util.HashMap;
4 import java.util.HashSet;
5 import java.util.Map;
6 import java.util.Set;
7
8 import org.opentrafficsim.road.gtu.lane.LaneBasedGTU;
9 import org.opentrafficsim.road.gtu.lane.perception.PerceptionCollectable;
10 import org.opentrafficsim.road.gtu.lane.perception.headway.HeadwayGTU;
11 import org.opentrafficsim.road.gtu.lane.tactical.DesireBased;
12 import org.opentrafficsim.road.gtu.lane.tactical.Synchronizable;
13
14
15
16
17
18
19
20
21
22
23
24
25 public final class LmrsData implements DesireBased, Synchronizable
26 {
27
28
29 private final Synchronization synchronization;
30
31
32 private final Cooperation cooperation;
33
34
35 private final GapAcceptance gapAcceptance;
36
37
38 private final Tailgating tailGating;
39
40
41 private final Set<String> leaders = new HashSet<>();
42
43
44 private final Set<String> tempLeaders = new HashSet<>();
45
46
47 private final Map<Class<? extends Incentive>, Desire> desireMap = new HashMap<>();
48
49
50 private Synchronizable.State synchronizationState;
51
52
53 private String syncVehicle;
54
55
56 private boolean humanLongitudinalControl = true;
57
58
59
60
61
62
63
64 public LmrsData(final Synchronization synchronization, final Cooperation cooperation, final GapAcceptance gapAcceptance,
65 final Tailgating tailGating)
66 {
67 this.synchronization = synchronization;
68 this.cooperation = cooperation;
69 this.gapAcceptance = gapAcceptance;
70 this.tailGating = tailGating;
71 }
72
73
74
75
76
77
78 boolean isNewLeader(final HeadwayGTU gtu)
79 {
80 this.tempLeaders.add(gtu.getId());
81 return !this.leaders.contains(gtu.getId());
82 }
83
84
85
86
87 void finalizeStep()
88 {
89 this.leaders.clear();
90 this.leaders.addAll(this.tempLeaders);
91 this.tempLeaders.clear();
92 }
93
94
95
96
97
98 void setSyncVehicle(final HeadwayGTU gtu)
99 {
100 this.syncVehicle = gtu == null ? null : gtu.getId();
101 }
102
103
104
105
106
107
108 boolean isSyncVehicle(final HeadwayGTU gtu)
109 {
110 return this.syncVehicle == null ? false : gtu.getId().equals(this.syncVehicle);
111 }
112
113
114
115
116
117
118
119 HeadwayGTU getSyncVehicle(final PerceptionCollectable<HeadwayGTU, LaneBasedGTU> adjLeaders)
120 {
121 if (this.syncVehicle == null)
122 {
123 return null;
124 }
125 for (HeadwayGTU leader : adjLeaders)
126 {
127 if (leader.getId().equals(this.syncVehicle))
128 {
129 return leader;
130 }
131 }
132 return null;
133 }
134
135
136
137
138
139 Synchronization getSynchronization()
140 {
141 return this.synchronization;
142 }
143
144
145
146
147
148 Cooperation getCooperation()
149 {
150 return this.cooperation;
151 }
152
153
154
155
156
157 GapAcceptance getGapAcceptance()
158 {
159 return this.gapAcceptance;
160 }
161
162
163
164
165
166 Tailgating getTailGating()
167 {
168 return this.tailGating;
169 }
170
171
172 @Override
173 public Desire getLatestDesire(final Class<? extends Incentive> incentiveClass)
174 {
175 return this.desireMap.get(incentiveClass);
176 }
177
178
179
180
181
182 Map<Class<? extends Incentive>, Desire> getDesireMap()
183 {
184 return this.desireMap;
185 }
186
187
188
189
190
191 void setSynchronizationState(final Synchronizable.State synchronizationState)
192 {
193 this.synchronizationState = synchronizationState;
194 }
195
196
197 @Override
198 public Synchronizable.State getSynchronizationState()
199 {
200 return this.synchronizationState;
201 }
202
203
204
205
206 boolean isHumanLongitudinalControl()
207 {
208 return this.humanLongitudinalControl;
209 }
210
211
212
213
214
215 public void setHumanLongitudinalControl(final boolean humanLongitudinalControl)
216 {
217 this.humanLongitudinalControl = humanLongitudinalControl;
218 }
219
220
221 @Override
222 public String toString()
223 {
224 return "LmrsData [synchronization=" + this.synchronization + ", leaders=" + this.leaders + ", tempLeaders="
225 + this.tempLeaders + ", syncVehicle=" + this.syncVehicle + "]";
226 }
227
228 }