bool MSCalibrator::childCheckEmit(MSCalibratorChild *child) { if (myToEmit.find(child)==myToEmit.end()) { // should not happen - a child is calling and should have a vehicle added throw 1; } if (child!=myActiveChild||myDestLane->getEdge().isVaporizing()) { // check whether this is due to vaporization if (myDestLane->getEdge().isVaporizing()) { myToEmit[child].first->setWasVaporized(true); } // remove the vehicle previously inserted by the child delete myToEmit[child].first; // erase the child information myToEmit.erase(myToEmit.find(child)); // inform child to process the next one (the current was not used) return true; } // get the vehicle and the speed the child has read/generated MSVehicle *veh = myToEmit[child].first; SUMOReal speed = myToEmit[child].second; // check whether the speed shall be patched //TM SUMOReal pos = myPos+1; if (speed<0) { speed = MIN2(myDestLane->getMaxSpeed(), veh->getMaxSpeed()); } // try to emit #ifdef HAVE_MESOSIM if (MSGlobals::gUseMesoSim) { if (myDestLane->getEdge().emit(*veh, myNet.getCurrentTimeStep())) { veh->onDepart(); // insert vehicle into the dictionary if (!myNet.getVehicleControl().addVehicle(veh->getID(), veh)) { // !!! throw 1; } // erase the child information myToEmit.erase(myToEmit.find(child)); return true; } } else { #endif if (myDestLane->isEmissionSuccess(veh, speed, pos, false)) { veh->onDepart(); // insert vehicle into the dictionary if (!myNet.getVehicleControl().addVehicle(veh->getID(), veh)) { // !!! throw 1; } // erase the child information myToEmit.erase(myToEmit.find(child)); return true; } #ifdef HAVE_MESOSIM } #endif return false; }
bool MSLane::emit(MSVehicle& veh) throw(ProcessError) { SUMOReal pos = 0; SUMOReal speed = 0; bool patchSpeed = true; // whether the speed shall be adapted to infrastructure/traffic in front // determine the speed const SUMOVehicleParameter &pars = veh.getParameter(); size_t stripId = getEmptyStartStripID(veh.getWidth()); switch (pars.departSpeedProcedure) { case DEPART_SPEED_GIVEN: speed = pars.departSpeed; patchSpeed = false; break; case DEPART_SPEED_RANDOM: speed = RandHelper::rand(MIN2(veh.getMaxSpeed(), getMaxSpeed())); patchSpeed = true; // !!!(?) break; case DEPART_SPEED_MAX: speed = MIN2(veh.getMaxSpeed(), getMaxSpeed()); patchSpeed = true; // !!!(?) break; case DEPART_SPEED_DEFAULT: default: // speed = 0 was set before patchSpeed = false; // !!!(?) break; } // determine the position switch (pars.departPosProcedure) { case DEPART_POS_GIVEN: if (pars.departPos >= 0.) { pos = pars.departPos; } else { pos = pars.departPos + getLength(); } break; case DEPART_POS_RANDOM: pos = RandHelper::rand(getLength()); break; case DEPART_POS_RANDOM_FREE: { for (unsigned int i=0; i < 10; i++) { // we will try some random positions ... pos = RandHelper::rand(getLength()); if (isEmissionSuccess(&veh, speed, pos, patchSpeed, stripId)) { return true; } } // ... and if that doesn't work, we put the vehicle to the free position return freeEmit(veh, speed); } break; case DEPART_POS_FREE: return freeEmit(veh, speed); case DEPART_POS_DEFAULT: default: // pos = 0 was set before break; } // try to emit return isEmissionSuccess(&veh, speed, pos, patchSpeed, stripId); }