diff --git a/caPutLogApp/caPutJsonLogTask.cpp b/caPutLogApp/caPutJsonLogTask.cpp index 7f0cde4..75e11a3 100644 --- a/caPutLogApp/caPutJsonLogTask.cpp +++ b/caPutLogApp/caPutJsonLogTask.cpp @@ -458,7 +458,7 @@ caPutJsonLogStatus CaPutJsonLogTask::buildJsonMsg(const VALUE *pold_value, const // Dont log duplicate values if configured so if (this->config == caPutJsonLogOnChange && !burst) { - if (this->compareValues(pLogData)) + if (this->valuesAreEqual(pLogData)) return caPutJsonLogSuccess; } @@ -794,46 +794,22 @@ void CaPutJsonLogTask::calculateMax(VALUE *pres, const VALUE *pa, const VALUE *p } } -#define SINGLE_TYPE_COMPARE(_t, _s) \ - if (pLogData->is_array) \ - return memcmp(pa->a_##_t, pb->a_##_t, size * _s) == 0; \ - return pa->v_##_t == pb->v_##_t; - -bool CaPutJsonLogTask::compareValues(const LOGDATA *pLogData) { +bool CaPutJsonLogTask::valuesAreEqual(const LOGDATA *pLogData) { const VALUE *pa = &pLogData->old_value; const VALUE *pb = &pLogData->new_value.value; - const int size = pLogData->old_log_size; + size_t size = pLogData->is_array ? pLogData->old_log_size : 1; - if (pLogData->is_array && pLogData->old_log_size != pLogData->new_log_size) + if (pLogData->old_log_size != pLogData->new_log_size) return false; - switch (pLogData->type) - { - case DBR_CHAR: - SINGLE_TYPE_COMPARE(int8, sizeof(epicsInt8)); - case DBR_UCHAR: - SINGLE_TYPE_COMPARE(uint8, sizeof(epicsUInt8)); - case DBR_SHORT: - SINGLE_TYPE_COMPARE(int16, sizeof(epicsInt16)); - case DBR_USHORT: - case DBR_ENUM: - SINGLE_TYPE_COMPARE(uint16, sizeof(epicsUInt16)); - case DBR_LONG: - SINGLE_TYPE_COMPARE(int32, sizeof(epicsInt32)); - case DBR_ULONG: - SINGLE_TYPE_COMPARE(uint32, sizeof(epicsUInt32)); - case DBR_INT64: - SINGLE_TYPE_COMPARE(int64, sizeof(epicsInt64)); - case DBR_UINT64: - SINGLE_TYPE_COMPARE(uint64, sizeof(epicsUInt64)); - case DBR_FLOAT: - SINGLE_TYPE_COMPARE(float, sizeof(epicsFloat32)); - case DBR_DOUBLE: - SINGLE_TYPE_COMPARE(double, sizeof(epicsFloat64)); - case DBR_STRING: - SINGLE_TYPE_COMPARE(string, MAX_STRING_SIZE); - default: - return 0; + if (pLogData->type == DBR_STRING) { + for (size_t i = 0; i < size; i++) { + if (strncmp(pa->a_string[i], pb->a_string[i], MAX_STRING_SIZE) != 0) + return false; + } + return true; + } else { + return memcmp(pa, pb, size*dbValueSize(pLogData->type)) == 0; } } diff --git a/caPutLogApp/caPutJsonLogTask.h b/caPutLogApp/caPutJsonLogTask.h index efa44c1..0b71cac 100644 --- a/caPutLogApp/caPutJsonLogTask.h +++ b/caPutLogApp/caPutJsonLogTask.h @@ -300,7 +300,7 @@ class epicsShareClass CaPutJsonLogTask { * @return true If values are the same. * @return false If values are not the same. */ - bool compareValues(const LOGDATA *pLogData); + bool valuesAreEqual(const LOGDATA *pLogData); /** * @brief Get a string representation of the value stored in the ::VALUE.