46 #ifdef CHECK_MEMORY_LEAKS 48 #endif // CHECK_MEMORY_LEAKS 72 oc.
addDescription(
"device.btreceiver.range",
"Communication",
"The range of the bt receiver");
75 oc.
addDescription(
"device.btreceiver.all-recognitions",
"Communication",
"Whether all recognition point shall be written");
78 oc.
addDescription(
"device.btreceiver.offtime",
"Communication",
"The offtime used for calculating detection probability (in seconds)");
89 into.push_back(device);
111 (*i).second->amOnNet =
false;
112 (*i).second->haveArrived =
true;
115 (*i).second->amOnNet =
false;
116 (*i).second->haveArrived =
true;
130 const float cmin[2] = {(float) b.
xmin(), (float) b.
ymin()};
131 const float cmax[2] = {(float) b.
xmax(), (float) b.
ymax()};
132 rt.
Insert(cmin, cmax, vi);
137 bool allRecognitions = oc.
getBool(
"device.btreceiver.all-recognitions");
138 bool haveOutput = oc.
isSet(
"bt-output");
144 const float cmin[2] = {(float) b.
xmin(), (float) b.
ymin()};
145 const float cmax[2] = {(float) b.
xmax(), (float) b.
ymax()};
146 std::set<std::string> surroundingVehicles;
148 rt.
Search(cmin, cmax, sv);
151 for (std::set<std::string>::const_iterator j = surroundingVehicles.begin(); j != surroundingVehicles.end(); ++j) {
152 if ((*i).first == *j) {
162 writeOutput((*i).first, vi->
seen, allRecognitions);
196 leaveRange(receiver, receiverData, sender, senderData, 0);
200 const Position& oldReceiverPosition = receiver.
updates.front().position;
208 std::vector<SUMOReal> intersections;
210 switch (intersections.size()) {
221 leaveRange(receiver, receiverData, sender, senderData, 0.);
228 intersection1ReceiverData.
position = oldReceiverPosition + receiverDelta * intersections.front();
230 intersection1SenderData.
position = oldSenderPosition + senderDelta * intersections.front();
232 leaveRange(receiver, intersection1ReceiverData,
233 sender, intersection1SenderData, (intersections.front() - 1.) *
TS);
235 enterRange((intersections.front() - 1.) *
TS, intersection1ReceiverData,
244 intersectionReceiverData.
position = oldReceiverPosition + receiverDelta * intersections.front();
246 intersectionSenderData.
position = oldSenderPosition + senderDelta * intersections.front();
247 enterRange((intersections.front() - 1.) *
TS, intersectionReceiverData,
249 intersectionReceiverData.position = oldReceiverPosition + receiverDelta * intersections.back();
250 intersectionSenderData.
position = oldSenderPosition + senderDelta * intersections.back();
251 leaveRange(receiver, intersectionReceiverData,
252 sender, intersectionSenderData, (intersections.back() - 1.) *
TS);
254 WRITE_WARNING(
"The vehicle '" + sender.
getID() +
"' cannot be in the range of vehicle '" + receiver.
getID() +
"', leave, and enter it in one step.");
258 WRITE_WARNING(
"Nope, a circle cannot be crossed more often than twice by a line.");
267 std::map<std::string, SeenDevice*>& currentlySeen) {
270 currentlySeen[senderID] = sd;
271 addRecognitionPoint(
SIMTIME, receiverState, senderState, sd);
279 std::map<std::string, SeenDevice*>::iterator i = receiverInfo.
currentlySeen.find(senderInfo.
getID());
281 addRecognitionPoint(
SIMTIME + tOffset, receiverState, senderState, i->second);
284 ConstMSEdgeVector::const_iterator begin = receiverInfo.
route.begin() + i->second->meetingBegin.observerState.routePos;
285 ConstMSEdgeVector::const_iterator end = receiverInfo.
route.begin() + receiverState.
routePos + 1;
286 i->second->receiverRoute = toString<const MSEdge>(begin, end);
287 begin = senderInfo.
route.begin() + i->second->meetingBegin.seenState.routePos;
289 i->second->senderRoute = toString<const MSEdge>(begin, end);
290 receiverInfo.
seen[senderInfo.
getID()].push_back(i->second);
306 return delaySlots + backoff;
310 return 2048 - phaseOffset + delaySlots + backoff;
314 if (2 * 2048 - phaseOffset + backoff < 4096) {
315 return 2 * 2048 - phaseOffset + delaySlots + backoff;
318 return 2 * 2048 - phaseOffset + delaySlots + backoff;
320 return 2 * 2048 + delaySlots + backoff;
328 if (senderDevice->
nextView == -1.) {
331 if (tEnd > senderDevice->
nextView) {
344 for (std::map<std::string, std::vector<SeenDevice*> >::const_iterator j = seen.begin(); j != seen.end(); ++j) {
345 const std::vector<SeenDevice*>& sts = (*j).second;
346 for (std::vector<SeenDevice*>::const_iterator k = sts.begin(); k != sts.end(); ++k) {
350 os.
writeAttr(
"tBeg", (*k)->meetingBegin.t)
357 os.
writeAttr(
"tEnd", (*k)->meetingEnd->t)
362 .
writeAttr(
"observerRoute", (*k)->receiverRoute).
writeAttr(
"seenRoute", (*k)->senderRoute);
363 for (std::vector<MeetingPoint*>::iterator l = (*k)->recognitionPoints.begin(); l != (*k)->recognitionPoints.end(); ++l) {
365 .
writeAttr(
"observerPos", (*l)->observerState.position).
writeAttr(
"observerSpeed", (*l)->observerState.speed)
366 .
writeAttr(
"observerLaneID", (*l)->observerState.laneID).
writeAttr(
"observerLanePos", (*l)->observerState.lanePos)
367 .
writeAttr(
"seenPos", (*l)->seenState.position).
writeAttr(
"seenSpeed", (*l)->seenState.speed)
368 .
writeAttr(
"seenLaneID", (*l)->seenState.laneID).
writeAttr(
"seenLanePos", (*l)->seenState.lanePos)
370 if (!allRecognitions) {
416 WRITE_WARNING(
"btreceiver: Can not update position of vehicle '" + veh.
getID() +
"' which is not on the road.");
431 WRITE_WARNING(
"btreceiver: Can not update position of vehicle '" + veh.
getID() +
"' which is not on the road.");
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.
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.
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 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.