SUMO - Simulation of Urban MObility
TraCIServerAPI_InductionLoop.cpp
Go to the documentation of this file.
1 /****************************************************************************/
10 // APIs for getting/setting induction loop values via TraCI
11 /****************************************************************************/
12 // SUMO, Simulation of Urban MObility; see http://sumo.dlr.de/
13 // Copyright (C) 2009-2016 DLR (http://www.dlr.de/) and contributors
14 /****************************************************************************/
15 //
16 // This file is part of SUMO.
17 // SUMO is free software: you can redistribute it and/or modify
18 // it under the terms of the GNU General Public License as published by
19 // the Free Software Foundation, either version 3 of the License, or
20 // (at your option) any later version.
21 //
22 /****************************************************************************/
23 
24 
25 // ===========================================================================
26 // included modules
27 // ===========================================================================
28 #ifdef _MSC_VER
29 #include <windows_config.h>
30 #else
31 #include <config.h>
32 #endif
33 
34 #ifndef NO_TRACI
35 
36 #include "TraCIConstants.h"
37 #include <microsim/MSNet.h>
40 
41 #ifdef CHECK_MEMORY_LEAKS
42 #include <foreign/nvwa/debug_new.h>
43 #endif // CHECK_MEMORY_LEAKS
44 
45 
46 // ===========================================================================
47 // method definitions
48 // ===========================================================================
49 bool
51  tcpip::Storage& outputStorage) {
52  // variable & id
53  int variable = inputStorage.readUnsignedByte();
54  std::string id = inputStorage.readString();
55  // check variable
56  if (variable != ID_LIST && variable != LAST_STEP_VEHICLE_NUMBER && variable != LAST_STEP_MEAN_SPEED
57  && variable != LAST_STEP_VEHICLE_ID_LIST && variable != LAST_STEP_OCCUPANCY
58  && variable != LAST_STEP_LENGTH && variable != LAST_STEP_TIME_SINCE_DETECTION
59  && variable != LAST_STEP_VEHICLE_DATA && variable != ID_COUNT
60  && variable != VAR_POSITION && variable != VAR_LANE_ID) {
61  return server.writeErrorStatusCmd(CMD_GET_INDUCTIONLOOP_VARIABLE, "Get Induction Loop Variable: unsupported variable " + toHex(variable, 2) + " specified", outputStorage);
62  }
63  // begin response building
64  tcpip::Storage tempMsg;
65  // response-code, variableID, objectID
67  tempMsg.writeUnsignedByte(variable);
68  tempMsg.writeString(id);
69  // process request
70  if (variable == ID_LIST) {
71  std::vector<std::string> ids;
74  tempMsg.writeStringList(ids);
75  } else if (variable == ID_COUNT) {
76  std::vector<std::string> ids;
79  tempMsg.writeInt((int) ids.size());
80  } else {
82  if (il == 0) {
83  return server.writeErrorStatusCmd(CMD_GET_INDUCTIONLOOP_VARIABLE, "Induction loop '" + id + "' is not known", outputStorage);
84  }
85  switch (variable) {
86  case ID_LIST:
87  break;
90  tempMsg.writeInt((int)(il->getCurrentPassedNumber()));
91  break;
94  tempMsg.writeDouble(il->getCurrentSpeed());
95  break;
98  std::vector<std::string> ids = il->getCurrentVehicleIDs();
99  tempMsg.writeStringList(ids);
100  }
101  break;
102  case LAST_STEP_OCCUPANCY:
104  tempMsg.writeDouble(il->getCurrentOccupancy());
105  break;
106  case LAST_STEP_LENGTH:
108  tempMsg.writeDouble(il->getCurrentLength());
109  break;
113  break;
114  case LAST_STEP_VEHICLE_DATA: {
115  std::vector<MSInductLoop::VehicleData> vd = il->collectVehiclesOnDet(MSNet::getInstance()->getCurrentTimeStep() - DELTA_T, true);
117  tcpip::Storage tempContent;
118  int cnt = 0;
119  tempContent.writeUnsignedByte(TYPE_INTEGER);
120  tempContent.writeInt((int) vd.size());
121  ++cnt;
122  for (int i = 0; i < (int)vd.size(); ++i) {
123  MSInductLoop::VehicleData& svd = vd[i];
124  tempContent.writeUnsignedByte(TYPE_STRING);
125  tempContent.writeString(svd.idM);
126  ++cnt;
127  tempContent.writeUnsignedByte(TYPE_DOUBLE);
128  tempContent.writeDouble(svd.lengthM);
129  ++cnt;
130  tempContent.writeUnsignedByte(TYPE_DOUBLE);
131  tempContent.writeDouble(svd.entryTimeM);
132  ++cnt;
133  tempContent.writeUnsignedByte(TYPE_DOUBLE);
134  tempContent.writeDouble(svd.leaveTimeM);
135  ++cnt;
136  tempContent.writeUnsignedByte(TYPE_STRING);
137  tempContent.writeString(svd.typeIDM);
138  ++cnt;
139  }
140 
141  tempMsg.writeInt((int) cnt);
142  tempMsg.writeStorage(tempContent);
143  break;
144  }
145  case VAR_POSITION:
147  tempMsg.writeDouble(il->getPosition());
148  break;
149  case VAR_LANE_ID:
151  tempMsg.writeString(il->getLane()->getID());
152  break;
153  default:
154  break;
155  }
156  }
157  server.writeStatusCmd(CMD_GET_INDUCTIONLOOP_VARIABLE, RTYPE_OK, "", outputStorage);
158  server.writeResponseWithLength(outputStorage, tempMsg);
159  return true;
160 }
161 
162 
163 bool
166  if (il == 0) {
167  return false;
168  }
169  p = il->getLane()->getShape().positionAtOffset(il->getPosition());
170  return true;
171 }
172 
173 
174 NamedRTree*
176  NamedRTree* t = new NamedRTree();
177  const std::map<std::string, MSDetectorFileOutput*>& dets = MSNet::getInstance()->getDetectorControl().getTypedDetectors(SUMO_TAG_INDUCTION_LOOP).getMyMap();
178  for (std::map<std::string, MSDetectorFileOutput*>::const_iterator i = dets.begin(); i != dets.end(); ++i) {
179  MSInductLoop* il = static_cast<MSInductLoop*>((*i).second);
181  const float cmin[2] = {(float) p.x(), (float) p.y()};
182  const float cmax[2] = {(float) p.x(), (float) p.y()};
183  t->Insert(cmin, cmax, il);
184  }
185  return t;
186 }
187 
188 #endif
189 
190 
191 /****************************************************************************/
192 
#define LAST_STEP_MEAN_SPEED
void Insert(const float a_min[2], const float a_max[2], Named *const &a_data)
Insert entry.
Definition: NamedRTree.h:90
#define TYPE_COMPOUND
#define VAR_POSITION
#define CMD_GET_INDUCTIONLOOP_VARIABLE
#define LAST_STEP_VEHICLE_DATA
#define RTYPE_OK
A RT-tree for efficient storing of SUMO&#39;s Named objects.
Definition: NamedRTree.h:72
SUMOReal getPosition() const
Returns the position of the detector on the lane.
Definition: MSInductLoop.h:100
int getCurrentPassedNumber() const
Returns the number of vehicles that have passed the detector.
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
Definition: MSNet.cpp:159
SUMOTime DELTA_T
Definition: SUMOTime.cpp:39
#define TYPE_STRINGLIST
virtual std::vector< VehicleData > collectVehiclesOnDet(SUMOTime t, bool leaveTime=false) const
Returns vehicle data for vehicles that have been on the detector starting at the given time...
SUMOReal getCurrentOccupancy() const
Returns the current occupancy.
virtual void writeUnsignedByte(int)
bool writeErrorStatusCmd(int commandId, const std::string &description, tcpip::Storage &outputStorage)
Writes a status command to the given storage with status = RTYPE_ERR.
SUMOReal x() const
Returns the x-position.
Definition: Position.h:63
const MSLane * getLane() const
Returns the lane the reminder works on.
virtual void writeInt(int)
SUMOReal lengthM
Length of the vehicle.
Definition: MSInductLoop.h:271
#define TYPE_STRING
virtual int readUnsignedByte()
#define LAST_STEP_LENGTH
static bool getPosition(const std::string &id, Position &p)
Returns the named inductive loop&#39;s position.
T get(const std::string &id) const
Retrieves an item.
std::vector< std::string > getCurrentVehicleIDs() const
Returns the ids of vehicles that have passed the detector.
const std::string & getID() const
Returns the id.
Definition: Named.h:66
const NamedObjectCont< MSDetectorFileOutput * > & getTypedDetectors(SumoXMLTag type) const
Returns the list of detectors of the given type.
#define LAST_STEP_TIME_SINCE_DETECTION
SUMOReal leaveTimeM
Leave-time of the vehicle in [s].
Definition: MSInductLoop.h:275
SUMOReal entryTimeM
Entry-time of the vehicle in [s].
Definition: MSInductLoop.h:273
A point in 2D or 3D with translation and scaling methods.
Definition: Position.h:46
void insertIDs(std::vector< std::string > &into) const
virtual void writeStringList(const std::vector< std::string > &s)
Position positionAtOffset(SUMOReal pos, SUMOReal lateralOffset=0) const
Returns the position at the given length.
virtual std::string readString()
std::string idM
The id of the vehicle.
Definition: MSInductLoop.h:269
static bool processGet(TraCIServer &server, tcpip::Storage &inputStorage, tcpip::Storage &outputStorage)
Processes a get value command (Command 0xa0: Get Induction Loop Variable)
TraCI server used to control sumo by a remote TraCI client.
Definition: TraCIServer.h:73
MSDetectorControl & getDetectorControl()
Returns the detector control.
Definition: MSNet.h:370
#define RESPONSE_GET_INDUCTIONLOOP_VARIABLE
virtual void writeStorage(tcpip::Storage &store)
SUMOReal getCurrentSpeed() const
Returns the speed of the vehicle on the detector.
void writeResponseWithLength(tcpip::Storage &outputStorage, tcpip::Storage &tempMsg)
const IDMap & getMyMap() const
#define LAST_STEP_VEHICLE_NUMBER
virtual void writeString(const std::string &s)
#define LAST_STEP_VEHICLE_ID_LIST
Struct to store the data of the counted vehicle internally.
Definition: MSInductLoop.h:254
#define TYPE_DOUBLE
std::string toHex(const T i, std::streamsize numDigits=0)
Definition: ToString.h:65
SUMOReal y() const
Returns the y-position.
Definition: Position.h:68
static NamedRTree * getTree()
Returns a tree filled with inductive loop instances.
virtual void writeDouble(double)
const PositionVector & getShape() const
Returns this lane&#39;s shape.
Definition: MSLane.h:422
SUMOReal getTimestepsSinceLastDetection() const
Returns the time since the last vehicle left the detector.
void writeStatusCmd(int commandId, int status, const std::string &description, tcpip::Storage &outputStorage)
Writes a status command to the given storage.
#define LAST_STEP_OCCUPANCY
#define ID_COUNT
SUMOReal getCurrentLength() const
Returns the length of the vehicle on the detector.
#define VAR_LANE_ID
#define TYPE_INTEGER
#define ID_LIST
std::string typeIDM
Type of the vehicle in.
Definition: MSInductLoop.h:279
An unextended detector measuring at a fixed position on a fixed lane.
Definition: MSInductLoop.h:71