SUMOReal MSBaseVehicle::getImpatience() const { return MAX2((SUMOReal)0, MIN2((SUMOReal)1, getVehicleType().getImpatience() + (MSGlobals::gTimeToGridlock > 0 ? (SUMOReal)getWaitingTime() / MSGlobals::gTimeToGridlock : 0))); // Alternavite to avoid time to teleport effect on the simulation. No effect if time to teleport is -1 // return MAX2((SUMOReal)0, MIN2((SUMOReal)1, getVehicleType().getImpatience())); }
bool Person::handleVariable(const std::string& objID, const int variable, VariableWrapper* wrapper) { switch (variable) { case TRACI_ID_LIST: return wrapper->wrapStringList(objID, variable, getIDList()); case ID_COUNT: return wrapper->wrapInt(objID, variable, getIDCount()); case VAR_POSITION: return wrapper->wrapPosition(objID, variable, getPosition(objID)); case VAR_POSITION3D: return wrapper->wrapPosition(objID, variable, getPosition(objID, true)); case VAR_ANGLE: return wrapper->wrapDouble(objID, variable, getAngle(objID)); case VAR_SLOPE: return wrapper->wrapDouble(objID, variable, getSlope(objID)); case VAR_SPEED: return wrapper->wrapDouble(objID, variable, getSpeed(objID)); case VAR_ROAD_ID: return wrapper->wrapString(objID, variable, getRoadID(objID)); case VAR_LANEPOSITION: return wrapper->wrapDouble(objID, variable, getLanePosition(objID)); case VAR_COLOR: return wrapper->wrapColor(objID, variable, getColor(objID)); case VAR_WAITING_TIME: return wrapper->wrapDouble(objID, variable, getWaitingTime(objID)); case VAR_TYPE: return wrapper->wrapString(objID, variable, getTypeID(objID)); case VAR_NEXT_EDGE: return wrapper->wrapString(objID, variable, getNextEdge(objID)); case VAR_STAGES_REMAINING: return wrapper->wrapInt(objID, variable, getRemainingStages(objID)); case VAR_VEHICLE: return wrapper->wrapString(objID, variable, getVehicle(objID)); default: return false; } }
void GUIVehicle::selectBlockingFoes() const { double dist = myLane->getLength() - getPositionOnLane(); #ifdef DEBUG_FOES std::cout << SIMTIME << " selectBlockingFoes veh=" << getID() << " dist=" << dist << " numLinks=" << myLFLinkLanes.size() << "\n"; #endif for (DriveItemVector::const_iterator i = myLFLinkLanes.begin(); i != myLFLinkLanes.end(); ++i) { const DriveProcessItem& dpi = *i; if (dpi.myLink == nullptr) { /// XXX if the vehicle intends to stop on an intersection, there could be a relevant exitLink (see #4299) continue; } std::vector<const SUMOVehicle*> blockingFoes; std::vector<const MSPerson*> blockingPersons; #ifdef DEBUG_FOES std::cout << " foeLink=" << dpi.myLink->getViaLaneOrLane()->getID() << "\n"; const bool isOpen = #endif dpi.myLink->opened(dpi.myArrivalTime, dpi.myArrivalSpeed, dpi.getLeaveSpeed(), getVehicleType().getLength(), getImpatience(), getCarFollowModel().getMaxDecel(), getWaitingTime(), getLateralPositionOnLane(), &blockingFoes); #ifdef DEBUG_FOES if (!isOpen) { std::cout << " closed due to:\n"; for (std::vector<const SUMOVehicle*>::const_iterator it = blockingFoes.begin(); it != blockingFoes.end(); ++it) { std::cout << " " << (*it)->getID() << "\n"; } } #endif if (getLaneChangeModel().getShadowLane() != nullptr) { MSLink* parallelLink = dpi.myLink->getParallelLink(getLaneChangeModel().getShadowDirection()); if (parallelLink != nullptr) { const double shadowLatPos = getLateralPositionOnLane() - getLaneChangeModel().getShadowDirection() * 0.5 * ( myLane->getWidth() + getLaneChangeModel().getShadowLane()->getWidth()); #ifdef DEBUG_FOES const bool isShadowOpen = #endif parallelLink->opened(dpi.myArrivalTime, dpi.myArrivalSpeed, dpi.getLeaveSpeed(), getVehicleType().getLength(), getImpatience(), getCarFollowModel().getMaxDecel(), getWaitingTime(), shadowLatPos, &blockingFoes); #ifdef DEBUG_FOES if (!isShadowOpen) { std::cout << " foes at shadow link=" << parallelLink->getViaLaneOrLane()->getID() << ":\n"; for (std::vector<const SUMOVehicle*>::const_iterator it = blockingFoes.begin(); it != blockingFoes.end(); ++it) { std::cout << " " << (*it)->getID() << "\n"; } } #endif } } for (std::vector<const SUMOVehicle*>::const_iterator it = blockingFoes.begin(); it != blockingFoes.end(); ++it) { gSelected.select(static_cast<const GUIVehicle*>(*it)->getGlID()); } #ifdef DEBUG_FOES gDebugFlag1 = true; #endif const MSLink::LinkLeaders linkLeaders = (dpi.myLink)->getLeaderInfo(this, dist, &blockingPersons); #ifdef DEBUG_FOES gDebugFlag1 = false; #endif for (MSLink::LinkLeaders::const_iterator it = linkLeaders.begin(); it != linkLeaders.end(); ++it) { // the vehicle to enter the junction first has priority const GUIVehicle* leader = dynamic_cast<const GUIVehicle*>(it->vehAndGap.first); if (leader != nullptr) { if (isLeader(dpi.myLink, leader)) { gSelected.select(leader->getGlID()); #ifdef DEBUG_FOES std::cout << " linkLeader=" << leader->getID() << "\n"; #endif } } else { for (std::vector<const MSPerson*>::iterator it_p = blockingPersons.begin(); it_p != blockingPersons.end(); ++it_p) { const GUIPerson* foe = dynamic_cast<const GUIPerson*>(*it_p); if (foe != nullptr) { gSelected.select(foe->getGlID()); //std::cout << SIMTIME << " veh=" << getID() << " is blocked on link " << dpi.myLink->getRespondIndex() << " to " << dpi.myLink->getViaLaneOrLane()->getID() << " by pedestrian. dist=" << it->second << "\n"; } } } } dist += dpi.myLink->getViaLaneOrLane()->getLength(); } }