Line data Source code
1 : /****************************************************************************/
2 : // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3 : // Copyright (C) 2012-2024 German Aerospace Center (DLR) and others.
4 : // This program and the accompanying materials are made available under the
5 : // terms of the Eclipse Public License 2.0 which is available at
6 : // https://www.eclipse.org/legal/epl-2.0/
7 : // This Source Code may also be made available under the following Secondary
8 : // Licenses when the conditions for such availability set forth in the Eclipse
9 : // Public License 2.0 are satisfied: GNU General Public License, version 2
10 : // or later which is available at
11 : // https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
12 : // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
13 : /****************************************************************************/
14 : /// @file LaneArea.cpp
15 : /// @author Daniel Krajzewicz
16 : /// @author Mario Krumnow
17 : /// @author Jakob Erdmann
18 : /// @author Michael Behrisch
19 : /// @date 30.05.2012
20 : ///
21 : // C++ TraCI client API implementation
22 : /****************************************************************************/
23 : #include <config.h>
24 :
25 : #include <microsim/output/MSDetectorControl.h>
26 : #include <microsim/output/MSE2Collector.h>
27 : #include <microsim/MSNet.h>
28 : #include <libsumo/Helper.h>
29 : #include <libsumo/TraCIConstants.h>
30 : #include "LaneArea.h"
31 :
32 :
33 : namespace libsumo {
34 : // ===========================================================================
35 : // static member initializations
36 : // ===========================================================================
37 : SubscriptionResults LaneArea::mySubscriptionResults;
38 : ContextSubscriptionResults LaneArea::myContextSubscriptionResults;
39 : NamedRTree* LaneArea::myTree(nullptr);
40 :
41 :
42 : // ===========================================================================
43 : // static member definitions
44 : // ===========================================================================
45 : std::vector<std::string>
46 824 : LaneArea::getIDList() {
47 : std::vector<std::string> ids;
48 824 : MSNet::getInstance()->getDetectorControl().getTypedDetectors(SUMO_TAG_LANE_AREA_DETECTOR).insertIDs(ids);
49 822 : return ids;
50 2 : }
51 :
52 :
53 : int
54 18 : LaneArea::getIDCount() {
55 : std::vector<std::string> ids;
56 36 : return (int)MSNet::getInstance()->getDetectorControl().getTypedDetectors(SUMO_TAG_LANE_AREA_DETECTOR).size();
57 18 : }
58 :
59 :
60 : int
61 421 : LaneArea::getJamLengthVehicle(const std::string& detID) {
62 421 : return getDetector(detID)->getCurrentJamLengthInVehicles();
63 : }
64 :
65 :
66 : double
67 420 : LaneArea::getJamLengthMeters(const std::string& detID) {
68 420 : return getDetector(detID)->getCurrentJamLengthInMeters();
69 : }
70 :
71 :
72 : double
73 420 : LaneArea::getLastStepMeanSpeed(const std::string& detID) {
74 420 : return getDetector(detID)->getCurrentMeanSpeed();
75 : }
76 :
77 :
78 : std::vector<std::string>
79 620 : LaneArea::getLastStepVehicleIDs(const std::string& detID) {
80 620 : return getDetector(detID)->getCurrentVehicleIDs();
81 : }
82 :
83 :
84 : double
85 420 : LaneArea::getLastStepOccupancy(const std::string& detID) {
86 420 : return getDetector(detID)->getCurrentOccupancy();
87 : }
88 :
89 :
90 : double
91 421 : LaneArea::getPosition(const std::string& detID) {
92 421 : return getDetector(detID)->getStartPos();
93 : }
94 :
95 :
96 : std::string
97 421 : LaneArea::getLaneID(const std::string& detID) {
98 421 : return getDetector(detID)->getLane()->getID();
99 : }
100 :
101 :
102 : double
103 421 : LaneArea::getLength(const std::string& detID) {
104 421 : const MSE2Collector* const e2 = getDetector(detID);
105 421 : return e2->getLength();
106 : }
107 :
108 :
109 : int
110 1080 : LaneArea::getLastStepVehicleNumber(const std::string& detID) {
111 1080 : return getDetector(detID)->getCurrentVehicleNumber();
112 : }
113 :
114 :
115 : int
116 420 : LaneArea::getLastStepHaltingNumber(const std::string& detID) {
117 420 : return getDetector(detID)->getCurrentHaltingNumber();
118 : }
119 :
120 :
121 : double
122 600 : LaneArea::getIntervalOccupancy(const std::string& detID) {
123 600 : return getDetector(detID)->getIntervalOccupancy();
124 : }
125 :
126 : double
127 600 : LaneArea::getIntervalMeanSpeed(const std::string& detID) {
128 600 : return getDetector(detID)->getIntervalMeanSpeed();
129 : }
130 :
131 : double
132 600 : LaneArea::getIntervalMaxJamLengthInMeters(const std::string& detID) {
133 600 : return getDetector(detID)->getIntervalMaxJamLengthInMeters();
134 : }
135 :
136 : int
137 600 : LaneArea::getIntervalVehicleNumber(const std::string& detID) {
138 600 : return getDetector(detID)->getIntervalVehicleNumber();
139 : }
140 :
141 : double
142 600 : LaneArea::getLastIntervalOccupancy(const std::string& detID) {
143 600 : return getDetector(detID)->getLastIntervalOccupancy();
144 : }
145 :
146 : double
147 600 : LaneArea::getLastIntervalMeanSpeed(const std::string& detID) {
148 600 : return getDetector(detID)->getLastIntervalMeanSpeed();
149 : }
150 :
151 : double
152 600 : LaneArea::getLastIntervalMaxJamLengthInMeters(const std::string& detID) {
153 600 : return getDetector(detID)->getLastIntervalMaxJamLengthInMeters();
154 : }
155 :
156 : int
157 600 : LaneArea::getLastIntervalVehicleNumber(const std::string& detID) {
158 600 : return getDetector(detID)->getLastIntervalVehicleNumber();
159 : }
160 :
161 :
162 : std::string
163 30 : LaneArea::getParameter(const std::string& detID, const std::string& param) {
164 60 : return getDetector(detID)->getParameter(param, "");
165 : }
166 :
167 :
168 0 : LIBSUMO_GET_PARAMETER_WITH_KEY_IMPLEMENTATION(LaneArea)
169 :
170 :
171 : void
172 15 : LaneArea::setParameter(const std::string& detID, const std::string& name, const std::string& value) {
173 15 : getDetector(detID)->setParameter(name, value);
174 15 : }
175 :
176 :
177 372 : LIBSUMO_SUBSCRIPTION_IMPLEMENTATION(LaneArea, LANEAREA)
178 :
179 :
180 : MSE2Collector*
181 10302 : LaneArea::getDetector(const std::string& id) {
182 20603 : MSE2Collector* e2 = dynamic_cast<MSE2Collector*>(MSNet::getInstance()->getDetectorControl().getTypedDetectors(SUMO_TAG_LANE_AREA_DETECTOR).get(id));
183 10302 : if (e2 == nullptr) {
184 2 : throw TraCIException("Lane area detector '" + id + "' is not known");
185 : }
186 10301 : return e2;
187 : }
188 :
189 :
190 : NamedRTree*
191 332 : LaneArea::getTree() {
192 332 : if (myTree == nullptr) {
193 12 : myTree = new NamedRTree();
194 48 : for (const std::string& id : getIDList()) {
195 36 : PositionVector shape;
196 36 : storeShape(id, shape);
197 36 : Boundary b = shape.getBoxBoundary();
198 36 : const float cmin[2] = {(float) b.xmin(), (float) b.ymin()};
199 36 : const float cmax[2] = {(float) b.xmax(), (float) b.ymax()};
200 36 : myTree->Insert(cmin, cmax, getDetector(id));
201 48 : }
202 : }
203 332 : return myTree;
204 : }
205 :
206 :
207 : void
208 40219 : LaneArea::cleanup() {
209 40219 : delete myTree;
210 40219 : myTree = nullptr;
211 40219 : }
212 :
213 :
214 : void
215 332 : LaneArea::storeShape(const std::string& id, PositionVector& shape) {
216 332 : MSE2Collector* const det = getDetector(id);
217 664 : shape.push_back(det->getLanes().front()->getShape().positionAtOffset(det->getStartPos()));
218 664 : shape.push_back(det->getLanes().back()->getShape().positionAtOffset(det->getEndPos()));
219 332 : }
220 :
221 :
222 : std::shared_ptr<VariableWrapper>
223 266 : LaneArea::makeWrapper() {
224 266 : return std::make_shared<Helper::SubscriptionWrapper>(handleVariable, mySubscriptionResults, myContextSubscriptionResults);
225 : }
226 :
227 :
228 : void
229 25 : LaneArea::overrideVehicleNumber(const std::string& detID, int vehNum) {
230 25 : getDetector(detID)->overrideVehicleNumber(vehNum);
231 25 : }
232 :
233 :
234 : bool
235 6603 : LaneArea::handleVariable(const std::string& objID, const int variable, VariableWrapper* wrapper, tcpip::Storage* paramData) {
236 6603 : switch (variable) {
237 468 : case TRACI_ID_LIST:
238 468 : return wrapper->wrapStringList(objID, variable, getIDList());
239 12 : case ID_COUNT:
240 12 : return wrapper->wrapInt(objID, variable, getIDCount());
241 832 : case LAST_STEP_VEHICLE_NUMBER:
242 832 : return wrapper->wrapInt(objID, variable, getLastStepVehicleNumber(objID));
243 252 : case LAST_STEP_MEAN_SPEED:
244 252 : return wrapper->wrapDouble(objID, variable, getLastStepMeanSpeed(objID));
245 372 : case LAST_STEP_VEHICLE_ID_LIST:
246 372 : return wrapper->wrapStringList(objID, variable, getLastStepVehicleIDs(objID));
247 252 : case LAST_STEP_VEHICLE_HALTING_NUMBER:
248 252 : return wrapper->wrapInt(objID, variable, getLastStepHaltingNumber(objID));
249 253 : case JAM_LENGTH_VEHICLE:
250 253 : return wrapper->wrapInt(objID, variable, getJamLengthVehicle(objID));
251 252 : case JAM_LENGTH_METERS:
252 252 : return wrapper->wrapDouble(objID, variable, getJamLengthMeters(objID));
253 252 : case LAST_STEP_OCCUPANCY:
254 252 : return wrapper->wrapDouble(objID, variable, getLastStepOccupancy(objID));
255 253 : case VAR_POSITION:
256 253 : return wrapper->wrapDouble(objID, variable, getPosition(objID));
257 253 : case VAR_LANE_ID:
258 506 : return wrapper->wrapString(objID, variable, getLaneID(objID));
259 253 : case VAR_LENGTH:
260 253 : return wrapper->wrapDouble(objID, variable, getLength(objID));
261 360 : case VAR_INTERVAL_OCCUPANCY:
262 360 : return wrapper->wrapDouble(objID, variable, getIntervalOccupancy(objID));
263 360 : case VAR_INTERVAL_SPEED:
264 360 : return wrapper->wrapDouble(objID, variable, getIntervalMeanSpeed(objID));
265 360 : case VAR_INTERVAL_MAX_JAM_LENGTH_METERS:
266 360 : return wrapper->wrapDouble(objID, variable, getIntervalMaxJamLengthInMeters(objID));
267 360 : case VAR_INTERVAL_NUMBER:
268 360 : return wrapper->wrapInt(objID, variable, getIntervalVehicleNumber(objID));
269 360 : case VAR_LAST_INTERVAL_OCCUPANCY:
270 360 : return wrapper->wrapDouble(objID, variable, getLastIntervalOccupancy(objID));
271 360 : case VAR_LAST_INTERVAL_SPEED:
272 360 : return wrapper->wrapDouble(objID, variable, getLastIntervalMeanSpeed(objID));
273 360 : case VAR_LAST_INTERVAL_MAX_JAM_LENGTH_METERS:
274 360 : return wrapper->wrapDouble(objID, variable, getLastIntervalMaxJamLengthInMeters(objID));
275 360 : case VAR_LAST_INTERVAL_NUMBER:
276 360 : return wrapper->wrapInt(objID, variable, getLastIntervalVehicleNumber(objID));
277 18 : case libsumo::VAR_PARAMETER:
278 18 : paramData->readUnsignedByte();
279 36 : return wrapper->wrapString(objID, variable, getParameter(objID, paramData->readString()));
280 0 : case libsumo::VAR_PARAMETER_WITH_KEY:
281 0 : paramData->readUnsignedByte();
282 0 : return wrapper->wrapStringPair(objID, variable, getParameterWithKey(objID, paramData->readString()));
283 : default:
284 : return false;
285 : }
286 : }
287 :
288 :
289 : }
290 :
291 :
292 : /****************************************************************************/
|