47 #ifdef CHECK_MEMORY_LEAKS
49 #endif // CHECK_MEMORY_LEAKS
73 oc.
addDescription(
"device.btreceiver.range",
"Communication",
"The range of the bt receiver");
76 oc.
addDescription(
"device.btreceiver.all-recognitions",
"Communication",
"Whether all recognition point shall be written");
79 oc.
addDescription(
"device.btreceiver.offtime",
"Communication",
"The offtime used for calculating detection probability (in seconds)");
90 into.push_back(device);
112 (*i).second->amOnNet =
false;
113 (*i).second->haveArrived =
true;
116 (*i).second->amOnNet =
false;
117 (*i).second->haveArrived =
true;
131 const float cmin[2] = {(float) b.
xmin(), (float) b.
ymin()};
132 const float cmax[2] = {(float) b.
xmax(), (float) b.
ymax()};
133 rt.
Insert(cmin, cmax, vi);
138 bool allRecognitions = oc.
getBool(
"device.btreceiver.all-recognitions");
139 bool haveOutput = oc.
isSet(
"bt-output");
145 const float cmin[2] = {(float) b.
xmin(), (float) b.
ymin()};
146 const float cmax[2] = {(float) b.
xmax(), (float) b.
ymax()};
147 std::set<std::string> surroundingVehicles;
149 rt.
Search(cmin, cmax, sv);
152 for (std::set<std::string>::const_iterator j = surroundingVehicles.begin(); j != surroundingVehicles.end(); ++j) {
153 if ((*i).first == *j) {
163 writeOutput((*i).first, vi->
seen, allRecognitions);
197 leaveRange(receiver, receiverData, sender, senderData, 0);
201 const Position& oldReceiverPosition = receiver.
updates.front().position;
209 std::vector<SUMOReal> intersections;
211 switch (intersections.size()) {
222 leaveRange(receiver, receiverData, sender, senderData, 0.);
229 intersection1ReceiverData.
position = oldReceiverPosition + receiverDelta * intersections.front();
231 intersection1SenderData.
position = oldSenderPosition + senderDelta * intersections.front();
233 leaveRange(receiver, intersection1ReceiverData,
234 sender, intersection1SenderData, (intersections.front() - 1.) *
TS);
236 enterRange((intersections.front() - 1.) *
TS, intersection1ReceiverData,
245 intersectionReceiverData.
position = oldReceiverPosition + receiverDelta * intersections.front();
247 intersectionSenderData.
position = oldSenderPosition + senderDelta * intersections.front();
248 enterRange((intersections.front() - 1.) *
TS, intersectionReceiverData,
250 intersectionReceiverData.position = oldReceiverPosition + receiverDelta * intersections.back();
251 intersectionSenderData.
position = oldSenderPosition + senderDelta * intersections.back();
252 leaveRange(receiver, intersectionReceiverData,
253 sender, intersectionSenderData, (intersections.back() - 1.) *
TS);
255 WRITE_WARNING(
"The vehicle '" + sender.
getID() +
"' cannot be in the range of '" + receiver.
getID() +
"', leave, and enter it in one step.");
259 WRITE_WARNING(
"Nope, a circle cannot be crossed more often than twice by a line.");
268 std::map<std::string, SeenDevice*>& currentlySeen) {
271 currentlySeen[senderID] = sd;
272 addRecognitionPoint(
SIMTIME, receiverState, senderState, sd);
280 std::map<std::string, SeenDevice*>::iterator i = receiverInfo.
currentlySeen.find(senderInfo.
getID());
282 addRecognitionPoint(
SIMTIME + tOffset, receiverState, senderState, i->second);
285 ConstMSEdgeVector::const_iterator begin = receiverInfo.
route.begin() + i->second->meetingBegin.observerState.routePos;
286 ConstMSEdgeVector::const_iterator end = receiverInfo.
route.begin() + receiverState.
routePos + 1;
287 i->second->receiverRoute = toString<const MSEdge>(begin, end);
288 begin = senderInfo.
route.begin() + i->second->meetingBegin.seenState.routePos;
290 i->second->senderRoute = toString<const MSEdge>(begin, end);
291 receiverInfo.
seen[senderInfo.
getID()].push_back(i->second);
307 return delaySlots + backoff;
311 return 2048 - phaseOffset + delaySlots + backoff;
315 if (2 * 2048 - phaseOffset + backoff < 4096) {
316 return 2 * 2048 - phaseOffset + delaySlots + backoff;
319 return 2 * 2048 - phaseOffset + delaySlots + backoff;
321 return 2 * 2048 + delaySlots + backoff;
329 if (senderDevice->
nextView == -1.) {
332 if (tEnd > senderDevice->
nextView) {
345 for (std::map<std::string, std::vector<SeenDevice*> >::const_iterator j = seen.begin(); j != seen.end(); ++j) {
346 const std::vector<SeenDevice*>& sts = (*j).second;
347 for (std::vector<SeenDevice*>::const_iterator k = sts.begin(); k != sts.end(); ++k) {
351 os.
writeAttr(
"tBeg", (*k)->meetingBegin.t)
358 os.
writeAttr(
"tEnd", (*k)->meetingEnd->t)
363 .
writeAttr(
"observerRoute", (*k)->receiverRoute).
writeAttr(
"seenRoute", (*k)->senderRoute);
364 for (std::vector<MeetingPoint*>::iterator l = (*k)->recognitionPoints.begin(); l != (*k)->recognitionPoints.end(); ++l) {
366 .
writeAttr(
"observerPos", (*l)->observerState.position).
writeAttr(
"observerSpeed", (*l)->observerState.speed)
367 .
writeAttr(
"observerLaneID", (*l)->observerState.laneID).
writeAttr(
"observerLanePos", (*l)->observerState.lanePos)
368 .
writeAttr(
"seenPos", (*l)->seenState.position).
writeAttr(
"seenSpeed", (*l)->seenState.speed)
369 .
writeAttr(
"seenLaneID", (*l)->seenState.laneID).
writeAttr(
"seenLanePos", (*l)->seenState.lanePos)
371 if (!allRecognitions) {
417 WRITE_WARNING(
"btreceiver: Can not update position of a vehicle that is not within the road network (" + veh.
getID() +
").");
432 WRITE_WARNING(
"btreceiver: Can not update position of a vehicle that is not within the road network (" + veh.
getID() +
").");
void Insert(const float a_min[2], const float a_max[2], Named *const &a_data)
Insert entry.
void doRegister(const std::string &name, Option *v)
Adds an option under the given name.
OutputDevice & writeAttr(const SumoXMLAttr attr, const T &val)
writes a named attribute
Position position
The position of the vehicle.
Representation of a vehicle in the micro simulation.
A global update performer.
SUMOReal lanePos
The position at the lane of the vehicle.
The vehicle arrived at a junction.
SUMOReal ymin() const
Returns minimum y-coordinate.
std::string laneID
The lane the vehicle was at.
virtual SUMOReal getPositionOnLane() const =0
Get the vehicle's position along the lane.
bool getBool(const std::string &name) const
Returns the boolean-value of the named option (only for Option_Bool)
virtual const MSEdge * getEdge() const =0
Returns the edge the vehicle is currently at.
SUMOReal xmin() const
Returns minimum x-coordinate.
Notification
Definition of a vehicle state.
A RT-tree for efficient storing of SUMO's Named objects.
std::vector< MeetingPoint * > recognitionPoints
List of recognition points.
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
static MTRand sRecognitionRNG
A random number generator used to determine whether the opposite was recognized.
SUMOReal getFloat(const std::string &name) const
Returns the SUMOReal-value of the named option (only for Option_Float)
SUMOReal distanceTo(const Position &p2) const
returns the euclidean distance in 3 dimension
bool notifyLeave(SUMOVehicle &veh, SUMOReal lastPos, Notification reason)
Moves (the known) vehicle from running to arrived vehicles' list.
SUMOReal lastView
Last recognition point.
static void FindLineCircleIntersections(const Position &c, SUMOReal radius, const Position &p1, const Position &p2, std::vector< SUMOReal > &into)
Returns the positions the given circle is crossed by the given line.
SUMOReal xmax() const
Returns maximum x-coordinate.
A class that stores a 2D geometrical boundary.
#define WRITE_WARNING(msg)
MSDevice_BTreceiver(SUMOVehicle &holder, const std::string &id)
Constructor.
static OptionsCont & getOptions()
Retrieves the options.
static SUMOReal myRange
The range of the device.
static SUMOReal inquiryDelaySlots(const int backoffLimit)
const std::string & getID() const
Returns the id.
Class representing a single seen device.
~BTreceiverUpdate()
Destructor.
Representation of a vehicle.
static bool myWasInitialised
Whether the bt-system was already initialised.
A point in 2D or 3D with translation and scaling methods.
A single movement state of the vehicle.
SUMOReal nextView
Next possible recognition point.
void writeOutput(const std::string &id, const std::map< std::string, std::vector< SeenDevice * > > &seen, bool allRecognitions)
Writes the output.
The vehicle arrived at its destination (is deleted)
SUMOReal speed
The speed of the vehicle.
bool notifyEnter(SUMOVehicle &veh, Notification reason)
Adds the vehicle to running vehicles if it (re-) enters the network.
static void insertDefaultAssignmentOptions(const std::string &deviceName, const std::string &optionsTopic, OptionsCont &oc)
Adds common command options that allow to assign devices to vehicles.
~MSDevice_BTreceiver()
Destructor.
SUMOTime execute(SUMOTime currentTime)
Performs the update.
static std::map< std::string, VehicleInformation * > sVehicles
The list of arrived receivers.
virtual SUMOTime addEvent(Command *operation, SUMOTime execTimeStep, AdaptType type)
Adds an Event.
void leaveRange(VehicleInformation &receiverInfo, const MSDevice_BTsender::VehicleState &receiverState, MSDevice_BTsender::VehicleInformation &senderInfo, const MSDevice_BTsender::VehicleState &senderState, SUMOReal tOffset)
Removes the sender from the currently seen devices to past episodes.
MSEventControl * getEndOfTimestepEvents()
Returns the event control for events executed at the end of a time step.
Abstract in-vehicle device.
Holds the information about exact positions/speeds/time of the begin/end of a meeting.
static bool equippedByDefaultAssignmentOptions(const OptionsCont &oc, const std::string &deviceName, SUMOVehicle &v)
Determines whether a vehicle should get a certain device.
Allows to store the object; used as context while traveling the rtree in TraCI.
Boundary & grow(SUMOReal by)
extends the boundary by the given amount
The vehicle has departed (was inserted into the network)
unsigned int routePos
The position in the route of the vehicle.
virtual SUMOReal getSpeed() const =0
Returns the vehicle's current speed.
void enterRange(SUMOReal atOffset, const MSDevice_BTsender::VehicleState &receiverState, const std::string &senderID, const MSDevice_BTsender::VehicleState &senderState, std::map< std::string, SeenDevice * > ¤tlySeen)
Informs the receiver about a sender entering it's radius.
static OutputDevice & getDeviceByOption(const std::string &name)
Returns the device described by the option.
void addRecognitionPoint(const SUMOReal tEnd, const MSDevice_BTsender::VehicleState &receiverState, const MSDevice_BTsender::VehicleState &senderState, SeenDevice *senderDevice) const
Adds a point of recognition.
void seed(const uint32 oneSeed)
static SUMOReal myOffTime
The offtime of the device.
A storage for options typed value containers)
virtual Position getPosition(const SUMOReal offset=0) const =0
Return current position (x/y, cartesian)
Patch the time in a way that it is at least as high as the simulation begin time. ...
Static storage of an output device and its base (abstract) implementation.
bool closeTag()
Closes the most recently opened tag.
SUMOReal ymax() const
Returns maximum y-coordinate.
void updateVisibility(VehicleInformation &receiver, MSDevice_BTsender::VehicleInformation &sender)
Rechecks the visibility for a given receiver/sender pair.
void addDescription(const std::string &name, const std::string &subtopic, const std::string &description)
Adds a description for an option.
static std::map< std::string, VehicleInformation * > sVehicles
The list of arrived senders.
MSLane * getLane() const
Returns the lane the vehicle is on.
int getInt(const std::string &name) const
Returns the int-value of the named option (only for Option_Integer)
int Search(const float a_min[2], const float a_max[2], const Named::StoringVisitor &c) const
Find all within search rectangle.
static void buildVehicleDevices(SUMOVehicle &v, std::vector< MSDevice * > &into)
Build devices for the given vehicle, if needed.
static void insertOptions(OptionsCont &oc)
Inserts MSDevice_BTreceiver-options.
bool notifyMove(SUMOVehicle &veh, SUMOReal oldPos, SUMOReal newPos, SUMOReal newSpeed)
Checks whether the reminder still has to be notified about the vehicle moves.
unsigned int getRoutePosition() const
virtual const std::string & getID() const =0
Get the vehicle's ID.
OutputDevice & openTag(const std::string &xmlElement)
Opens an XML tag.
BTreceiverUpdate()
Constructor.
The vehicle is being teleported.
bool isSet(const std::string &name, bool failOnNonExistant=true) const
Returns the information whether the named option is set.