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;