From 269d5fed11512aa7daaa28c91f3794fd1f5ea4c3 Mon Sep 17 00:00:00 2001 From: florinmihut Date: Fri, 19 Jul 2024 12:58:58 +0200 Subject: [PATCH 1/5] Raise a CommunicationFault if we can't communicate with the LEM module and clear it once the connection is re-established Signed-off-by: florinmihut --- modules/LemDCBM400600/main/powermeterImpl.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/modules/LemDCBM400600/main/powermeterImpl.cpp b/modules/LemDCBM400600/main/powermeterImpl.cpp index f335f0976..66949fd63 100644 --- a/modules/LemDCBM400600/main/powermeterImpl.cpp +++ b/modules/LemDCBM400600/main/powermeterImpl.cpp @@ -7,6 +7,12 @@ #include #include #include +#include +#include + +using Error = Everest::error::Error; +using Condition = Everest::error::ErrorStateMonitor::StateCondition; + namespace module::main { @@ -35,15 +41,25 @@ void powermeterImpl::ready() { // Start the live_measure_publisher thread, which periodically publishes the live measurements of the device this->live_measure_publisher_thread = std::thread([this] { this->publish_public_key_ocmf(this->controller->get_public_key_ocmf()); + const Condition condition = Condition("powermeter/CommunicationFault", "Communication timed out", true); while (true) { std::this_thread::sleep_for(std::chrono::milliseconds(1000)); try { this->publish_powermeter(this->controller->get_powermeter()); + // if the communication error is set, clear the error + if (this->error_state_monitor->is_condition_satisfied(condition)) { + clear_error("powermeter/CommunicationFault", "Communication timed out"); + } } catch (LemDCBM400600Controller::DCBMUnexpectedResponseException& dcbm_exception) { EVLOG_error << "Failed to publish powermeter value due to an invalid device response: " << dcbm_exception.what(); } catch (HttpClientError& client_error) { EVLOG_error << "Failed to publish powermeter value due to an http error: " << client_error.what(); + if (!this->error_state_monitor->is_condition_satisfied(condition)) { + Error error = this->error_factory->create_error("powermeter/CommunicationFault", "Communication timed out", + "This error is raised due to communication timeout"); + raise_error(error); + } } } }); From c8a024481b822717e65664a6ffc5e786aa4f2e25 Mon Sep 17 00:00:00 2001 From: florinmihut Date: Fri, 19 Jul 2024 13:03:40 +0200 Subject: [PATCH 2/5] Fix formatting Signed-off-by: florinmihut --- modules/LemDCBM400600/main/powermeterImpl.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/LemDCBM400600/main/powermeterImpl.cpp b/modules/LemDCBM400600/main/powermeterImpl.cpp index 66949fd63..533861e21 100644 --- a/modules/LemDCBM400600/main/powermeterImpl.cpp +++ b/modules/LemDCBM400600/main/powermeterImpl.cpp @@ -56,8 +56,9 @@ void powermeterImpl::ready() { } catch (HttpClientError& client_error) { EVLOG_error << "Failed to publish powermeter value due to an http error: " << client_error.what(); if (!this->error_state_monitor->is_condition_satisfied(condition)) { - Error error = this->error_factory->create_error("powermeter/CommunicationFault", "Communication timed out", - "This error is raised due to communication timeout"); + Error error = + this->error_factory->create_error("powermeter/CommunicationFault", "Communication timed out", + "This error is raised due to communication timeout"); raise_error(error); } } From 6157151d35c114a5c1a7898419706bc97427a55b Mon Sep 17 00:00:00 2001 From: florinmihut Date: Fri, 19 Jul 2024 13:04:47 +0200 Subject: [PATCH 3/5] Fix formatting Signed-off-by: florinmihut --- modules/LemDCBM400600/main/powermeterImpl.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/LemDCBM400600/main/powermeterImpl.cpp b/modules/LemDCBM400600/main/powermeterImpl.cpp index 533861e21..6067853a9 100644 --- a/modules/LemDCBM400600/main/powermeterImpl.cpp +++ b/modules/LemDCBM400600/main/powermeterImpl.cpp @@ -13,7 +13,6 @@ using Error = Everest::error::Error; using Condition = Everest::error::ErrorStateMonitor::StateCondition; - namespace module::main { void powermeterImpl::init() { From f3b5ee0efbbb8ff8c5a9ccd4eddb9af0af88be1b Mon Sep 17 00:00:00 2001 From: florinmihut Date: Fri, 19 Jul 2024 13:52:50 +0200 Subject: [PATCH 4/5] Use is_error_active instead of is_condition_satisfied Signed-off-by: florinmihut --- modules/LemDCBM400600/main/powermeterImpl.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/modules/LemDCBM400600/main/powermeterImpl.cpp b/modules/LemDCBM400600/main/powermeterImpl.cpp index 6067853a9..cd91392b9 100644 --- a/modules/LemDCBM400600/main/powermeterImpl.cpp +++ b/modules/LemDCBM400600/main/powermeterImpl.cpp @@ -40,13 +40,13 @@ void powermeterImpl::ready() { // Start the live_measure_publisher thread, which periodically publishes the live measurements of the device this->live_measure_publisher_thread = std::thread([this] { this->publish_public_key_ocmf(this->controller->get_public_key_ocmf()); - const Condition condition = Condition("powermeter/CommunicationFault", "Communication timed out", true); while (true) { std::this_thread::sleep_for(std::chrono::milliseconds(1000)); try { this->publish_powermeter(this->controller->get_powermeter()); // if the communication error is set, clear the error - if (this->error_state_monitor->is_condition_satisfied(condition)) { + if (this->error_state_monitor->is_error_active("powermeter/CommunicationFault", + "Communication timed out")) { clear_error("powermeter/CommunicationFault", "Communication timed out"); } } catch (LemDCBM400600Controller::DCBMUnexpectedResponseException& dcbm_exception) { @@ -54,7 +54,8 @@ void powermeterImpl::ready() { << dcbm_exception.what(); } catch (HttpClientError& client_error) { EVLOG_error << "Failed to publish powermeter value due to an http error: " << client_error.what(); - if (!this->error_state_monitor->is_condition_satisfied(condition)) { + if (!this->error_state_monitor->is_error_active("powermeter/CommunicationFault", + "Communication timed out")) { Error error = this->error_factory->create_error("powermeter/CommunicationFault", "Communication timed out", "This error is raised due to communication timeout"); From e81adcd9c79f133a3d566d37145fb2a1ce42283e Mon Sep 17 00:00:00 2001 From: florinmihut Date: Fri, 19 Jul 2024 14:31:22 +0200 Subject: [PATCH 5/5] Simplify Signed-off-by: florinmihut --- modules/LemDCBM400600/main/powermeterImpl.cpp | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/modules/LemDCBM400600/main/powermeterImpl.cpp b/modules/LemDCBM400600/main/powermeterImpl.cpp index cd91392b9..c6e4e74bc 100644 --- a/modules/LemDCBM400600/main/powermeterImpl.cpp +++ b/modules/LemDCBM400600/main/powermeterImpl.cpp @@ -7,11 +7,6 @@ #include #include #include -#include -#include - -using Error = Everest::error::Error; -using Condition = Everest::error::ErrorStateMonitor::StateCondition; namespace module::main { @@ -56,7 +51,7 @@ void powermeterImpl::ready() { EVLOG_error << "Failed to publish powermeter value due to an http error: " << client_error.what(); if (!this->error_state_monitor->is_error_active("powermeter/CommunicationFault", "Communication timed out")) { - Error error = + auto error = this->error_factory->create_error("powermeter/CommunicationFault", "Communication timed out", "This error is raised due to communication timeout"); raise_error(error);