Skip to content

Commit

Permalink
add flag for pending firmware update
Browse files Browse the repository at this point in the history
Signed-off-by: Fabian Klemm <[email protected]>
  • Loading branch information
klemmpnx committed Dec 14, 2023
1 parent bc6a918 commit a774367
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 5 deletions.
1 change: 1 addition & 0 deletions include/ocpp/v16/charge_point_impl.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,7 @@ class ChargePointImpl : ocpp::ChargingStationBase {
RegistrationStatus registration_status;
DiagnosticsStatus diagnostics_status;
FirmwareStatus firmware_status;
bool firmware_update_is_pending = false;
UploadLogStatusEnumType log_status;
std::string message_log_path;

Expand Down
31 changes: 26 additions & 5 deletions lib/ocpp/v16/charge_point_impl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -824,6 +824,9 @@ void ChargePointImpl::change_all_connectors_to_unavailable_for_firmware_update()
int32_t number_of_connectors = this->configuration->getNumberOfConnectors();
for (int32_t connector = 1; connector <= number_of_connectors; connector++) {
if (this->transaction_handler->transaction_active(connector)) {
EVLOG_debug << "change_all_connectors_to_unavailable_for_firmware_update: detected running Transaction on "
"connector "
<< connector;
transaction_running = true;
std::lock_guard<std::mutex> change_availability_lock(change_availability_mutex);
this->change_availability_queue[connector] = {AvailabilityType::Inoperative, false};
Expand Down Expand Up @@ -1805,8 +1808,7 @@ void ChargePointImpl::handleStopTransactionResponse(const EnhancedMessage<v16::M
// when this transaction was stopped because of a Reset.req this signals that StopTransaction.conf has been received
this->stop_transaction_cv.notify_one();

if (this->firmware_status == FirmwareStatus::Downloaded or
this->signed_firmware_status == FirmwareStatusEnumType::SignatureVerified) {
if (this->firmware_update_is_pending) {
this->change_all_connectors_to_unavailable_for_firmware_update();
}
}
Expand Down Expand Up @@ -2371,11 +2373,21 @@ void ChargePointImpl::log_status_notification(UploadLogStatusEnumType status, in
}

void ChargePointImpl::signed_firmware_update_status_notification(FirmwareStatusEnumType status, int requestId) {
EVLOG_debug << "Sending FirmwareUpdateStatusNotification";
EVLOG_debug << "Sending FirmwareUpdateStatusNotification with status"
<< conversions::firmware_status_enum_type_to_string(status);
SignedFirmwareStatusNotificationRequest req;
req.status = status;
req.requestId = requestId;

if (status == FirmwareStatusEnumType::SignatureVerified) {
this->firmware_update_is_pending = true;
} else if (status == FirmwareStatusEnumType::InstallationFailed ||
status == FirmwareStatusEnumType::DownloadFailed ||
status == FirmwareStatusEnumType::InstallVerificationFailed ||
status == FirmwareStatusEnumType::InvalidSignature) {
this->firmware_update_is_pending = false;
}

this->signed_firmware_status = status;
this->signed_firmware_status_request_id = requestId;

Expand All @@ -2386,7 +2398,7 @@ void ChargePointImpl::signed_firmware_update_status_notification(FirmwareStatusE
this->securityEventNotification("InvalidFirmwareSignature", "", true);
}

if (this->signed_firmware_status == FirmwareStatusEnumType::SignatureVerified) {
if (this->firmware_update_is_pending) {
this->change_all_connectors_to_unavailable_for_firmware_update();
}
}
Expand Down Expand Up @@ -3390,14 +3402,23 @@ void ChargePointImpl::diagnostic_status_notification(DiagnosticsStatus status) {
}

void ChargePointImpl::firmware_status_notification(FirmwareStatus status) {

EVLOG_debug << "Received FirmwareUpdateStatusNotification with status"
<< conversions::firmware_status_to_string(status);
FirmwareStatusNotificationRequest req;
req.status = status;
if (status == FirmwareStatus::Downloaded) {
this->firmware_update_is_pending = true;
} else if (status == FirmwareStatus::DownloadFailed || status == FirmwareStatus::InstallationFailed) {
this->firmware_update_is_pending = false;
}

this->firmware_status = status;

ocpp::Call<FirmwareStatusNotificationRequest> call(req, this->message_queue->createMessageId());
this->send_async<FirmwareStatusNotificationRequest>(call);

if (this->firmware_status == FirmwareStatus::Downloaded) {
if (this->firmware_update_is_pending) {
this->change_all_connectors_to_unavailable_for_firmware_update();
}
}
Expand Down

0 comments on commit a774367

Please sign in to comment.