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 MultiEntryExit.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 "MultiEntryExit.h"
31 :
32 :
33 : namespace libsumo {
34 : // ===========================================================================
35 : // static member initializations
36 : // ===========================================================================
37 : SubscriptionResults MultiEntryExit::mySubscriptionResults;
38 : ContextSubscriptionResults MultiEntryExit::myContextSubscriptionResults;
39 :
40 :
41 : // ===========================================================================
42 : // static member definitions
43 : // ===========================================================================
44 : std::vector<std::string>
45 407 : MultiEntryExit::getIDList() {
46 : std::vector<std::string> ids;
47 407 : MSNet::getInstance()->getDetectorControl().getTypedDetectors(SUMO_TAG_ENTRY_EXIT_DETECTOR).insertIDs(ids);
48 405 : return ids;
49 2 : }
50 :
51 :
52 : int
53 8 : MultiEntryExit::getIDCount() {
54 8 : return (int)MSNet::getInstance()->getDetectorControl().getTypedDetectors(SUMO_TAG_ENTRY_EXIT_DETECTOR).size();
55 : }
56 :
57 :
58 : std::vector<std::string>
59 5 : MultiEntryExit::getEntryLanes(const std::string& detID) {
60 : std::vector<std::string> ids;
61 10 : for (const MSCrossSection& cs : getDetector(detID)->getEntries()) {
62 5 : ids.push_back(cs.myLane->getID());
63 : }
64 5 : return ids;
65 0 : }
66 :
67 :
68 : std::vector<std::string>
69 5 : MultiEntryExit::getExitLanes(const std::string& detID) {
70 : std::vector<std::string> ids;
71 10 : for (const MSCrossSection& cs : getDetector(detID)->getExits()) {
72 5 : ids.push_back(cs.myLane->getID());
73 : }
74 5 : return ids;
75 0 : }
76 :
77 :
78 : std::vector<double>
79 5 : MultiEntryExit::getEntryPositions(const std::string& detID) {
80 : std::vector<double> pos;
81 10 : for (const MSCrossSection& cs : getDetector(detID)->getEntries()) {
82 5 : pos.push_back(cs.myPosition);
83 : }
84 5 : return pos;
85 0 : }
86 :
87 :
88 : std::vector<double>
89 5 : MultiEntryExit::getExitPositions(const std::string& detID) {
90 : std::vector<double> pos;
91 10 : for (const MSCrossSection& cs : getDetector(detID)->getExits()) {
92 5 : pos.push_back(cs.myPosition);
93 : }
94 5 : return pos;
95 0 : }
96 :
97 :
98 : int
99 579 : MultiEntryExit::getLastStepVehicleNumber(const std::string& detID) {
100 579 : return getDetector(detID)->getVehiclesWithin();
101 : }
102 :
103 :
104 : double
105 47 : MultiEntryExit::getLastStepMeanSpeed(const std::string& detID) {
106 47 : return getDetector(detID)->getCurrentMeanSpeed();
107 : }
108 :
109 :
110 : std::vector<std::string>
111 247 : MultiEntryExit::getLastStepVehicleIDs(const std::string& detID) {
112 247 : return getDetector(detID)->getCurrentVehicleIDs();
113 : }
114 :
115 :
116 : int
117 5 : MultiEntryExit::getLastStepHaltingNumber(const std::string& detID) {
118 5 : return getDetector(detID)->getCurrentHaltingNumber();
119 : }
120 :
121 :
122 : double
123 10 : MultiEntryExit::getLastIntervalMeanTravelTime(const std::string& detID) {
124 10 : return getDetector(detID)->getLastIntervalMeanTravelTime();
125 : }
126 :
127 :
128 : double
129 10 : MultiEntryExit::getLastIntervalMeanHaltsPerVehicle(const std::string& detID) {
130 10 : return getDetector(detID)->getLastIntervalMeanHaltsPerVehicle();
131 : }
132 :
133 :
134 : double
135 10 : MultiEntryExit::getLastIntervalMeanTimeLoss(const std::string& detID) {
136 10 : return getDetector(detID)->getLastIntervalMeanTimeLoss();
137 : }
138 :
139 :
140 : int
141 10 : MultiEntryExit::getLastIntervalVehicleSum(const std::string& detID) {
142 10 : return getDetector(detID)->getLastIntervalVehicleSum();
143 : }
144 :
145 :
146 : std::string
147 10 : MultiEntryExit::getParameter(const std::string& detID, const std::string& param) {
148 20 : return getDetector(detID)->getParameter(param, "");
149 : }
150 :
151 :
152 0 : LIBSUMO_GET_PARAMETER_WITH_KEY_IMPLEMENTATION(MultiEntryExit)
153 :
154 :
155 : void
156 5 : MultiEntryExit::setParameter(const std::string& detID, const std::string& name, const std::string& value) {
157 5 : getDetector(detID)->setParameter(name, value);
158 5 : }
159 :
160 :
161 262 : LIBSUMO_SUBSCRIPTION_IMPLEMENTATION(MultiEntryExit, MULTIENTRYEXIT)
162 :
163 :
164 : MSE3Collector*
165 1249 : MultiEntryExit::getDetector(const std::string& id) {
166 2497 : MSE3Collector* e3 = dynamic_cast<MSE3Collector*>(MSNet::getInstance()->getDetectorControl().getTypedDetectors(SUMO_TAG_ENTRY_EXIT_DETECTOR).get(id));
167 1249 : if (e3 == nullptr) {
168 2 : throw TraCIException("Multi entry exit detector '" + id + "' is not known");
169 : }
170 1248 : return e3;
171 : }
172 :
173 :
174 : std::shared_ptr<VariableWrapper>
175 266 : MultiEntryExit::makeWrapper() {
176 266 : return std::make_shared<Helper::SubscriptionWrapper>(handleVariable, mySubscriptionResults, myContextSubscriptionResults);
177 : }
178 :
179 :
180 : bool
181 984 : MultiEntryExit::handleVariable(const std::string& objID, const int variable, VariableWrapper* wrapper, tcpip::Storage* paramData) {
182 984 : switch (variable) {
183 225 : case TRACI_ID_LIST:
184 225 : return wrapper->wrapStringList(objID, variable, getIDList());
185 6 : case ID_COUNT:
186 6 : return wrapper->wrapInt(objID, variable, getIDCount());
187 497 : case LAST_STEP_VEHICLE_NUMBER:
188 497 : return wrapper->wrapInt(objID, variable, getLastStepVehicleNumber(objID));
189 45 : case LAST_STEP_MEAN_SPEED:
190 45 : return wrapper->wrapDouble(objID, variable, getLastStepMeanSpeed(objID));
191 165 : case LAST_STEP_VEHICLE_ID_LIST:
192 165 : return wrapper->wrapStringList(objID, variable, getLastStepVehicleIDs(objID));
193 3 : case LAST_STEP_VEHICLE_HALTING_NUMBER:
194 3 : return wrapper->wrapInt(objID, variable, getLastStepHaltingNumber(objID));
195 6 : case VAR_LAST_INTERVAL_TRAVELTIME:
196 6 : return wrapper->wrapDouble(objID, variable, getLastIntervalMeanTravelTime(objID));
197 6 : case VAR_LAST_INTERVAL_MEAN_HALTING_NUMBER:
198 6 : return wrapper->wrapDouble(objID, variable, getLastIntervalMeanHaltsPerVehicle(objID));
199 6 : case VAR_TIMELOSS:
200 6 : return wrapper->wrapDouble(objID, variable, getLastIntervalMeanTimeLoss(objID));
201 6 : case VAR_LAST_INTERVAL_VEHICLE_NUMBER:
202 6 : return wrapper->wrapInt(objID, variable, getLastIntervalVehicleSum(objID));
203 3 : case VAR_LANES:
204 3 : return wrapper->wrapStringList(objID, variable, getEntryLanes(objID));
205 3 : case VAR_EXIT_LANES:
206 3 : return wrapper->wrapStringList(objID, variable, getExitLanes(objID));
207 3 : case VAR_POSITION:
208 3 : return wrapper->wrapDoubleList(objID, variable, getEntryPositions(objID));
209 3 : case VAR_EXIT_POSITIONS:
210 3 : return wrapper->wrapDoubleList(objID, variable, getExitPositions(objID));
211 6 : case libsumo::VAR_PARAMETER:
212 6 : paramData->readUnsignedByte();
213 12 : return wrapper->wrapString(objID, variable, getParameter(objID, paramData->readString()));
214 0 : case libsumo::VAR_PARAMETER_WITH_KEY:
215 0 : paramData->readUnsignedByte();
216 0 : return wrapper->wrapStringPair(objID, variable, getParameterWithKey(objID, paramData->readString()));
217 : default:
218 : return false;
219 : }
220 : }
221 :
222 :
223 : }
224 :
225 :
226 : /****************************************************************************/
|