45 #ifdef CHECK_MEMORY_LEAKS
47 #endif // CHECK_MEMORY_LEAKS
69 oc.
addDescription(
"device.btreceiver.range",
"Communication",
"The range of the bt receiver");
72 oc.
addDescription(
"device.btreceiver.all-recognitions",
"Communication",
"Whether all recognition point shall be written");
81 into.push_back(device);
101 (*i).second->amOnNet =
false;
102 (*i).second->haveArrived =
true;
105 (*i).second->amOnNet =
false;
106 (*i).second->haveArrived =
true;
122 rt.
Insert(cmin, cmax, vi);
127 bool allRecognitions = oc.
getBool(
"device.btreceiver.all-recognitions");
128 bool haveOutput = oc.
isSet(
"bt-output");
137 Position egoP1(egoP2.
x() - sin(angle)*dist, egoP2.
y() + cos(angle)*dist);
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);
169 (*i).second->updates.clear();
170 (*i).second->updates.push_back(last);
177 if ((*i).second->haveArrived) {
182 (*i).second->updates.clear();
183 (*i).second->updates.push_back(last);
195 std::vector<SUMOReal> intersections;
212 Position otherP1(otherPosition.
x() - sin(angle)*dist, otherPosition.
y() + cos(angle)*dist);
213 Position otherD = otherP2 - otherP1;
214 otherP2 = otherP1 - receiverD + otherD;
217 int count = (
int) intersections.size();
224 enterRange(atOffset, receiverPos, receiver.
updates.back().speed, receiver.
updates.back().laneID, receiver.
updates.back().lanePos,
239 Position intersection1Other = otherP1 + otherD * intersections.front();
240 Position intersection1Ego = receiverStartPos + receiverD * intersections.front();
243 sender.
getID(), intersection1Other, sender.
updates.back().speed, sender.
updates.back().laneID, sender.
updates.back().lanePos, -1. + intersections.front());
245 enterRange(-1. + intersections.front(), intersection1Ego, receiver.
updates.back().speed, receiver.
updates.back().laneID, receiver.
updates.back().lanePos,
253 Position intersection1Other = otherP1 + otherD * intersections.front();
254 Position intersection1Ego = receiverStartPos + receiverD * intersections.front();
255 enterRange(-1. + intersections.front(), intersection1Ego, receiver.
updates.back().speed, receiver.
updates.back().laneID, receiver.
updates.back().lanePos,
257 Position intersection2Other = otherP1 + otherD * intersections[1];
258 Position intersection2Ego = receiverStartPos + receiverD * intersections[1];
260 sender.
getID(), intersection2Other, sender.
updates.back().speed, sender.
updates.back().laneID, sender.
updates.back().lanePos, -1. + intersections.front());
262 WRITE_WARNING(
"Nope, a vehicle cannot be in the range, leave, and enter it in one step.");
266 WRITE_WARNING(
"Nope, a circle cannot be crossed more often than twice by a line.");
275 const std::string& otherID,
const Position& otherPos,
SUMOReal otherSpeed,
const std::string& otherLaneID,
SUMOReal otherLanePos,
276 std::map<std::string, SeenDevice*>& currentlySeen) {
279 currentlySeen[otherID] = sd;
281 otherID, otherPos, otherSpeed, otherLaneID, otherLanePos, currentlySeen);
288 const std::string& otherID,
const Position& otherPos,
SUMOReal otherSpeed,
const std::string& otherLaneID,
SUMOReal otherLanePos,
292 otherID, otherPos, otherSpeed, otherLaneID, otherLanePos, currentlySeen);
295 std::map<std::string, SeenDevice*>::iterator i = currentlySeen.find(otherID);
296 (*i).second->meetingEnd = mp;
297 if (seen.find(otherID) == seen.end()) {
298 seen[otherID] = std::vector<SeenDevice*>();
300 seen[otherID].push_back((*i).second);
301 currentlySeen.erase(i);
307 const std::string& otherID,
const Position& otherPos,
SUMOReal otherSpeed,
const std::string& otherLaneID,
SUMOReal otherLanePos,
308 std::map<std::string, SeenDevice*>& currentlySeen) {
309 SUMOReal t = tEnd - currentlySeen.find(otherID)->second->lastView;
311 currentlySeen.find(otherID)->second->lastView = tEnd;
312 MeetingPoint* mp =
new MeetingPoint(tEnd, thisPos, thisSpeed, thisLaneID, thisLanePos, otherPos, otherSpeed, otherLaneID, otherLanePos);
313 std::map<std::string, SeenDevice*>::iterator i = currentlySeen.find(otherID);
314 if (i != currentlySeen.end()) {
315 (*i).second->recognitionPoints.push_back(mp);
317 WRITE_WARNING(
"Could not add a recognition point as the sender '" + otherID +
"' is not currently seen.");
327 for (std::map<std::string, std::vector<SeenDevice*> >::const_iterator j = seen.begin(); j != seen.end(); ++j) {
328 const std::vector<SeenDevice*>& sts = (*j).second;
329 for (std::vector<SeenDevice*>::const_iterator k = sts.begin(); k != sts.end(); ++k) {
331 os.
writeAttr(
"tBeg", (*k)->meetingBegin.t)
332 .
writeAttr(
"observerPosBeg", (*k)->meetingBegin.observerPos).
writeAttr(
"observerSpeedBeg", (*k)->meetingBegin.observerSpeed)
333 .
writeAttr(
"observerLaneIDBeg", (*k)->meetingBegin.observerLaneID).
writeAttr(
"observerLanePosBeg", (*k)->meetingBegin.observerLanePos)
334 .
writeAttr(
"seenPosBeg", (*k)->meetingBegin.seenPos).
writeAttr(
"seenSpeedBeg", (*k)->meetingBegin.seenSpeed)
335 .
writeAttr(
"seenLaneIDBeg", (*k)->meetingBegin.seenLaneID).
writeAttr(
"seenLanePosBeg", (*k)->meetingBegin.seenLanePos);
337 .
writeAttr(
"observerPosEnd", (*k)->meetingEnd.observerPos).
writeAttr(
"observerSpeedEnd", (*k)->meetingEnd.observerSpeed)
338 .
writeAttr(
"observerLaneIDEnd", (*k)->meetingEnd.observerLaneID).
writeAttr(
"observerLanePosEnd", (*k)->meetingEnd.observerLanePos)
339 .
writeAttr(
"seenPosEnd", (*k)->meetingEnd.seenPos).
writeAttr(
"seenSpeedEnd", (*k)->meetingEnd.seenSpeed)
340 .
writeAttr(
"seenLaneIDEnd", (*k)->meetingEnd.seenLaneID).
writeAttr(
"seenLanePosEnd", (*k)->meetingEnd.seenLanePos);
341 for (std::vector<MeetingPoint*>::iterator l = (*k)->recognitionPoints.begin(); l != (*k)->recognitionPoints.end(); ++l) {
343 .
writeAttr(
"observerPos", (*l)->observerPos).
writeAttr(
"observerSpeed", (*l)->observerSpeed)
344 .
writeAttr(
"observerLaneID", (*l)->observerLaneID).
writeAttr(
"observerLanePos", (*l)->observerLanePos)
346 .
writeAttr(
"seenLaneID", (*l)->seenLaneID).
writeAttr(
"seenLanePos", (*l)->seenLanePos)
348 if (!allRecognitions) {
388 WRITE_WARNING(
"btreceiver: Can not update position of a vehicle that is not within the road network (" + veh.
getID() +
").");
392 MSNet::getInstance()->getCurrentTimeStep(), newSpeed, static_cast<MSVehicle&>(veh).getAngle(), static_cast<MSVehicle&>(veh).getPosition(), static_cast<MSVehicle&>(veh).
getLane()->
getID(), newPos
404 WRITE_WARNING(
"btreceiver: Can not update position of a vehicle that is not within the road network (" + veh.
getID() +
").");