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 }