From 6aa052e224f4d8a394fc41dd2d3b3e390a25b5cc Mon Sep 17 00:00:00 2001 From: AssemblyJohn Date: Wed, 19 Feb 2025 17:13:07 +0200 Subject: [PATCH 01/12] Added base params for notify_ev_charging_needs Signed-off-by: AssemblyJohn --- include/iso15118/message/common_types.hpp | 1 + include/iso15118/session/feedback.hpp | 9 +++++++++ src/iso15118/d20/state/schedule_exchange.cpp | 15 ++++++++++++++- src/iso15118/session/feedback.cpp | 4 ++++ 4 files changed, 28 insertions(+), 1 deletion(-) diff --git a/include/iso15118/message/common_types.hpp b/include/iso15118/message/common_types.hpp index 89fae9fe..e8d4fa50 100644 --- a/include/iso15118/message/common_types.hpp +++ b/include/iso15118/message/common_types.hpp @@ -115,6 +115,7 @@ enum class ChargingSession { enum class AcConnector { SinglePhase = 1, + // TODO(ioan): two phase missing? ThreePhase = 3, }; enum class DcConnector { diff --git a/include/iso15118/session/feedback.hpp b/include/iso15118/session/feedback.hpp index b51edb36..c517c02e 100644 --- a/include/iso15118/session/feedback.hpp +++ b/include/iso15118/session/feedback.hpp @@ -13,6 +13,8 @@ namespace iso15118::session { +namespace dt = message_20::datatypes; + namespace feedback { enum class Signal { @@ -51,6 +53,10 @@ struct Callbacks { std::function v2g_message; std::function evccid; std::function selected_protocol; + + std::function + notify_ev_charging_needs; }; } // namespace feedback @@ -67,6 +73,9 @@ class Feedback { void evcc_id(const std::string&) const; void selected_protocol(const std::string&) const; + void notify_ev_charging_needs(const dt::ServiceCategory&, const dt::AcConnector&, const dt::ControlMode&, + const dt::MobilityNeedsMode&) const; + private: feedback::Callbacks callbacks; }; diff --git a/src/iso15118/d20/state/schedule_exchange.cpp b/src/iso15118/d20/state/schedule_exchange.cpp index 6feb4f1e..c84a970e 100644 --- a/src/iso15118/d20/state/schedule_exchange.cpp +++ b/src/iso15118/d20/state/schedule_exchange.cpp @@ -128,13 +128,26 @@ Result ScheduleExchange::feed(Event ev) { dt::RationalNumber max_charge_power = {0, 0}; - const auto selected_energy_service = m_ctx.session.get_selected_services().selected_energy_service; + const auto& selected_services = m_ctx.session.get_selected_services(); + const auto selected_energy_service = selected_services.selected_energy_service; if (selected_energy_service == dt::ServiceCategory::DC or selected_energy_service == dt::ServiceCategory::DC_BPT) { max_charge_power = m_ctx.session_config.dc_limits.charge_limits.power.max; } + // We will pass the raw data to the listener, the + // listener will construct the full required type + dt::AcConnector ac_connector = dt::AcConnector::SinglePhase; + if (std::holds_alternative(selected_services.selected_connector)) { + ac_connector = std::get(selected_services.selected_connector); + } + + // Send the charging feedback + this->m_ctx.feedback.notify_ev_charging_needs(selected_energy_service, ac_connector, + selected_services.selected_control_mode, + selected_services.selected_mobility_needs_mode); + const auto res = handle_request(*req, m_ctx.session, max_charge_power, dynamic_parameters); m_ctx.respond(res); diff --git a/src/iso15118/session/feedback.cpp b/src/iso15118/session/feedback.cpp index 8e1fa918..38f05bd7 100644 --- a/src/iso15118/session/feedback.cpp +++ b/src/iso15118/session/feedback.cpp @@ -37,4 +37,8 @@ void Feedback::selected_protocol(const std::string& selected_protocol) const { call_if_available(callbacks.selected_protocol, selected_protocol); } +void Feedback::notify_ev_charging_needs(const dt::ServiceCategory&, const dt::AcConnector&, const dt::ControlMode&, + const dt::MobilityNeedsMode&) const { +} + } // namespace iso15118::session From 26ee7cc1d4e8c86b014972cd4f10238457fc1e30 Mon Sep 17 00:00:00 2001 From: AssemblyJohn Date: Thu, 20 Feb 2025 16:32:19 +0200 Subject: [PATCH 02/12] Added feedback with DC limits Signed-off-by: AssemblyJohn --- include/iso15118/session/feedback.hpp | 7 +++++-- src/iso15118/d20/state/schedule_exchange.cpp | 5 ++++- src/iso15118/session/feedback.cpp | 8 ++++++-- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/include/iso15118/session/feedback.hpp b/include/iso15118/session/feedback.hpp index c517c02e..ee05ffee 100644 --- a/include/iso15118/session/feedback.hpp +++ b/include/iso15118/session/feedback.hpp @@ -8,6 +8,7 @@ #include #include +#include #include #include @@ -45,6 +46,8 @@ using DcReqControlMode = std::variant< using DcChargeLoopReq = std::variant; +using TransferLimits = std::variant; + struct Callbacks { std::function signal; std::function dc_pre_charge_target_voltage; @@ -55,7 +58,7 @@ struct Callbacks { std::function selected_protocol; std::function + const dt::MobilityNeedsMode&, const TransferLimits&)> notify_ev_charging_needs; }; @@ -74,7 +77,7 @@ class Feedback { void selected_protocol(const std::string&) const; void notify_ev_charging_needs(const dt::ServiceCategory&, const dt::AcConnector&, const dt::ControlMode&, - const dt::MobilityNeedsMode&) const; + const dt::MobilityNeedsMode&, const feedback::TransferLimits&) const; private: feedback::Callbacks callbacks; diff --git a/src/iso15118/d20/state/schedule_exchange.cpp b/src/iso15118/d20/state/schedule_exchange.cpp index c84a970e..fcfbf8f7 100644 --- a/src/iso15118/d20/state/schedule_exchange.cpp +++ b/src/iso15118/d20/state/schedule_exchange.cpp @@ -143,10 +143,13 @@ Result ScheduleExchange::feed(Event ev) { ac_connector = std::get(selected_services.selected_connector); } + // TODO(ioan): prepare for AC transfer limits + session::feedback::TransferLimits limits = m_ctx.session_config.dc_limits; + // Send the charging feedback this->m_ctx.feedback.notify_ev_charging_needs(selected_energy_service, ac_connector, selected_services.selected_control_mode, - selected_services.selected_mobility_needs_mode); + selected_services.selected_mobility_needs_mode, limits); const auto res = handle_request(*req, m_ctx.session, max_charge_power, dynamic_parameters); diff --git a/src/iso15118/session/feedback.cpp b/src/iso15118/session/feedback.cpp index 38f05bd7..db2c86c2 100644 --- a/src/iso15118/session/feedback.cpp +++ b/src/iso15118/session/feedback.cpp @@ -37,8 +37,12 @@ void Feedback::selected_protocol(const std::string& selected_protocol) const { call_if_available(callbacks.selected_protocol, selected_protocol); } -void Feedback::notify_ev_charging_needs(const dt::ServiceCategory&, const dt::AcConnector&, const dt::ControlMode&, - const dt::MobilityNeedsMode&) const { +void Feedback::notify_ev_charging_needs(const dt::ServiceCategory& service_category, + const dt::AcConnector& ac_connector, const dt::ControlMode& control_mode, + const dt::MobilityNeedsMode& mobility_needs_mode, + const feedback::TransferLimits& limits) const { + call_if_available(callbacks.notify_ev_charging_needs, service_category, ac_connector, control_mode, + mobility_needs_mode, limits); } } // namespace iso15118::session From a4bbc7bac5fd2fa673dc69c81e79ae0c6809d7f7 Mon Sep 17 00:00:00 2001 From: AssemblyJohn Date: Fri, 21 Feb 2025 13:45:37 +0200 Subject: [PATCH 03/12] Updated for ev/evse types and added a special context struct that holds all car-provided (EV) data Signed-off-by: AssemblyJohn --- include/iso15118/d20/config.hpp | 6 +++-- include/iso15118/d20/context.hpp | 4 +++ include/iso15118/d20/ev_session_info.hpp | 15 +++++++++++ .../state/dc_charge_parameter_discovery.hpp | 3 ++- include/iso15118/session/feedback.hpp | 24 ++++++++++++------ .../state/dc_charge_parameter_discovery.cpp | 20 +++++++-------- src/iso15118/d20/state/schedule_exchange.cpp | 9 +++++-- src/iso15118/session/feedback.cpp | 5 ++-- .../states/dc_charge_parameter_discovery.cpp | 25 ++++++++++++++----- 9 files changed, 81 insertions(+), 30 deletions(-) create mode 100644 include/iso15118/d20/ev_session_info.hpp diff --git a/include/iso15118/d20/config.hpp b/include/iso15118/d20/config.hpp index 7c467a36..2b072322 100644 --- a/include/iso15118/d20/config.hpp +++ b/include/iso15118/d20/config.hpp @@ -25,6 +25,7 @@ struct EvseSetupConfig { std::vector control_mobility_modes; }; +// This should only have EVSE information struct SessionConfig { explicit SessionConfig(EvseSetupConfig); @@ -41,8 +42,9 @@ struct SessionConfig { std::vector internet_parameter_list; std::vector parking_parameter_list; - - DcTransferLimits dc_limits; + + // I have a deja vu with this DC limits, shouldn't they be called dc_evse_limits? + DcTransferLimits dc_limits; std::vector supported_control_mobility_modes; }; diff --git a/include/iso15118/d20/context.hpp b/include/iso15118/d20/context.hpp index f87d8f93..da21186c 100644 --- a/include/iso15118/d20/context.hpp +++ b/include/iso15118/d20/context.hpp @@ -15,6 +15,7 @@ #include "config.hpp" #include "control_event.hpp" #include "session.hpp" +#include "ev_session_info.hpp" namespace iso15118::d20 { @@ -96,6 +97,9 @@ class Context { SessionConfig session_config; + // Contains the EV received data + EVSessionInfo session_ev_info; + bool session_stopped{false}; private: diff --git a/include/iso15118/d20/ev_session_info.hpp b/include/iso15118/d20/ev_session_info.hpp new file mode 100644 index 00000000..6fed8fdc --- /dev/null +++ b/include/iso15118/d20/ev_session_info.hpp @@ -0,0 +1,15 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright 2025 Pionix GmbH and Contributors to EVerest +#pragma once + +#include + +namespace iso15118::d20 { + +// Holds information reported by the EV +struct EVSessionInfo { + session::feedback::EV_TransferLimits ev_transfer_limits; + session::feedback::EV_SEControlMode ev_control_mode; +}; + +} // namespace iso15118::d20 \ No newline at end of file diff --git a/include/iso15118/detail/d20/state/dc_charge_parameter_discovery.hpp b/include/iso15118/detail/d20/state/dc_charge_parameter_discovery.hpp index a2d3333a..82ba4ab9 100644 --- a/include/iso15118/detail/d20/state/dc_charge_parameter_discovery.hpp +++ b/include/iso15118/detail/d20/state/dc_charge_parameter_discovery.hpp @@ -5,12 +5,13 @@ #include #include #include +#include #include namespace iso15118::d20::state { message_20::DC_ChargeParameterDiscoveryResponse handle_request(const message_20::DC_ChargeParameterDiscoveryRequest& req, const d20::Session& session, - const d20::DcTransferLimits& dc_limits); + const d20::DcTransferLimits& dc_limits, d20::EVSessionInfo& out_ev_session_info); } // namespace iso15118::d20::state diff --git a/include/iso15118/session/feedback.hpp b/include/iso15118/session/feedback.hpp index ee05ffee..bb594830 100644 --- a/include/iso15118/session/feedback.hpp +++ b/include/iso15118/session/feedback.hpp @@ -9,7 +9,9 @@ #include #include +#include #include +#include #include namespace iso15118::session { @@ -37,16 +39,23 @@ struct DcMaximumLimits { float power{NAN}; }; -using PresentVoltage = message_20::datatypes::RationalNumber; +using PresentVoltage = dt::RationalNumber; using MeterInfoRequested = bool; using DcReqControlMode = std::variant< - message_20::datatypes::Scheduled_DC_CLReqControlMode, message_20::datatypes::BPT_Scheduled_DC_CLReqControlMode, - message_20::datatypes::Dynamic_DC_CLReqControlMode, message_20::datatypes::BPT_Dynamic_DC_CLReqControlMode>; + dt::Scheduled_DC_CLReqControlMode, dt::BPT_Scheduled_DC_CLReqControlMode, + dt::Dynamic_DC_CLReqControlMode, dt::BPT_Dynamic_DC_CLReqControlMode>; using DcChargeLoopReq = - std::variant; + std::variant; -using TransferLimits = std::variant; +// TODO(ioan): preparation for AC limits +using EVSE_TransferLimits = + std::variant; + +using EV_TransferLimits = + std::variant; +using EV_SEControlMode = + std::variant; struct Callbacks { std::function signal; @@ -58,7 +67,7 @@ struct Callbacks { std::function selected_protocol; std::function + const dt::MobilityNeedsMode&, const EVSE_TransferLimits&, const EV_TransferLimits&)> notify_ev_charging_needs; }; @@ -77,7 +86,8 @@ class Feedback { void selected_protocol(const std::string&) const; void notify_ev_charging_needs(const dt::ServiceCategory&, const dt::AcConnector&, const dt::ControlMode&, - const dt::MobilityNeedsMode&, const feedback::TransferLimits&) const; + const dt::MobilityNeedsMode&, const feedback::EVSE_TransferLimits&, + const feedback::EV_TransferLimits&) const; private: feedback::Callbacks callbacks; diff --git a/src/iso15118/d20/state/dc_charge_parameter_discovery.cpp b/src/iso15118/d20/state/dc_charge_parameter_discovery.cpp index db5ee104..f8ca6c3a 100644 --- a/src/iso15118/d20/state/dc_charge_parameter_discovery.cpp +++ b/src/iso15118/d20/state/dc_charge_parameter_discovery.cpp @@ -31,13 +31,7 @@ template <> void convert(DC_ModeRes& out, const d20::DcTransferLimits& in) { } template <> void convert(BPT_DC_ModeRes& out, const d20::DcTransferLimits& in) { - out.max_charge_power = in.charge_limits.power.max; - out.min_charge_power = in.charge_limits.power.min; - out.max_charge_current = in.charge_limits.current.max; - out.min_charge_current = in.charge_limits.current.min; - out.max_voltage = in.voltage.max; - out.min_voltage = in.voltage.min; - out.power_ramp_limit = in.power_ramp_limit; + convert(static_cast(out), in); if (in.discharge_limits.has_value()) { auto& discharge_limits = in.discharge_limits.value(); @@ -50,7 +44,7 @@ template <> void convert(BPT_DC_ModeRes& out, const d20::DcTransferLimits& in) { message_20::DC_ChargeParameterDiscoveryResponse handle_request(const message_20::DC_ChargeParameterDiscoveryRequest& req, const d20::Session& session, - const d20::DcTransferLimits& dc_limits) { + const d20::DcTransferLimits& dc_limits, EVSessionInfo& out_ev_session_info) { message_20::DC_ChargeParameterDiscoveryResponse res; @@ -65,6 +59,9 @@ handle_request(const message_20::DC_ChargeParameterDiscoveryRequest& req, const return response_with_code(res, dt::ResponseCode::FAILED_WrongChargeParameter); } + // Extract info from the EV + out_ev_session_info.ev_transfer_limits.emplace(std::get(req.transfer_mode)); + auto& mode = res.transfer_mode.emplace(); convert(mode, dc_limits); @@ -78,6 +75,9 @@ handle_request(const message_20::DC_ChargeParameterDiscoveryRequest& req, const return response_with_code(res, dt::ResponseCode::FAILED); } + // Extract info from the EV + out_ev_session_info.ev_transfer_limits.emplace(std::get(req.transfer_mode)); + auto& mode = res.transfer_mode.emplace(); convert(mode, dc_limits); @@ -119,8 +119,8 @@ Result DC_ChargeParameterDiscovery::feed(Event ev) { logf_info("Max charge current %fA", dt::from_RationalNumber(mode->max_charge_current)); logf_info("Max discharge current %fA", dt::from_RationalNumber(mode->max_discharge_current)); } - - const auto res = handle_request(*req, m_ctx.session, m_ctx.session_config.dc_limits); + + const auto res = handle_request(*req, m_ctx.session, m_ctx.session_config.dc_limits, m_ctx.session_ev_info); m_ctx.respond(res); diff --git a/src/iso15118/d20/state/schedule_exchange.cpp b/src/iso15118/d20/state/schedule_exchange.cpp index fcfbf8f7..dbed6630 100644 --- a/src/iso15118/d20/state/schedule_exchange.cpp +++ b/src/iso15118/d20/state/schedule_exchange.cpp @@ -144,12 +144,17 @@ Result ScheduleExchange::feed(Event ev) { } // TODO(ioan): prepare for AC transfer limits - session::feedback::TransferLimits limits = m_ctx.session_config.dc_limits; + const session::feedback::EVSE_TransferLimits& evse_limits = m_ctx.session_config.dc_limits; + const session::feedback::EV_TransferLimits& ev_limits = m_ctx.session_ev_info.ev_transfer_limits; + + // TODO: send and transform + const session::feedback::EV_SEControlMode control_mode = req->control_mode; // Send the charging feedback this->m_ctx.feedback.notify_ev_charging_needs(selected_energy_service, ac_connector, selected_services.selected_control_mode, - selected_services.selected_mobility_needs_mode, limits); + selected_services.selected_mobility_needs_mode, + evse_limits, ev_limits); const auto res = handle_request(*req, m_ctx.session, max_charge_power, dynamic_parameters); diff --git a/src/iso15118/session/feedback.cpp b/src/iso15118/session/feedback.cpp index db2c86c2..d8ae5281 100644 --- a/src/iso15118/session/feedback.cpp +++ b/src/iso15118/session/feedback.cpp @@ -40,9 +40,10 @@ void Feedback::selected_protocol(const std::string& selected_protocol) const { void Feedback::notify_ev_charging_needs(const dt::ServiceCategory& service_category, const dt::AcConnector& ac_connector, const dt::ControlMode& control_mode, const dt::MobilityNeedsMode& mobility_needs_mode, - const feedback::TransferLimits& limits) const { + const feedback::EVSE_TransferLimits& evse_limits, + const feedback::EV_TransferLimits& ev_limits) const { call_if_available(callbacks.notify_ev_charging_needs, service_category, ac_connector, control_mode, - mobility_needs_mode, limits); + mobility_needs_mode, evse_limits, ev_limits); } } // namespace iso15118::session diff --git a/test/iso15118/states/dc_charge_parameter_discovery.cpp b/test/iso15118/states/dc_charge_parameter_discovery.cpp index 8c5e1697..7bc9eaf1 100644 --- a/test/iso15118/states/dc_charge_parameter_discovery.cpp +++ b/test/iso15118/states/dc_charge_parameter_discovery.cpp @@ -3,6 +3,7 @@ #include #include +#include using namespace iso15118; @@ -43,7 +44,8 @@ SCENARIO("DC charge parameter discovery state handling") { req_out.max_voltage = {400, 0}; req_out.min_voltage = {0, 0}; - const auto res = d20::state::handle_request(req, d20::Session(), evse_setup.dc_limits); + d20::EVSessionInfo out_info; + const auto res = d20::state::handle_request(req, d20::Session(), evse_setup.dc_limits, out_info); THEN("ResponseCode: FAILED_UnknownSession, mandatory fields should be set") { REQUIRE(res.response_code == dt::ResponseCode::FAILED_UnknownSession); @@ -87,7 +89,8 @@ SCENARIO("DC charge parameter discovery state handling") { req_out.max_voltage = {400, 0}; req_out.min_voltage = {0, 0}; - const auto res = d20::state::handle_request(req, session, evse_setup.dc_limits); + d20::EVSessionInfo out_info; + const auto res = d20::state::handle_request(req, session, evse_setup.dc_limits, out_info); THEN("ResponseCode: FAILED_WrongChargeParameter, mandatory fields should be set") { REQUIRE(res.response_code == dt::ResponseCode::FAILED_WrongChargeParameter); @@ -107,6 +110,8 @@ SCENARIO("DC charge parameter discovery state handling") { REQUIRE(transfer_mode.min_voltage.value == 0); REQUIRE(transfer_mode.min_voltage.exponent == 0); REQUIRE(transfer_mode.power_ramp_limit.has_value() == false); + + REQUIRE(std::holds_alternative(out_info.ev_transfer_limits)); } } @@ -134,7 +139,8 @@ SCENARIO("DC charge parameter discovery state handling") { req_out.max_discharge_current = {25, 0}; req_out.min_discharge_current = {0, 0}; - const auto res = d20::state::handle_request(req, session, evse_setup.dc_limits); + d20::EVSessionInfo out_info; + const auto res = d20::state::handle_request(req, session, evse_setup.dc_limits, out_info); THEN("ResponseCode: FAILED_WrongChargeParameter, mandatory fields should be set") { REQUIRE(res.response_code == dt::ResponseCode::FAILED_WrongChargeParameter); @@ -184,7 +190,8 @@ SCENARIO("DC charge parameter discovery state handling") { req_out.max_voltage = {400, 0}; req_out.min_voltage = {0, 0}; - const auto res = d20::state::handle_request(req, session, dc_limits); + d20::EVSessionInfo out_info; + const auto res = d20::state::handle_request(req, session, dc_limits, out_info); THEN("ResponseCode: OK") { REQUIRE(res.response_code == dt::ResponseCode::OK); @@ -243,7 +250,8 @@ SCENARIO("DC charge parameter discovery state handling") { req_out.max_discharge_current = {25, 0}; req_out.min_discharge_current = {0, 0}; - const auto res = d20::state::handle_request(req, session, dc_limits); + d20::EVSessionInfo out_info; + const auto res = d20::state::handle_request(req, session, dc_limits, out_info); THEN("ResponseCode: OK") { REQUIRE(res.response_code == dt::ResponseCode::OK); @@ -271,6 +279,8 @@ SCENARIO("DC charge parameter discovery state handling") { REQUIRE(transfer_mode.max_discharge_current.exponent == 0); REQUIRE(transfer_mode.min_discharge_current.value == 0); REQUIRE(transfer_mode.min_discharge_current.exponent == 0); + + REQUIRE(std::holds_alternative(out_info.ev_transfer_limits)); } } @@ -303,7 +313,8 @@ SCENARIO("DC charge parameter discovery state handling") { req_out.max_discharge_current = {25, 0}; req_out.min_discharge_current = {0, 0}; - const auto res = d20::state::handle_request(req, session, dc_limits); + d20::EVSessionInfo out_info{}; + const auto res = d20::state::handle_request(req, session, dc_limits, out_info); THEN("ResponseCode: FAILED, mandatory fields should be set") { REQUIRE(res.response_code == dt::ResponseCode::FAILED); @@ -323,6 +334,8 @@ SCENARIO("DC charge parameter discovery state handling") { REQUIRE(transfer_mode.min_voltage.value == 0); REQUIRE(transfer_mode.min_voltage.exponent == 0); REQUIRE(transfer_mode.power_ramp_limit.has_value() == false); + + REQUIRE(std::holds_alternative(out_info.ev_transfer_limits)); } } From 82c11b567128e48f68dbe5f1c1395795a3dbc3e6 Mon Sep 17 00:00:00 2001 From: AssemblyJohn Date: Fri, 21 Feb 2025 13:46:10 +0200 Subject: [PATCH 04/12] Format Signed-off-by: AssemblyJohn --- include/iso15118/d20/config.hpp | 4 ++-- include/iso15118/d20/context.hpp | 2 +- include/iso15118/d20/ev_session_info.hpp | 2 +- .../state/dc_charge_parameter_discovery.hpp | 2 +- include/iso15118/session/feedback.hpp | 21 +++++++------------ .../state/dc_charge_parameter_discovery.cpp | 4 ++-- src/iso15118/d20/state/schedule_exchange.cpp | 9 ++++---- .../states/dc_charge_parameter_discovery.cpp | 2 +- 8 files changed, 20 insertions(+), 26 deletions(-) diff --git a/include/iso15118/d20/config.hpp b/include/iso15118/d20/config.hpp index 2b072322..e3dd03a8 100644 --- a/include/iso15118/d20/config.hpp +++ b/include/iso15118/d20/config.hpp @@ -42,9 +42,9 @@ struct SessionConfig { std::vector internet_parameter_list; std::vector parking_parameter_list; - + // I have a deja vu with this DC limits, shouldn't they be called dc_evse_limits? - DcTransferLimits dc_limits; + DcTransferLimits dc_limits; std::vector supported_control_mobility_modes; }; diff --git a/include/iso15118/d20/context.hpp b/include/iso15118/d20/context.hpp index da21186c..4a32ebcb 100644 --- a/include/iso15118/d20/context.hpp +++ b/include/iso15118/d20/context.hpp @@ -14,8 +14,8 @@ #include "config.hpp" #include "control_event.hpp" -#include "session.hpp" #include "ev_session_info.hpp" +#include "session.hpp" namespace iso15118::d20 { diff --git a/include/iso15118/d20/ev_session_info.hpp b/include/iso15118/d20/ev_session_info.hpp index 6fed8fdc..300b6e0b 100644 --- a/include/iso15118/d20/ev_session_info.hpp +++ b/include/iso15118/d20/ev_session_info.hpp @@ -7,7 +7,7 @@ namespace iso15118::d20 { // Holds information reported by the EV -struct EVSessionInfo { +struct EVSessionInfo { session::feedback::EV_TransferLimits ev_transfer_limits; session::feedback::EV_SEControlMode ev_control_mode; }; diff --git a/include/iso15118/detail/d20/state/dc_charge_parameter_discovery.hpp b/include/iso15118/detail/d20/state/dc_charge_parameter_discovery.hpp index 82ba4ab9..d88e9f8a 100644 --- a/include/iso15118/detail/d20/state/dc_charge_parameter_discovery.hpp +++ b/include/iso15118/detail/d20/state/dc_charge_parameter_discovery.hpp @@ -3,9 +3,9 @@ #pragma once #include +#include #include #include -#include #include namespace iso15118::d20::state { diff --git a/include/iso15118/session/feedback.hpp b/include/iso15118/session/feedback.hpp index bb594830..170d5aba 100644 --- a/include/iso15118/session/feedback.hpp +++ b/include/iso15118/session/feedback.hpp @@ -9,9 +9,9 @@ #include #include -#include #include #include +#include #include namespace iso15118::session { @@ -41,21 +41,16 @@ struct DcMaximumLimits { using PresentVoltage = dt::RationalNumber; using MeterInfoRequested = bool; -using DcReqControlMode = std::variant< - dt::Scheduled_DC_CLReqControlMode, dt::BPT_Scheduled_DC_CLReqControlMode, - dt::Dynamic_DC_CLReqControlMode, dt::BPT_Dynamic_DC_CLReqControlMode>; +using DcReqControlMode = std::variant; -using DcChargeLoopReq = - std::variant; +using DcChargeLoopReq = std::variant; // TODO(ioan): preparation for AC limits -using EVSE_TransferLimits = - std::variant; +using EVSE_TransferLimits = std::variant; -using EV_TransferLimits = - std::variant; -using EV_SEControlMode = - std::variant; +using EV_TransferLimits = std::variant; +using EV_SEControlMode = std::variant; struct Callbacks { std::function signal; @@ -86,7 +81,7 @@ class Feedback { void selected_protocol(const std::string&) const; void notify_ev_charging_needs(const dt::ServiceCategory&, const dt::AcConnector&, const dt::ControlMode&, - const dt::MobilityNeedsMode&, const feedback::EVSE_TransferLimits&, + const dt::MobilityNeedsMode&, const feedback::EVSE_TransferLimits&, const feedback::EV_TransferLimits&) const; private: diff --git a/src/iso15118/d20/state/dc_charge_parameter_discovery.cpp b/src/iso15118/d20/state/dc_charge_parameter_discovery.cpp index f8ca6c3a..5045c62a 100644 --- a/src/iso15118/d20/state/dc_charge_parameter_discovery.cpp +++ b/src/iso15118/d20/state/dc_charge_parameter_discovery.cpp @@ -76,7 +76,7 @@ handle_request(const message_20::DC_ChargeParameterDiscoveryRequest& req, const } // Extract info from the EV - out_ev_session_info.ev_transfer_limits.emplace(std::get(req.transfer_mode)); + out_ev_session_info.ev_transfer_limits.emplace(std::get(req.transfer_mode)); auto& mode = res.transfer_mode.emplace(); convert(mode, dc_limits); @@ -119,7 +119,7 @@ Result DC_ChargeParameterDiscovery::feed(Event ev) { logf_info("Max charge current %fA", dt::from_RationalNumber(mode->max_charge_current)); logf_info("Max discharge current %fA", dt::from_RationalNumber(mode->max_discharge_current)); } - + const auto res = handle_request(*req, m_ctx.session, m_ctx.session_config.dc_limits, m_ctx.session_ev_info); m_ctx.respond(res); diff --git a/src/iso15118/d20/state/schedule_exchange.cpp b/src/iso15118/d20/state/schedule_exchange.cpp index dbed6630..fe59903b 100644 --- a/src/iso15118/d20/state/schedule_exchange.cpp +++ b/src/iso15118/d20/state/schedule_exchange.cpp @@ -147,14 +147,13 @@ Result ScheduleExchange::feed(Event ev) { const session::feedback::EVSE_TransferLimits& evse_limits = m_ctx.session_config.dc_limits; const session::feedback::EV_TransferLimits& ev_limits = m_ctx.session_ev_info.ev_transfer_limits; - // TODO: send and transform + // TODO: send and transform const session::feedback::EV_SEControlMode control_mode = req->control_mode; // Send the charging feedback - this->m_ctx.feedback.notify_ev_charging_needs(selected_energy_service, ac_connector, - selected_services.selected_control_mode, - selected_services.selected_mobility_needs_mode, - evse_limits, ev_limits); + this->m_ctx.feedback.notify_ev_charging_needs( + selected_energy_service, ac_connector, selected_services.selected_control_mode, + selected_services.selected_mobility_needs_mode, evse_limits, ev_limits); const auto res = handle_request(*req, m_ctx.session, max_charge_power, dynamic_parameters); diff --git a/test/iso15118/states/dc_charge_parameter_discovery.cpp b/test/iso15118/states/dc_charge_parameter_discovery.cpp index 7bc9eaf1..47589272 100644 --- a/test/iso15118/states/dc_charge_parameter_discovery.cpp +++ b/test/iso15118/states/dc_charge_parameter_discovery.cpp @@ -2,8 +2,8 @@ // Copyright 2023 Pionix GmbH and Contributors to EVerest #include -#include #include +#include using namespace iso15118; From 2680665b4db4318c3a33d26a9f86e850479f4b31 Mon Sep 17 00:00:00 2001 From: AssemblyJohn Date: Mon, 24 Feb 2025 13:33:36 +0200 Subject: [PATCH 05/12] Added EV Control Mode Signed-off-by: AssemblyJohn --- include/iso15118/session/feedback.hpp | 5 +++-- src/iso15118/d20/state/schedule_exchange.cpp | 2 +- src/iso15118/session/feedback.cpp | 5 +++-- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/include/iso15118/session/feedback.hpp b/include/iso15118/session/feedback.hpp index 170d5aba..3f557e11 100644 --- a/include/iso15118/session/feedback.hpp +++ b/include/iso15118/session/feedback.hpp @@ -62,7 +62,8 @@ struct Callbacks { std::function selected_protocol; std::function + const dt::MobilityNeedsMode&, const EVSE_TransferLimits&, const EV_TransferLimits&, + const EV_SEControlMode&)> notify_ev_charging_needs; }; @@ -82,7 +83,7 @@ class Feedback { void notify_ev_charging_needs(const dt::ServiceCategory&, const dt::AcConnector&, const dt::ControlMode&, const dt::MobilityNeedsMode&, const feedback::EVSE_TransferLimits&, - const feedback::EV_TransferLimits&) const; + const feedback::EV_TransferLimits&, const feedback::EV_SEControlMode&) const; private: feedback::Callbacks callbacks; diff --git a/src/iso15118/d20/state/schedule_exchange.cpp b/src/iso15118/d20/state/schedule_exchange.cpp index fe59903b..37d2a7bd 100644 --- a/src/iso15118/d20/state/schedule_exchange.cpp +++ b/src/iso15118/d20/state/schedule_exchange.cpp @@ -153,7 +153,7 @@ Result ScheduleExchange::feed(Event ev) { // Send the charging feedback this->m_ctx.feedback.notify_ev_charging_needs( selected_energy_service, ac_connector, selected_services.selected_control_mode, - selected_services.selected_mobility_needs_mode, evse_limits, ev_limits); + selected_services.selected_mobility_needs_mode, evse_limits, ev_limits, control_mode); const auto res = handle_request(*req, m_ctx.session, max_charge_power, dynamic_parameters); diff --git a/src/iso15118/session/feedback.cpp b/src/iso15118/session/feedback.cpp index d8ae5281..60845ad0 100644 --- a/src/iso15118/session/feedback.cpp +++ b/src/iso15118/session/feedback.cpp @@ -41,9 +41,10 @@ void Feedback::notify_ev_charging_needs(const dt::ServiceCategory& service_categ const dt::AcConnector& ac_connector, const dt::ControlMode& control_mode, const dt::MobilityNeedsMode& mobility_needs_mode, const feedback::EVSE_TransferLimits& evse_limits, - const feedback::EV_TransferLimits& ev_limits) const { + const feedback::EV_TransferLimits& ev_limits, + const feedback::EV_SEControlMode& ev_control_mode) const { call_if_available(callbacks.notify_ev_charging_needs, service_category, ac_connector, control_mode, - mobility_needs_mode, evse_limits, ev_limits); + mobility_needs_mode, evse_limits, ev_limits, ev_control_mode); } } // namespace iso15118::session From 69f2d18bb6e607c8d09788d713b974248315b173 Mon Sep 17 00:00:00 2001 From: AssemblyJohn Date: Tue, 11 Mar 2025 10:47:45 +0200 Subject: [PATCH 06/12] Fix todos Signed-off-by: AssemblyJohn --- include/iso15118/d20/config.hpp | 1 - include/iso15118/message/common_types.hpp | 1 - 2 files changed, 2 deletions(-) diff --git a/include/iso15118/d20/config.hpp b/include/iso15118/d20/config.hpp index e3dd03a8..65b82fdd 100644 --- a/include/iso15118/d20/config.hpp +++ b/include/iso15118/d20/config.hpp @@ -43,7 +43,6 @@ struct SessionConfig { std::vector internet_parameter_list; std::vector parking_parameter_list; - // I have a deja vu with this DC limits, shouldn't they be called dc_evse_limits? DcTransferLimits dc_limits; std::vector supported_control_mobility_modes; diff --git a/include/iso15118/message/common_types.hpp b/include/iso15118/message/common_types.hpp index e8d4fa50..89fae9fe 100644 --- a/include/iso15118/message/common_types.hpp +++ b/include/iso15118/message/common_types.hpp @@ -115,7 +115,6 @@ enum class ChargingSession { enum class AcConnector { SinglePhase = 1, - // TODO(ioan): two phase missing? ThreePhase = 3, }; enum class DcConnector { From 29428ef27378f80c53ad808ca452f1e61c097632 Mon Sep 17 00:00:00 2001 From: AssemblyJohn Date: Wed, 12 Mar 2025 09:33:41 +0200 Subject: [PATCH 07/12] Updated for comments Signed-off-by: AssemblyJohn --- include/iso15118/d20/ev_session_info.hpp | 2 +- include/iso15118/session/feedback.hpp | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/include/iso15118/d20/ev_session_info.hpp b/include/iso15118/d20/ev_session_info.hpp index 300b6e0b..982c3f5e 100644 --- a/include/iso15118/d20/ev_session_info.hpp +++ b/include/iso15118/d20/ev_session_info.hpp @@ -12,4 +12,4 @@ struct EVSessionInfo { session::feedback::EV_SEControlMode ev_control_mode; }; -} // namespace iso15118::d20 \ No newline at end of file +} // namespace iso15118::d20 diff --git a/include/iso15118/session/feedback.hpp b/include/iso15118/session/feedback.hpp index 3f557e11..aef1e117 100644 --- a/include/iso15118/session/feedback.hpp +++ b/include/iso15118/session/feedback.hpp @@ -47,10 +47,10 @@ using DcReqControlMode = std::variant; // TODO(ioan): preparation for AC limits -using EVSE_TransferLimits = std::variant; +using EvseTransferLimits = std::variant; -using EV_TransferLimits = std::variant; -using EV_SEControlMode = std::variant; +using EvTransferLimits = std::variant; +using EvSEControlMode = std::variant; struct Callbacks { std::function signal; @@ -61,9 +61,9 @@ struct Callbacks { std::function evccid; std::function selected_protocol; - std::function + std::function&, const dt::ControlMode&, + const dt::MobilityNeedsMode&, const EvseTransferLimits&, const EvTransferLimits&, + const EvSEControlMode&)> notify_ev_charging_needs; }; @@ -81,9 +81,9 @@ class Feedback { void evcc_id(const std::string&) const; void selected_protocol(const std::string&) const; - void notify_ev_charging_needs(const dt::ServiceCategory&, const dt::AcConnector&, const dt::ControlMode&, - const dt::MobilityNeedsMode&, const feedback::EVSE_TransferLimits&, - const feedback::EV_TransferLimits&, const feedback::EV_SEControlMode&) const; + void notify_ev_charging_needs(const dt::ServiceCategory&, const std::optional&, const dt::ControlMode&, + const dt::MobilityNeedsMode&, const feedback::EvseTransferLimits&, + const feedback::EvTransferLimits&, const feedback::EvSEControlMode&) const; private: feedback::Callbacks callbacks; From f43edd527c7de4bad8eb08114267eb3f357a69bc Mon Sep 17 00:00:00 2001 From: AssemblyJohn Date: Wed, 12 Mar 2025 09:49:20 +0200 Subject: [PATCH 08/12] Udpated for comments Signed-off-by: AssemblyJohn --- include/iso15118/d20/ev_session_info.hpp | 4 ++-- .../state/dc_charge_parameter_discovery.hpp | 2 +- include/iso15118/session/feedback.hpp | 7 +++--- .../state/dc_charge_parameter_discovery.cpp | 16 ++++++------- src/iso15118/d20/state/schedule_exchange.cpp | 6 ++--- src/iso15118/session/feedback.cpp | 9 +++---- .../states/dc_charge_parameter_discovery.cpp | 24 +++++-------------- 7 files changed, 29 insertions(+), 39 deletions(-) diff --git a/include/iso15118/d20/ev_session_info.hpp b/include/iso15118/d20/ev_session_info.hpp index 982c3f5e..8a565784 100644 --- a/include/iso15118/d20/ev_session_info.hpp +++ b/include/iso15118/d20/ev_session_info.hpp @@ -8,8 +8,8 @@ namespace iso15118::d20 { // Holds information reported by the EV struct EVSessionInfo { - session::feedback::EV_TransferLimits ev_transfer_limits; - session::feedback::EV_SEControlMode ev_control_mode; + session::feedback::EvTransferLimits ev_transfer_limits; + session::feedback::EvSEControlMode ev_control_mode; }; } // namespace iso15118::d20 diff --git a/include/iso15118/detail/d20/state/dc_charge_parameter_discovery.hpp b/include/iso15118/detail/d20/state/dc_charge_parameter_discovery.hpp index d88e9f8a..c002ddfa 100644 --- a/include/iso15118/detail/d20/state/dc_charge_parameter_discovery.hpp +++ b/include/iso15118/detail/d20/state/dc_charge_parameter_discovery.hpp @@ -12,6 +12,6 @@ namespace iso15118::d20::state { message_20::DC_ChargeParameterDiscoveryResponse handle_request(const message_20::DC_ChargeParameterDiscoveryRequest& req, const d20::Session& session, - const d20::DcTransferLimits& dc_limits, d20::EVSessionInfo& out_ev_session_info); + const d20::DcTransferLimits& dc_limit); } // namespace iso15118::d20::state diff --git a/include/iso15118/session/feedback.hpp b/include/iso15118/session/feedback.hpp index aef1e117..ff1b9055 100644 --- a/include/iso15118/session/feedback.hpp +++ b/include/iso15118/session/feedback.hpp @@ -81,9 +81,10 @@ class Feedback { void evcc_id(const std::string&) const; void selected_protocol(const std::string&) const; - void notify_ev_charging_needs(const dt::ServiceCategory&, const std::optional&, const dt::ControlMode&, - const dt::MobilityNeedsMode&, const feedback::EvseTransferLimits&, - const feedback::EvTransferLimits&, const feedback::EvSEControlMode&) const; + void notify_ev_charging_needs(const dt::ServiceCategory&, const std::optional&, + const dt::ControlMode&, const dt::MobilityNeedsMode&, + const feedback::EvseTransferLimits&, const feedback::EvTransferLimits&, + const feedback::EvSEControlMode&) const; private: feedback::Callbacks callbacks; diff --git a/src/iso15118/d20/state/dc_charge_parameter_discovery.cpp b/src/iso15118/d20/state/dc_charge_parameter_discovery.cpp index 5045c62a..2941a99a 100644 --- a/src/iso15118/d20/state/dc_charge_parameter_discovery.cpp +++ b/src/iso15118/d20/state/dc_charge_parameter_discovery.cpp @@ -44,7 +44,7 @@ template <> void convert(BPT_DC_ModeRes& out, const d20::DcTransferLimits& in) { message_20::DC_ChargeParameterDiscoveryResponse handle_request(const message_20::DC_ChargeParameterDiscoveryRequest& req, const d20::Session& session, - const d20::DcTransferLimits& dc_limits, EVSessionInfo& out_ev_session_info) { + const d20::DcTransferLimits& dc_limits) { message_20::DC_ChargeParameterDiscoveryResponse res; @@ -59,9 +59,6 @@ handle_request(const message_20::DC_ChargeParameterDiscoveryRequest& req, const return response_with_code(res, dt::ResponseCode::FAILED_WrongChargeParameter); } - // Extract info from the EV - out_ev_session_info.ev_transfer_limits.emplace(std::get(req.transfer_mode)); - auto& mode = res.transfer_mode.emplace(); convert(mode, dc_limits); @@ -75,9 +72,6 @@ handle_request(const message_20::DC_ChargeParameterDiscoveryRequest& req, const return response_with_code(res, dt::ResponseCode::FAILED); } - // Extract info from the EV - out_ev_session_info.ev_transfer_limits.emplace(std::get(req.transfer_mode)); - auto& mode = res.transfer_mode.emplace(); convert(mode, dc_limits); @@ -111,6 +105,9 @@ Result DC_ChargeParameterDiscovery::feed(Event ev) { dc_max_limits.power = dt::from_RationalNumber(mode->max_charge_power); logf_info("Max charge current %fA", dt::from_RationalNumber(mode->max_charge_current)); + + // Set EV transfer limits + m_ctx.session_ev_info.ev_transfer_limits.emplace(*mode); } else if (const auto* mode = std::get_if(&req->transfer_mode)) { dc_max_limits.current = dt::from_RationalNumber(mode->max_charge_current); dc_max_limits.voltage = dt::from_RationalNumber(mode->max_voltage); @@ -118,9 +115,12 @@ Result DC_ChargeParameterDiscovery::feed(Event ev) { logf_info("Max charge current %fA", dt::from_RationalNumber(mode->max_charge_current)); logf_info("Max discharge current %fA", dt::from_RationalNumber(mode->max_discharge_current)); + + // Set EV transfer limits + m_ctx.session_ev_info.ev_transfer_limits.emplace(*mode); } - const auto res = handle_request(*req, m_ctx.session, m_ctx.session_config.dc_limits, m_ctx.session_ev_info); + const auto res = handle_request(*req, m_ctx.session, m_ctx.session_config.dc_limits); m_ctx.respond(res); diff --git a/src/iso15118/d20/state/schedule_exchange.cpp b/src/iso15118/d20/state/schedule_exchange.cpp index 37d2a7bd..7a68bd1d 100644 --- a/src/iso15118/d20/state/schedule_exchange.cpp +++ b/src/iso15118/d20/state/schedule_exchange.cpp @@ -144,11 +144,11 @@ Result ScheduleExchange::feed(Event ev) { } // TODO(ioan): prepare for AC transfer limits - const session::feedback::EVSE_TransferLimits& evse_limits = m_ctx.session_config.dc_limits; - const session::feedback::EV_TransferLimits& ev_limits = m_ctx.session_ev_info.ev_transfer_limits; + const session::feedback::EvseTransferLimits& evse_limits = m_ctx.session_config.dc_limits; + const session::feedback::EvTransferLimits& ev_limits = m_ctx.session_ev_info.ev_transfer_limits; // TODO: send and transform - const session::feedback::EV_SEControlMode control_mode = req->control_mode; + const session::feedback::EvSEControlMode control_mode = req->control_mode; // Send the charging feedback this->m_ctx.feedback.notify_ev_charging_needs( diff --git a/src/iso15118/session/feedback.cpp b/src/iso15118/session/feedback.cpp index 60845ad0..8d45f8ba 100644 --- a/src/iso15118/session/feedback.cpp +++ b/src/iso15118/session/feedback.cpp @@ -38,11 +38,12 @@ void Feedback::selected_protocol(const std::string& selected_protocol) const { } void Feedback::notify_ev_charging_needs(const dt::ServiceCategory& service_category, - const dt::AcConnector& ac_connector, const dt::ControlMode& control_mode, + const std::optional& ac_connector, + const dt::ControlMode& control_mode, const dt::MobilityNeedsMode& mobility_needs_mode, - const feedback::EVSE_TransferLimits& evse_limits, - const feedback::EV_TransferLimits& ev_limits, - const feedback::EV_SEControlMode& ev_control_mode) const { + const feedback::EvseTransferLimits& evse_limits, + const feedback::EvTransferLimits& ev_limits, + const feedback::EvSEControlMode& ev_control_mode) const { call_if_available(callbacks.notify_ev_charging_needs, service_category, ac_connector, control_mode, mobility_needs_mode, evse_limits, ev_limits, ev_control_mode); } diff --git a/test/iso15118/states/dc_charge_parameter_discovery.cpp b/test/iso15118/states/dc_charge_parameter_discovery.cpp index 47589272..49494720 100644 --- a/test/iso15118/states/dc_charge_parameter_discovery.cpp +++ b/test/iso15118/states/dc_charge_parameter_discovery.cpp @@ -44,8 +44,7 @@ SCENARIO("DC charge parameter discovery state handling") { req_out.max_voltage = {400, 0}; req_out.min_voltage = {0, 0}; - d20::EVSessionInfo out_info; - const auto res = d20::state::handle_request(req, d20::Session(), evse_setup.dc_limits, out_info); + const auto res = d20::state::handle_request(req, d20::Session(), evse_setup.dc_limits); THEN("ResponseCode: FAILED_UnknownSession, mandatory fields should be set") { REQUIRE(res.response_code == dt::ResponseCode::FAILED_UnknownSession); @@ -89,8 +88,7 @@ SCENARIO("DC charge parameter discovery state handling") { req_out.max_voltage = {400, 0}; req_out.min_voltage = {0, 0}; - d20::EVSessionInfo out_info; - const auto res = d20::state::handle_request(req, session, evse_setup.dc_limits, out_info); + const auto res = d20::state::handle_request(req, session, evse_setup.dc_limits); THEN("ResponseCode: FAILED_WrongChargeParameter, mandatory fields should be set") { REQUIRE(res.response_code == dt::ResponseCode::FAILED_WrongChargeParameter); @@ -110,8 +108,6 @@ SCENARIO("DC charge parameter discovery state handling") { REQUIRE(transfer_mode.min_voltage.value == 0); REQUIRE(transfer_mode.min_voltage.exponent == 0); REQUIRE(transfer_mode.power_ramp_limit.has_value() == false); - - REQUIRE(std::holds_alternative(out_info.ev_transfer_limits)); } } @@ -139,8 +135,7 @@ SCENARIO("DC charge parameter discovery state handling") { req_out.max_discharge_current = {25, 0}; req_out.min_discharge_current = {0, 0}; - d20::EVSessionInfo out_info; - const auto res = d20::state::handle_request(req, session, evse_setup.dc_limits, out_info); + const auto res = d20::state::handle_request(req, session, evse_setup.dc_limits); THEN("ResponseCode: FAILED_WrongChargeParameter, mandatory fields should be set") { REQUIRE(res.response_code == dt::ResponseCode::FAILED_WrongChargeParameter); @@ -190,8 +185,7 @@ SCENARIO("DC charge parameter discovery state handling") { req_out.max_voltage = {400, 0}; req_out.min_voltage = {0, 0}; - d20::EVSessionInfo out_info; - const auto res = d20::state::handle_request(req, session, dc_limits, out_info); + const auto res = d20::state::handle_request(req, session, dc_limits); THEN("ResponseCode: OK") { REQUIRE(res.response_code == dt::ResponseCode::OK); @@ -250,8 +244,7 @@ SCENARIO("DC charge parameter discovery state handling") { req_out.max_discharge_current = {25, 0}; req_out.min_discharge_current = {0, 0}; - d20::EVSessionInfo out_info; - const auto res = d20::state::handle_request(req, session, dc_limits, out_info); + const auto res = d20::state::handle_request(req, session, dc_limits); THEN("ResponseCode: OK") { REQUIRE(res.response_code == dt::ResponseCode::OK); @@ -279,8 +272,6 @@ SCENARIO("DC charge parameter discovery state handling") { REQUIRE(transfer_mode.max_discharge_current.exponent == 0); REQUIRE(transfer_mode.min_discharge_current.value == 0); REQUIRE(transfer_mode.min_discharge_current.exponent == 0); - - REQUIRE(std::holds_alternative(out_info.ev_transfer_limits)); } } @@ -313,8 +304,7 @@ SCENARIO("DC charge parameter discovery state handling") { req_out.max_discharge_current = {25, 0}; req_out.min_discharge_current = {0, 0}; - d20::EVSessionInfo out_info{}; - const auto res = d20::state::handle_request(req, session, dc_limits, out_info); + const auto res = d20::state::handle_request(req, session, dc_limits); THEN("ResponseCode: FAILED, mandatory fields should be set") { REQUIRE(res.response_code == dt::ResponseCode::FAILED); @@ -334,8 +324,6 @@ SCENARIO("DC charge parameter discovery state handling") { REQUIRE(transfer_mode.min_voltage.value == 0); REQUIRE(transfer_mode.min_voltage.exponent == 0); REQUIRE(transfer_mode.power_ramp_limit.has_value() == false); - - REQUIRE(std::holds_alternative(out_info.ev_transfer_limits)); } } From 851e409d9bcfadb62e9da9bb4990e1eb63e4fd3d Mon Sep 17 00:00:00 2001 From: AssemblyJohn Date: Wed, 12 Mar 2025 14:48:08 +0200 Subject: [PATCH 09/12] Code comments Signed-off-by: AssemblyJohn --- src/iso15118/d20/state/schedule_exchange.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/iso15118/d20/state/schedule_exchange.cpp b/src/iso15118/d20/state/schedule_exchange.cpp index 7a68bd1d..bfc53b83 100644 --- a/src/iso15118/d20/state/schedule_exchange.cpp +++ b/src/iso15118/d20/state/schedule_exchange.cpp @@ -147,11 +147,10 @@ Result ScheduleExchange::feed(Event ev) { const session::feedback::EvseTransferLimits& evse_limits = m_ctx.session_config.dc_limits; const session::feedback::EvTransferLimits& ev_limits = m_ctx.session_ev_info.ev_transfer_limits; - // TODO: send and transform - const session::feedback::EvSEControlMode control_mode = req->control_mode; + const auto& control_mode = req->control_mode; // Send the charging feedback - this->m_ctx.feedback.notify_ev_charging_needs( + m_ctx.feedback.notify_ev_charging_needs( selected_energy_service, ac_connector, selected_services.selected_control_mode, selected_services.selected_mobility_needs_mode, evse_limits, ev_limits, control_mode); From d8b23bf890675eda74b9a25dfe2a0fe318c7e974 Mon Sep 17 00:00:00 2001 From: AssemblyJohn Date: Wed, 12 Mar 2025 16:50:39 +0200 Subject: [PATCH 10/12] Updated for comments Signed-off-by: AssemblyJohn --- .../iso15118/detail/d20/state/dc_charge_parameter_discovery.hpp | 2 +- test/iso15118/states/dc_charge_parameter_discovery.cpp | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/include/iso15118/detail/d20/state/dc_charge_parameter_discovery.hpp b/include/iso15118/detail/d20/state/dc_charge_parameter_discovery.hpp index c002ddfa..a175d54a 100644 --- a/include/iso15118/detail/d20/state/dc_charge_parameter_discovery.hpp +++ b/include/iso15118/detail/d20/state/dc_charge_parameter_discovery.hpp @@ -12,6 +12,6 @@ namespace iso15118::d20::state { message_20::DC_ChargeParameterDiscoveryResponse handle_request(const message_20::DC_ChargeParameterDiscoveryRequest& req, const d20::Session& session, - const d20::DcTransferLimits& dc_limit); + const d20::DcTransferLimits& dc_limits); } // namespace iso15118::d20::state diff --git a/test/iso15118/states/dc_charge_parameter_discovery.cpp b/test/iso15118/states/dc_charge_parameter_discovery.cpp index 49494720..8c5e1697 100644 --- a/test/iso15118/states/dc_charge_parameter_discovery.cpp +++ b/test/iso15118/states/dc_charge_parameter_discovery.cpp @@ -2,7 +2,6 @@ // Copyright 2023 Pionix GmbH and Contributors to EVerest #include -#include #include using namespace iso15118; From 192f29435f1fe5bfa1715a1f5c49d2034c455b19 Mon Sep 17 00:00:00 2001 From: AssemblyJohn Date: Thu, 13 Mar 2025 10:15:11 +0200 Subject: [PATCH 11/12] Comments Signed-off-by: AssemblyJohn --- .../iso15118/detail/d20/state/dc_charge_parameter_discovery.hpp | 1 - src/iso15118/d20/state/schedule_exchange.cpp | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/include/iso15118/detail/d20/state/dc_charge_parameter_discovery.hpp b/include/iso15118/detail/d20/state/dc_charge_parameter_discovery.hpp index a175d54a..a2d3333a 100644 --- a/include/iso15118/detail/d20/state/dc_charge_parameter_discovery.hpp +++ b/include/iso15118/detail/d20/state/dc_charge_parameter_discovery.hpp @@ -3,7 +3,6 @@ #pragma once #include -#include #include #include #include diff --git a/src/iso15118/d20/state/schedule_exchange.cpp b/src/iso15118/d20/state/schedule_exchange.cpp index bfc53b83..25d16731 100644 --- a/src/iso15118/d20/state/schedule_exchange.cpp +++ b/src/iso15118/d20/state/schedule_exchange.cpp @@ -138,7 +138,7 @@ Result ScheduleExchange::feed(Event ev) { // We will pass the raw data to the listener, the // listener will construct the full required type - dt::AcConnector ac_connector = dt::AcConnector::SinglePhase; + std::optional ac_connector{}; if (std::holds_alternative(selected_services.selected_connector)) { ac_connector = std::get(selected_services.selected_connector); } From 24e82cf4d0a0e0db15c9e0d08356c7b335ba111c Mon Sep 17 00:00:00 2001 From: AssemblyJohn Date: Mon, 17 Mar 2025 11:28:39 +0200 Subject: [PATCH 12/12] Bump version Signed-off-by: AssemblyJohn --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 32235805..c6f3823e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,7 @@ cmake_minimum_required(VERSION 3.14) project(iso15118 - VERSION 0.5.0 + VERSION 0.5.1 DESCRIPTION "iso15118 library suite" LANGUAGES CXX C )