SUMOVehicle* GUIMEVehicleControl::buildVehicle(SUMOVehicleParameter* defs, const MSRoute* route, const MSVehicleType* type, const bool ignoreStopErrors, const bool fromRouteFile) { myLoadedVehNo++; if (fromRouteFile) { defs->depart += computeRandomDepartOffset(); } MSBaseVehicle* built = new GUIMEVehicle(defs, route, type, type->computeChosenSpeedDeviation(fromRouteFile ? MSRouteHandler::getParsingRNG() : 0)); built->addStops(ignoreStopErrors); MSNet::getInstance()->informVehicleStateListener(built, MSNet::VEHICLE_STATE_BUILT); return built; }
void MSInsertionControl::determineCandidates(SUMOTime time) { MSVehicleControl& vehControl = MSNet::getInstance()->getVehicleControl(); for (std::vector<Flow>::iterator i = myFlows.begin(); i != myFlows.end();) { SUMOVehicleParameter* pars = i->pars; bool tryEmitByProb = pars->repetitionProbability > 0; while ((pars->repetitionProbability < 0 && pars->repetitionsDone < pars->repetitionNumber && pars->depart + pars->repetitionsDone * pars->repetitionOffset < time + DELTA_T) || (tryEmitByProb && pars->depart < time + DELTA_T && pars->repetitionEnd > time // only call rand if all other conditions are met && RandHelper::rand(&myFlowRNG) < (pars->repetitionProbability * TS)) ) { tryEmitByProb = false; // only emit one per step SUMOVehicleParameter* newPars = new SUMOVehicleParameter(*pars); newPars->id = pars->id + "." + toString(i->index); newPars->depart = pars->repetitionProbability > 0 ? time : (SUMOTime)(pars->depart + pars->repetitionsDone * pars->repetitionOffset) + computeRandomDepartOffset(); pars->repetitionsDone++; // try to build the vehicle if (vehControl.getVehicle(newPars->id) == 0) { const MSRoute* route = MSRoute::dictionary(pars->routeid); MSVehicleType* vtype = vehControl.getVType(pars->vtypeid, MSRouteHandler::getParsingRNG()); SUMOVehicle* vehicle = vehControl.buildVehicle(newPars, route, vtype, !MSGlobals::gCheckRoutes); int quota = vehControl.getQuota(); if (quota > 0) { vehControl.addVehicle(newPars->id, vehicle); add(vehicle); i->index++; while (--quota > 0) { SUMOVehicleParameter* quotaPars = new SUMOVehicleParameter(*pars); quotaPars->id = pars->id + "." + toString(i->index); quotaPars->depart = pars->repetitionProbability > 0 ? time : (SUMOTime)(pars->depart + pars->repetitionsDone * pars->repetitionOffset) + computeRandomDepartOffset(); SUMOVehicle* vehicle = vehControl.buildVehicle(quotaPars, route, vtype, !MSGlobals::gCheckRoutes); vehControl.addVehicle(quotaPars->id, vehicle); add(vehicle); i->index++; } } else { vehControl.deleteVehicle(vehicle, true); } } else { // strange: another vehicle with the same id already exists if (MSGlobals::gStateLoaded) { vehControl.discountStateLoaded(); break; } throw ProcessError("Another vehicle with the id '" + newPars->id + "' exists."); } } if (pars->repetitionsDone == pars->repetitionNumber || (pars->repetitionProbability > 0 && pars->repetitionEnd <= time)) { i = myFlows.erase(i); MSRoute::checkDist(pars->routeid); delete pars; } else { ++i; } } checkCandidates(time, MSDevice_Routing::isEnabled()); }