diff --git a/src/t6713/t6713.cxx b/src/t6713/t6713.cxx index cbc88fd4..ee3eef70 100644 --- a/src/t6713/t6713.cxx +++ b/src/t6713/t6713.cxx @@ -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; + } } - diff --git a/src/t6713/t6713.hpp b/src/t6713/t6713.hpp index ca3251a0..121fe988 100644 --- a/src/t6713/t6713.hpp +++ b/src/t6713/t6713.hpp @@ -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