Line data Source code
1 : /****************************************************************************/
2 : // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3 : // Copyright (C) 2001-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 Subscription.h
15 : /// @author Michael Behrisch
16 : /// @date 2007/10/24
17 : ///
18 : // Subscription representation for libsumo and TraCI
19 : /****************************************************************************/
20 : #pragma once
21 : #include <config.h>
22 : #include <vector>
23 : #include <set>
24 : #include <foreign/tcpip/storage.h>
25 : #include <libsumo/TraCIDefs.h>
26 : #include <utils/common/SUMOVehicleClass.h>
27 : #include <utils/common/SUMOTime.h>
28 :
29 :
30 : // ===========================================================================
31 : // class definitions
32 : // ===========================================================================
33 : namespace libsumo {
34 :
35 : /** @brief Filter types for context subscriptions
36 : */
37 : enum SubscriptionFilterType {
38 : // No filters
39 : SUBS_FILTER_NONE = 0,
40 : // Filter by list of lanes relative to ego vehicle
41 : SUBS_FILTER_LANES = 1,
42 : // Exclude vehicles on opposite (and other) lanes from context subscription result
43 : SUBS_FILTER_NOOPPOSITE = 1 << 1,
44 : // Specify maximal downstream distance for vehicles in context subscription result
45 : SUBS_FILTER_DOWNSTREAM_DIST = 1 << 2,
46 : // Specify maximal upstream distance for vehicles in context subscription result
47 : SUBS_FILTER_UPSTREAM_DIST = 1 << 3,
48 : // Only return leader and follower on specified lanes in context subscription result
49 : SUBS_FILTER_LEAD_FOLLOW = 1 << 4,
50 : // Only return foes on upcoming junctions in context subscription result
51 : SUBS_FILTER_TURN = 1 << 6,
52 : // Only return vehicles of the given vClass in context subscription result
53 : SUBS_FILTER_VCLASS = 1 << 7,
54 : // Only return vehicles of the given vType in context subscription result
55 : SUBS_FILTER_VTYPE = 1 << 8,
56 : // Only return vehicles within field of vision in context subscription result
57 : // NOTE: relies on rTree, therefore incompatible with SUBS_FILTER_NO_RTREE
58 : SUBS_FILTER_FIELD_OF_VISION = 1 << 9,
59 : // Only return vehicles within the given lateral distance in context subscription result
60 : SUBS_FILTER_LATERAL_DIST = 1 << 10,
61 : // Filter category for measuring distances along the road network instead of using the usual rtree query
62 : SUBS_FILTER_NO_RTREE = SUBS_FILTER_LANES | SUBS_FILTER_DOWNSTREAM_DIST | SUBS_FILTER_UPSTREAM_DIST | SUBS_FILTER_LEAD_FOLLOW | SUBS_FILTER_TURN | SUBS_FILTER_LATERAL_DIST,
63 : // Filter category for maneuver filters
64 : SUBS_FILTER_MANEUVER = SUBS_FILTER_LEAD_FOLLOW | SUBS_FILTER_TURN,
65 : };
66 :
67 : /** @class Subscription
68 : * @brief Representation of a subscription
69 : */
70 : class Subscription {
71 : public:
72 : /** @brief Constructor
73 : * @param[in] commandIdArg The command id of the subscription
74 : * @param[in] idArg The id of the object that is subscribed
75 : * @param[in] variablesArg The subscribed variables
76 : * @param[in] paramsArg The parameters for the subscribed variables
77 : * @param[in] beginTimeArg The begin time of the subscription
78 : * @param[in] endTimeArg The end time of the subscription
79 : * @param[in] contextDomainArg The domain ID of the context
80 : * @param[in] rangeArg The range of the context
81 : */
82 8952 : Subscription(int commandIdArg, const std::string& idArg,
83 : const std::vector<int>& variablesArg,
84 : const std::vector<std::shared_ptr<tcpip::Storage> >& paramsArg,
85 : SUMOTime beginTimeArg, SUMOTime endTimeArg,
86 : int contextDomainArg, double rangeArg)
87 8952 : : commandId(commandIdArg),
88 8952 : id(idArg),
89 8952 : variables(variablesArg),
90 8952 : parameters(paramsArg),
91 8952 : beginTime(beginTimeArg),
92 8952 : endTime(endTimeArg),
93 8952 : contextDomain(contextDomainArg),
94 8952 : range(rangeArg),
95 8952 : activeFilters(SUBS_FILTER_NONE),
96 : filterLanes(),
97 8952 : filterDownstreamDist(-1),
98 8952 : filterUpstreamDist(-1),
99 8952 : filterFoeDistToJunction(-1),
100 : filterVTypes(),
101 8952 : filterVClasses(0),
102 8952 : filterFieldOfVisionOpeningAngle(-1),
103 8952 : filterLateralDist(-1) {}
104 :
105 : bool isVehicleToVehicleContextSubscription() const {
106 10049 : return commandId == CMD_SUBSCRIBE_VEHICLE_CONTEXT && contextDomain == CMD_GET_VEHICLE_VARIABLE;
107 : }
108 :
109 : bool isVehicleToPersonContextSubscription() const {
110 6861 : return commandId == CMD_SUBSCRIBE_VEHICLE_CONTEXT && contextDomain == CMD_GET_PERSON_VARIABLE;
111 : }
112 :
113 : /// @brief commandIdArg The command id of the subscription
114 : int commandId;
115 : /// @brief The id of the object that is subscribed
116 : std::string id;
117 : /// @brief The subscribed variables
118 : std::vector<int> variables;
119 : /// @brief The parameters for the subscribed variables
120 : std::vector<std::shared_ptr<tcpip::Storage> > parameters;
121 : /// @brief The begin time of the subscription
122 : SUMOTime beginTime;
123 : /// @brief The end time of the subscription
124 : SUMOTime endTime;
125 : /// @brief The domain ID of the context
126 : int contextDomain;
127 : /// @brief The range of the context
128 : double range;
129 :
130 : /// @brief Active filters for the subscription (bitset, @see SubscriptionFilterType)
131 : int activeFilters;
132 : /// @brief lanes specified by the lanes filter
133 : std::vector<int> filterLanes;
134 : /// @brief Downstream distance specified by the downstream distance filter
135 : double filterDownstreamDist;
136 : /// @brief Upstream distance specified by the upstream distance filter
137 : double filterUpstreamDist;
138 : /// @brief Foe distance to junction specified by the turn filter
139 : double filterFoeDistToJunction;
140 : /// @brief vTypes specified by the vTypes filter
141 : std::set<std::string> filterVTypes;
142 : /// @brief vClasses specified by the vClasses filter, @see SVCPermissions
143 : SVCPermissions filterVClasses;
144 : /// @brief Opening angle (in deg) specified by the field of vision filter
145 : double filterFieldOfVisionOpeningAngle;
146 : /// @brief Lateral distance specified by the lateral distance filter
147 : double filterLateralDist;
148 : };
149 :
150 : class VariableWrapper {
151 : public:
152 : /// @brief Definition of a method to be called for serving an associated commandID
153 : typedef bool(*SubscriptionHandler)(const std::string& objID, const int variable, VariableWrapper* wrapper, tcpip::Storage* paramData);
154 8836 : VariableWrapper(SubscriptionHandler handler = nullptr) : handle(handler) {}
155 : virtual ~VariableWrapper() {}
156 : SubscriptionHandler handle;
157 0 : virtual void setContext(const std::string* const /* refID */) {}
158 0 : virtual void clear() {}
159 : virtual bool wrapDouble(const std::string& objID, const int variable, const double value) = 0;
160 : virtual bool wrapInt(const std::string& objID, const int variable, const int value) = 0;
161 : virtual bool wrapString(const std::string& objID, const int variable, const std::string& value) = 0;
162 : virtual bool wrapStringList(const std::string& objID, const int variable, const std::vector<std::string>& value) = 0;
163 : virtual bool wrapDoubleList(const std::string& objID, const int variable, const std::vector<double>& value) = 0;
164 : virtual bool wrapPosition(const std::string& objID, const int variable, const TraCIPosition& value) = 0;
165 : virtual bool wrapPositionVector(const std::string& objID, const int variable, const TraCIPositionVector& value) = 0;
166 : virtual bool wrapColor(const std::string& objID, const int variable, const TraCIColor& value) = 0;
167 : virtual bool wrapStringDoublePair(const std::string& objID, const int variable, const std::pair<std::string, double>& value) = 0;
168 : virtual bool wrapStringPair(const std::string& objID, const int variable, const std::pair<std::string, std::string>& value) = 0;
169 0 : virtual void empty(const std::string& /* objID */) {}
170 : };
171 :
172 :
173 : }
|