68 oc.
addDescription(
"device.btreceiver.range",
"Communication",
"The range of the bt receiver");
71 oc.
addDescription(
"device.btreceiver.all-recognitions",
"Communication",
"Whether all recognition point shall be written");
74 oc.
addDescription(
"device.btreceiver.offtime",
"Communication",
"The offtime used for calculating detection probability (in seconds)");
85 into.push_back(device);
107 (*i).second->amOnNet =
false;
108 (*i).second->haveArrived =
true;
111 (*i).second->amOnNet =
false;
112 (*i).second->haveArrived =
true;
126 const float cmin[2] = {(float) b.
xmin(), (float) b.
ymin()};
127 const float cmax[2] = {(float) b.
xmax(), (float) b.
ymax()};
128 rt.
Insert(cmin, cmax, vi);
133 bool allRecognitions = oc.
getBool(
"device.btreceiver.all-recognitions");
134 bool haveOutput = oc.
isSet(
"bt-output");
140 const float cmin[2] = {(float) b.
xmin(), (float) b.
ymin()};
141 const float cmax[2] = {(float) b.
xmax(), (float) b.
ymax()};
142 std::set<std::string> surroundingVehicles;
144 rt.
Search(cmin, cmax, sv);
147 for (std::set<std::string>::const_iterator j = surroundingVehicles.begin(); j != surroundingVehicles.end(); ++j) {
148 if ((*i).first == *j) {
158 writeOutput((*i).first, vi->
seen, allRecognitions);
192 leaveRange(receiver, receiverData, sender, senderData, 0);
196 const Position& oldReceiverPosition = receiver.
updates.front().position;
204 std::vector<double> intersections;
206 switch (intersections.size()) {
217 leaveRange(receiver, receiverData, sender, senderData, 0.);
224 intersection1ReceiverData.
position = oldReceiverPosition + receiverDelta * intersections.front();
226 intersection1SenderData.
position = oldSenderPosition + senderDelta * intersections.front();
228 leaveRange(receiver, intersection1ReceiverData,
229 sender, intersection1SenderData, (intersections.front() - 1.) *
TS);
231 enterRange((intersections.front() - 1.) *
TS, intersection1ReceiverData,
240 intersectionReceiverData.
position = oldReceiverPosition + receiverDelta * intersections.front();
242 intersectionSenderData.
position = oldSenderPosition + senderDelta * intersections.front();
243 enterRange((intersections.front() - 1.) *
TS, intersectionReceiverData,
245 intersectionReceiverData.position = oldReceiverPosition + receiverDelta * intersections.back();
246 intersectionSenderData.
position = oldSenderPosition + senderDelta * intersections.back();
247 leaveRange(receiver, intersectionReceiverData,
248 sender, intersectionSenderData, (intersections.back() - 1.) *
TS);
250 WRITE_WARNING(
"The vehicle '" + sender.
getID() +
"' cannot be in the range of vehicle '" + receiver.
getID() +
"', leave, and enter it in one step.");
254 WRITE_WARNING(
"Nope, a circle cannot be crossed more often than twice by a line.");
263 std::map<std::string, SeenDevice*>& currentlySeen) {
266 currentlySeen[senderID] = sd;
267 addRecognitionPoint(
SIMTIME, receiverState, senderState, sd);
275 std::map<std::string, SeenDevice*>::iterator i = receiverInfo.
currentlySeen.find(senderInfo.
getID());
277 addRecognitionPoint(
SIMTIME + tOffset, receiverState, senderState, i->second);
280 ConstMSEdgeVector::const_iterator begin = receiverInfo.
route.begin() + i->second->meetingBegin.observerState.routePos;
281 ConstMSEdgeVector::const_iterator end = receiverInfo.
route.begin() + receiverState.
routePos + 1;
282 i->second->receiverRoute = toString<const MSEdge>(begin, end);
283 begin = senderInfo.
route.begin() + i->second->meetingBegin.seenState.routePos;
285 i->second->senderRoute = toString<const MSEdge>(begin, end);
286 receiverInfo.
seen[senderInfo.
getID()].push_back(i->second);
302 return delaySlots + backoff;
306 return 2048 - phaseOffset + delaySlots + backoff;
310 if (2 * 2048 - phaseOffset + backoff < 4096) {
311 return 2 * 2048 - phaseOffset + delaySlots + backoff;
314 return 2 * 2048 - phaseOffset + delaySlots + backoff;
316 return 2 * 2048 + delaySlots + backoff;
324 if (senderDevice->
nextView == -1.) {
327 if (tEnd > senderDevice->
nextView) {
340 for (std::map<std::string, std::vector<SeenDevice*> >::const_iterator j = seen.begin(); j != seen.end(); ++j) {
341 const std::vector<SeenDevice*>& sts = (*j).second;
342 for (std::vector<SeenDevice*>::const_iterator k = sts.begin(); k != sts.end(); ++k) {
346 os.
writeAttr(
"tBeg", (*k)->meetingBegin.t)
353 os.
writeAttr(
"tEnd", (*k)->meetingEnd->t)
358 .
writeAttr(
"observerRoute", (*k)->receiverRoute).
writeAttr(
"seenRoute", (*k)->senderRoute);
359 for (std::vector<MeetingPoint*>::iterator l = (*k)->recognitionPoints.begin(); l != (*k)->recognitionPoints.end(); ++l) {
361 .
writeAttr(
"observerPos", (*l)->observerState.position).
writeAttr(
"observerSpeed", (*l)->observerState.speed)
362 .
writeAttr(
"observerLaneID", (*l)->observerState.laneID).
writeAttr(
"observerLanePos", (*l)->observerState.lanePos)
363 .
writeAttr(
"seenPos", (*l)->seenState.position).
writeAttr(
"seenSpeed", (*l)->seenState.speed)
364 .
writeAttr(
"seenLaneID", (*l)->seenState.laneID).
writeAttr(
"seenLanePos", (*l)->seenState.lanePos)
366 if (!allRecognitions) {
412 WRITE_WARNING(
"btreceiver: Can not update position of vehicle '" + veh.
getID() +
"' which is not on the road.");
427 WRITE_WARNING(
"btreceiver: Can not update position of vehicle '" + veh.
getID() +
"' which is not on the road.");
int getRoutePosition() const
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
double ymin() const
Returns minimum y-coordinate.
double xmax() const
Returns maximum x-coordinate.
void enterRange(double 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.
Position position
The position of the vehicle.
Representation of a vehicle in the micro simulation.
A global update performer.
int getInt(const std::string &name) const
Returns the int-value of the named option (only for Option_Integer)
void writeOutput(const std::string &id, const std::map< std::string, std::vector< SeenDevice *> > &seen, bool allRecognitions)
Writes the output.
MSLane * getLane() const
Returns the lane the vehicle is on.
int routePos
The position in the route of the vehicle.
static void buildVehicleDevices(SUMOVehicle &v, std::vector< MSDevice *> &into)
Build devices for the given vehicle, if needed.
The vehicle arrived at a junction.
std::string laneID
The lane the vehicle was at.
virtual const MSEdge * getEdge() const =0
Returns the edge the vehicle is currently at.
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.
bool getBool(const std::string &name) const
Returns the boolean-value of the named option (only for Option_Bool)
double lastView
Last recognition point.
const std::string & getID() const
Returns the id.
double lanePos
The position at the lane of the vehicle.
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 double inquiryDelaySlots(const int backoffLimit)
bool notifyMove(SUMOVehicle &veh, double oldPos, double newPos, double newSpeed)
Checks whether the reminder still has to be notified about the vehicle moves.
bool isSet(const std::string &name, bool failOnNonExistant=true) const
Returns the information whether the named option is set.
Class representing a single seen device.
~BTreceiverUpdate()
Destructor.
double nextView
Next possible recognition point.
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.
The vehicle arrived at its destination (is deleted)
virtual void addEvent(Command *operation, SUMOTime execTimeStep=-1)
Adds an Event.
double xmin() const
Returns minimum x-coordinate.
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.
Boundary & grow(double by)
extends the boundary by the given amount
static std::map< std::string, VehicleInformation * > sVehicles
The list of arrived receivers.
int Search(const float a_min[2], const float a_max[2], const Named::StoringVisitor &c) const
Find all within search rectangle.
double getFloat(const std::string &name) const
Returns the double-value of the named option (only for Option_Float)
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 void findLineCircleIntersections(const Position &c, double radius, const Position &p1, const Position &p2, std::vector< double > &into)
Returns the positions the given circle is crossed by the given line.
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.
The vehicle has departed (was inserted into the network)
bool notifyEnter(SUMOVehicle &veh, Notification reason, const MSLane *enteredLane=0)
Adds the vehicle to running vehicles if it (re-) enters the network.
double speed
The speed of the vehicle.
virtual double getPositionOnLane() const =0
Get the vehicle's position along the lane.
static OutputDevice & getDeviceByOption(const std::string &name)
Returns the device described by the option.
bool notifyLeave(SUMOVehicle &veh, double lastPos, Notification reason, const MSLane *enteredLane=0)
Moves (the known) vehicle from running to arrived vehicles' list.
void seed(const uint32 oneSeed)
A storage for options typed value containers)
virtual Position getPosition(const double offset=0) const =0
Return current position (x/y, cartesian)
Static storage of an output device and its base (abstract) implementation.
double distanceTo(const Position &p2) const
returns the euclidean distance in 3 dimension
bool closeTag()
Closes the most recently opened tag.
static double myRange
The range of the device.
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.
static double myOffTime
The offtime of the device.
double ymax() const
Returns maximum y-coordinate.
static void insertOptions(OptionsCont &oc)
Inserts MSDevice_BTreceiver-options.
virtual double getSpeed() const =0
Returns the vehicle's current speed.
Representation of a lane in the micro simulation.
virtual const std::string & getID() const =0
Get the vehicle's ID.
OutputDevice & openTag(const std::string &xmlElement)
Opens an XML tag.
void addRecognitionPoint(const double tEnd, const MSDevice_BTsender::VehicleState &receiverState, const MSDevice_BTsender::VehicleState &senderState, SeenDevice *senderDevice) const
Adds a point of recognition.
BTreceiverUpdate()
Constructor.
The vehicle is being teleported.
void leaveRange(VehicleInformation &receiverInfo, const MSDevice_BTsender::VehicleState &receiverState, MSDevice_BTsender::VehicleInformation &senderInfo, const MSDevice_BTsender::VehicleState &senderState, double tOffset)
Removes the sender from the currently seen devices to past episodes.