t6713: Static analysis fixes

Updated t6713 to use class instances vs class pointers.  Creating these
on the stack clears up some memory leaks where items created in the
heap are not deleted for a handful of the throw conditions.  Removed
all news/deletes.

Also reformatted to remove tabs and some spaces.

Signed-off-by: Noel Eck <noel.eck@intel.com>
This commit is contained in:
Noel Eck 2017-03-07 12:04:23 -08:00
parent b314f56c00
commit b3a5275183
2 changed files with 228 additions and 245 deletions

View File

@ -51,230 +51,218 @@
using namespace upm;
using namespace upm::t6713_co2;
T6713::T6713 (int bus)
T6713::T6713 (int bus) : i2c(bus)
{
i2c = new mraa::I2c(bus);
status = i2c->address(T6713_ADDR);
status = i2c.address(T6713_ADDR);
uint16_t firmwareRevision = getFirmwareRevision();
if (firmwareRevision != mraa::SUCCESS)
UPM_THROW("config failure");
}
T6713::~T6713()
{
delete i2c;
}
uint16_t T6713::getFirmwareRevision()
{
return(getSensorData(T6713_COMMAND_GET_FIRMWARE_REVISION));
return(getSensorData(T6713_COMMAND_GET_FIRMWARE_REVISION));
}
uint16_t T6713::getPpm ()
{
return(getSensorData(T6713_COMMAND_GET_GAS_PPM));
return(getSensorData(T6713_COMMAND_GET_GAS_PPM));
}
uint16_t T6713::getSensorData (MODBUS_COMMANDS cmd)
{
uint16_t data ,readBytes ;
STATUS currStatus ;
switch(currStatus = getStatus()) /* handle error conditions */
{
case ERROR_CONDITION:
UPM_THROW ("error condition");
break;
case FLASH_ERROR:
UPM_THROW ("flash error");
break;
case CALIBRATION_ERROR:
UPM_THROW ("calibration error");
break;
case WARMUP_MODE:
//UPM_THROW ("warmup mode");
break;
case RS232:
//printf("\nRS232 mode set\n ");
break;
case RS485:
//printf("\nRS485 mode set\n ");
break;
case I2C:
uint16_t data ,readBytes ;
STATUS currStatus ;
switch(currStatus = getStatus()) /* handle error conditions */
{
case ERROR_CONDITION:
UPM_THROW ("error condition");
break;
case FLASH_ERROR:
UPM_THROW ("flash error");
break;
case CALIBRATION_ERROR:
UPM_THROW ("calibration error");
break;
case WARMUP_MODE:
//UPM_THROW ("warmup mode");
break;
case RS232:
//printf("\nRS232 mode set\n ");
break;
case RS485:
//printf("\nRS485 mode set\n ");
break;
case I2C:
{
//printf("\nI2C mode set\n");
data = 0;
runCommand(cmd);
mraa::Result ret = i2c.address(T6713_ADDR);
if (ret != mraa::SUCCESS)
{
//printf("\nI2C mode set\n");
data = 0;
runCommand(cmd);
mraa::Result ret = i2c->address(T6713_ADDR);
if (ret != mraa::SUCCESS)
{
UPM_THROW ("I2C error setting slave address");
// TODO: need to handle this
}
RESPONSE * response = new RESPONSE ;
if((readBytes = i2c->read((uint8_t*)(response), sizeof(RESPONSE) ) != sizeof(RESPONSE)))
{
UPM_THROW("I2C read failed");
// TODO
}
if(response->function_code == READ_INPUT_REGISTERS)
{
if(response->byte_count == 2)
{
data = (response->status_msb << 8 | response->status_lsb);
}
}
delete(response); response=NULL;
return(data);
break;
UPM_THROW ("I2C error setting slave address");
// TODO: need to handle this
}
default:
syslog(LOG_WARNING, "%s: switch case not defined",
std::string(__FUNCTION__).c_str());
}
return 0;
RESPONSE response;
if((readBytes = i2c.read((uint8_t*)(&response), sizeof(RESPONSE) ) != sizeof(RESPONSE)))
{
UPM_THROW("I2C read failed");
// TODO
}
if(response.function_code == READ_INPUT_REGISTERS)
{
if(response.byte_count == 2)
{
data = (response.status_msb << 8 | response.status_lsb);
}
}
return(data);
break;
}
default:
syslog(LOG_WARNING, "%s: switch case not defined",
std::string(__FUNCTION__).c_str());
}
return 0;
}
mraa::Result T6713::runCommand(MODBUS_COMMANDS cmd)
{
COMMAND * cmdPacket = new COMMAND ;
COMMAND cmdPacket;
mraa::Result ret = mraa::SUCCESS;
switch(cmd)
{
case T6713_COMMAND_RESET:
cmdPacket->function_code = WRITE_SINGLE_COIL;
cmdPacket->register_address_msb = (T6713_REG_RESET_DEVICE >> 8);
cmdPacket->register_address_lsb = (T6713_REG_RESET_DEVICE & 0xff);
cmdPacket->input_registers_to_read_msb = 0xff;
cmdPacket->input_registers_to_read_lsb = 0x00;
ret = i2c->write((const uint8_t*) (cmdPacket), sizeof(COMMAND));
/*no response from the slave */
break;
case T6713_COMMAND_STATUS:
/*created the modbus status command packet*/
cmdPacket->function_code = READ_INPUT_REGISTERS;
cmdPacket->register_address_msb = (T6713_REG_STATUS >> 8);
cmdPacket->register_address_lsb = (T6713_REG_STATUS & 0xff);
cmdPacket->input_registers_to_read_msb = 0;
cmdPacket->input_registers_to_read_lsb = 1;
ret = i2c->address(T6713_ADDR);
if (ret != mraa::SUCCESS)
{
UPM_THROW ("I2C error setting slave address");
}
switch(cmd)
{
case T6713_COMMAND_RESET:
cmdPacket.function_code = WRITE_SINGLE_COIL;
cmdPacket.register_address_msb = (T6713_REG_RESET_DEVICE >> 8);
cmdPacket.register_address_lsb = (T6713_REG_RESET_DEVICE & 0xff);
cmdPacket.input_registers_to_read_msb = 0xff;
cmdPacket.input_registers_to_read_lsb = 0x00;
ret = i2c.write((const uint8_t*) (&cmdPacket), sizeof(COMMAND));
/*no response from the slave */
break;
case T6713_COMMAND_STATUS:
/*created the modbus status command packet*/
cmdPacket.function_code = READ_INPUT_REGISTERS;
cmdPacket.register_address_msb = (T6713_REG_STATUS >> 8);
cmdPacket.register_address_lsb = (T6713_REG_STATUS & 0xff);
cmdPacket.input_registers_to_read_msb = 0;
cmdPacket.input_registers_to_read_lsb = 1;
ret = i2c.address(T6713_ADDR);
if (ret != mraa::SUCCESS)
{
UPM_THROW ("I2C error setting slave address");
}
if((ret = i2c->write((const uint8_t*) (cmdPacket), sizeof(COMMAND))) != mraa::SUCCESS)
{
UPM_THROW("I2C write failed");
}
if((ret = i2c.write((const uint8_t*) (&cmdPacket), sizeof(COMMAND))) != mraa::SUCCESS)
{
UPM_THROW("I2C write failed");
}
break;
case T6713_COMMAND_GET_FIRMWARE_REVISION:
cmdPacket->function_code = READ_INPUT_REGISTERS;
cmdPacket->register_address_msb = (T6713_REG_FIRMWARE_REVISION >> 8);
cmdPacket->register_address_lsb = (T6713_REG_FIRMWARE_REVISION & 0xff);
cmdPacket->input_registers_to_read_msb = 0;
cmdPacket->input_registers_to_read_lsb = 1;
ret = i2c->write((const uint8_t*) (cmdPacket), sizeof(COMMAND));
break;
case T6713_COMMAND_GET_GAS_PPM:
cmdPacket->function_code = READ_INPUT_REGISTERS;
cmdPacket->register_address_msb = (T6713_REG_GAS_PPM >> 8);
cmdPacket->register_address_lsb = (T6713_REG_GAS_PPM & 0xff);
break;
case T6713_COMMAND_GET_FIRMWARE_REVISION:
cmdPacket.function_code = READ_INPUT_REGISTERS;
cmdPacket.register_address_msb = (T6713_REG_FIRMWARE_REVISION >> 8);
cmdPacket.register_address_lsb = (T6713_REG_FIRMWARE_REVISION & 0xff);
cmdPacket.input_registers_to_read_msb = 0;
cmdPacket.input_registers_to_read_lsb = 1;
ret = i2c.write((const uint8_t*) (&cmdPacket), sizeof(COMMAND));
break;
case T6713_COMMAND_GET_GAS_PPM:
cmdPacket.function_code = READ_INPUT_REGISTERS;
cmdPacket.register_address_msb = (T6713_REG_GAS_PPM >> 8);
cmdPacket.register_address_lsb = (T6713_REG_GAS_PPM & 0xff);
cmdPacket->input_registers_to_read_msb = 0;
cmdPacket->input_registers_to_read_lsb = 1;
ret = i2c->address(T6713_ADDR);
if (ret != mraa::SUCCESS)
{
UPM_THROW ("I2C error setting slave address");
//need to handle this
}
cmdPacket.input_registers_to_read_msb = 0;
cmdPacket.input_registers_to_read_lsb = 1;
ret = i2c.address(T6713_ADDR);
if (ret != mraa::SUCCESS)
{
UPM_THROW ("I2C error setting slave address");
//need to handle this
}
if((ret = i2c->write((const uint8_t*) (cmdPacket), sizeof(COMMAND))) != mraa::SUCCESS)
{
UPM_THROW("I2C write failed");
}
if((ret = i2c.write((const uint8_t*) (&cmdPacket), sizeof(COMMAND))) != mraa::SUCCESS)
{
UPM_THROW("I2C write failed");
}
break;
}
delete cmdPacket; cmdPacket=NULL;
break;
}
return ret;
return ret;
}
STATUS T6713::getStatus()
{
uint16_t responseStatus = 0, readBytes = 0;
RESPONSE * response = new RESPONSE ;
runCommand(T6713_COMMAND_STATUS);
mraa::Result ret = i2c->address(T6713_ADDR);
if (ret != mraa::SUCCESS)
{
UPM_THROW ("I2C error setting slave address");
//need to handle tnis
}
if((readBytes = i2c->read((uint8_t*) (response), sizeof(RESPONSE)) != sizeof(RESPONSE)))
{
UPM_THROW("I2C read failed");
uint16_t responseStatus = 0, readBytes = 0;
RESPONSE response;
runCommand(T6713_COMMAND_STATUS);
mraa::Result ret = i2c.address(T6713_ADDR);
if (ret != mraa::SUCCESS)
{
UPM_THROW ("I2C error setting slave address");
//need to handle tnis
}
if((readBytes = i2c.read((uint8_t*) (&response), sizeof(RESPONSE)) != sizeof(RESPONSE)))
{
UPM_THROW("I2C read failed");
}
if(response->function_code == READ_INPUT_REGISTERS)
{
if(response->byte_count == 2)
{
responseStatus = (response->status_msb << 8 | response->status_lsb);
}
else
{
UPM_THROW("I2C read failed");
}
if(response.function_code == READ_INPUT_REGISTERS)
{
if(response.byte_count == 2)
{
responseStatus = (response.status_msb << 8 | response.status_lsb);
}
else
{
UPM_THROW("I2C read failed");
}
}
else
{
UPM_THROW("MODBUS function code failed");
}
}
}
else
{
UPM_THROW("MODBUS function code failed");
}
delete(response);
if(responseStatus & 0x0001)
{
return ERROR_CONDITION;
}
if(responseStatus & 0x0002)
{
return FLASH_ERROR;
}
if(responseStatus & 0x0004)
{
return CALIBRATION_ERROR;
}
if(responseStatus & 0x0800)
{
return WARMUP_MODE;
}
if(responseStatus & 0x8000)
{
return SINGLE_POINT_CALIBRATION;
}
if(responseStatus & 0x0100)
{
return RS232;
}
if(responseStatus & 0x0400)
{
return RS485;
}
else
{
return I2C;
}
if(responseStatus & 0x0001)
{
return ERROR_CONDITION;
}
if(responseStatus & 0x0002)
{
return FLASH_ERROR;
}
if(responseStatus & 0x0004)
{
return CALIBRATION_ERROR;
}
if(responseStatus & 0x0800)
{
return WARMUP_MODE;
}
if(responseStatus & 0x8000)
{
return SINGLE_POINT_CALIBRATION;
}
if(responseStatus & 0x0100)
{
return RS232;
}
if(responseStatus & 0x0400)
{
return RS485;
}
else
{
return I2C;
}
}

View File

@ -27,7 +27,6 @@
#include "interfaces/iCO2Sensor.hpp"
namespace upm {
/**
* @brief Amphenol Telaire 6713 Series CO2 Module
* @defgroup t6713 libupm-t6713
@ -54,97 +53,93 @@ namespace upm {
* @snippet t6713.cxx Interesting
* @snippet co2-sensor.cxx Interesting
*/
namespace t6713_co2
{
/* COMMAND VALUES */
typedef enum
{
T6713_COMMAND_RESET,
T6713_COMMAND_STATUS,
T6713_COMMAND_GET_FIRMWARE_REVISION,
T6713_COMMAND_GET_GAS_PPM
}MODBUS_COMMANDS;
/* COMMAND VALUES */
typedef enum
{
T6713_COMMAND_RESET,
T6713_COMMAND_STATUS,
T6713_COMMAND_GET_FIRMWARE_REVISION,
T6713_COMMAND_GET_GAS_PPM
}MODBUS_COMMANDS;
typedef enum
{
ERROR_CONDITION,
FLASH_ERROR,
CALIBRATION_ERROR,
WARMUP_MODE,
SINGLE_POINT_CALIBRATION,
RS232,
I2C,
RS485
}STATUS;
typedef struct
{
uint8_t function_code;
uint8_t register_address_msb;
uint8_t register_address_lsb;
uint8_t input_registers_to_read_msb;
uint8_t input_registers_to_read_lsb;
typedef enum
{
ERROR_CONDITION,
FLASH_ERROR,
CALIBRATION_ERROR,
WARMUP_MODE,
SINGLE_POINT_CALIBRATION,
RS232,
I2C,
RS485
}STATUS;
}COMMAND;
typedef struct
{
uint8_t function_code;
uint8_t register_address_msb;
uint8_t register_address_lsb;
uint8_t input_registers_to_read_msb;
uint8_t input_registers_to_read_lsb;
typedef struct
{
uint8_t function_code;
uint8_t byte_count;
uint8_t status_msb;
uint8_t status_lsb;
}COMMAND;
}RESPONSE;
typedef struct
{
uint8_t function_code;
uint8_t byte_count;
uint8_t status_msb;
uint8_t status_lsb;
}RESPONSE;
typedef enum
{
READ_INPUT_REGISTERS = 4,
WRITE_SINGLE_COIL,
WRITE_SINGLE_HOLDING_REGISTER
}FUNCTION_CODES;
typedef enum
{
READ_INPUT_REGISTERS = 4,
WRITE_SINGLE_COIL,
WRITE_SINGLE_HOLDING_REGISTER
}FUNCTION_CODES;
}//namespace t6713_co2
class T6713 : public ICO2Sensor {
public:
/**
* Instantiates a T6713 object
*
* @param bus number of used bus
*/
* Instantiates a T6713 object
*
* @param bus number of used bus
*/
T6713 (int bus);
/**
* SI7005 object destructor.
*/
~T6713 ();
* T6713 object destructor.
*/
virtual ~T6713 () {};
/**
* Returns sensor module name
*/
* Returns sensor module name
*/
virtual const char* getModuleName() { return "t6713"; }
/**
* Get relative humidity measurement.
*/
* Get relative humidity measurement.
*/
uint16_t getPpm ();
/**
* Get the firmware version
*/
* Get the firmware version
*/
uint16_t getFirmwareRevision();
private:
mraa::Result runCommand(t6713_co2::MODBUS_COMMANDS command);
uint16_t getSensorData (t6713_co2::MODBUS_COMMANDS cmd);
uint16_t getSensorData(t6713_co2::MODBUS_COMMANDS cmd);
t6713_co2::STATUS getStatus();
mraa::I2c* i2c;
mraa::I2c i2c;
mraa::Result status;
};
}//namespace upm