bool MSMsgInductLoop::isStillActive(SUMOVehicle& veh, SUMOReal oldPos, SUMOReal newPos, SUMOReal newSpeed) throw() { if (newPos < myPosition) { // detector not reached yet return true; } if (myVehiclesOnDet.find(&veh) == myVehiclesOnDet.end()) { // entered the detector by move SUMOReal entryTimestep = (SUMOReal) ((SUMOReal) MSNet::getInstance()->getCurrentTimeStep() + ((myPosition - oldPos) / newSpeed)); if (newPos - veh.getVehicleType().getLength() > myPosition) { // entered and passed detector in a single timestep SUMOReal leaveTimestep = (SUMOReal) ((SUMOReal) MSNet::getInstance()->getCurrentTimeStep() + ((myPosition - oldPos + veh.getVehicleType().getLength()) / newSpeed)); enterDetectorByMove(veh, entryTimestep); leaveDetectorByMove(veh, leaveTimestep); return false; } // entered detector, but not passed enterDetectorByMove(veh, entryTimestep); return true; } else { // vehicle has been on the detector the previous timestep if (newPos - veh.getVehicleType().getLength() >= myPosition) { // vehicle passed the detector SUMOReal leaveTimestep = (SUMOReal) ((SUMOReal) MSNet::getInstance()->getCurrentTimeStep() + ((myPosition - oldPos + veh.getVehicleType().getLength()) / newSpeed)); leaveDetectorByMove(veh, leaveTimestep); return false; } // vehicle stays on the detector return true; } }
bool MSInductLoop::isStillActive(MSVehicle& veh, SUMOReal oldPos, SUMOReal newPos, SUMOReal newSpeed) throw() { if (newPos < myPosition) { // detector not reached yet return true; } int mainStripNum = 0;int flag =0; for( MSLane::StripContIter it = myLane->myStrips.begin(); it!=myLane->myStrips.end(); it ++){ if(veh.isMainStrip(**it)){ flag=1; break; } mainStripNum++; } if (flag == 1 && myVehiclesOnDet[mainStripNum].find(&veh) == myVehiclesOnDet[mainStripNum].end()) { // entered the detector by move SUMOReal entryTime = STEPS2TIME(MSNet::getInstance()->getCurrentTimeStep()); if (newSpeed!=0) { entryTime += (myPosition - oldPos) / newSpeed; } if (newPos - veh.getVehicleType().getLength() > myPosition) { // entered and passed detector in a single timestep SUMOReal leaveTime = STEPS2TIME(MSNet::getInstance()->getCurrentTimeStep()); leaveTime += (myPosition - oldPos + veh.getVehicleType().getLength()) / newSpeed; enterDetectorByMove(veh, entryTime); leaveDetectorByMove(veh, leaveTime); return false; } // entered detector, but not passed enterDetectorByMove(veh, entryTime); return true; } else if(flag==1){ // vehicle has been on the detector the previous timestep if (newPos - veh.getVehicleType().getLength() >= myPosition) { // vehicle passed the detector SUMOReal leaveTime = STEPS2TIME(MSNet::getInstance()->getCurrentTimeStep()); leaveTime += (myPosition - oldPos + veh.getVehicleType().getLength()) / newSpeed; leaveDetectorByMove(veh, leaveTime); return false; } // vehicle stays on the detector return true; } else {std::cerr<<"Main strip not found\n";} }
bool MSInductLoop::notifyMove(SUMOVehicle& veh, SUMOReal oldPos, SUMOReal newPos, SUMOReal newSpeed) { if (newPos < myPosition) { // detector not reached yet return true; } if (newPos >= myPosition && oldPos < myPosition) { // entered the detector by move SUMOReal entryTime = STEPS2TIME(MSNet::getInstance()->getCurrentTimeStep()); if (newSpeed != 0) { if (myPosition > oldPos) { entryTime += (myPosition - oldPos) / newSpeed; } } enterDetectorByMove(veh, entryTime); } if (newPos - veh.getVehicleType().getLength() > myPosition) { // vehicle passed the detector SUMOReal leaveTime = STEPS2TIME(MSNet::getInstance()->getCurrentTimeStep()); leaveTime += (myPosition - oldPos + veh.getVehicleType().getLength()) / newSpeed; leaveDetectorByMove(veh, leaveTime); return false; } // vehicle stays on the detector return true; }