Line data Source code
1 : /****************************************************************************/
2 : // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3 : // Copyright (C) 2017-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 Route.cpp
15 : /// @author Daniel Krajzewicz
16 : /// @author Mario Krumnow
17 : /// @author Jakob Erdmann
18 : /// @author Michael Behrisch
19 : /// @author Robert Hilbrich
20 : /// @date 30.05.2012
21 : ///
22 : // C++ TraCI client API implementation
23 : /****************************************************************************/
24 : #include <config.h>
25 :
26 : #include <microsim/MSNet.h>
27 : #include <microsim/MSEdge.h>
28 : #include <microsim/MSRoute.h>
29 : #include <libsumo/TraCIConstants.h>
30 : #include "Helper.h"
31 : #include "Route.h"
32 :
33 :
34 : namespace libsumo {
35 : // ===========================================================================
36 : // static member initializations
37 : // ===========================================================================
38 : SubscriptionResults Route::mySubscriptionResults;
39 : ContextSubscriptionResults Route::myContextSubscriptionResults;
40 :
41 :
42 : // ===========================================================================
43 : // static member definitions
44 : // ===========================================================================
45 : std::vector<std::string>
46 262 : Route::getIDList() {
47 262 : MSNet::getInstance(); // just to check that we actually have a network
48 : std::vector<std::string> ids;
49 260 : MSRoute::insertIDs(ids);
50 260 : return ids;
51 0 : }
52 :
53 : std::vector<std::string>
54 27 : Route::getEdges(const std::string& routeID) {
55 27 : ConstMSRoutePtr r = getRoute(routeID);
56 : std::vector<std::string> ids;
57 151 : for (ConstMSEdgeVector::const_iterator i = r->getEdges().begin(); i != r->getEdges().end(); ++i) {
58 126 : ids.push_back((*i)->getID());
59 : }
60 25 : return ids;
61 0 : }
62 :
63 :
64 : int
65 11 : Route::getIDCount() {
66 11 : return (int)getIDList().size();
67 : }
68 :
69 :
70 : std::string
71 89 : Route::getParameter(const std::string& routeID, const std::string& param) {
72 89 : ConstMSRoutePtr r = getRoute(routeID);
73 267 : return r->getParameter(param, "");
74 : }
75 :
76 :
77 46 : LIBSUMO_GET_PARAMETER_WITH_KEY_IMPLEMENTATION(Route)
78 :
79 :
80 : void
81 54 : Route::setParameter(const std::string& routeID, const std::string& key, const std::string& value) {
82 54 : MSRoute* r = const_cast<MSRoute*>(getRoute(routeID).get());
83 54 : r->setParameter(key, value);
84 54 : }
85 :
86 :
87 : void
88 220 : Route::add(const std::string& routeID, const std::vector<std::string>& edgeIDs) {
89 : ConstMSEdgeVector edges;
90 220 : if (edgeIDs.size() == 0) {
91 10 : throw TraCIException("Cannot add route '" + routeID + "' without edges.");
92 : }
93 529 : for (std::vector<std::string>::const_iterator ei = edgeIDs.begin(); ei != edgeIDs.end(); ++ei) {
94 314 : MSEdge* edge = MSEdge::dictionary(*ei);
95 314 : if (edge == nullptr) {
96 0 : throw TraCIException("Unknown edge '" + *ei + "' in route.");
97 : }
98 314 : edges.push_back(edge);
99 : }
100 : const std::vector<SUMOVehicleParameter::Stop> stops;
101 215 : ConstMSRoutePtr route = std::make_shared<MSRoute>(routeID, edges, true, nullptr, stops);
102 435 : if (!MSRoute::dictionary(routeID, route)) {
103 10 : throw TraCIException("Could not add route '" + routeID + "'.");
104 : }
105 225 : }
106 :
107 :
108 270 : LIBSUMO_SUBSCRIPTION_IMPLEMENTATION(Route, ROUTE)
109 :
110 :
111 : ConstMSRoutePtr
112 170 : Route::getRoute(const std::string& id) {
113 170 : ConstMSRoutePtr r = MSRoute::dictionary(id);
114 170 : if (r == nullptr) {
115 4 : throw TraCIException("Route '" + id + "' is not known");
116 : }
117 168 : return r;
118 : }
119 :
120 :
121 : std::shared_ptr<VariableWrapper>
122 266 : Route::makeWrapper() {
123 266 : return std::make_shared<Helper::SubscriptionWrapper>(handleVariable, mySubscriptionResults, myContextSubscriptionResults);
124 : }
125 :
126 :
127 : bool
128 252 : Route::handleVariable(const std::string& objID, const int variable, VariableWrapper* wrapper, tcpip::Storage* paramData) {
129 252 : switch (variable) {
130 147 : case TRACI_ID_LIST:
131 147 : return wrapper->wrapStringList(objID, variable, getIDList());
132 9 : case ID_COUNT:
133 9 : return wrapper->wrapInt(objID, variable, getIDCount());
134 21 : case VAR_EDGES:
135 21 : return wrapper->wrapStringList(objID, variable, getEdges(objID));
136 46 : case libsumo::VAR_PARAMETER:
137 46 : paramData->readUnsignedByte();
138 92 : return wrapper->wrapString(objID, variable, getParameter(objID, paramData->readString()));
139 19 : case libsumo::VAR_PARAMETER_WITH_KEY:
140 19 : paramData->readUnsignedByte();
141 38 : return wrapper->wrapStringPair(objID, variable, getParameterWithKey(objID, paramData->readString()));
142 : default:
143 : return false;
144 : }
145 : }
146 : }
147 :
148 :
149 : /****************************************************************************/
|