From 86cd4510e2ff446d009eb42219273895c3654811 Mon Sep 17 00:00:00 2001 From: Mahdi Dadashi Date: Mon, 3 Jul 2023 09:17:16 +0330 Subject: [PATCH 1/6] Update OcppConfig.cpp negative values in "Interval" keys must be rejected,corrected --- examples/common/config/OcppConfig.cpp | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/examples/common/config/OcppConfig.cpp b/examples/common/config/OcppConfig.cpp index 3c53f5a9..f54908a9 100644 --- a/examples/common/config/OcppConfig.cpp +++ b/examples/common/config/OcppConfig.cpp @@ -197,18 +197,16 @@ ocpp::types::ConfigurationStatus OcppConfig::setConfiguration(const std::string& { if ((it->second & PARAM_WRITE) != 0) { - std::size_t key_is_interval = key.find("Interval"); - if (key_is_interval != std::string::npos) - { - std::size_t value_is_negative = key.find("-"); - if (value_is_negative) - { - ret = ConfigurationStatus::Rejected; - } - } + if (key.find("Interval") != std::string::npos) + { + if (value.find("-") != std::string::npos) + { + ret = ConfigurationStatus::Rejected; + } + } - if (ret != ConfigurationStatus::Rejected) - { + if (ret != ConfigurationStatus::Rejected) + { if ((it->second & PARAM_OCPP) != 0) { m_config.set(OCPP_PARAMS, key, value); @@ -225,7 +223,7 @@ ocpp::types::ConfigurationStatus OcppConfig::setConfiguration(const std::string& { ret = ConfigurationStatus::Accepted; } - } + } } else { From accd195ca7c0ca310585b5551a36000c85a502cf Mon Sep 17 00:00:00 2001 From: Mahdi Dadashi Date: Mon, 3 Jul 2023 09:25:18 +0330 Subject: [PATCH 2/6] Update DefaultChargePointEventsHandler.cpp according to Test Case Id: 027 , in Remote start transaction - connector id shall not be 0 --- .../DefaultChargePointEventsHandler.cpp | 20 ++++++------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/examples/common/DefaultChargePointEventsHandler.cpp b/examples/common/DefaultChargePointEventsHandler.cpp index e871ced0..bd6e86dd 100644 --- a/examples/common/DefaultChargePointEventsHandler.cpp +++ b/examples/common/DefaultChargePointEventsHandler.cpp @@ -168,24 +168,16 @@ bool DefaultChargePointEventsHandler::remoteStartTransactionRequested(unsigned i { bool ret = false; cout << "Remote start transaction : " << connector_id << " - " << id_tag << endl; - if (connector_id != 0) + + if(connector_id > m_config.ocppConfig().numberOfConnectors() || connector_id == 0) { - m_remote_start_pending[connector_id - 1u] = true; - m_remote_start_id_tag[connector_id - 1u] = id_tag; - ret = true; + ret=false; } else { - for (size_t i = 1; i <= m_config.ocppConfig().numberOfConnectors(); i++) - { - if (m_chargepoint->getConnectorStatus(i) < ChargePointStatus::Charging) - { - m_remote_start_pending[i - 1u] = true; - m_remote_start_id_tag[i - 1u] = id_tag; - ret = true; - break; - } - } + m_remote_start_pending[connector_id - 1u] = true; + m_remote_start_id_tag[connector_id - 1u] = id_tag; + ret=true; } return ret; } From 571e7a0b824c15e84ca2dc0b87c3a53093d10026 Mon Sep 17 00:00:00 2001 From: Mahdi Dadashi Date: Tue, 14 Nov 2023 14:30:51 +0330 Subject: [PATCH 3/6] Change in the decision-making process for reservation recognition Before sending start transaction the status of the connector must be changed to preparing, and this makes us no longer able to determine from the status whether the connector was reserved or not. --- .../reservation/ReservationManager.cpp | 16 ++++++++++++---- .../transaction/TransactionManager.cpp | 4 ++-- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/chargepoint/reservation/ReservationManager.cpp b/src/chargepoint/reservation/ReservationManager.cpp index c6108cc4..9dd2959c 100644 --- a/src/chargepoint/reservation/ReservationManager.cpp +++ b/src/chargepoint/reservation/ReservationManager.cpp @@ -102,7 +102,7 @@ ocpp::types::AuthorizationStatus ReservationManager::isTransactionAllowed(unsign if (connector) { // Check if connector is reserved - if (connector->status == ChargePointStatus::Reserved) + if (connector->reservation_id_tag.length() > 0) { // Check if id tag match if (id_tag == connector->reservation_id_tag) @@ -130,7 +130,7 @@ ocpp::types::AuthorizationStatus ReservationManager::isTransactionAllowed(unsign { // Check if connector 0 is reserved Connector& charge_point = m_connectors.getChargePointConnector(); - if (charge_point.status == ChargePointStatus::Reserved) + if (charge_point.reservation_id_tag.length() > 0) { // Ensure that the module functions properly even when the gun is inserted first by the user. if (m_connectors.getConnector(connector_id)->status == ChargePointStatus::Preparing) @@ -180,6 +180,7 @@ bool ReservationManager::handleMessage(const ocpp::messages::ReserveNowReq& requ { bool ret = false; + DateTime now = DateTime::now(); // Get requested connector Connector* connector = m_connectors.getConnector(request.connectorId); if (connector) @@ -227,6 +228,8 @@ bool ReservationManager::handleMessage(const ocpp::messages::ReserveNowReq& requ connector->reservation_expiry_date = request.expiryDate; response.status = ReservationStatus::Accepted; + if (connector->reservation_expiry_date > now) + { // Update connector status and notify new status m_worker_pool.run( [this, connector] @@ -234,6 +237,11 @@ bool ReservationManager::handleMessage(const ocpp::messages::ReserveNowReq& requ m_status_manager.updateConnectorStatus(connector->id, ChargePointStatus::Reserved); m_events_handler.reservationStarted(connector->id); }); + } + else + { + response.status = ReservationStatus::Rejected; + } break; } @@ -293,7 +301,7 @@ bool ReservationManager::handleMessage(const ocpp::messages::CancelReservationRe response.status = CancelReservationStatus::Rejected; for (const Connector* connector : m_connectors.getConnectors()) { - if ((connector->status == ChargePointStatus::Reserved) && (connector->reservation_id == request.reservationId)) + if ((connector->reservation_id_tag.length() > 0) && (connector->reservation_id == request.reservationId)) { // Cancel reservation m_worker_pool.run([this, connector_id = connector->id] { endReservation(connector_id, true); }); @@ -316,7 +324,7 @@ void ReservationManager::checkExpiries() // Check reservations for (const Connector* connector : m_connectors.getConnectors()) { - if ((connector->status == ChargePointStatus::Reserved) && (connector->reservation_expiry_date <= now)) + if ((connector->reservation_id_tag.length() > 0) && (connector->reservation_expiry_date <= now)) { // End reservation m_worker_pool.run(std::bind(&ReservationManager::endReservation, this, connector->id, false)); diff --git a/src/chargepoint/transaction/TransactionManager.cpp b/src/chargepoint/transaction/TransactionManager.cpp index a4e662e8..81565cd5 100644 --- a/src/chargepoint/transaction/TransactionManager.cpp +++ b/src/chargepoint/transaction/TransactionManager.cpp @@ -98,7 +98,7 @@ ocpp::types::AuthorizationStatus TransactionManager::startTransaction(unsigned i start_transaction_req.timestamp = DateTime::now(); // Check reservations - if (connector->status == ChargePointStatus::Reserved) + if (connector->reservation_id_tag.length() > 0) { // Fill reservation id start_transaction_req.reservationId = connector->reservation_id; @@ -112,7 +112,7 @@ ocpp::types::AuthorizationStatus TransactionManager::startTransaction(unsigned i if (m_ocpp_config.reserveConnectorZeroSupported()) { Connector& charge_point = m_connectors.getChargePointConnector(); - if (charge_point.status == ChargePointStatus::Reserved) + if (charge_point.reservation_id_tag.length() > 0) { // Check if this transaction can be used for the charge point reservation if (m_reservation_manager.isTransactionAllowed(Connectors::CONNECTOR_ID_CHARGE_POINT, id_tag) == From aa8e08435289c760426eb2aa0d1d53099b061177 Mon Sep 17 00:00:00 2001 From: Mahdi Dadashi Date: Tue, 14 Nov 2023 21:41:00 +0330 Subject: [PATCH 4/6] Update src/chargepoint/reservation/ReservationManager.cpp Co-authored-by: Habbus <44402940+Habbus@users.noreply.github.com> --- src/chargepoint/reservation/ReservationManager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/chargepoint/reservation/ReservationManager.cpp b/src/chargepoint/reservation/ReservationManager.cpp index 9dd2959c..97e4113e 100644 --- a/src/chargepoint/reservation/ReservationManager.cpp +++ b/src/chargepoint/reservation/ReservationManager.cpp @@ -301,7 +301,7 @@ bool ReservationManager::handleMessage(const ocpp::messages::CancelReservationRe response.status = CancelReservationStatus::Rejected; for (const Connector* connector : m_connectors.getConnectors()) { - if ((connector->reservation_id_tag.length() > 0) && (connector->reservation_id == request.reservationId)) + if ((!connector->reservation_id_tag.empty()) && (connector->reservation_id == request.reservationId)) { // Cancel reservation m_worker_pool.run([this, connector_id = connector->id] { endReservation(connector_id, true); }); From 829dcd5a1a33bfeb70ee69857784520fd9646b81 Mon Sep 17 00:00:00 2001 From: Mahdi Dadashi Date: Wed, 15 Nov 2023 13:16:33 +0330 Subject: [PATCH 5/6] Removal of rejecting the reservation if the time is old Removing the reservation rejection if the time is old and changing the method of checking whether the reservation_id_tag is empty or not --- src/chargepoint/reservation/ReservationManager.cpp | 14 ++++---------- src/chargepoint/transaction/TransactionManager.cpp | 4 ++-- 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/src/chargepoint/reservation/ReservationManager.cpp b/src/chargepoint/reservation/ReservationManager.cpp index 97e4113e..50ebf125 100644 --- a/src/chargepoint/reservation/ReservationManager.cpp +++ b/src/chargepoint/reservation/ReservationManager.cpp @@ -102,7 +102,7 @@ ocpp::types::AuthorizationStatus ReservationManager::isTransactionAllowed(unsign if (connector) { // Check if connector is reserved - if (connector->reservation_id_tag.length() > 0) + if (!connector->reservation_id_tag.empty()) { // Check if id tag match if (id_tag == connector->reservation_id_tag) @@ -130,7 +130,7 @@ ocpp::types::AuthorizationStatus ReservationManager::isTransactionAllowed(unsign { // Check if connector 0 is reserved Connector& charge_point = m_connectors.getChargePointConnector(); - if (charge_point.reservation_id_tag.length() > 0) + if (!charge_point.reservation_id_tag.empty()) { // Ensure that the module functions properly even when the gun is inserted first by the user. if (m_connectors.getConnector(connector_id)->status == ChargePointStatus::Preparing) @@ -228,8 +228,6 @@ bool ReservationManager::handleMessage(const ocpp::messages::ReserveNowReq& requ connector->reservation_expiry_date = request.expiryDate; response.status = ReservationStatus::Accepted; - if (connector->reservation_expiry_date > now) - { // Update connector status and notify new status m_worker_pool.run( [this, connector] @@ -237,11 +235,7 @@ bool ReservationManager::handleMessage(const ocpp::messages::ReserveNowReq& requ m_status_manager.updateConnectorStatus(connector->id, ChargePointStatus::Reserved); m_events_handler.reservationStarted(connector->id); }); - } - else - { - response.status = ReservationStatus::Rejected; - } + break; } @@ -324,7 +318,7 @@ void ReservationManager::checkExpiries() // Check reservations for (const Connector* connector : m_connectors.getConnectors()) { - if ((connector->reservation_id_tag.length() > 0) && (connector->reservation_expiry_date <= now)) + if ((!connector->reservation_id_tag.empty()) && (connector->reservation_expiry_date <= now)) { // End reservation m_worker_pool.run(std::bind(&ReservationManager::endReservation, this, connector->id, false)); diff --git a/src/chargepoint/transaction/TransactionManager.cpp b/src/chargepoint/transaction/TransactionManager.cpp index 6c29fe2f..f9699158 100644 --- a/src/chargepoint/transaction/TransactionManager.cpp +++ b/src/chargepoint/transaction/TransactionManager.cpp @@ -98,7 +98,7 @@ ocpp::types::AuthorizationStatus TransactionManager::startTransaction(unsigned i start_transaction_req.timestamp = DateTime::now(); // Check reservations - if (connector->reservation_id_tag.length() > 0) + if (!connector->reservation_id_tag.empty()) { // Fill reservation id start_transaction_req.reservationId = connector->reservation_id; @@ -112,7 +112,7 @@ ocpp::types::AuthorizationStatus TransactionManager::startTransaction(unsigned i if (m_ocpp_config.reserveConnectorZeroSupported()) { Connector& charge_point = m_connectors.getChargePointConnector(); - if (charge_point.reservation_id_tag.length() > 0) + if (!charge_point.reservation_id_tag.empty()) { // Check if this transaction can be used for the charge point reservation if (m_reservation_manager.isTransactionAllowed(Connectors::CONNECTOR_ID_CHARGE_POINT, id_tag) == From 011e5130d4f67aecf9ed23344044910357379dcf Mon Sep 17 00:00:00 2001 From: Mahdi Dadashi Date: Wed, 15 Nov 2023 14:26:49 +0330 Subject: [PATCH 6/6] unused variable must be removed --- src/chargepoint/reservation/ReservationManager.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/chargepoint/reservation/ReservationManager.cpp b/src/chargepoint/reservation/ReservationManager.cpp index 50ebf125..cf13b2ad 100644 --- a/src/chargepoint/reservation/ReservationManager.cpp +++ b/src/chargepoint/reservation/ReservationManager.cpp @@ -180,7 +180,6 @@ bool ReservationManager::handleMessage(const ocpp::messages::ReserveNowReq& requ { bool ret = false; - DateTime now = DateTime::now(); // Get requested connector Connector* connector = m_connectors.getConnector(request.connectorId); if (connector)