From 7fd8edce5d1f8742b8c854376616cd09e87ccd73 Mon Sep 17 00:00:00 2001 From: c-jimenez <18682655+c-jimenez@users.noreply.github.com> Date: Sun, 30 Apr 2023 15:48:25 +0200 Subject: [PATCH 1/4] =?UTF-8?q?[chargepoint]=20Allow=20remote=20start=20tr?= =?UTF-8?q?ansaction=20on=20connector=200=C2=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/chargepoint/ChargePoint.cpp | 1 + .../smartcharging/ProfileDatabase.cpp | 19 ++++++++++++++++++- .../transaction/TransactionManager.cpp | 11 ++++++++++- 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/chargepoint/ChargePoint.cpp b/src/chargepoint/ChargePoint.cpp index 11615789..5a8ff346 100644 --- a/src/chargepoint/ChargePoint.cpp +++ b/src/chargepoint/ChargePoint.cpp @@ -367,6 +367,7 @@ bool ChargePoint::stop() // Stop connection ret = m_rpc_client->stop(); + std::this_thread::sleep_for(std::chrono::milliseconds(300)); // Stop managers m_config_manager.reset(); diff --git a/src/chargepoint/smartcharging/ProfileDatabase.cpp b/src/chargepoint/smartcharging/ProfileDatabase.cpp index fd6fb52e..6301b579 100644 --- a/src/chargepoint/smartcharging/ProfileDatabase.cpp +++ b/src/chargepoint/smartcharging/ProfileDatabase.cpp @@ -19,6 +19,7 @@ along with OpenOCPP. If not, see . #include "ProfileDatabase.h" #include "ChargingProfile.h" #include "ChargingProfileConverter.h" +#include "Connectors.h" #include "IOcppConfig.h" #include @@ -248,11 +249,21 @@ bool ProfileDatabase::install(unsigned int connector_id, const ocpp::types::Char /** @brief Assign the pending TxProfile of a connector to a transaction */ void ProfileDatabase::assignPendingTxProfiles(unsigned int connector_id, int transaction_id) { + std::vector profiles_to_remove; + // Look for pending profiles for (const auto& profile : m_tx_profiles) { - if ((profile.first == connector_id) && !profile.second.transactionId.isSet()) + if (((profile.first == Connectors::CONNECTOR_ID_CHARGE_POINT) || (profile.first == connector_id)) && + !profile.second.transactionId.isSet()) { + // If no connector set, remove the profile completly + // so that it won't be used again + if (profile.first == Connectors::CONNECTOR_ID_CHARGE_POINT) + { + profiles_to_remove.push_back(profile.second.chargingProfileId); + } + // Assign transaction to a new profile ChargingProfile assigned_profile = profile.second; assigned_profile.transactionId = transaction_id; @@ -261,6 +272,12 @@ void ProfileDatabase::assignPendingTxProfiles(unsigned int connector_id, int tra install(connector_id, assigned_profile); } } + + // Remove profiles + for (int profile_id : profiles_to_remove) + { + clear(profile_id); + } } /** @brief Initialize the database table */ diff --git a/src/chargepoint/transaction/TransactionManager.cpp b/src/chargepoint/transaction/TransactionManager.cpp index 1625ae10..95b7ef44 100644 --- a/src/chargepoint/transaction/TransactionManager.cpp +++ b/src/chargepoint/transaction/TransactionManager.cpp @@ -273,7 +273,6 @@ bool TransactionManager::handleMessage(const ocpp::messages::RemoteStartTransact LOG_INFO << "Remote start transaction requested : connector = " << request.connectorId << " - idTag = " << request.idTag.c_str(); - // No remote start allowed without connector id bool authorized = false; if (request.connectorId.isSet() && (request.connectorId != Connectors::CONNECTOR_ID_CHARGE_POINT)) { @@ -295,6 +294,16 @@ bool TransactionManager::handleMessage(const ocpp::messages::RemoteStartTransact } } } + else + { + // The user application will determine which connector to use + authorized = m_events_handler.remoteStartTransactionRequested(Connectors::CONNECTOR_ID_CHARGE_POINT, request.idTag.str()); + if (authorized && request.chargingProfile.isSet()) + { + // Install associated charging profile + authorized = m_smart_charging_manager.installTxProfile(Connectors::CONNECTOR_ID_CHARGE_POINT, request.chargingProfile); + } + } // Response if (authorized) From b0a8715efcb70c3e43ee45dd184b9fa8a598db27 Mon Sep 17 00:00:00 2001 From: c-jimenez <18682655+c-jimenez@users.noreply.github.com> Date: Sun, 30 Apr 2023 15:48:48 +0200 Subject: [PATCH 2/4] [tools] Queue push optimization --- src/tools/helpers/Queue.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tools/helpers/Queue.h b/src/tools/helpers/Queue.h index d8ad9374..45907427 100644 --- a/src/tools/helpers/Queue.h +++ b/src/tools/helpers/Queue.h @@ -131,7 +131,7 @@ class Queue if (m_queue.size() < MAX_SIZE) { // Add item - m_queue.push(item); + m_queue.push(std::move(item)); // Wakeup waiting thread m_cond_var.notify_one(); From 925f3f21493f3d45e4c83c1ca5c0cba719fe53e6 Mon Sep 17 00:00:00 2001 From: c-jimenez <18682655+c-jimenez@users.noreply.github.com> Date: Sun, 30 Apr 2023 15:49:09 +0200 Subject: [PATCH 3/4] =?UTF-8?q?[format]=C2=A0Code=20format?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- examples/common/config/OcppConfig.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/common/config/OcppConfig.cpp b/examples/common/config/OcppConfig.cpp index 289aefbd..3c53f5a9 100644 --- a/examples/common/config/OcppConfig.cpp +++ b/examples/common/config/OcppConfig.cpp @@ -201,13 +201,13 @@ ocpp::types::ConfigurationStatus OcppConfig::setConfiguration(const std::string& if (key_is_interval != std::string::npos) { std::size_t value_is_negative = key.find("-"); - if(value_is_negative) + if (value_is_negative) { ret = ConfigurationStatus::Rejected; } } - if(ret != ConfigurationStatus::Rejected) + if (ret != ConfigurationStatus::Rejected) { if ((it->second & PARAM_OCPP) != 0) { From 082de2704712ad5440909a59bbd3e8a9fb4bdfbb Mon Sep 17 00:00:00 2001 From: c-jimenez <18682655+c-jimenez@users.noreply.github.com> Date: Sun, 30 Apr 2023 15:56:22 +0200 Subject: [PATCH 4/4] =?UTF-8?q?[chargepoint]=C2=A0Add=20missing=20locks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/chargepoint/requestfifo/RequestFifoManager.cpp | 4 ++++ src/chargepoint/smartcharging/SmartChargingManager.cpp | 3 +++ 2 files changed, 7 insertions(+) diff --git a/src/chargepoint/requestfifo/RequestFifoManager.cpp b/src/chargepoint/requestfifo/RequestFifoManager.cpp index bcb2823f..7992413b 100644 --- a/src/chargepoint/requestfifo/RequestFifoManager.cpp +++ b/src/chargepoint/requestfifo/RequestFifoManager.cpp @@ -142,6 +142,7 @@ void RequestFifoManager::processFifoRequest() Connector* connector = m_connectors.getConnector(request.connectorId); if (connector) { + std::lock_guard lock(connector->mutex); connector->transaction_id_offline = response.transactionId; m_connectors.saveConnector(request.connectorId); } @@ -152,6 +153,8 @@ void RequestFifoManager::processFifoRequest() // Look for the corresponding transaction if (connector && (connector->transaction_id < 0) && (connector->transaction_start == request.timestamp)) { + std::lock_guard lock(connector->mutex); + // Update current transaction id connector->transaction_id = connector->transaction_id_offline; m_connectors.saveConnector(request.connectorId); @@ -251,6 +254,7 @@ void RequestFifoManager::processFifoRequest() { for (Connector* connector : m_connectors.getConnectors()) { + std::lock_guard lock(connector->mutex); if (connector->transaction_id < 0) { connector->transaction_id = connector->transaction_id_offline; diff --git a/src/chargepoint/smartcharging/SmartChargingManager.cpp b/src/chargepoint/smartcharging/SmartChargingManager.cpp index f6548459..ebb5b95e 100644 --- a/src/chargepoint/smartcharging/SmartChargingManager.cpp +++ b/src/chargepoint/smartcharging/SmartChargingManager.cpp @@ -358,6 +358,9 @@ bool SmartChargingManager::handleMessage(const ocpp::messages::GetCompositeSched << " - chargingRateUnit = " << (request.chargingRateUnit.isSet() ? ChargingRateUnitTypeHelper.toString(request.chargingRateUnit) : "not set"); + // Lock profiles + std::lock_guard lock(m_mutex); + // Prepare response response.status = GetCompositeScheduleStatus::Rejected;