Skip to content

Commit 4c6bdb7

Browse files
authored
Fix(EvseV2G): PnC enabled check did not work correctly in ServiceDiscovery state. As part of this fix, a std::vector was used instead of a c array (#1802)
Signed-off-by: Sebastian Lukas <sebastian.lukas@pionix.de>
1 parent 2b85601 commit 4c6bdb7

File tree

4 files changed

+44
-39
lines changed

4 files changed

+44
-39
lines changed

modules/EVSE/EvseV2G/charger/ISO15118_chargerImpl.cpp

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include "log.hpp"
66
#include "tools.hpp"
77
#include "v2g_ctx.hpp"
8+
#include <algorithm>
89
#include <string.h>
910
#include <string_view>
1011

@@ -181,34 +182,34 @@ void ISO15118_chargerImpl::handle_set_charging_parameters(types::iso15118::Setup
181182
void ISO15118_chargerImpl::handle_session_setup(std::vector<types::iso15118::PaymentOption>& payment_options,
182183
bool& supported_certificate_service,
183184
bool& central_contract_validation_allowed) {
184-
if (v2g_ctx->hlc_pause_active != true) {
185-
v2g_ctx->evse_v2g_data.payment_option_list_len = 0;
186-
187-
for (auto option : payment_options) {
188-
189-
if (option == types::iso15118::PaymentOption::Contract) {
190-
v2g_ctx->evse_v2g_data.payment_option_list[v2g_ctx->evse_v2g_data.payment_option_list_len] =
191-
iso2_paymentOptionType_Contract;
192-
v2g_ctx->evse_v2g_data.payment_option_list_len++;
193-
} else if (option == types::iso15118::PaymentOption::ExternalPayment) {
194-
v2g_ctx->evse_v2g_data.payment_option_list[v2g_ctx->evse_v2g_data.payment_option_list_len] =
195-
iso2_paymentOptionType_ExternalPayment;
196-
v2g_ctx->evse_v2g_data.payment_option_list_len++;
197-
} else {
198-
dlog(DLOG_LEVEL_WARNING, "Unable to configure PaymentOption %s",
199-
types::iso15118::payment_option_to_string(option).c_str());
185+
if (not v2g_ctx->hlc_pause_active) {
186+
v2g_ctx->evse_v2g_data.payment_option_list.clear();
187+
if (not payment_options.empty()) {
188+
const auto max_payment_options =
189+
std::min(static_cast<size_t>(iso2_paymentOptionType_2_ARRAY_SIZE), payment_options.size());
190+
for (size_t i = 0; i < max_payment_options; i++) {
191+
const auto& payment_option = payment_options.at(i);
192+
if (payment_option == types::iso15118::PaymentOption::ExternalPayment) {
193+
v2g_ctx->evse_v2g_data.payment_option_list.push_back(iso2_paymentOptionType_ExternalPayment);
194+
} else if (payment_option == types::iso15118::PaymentOption::Contract) {
195+
v2g_ctx->evse_v2g_data.payment_option_list.push_back(iso2_paymentOptionType_Contract);
196+
} else {
197+
dlog(DLOG_LEVEL_WARNING, "Unable to configure PaymentOption %s",
198+
types::iso15118::payment_option_to_string(payment_option).c_str());
199+
}
200200
}
201201
}
202202

203-
if (v2g_ctx->evse_v2g_data.payment_option_list_len == 0) {
203+
if (payment_options.empty() or v2g_ctx->evse_v2g_data.payment_option_list.empty()) {
204204
dlog(DLOG_LEVEL_ERROR, "No valid PaymentOptions configured, falling back to ExternalPayment");
205-
v2g_ctx->evse_v2g_data.payment_option_list[0] = iso2_paymentOptionType_ExternalPayment;
206-
v2g_ctx->evse_v2g_data.payment_option_list_len = 1;
205+
v2g_ctx->evse_v2g_data.payment_option_list.clear();
206+
v2g_ctx->evse_v2g_data.payment_option_list.push_back(iso2_paymentOptionType_ExternalPayment);
207207
}
208208
}
209209

210-
const auto pnc_enabled = ((v2g_ctx->evse_v2g_data.payment_option_list[0] == iso2_paymentOptionType_Contract) or
211-
(v2g_ctx->evse_v2g_data.payment_option_list[1] == iso2_paymentOptionType_Contract));
210+
const auto pnc_enabled =
211+
std::find(v2g_ctx->evse_v2g_data.payment_option_list.begin(), v2g_ctx->evse_v2g_data.payment_option_list.end(),
212+
iso2_paymentOptionType_Contract) != v2g_ctx->evse_v2g_data.payment_option_list.end();
212213

213214
using state_t = tls::Server::state_t;
214215
const auto tls_server_state = v2g_ctx->tls_server->state();

modules/EVSE/EvseV2G/iso_server.cpp

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -615,18 +615,19 @@ static enum v2g_event handle_iso_service_discovery(struct v2g_connection* conn)
615615
res->ChargeService = conn->ctx->evse_v2g_data.charge_service;
616616

617617
// Checking of the payment options
618-
if ((!conn->is_tls_connection) &&
619-
((conn->ctx->evse_v2g_data.payment_option_list[0] == iso2_paymentOptionType_Contract) ||
620-
(conn->ctx->evse_v2g_data.payment_option_list[1] == iso2_paymentOptionType_Contract))) {
621-
conn->ctx->evse_v2g_data.payment_option_list[0] = iso2_paymentOptionType_ExternalPayment;
622-
conn->ctx->evse_v2g_data.payment_option_list_len = 1;
618+
const auto pnc_enabled =
619+
std::find(conn->ctx->evse_v2g_data.payment_option_list.begin(),
620+
conn->ctx->evse_v2g_data.payment_option_list.end(),
621+
iso2_paymentOptionType_Contract) != conn->ctx->evse_v2g_data.payment_option_list.end();
622+
if (not conn->is_tls_connection and pnc_enabled) {
623+
conn->ctx->evse_v2g_data.payment_option_list = {iso2_paymentOptionType_ExternalPayment};
623624
dlog(DLOG_LEVEL_WARNING,
624625
"PnC is not allowed without TLS-communication. Correcting value to '1' (ExternalPayment)");
625626
}
626627

627-
memcpy(res->PaymentOptionList.PaymentOption.array, conn->ctx->evse_v2g_data.payment_option_list,
628-
conn->ctx->evse_v2g_data.payment_option_list_len * sizeof(iso2_paymentOptionType));
629-
res->PaymentOptionList.PaymentOption.arrayLen = conn->ctx->evse_v2g_data.payment_option_list_len;
628+
memcpy(res->PaymentOptionList.PaymentOption.array, conn->ctx->evse_v2g_data.payment_option_list.data(),
629+
conn->ctx->evse_v2g_data.payment_option_list.size() * sizeof(iso2_paymentOptionType));
630+
res->PaymentOptionList.PaymentOption.arrayLen = conn->ctx->evse_v2g_data.payment_option_list.size();
630631

631632
// ensure a "clean" service list
632633
res->ServiceList.Service.arrayLen = 0;
@@ -812,11 +813,14 @@ static enum v2g_event handle_iso_payment_service_selection(struct v2g_connection
812813
* this also covers the case that the peer sends any invalid/unknown payment option
813814
* in the message; if we are not happy -> bail out
814815
*/
815-
for (idx = 0; idx < conn->ctx->evse_v2g_data.payment_option_list_len; idx++) {
816-
if (conn->ctx->evse_v2g_data.payment_option_list[idx] == req->SelectedPaymentOption) {
816+
for (idx = 0; idx < conn->ctx->evse_v2g_data.payment_option_list.size(); idx++) {
817+
if (conn->ctx->evse_v2g_data.payment_option_list.at(idx) == req->SelectedPaymentOption) {
817818
list_element_found = true;
818-
conn->ctx->p_charger->publish_selected_payment_option(
819-
static_cast<types::iso15118::PaymentOption>(req->SelectedPaymentOption));
819+
if (req->SelectedPaymentOption == iso2_paymentOptionType_ExternalPayment) {
820+
conn->ctx->p_charger->publish_selected_payment_option(types::iso15118::PaymentOption::ExternalPayment);
821+
} else if (req->SelectedPaymentOption == iso2_paymentOptionType_Contract) {
822+
conn->ctx->p_charger->publish_selected_payment_option(types::iso15118::PaymentOption::Contract);
823+
}
820824
break;
821825
}
822826
}

modules/EVSE/EvseV2G/v2g.hpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -277,8 +277,7 @@ struct v2g_context {
277277
struct iso2_SAScheduleListType evse_sa_schedule_list;
278278
bool evse_sa_schedule_list_is_used;
279279

280-
iso2_paymentOptionType payment_option_list[iso2_paymentOptionType_2_ARRAY_SIZE];
281-
uint8_t payment_option_list_len;
280+
std::vector<iso2_paymentOptionType> payment_option_list;
282281
bool central_contract_validation_allowed;
283282

284283
bool cert_install_status;

modules/EVSE/EvseV2G/v2g_ctx.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -193,8 +193,9 @@ void v2g_ctx_init_charging_values(struct v2g_context* const ctx) {
193193
ctx->evse_v2g_data.rcd = (int)0; // 0 if RCD has not detected an error
194194
ctx->contactor_is_closed = false;
195195

196-
ctx->evse_v2g_data.payment_option_list[0] = iso2_paymentOptionType_ExternalPayment;
197-
ctx->evse_v2g_data.payment_option_list_len = (uint8_t)1; // One option must be set
196+
ctx->evse_v2g_data.payment_option_list.clear();
197+
ctx->evse_v2g_data.payment_option_list.reserve(iso2_paymentOptionType_2_ARRAY_SIZE);
198+
ctx->evse_v2g_data.payment_option_list.push_back(iso2_paymentOptionType_ExternalPayment);
198199

199200
ctx->evse_v2g_data.evse_service_list.clear();
200201
ctx->evse_v2g_data.evse_service_list.reserve(iso2_ServiceType_8_ARRAY_SIZE);
@@ -261,8 +262,8 @@ void v2g_ctx_init_charging_values(struct v2g_context* const ctx) {
261262
if (ctx->hlc_pause_active != true) {
262263
ctx->session.iso_selected_payment_option = iso2_paymentOptionType_ExternalPayment;
263264
} else {
264-
ctx->evse_v2g_data.payment_option_list[0] = ctx->session.iso_selected_payment_option;
265-
ctx->evse_v2g_data.payment_option_list_len = (uint8_t)1; // One option must be set
265+
ctx->evse_v2g_data.payment_option_list.clear();
266+
ctx->evse_v2g_data.payment_option_list.push_back(ctx->session.iso_selected_payment_option);
266267
}
267268
memset(ctx->session.gen_challenge, 0, sizeof(ctx->session.gen_challenge));
268269

0 commit comments

Comments
 (0)