#pragma once
#include <config.h>
#include <vector>
#include <set>
#include <foreign/tcpip/storage.h>
#include <libsumo/TraCIDefs.h>
#include <utils/common/SUMOVehicleClass.h>
#include <utils/common/SUMOTime.h>
namespace libsumo {
enum SubscriptionFilterType {
SUBS_FILTER_NONE = 0,
SUBS_FILTER_LANES = 1,
SUBS_FILTER_NOOPPOSITE = 1 << 1,
SUBS_FILTER_DOWNSTREAM_DIST = 1 << 2,
SUBS_FILTER_UPSTREAM_DIST = 1 << 3,
SUBS_FILTER_LEAD_FOLLOW = 1 << 4,
SUBS_FILTER_TURN = 1 << 6,
SUBS_FILTER_VCLASS = 1 << 7,
SUBS_FILTER_VTYPE = 1 << 8,
SUBS_FILTER_FIELD_OF_VISION = 1 << 9,
SUBS_FILTER_LATERAL_DIST = 1 << 10,
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,
SUBS_FILTER_MANEUVER = SUBS_FILTER_LEAD_FOLLOW | SUBS_FILTER_TURN,
};
class Subscription {
public:
Subscription(int commandIdArg, const std::string& idArg,
const std::vector<int>& variablesArg,
const std::vector<std::shared_ptr<tcpip::Storage> >& paramsArg,
SUMOTime beginTimeArg, SUMOTime endTimeArg,
int contextDomainArg, double rangeArg)
: commandId(commandIdArg),
id(idArg),
variables(variablesArg),
parameters(paramsArg),
beginTime(beginTimeArg),
endTime(endTimeArg),
contextDomain(contextDomainArg),
range(rangeArg),
activeFilters(SUBS_FILTER_NONE),
filterLanes(),
filterDownstreamDist(-1),
filterUpstreamDist(-1),
filterFoeDistToJunction(-1),
filterVTypes(),
filterVClasses(0),
filterFieldOfVisionOpeningAngle(-1),
filterLateralDist(-1) {}
bool isVehicleToVehicleContextSubscription() const {
return commandId == CMD_SUBSCRIBE_VEHICLE_CONTEXT && contextDomain == CMD_GET_VEHICLE_VARIABLE;
}
bool isVehicleToPersonContextSubscription() const {
return commandId == CMD_SUBSCRIBE_VEHICLE_CONTEXT && contextDomain == CMD_GET_PERSON_VARIABLE;
}
int commandId;
std::string id;
std::vector<int> variables;
std::vector<std::shared_ptr<tcpip::Storage> > parameters;
SUMOTime beginTime;
SUMOTime endTime;
int contextDomain;
double range;
int activeFilters;
std::vector<int> filterLanes;
double filterDownstreamDist;
double filterUpstreamDist;
double filterFoeDistToJunction;
std::set<std::string> filterVTypes;
SVCPermissions filterVClasses;
double filterFieldOfVisionOpeningAngle;
double filterLateralDist;
};
class VariableWrapper {
public:
typedef bool(*SubscriptionHandler)(const std::string& objID, const int variable, VariableWrapper* wrapper, tcpip::Storage* paramData);
VariableWrapper(SubscriptionHandler handler = nullptr) : handle(handler) {}
virtual ~VariableWrapper() {}
SubscriptionHandler handle;
virtual void setContext(const std::string* const ) {}
virtual void clear() {}
virtual bool wrapConnectionVector(const std::string& objID, const int variable, const std::vector<TraCIConnection>& value) = 0;
virtual bool wrapDouble(const std::string& objID, const int variable, const double value) = 0;
virtual bool wrapInt(const std::string& objID, const int variable, const int value) = 0;
virtual bool wrapString(const std::string& objID, const int variable, const std::string& value) = 0;
virtual bool wrapStringList(const std::string& objID, const int variable, const std::vector<std::string>& value) = 0;
virtual bool wrapDoubleList(const std::string& objID, const int variable, const std::vector<double>& value) = 0;
virtual bool wrapPosition(const std::string& objID, const int variable, const TraCIPosition& value) = 0;
virtual bool wrapPositionVector(const std::string& objID, const int variable, const TraCIPositionVector& value) = 0;
virtual bool wrapColor(const std::string& objID, const int variable, const TraCIColor& value) = 0;
virtual bool wrapStringDoublePair(const std::string& objID, const int variable, const std::pair<std::string, double>& value) = 0;
virtual bool wrapStringDoublePairList(const std::string& objID, const int variable, const std::vector<std::pair<std::string, double> >& value) = 0;
virtual bool wrapStringPair(const std::string& objID, const int variable, const std::pair<std::string, std::string>& value) = 0;
virtual bool wrapIntPair(const std::string& objID, const int variable, const std::pair<int, int>& value) = 0;
virtual bool wrapStage(const std::string& objID, const int variable, const TraCIStage& value) = 0;
virtual bool wrapReservationVector(const std::string& objID, const int variable, const std::vector<TraCIReservation>& value) = 0;
virtual bool wrapLogicVector(const std::string& objID, const int variable, const std::vector<TraCILogic>& value) = 0;
virtual bool wrapLinkVectorVector(const std::string& objID, const int variable, const std::vector<std::vector<TraCILink> >& value) = 0;
virtual bool wrapSignalConstraintVector(const std::string& objID, const int variable, const std::vector<TraCISignalConstraint>& value) = 0;
virtual bool wrapJunctionFoeVector(const std::string& objID, const int variable, const std::vector<TraCIJunctionFoe>& value) = 0;
virtual bool wrapNextStopDataVector(const std::string& objID, const int variable, const std::vector<TraCINextStopData>& value) = 0;
virtual bool wrapVehicleDataVector(const std::string& objID, const int variable, const std::vector<TraCIVehicleData>& value) = 0;
virtual bool wrapBestLanesDataVector(const std::string& objID, const int variable, const std::vector<TraCIBestLanesData>& value) = 0;
virtual bool wrapNextTLSDataVector(const std::string& objID, const int variable, const std::vector<TraCINextTLSData>& value) = 0;
virtual void empty(const std::string& ) {}
};
}