From 8a9c3fd9e81bc0daaf06529abcad3a995613816f Mon Sep 17 00:00:00 2001 From: lilian Date: Fri, 17 Nov 2017 20:44:02 +0100 Subject: [PATCH] ina3221 ptr NULL security --- examples/ina3221_test/main.c | 2 +- extras/ina3221/ina3221.c | 14 +++++++++----- extras/ina3221/ina3221.h | 10 +++++----- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/examples/ina3221_test/main.c b/examples/ina3221_test/main.c index cd8150e..e64e879 100644 --- a/examples/ina3221_test/main.c +++ b/examples/ina3221_test/main.c @@ -90,7 +90,7 @@ void ina_measure(void *pvParameters) if(dev.mask.wf&(1<<(3-WARNING_CHANNEL))) warning = true ; #endif - for (uint8_t i = 0 ; i < BUS_NUMBER ; i++) + for (uint8_t i = 0 ; i < INA3221_BUS_NUMBER ; i++) { if(ina3221_getBusVoltage(&dev, i, &bus_voltage)) // Get voltage in V goto error_loop; diff --git a/extras/ina3221/ina3221.c b/extras/ina3221/ina3221.c index 1c6c51a..7d54e76 100644 --- a/extras/ina3221/ina3221.c +++ b/extras/ina3221/ina3221.c @@ -132,7 +132,8 @@ int ina3221_getBusVoltage(ina3221_t *dev, ina3221_channel_t channel, float *volt int err = 0; if ((err = _wireReadRegister(&dev->i2c_dev, INA3221_REG_BUSVOLTAGE_1 + channel * 2, (uint16_t*)&raw_value))) return err; - *voltage = raw_value * 0.001; //V 8mV step + if (voltage) + *voltage = raw_value * 0.001; //V 8mV step return 0; } @@ -140,15 +141,18 @@ int ina3221_getShuntValue(ina3221_t *dev, ina3221_channel_t channel, float *volt { int16_t raw_value; int err = 0; - if ((err = _wireReadRegister(&dev->i2c_dev, INA3221_REG_SHUNTVOLTAGE_1 + channel * 2, (uint16_t*)&raw_value))) + if ((err = _wireReadRegister(&dev->i2c_dev,INA3221_REG_SHUNTVOLTAGE_1+channel*2, (uint16_t*)&raw_value))) return err; - *voltage = raw_value * 0.005; //mV 40uV step - if (!dev->shunt[channel]) + float compute = raw_value*0.005; //mV 40uV step + if (voltage) + *voltage = compute; + if(!dev->shunt[channel]) { debug("No shunt configured for channel %u. Dev:%u:%X\n", channel+1, dev->bus, dev->addr); return -EINVAL; } - *current = (*voltage * 1000.0) / dev->shunt[channel]; //mA + if (current) + *current = (compute*1000.0)/dev->shunt[channel]; //mA return 0; } diff --git a/extras/ina3221/ina3221.h b/extras/ina3221/ina3221.h index c16206e..6783dfa 100644 --- a/extras/ina3221/ina3221.h +++ b/extras/ina3221/ina3221.h @@ -26,7 +26,7 @@ extern "C" { #define INA3221_ADDR_2 (0x42) ///< A0 to SDA #define INA3221_ADDR_3 (0x43) ///< A0 to SCL -#define BUS_NUMBER 3 ///< Number of shunt available +#define INA3221_BUS_NUMBER 3 ///< Number of shunt available #define INA3221_REG_CONFIG (0x00) #define INA3221_REG_SHUNTVOLTAGE_1 (0x01) @@ -133,10 +133,10 @@ typedef union * Device description */ typedef struct { - const i2c_dev_t i2c_dev; ///< ina3221 I2C address - const uint16_t shunt[BUS_NUMBER]; ///< Memory of shunt value (mOhm) - ina3221_config_t config; ///< Memory of ina3221 config - ina3221_mask_t mask; ///< Memory of mask_config + const i2c_dev_t i2c_dev; ///< ina3221 I2C address + const uint16_t shunt[INA3221_BUS_NUMBER]; ///< Memory of shunt value (mOhm) + ina3221_config_t config; ///< Memory of ina3221 config + ina3221_mask_t mask; ///< Memory of mask_config } ina3221_t; /**