Skip to content

Commit c102e2e

Browse files
author
Coury Richards
committed
updated: check for open transaction on an evse
Signed-off-by: Coury Richards <146002925+couryrr-afs@users.noreply.github.com>
1 parent cf3887a commit c102e2e

File tree

7 files changed

+224
-62
lines changed

7 files changed

+224
-62
lines changed

include/ocpp/v201/charge_point.hpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -262,11 +262,11 @@ class ChargePointInterface {
262262
/// \brief Notifies the ChargePoint that an external limit has been cleared.
263263
/// This shall send a ClearedChargingLimitRequest when called.
264264
// This may send TransactionEventRequest if the \p percentage_delta is greater than our LimitChangeSignificance.
265-
/// \param evse_id if provided checks for transactions on the provided evse
266265
/// \param percentage_delta the percent changed from the existing limits
267266
/// \param source the source of the external limit
268-
virtual void on_external_limit_cleared(std::optional<int32_t> evse_id, double percentage_delta,
269-
ChargingLimitSourceEnum source) = 0;
267+
/// \param evse_id if provided checks for transactions on the provided evse
268+
virtual void on_external_limit_cleared(double percentage_delta, ChargingLimitSourceEnum source,
269+
std::optional<int32_t> evse_id) = 0;
270270

271271
/// \brief Data transfer mechanism initiated by charger
272272
/// \param vendorId
@@ -900,8 +900,8 @@ class ChargePoint : public ChargePointInterface, private ocpp::ChargingStationBa
900900
double percentage_delta, ChargingLimitSourceEnum source,
901901
std::optional<int32_t> evse_id) override;
902902

903-
void on_external_limit_cleared(std::optional<int32_t> evse_id, double percentage_delta,
904-
ChargingLimitSourceEnum source) override;
903+
void on_external_limit_cleared(double percentage_delta, ChargingLimitSourceEnum source,
904+
std::optional<int32_t> evse_id) override;
905905

906906
std::optional<DataTransferResponse> data_transfer_req(const CiString<255>& vendorId,
907907
const std::optional<CiString<50>>& messageId,

include/ocpp/v201/smart_charging.hpp

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -126,9 +126,9 @@ class SmartChargingHandlerInterface {
126126
double percentage_delta, ChargingLimitSourceEnum source,
127127
std::optional<int32_t> evse_id) const = 0;
128128

129-
virtual std::pair<ClearedChargingLimitRequest, std::vector<TransactionEventRequest>>
130-
handle_external_limit_cleared(std::optional<int32_t> evse_id, double percentage_delta,
131-
ChargingLimitSourceEnum source) const = 0;
129+
virtual std::optional<std::pair<ClearedChargingLimitRequest, std::vector<TransactionEventRequest>>>
130+
handle_external_limit_cleared(double percentage_delta, ChargingLimitSourceEnum source,
131+
std::optional<int32_t> evse_id) const = 0;
132132
};
133133

134134
/// \brief This class handles and maintains incoming ChargingProfiles and contains the logic
@@ -210,9 +210,9 @@ class SmartChargingHandler : public SmartChargingHandlerInterface {
210210
double percentage_delta, ChargingLimitSourceEnum source,
211211
std::optional<int32_t> evse_id) const override;
212212

213-
virtual std::pair<ClearedChargingLimitRequest, std::vector<TransactionEventRequest>>
214-
handle_external_limit_cleared(std::optional<int32_t> evse_id, double percentage_delta,
215-
ChargingLimitSourceEnum source) const override;
213+
virtual std::optional<std::pair<ClearedChargingLimitRequest, std::vector<TransactionEventRequest>>>
214+
handle_external_limit_cleared(double percentage_delta, ChargingLimitSourceEnum source,
215+
std::optional<int32_t> evse_id) const override;
216216

217217
protected:
218218
///
@@ -273,6 +273,7 @@ class SmartChargingHandler : public SmartChargingHandlerInterface {
273273
std::vector<ChargingProfile> get_valid_profiles_for_evse(int32_t evse_id);
274274
void conform_validity_periods(ChargingProfile& profile) const;
275275
CurrentPhaseType get_current_phase_type(const std::optional<EvseInterface*> evse_opt) const;
276+
TransactionEventRequest create_transaction_event_request(std::unique_ptr<EnhancedTransaction>& tx) const;
276277
};
277278

278279
} // namespace ocpp::v201

lib/ocpp/v201/charge_point.cpp

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1112,20 +1112,24 @@ void ChargePoint::on_external_limits_changed(const std::variant<ConstantCharging
11121112
}
11131113
}
11141114

1115-
void ChargePoint::on_external_limit_cleared(std::optional<int32_t> evse_id, double percentage_delta,
1116-
ChargingLimitSourceEnum source) {
1117-
auto request = this->smart_charging_handler->handle_external_limit_cleared(evse_id, percentage_delta, source);
1115+
void ChargePoint::on_external_limit_cleared(double percentage_delta, ChargingLimitSourceEnum source,
1116+
std::optional<int32_t> evse_id) {
1117+
auto request = this->smart_charging_handler->handle_external_limit_cleared(percentage_delta, source, evse_id);
11181118

1119-
auto [cleared_charging_limit_request, transaction_event_requests] = request;
1119+
if (request.has_value()) {
1120+
1121+
auto [cleared_charging_limit_request, transaction_event_requests] = request.value();
11201122

1121-
ocpp::Call<ClearedChargingLimitRequest> call(cleared_charging_limit_request,
1122-
this->message_queue->createMessageId());
1123-
this->send<ClearedChargingLimitRequest>(call);
1123+
ocpp::Call<ClearedChargingLimitRequest> call(cleared_charging_limit_request,
1124+
this->message_queue->createMessageId());
1125+
this->send<ClearedChargingLimitRequest>(call);
11241126

1125-
if (transaction_event_requests.size() > 0) {
1126-
for (auto transaction_event_request : transaction_event_requests) {
1127-
ocpp::Call<TransactionEventRequest> call(transaction_event_request, this->message_queue->createMessageId());
1128-
this->send<TransactionEventRequest>(call);
1127+
if (transaction_event_requests.size() > 0) {
1128+
for (auto transaction_event_request : transaction_event_requests) {
1129+
ocpp::Call<TransactionEventRequest> call(transaction_event_request,
1130+
this->message_queue->createMessageId());
1131+
this->send<TransactionEventRequest>(call);
1132+
}
11291133
}
11301134
}
11311135
}

lib/ocpp/v201/smart_charging.cpp

Lines changed: 63 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,11 @@
1111
#include "ocpp/v201/messages/ClearedChargingLimit.hpp"
1212
#include "ocpp/v201/messages/NotifyChargingLimit.hpp"
1313
#include "ocpp/v201/messages/SetChargingProfile.hpp"
14+
#include "ocpp/v201/messages/TransactionEvent.hpp"
1415
#include "ocpp/v201/ocpp_enums.hpp"
1516
#include "ocpp/v201/ocpp_types.hpp"
1617
#include "ocpp/v201/profile.hpp"
18+
#include "ocpp/v201/transaction.hpp"
1719
#include "ocpp/v201/utils.hpp"
1820
#include <algorithm>
1921
#include <cstring>
@@ -806,33 +808,76 @@ SmartChargingHandler::handle_external_limits_changed(const std::variant<Constant
806808
return request;
807809
}
808810

809-
std::pair<ClearedChargingLimitRequest, std::vector<TransactionEventRequest>>
810-
SmartChargingHandler::handle_external_limit_cleared(std::optional<int32_t> evse_id, double percentage_delta,
811-
ChargingLimitSourceEnum source) const {
812-
// K13.FR.02
813-
ClearedChargingLimitRequest cleared_charging_limit_request = {};
814-
cleared_charging_limit_request.chargingLimitSource = source;
811+
std::optional<std::pair<ClearedChargingLimitRequest, std::vector<TransactionEventRequest>>>
812+
SmartChargingHandler::handle_external_limit_cleared(double percentage_delta, ChargingLimitSourceEnum source,
813+
std::optional<int32_t> evse_id) const {
815814

815+
bool has_transaction = false;
816+
817+
std::pair<ClearedChargingLimitRequest, std::vector<TransactionEventRequest>> pair;
816818
std::vector<TransactionEventRequest> transaction_event_requests = {};
817819

818820
const auto& limit_change_cv = ControllerComponentVariables::LimitChangeSignificance;
819821
const float limit_change_significance = this->device_model->get_value<double>(limit_change_cv);
820822

821-
// K13.FR.03
822-
if (percentage_delta > limit_change_significance) {
823-
auto tmp = TransactionEventRequest{};
824-
tmp.eventType = TransactionEventEnum::Updated;
825-
tmp.timestamp = ocpp::DateTime();
826-
tmp.triggerReason = TriggerReasonEnum::ChargingRateChanged;
827-
// TODO: there are transaction specific attributes in this type.
828-
// It is unclear how transactions are used when a external constraint is cleared.
829-
// This will need to be updated based on further discussion.
830-
transaction_event_requests.push_back(tmp);
823+
if (evse_id.has_value()) {
824+
auto evse = &this->evse_manager.get_evse(evse_id.value());
825+
if (evse->has_active_transaction()) {
826+
has_transaction = true;
827+
// K13.FR.03
828+
if (percentage_delta > limit_change_significance) {
829+
auto& tx = evse->get_transaction();
830+
transaction_event_requests.push_back(this->create_transaction_event_request(tx));
831+
}
832+
}
833+
} else {
834+
for (auto& evse : this->evse_manager) {
835+
if (evse.has_active_transaction()) {
836+
has_transaction = true;
837+
838+
// K13.FR.03
839+
if (percentage_delta > limit_change_significance) {
840+
841+
auto& tx = evse.get_transaction();
842+
transaction_event_requests.push_back(this->create_transaction_event_request(tx));
843+
}
844+
}
845+
}
831846
}
832847

833-
auto requests = std::make_pair(cleared_charging_limit_request, transaction_event_requests);
848+
std::optional<std::pair<ClearedChargingLimitRequest, std::vector<TransactionEventRequest>>> request;
849+
850+
if (has_transaction) {
851+
// K13.FR.02
852+
ClearedChargingLimitRequest cleared_charging_limit_request = {};
853+
854+
if (evse_id.has_value()) {
855+
cleared_charging_limit_request.evseId = evse_id.value();
856+
}
857+
858+
// There is not restriction on this source in the spec.
859+
// K12.FR04 requires it not to be CSO. Not enforced here.
860+
cleared_charging_limit_request.chargingLimitSource = source;
861+
pair.first = cleared_charging_limit_request;
862+
863+
pair.second = transaction_event_requests;
864+
request.emplace(pair);
865+
}
866+
867+
return request;
868+
}
869+
870+
TransactionEventRequest
871+
SmartChargingHandler::create_transaction_event_request(std::unique_ptr<EnhancedTransaction>& tx) const {
872+
auto tmp = TransactionEventRequest{};
873+
tmp.eventType = TransactionEventEnum::Updated;
874+
tmp.timestamp = ocpp::DateTime();
875+
tmp.triggerReason = TriggerReasonEnum::ChargingRateChanged;
876+
877+
tmp.seqNo = tx->get_seq_no();
878+
tmp.transactionInfo = tx->get_transaction();
834879

835-
return requests;
880+
return tmp;
836881
}
837882

838883
} // namespace ocpp::v201

tests/lib/ocpp/v201/mocks/smart_charging_handler_mock.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,9 @@ class SmartChargingHandlerMock : public SmartChargingHandlerInterface {
3333
(const ChargingLimitVariant& limit, double percentage_delta, ChargingLimitSourceEnum source,
3434
std::optional<int32_t> evse_id),
3535
(const, override));
36-
MOCK_METHOD((std::pair<ClearedChargingLimitRequest, std::vector<TransactionEventRequest>>),
36+
MOCK_METHOD((std::optional<std::pair<ClearedChargingLimitRequest, std::vector<TransactionEventRequest>>>),
3737
handle_external_limit_cleared,
38-
(std::optional<int32_t> evse_id, double percentage_delta, ChargingLimitSourceEnum source),
38+
(double percentage_delta, ChargingLimitSourceEnum source, std::optional<int32_t> evse_id),
3939
(const, override));
4040
};
4141
} // namespace ocpp::v201

tests/lib/ocpp/v201/test_charge_point.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -985,9 +985,9 @@ TEST_F(ChargepointTestFixtureV201, K13_OnExternalLimitsCleared_CallsHandler) {
985985
double deltaChanged = 0.2;
986986
auto source = ChargingLimitSourceEnum::Other;
987987

988-
EXPECT_CALL(*smart_charging_handler, handle_external_limit_cleared(evse_id, deltaChanged, source));
988+
EXPECT_CALL(*smart_charging_handler, handle_external_limit_cleared(deltaChanged, source, evse_id));
989989

990-
charge_point->on_external_limit_cleared(std::nullopt, deltaChanged, source);
990+
charge_point->on_external_limit_cleared(deltaChanged, source, std::nullopt);
991991
}
992992

993993
} // namespace ocpp::v201

0 commit comments

Comments
 (0)