void MSVehicleTransfer::loadState(const SUMOSAXAttributes& attrs, const SUMOTime offset, MSVehicleControl& vc) { MSVehicle* veh = dynamic_cast<MSVehicle*>(vc.getVehicle(attrs.getString(SUMO_ATTR_ID))); assert(veh != 0); SUMOTime proceedTime = (SUMOTime)attrs.getLong(SUMO_ATTR_DEPART); MSLane* parkingLane = attrs.hasAttribute(SUMO_ATTR_PARKING) ? MSLane::dictionary(attrs.getString(SUMO_ATTR_PARKING)): 0; myVehicles.push_back(VehicleInformation(veh, proceedTime + offset, parkingLane != 0)); if (parkingLane != 0) { myParkingVehicles[parkingLane].insert(veh); veh->setTentativeLaneAndPosition(parkingLane, veh->getPositionOnLane()); veh->processNextStop(veh->getSpeed()); } MSNet::getInstance()->getInsertionControl().alreadyDeparted(veh); }
// =========================================================================== // member method definitions // =========================================================================== void MSVehicleTransfer::add(const SUMOTime t, MSVehicle* veh) { veh->getLaneChangeModel().endLaneChangeManeuver(); if (veh->isParking()) { MSNet::getInstance()->informVehicleStateListener(veh, MSNet::VEHICLE_STATE_STARTING_PARKING); myParkingVehicles[veh->getLane()].insert(veh); // initialized to empty set on first use veh->onRemovalFromNet(MSMoveReminder::NOTIFICATION_PARKING); } else { MSNet::getInstance()->informVehicleStateListener(veh, MSNet::VEHICLE_STATE_STARTING_TELEPORT); if (veh->succEdge(1) == 0) { WRITE_WARNING("Vehicle '" + veh->getID() + "' teleports beyond end of route ('" + veh->getEdge()->getID() + "'), time " + time2string(t) + "."); veh->onRemovalFromNet(MSMoveReminder::NOTIFICATION_TELEPORT_ARRIVED); MSNet::getInstance()->getVehicleControl().scheduleVehicleRemoval(veh); return; } veh->onRemovalFromNet(MSMoveReminder::NOTIFICATION_TELEPORT); veh->enterLaneAtMove(veh->succEdge(1)->getLanes()[0], true); } myVehicles.push_back(VehicleInformation(veh, t + TIME2STEPS(veh->getEdge()->getCurrentTravelTime(TeleportMinSpeed)), veh->isParking())); }