void NLDetectorBuilder::buildVTypeProbe(const std::string& id, const std::string& vtype, SUMOTime frequency, const std::string& device) { checkSampleInterval(frequency, SUMO_TAG_VTYPEPROBE, id); new MSVTypeProbe(id, vtype, OutputDevice::getDevice(device), frequency); }
void NLDetectorBuilder::beginE3Detector(const std::string& id, const std::string& device, int splInterval, SUMOReal haltingSpeedThreshold, SUMOTime haltingTimeThreshold) { checkSampleInterval(splInterval, SUMO_TAG_E3DETECTOR, id); myE3Definition = new E3DetectorDefinition(id, device, haltingSpeedThreshold, haltingTimeThreshold, splInterval); }
void NLDetectorBuilder::beginE3Detector(const std::string& id, const std::string& device, SUMOTime splInterval, double haltingSpeedThreshold, SUMOTime haltingTimeThreshold, const std::string& vTypes, bool openEntry) { checkSampleInterval(splInterval, SUMO_TAG_E3DETECTOR, id); myE3Definition = new E3DetectorDefinition(id, device, haltingSpeedThreshold, haltingTimeThreshold, splInterval, vTypes, openEntry); }
void NLDetectorBuilder::buildRouteProbe(const std::string& id, const std::string& edge, SUMOTime frequency, SUMOTime begin, const std::string& device) { checkSampleInterval(frequency, SUMO_TAG_ROUTEPROBE, id); MSEdge* e = getEdgeChecking(edge, SUMO_TAG_ROUTEPROBE, id); MSRouteProbe* probe = new MSRouteProbe(id, e, begin); // add the file output myNet.getDetectorControl().add(SUMO_TAG_ROUTEPROBE, probe, device, frequency, begin); }
void NLDetectorBuilder::buildInductLoop(const std::string& id, const std::string& lane, double pos, SUMOTime splInterval, const std::string& device, bool friendlyPos, const std::string& vTypes) { checkSampleInterval(splInterval, SUMO_TAG_E1DETECTOR, id); // get and check the lane MSLane* clane = getLaneChecking(lane, SUMO_TAG_E1DETECTOR, id); // get and check the position pos = getPositionChecking(pos, clane, friendlyPos, id); // build the loop MSDetectorFileOutput* loop = createInductLoop(id, clane, pos, vTypes); // add the file output myNet.getDetectorControl().add(SUMO_TAG_INDUCTION_LOOP, loop, device, splInterval); }
void NLDetectorBuilder::buildInductLoop(const std::string& id, const std::string& lane, SUMOReal pos, int splInterval, const std::string& device, bool friendlyPos, bool splitByType) { checkSampleInterval(splInterval, SUMO_TAG_E1DETECTOR, id); // get and check the lane MSLane* clane = getLaneChecking(lane, SUMO_TAG_E1DETECTOR, id); if (!MSGlobals::gUseMesoSim) { // get and check the position pos = getPositionChecking(pos, clane, friendlyPos, id); // build the loop MSDetectorFileOutput* loop = createInductLoop(id, clane, pos, splitByType); // add the file output myNet.getDetectorControl().add(SUMO_TAG_INDUCTION_LOOP, loop, device, splInterval); } else { #ifdef HAVE_INTERNAL if (pos < 0) { pos = clane->getLength() + pos; } MESegment* s = MSGlobals::gMesoNet->getSegmentForEdge(clane->getEdge()); MESegment* prev = s; SUMOReal cpos = 0; while (cpos + prev->getLength() < pos && s != 0) { prev = s; cpos += s->getLength(); s = s->getNextSegment(); } SUMOReal rpos = pos - cpos; //-prev->getLength(); if (rpos > prev->getLength() || rpos < 0) { if (friendlyPos) { rpos = prev->getLength() - (SUMOReal) 0.1; } else { throw InvalidArgument("The position of detector '" + id + "' lies beyond the lane's '" + lane + "' length."); } } MEInductLoop* loop = createMEInductLoop(id, prev, rpos); myNet.getDetectorControl().add(SUMO_TAG_INDUCTION_LOOP, loop, device, splInterval); #endif } }
void NLDetectorBuilder::buildE2Detector(const std::string& id, const std::string& lane, SUMOReal pos, SUMOReal length, bool cont, int splInterval, const std::string& device, SUMOTime haltingTimeThreshold, SUMOReal haltingSpeedThreshold, SUMOReal jamDistThreshold, bool friendlyPos) { checkSampleInterval(splInterval, SUMO_TAG_E2DETECTOR, id); MSLane* clane = getLaneChecking(lane, SUMO_TAG_E2DETECTOR, id); // check whether the detector may lie over more than one lane MSDetectorFileOutput* det = 0; if (!cont) { convUncontE2PosLength(id, clane, pos, length, friendlyPos); det = buildSingleLaneE2Det(id, DU_USER_DEFINED, clane, pos, length, haltingTimeThreshold, haltingSpeedThreshold, jamDistThreshold); myNet.getDetectorControl().add(SUMO_TAG_LANE_AREA_DETECTOR, det, device, splInterval); } else { convContE2PosLength(id, clane, pos, length, friendlyPos); det = buildMultiLaneE2Det(id, DU_USER_DEFINED, clane, pos, length, haltingTimeThreshold, haltingSpeedThreshold, jamDistThreshold); myNet.getDetectorControl().add(SUMO_TAG_LANE_AREA_DETECTOR, det, device, splInterval); } }
void NLDetectorBuilder::buildE2Detector(const std::string& id, std::vector<MSLane*> lanes, double pos, double endPos, const std::string& device, SUMOTime frequency, SUMOTime haltingTimeThreshold, double haltingSpeedThreshold, double jamDistThreshold, const std::string& vTypes, bool friendlyPos, bool showDetector, MSTLLogicControl::TLSLogicVariants* tlls, MSLane* toLane) { bool tlsGiven = tlls != 0; bool toLaneGiven = toLane != 0; assert(pos != std::numeric_limits<double>::max()); assert(endPos != std::numeric_limits<double>::max()); assert(lanes.size() != 0); MSLane* firstLane = lanes[0]; MSLane* lastLane = lanes[lanes.size() - 1]; // Check positioning if (pos >= firstLane->getLength() || (pos < 0 && -pos > firstLane->getLength())) { std::stringstream ss; ss << "The given position (=" << pos << ") for detector '" << id << "' does not lie on the given lane '" << firstLane->getID() << "' with length " << firstLane->getLength(); if (friendlyPos) { double newPos = pos > 0 ? firstLane->getLength() - POSITION_EPS : 0.; ss << " (adjusting to new position " << newPos; WRITE_WARNING(ss.str()); pos = newPos; } else { ss << " (0 <= pos < lane->getLength() is required)"; throw InvalidArgument(ss.str()); } } if (endPos > lastLane->getLength() || (endPos <= 0 && -endPos >= lastLane->getLength())) { std::stringstream ss; ss << "The given end position (=" << endPos << ") for detector '" << id << "' does not lie on the given lane '" << lastLane->getID() << "' with length " << lastLane->getLength(); if (friendlyPos) { double newEndPos = endPos > 0 ? lastLane->getLength() : POSITION_EPS; ss << " (adjusting to new position " << newEndPos; WRITE_WARNING(ss.str()); pos = newEndPos; } else { ss << " (0 <= pos < lane->getLength() is required)"; throw InvalidArgument(ss.str()); } } MSE2Collector* det = 0; if (tlsGiven) { // Detector connected to TLS det = createE2Detector(id, DU_USER_DEFINED, lanes, pos, endPos, haltingTimeThreshold, haltingSpeedThreshold, jamDistThreshold, vTypes, showDetector); myNet.getDetectorControl().add(SUMO_TAG_LANE_AREA_DETECTOR, det); // add the file output (XXX: Where's the corresponding delete?) if (toLaneGiven) { // Detector also associated to specific link MSLane* lastLane = det->getLastLane(); MSLink* link = MSLinkContHelper::getConnectingLink(*lastLane, *toLane); if (link == 0) { throw InvalidArgument( "The detector '" + id + "' cannot be build as no connection between lanes '" + lastLane->getID() + "' and '" + toLane->getID() + "' exists."); } new Command_SaveTLCoupledLaneDet(*tlls, det, myNet.getCurrentTimeStep(), OutputDevice::getDevice(device), link); } else { // detector for tls but without specific link new Command_SaveTLCoupledDet(*tlls, det, myNet.getCurrentTimeStep(), OutputDevice::getDevice(device)); } } else { // User specified detector for xml-output checkSampleInterval(frequency, SUMO_TAG_E2DETECTOR, id); det = createE2Detector(id, DU_USER_DEFINED, lanes, pos, endPos, haltingTimeThreshold, haltingSpeedThreshold, jamDistThreshold, vTypes, showDetector); myNet.getDetectorControl().add(SUMO_TAG_LANE_AREA_DETECTOR, det, device, frequency); } }