From d378247c924233e859a7c1793ae4882cc4e40841 Mon Sep 17 00:00:00 2001 From: esmithExperimentControls Date: Thu, 10 Oct 2024 15:41:28 +0100 Subject: [PATCH 1/6] Initial commit --- adsApp/src/ADSPortDriver.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/adsApp/src/ADSPortDriver.cpp b/adsApp/src/ADSPortDriver.cpp index 86fd301..75db13b 100644 --- a/adsApp/src/ADSPortDriver.cpp +++ b/adsApp/src/ADSPortDriver.cpp @@ -976,3 +976,5 @@ WriteResult ADSPortDriver::stringWrite(DeviceVariable &deviceVar, return result; } + + From 0ceb2789849405e5253de9c2ac5226822fc5cbf0 Mon Sep 17 00:00:00 2001 From: esmithExperimentControls Date: Fri, 11 Oct 2024 13:37:45 +0100 Subject: [PATCH 2/6] add class variable to hold last error status, check if last error = status --- adsApp/src/ADSPortDriver.cpp | 3 ++- adsApp/src/ADSPortDriver.h | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/adsApp/src/ADSPortDriver.cpp b/adsApp/src/ADSPortDriver.cpp index 75db13b..3f4f92b 100644 --- a/adsApp/src/ADSPortDriver.cpp +++ b/adsApp/src/ADSPortDriver.cpp @@ -341,10 +341,11 @@ asynStatus ADSPortDriver::ADSConnect(asynUser *pasynUser) { status = static_cast( adsConnection->resolve_variables(ads_write_vars)); - if (status) { + if (status && lastError != status) { LOG_ERR_ASYN(pasynUser, "Could not resolve ADS write variable names(%i): %s", status, ads_errors[status].c_str()); + lastError = status; return status; } } diff --git a/adsApp/src/ADSPortDriver.h b/adsApp/src/ADSPortDriver.h index e65404b..389dc13 100644 --- a/adsApp/src/ADSPortDriver.h +++ b/adsApp/src/ADSPortDriver.h @@ -82,6 +82,7 @@ class ADSPortDriver : public Autoparam::Driver { uint32_t const adsFunctionTimeout; const std::shared_ptr adsConnection; const std::chrono::milliseconds sumReadPeriod; + long lastError; SumReadRequest SumRead; From 4e9a266f5025f89b5df300c5e4b2b72003eca1e3 Mon Sep 17 00:00:00 2001 From: Jack Harper Date: Fri, 18 Oct 2024 14:14:59 +0100 Subject: [PATCH 3/6] this sort of fixes the issue --- adsApp/src/ADSPortDriver.cpp | 10 ++++++---- adsApp/src/ADSPortDriver.h | 4 +++- adsApp/src/epics-ads/SumReadRequest.cpp | 8 ++++---- adsApp/src/err.cpp | 2 +- adsApp/src/err.h | 8 ++++---- 5 files changed, 18 insertions(+), 14 deletions(-) diff --git a/adsApp/src/ADSPortDriver.cpp b/adsApp/src/ADSPortDriver.cpp index 3f4f92b..d56ca92 100644 --- a/adsApp/src/ADSPortDriver.cpp +++ b/adsApp/src/ADSPortDriver.cpp @@ -329,10 +329,11 @@ asynStatus ADSPortDriver::ADSConnect(asynUser *pasynUser) { status = static_cast( adsConnection->resolve_variables(ads_read_vars)); - if (status) { + if (status && lastReadError != status) { LOG_ERR_ASYN(pasynUser, "Could not resolve ADS read variable names (%i): %s", status, ads_errors[status].c_str()); + lastReadError = status; return status; } } @@ -341,11 +342,11 @@ asynStatus ADSPortDriver::ADSConnect(asynUser *pasynUser) { status = static_cast( adsConnection->resolve_variables(ads_write_vars)); - if (status && lastError != status) { + if (status && lastWriteError != status) { LOG_ERR_ASYN(pasynUser, "Could not resolve ADS write variable names(%i): %s", status, ads_errors[status].c_str()); - lastError = status; + lastWriteError = status; return status; } } @@ -354,10 +355,11 @@ asynStatus ADSPortDriver::ADSConnect(asynUser *pasynUser) { // initialize sum-read buffers status = static_cast(SumRead.initialize()); - if (status) { + if (status && lastSumReadError != status) { LOG_ERR_ASYN(pasynUser, "Error initializing sum-read request buffers (%i): %s", status, ads_errors[status].c_str()); + lastSumReadError = status; return status; } diff --git a/adsApp/src/ADSPortDriver.h b/adsApp/src/ADSPortDriver.h index 389dc13..99311a8 100644 --- a/adsApp/src/ADSPortDriver.h +++ b/adsApp/src/ADSPortDriver.h @@ -82,7 +82,9 @@ class ADSPortDriver : public Autoparam::Driver { uint32_t const adsFunctionTimeout; const std::shared_ptr adsConnection; const std::chrono::milliseconds sumReadPeriod; - long lastError; + long lastReadError; + long lastWriteError; + long lastSumReadError; SumReadRequest SumRead; diff --git a/adsApp/src/epics-ads/SumReadRequest.cpp b/adsApp/src/epics-ads/SumReadRequest.cpp index 19273b9..56bd111 100644 --- a/adsApp/src/epics-ads/SumReadRequest.cpp +++ b/adsApp/src/epics-ads/SumReadRequest.cpp @@ -143,8 +143,8 @@ int SumReadRequest::allocate( std::shared_ptr chunk = *chunk_itr; int rc = chunk->sum_read_data_buffer->initialize_buffer(); if (rc != 0) { - LOG_ERR("failed to initialize sum-read data buffer (%i): %s", - rc, ads_errors[rc].c_str()); + //LOG_ERR("failed to initialize sum-read data buffer (%i): %s", + // rc, ads_errors[rc].c_str()); goto ALLOC_ERROR; } } @@ -207,8 +207,8 @@ int SumReadRequest::initialize() { for (size_t i_var = 0; i_var < chunk->variables.size(); i_var++) { std::shared_ptr var = chunk->variables[i_var]; if (var->addr->is_resolved() == false) { - LOG_ERR("variable name is not resolved: '%s'", - var->addr->get_var_name().c_str()); +// LOG_ERR("variable name is not resolved: '%s'", + // var->addr->get_var_name().c_str()); return EPICSADS_NOT_RESOLVED; } diff --git a/adsApp/src/err.cpp b/adsApp/src/err.cpp index 29e4345..0f33056 100644 --- a/adsApp/src/err.cpp +++ b/adsApp/src/err.cpp @@ -159,7 +159,7 @@ std::map errorMap = int ads_rc_to_epicsads_error(long ads_rc) { auto it = ads_rc_to_epicsads_error_map.find(ads_rc); if (it == ads_rc_to_epicsads_error_map.end()) { - LOG_ERR("unhandled ADS return code '%li'", ads_rc); + //LOG_ERR("unhandled ADS return code '%li'", ads_rc); return EPICSADS_UNHANDLED_RC; } diff --git a/adsApp/src/err.h b/adsApp/src/err.h index e5c7871..25b740a 100644 --- a/adsApp/src/err.h +++ b/adsApp/src/err.h @@ -32,10 +32,10 @@ LOG_MSG_ASYN(asyn_user, ASYN_TRACE_ERROR, "ERROR", format, ##__VA_ARGS__) #define LOG_WARN_ASYN(asyn_user, format, ...) \ - LOG_MSG_ASYN(asyn_user, ASYN_TRACE_WARNING, "WARNING", format, ##__VA_ARGS__) + //LOG_MSG_ASYN(asyn_user, ASYN_TRACE_WARNING, "WARNING", format, ##__VA_ARGS__) #define LOG_TRACE_ASYN(asyn_user, format, ...) \ - LOG_MSG_ASYN(asyn_user, ASYN_TRACE_FLOW, "TRACE", format, ##__VA_ARGS__) + //LOG_MSG_ASYN(asyn_user, ASYN_TRACE_FLOW, "TRACE", format, ##__VA_ARGS__) /* Error logging macros for use when asyn_user is not available */ #define LOG_MSG(log_level_str, format, ...) \ @@ -45,10 +45,10 @@ LOG_MSG("ERROR", format, ##__VA_ARGS__) #define LOG_WARN(format, ...) \ - LOG_MSG("WARNING", format, ##__VA_ARGS__) + //LOG_MSG("WARNING", format, ##__VA_ARGS__) #define LOG_TRACE(format, ...) \ - LOG_MSG("TRACE", format, ##__VA_ARGS__) + //LOG_MSG("TRACE", format, ##__VA_ARGS__) /* EPICS ADS specific return codes */ #define EPICSADS_BASE 1000 From b7350f4fc30a916b733fbdc2797e6d00b446c3ca Mon Sep 17 00:00:00 2001 From: Jack Harper Date: Fri, 18 Oct 2024 15:03:15 +0100 Subject: [PATCH 4/6] remove uncommented LOG_ERR lines --- adsApp/src/epics-ads/SumReadRequest.cpp | 8 ++++---- adsApp/src/err.cpp | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/adsApp/src/epics-ads/SumReadRequest.cpp b/adsApp/src/epics-ads/SumReadRequest.cpp index 56bd111..19273b9 100644 --- a/adsApp/src/epics-ads/SumReadRequest.cpp +++ b/adsApp/src/epics-ads/SumReadRequest.cpp @@ -143,8 +143,8 @@ int SumReadRequest::allocate( std::shared_ptr chunk = *chunk_itr; int rc = chunk->sum_read_data_buffer->initialize_buffer(); if (rc != 0) { - //LOG_ERR("failed to initialize sum-read data buffer (%i): %s", - // rc, ads_errors[rc].c_str()); + LOG_ERR("failed to initialize sum-read data buffer (%i): %s", + rc, ads_errors[rc].c_str()); goto ALLOC_ERROR; } } @@ -207,8 +207,8 @@ int SumReadRequest::initialize() { for (size_t i_var = 0; i_var < chunk->variables.size(); i_var++) { std::shared_ptr var = chunk->variables[i_var]; if (var->addr->is_resolved() == false) { -// LOG_ERR("variable name is not resolved: '%s'", - // var->addr->get_var_name().c_str()); + LOG_ERR("variable name is not resolved: '%s'", + var->addr->get_var_name().c_str()); return EPICSADS_NOT_RESOLVED; } diff --git a/adsApp/src/err.cpp b/adsApp/src/err.cpp index 0f33056..29e4345 100644 --- a/adsApp/src/err.cpp +++ b/adsApp/src/err.cpp @@ -159,7 +159,7 @@ std::map errorMap = int ads_rc_to_epicsads_error(long ads_rc) { auto it = ads_rc_to_epicsads_error_map.find(ads_rc); if (it == ads_rc_to_epicsads_error_map.end()) { - //LOG_ERR("unhandled ADS return code '%li'", ads_rc); + LOG_ERR("unhandled ADS return code '%li'", ads_rc); return EPICSADS_UNHANDLED_RC; } From 1440d0ec900b4adcd6ebe482aefb51c47be772f3 Mon Sep 17 00:00:00 2001 From: esmithExperimentControls Date: Fri, 18 Oct 2024 15:48:41 +0100 Subject: [PATCH 5/6] Add caching of last error in sumread initialize --- adsApp/src/epics-ads/SumReadRequest.cpp | 8 ++++++-- adsApp/src/epics-ads/SumReadRequest.h | 2 ++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/adsApp/src/epics-ads/SumReadRequest.cpp b/adsApp/src/epics-ads/SumReadRequest.cpp index 19273b9..59bced0 100644 --- a/adsApp/src/epics-ads/SumReadRequest.cpp +++ b/adsApp/src/epics-ads/SumReadRequest.cpp @@ -207,8 +207,12 @@ int SumReadRequest::initialize() { for (size_t i_var = 0; i_var < chunk->variables.size(); i_var++) { std::shared_ptr var = chunk->variables[i_var]; if (var->addr->is_resolved() == false) { - LOG_ERR("variable name is not resolved: '%s'", - var->addr->get_var_name().c_str()); + std::string name = var->addr->get_var_name(); + if (name !=last) { + LOG_ERR("variable name is not resolved: '%s'", + name.c_str()); + last = var->addr->get_var_name(); + } return EPICSADS_NOT_RESOLVED; } diff --git a/adsApp/src/epics-ads/SumReadRequest.h b/adsApp/src/epics-ads/SumReadRequest.h index 29c1d0c..ef8a188 100644 --- a/adsApp/src/epics-ads/SumReadRequest.h +++ b/adsApp/src/epics-ads/SumReadRequest.h @@ -10,6 +10,7 @@ #include #include #include +#include #ifdef USE_TC_ADS #include @@ -48,6 +49,7 @@ class SumReadRequest { /* Helper method returns a vector of chunks from chunks_by_ads_port_map */ std::shared_ptr>> get_chunks(); + std::string last; public: /* Number of chunks, i.e. the number of sub-requests needed to sum-read all From e25b384caa2ca0d553fc2ec3783ffd4c64ef8aee Mon Sep 17 00:00:00 2001 From: esmithExperimentControls Date: Fri, 18 Oct 2024 15:54:56 +0100 Subject: [PATCH 6/6] Add resets for cahced error statuses to expose transient errors --- adsApp/src/ADSPortDriver.cpp | 5 ++++- adsApp/src/epics-ads/SumReadRequest.cpp | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/adsApp/src/ADSPortDriver.cpp b/adsApp/src/ADSPortDriver.cpp index d56ca92..422bafc 100644 --- a/adsApp/src/ADSPortDriver.cpp +++ b/adsApp/src/ADSPortDriver.cpp @@ -336,6 +336,7 @@ asynStatus ADSPortDriver::ADSConnect(asynUser *pasynUser) { lastReadError = status; return status; } + lastReadError = 0; } if (ads_write_vars.size()) { @@ -349,7 +350,9 @@ asynStatus ADSPortDriver::ADSConnect(asynUser *pasynUser) { lastWriteError = status; return status; } + lastWriteError = 0; } + LOG_WARN_ASYN(pasynUser, "Resolved %lu read and %lu write variable names", ads_read_vars.size(), ads_write_vars.size()); @@ -362,7 +365,7 @@ asynStatus ADSPortDriver::ADSConnect(asynUser *pasynUser) { lastSumReadError = status; return status; } - + lastSumReadError = 0; LOG_WARN_ASYN(pasynUser, "Initialized sum-read request buffers"); status = doSumRead(); diff --git a/adsApp/src/epics-ads/SumReadRequest.cpp b/adsApp/src/epics-ads/SumReadRequest.cpp index 59bced0..fd2333b 100644 --- a/adsApp/src/epics-ads/SumReadRequest.cpp +++ b/adsApp/src/epics-ads/SumReadRequest.cpp @@ -215,6 +215,7 @@ int SumReadRequest::initialize() { } return EPICSADS_NOT_RESOLVED; } + last = ""; chunk->sum_read_request_buffer[i_var] = { var->addr->get_index_group(), var->addr->get_index_offset(),