XMLSimulationController.java 6.75 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
package de.tud.kom.p2psim.impl.topology.movement.vehicular.sumo.simulation.controller.xml;

import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

Tobias Meuser's avatar
Tobias Meuser committed
13
import de.tud.kom.p2psim.impl.topology.movement.vehicular.sumo.simulation.controller.VehicleInformationContainer;
14
import de.tud.kom.p2psim.impl.topology.movement.vehicular.sumo.simulation.controller.csv.RoadSideUnitInformationHandler;
Tobias Meuser's avatar
Tobias Meuser committed
15
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.Location;
16
17
import de.tudarmstadt.maki.simonstrator.api.component.vehicular.api.SimulationSetupExtractor;
import de.tudarmstadt.maki.simonstrator.api.component.vehicular.api.VehicleController;
Tobias Meuser's avatar
Tobias Meuser committed
18
19
import de.tudarmstadt.maki.simonstrator.api.component.vehicular.roadnetwork.RoadNetwork;
import de.tudarmstadt.maki.simonstrator.api.component.vehicular.roadnetwork.RoadNetworkEdge;
20
import de.tudarmstadt.maki.simonstrator.api.component.vehicular.roadnetwork.RoadNetworkRoute;
Tobias Meuser's avatar
Tobias Meuser committed
21
22
import de.tudarmstadt.maki.simonstrator.api.component.vehicular.roadnetwork.exception.NoAdditionalRouteAvailableException;
import de.tudarmstadt.maki.simonstrator.api.component.vehicular.roadnetwork.exception.NoExitAvailableException;
23
24

public class XMLSimulationController implements VehicleController, SimulationSetupExtractor, Runnable {
25
26
27
28
29
	private String _vehicleDataPath;
	private String _roadSideUnitDataPath;

	private List<String> _vehicles;

Tobias Meuser's avatar
Tobias Meuser committed
30
	private Map<Double, Map<String, VehicleInformationContainer>> _positonsByTimestamp = new HashMap<>();
31
	private int _futureInformation = 0;
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70

	private boolean _initalized = false;

	private VehicleDataInformationHandler _vehicleDataInformationHandler = new VehicleDataInformationHandler();
	private RoadSideUnitInformationHandler _roadSideUnitInformationHandler = new RoadSideUnitInformationHandler();

	private double _start = -1;

	private double _step;

	public XMLSimulationController(String pVehicleDataPath, String pRoadSideUnitDataPath) {
		this(pVehicleDataPath);
		_roadSideUnitDataPath = pRoadSideUnitDataPath;
	}

	public XMLSimulationController(String pVehicleDataPath) {
		_vehicleDataPath = pVehicleDataPath;
	}

	@Override
	public void init() {

		if (!_initalized) {
			if (_vehicleDataPath != null) {
				Thread thread = new Thread(this);
				thread.start();

				for (int i = 0; i < _futureInformation; i++) {
					nextStep();
				}
			}
			if (_roadSideUnitDataPath != null) {
				_roadSideUnitInformationHandler.parseIntersectionsFile(_roadSideUnitDataPath);
			}
			_initalized = true;
		}
	}

	@Override
Tobias Meuser's avatar
Tobias Meuser committed
71
	public Location getVehiclePosition(String pVehicleID) {
72
73
74
		return getVehiclePosition(_step, pVehicleID);
	}

Tobias Meuser's avatar
Tobias Meuser committed
75
	public VehicleInformationContainer requestVehicleInformation(String pVehicleID) {
76
77
78
79
80
81
82
83
84
85
86
87
88
89
		return _vehicleDataInformationHandler.getVehiclePositions().get(pVehicleID);
	}

	@Override
	public boolean nextStep() {
		_vehicleDataInformationHandler.readNext();

		_step = _vehicleDataInformationHandler.getStep() - _futureInformation;
		if (_start == -1) {
			_start = _vehicleDataInformationHandler.getStep();
		}

		double newStep = _step + _futureInformation;
		if (!_positonsByTimestamp.containsKey(newStep)) {
Tobias Meuser's avatar
Tobias Meuser committed
90
			Map<String, VehicleInformationContainer> vehiclePositions = new HashMap<>();
91
92
93
94
			_positonsByTimestamp.put(newStep, vehiclePositions);

			List<String> allVehicles = new ArrayList<>(_vehicleDataInformationHandler.getVehiclePositions().keySet());
			for (String vehicle : allVehicles) {
Tobias Meuser's avatar
Tobias Meuser committed
95
				VehicleInformationContainer vehiclePosition = requestVehicleInformation(vehicle);
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
				if (vehiclePosition != null) {
					vehiclePositions.put(vehicle, vehiclePosition);
				}
			}
		}

		return !_vehicleDataInformationHandler.isTerminated();
	}

	@Override
	public List<String> getAllVehicles() {
		return getAllVehicles(_step);
	}

	@Override
	public double getStep() {
		return _step;
	}

	@Override
	public double getStart() {
		return _start;
	}

	@Override
	public void run() {
		try {
			SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
			parser.parse(new FileInputStream(_vehicleDataPath), _vehicleDataInformationHandler);
		} catch (RuntimeException e) {
			throw e;
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	@Override
	public void setObservedArea(double pStartX, double pStartY, double pEndX, double pEndY) {
		_vehicleDataInformationHandler.setObservedArea(pStartX, pStartY, pEndX, pEndY);
		_roadSideUnitInformationHandler.setObservedArea(pStartX, pStartY, pEndX, pEndY);
	}

	@Override
Tobias Meuser's avatar
Tobias Meuser committed
139
140
	public Location getVehiclePosition(double pStep, String pVehicleID) {
		Map<String, VehicleInformationContainer> map = _positonsByTimestamp.get(pStep);
141

Tobias Meuser's avatar
Tobias Meuser committed
142
		return map.get(pVehicleID).getPosition();
143
144
145
146
	}

	@Override
	public List<String> getAllVehicles(double pStep) {
Tobias Meuser's avatar
Tobias Meuser committed
147
		Map<String, VehicleInformationContainer> map = _positonsByTimestamp.get(pStep);
148
149
150
151
152
153
154
155
156
157
158
159

		return new ArrayList<>(map.keySet());
	}

	@Override
	public double getMaximumAvailablePrediction() {
		double max = Collections.max(_positonsByTimestamp.keySet());

		return max;
	}

	@Override
Tobias Meuser's avatar
Tobias Meuser committed
160
	public List<Location> getAllIntersections(boolean pCluster) {
161
162
163
164
165
166
167
168
169
170
171
172
		return _roadSideUnitInformationHandler.getIntersections();
	}

	@Override
	public double getScenarioWidth() {
		return -1;
	}

	@Override
	public double getScenarioHeight() {
		return -1;
	}
173

174
175
176
177
178
	@Override
	public RoadNetworkRoute getCurrentRoute(String pVehicleID) {
		throw new UnsupportedOperationException("This method is not supported for " + getClass().getSimpleName());
	}

Tobias Meuser's avatar
Tobias Meuser committed
179
180
	@Override
	public RoadNetwork getRoadNetwork() {
181
		return null;
Tobias Meuser's avatar
Tobias Meuser committed
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
	}

	@Override
	public void rerouteVehicle(String pVehicle, RoadNetworkRoute pRoute) {
		throw new UnsupportedOperationException("This method is not supported for " + getClass().getSimpleName());
	}

	@Override
	public RoadNetworkRoute findNewRoute(String pVehicle)
			throws NoAdditionalRouteAvailableException {
		throw new UnsupportedOperationException("This method is not supported for " + getClass().getSimpleName());
	}

	@Override
	public RoadNetworkRoute findNewRoute(String pVehicle,
			List<RoadNetworkEdge> pEdgesToAvoid, boolean pKeepDestination)
					throws NoAdditionalRouteAvailableException,
					NoExitAvailableException {
		throw new UnsupportedOperationException("This method is not supported for " + getClass().getSimpleName());
	}

203
204
205
206
207
	@Override
	public void stopVehicle(String pVehicle) {
		throw new UnsupportedOperationException("This method is not supported for " + getClass().getSimpleName());
	}

Tobias Meuser's avatar
Tobias Meuser committed
208
209
	@Override
	public double getVehicleSpeed(String pVehicleID) {
210
		return _vehicleDataInformationHandler.getVehiclePositions().get(pVehicleID).getSpeed();
Tobias Meuser's avatar
Tobias Meuser committed
211
212
	}

ZZFTT7's avatar
ZZFTT7 committed
213
214
215
216
217
	@Override
	public double getVehicleHeading(String pVehicleID) {
		return _vehicleDataInformationHandler.getVehiclePositions().get(pVehicleID).getHeading();
	}

218
}