LCOV - code coverage report
Current view: top level - src/libsumo - LaneArea.cpp (source / functions) Coverage Total Hit
Test: lcov.info Lines: 96.9 % 130 126
Test Date: 2024-12-21 15:45:41 Functions: 87.2 % 39 34

            Line data    Source code
       1              : /****************************************************************************/
       2              : // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
       3              : // Copyright (C) 2012-2024 German Aerospace Center (DLR) and others.
       4              : // This program and the accompanying materials are made available under the
       5              : // terms of the Eclipse Public License 2.0 which is available at
       6              : // https://www.eclipse.org/legal/epl-2.0/
       7              : // This Source Code may also be made available under the following Secondary
       8              : // Licenses when the conditions for such availability set forth in the Eclipse
       9              : // Public License 2.0 are satisfied: GNU General Public License, version 2
      10              : // or later which is available at
      11              : // https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
      12              : // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
      13              : /****************************************************************************/
      14              : /// @file    LaneArea.cpp
      15              : /// @author  Daniel Krajzewicz
      16              : /// @author  Mario Krumnow
      17              : /// @author  Jakob Erdmann
      18              : /// @author  Michael Behrisch
      19              : /// @date    30.05.2012
      20              : ///
      21              : // C++ TraCI client API implementation
      22              : /****************************************************************************/
      23              : #include <config.h>
      24              : 
      25              : #include <microsim/output/MSDetectorControl.h>
      26              : #include <microsim/output/MSE2Collector.h>
      27              : #include <microsim/MSNet.h>
      28              : #include <libsumo/Helper.h>
      29              : #include <libsumo/TraCIConstants.h>
      30              : #include "LaneArea.h"
      31              : 
      32              : 
      33              : namespace libsumo {
      34              : // ===========================================================================
      35              : // static member initializations
      36              : // ===========================================================================
      37              : SubscriptionResults LaneArea::mySubscriptionResults;
      38              : ContextSubscriptionResults LaneArea::myContextSubscriptionResults;
      39              : NamedRTree* LaneArea::myTree(nullptr);
      40              : 
      41              : 
      42              : // ===========================================================================
      43              : // static member definitions
      44              : // ===========================================================================
      45              : std::vector<std::string>
      46          824 : LaneArea::getIDList() {
      47              :     std::vector<std::string> ids;
      48          824 :     MSNet::getInstance()->getDetectorControl().getTypedDetectors(SUMO_TAG_LANE_AREA_DETECTOR).insertIDs(ids);
      49          822 :     return ids;
      50            2 : }
      51              : 
      52              : 
      53              : int
      54           18 : LaneArea::getIDCount() {
      55              :     std::vector<std::string> ids;
      56           36 :     return (int)MSNet::getInstance()->getDetectorControl().getTypedDetectors(SUMO_TAG_LANE_AREA_DETECTOR).size();
      57           18 : }
      58              : 
      59              : 
      60              : int
      61          421 : LaneArea::getJamLengthVehicle(const std::string& detID) {
      62          421 :     return getDetector(detID)->getCurrentJamLengthInVehicles();
      63              : }
      64              : 
      65              : 
      66              : double
      67          420 : LaneArea::getJamLengthMeters(const std::string& detID) {
      68          420 :     return getDetector(detID)->getCurrentJamLengthInMeters();
      69              : }
      70              : 
      71              : 
      72              : double
      73          420 : LaneArea::getLastStepMeanSpeed(const std::string& detID) {
      74          420 :     return getDetector(detID)->getCurrentMeanSpeed();
      75              : }
      76              : 
      77              : 
      78              : std::vector<std::string>
      79          620 : LaneArea::getLastStepVehicleIDs(const std::string& detID) {
      80          620 :     return getDetector(detID)->getCurrentVehicleIDs();
      81              : }
      82              : 
      83              : 
      84              : double
      85          420 : LaneArea::getLastStepOccupancy(const std::string& detID) {
      86          420 :     return getDetector(detID)->getCurrentOccupancy();
      87              : }
      88              : 
      89              : 
      90              : double
      91          421 : LaneArea::getPosition(const std::string& detID) {
      92          421 :     return getDetector(detID)->getStartPos();
      93              : }
      94              : 
      95              : 
      96              : std::string
      97          421 : LaneArea::getLaneID(const std::string& detID) {
      98          421 :     return getDetector(detID)->getLane()->getID();
      99              : }
     100              : 
     101              : 
     102              : double
     103          421 : LaneArea::getLength(const std::string& detID) {
     104          421 :     const MSE2Collector* const e2 = getDetector(detID);
     105          421 :     return e2->getLength();
     106              : }
     107              : 
     108              : 
     109              : int
     110         1080 : LaneArea::getLastStepVehicleNumber(const std::string& detID) {
     111         1080 :     return getDetector(detID)->getCurrentVehicleNumber();
     112              : }
     113              : 
     114              : 
     115              : int
     116          420 : LaneArea::getLastStepHaltingNumber(const std::string& detID) {
     117          420 :     return getDetector(detID)->getCurrentHaltingNumber();
     118              : }
     119              : 
     120              : 
     121              : double
     122          600 : LaneArea::getIntervalOccupancy(const std::string& detID) {
     123          600 :     return getDetector(detID)->getIntervalOccupancy();
     124              : }
     125              : 
     126              : double
     127          600 : LaneArea::getIntervalMeanSpeed(const std::string& detID) {
     128          600 :     return getDetector(detID)->getIntervalMeanSpeed();
     129              : }
     130              : 
     131              : double
     132          600 : LaneArea::getIntervalMaxJamLengthInMeters(const std::string& detID) {
     133          600 :     return getDetector(detID)->getIntervalMaxJamLengthInMeters();
     134              : }
     135              : 
     136              : int
     137          600 : LaneArea::getIntervalVehicleNumber(const std::string& detID) {
     138          600 :     return getDetector(detID)->getIntervalVehicleNumber();
     139              : }
     140              : 
     141              : double
     142          600 : LaneArea::getLastIntervalOccupancy(const std::string& detID) {
     143          600 :     return getDetector(detID)->getLastIntervalOccupancy();
     144              : }
     145              : 
     146              : double
     147          600 : LaneArea::getLastIntervalMeanSpeed(const std::string& detID) {
     148          600 :     return getDetector(detID)->getLastIntervalMeanSpeed();
     149              : }
     150              : 
     151              : double
     152          600 : LaneArea::getLastIntervalMaxJamLengthInMeters(const std::string& detID) {
     153          600 :     return getDetector(detID)->getLastIntervalMaxJamLengthInMeters();
     154              : }
     155              : 
     156              : int
     157          600 : LaneArea::getLastIntervalVehicleNumber(const std::string& detID) {
     158          600 :     return getDetector(detID)->getLastIntervalVehicleNumber();
     159              : }
     160              : 
     161              : 
     162              : std::string
     163           30 : LaneArea::getParameter(const std::string& detID, const std::string& param) {
     164           60 :     return getDetector(detID)->getParameter(param, "");
     165              : }
     166              : 
     167              : 
     168            0 : LIBSUMO_GET_PARAMETER_WITH_KEY_IMPLEMENTATION(LaneArea)
     169              : 
     170              : 
     171              : void
     172           15 : LaneArea::setParameter(const std::string& detID, const std::string& name, const std::string& value) {
     173           15 :     getDetector(detID)->setParameter(name, value);
     174           15 : }
     175              : 
     176              : 
     177          372 : LIBSUMO_SUBSCRIPTION_IMPLEMENTATION(LaneArea, LANEAREA)
     178              : 
     179              : 
     180              : MSE2Collector*
     181        10302 : LaneArea::getDetector(const std::string& id) {
     182        20603 :     MSE2Collector* e2 = dynamic_cast<MSE2Collector*>(MSNet::getInstance()->getDetectorControl().getTypedDetectors(SUMO_TAG_LANE_AREA_DETECTOR).get(id));
     183        10302 :     if (e2 == nullptr) {
     184            2 :         throw TraCIException("Lane area detector '" + id + "' is not known");
     185              :     }
     186        10301 :     return e2;
     187              : }
     188              : 
     189              : 
     190              : NamedRTree*
     191          332 : LaneArea::getTree() {
     192          332 :     if (myTree == nullptr) {
     193           12 :         myTree = new NamedRTree();
     194           48 :         for (const std::string& id : getIDList()) {
     195           36 :             PositionVector shape;
     196           36 :             storeShape(id, shape);
     197           36 :             Boundary b = shape.getBoxBoundary();
     198           36 :             const float cmin[2] = {(float) b.xmin(), (float) b.ymin()};
     199           36 :             const float cmax[2] = {(float) b.xmax(), (float) b.ymax()};
     200           36 :             myTree->Insert(cmin, cmax, getDetector(id));
     201           48 :         }
     202              :     }
     203          332 :     return myTree;
     204              : }
     205              : 
     206              : 
     207              : void
     208        40516 : LaneArea::cleanup() {
     209        40516 :     delete myTree;
     210        40516 :     myTree = nullptr;
     211        40516 : }
     212              : 
     213              : 
     214              : void
     215          332 : LaneArea::storeShape(const std::string& id, PositionVector& shape) {
     216          332 :     MSE2Collector* const det = getDetector(id);
     217          664 :     shape.push_back(det->getLanes().front()->getShape().positionAtOffset(det->getStartPos()));
     218          664 :     shape.push_back(det->getLanes().back()->getShape().positionAtOffset(det->getEndPos()));
     219          332 : }
     220              : 
     221              : 
     222              : std::shared_ptr<VariableWrapper>
     223          264 : LaneArea::makeWrapper() {
     224          264 :     return std::make_shared<Helper::SubscriptionWrapper>(handleVariable, mySubscriptionResults, myContextSubscriptionResults);
     225              : }
     226              : 
     227              : 
     228              : void
     229           25 : LaneArea::overrideVehicleNumber(const std::string& detID, int vehNum) {
     230           25 :     getDetector(detID)->overrideVehicleNumber(vehNum);
     231           25 : }
     232              : 
     233              : 
     234              : bool
     235         6603 : LaneArea::handleVariable(const std::string& objID, const int variable, VariableWrapper* wrapper, tcpip::Storage* paramData) {
     236         6603 :     switch (variable) {
     237          468 :         case TRACI_ID_LIST:
     238          468 :             return wrapper->wrapStringList(objID, variable, getIDList());
     239           12 :         case ID_COUNT:
     240           12 :             return wrapper->wrapInt(objID, variable, getIDCount());
     241          832 :         case LAST_STEP_VEHICLE_NUMBER:
     242          832 :             return wrapper->wrapInt(objID, variable, getLastStepVehicleNumber(objID));
     243          252 :         case LAST_STEP_MEAN_SPEED:
     244          252 :             return wrapper->wrapDouble(objID, variable, getLastStepMeanSpeed(objID));
     245          372 :         case LAST_STEP_VEHICLE_ID_LIST:
     246          372 :             return wrapper->wrapStringList(objID, variable, getLastStepVehicleIDs(objID));
     247          252 :         case LAST_STEP_VEHICLE_HALTING_NUMBER:
     248          252 :             return wrapper->wrapInt(objID, variable, getLastStepHaltingNumber(objID));
     249          253 :         case JAM_LENGTH_VEHICLE:
     250          253 :             return wrapper->wrapInt(objID, variable, getJamLengthVehicle(objID));
     251          252 :         case JAM_LENGTH_METERS:
     252          252 :             return wrapper->wrapDouble(objID, variable, getJamLengthMeters(objID));
     253          252 :         case LAST_STEP_OCCUPANCY:
     254          252 :             return wrapper->wrapDouble(objID, variable, getLastStepOccupancy(objID));
     255          253 :         case VAR_POSITION:
     256          253 :             return wrapper->wrapDouble(objID, variable, getPosition(objID));
     257          253 :         case VAR_LANE_ID:
     258          506 :             return wrapper->wrapString(objID, variable, getLaneID(objID));
     259          253 :         case VAR_LENGTH:
     260          253 :             return wrapper->wrapDouble(objID, variable, getLength(objID));
     261          360 :         case VAR_INTERVAL_OCCUPANCY:
     262          360 :             return wrapper->wrapDouble(objID, variable, getIntervalOccupancy(objID));
     263          360 :         case VAR_INTERVAL_SPEED:
     264          360 :             return wrapper->wrapDouble(objID, variable, getIntervalMeanSpeed(objID));
     265          360 :         case VAR_INTERVAL_MAX_JAM_LENGTH_METERS:
     266          360 :             return wrapper->wrapDouble(objID, variable, getIntervalMaxJamLengthInMeters(objID));
     267          360 :         case VAR_INTERVAL_NUMBER:
     268          360 :             return wrapper->wrapInt(objID, variable, getIntervalVehicleNumber(objID));
     269          360 :         case VAR_LAST_INTERVAL_OCCUPANCY:
     270          360 :             return wrapper->wrapDouble(objID, variable, getLastIntervalOccupancy(objID));
     271          360 :         case VAR_LAST_INTERVAL_SPEED:
     272          360 :             return wrapper->wrapDouble(objID, variable, getLastIntervalMeanSpeed(objID));
     273          360 :         case VAR_LAST_INTERVAL_MAX_JAM_LENGTH_METERS:
     274          360 :             return wrapper->wrapDouble(objID, variable, getLastIntervalMaxJamLengthInMeters(objID));
     275          360 :         case VAR_LAST_INTERVAL_NUMBER:
     276          360 :             return wrapper->wrapInt(objID, variable, getLastIntervalVehicleNumber(objID));
     277           18 :         case libsumo::VAR_PARAMETER:
     278           18 :             paramData->readUnsignedByte();
     279           36 :             return wrapper->wrapString(objID, variable, getParameter(objID, paramData->readString()));
     280            0 :         case libsumo::VAR_PARAMETER_WITH_KEY:
     281            0 :             paramData->readUnsignedByte();
     282            0 :             return wrapper->wrapStringPair(objID, variable, getParameterWithKey(objID, paramData->readString()));
     283              :         default:
     284              :             return false;
     285              :     }
     286              : }
     287              : 
     288              : 
     289              : }
     290              : 
     291              : 
     292              : /****************************************************************************/
        

Generated by: LCOV version 2.0-1