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