diff --git a/data/xsd/additional_file.xsd b/data/xsd/additional_file.xsd index c2f4b331d4ca..6f6049ff2e75 100644 --- a/data/xsd/additional_file.xsd +++ b/data/xsd/additional_file.xsd @@ -455,6 +455,7 @@ + diff --git a/src/microsim/devices/MSDevice_Battery.cpp b/src/microsim/devices/MSDevice_Battery.cpp index 9e5b5bb50c6f..867ce0ef3de6 100644 --- a/src/microsim/devices/MSDevice_Battery.cpp +++ b/src/microsim/devices/MSDevice_Battery.cpp @@ -212,7 +212,8 @@ bool MSDevice_Battery::notifyMove(SUMOTrafficObject& tObject, double /* oldPos * if (chargingStationID != "") { // if the vehicle is almost stopped, or charge in transit is enabled, then charge vehicle MSChargingStation* const cs = static_cast(MSNet::getInstance()->getStoppingPlace(chargingStationID, SUMO_TAG_CHARGING_STATION)); - if ((veh.getSpeed() < myStoppingThreshold) || cs->getChargeInTransit()) { + const MSParkingArea* pa = cs->getParkingArea(); + if (((veh.getSpeed() < myStoppingThreshold) || cs->getChargeInTransit()) && (pa == nullptr || veh.isParking())) { // Set Flags Stopped/intransit to if (veh.getSpeed() < myStoppingThreshold) { // vehicle ist almost stopped, then is charging stopped diff --git a/src/microsim/trigger/MSChargingStation.cpp b/src/microsim/trigger/MSChargingStation.cpp index 0a9ef861be9b..e45324e866b5 100644 --- a/src/microsim/trigger/MSChargingStation.cpp +++ b/src/microsim/trigger/MSChargingStation.cpp @@ -24,6 +24,7 @@ #include #include #include +#include #include #include #include @@ -72,6 +73,14 @@ MSChargingStation::MSChargingStation(const std::string& chargingStationID, MSLan } +MSChargingStation::MSChargingStation(const std::string& chargingStationID, const MSParkingArea* parkingArea, const std::string& name, double chargingPower, + double efficency, bool chargeInTransit, SUMOTime chargeDelay, const std::string& chargeType, SUMOTime waitingTime) : + MSChargingStation(chargingStationID, const_cast(parkingArea->getLane()), parkingArea->getBeginLanePosition(), parkingArea->getEndLanePosition(), + name, chargingPower, efficency, chargeInTransit, chargeDelay, chargeType, waitingTime) { + myParkingArea = parkingArea; +} + + MSChargingStation::~MSChargingStation() { } @@ -117,6 +126,11 @@ MSChargingStation::getWaitingTime() const { } +const MSParkingArea* MSChargingStation::getParkingArea() const { + return myParkingArea; +} + + void MSChargingStation::setChargingVehicle(bool value) { myChargingVehicle = value; diff --git a/src/microsim/trigger/MSChargingStation.h b/src/microsim/trigger/MSChargingStation.h index f74928b66efd..6fb8fc5032b0 100644 --- a/src/microsim/trigger/MSChargingStation.h +++ b/src/microsim/trigger/MSChargingStation.h @@ -54,6 +54,10 @@ class MSChargingStation : public MSStoppingPlace { const std::string& name, double chargingPower, double efficency, bool chargeInTransit, SUMOTime chargeDelay, const std::string& chargeType, SUMOTime waitingTime); + MSChargingStation(const std::string& chargingStationID, const MSParkingArea* parkingArea, const std::string& name, double chargingPower, + double efficency, bool chargeInTransit, SUMOTime chargeDelay, const std::string& chargeType, + SUMOTime waitingTime); + /// @brief destructor ~MSChargingStation(); @@ -75,6 +79,11 @@ class MSChargingStation : public MSStoppingPlace { /// @brief Get waiting time SUMOTime getWaitingTime() const; + /** @brief Get the parking area the charging station is placed on + * @return pointer to the parking area or nullptr + */ + const MSParkingArea* getParkingArea() const; + /// @brief enable or disable charging vehicle void setChargingVehicle(bool value); @@ -164,6 +173,9 @@ class MSChargingStation : public MSStoppingPlace { /// @brief total energy charged by this charging station double myTotalCharge = 0; + /// @brief parkingArea the charging station is placed on + const MSParkingArea* myParkingArea; + /// @brief map with the charges of this charging station (key = vehicleID) std::map > myChargeValues; /// @brief order vehicles by time of first charge diff --git a/src/netedit/elements/GNEAttributeCarrier.cpp b/src/netedit/elements/GNEAttributeCarrier.cpp index 888ad2288689..2c55b1e02837 100644 --- a/src/netedit/elements/GNEAttributeCarrier.cpp +++ b/src/netedit/elements/GNEAttributeCarrier.cpp @@ -1874,6 +1874,11 @@ GNEAttributeCarrier::fillAdditionalElements() { TL("Waiting time before start charging"), "900.00"); myTagProperties[currentTag].addAttribute(attrProperty); + + attrProperty = GNEAttributeProperties(SUMO_ATTR_PARKINGAREA, + GNEAttributeProperties::STRING | GNEAttributeProperties::UPDATEGEOMETRY, + TL("Parking area the charging station is located")); + myTagProperties[currentTag].addAttribute(attrProperty); } currentTag = SUMO_TAG_PARKING_AREA; { diff --git a/src/utils/handlers/AdditionalHandler.cpp b/src/utils/handlers/AdditionalHandler.cpp index 7bb457c7697a..256717823402 100644 --- a/src/utils/handlers/AdditionalHandler.cpp +++ b/src/utils/handlers/AdditionalHandler.cpp @@ -311,6 +311,7 @@ AdditionalHandler::parseSumoBaseObject(CommonXMLStructure::SumoBaseObject* obj) obj->getStringAttribute(SUMO_ATTR_CHARGETYPE), obj->getTimeAttribute(SUMO_ATTR_WAITINGTIME), obj->getBoolAttribute(SUMO_ATTR_FRIENDLY_POS), + obj->getStringAttribute(SUMO_ATTR_PARKING_AREA), obj->getParameters()); break; case SUMO_TAG_PARKING_AREA: @@ -867,6 +868,8 @@ AdditionalHandler::parseChargingStationAttributes(const SUMOSAXAttributes& attrs const std::string chargeType = attrs.getOpt(SUMO_ATTR_CHARGETYPE, id.c_str(), parsedOk, "normal"); const SUMOTime waitingTime = attrs.getOptSUMOTimeReporting(SUMO_ATTR_WAITINGTIME, id.c_str(), parsedOk, TIME2STEPS(900)); const bool friendlyPos = attrs.getOpt(SUMO_ATTR_FRIENDLY_POS, id.c_str(), parsedOk, false); + const std::string parkingAreaID = attrs.getOpt(SUMO_ATTR_PARKING_AREA, id.c_str(), parsedOk, ""); + // check charge type if ((chargeType != "normal") && (chargeType != "electric") && (chargeType != "fuel")) { writeError(TLF("Invalid charge type '%' defined in chargingStation '%'.", chargeType, id)); @@ -890,6 +893,7 @@ AdditionalHandler::parseChargingStationAttributes(const SUMOSAXAttributes& attrs myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_CHARGETYPE, chargeType); myCommonXMLStructure.getCurrentSumoBaseObject()->addTimeAttribute(SUMO_ATTR_WAITINGTIME, waitingTime); myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_FRIENDLY_POS, friendlyPos); + myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_PARKING_AREA, parkingAreaID); } } diff --git a/src/utils/handlers/AdditionalHandler.h b/src/utils/handlers/AdditionalHandler.h index 68d8f28ff20f..27f488dc407e 100644 --- a/src/utils/handlers/AdditionalHandler.h +++ b/src/utils/handlers/AdditionalHandler.h @@ -135,7 +135,7 @@ class AdditionalHandler { virtual void buildChargingStation(const CommonXMLStructure::SumoBaseObject* sumoBaseObject, const std::string& id, const std::string& laneID, const double startPos, const double endPos, const std::string& name, const double chargingPower, const double efficiency, const bool chargeInTransit, const SUMOTime chargeDelay, const std::string& chargeType, - const SUMOTime waitingTime, const bool friendlyPosition, + const SUMOTime waitingTime, const bool friendlyPosition, const std::string& parkingAreaID, const Parameterised::Map& parameters) = 0; /**@brief Builds a Parking Area