diff --git a/CMakeLists.txt b/CMakeLists.txt index e5c127f21..94d17276a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -114,7 +114,7 @@ target_include_directories(neuron-base PRIVATE include/neuron src) target_link_libraries(neuron-base libssl.a libcrypto.a) target_link_libraries(neuron-base nng libzlog.so jansson jwt - ${CMAKE_THREAD_LIBS_INIT}) + ${CMAKE_THREAD_LIBS_INIT} -lm) add_dependencies(neuron-base neuron-version) # dependency imposed by nng diff --git a/src/adapter/driver/driver.c b/src/adapter/driver/driver.c index 2b66af1d4..4770fc3f5 100644 --- a/src/adapter/driver/driver.c +++ b/src/adapter/driver/driver.c @@ -111,6 +111,34 @@ static inline void start_group_timer(neu_adapter_driver_t *driver, group_t * grp); static inline void stop_group_timer(neu_adapter_driver_t *driver, group_t *grp); +static void format_tag_value(neu_resp_tag_value_meta_t *value) +{ + double scale = pow(10, 5); + int64_t integer_part = (int64_t) value->value.value.d64; + double decimal_part = value->value.value.d64 - integer_part; + decimal_part *= scale; + decimal_part = round(decimal_part); + char str[6] = { 0 }; + snprintf(str, sizeof(str), "%05" PRId64 "", (int64_t) decimal_part); + int i = 0, flag = 0; + for (; i < 4; i++) { + if (str[i] == '0' && str[i + 1] == '0') { + flag = 1; + break; + } else if (str[i] == '9' && str[i + 1] == '9') { + flag = 2; + break; + } + } + if (flag != 0 && i != 0) { + decimal_part = round(decimal_part / pow(10, 5 - i)); + value->value.value.d64 = + (double) integer_part + decimal_part / pow(10, i); + } else { + value->value.value.d64 = (double) integer_part + decimal_part / scale; + } +} + static void write_response(neu_adapter_t *adapter, void *r, neu_error error) { neu_reqresp_head_t *req = (neu_reqresp_head_t *) r; @@ -2063,6 +2091,9 @@ static void read_report_group(int64_t timestamp, int64_t timeout, break; } } + if (tag->precision == 0 && tag->type == NEU_TYPE_DOUBLE) { + format_tag_value(&tag_value); + } } utarray_push_back(tag_values, &tag_value); @@ -2220,6 +2251,10 @@ static void read_group(int64_t timestamp, int64_t timeout, break; } } + + if (tag->precision == 0 && tag->type == NEU_TYPE_DOUBLE) { + format_tag_value(&tag_value); + } } utarray_push_back(tag_values, &tag_value); } diff --git a/src/utils/json.c b/src/utils/json.c index cc36c7751..d560d77e3 100644 --- a/src/utils/json.c +++ b/src/utils/json.c @@ -17,6 +17,7 @@ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. **/ +#include #include #include @@ -25,6 +26,38 @@ #include "utils/log.h" #include "json/json.h" +static double format_tag_value(float ele_value) +{ + double scale = pow(10, 5); + double value = ele_value; + + int64_t integer_part = (int64_t)(value); + double decimal_part = value - integer_part; + decimal_part *= scale; + decimal_part = round(decimal_part); + + char str[6] = { 0 }; + snprintf(str, sizeof(str), "%05" PRId64 "", (int64_t) decimal_part); + int i = 0, flag = 0; + for (; i < 4; i++) { + if (str[i] == '0' && str[i + 1] == '0') { + flag = 1; + break; + } else if (str[i] == '9' && str[i + 1] == '9') { + flag = 2; + break; + } + } + if (flag != 0 && i != 0) { + decimal_part = round(decimal_part / pow(10, 5 - i)); + value = (double) integer_part + decimal_part / pow(10, i); + } else { + value = (double) integer_part + decimal_part / scale; + } + + return value; +} + static json_t *encode_object_value(neu_json_elem_t *ele) { json_t *ob = NULL; @@ -42,9 +75,14 @@ static json_t *encode_object_value(neu_json_elem_t *ele) case NEU_JSON_DOUBLE: ob = json_realp(ele->v.val_double, ele->precision); break; - case NEU_JSON_FLOAT: - ob = json_realp(ele->v.val_float, ele->precision); + case NEU_JSON_FLOAT: { + double t = ele->v.val_float; + if (ele->precision == 0) { + t = format_tag_value(ele->v.val_float); + } + ob = json_realp(t, ele->precision); break; + } case NEU_JSON_BOOL: ob = json_boolean(ele->v.val_bool); break; @@ -69,10 +107,14 @@ static json_t *encode_object(json_t *object, neu_json_elem_t ele) case NEU_JSON_STR: json_object_set_new(ob, ele.name, json_string(ele.v.val_str)); break; - case NEU_JSON_FLOAT: - json_object_set_new(ob, ele.name, - json_realp(ele.v.val_float, ele.precision)); + case NEU_JSON_FLOAT: { + double t = ele.v.val_float; + if (ele.precision == 0) { + t = format_tag_value(ele.v.val_float); + } + json_object_set_new(ob, ele.name, json_realp(t, ele.precision)); break; + } case NEU_JSON_DOUBLE: json_object_set_new(ob, ele.name, json_realp(ele.v.val_double, ele.precision));