X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fmodbus.c;h=19848b0b330c056b71a82b92888631c0f1b59830;hb=2979ae00227051ea79c9294ebfaf8337e8e308e2;hp=17396edfbef1dec4eaaf51eb023e17590a1194db;hpb=0eff156c7816507fa1865b76e948574dd320fae0;p=collectd.git diff --git a/src/modbus.c b/src/modbus.c index 17396edf..19848b0b 100644 --- a/src/modbus.c +++ b/src/modbus.c @@ -1,19 +1,20 @@ /** * collectd - src/modbus.c - * Copyright (C) 2010 noris network AG + * Copyright (C) 2010,2011 noris network AG * * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; only version 2 of the License is applicable. + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; only version 2.1 of the License is + * applicable. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. + * Lesser General Public License for more details. * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Authors: * Florian Forster @@ -68,6 +69,8 @@ */ enum mb_register_type_e /* {{{ */ { + REG_TYPE_INT16, + REG_TYPE_INT32, REG_TYPE_UINT16, REG_TYPE_UINT32, REG_TYPE_FLOAT @@ -410,6 +413,7 @@ static int mb_read_data (mb_host_t *host, mb_slave_t *slave, /* {{{ */ } if ((ds->ds[0].type != DS_TYPE_GAUGE) + && (data->register_type != REG_TYPE_INT32) && (data->register_type != REG_TYPE_UINT32)) { NOTICE ("Modbus plugin: The data source of type \"%s\" is %s, not gauge. " @@ -418,7 +422,8 @@ static int mb_read_data (mb_host_t *host, mb_slave_t *slave, /* {{{ */ } memset (values, 0, sizeof (values)); - if ((data->register_type == REG_TYPE_UINT32) + if ((data->register_type == REG_TYPE_INT32) + || (data->register_type == REG_TYPE_UINT32) || (data->register_type == REG_TYPE_FLOAT)) values_num = 2; else @@ -501,12 +506,47 @@ static int mb_read_data (mb_host_t *host, mb_slave_t *slave, /* {{{ */ CAST_TO_VALUE_T (ds, vt, float_value); mb_submit (host, slave, data, vt); } + else if (data->register_type == REG_TYPE_INT32) + { + union + { + uint32_t u32; + int32_t i32; + } v; + value_t vt; + + v.u32 = (((uint32_t) values[0]) << 16) + | ((uint32_t) values[1]); + DEBUG ("Modbus plugin: mb_read_data: " + "Returned int32 value is %"PRIi32, v.i32); + + CAST_TO_VALUE_T (ds, vt, v.i32); + mb_submit (host, slave, data, vt); + } + else if (data->register_type == REG_TYPE_INT16) + { + union + { + uint16_t u16; + int16_t i16; + } v; + value_t vt; + + v.u16 = values[0]; + + DEBUG ("Modbus plugin: mb_read_data: " + "Returned int16 value is %"PRIi16, v.i16); + + CAST_TO_VALUE_T (ds, vt, v.i16); + mb_submit (host, slave, data, vt); + } else if (data->register_type == REG_TYPE_UINT32) { uint32_t v32; value_t vt; - v32 = (values[0] << 16) | values[1]; + v32 = (((uint32_t) values[0]) << 16) + | ((uint32_t) values[1]); DEBUG ("Modbus plugin: mb_read_data: " "Returned uint32 value is %"PRIu32, v32); @@ -662,6 +702,10 @@ static int mb_config_add_data (oconfig_item_t *ci) /* {{{ */ status = cf_util_get_string_buffer (child, tmp, sizeof (tmp)); if (status != 0) /* do nothing */; + else if (strcasecmp ("Int16", tmp) == 0) + data.register_type = REG_TYPE_INT16; + else if (strcasecmp ("Int32", tmp) == 0) + data.register_type = REG_TYPE_INT32; else if (strcasecmp ("Uint16", tmp) == 0) data.register_type = REG_TYPE_UINT16; else if (strcasecmp ("Uint32", tmp) == 0)