guowenxue
2021-04-21 e0e3a637e92dbe3c7700cc541410ff19b3b0c80c
update iotd hal functions
6 files modified
647 ■■■■■ changed files
iotd/conf/conf.c 28 ●●●●● patch | view | raw | blame | history
iotd/hal/gpio.c 92 ●●●●● patch | view | raw | blame | history
iotd/hal/gpio.h 4 ●●●● patch | view | raw | blame | history
iotd/hal/hal.c 11 ●●●● patch | view | raw | blame | history
iotd/hal/sht20.c 496 ●●●● patch | view | raw | blame | history
iotd/hal/tsl2561.c 16 ●●●● patch | view | raw | blame | history
iotd/conf/conf.c
@@ -266,14 +266,16 @@
    if( !(str=iniparser_getstring(ini, "subsciber:subTopic", NULL)) )
    {
        log_err("ERROR: Parser MQTT subscribe topic failure\n");
        return -2;
        log_warn("WARNNING: Parser MQTT subscribe topic failure\n");
    }
    strncpy(mqtt_ctx->subTopic, str, sizeof(mqtt_ctx->subTopic) );
    else
    {
        strncpy(mqtt_ctx->subTopic, str, sizeof(mqtt_ctx->subTopic) );
        mqtt_ctx->subQos = iniparser_getint(ini, "subsciber:subQos", 0);
        mqtt_ctx->sub_enable = 1;
    mqtt_ctx->subQos = iniparser_getint(ini, "subsciber:subQos", 0);
    log_nrml("Parser subscriber topic \"%s\" with Qos[%d]\n", mqtt_ctx->subTopic, mqtt_ctx->subQos);
    mqtt_ctx->sub_enable = 1;
        log_nrml("Parser subscriber topic \"%s\" with Qos[%d]\n", mqtt_ctx->subTopic, mqtt_ctx->subQos);
    }
    /*+------------------------------------------------------+
     *|             parser publisher settings                |
@@ -281,14 +283,16 @@
    if( !(str=iniparser_getstring(ini, "publisher:pubTopic", NULL)) )
    {
        log_err("ERROR: Parser MQTT publisher topic failure\n");
        return -2;
        log_warn("WARNNING: Parser MQTT publisher topic failure\n");
    }
    strncpy(mqtt_ctx->pubTopic, str, sizeof(mqtt_ctx->pubTopic) );
    else
    {
        strncpy(mqtt_ctx->pubTopic, str, sizeof(mqtt_ctx->pubTopic) );
        mqtt_ctx->pubQos = iniparser_getint(ini, "publisher:pubQos", 0);
        mqtt_ctx->pub_enable = 1;
    mqtt_ctx->pubQos = iniparser_getint(ini, "publisher:pubQos", 0);
    log_nrml("Parser publisher topic \"%s\" with Qos[%d]\n", mqtt_ctx->pubTopic, mqtt_ctx->pubQos);
    mqtt_ctx->pub_enable = 1;
        log_nrml("Parser publisher topic \"%s\" with Qos[%d]\n", mqtt_ctx->pubTopic, mqtt_ctx->pubQos);
    }
    return 0;
iotd/hal/gpio.c
@@ -21,18 +21,100 @@
int gpio_init(gpio_t *gpio)
{
    int                 i;
    gpio_info_t        *gpioinfo;
    s_gpio = gpio;
    if( !gpio )
    {
        log_err("Invalid input arguments $gpio\n");
        return -1;
    }
    s_gpio = gpio;
    if( !gpio->incnt && !gpio->outcnt )
    {
        log_warn("WARNNING: No GPIO pins configured\n");
        return 0;
    }
    /*  gpiod open chip */
    s_chip = gpiod_chip_open_by_name(RPI_GPIONAME);
    if( !s_chip )
    {
        log_err("gpiod open chip failure, maybe you need running as root\n");
        return -2;
    }
    log_nrml("gpiod initialise open chip ok\n");
    /*  gpiod request all output pins */
    for(i=0; i<gpio->outcnt; i++)
    {
        gpio->output[i].line = gpiod_chip_get_line(s_chip, gpio->output[i].pin);
        if( !gpio->output[i].line )
        {
            log_err("gpiod get line for '%s' pin[#%d] failure\n", gpio->output[i].name, gpio->output[i].pin );
            return -2;
        }
        gpiod_line_request_output(gpio->output[i].line, gpio->output[i].name, !gpio->output[i].active_level);
        log_nrml("gpiod request '%s' pin[#%d] output ok\n", gpio->output[i].name, gpio->output[i].pin);
    }
    /*  gpiod request all input pins */
    for(i=0; i<gpio->incnt; i++)
    {
        gpio->input[i].line = gpiod_chip_get_line(s_chip, gpio->input[i].pin);
        if( !gpio->input[i].line )
        {
            log_err("gpiod get line for '%s' pin[#%d] failure\n", gpio->input[i].name, gpio->input[i].pin );
            return -2;
        }
        if( gpio->output[i].active_level )
        {
            gpiod_line_request_rising_edge_events(gpio->input[i].line, gpio->input[i].name);
            log_nrml("gpiod request '%s' pin[#%d] for rising edge event ok\n", gpio->input[i].name, gpio->input[i].pin);
        }
        else
        {
            gpiod_line_request_falling_edge_events(gpio->input[i].line, gpio->input[i].name);
            log_nrml("gpiod request '%s' pin[#%d] for falling edge event ok\n", gpio->input[i].name, gpio->input[i].pin);
        }
    }
}
void gpio_term(void)
{
    return ;
    int              i;
    log_nrml("start teriminated GPIO\n");
    if( !s_gpio->incnt && !s_gpio->outcnt )
    {
        return ;
    }
    for(i=0; i<s_gpio->outcnt; i++)
    {
        gpiod_line_release(s_gpio->output[i].line);
    }
    for(i=0; i<s_gpio->incnt; i++)
    {
        gpiod_line_release(s_gpio->input[i].line);
    }
    gpiod_chip_close(s_chip);
}
void gpio_out(char *name, int cmd)
@@ -51,17 +133,17 @@
    if( !found )
    {
        log_err("GPIO output for [%s] pin not found\n", name);
        log_err("GPIO output for '%s' pin not found\n", name);
        return ;
    }
    if( OFF == cmd )
    {
        gpiod_line_set_value(s_gpio->output[i].lines, s_gpio->output[i].active_level);
        gpiod_line_set_value(s_gpio->output[i].line, s_gpio->output[i].active_level);
    }
    else
    {
        gpiod_line_set_value(s_gpio->output[i].lines, !s_gpio->output[i].active_level);
        gpiod_line_set_value(s_gpio->output[i].line, !s_gpio->output[i].active_level);
    }
    return ;
iotd/hal/gpio.h
@@ -25,9 +25,9 @@
typedef struct gpio_info_s
{
    char                 name[32];      /*  GPIO connected module name */
    int                  pin;          /*  GPIO BCM pin number */
    int                  pin;           /*  GPIO BCM pin number */
    int                  active_level;  /*  active power level */
    struct gpiod_line   *lines;         /*  gpiod lines */
    struct gpiod_line   *line;          /*  gpiod line */
} gpio_info_t;
iotd/hal/hal.c
@@ -17,7 +17,6 @@
int hal_init(hal_ctx_t *ctx)
{
    int                   i;
    gpio_info_t          *gpio = NULL;
    if(!ctx)
    {
@@ -32,15 +31,23 @@
            log_err("R&H sensor SHT2X initialise failure\n");
            return -2;
        }
        else
        {
            log_nrml("R&H sensor SHT2X initialise okay\n");
        }
    }
    if( ctx->lux_enable )
    {
        if( tsl2561_init()< 0 )
        if( tsl2561_init() < 0 )
        {
            log_err("LUX sensor TSL2561 initialise failure\n");
            return -2;
        }
        else
        {
            log_nrml("LUX sensor TSL2561 initialise okay\n");
        }
    }
    gpio_init(&ctx->gpio);
iotd/hal/sht20.c
@@ -68,57 +68,58 @@
int sht2x_softreset(int fd)
{
    uint8_t           buf[4];
    uint8_t           buf[4];
    if( fd<0 )
    {
        log_err("Invalid input arguments\n");
        return -1;
    }
    if( fd<0 )
    {
        log_err("Invalid input arguments\n");
        return -1;
    }
    /* software reset SHT2x */
    memset(buf, 0, sizeof(buf));
    /* software reset SHT2x */
    memset(buf, 0, sizeof(buf));
    buf[0] = SOFTRESET;
    write(fd, buf, 1);
    buf[0] = SOFTRESET;
    write(fd, buf, 1);
    msleep(50);
    msleep(50);
    return 0;
    return 0;
}
int sht2x_init(void)
{
    if( (s_sht2x_fd=open("/dev/i2c-1", O_RDWR)) < 0)
    {
        log_fatal("i2c device open failed: %s\n", strerror(errno));
    if( (s_sht2x_fd=open("/dev/i2c-1", O_RDWR)) < 0)
    {
        log_fatal("i2c device open failed: %s\n", strerror(errno));
        return -1;
    }
    /* set I2C mode and SHT2x slave address */
    ioctl(s_sht2x_fd, I2C_TENBIT, 0);    /* Not 10-bit but 7-bit mode */
    ioctl(s_sht2x_fd, I2C_SLAVE, 0x40); /* set SHT2x slava address 0x40*/
    }
    if( sht2x_softreset(s_sht2x_fd) < 0 )
    {
        log_err("SHT2x softreset failure\n");
    /* set I2C mode and SHT2x slave address */
    ioctl(s_sht2x_fd, I2C_TENBIT, 0);    /* Not 10-bit but 7-bit mode */
    ioctl(s_sht2x_fd, I2C_SLAVE, 0x40); /* set SHT2x slava address 0x40*/
    if( sht2x_softreset(s_sht2x_fd) < 0 )
    {
        log_err("SHT2x softreset failure\n");
        sht2x_term();
        return -2;
    }
        return -2;
    }
    return s_sht2x_fd;
    log_dbg("SHT2X initialise ok, s_sht2x_fd=%d\n", s_sht2x_fd);
    return s_sht2x_fd;
}
int sht2x_get_temp_humidity(float *temp, float *rh)
{
    uint8_t           buf[4];
    uint8_t           buf[4];
    if( !temp || !rh )
    {
        log_err("Invalid input arguments\n");
        return -1;
    }
    if( !temp || !rh )
    {
        log_err("Invalid input arguments\n");
        return -1;
    }
    if( s_sht2x_fd < 0 )
    {
@@ -129,42 +130,42 @@
        }
    }
    /* send trigger temperature measure command and read the data */
    memset(buf, 0, sizeof(buf));
    buf[0]=TRIGGER_TEMPERATURE_NO_HOLD;
    write(s_sht2x_fd, buf, 1);
    /* send trigger temperature measure command and read the data */
    memset(buf, 0, sizeof(buf));
    buf[0]=TRIGGER_TEMPERATURE_NO_HOLD;
    write(s_sht2x_fd, buf, 1);
    msleep(85); /* datasheet: typ=66, max=85 */
    msleep(85); /* datasheet: typ=66, max=85 */
    memset(buf, 0, sizeof(buf));
    read(s_sht2x_fd, buf, 3);
    //dump_buf("Temperature sample data: ", buf, 3);
    *temp = 175.72 * (((((int) buf[0]) << 8) + buf[1]) / 65536.0) - 46.85;
    /* send trigger humidity measure command and read the data */
    memset(buf, 0, sizeof(buf));
    buf[0] = TRIGGER_HUMIDITY_NO_HOLD;
    write(s_sht2x_fd, buf, 1);
    memset(buf, 0, sizeof(buf));
    read(s_sht2x_fd, buf, 3);
    //dump_buf("Temperature sample data: ", buf, 3);
    *temp = 175.72 * (((((int) buf[0]) << 8) + buf[1]) / 65536.0) - 46.85;
    msleep(29); /* datasheet: typ=22, max=29 */
    memset(buf, 0, sizeof(buf));
    /* send trigger humidity measure command and read the data */
    memset(buf, 0, sizeof(buf));
    buf[0] = TRIGGER_HUMIDITY_NO_HOLD;
    write(s_sht2x_fd, buf, 1);
    read(s_sht2x_fd, buf, 3);
    //dump_buf("Relative humidity sample data: ", buf, 3);
    *rh = 125 * (((((int) buf[0]) << 8) + buf[1]) / 65536.0) - 6;
    msleep(29); /* datasheet: typ=22, max=29 */
    memset(buf, 0, sizeof(buf));
    return 0;
    read(s_sht2x_fd, buf, 3);
    //dump_buf("Relative humidity sample data: ", buf, 3);
    *rh = 125 * (((((int) buf[0]) << 8) + buf[1]) / 65536.0) - 6;
    return 0;
}
int sht2x_get_serialnumber(uint8_t *serialnumber, int size)
{
    uint8_t           buf[4];
    uint8_t           buf[4];
    if( !serialnumber || size!=8 )
    {
        log_err("Invalid input arguments\n");
        return -1;
    }
    if( !serialnumber || size!=8 )
    {
        log_err("Invalid input arguments\n");
        return -1;
    }
    if( s_sht2x_fd < 0 )
    {
@@ -175,37 +176,37 @@
        }
    }
    /* Read SerialNumber from Location 1 */
    memset(buf, 0, sizeof(buf));
    buf[0] = 0xfa;  /* command for readout on-chip memory */
    buf[1] = 0x0f;  /* on-chip memory address */
    write(s_sht2x_fd, buf, 2);
    /* Read SerialNumber from Location 1 */
    memset(buf, 0, sizeof(buf));
    buf[0] = 0xfa;  /* command for readout on-chip memory */
    buf[1] = 0x0f;  /* on-chip memory address */
    write(s_sht2x_fd, buf, 2);
    memset(buf, 0, sizeof(buf));
    read(s_sht2x_fd, buf, 4);
    memset(buf, 0, sizeof(buf));
    read(s_sht2x_fd, buf, 4);
    serialnumber[5]=buf[0]; /* Read SNB_3 */
    serialnumber[4]=buf[1]; /* Read SNB_2 */
    serialnumber[3]=buf[2]; /* Read SNB_1 */
    serialnumber[2]=buf[3]; /* Read SNB_0 */
    /* Read SerialNumber from Location 2 */
    memset(buf, 0, sizeof(buf) );
    buf[0]=0xfc;  /* command for readout on-chip memory */
    buf[1]=0xc9;  /* on-chip memory address */
    write(s_sht2x_fd, buf, 2);
    serialnumber[5]=buf[0]; /* Read SNB_3 */
    serialnumber[4]=buf[1]; /* Read SNB_2 */
    serialnumber[3]=buf[2]; /* Read SNB_1 */
    serialnumber[2]=buf[3]; /* Read SNB_0 */
    memset(buf, 0, sizeof(buf) );
    read(s_sht2x_fd, buf, 4);
    /* Read SerialNumber from Location 2 */
    memset(buf, 0, sizeof(buf) );
    buf[0]=0xfc;  /* command for readout on-chip memory */
    buf[1]=0xc9;  /* on-chip memory address */
    write(s_sht2x_fd, buf, 2);
    serialnumber[1]=buf[0]; /* Read SNC_1 */
    serialnumber[0]=buf[1]; /* Read SNC_0 */
    serialnumber[7]=buf[2]; /* Read SNA_1 */
    serialnumber[6]=buf[3]; /* Read SNA_0 */
    memset(buf, 0, sizeof(buf) );
    read(s_sht2x_fd, buf, 4);
    //dump_buf("SHT2x Serial number: ", serialnumber, 8);
    serialnumber[1]=buf[0]; /* Read SNC_1 */
    serialnumber[0]=buf[1]; /* Read SNC_0 */
    serialnumber[7]=buf[2]; /* Read SNA_1 */
    serialnumber[6]=buf[3]; /* Read SNA_0 */
    return 0;
    //dump_buf("SHT2x Serial number: ", serialnumber, 8);
    return 0;
}
#elif (defined I2C_API_IOCTL)  /* Use I2C userspace driver read/write API */
@@ -213,67 +214,68 @@
int sht2x_softreset(int fd)
{
    struct i2c_msg               msg;
    struct i2c_rdwr_ioctl_data   sht2x_data;
    uint8_t                      buf[2];
    struct i2c_rdwr_ioctl_data   sht2x_data;
    uint8_t                      buf[2];
    if( fd<0 )
    {
        log_err("Invalid input arguments\n");
        return -1;
    }
    if( fd<0 )
    {
        log_err("Invalid input arguments\n");
        return -1;
    }
    msg.addr= 0x40;
    msg.flags=0; //write
    msg.len= 1;
    msg.buf= buf;
    msg.buf[0]=SOFTRESET;
    msg.addr= 0x40;
    msg.flags=0; //write
    msg.len= 1;
    msg.buf= buf;
    msg.buf[0]=SOFTRESET;
    sht2x_data.nmsgs= 1;
    sht2x_data.msgs= &msg;
    sht2x_data.nmsgs= 1;
    sht2x_data.msgs= &msg;
    if( ioctl(fd, I2C_RDWR, &sht2x_data) < 0 )
    {
        log_err("sht2x I2C_RDWR ioctl failure: %s\n", strerror(errno));
    if( ioctl(fd, I2C_RDWR, &sht2x_data) < 0 )
    {
        log_err("sht2x I2C_RDWR ioctl failure: %s\n", strerror(errno));
        sht2x_term();
        return -2;
    }
        return -2;
    }
    msleep(50);
    msleep(50);
    return 0;
    return 0;
}
int sht2x_init(void)
{
    if( (s_sht2x_fd=open("/dev/i2c-1", O_RDWR)) < 0)
    {
    if( (s_sht2x_fd=open("/dev/i2c-1", O_RDWR)) < 0)
    {
        log_err("i2c device open failed: %s\n", strerror(errno));
        return -1;
    }
    }
    if( sht2x_softreset(s_sht2x_fd) < 0 )
    {
        log_err("SHT2x softreset failure\n");
    if( sht2x_softreset(s_sht2x_fd) < 0 )
    {
        log_err("SHT2x softreset failure\n");
        sht2x_term();
        return -2;
    }
        return -2;
    }
    log_dbg("SHT2X initialise ok, s_sht2x_fd=%d\n", s_sht2x_fd);
    return 0;
}
int sht2x_get_serialnumber(uint8_t *serialnumber, int size)
{
    struct i2c_msg               msgs[2];
    struct i2c_rdwr_ioctl_data   sht2x_data;
    uint8_t                      sbuf[2];
    uint8_t                      rbuf[4];
    struct i2c_rdwr_ioctl_data   sht2x_data;
    uint8_t                      sbuf[2];
    uint8_t                      rbuf[4];
    if( !serialnumber || size!=8 )
    {
        log_err("Invalid input arguments\n");
        return -1;
    }
    if( !serialnumber || size!=8 )
    {
        log_err("Invalid input arguments\n");
        return -1;
    }
    if( s_sht2x_fd < 0 )
    {
@@ -284,86 +286,86 @@
        }
    }
    /*+------------------------------------------+
     *|     Read SerialNumber from Location 1    |
     *+------------------------------------------+*/
    /*+------------------------------------------+
     *|     Read SerialNumber from Location 1    |
     *+------------------------------------------+*/
    msgs[0].addr= 0x40;
    msgs[0].flags=0; //write
    msgs[0].len= 2;
    msgs[0].buf= sbuf;
    msgs[0].buf[0]=0xfa;  /* command for readout on-chip memory */
    msgs[0].buf[1]=0x0f;  /* on-chip memory address */
    msgs[1].addr=0x40;
    msgs[1].flags=I2C_M_RD; //write
    msgs[1].len= 4;
    msgs[1].buf= rbuf;
    msgs[0].addr= 0x40;
    msgs[0].flags=0; //write
    msgs[0].len= 2;
    msgs[0].buf= sbuf;
    msgs[0].buf[0]=0xfa;  /* command for readout on-chip memory */
    msgs[0].buf[1]=0x0f;  /* on-chip memory address */
    sht2x_data.nmsgs= 2;
    sht2x_data.msgs= msgs;
    msgs[1].addr=0x40;
    msgs[1].flags=I2C_M_RD; //write
    msgs[1].len= 4;
    msgs[1].buf= rbuf;
    if( ioctl(s_sht2x_fd, I2C_RDWR, &sht2x_data) < 0 )
    {
        log_err("sht2x I2C_RDWR ioctl failure: %s\n", strerror(errno));
    sht2x_data.nmsgs= 2;
    sht2x_data.msgs= msgs;
    if( ioctl(s_sht2x_fd, I2C_RDWR, &sht2x_data) < 0 )
    {
        log_err("sht2x I2C_RDWR ioctl failure: %s\n", strerror(errno));
        sht2x_term();
        return -2;
    }
    serialnumber[5]=rbuf[0]; /* Read SNB_3 */
        return -2;
    }
    serialnumber[5]=rbuf[0]; /* Read SNB_3 */
    serialnumber[4]=rbuf[1]; /* Read SNB_2 */
    serialnumber[3]=rbuf[2]; /* Read SNB_1 */
    serialnumber[2]=rbuf[3]; /* Read SNB_0 */
    /*+------------------------------------------+
     *|     Read SerialNumber from Location 2    |
     *+------------------------------------------+*/
    msgs[0].addr= 0x40;
    msgs[0].flags=0; //write
    msgs[0].len= 2;
    msgs[0].buf= sbuf;
    msgs[0].buf[0]=0xfc;  /* command for readout on-chip memory */
    msgs[0].buf[1]=0xc9;  /* on-chip memory address */
    msgs[1].addr=0x40;
    msgs[1].flags=I2C_M_RD; //write
    msgs[1].len= 4;
    msgs[1].buf= rbuf;
    /*+------------------------------------------+
     *|     Read SerialNumber from Location 2    |
     *+------------------------------------------+*/
    sht2x_data.nmsgs= 2;
    sht2x_data.msgs= msgs;
    msgs[0].addr= 0x40;
    msgs[0].flags=0; //write
    msgs[0].len= 2;
    msgs[0].buf= sbuf;
    msgs[0].buf[0]=0xfc;  /* command for readout on-chip memory */
    msgs[0].buf[1]=0xc9;  /* on-chip memory address */
    if( ioctl(s_sht2x_fd, I2C_RDWR, &sht2x_data) < 0 )
    {
        log_err("sht2x I2C_RDWR ioctl failure: %s\n", strerror(errno));
    msgs[1].addr=0x40;
    msgs[1].flags=I2C_M_RD; //write
    msgs[1].len= 4;
    msgs[1].buf= rbuf;
    sht2x_data.nmsgs= 2;
    sht2x_data.msgs= msgs;
    if( ioctl(s_sht2x_fd, I2C_RDWR, &sht2x_data) < 0 )
    {
        log_err("sht2x I2C_RDWR ioctl failure: %s\n", strerror(errno));
        sht2x_term();
        return -2;
    }
    serialnumber[1]=rbuf[0]; /* Read SNC_1 */
    serialnumber[0]=rbuf[1]; /* Read SNC_0 */
    serialnumber[7]=rbuf[2]; /* Read SNA_1 */
    serialnumber[6]=rbuf[3]; /* Read SNA_0 */
        return -2;
    }
    //dump_buf("SHT2x Serial number: ", serialnumber, 8);
    serialnumber[1]=rbuf[0]; /* Read SNC_1 */
    serialnumber[0]=rbuf[1]; /* Read SNC_0 */
    serialnumber[7]=rbuf[2]; /* Read SNA_1 */
    serialnumber[6]=rbuf[3]; /* Read SNA_0 */
    return 0;
    //dump_buf("SHT2x Serial number: ", serialnumber, 8);
    return 0;
}
int sht2x_get_temp_humidity(float *temp, float *rh)
{
    struct i2c_msg               msg;
    struct i2c_rdwr_ioctl_data   sht2x_data;
    uint8_t                      buf[4];
    struct i2c_rdwr_ioctl_data   sht2x_data;
    uint8_t                      buf[4];
    if( !temp || !rh )
    {
        log_err("Invalid input arguments\n");
        return -1;
    }
    if( !temp || !rh )
    {
        log_err("Invalid input arguments\n");
        return -1;
    }
    if( s_sht2x_fd < 0 )
    {
@@ -373,91 +375,91 @@
            return -2;
        }
    }
    /*+------------------------------------------+
     *|       measure and get temperature        |
     *+------------------------------------------+*/
    msg.addr= 0x40;
    msg.flags=0; //write
    msg.len= 1;
    msg.buf= buf;
    msg.buf[0]=TRIGGER_TEMPERATURE_NO_HOLD;  /* trigger temperature without hold I2C bus */
    /*+------------------------------------------+
     *|       measure and get temperature        |
     *+------------------------------------------+*/
    sht2x_data.nmsgs= 1;
    sht2x_data.msgs= &msg;
    msg.addr= 0x40;
    msg.flags=0; //write
    msg.len= 1;
    msg.buf= buf;
    msg.buf[0]=TRIGGER_TEMPERATURE_NO_HOLD;  /* trigger temperature without hold I2C bus */
    if( ioctl(s_sht2x_fd, I2C_RDWR, &sht2x_data) < 0 )
    {
        log_err("sht2x I2C_RDWR ioctl failure: %s\n", strerror(errno));
    sht2x_data.nmsgs= 1;
    sht2x_data.msgs= &msg;
    if( ioctl(s_sht2x_fd, I2C_RDWR, &sht2x_data) < 0 )
    {
        log_err("sht2x I2C_RDWR ioctl failure: %s\n", strerror(errno));
        sht2x_term();
        return -2;
    }
        return -2;
    }
    msleep(85);
    memset(buf, 0, sizeof(buf));
    msg.addr=0x40;
    msg.flags=I2C_M_RD; //write
    msg.len= 3;
    msg.buf= buf;
    msleep(85);
    sht2x_data.nmsgs= 1;
    sht2x_data.msgs= &msg;
    memset(buf, 0, sizeof(buf));
    msg.addr=0x40;
    msg.flags=I2C_M_RD; //write
    msg.len= 3;
    msg.buf= buf;
    if( ioctl(s_sht2x_fd, I2C_RDWR, &sht2x_data) < 0 )
    {
        log_err("sht2x I2C_RDWR ioctl failure: %s\n", strerror(errno));
    sht2x_data.nmsgs= 1;
    sht2x_data.msgs= &msg;
    if( ioctl(s_sht2x_fd, I2C_RDWR, &sht2x_data) < 0 )
    {
        log_err("sht2x I2C_RDWR ioctl failure: %s\n", strerror(errno));
        sht2x_term();
        return -2;
    }
    //dump_buf("Temperature sample data: ", buf, 3);
    *temp = 175.72 * (((((int) buf[0]) << 8) + buf[1]) / 65536.0) - 46.85;
        return -2;
    }
    /*+------------------------------------------+
     *|    measure and get relative humidity     |
     *+------------------------------------------+*/
    //dump_buf("Temperature sample data: ", buf, 3);
    *temp = 175.72 * (((((int) buf[0]) << 8) + buf[1]) / 65536.0) - 46.85;
    msg.addr= 0x40;
    msg.flags=0; //write
    msg.len= 1;
    msg.buf= buf;
    msg.buf[0]=TRIGGER_HUMIDITY_NO_HOLD;  /* trigger humidity without hold I2C bus */
    sht2x_data.nmsgs= 1;
    sht2x_data.msgs= &msg;
    /*+------------------------------------------+
     *|    measure and get relative humidity     |
     *+------------------------------------------+*/
    if( ioctl(s_sht2x_fd, I2C_RDWR, &sht2x_data) < 0 )
    {
        log_err("sht2x I2C_RDWR ioctl failure: %s\n", strerror(errno));
    msg.addr= 0x40;
    msg.flags=0; //write
    msg.len= 1;
    msg.buf= buf;
    msg.buf[0]=TRIGGER_HUMIDITY_NO_HOLD;  /* trigger humidity without hold I2C bus */
    sht2x_data.nmsgs= 1;
    sht2x_data.msgs= &msg;
    if( ioctl(s_sht2x_fd, I2C_RDWR, &sht2x_data) < 0 )
    {
        log_err("sht2x I2C_RDWR ioctl failure: %s\n", strerror(errno));
        sht2x_term();
        return -2;
    }
        return -2;
    }
    msleep(29);
    memset(buf, 0, sizeof(buf));
    msg.addr=0x40;
    msg.flags=I2C_M_RD; //write
    msg.len= 3;
    msg.buf= buf;
    msleep(29);
    sht2x_data.nmsgs= 1;
    sht2x_data.msgs= &msg;
    memset(buf, 0, sizeof(buf));
    msg.addr=0x40;
    msg.flags=I2C_M_RD; //write
    msg.len= 3;
    msg.buf= buf;
    if( ioctl(s_sht2x_fd, I2C_RDWR, &sht2x_data) < 0 )
    {
        log_err("sht2x I2C_RDWR ioctl failure: %s\n", strerror(errno));
    sht2x_data.nmsgs= 1;
    sht2x_data.msgs= &msg;
    if( ioctl(s_sht2x_fd, I2C_RDWR, &sht2x_data) < 0 )
    {
        log_err("sht2x I2C_RDWR ioctl failure: %s\n", strerror(errno));
        sht2x_term();
        return -2;
    }
        return -2;
    }
    //dump_buf("Relative humidity sample data: ", buf, 3);
           *rh = 125 * (((((int) buf[0]) << 8) + buf[1]) / 65536.0) - 6;
    return 0;
    //dump_buf("Relative humidity sample data: ", buf, 3);
    *rh = 125 * (((((int) buf[0]) << 8) + buf[1]) / 65536.0) - 6;
    return 0;
}
#endif
iotd/hal/tsl2561.c
@@ -43,10 +43,10 @@
    if( (s_tsl_fd=open("/dev/i2c-1", O_RDWR)) < 0)
    {
        log_err("TSL2561 I2C device setup failure: %s\n", strerror(errno));
    return -1;
        return -1;
    }
    log_nrml("TSL2561 initialise ok, s_tsl_fd=%d\n", s_tsl_fd);
    log_dbg("TSL2561 initialise ok, s_tsl_fd=%d\n", s_tsl_fd);
    return s_tsl_fd;
}
@@ -79,7 +79,7 @@
    if( ioctl(s_tsl_fd, I2C_RDWR, &data) < 0 )
    { 
        log_err("%s() ioctl failure: %s\n", __func__, strerror(errno)); 
    return -1;
        return -1;
    }
@@ -91,7 +91,7 @@
    if( ioctl(s_tsl_fd, I2C_RDWR, &data) < 0 )
    { 
        log_err("%s() ioctl failure: %s\n", __func__, strerror(errno)); 
    return -1;
        return -1;
    }
    return 0;
@@ -115,7 +115,7 @@
    if( ioctl(s_tsl_fd, I2C_RDWR, &data) < 0 )
    { 
        log_err("%s() ioctl failure: %s\n", __func__, strerror(errno)); 
    return -1;
        return -1;
    }
    memset(buf, 0, sizeof(buf));
@@ -131,7 +131,7 @@
    if( ioctl(s_tsl_fd, I2C_RDWR, &data) < 0 )
    { 
        log_err("%s() ioctl failure: %s\n", __func__, strerror(errno)); 
    return -1;
        return -1;
    }
    *regval = msg.buf[0];
@@ -152,7 +152,7 @@
    float               div = 0.0;
    float               lux = 0.0;
    tsl2561_power(ON);
    msleep(410);  /* t(CONV) MAX 400ms */
@@ -160,7 +160,7 @@
    /* Read register Channel0 and channel1 data from register */
    for(i=0; i<REG_COUNT; i++)
    {
    tsl2561_readreg(regs_addr[i], &reg_data[i]);
        tsl2561_readreg(regs_addr[i], &reg_data[i]);
    }
    chn0_data = reg_data[1]*256 + reg_data[0]; /* Channel0 = DATA0HIGH<<8 + DATA0LOW  */