projects
/
collectd.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge pull request #2729 from cekstam/add-scale-and-shift-to-modbus
[collectd.git]
/
src
/
modbus.c
diff --git
a/src/modbus.c
b/src/modbus.c
index
40e0079
..
bb9eaa0
100644
(file)
--- a/
src/modbus.c
+++ b/
src/modbus.c
@@
-107,6
+107,8
@@
struct mb_data_s /* {{{ */
mb_mreg_type_t modbus_register_type;
char type[DATA_MAX_NAME_LEN];
char instance[DATA_MAX_NAME_LEN];
mb_mreg_type_t modbus_register_type;
char type[DATA_MAX_NAME_LEN];
char instance[DATA_MAX_NAME_LEN];
+ double scale;
+ double shift;
mb_data_t *next;
}; /* }}} */
mb_data_t *next;
}; /* }}} */
@@
-394,16
+396,16
@@
static int mb_init_connection(mb_host_t *host) /* {{{ */
} /* }}} int mb_init_connection */
#endif /* !LEGACY_LIBMODBUS */
} /* }}} int mb_init_connection */
#endif /* !LEGACY_LIBMODBUS */
-#define CAST_TO_VALUE_T(ds, vt, raw
)
\
+#define CAST_TO_VALUE_T(ds, vt, raw
, scale, shift)
\
do { \
if ((ds)->ds[0].type == DS_TYPE_COUNTER) \
do { \
if ((ds)->ds[0].type == DS_TYPE_COUNTER) \
- (vt).counter = (
counter_t)(raw);
\
+ (vt).counter = (
((counter_t)(raw)*scale) + shift);
\
else if ((ds)->ds[0].type == DS_TYPE_GAUGE) \
else if ((ds)->ds[0].type == DS_TYPE_GAUGE) \
- (vt).gauge = (
gauge_t)(raw);
\
+ (vt).gauge = (
((gauge_t)(raw)*scale) + shift);
\
else if ((ds)->ds[0].type == DS_TYPE_DERIVE) \
else if ((ds)->ds[0].type == DS_TYPE_DERIVE) \
- (vt).derive = (
derive_t)(raw);
\
+ (vt).derive = (
((derive_t)(raw)*scale) + shift);
\
else /* if (ds->ds[0].type == DS_TYPE_ABSOLUTE) */ \
else /* if (ds->ds[0].type == DS_TYPE_ABSOLUTE) */ \
- (vt).absolute = (
absolute_t)(raw);
\
+ (vt).absolute = (
((absolute_t)(raw)*scale) + shift);
\
} while (0)
static int mb_read_data(mb_host_t *host, mb_slave_t *slave, /* {{{ */
} while (0)
static int mb_read_data(mb_host_t *host, mb_slave_t *slave, /* {{{ */
@@
-537,7
+539,7
@@
static int mb_read_data(mb_host_t *host, mb_slave_t *slave, /* {{{ */
"Returned float value is %g",
(double)float_value);
"Returned float value is %g",
(double)float_value);
- CAST_TO_VALUE_T(ds, vt, float_value);
+ CAST_TO_VALUE_T(ds, vt, float_value
, data->scale, data->shift
);
mb_submit(host, slave, data, vt);
} else if (data->register_type == REG_TYPE_FLOAT_CDAB) {
float float_value;
mb_submit(host, slave, data, vt);
} else if (data->register_type == REG_TYPE_FLOAT_CDAB) {
float float_value;
@@
-548,7
+550,7
@@
static int mb_read_data(mb_host_t *host, mb_slave_t *slave, /* {{{ */
"Returned float value is %g",
(double)float_value);
"Returned float value is %g",
(double)float_value);
- CAST_TO_VALUE_T(ds, vt, float_value);
+ CAST_TO_VALUE_T(ds, vt, float_value
, data->scale, data->shift
);
mb_submit(host, slave, data, vt);
} else if (data->register_type == REG_TYPE_INT32) {
union {
mb_submit(host, slave, data, vt);
} else if (data->register_type == REG_TYPE_INT32) {
union {
@@
-562,7
+564,7
@@
static int mb_read_data(mb_host_t *host, mb_slave_t *slave, /* {{{ */
"Returned int32 value is %" PRIi32,
v.i32);
"Returned int32 value is %" PRIi32,
v.i32);
- CAST_TO_VALUE_T(ds, vt, v.i32);
+ CAST_TO_VALUE_T(ds, vt, v.i32
, data->scale, data->shift
);
mb_submit(host, slave, data, vt);
} else if (data->register_type == REG_TYPE_INT32_CDAB) {
union {
mb_submit(host, slave, data, vt);
} else if (data->register_type == REG_TYPE_INT32_CDAB) {
union {
@@
-576,7
+578,7
@@
static int mb_read_data(mb_host_t *host, mb_slave_t *slave, /* {{{ */
"Returned int32 value is %" PRIi32,
v.i32);
"Returned int32 value is %" PRIi32,
v.i32);
- CAST_TO_VALUE_T(ds, vt, v.i32);
+ CAST_TO_VALUE_T(ds, vt, v.i32
, data->scale, data->shift
);
mb_submit(host, slave, data, vt);
} else if (data->register_type == REG_TYPE_INT16) {
union {
mb_submit(host, slave, data, vt);
} else if (data->register_type == REG_TYPE_INT16) {
union {
@@
-591,7
+593,7
@@
static int mb_read_data(mb_host_t *host, mb_slave_t *slave, /* {{{ */
"Returned int16 value is %" PRIi16,
v.i16);
"Returned int16 value is %" PRIi16,
v.i16);
- CAST_TO_VALUE_T(ds, vt, v.i16);
+ CAST_TO_VALUE_T(ds, vt, v.i16
, data->scale, data->shift
);
mb_submit(host, slave, data, vt);
} else if (data->register_type == REG_TYPE_UINT32) {
uint32_t v32;
mb_submit(host, slave, data, vt);
} else if (data->register_type == REG_TYPE_UINT32) {
uint32_t v32;
@@
-602,7
+604,7
@@
static int mb_read_data(mb_host_t *host, mb_slave_t *slave, /* {{{ */
"Returned uint32 value is %" PRIu32,
v32);
"Returned uint32 value is %" PRIu32,
v32);
- CAST_TO_VALUE_T(ds, vt, v32);
+ CAST_TO_VALUE_T(ds, vt, v32
, data->scale, data->shift
);
mb_submit(host, slave, data, vt);
} else if (data->register_type == REG_TYPE_UINT32_CDAB) {
uint32_t v32;
mb_submit(host, slave, data, vt);
} else if (data->register_type == REG_TYPE_UINT32_CDAB) {
uint32_t v32;
@@
-613,7
+615,7
@@
static int mb_read_data(mb_host_t *host, mb_slave_t *slave, /* {{{ */
"Returned uint32 value is %" PRIu32,
v32);
"Returned uint32 value is %" PRIu32,
v32);
- CAST_TO_VALUE_T(ds, vt, v32);
+ CAST_TO_VALUE_T(ds, vt, v32
, data->scale, data->shift
);
mb_submit(host, slave, data, vt);
} else if (data->register_type == REG_TYPE_UINT64) {
uint64_t v64;
mb_submit(host, slave, data, vt);
} else if (data->register_type == REG_TYPE_UINT64) {
uint64_t v64;
@@
-625,7
+627,7
@@
static int mb_read_data(mb_host_t *host, mb_slave_t *slave, /* {{{ */
"Returned uint64 value is %" PRIu64,
v64);
"Returned uint64 value is %" PRIu64,
v64);
- CAST_TO_VALUE_T(ds, vt, v64);
+ CAST_TO_VALUE_T(ds, vt, v64
, data->scale, data->shift
);
mb_submit(host, slave, data, vt);
} else if (data->register_type == REG_TYPE_INT64) {
union {
mb_submit(host, slave, data, vt);
} else if (data->register_type == REG_TYPE_INT64) {
union {
@@
-640,7
+642,7
@@
static int mb_read_data(mb_host_t *host, mb_slave_t *slave, /* {{{ */
"Returned uint64 value is %" PRIi64,
v.i64);
"Returned uint64 value is %" PRIi64,
v.i64);
- CAST_TO_VALUE_T(ds, vt, v.i64);
+ CAST_TO_VALUE_T(ds, vt, v.i64
, data->scale, data->shift
);
mb_submit(host, slave, data, vt);
} else /* if (data->register_type == REG_TYPE_UINT16) */
{
mb_submit(host, slave, data, vt);
} else /* if (data->register_type == REG_TYPE_UINT16) */
{
@@
-650,7
+652,7
@@
static int mb_read_data(mb_host_t *host, mb_slave_t *slave, /* {{{ */
"Returned uint16 value is %" PRIu16,
values[0]);
"Returned uint16 value is %" PRIu16,
values[0]);
- CAST_TO_VALUE_T(ds, vt, values[0]);
+ CAST_TO_VALUE_T(ds, vt, values[0]
, data->scale, data->shift
);
mb_submit(host, slave, data, vt);
}
mb_submit(host, slave, data, vt);
}
@@
-757,6
+759,8
@@
static int mb_config_add_data(oconfig_item_t *ci) /* {{{ */
data.name = NULL;
data.register_type = REG_TYPE_UINT16;
data.next = NULL;
data.name = NULL;
data.register_type = REG_TYPE_UINT16;
data.next = NULL;
+ data.scale = 1;
+ data.shift = 0;
status = cf_util_get_string(ci, &data.name);
if (status != 0)
status = cf_util_get_string(ci, &data.name);
if (status != 0)
@@
-770,6
+774,10
@@
static int mb_config_add_data(oconfig_item_t *ci) /* {{{ */
else if (strcasecmp("Instance", child->key) == 0)
status = cf_util_get_string_buffer(child, data.instance,
sizeof(data.instance));
else if (strcasecmp("Instance", child->key) == 0)
status = cf_util_get_string_buffer(child, data.instance,
sizeof(data.instance));
+ else if (strcasecmp("Scale", child->key) == 0)
+ status = cf_util_get_double(child, &data.scale);
+ else if (strcasecmp("Shift", child->key) == 0)
+ status = cf_util_get_double(child, &data.shift);
else if (strcasecmp("RegisterBase", child->key) == 0)
status = cf_util_get_int(child, &data.register_base);
else if (strcasecmp("RegisterType", child->key) == 0) {
else if (strcasecmp("RegisterBase", child->key) == 0)
status = cf_util_get_int(child, &data.register_base);
else if (strcasecmp("RegisterType", child->key) == 0) {