diff --git a/trunk/src/CMakeLists.txt b/trunk/src/CMakeLists.txt index 088139bbf0a7c05f009235f9c725f7b90d60ddb8..8b8c85c0d3123d4d3a79fef400c50c1045fddb8f 100644 --- a/trunk/src/CMakeLists.txt +++ b/trunk/src/CMakeLists.txt @@ -1,7 +1,7 @@ # edit the following line to add all the source code files of the library -SET(sources usb_i2c.cpp) +SET(sources usb_i2c.cpp usb_i2c_exceptions.cpp) # edit the following line to add all the header files of the library -SET(headers usb_i2c.h) +SET(headers usb_i2c.h usb_i2c_exceptions.h) # edit the following line to find the necessary packages FIND_PACKAGE(iriutils REQUIRED) diff --git a/trunk/src/usb_i2c.cpp b/trunk/src/usb_i2c.cpp index 92aa2b14a06255ef1906a474b9bd150f8b9d6716..8deee1d6a82cb8abb35a12c80f9789f209dbbedc 100644 --- a/trunk/src/usb_i2c.cpp +++ b/trunk/src/usb_i2c.cpp @@ -1,6 +1,8 @@ #include "usb_i2c.h" #include "eventexceptions.h" +#include "usb_i2c_exceptions.h" #include <string.h> +#include <iostream> CUSBI2C::CUSBI2C(const std::string &adapter_id) { @@ -9,6 +11,7 @@ CUSBI2C::CUSBI2C(const std::string &adapter_id) if(adapter_id.size()==0) { /* handle exceptions */ + throw CUSBI2CException(_HERE_,"Invalid adapter identifier."); } else { @@ -47,6 +50,7 @@ unsigned char CUSBI2C::get_revision(void) if((written=this->comm_dev->write(cmd,4))!=4) { /* handle exceptions */ + throw CUSBI2CException(_HERE_,"Error while sending the command to the converter"); } else { @@ -64,6 +68,7 @@ void CUSBI2C::config_gpio(gpio_pins pin, gpio_types type) case gpio1: if(type!=digital_input) { /* handle exceptions */ + throw CUSBI2CException(_HERE_,"GPIO1 can only be configured as a digital input."); } else { @@ -116,6 +121,7 @@ void CUSBI2C::set_gpio(gpio_pins pin, bool value) if((written=this->comm_dev->write(cmd,4))!=4) { /* handle exceptions */ + throw CUSBI2CException(_HERE_,"Error while sending the command to the converter"); } else { @@ -127,6 +133,7 @@ void CUSBI2C::set_gpio(gpio_pins pin, bool value) else { /* handle exceptions */ + throw CUSBI2CException(_HERE_,"The desired GPIO is not configured as a digital output"); } } @@ -143,6 +150,7 @@ bool CUSBI2C::get_gpio(gpio_pins pin) if((written=this->comm_dev->write(cmd,4))!=4) { /* handle exceptions */ + throw CUSBI2CException(_HERE_,"Error while sending the command to the converter"); } else { @@ -157,6 +165,7 @@ bool CUSBI2C::get_gpio(gpio_pins pin) else { /* handle exceptions */ + throw CUSBI2CException(_HERE_,"The desired GPIO is not configured as a digital input"); } return false; @@ -188,6 +197,7 @@ short int CUSBI2C::get_analog(gpio_pins pin) else { /* handle exceptions */ + throw CUSBI2CException(_HERE_,"The desired GPIO is not configured as an analog input"); } return analog_value; @@ -204,6 +214,7 @@ void CUSBI2C::turn_led_on(void) if((written=this->comm_dev->write(cmd,4))!=4) { /* handle exceptions */ + throw CUSBI2CException(_HERE_,"Error while sending the command to the converter"); } else { @@ -215,6 +226,7 @@ void CUSBI2C::turn_led_on(void) if((written=this->comm_dev->write(cmd,4))!=4) { /* handle exceptions */ + throw CUSBI2CException(_HERE_,"Error while sending the command to the converter"); } else { @@ -235,6 +247,7 @@ void CUSBI2C::turn_led_off(void) if((written=this->comm_dev->write(cmd,4))!=4) { /* handle exceptions */ + throw CUSBI2CException(_HERE_,"Error while sending the command to the converter"); } else { @@ -246,6 +259,7 @@ void CUSBI2C::turn_led_off(void) if((written=this->comm_dev->write(cmd,4))!=4) { /* handle exceptions */ + throw CUSBI2CException(_HERE_,"Error while sending the command to the converter"); } else { @@ -265,12 +279,14 @@ int CUSBI2C::write(unsigned char dev_id, unsigned char *data, int len) if(len>1) { /* handle exceptions */ + throw CUSBI2CException(_HERE_,"At least one byte must be send in a write operation"); } else { if(data==NULL) { /* handle exceptions */ + throw CUSBI2CException(_HERE_,"Invalid data input buffer"); } else { @@ -280,6 +296,7 @@ int CUSBI2C::write(unsigned char dev_id, unsigned char *data, int len) if((written=this->comm_dev->write(cmd,3))!=3) { /* handle exceptions */ + throw CUSBI2CException(_HERE_,"Error while sending the command to the converter"); } else { @@ -289,9 +306,11 @@ int CUSBI2C::write(unsigned char dev_id, unsigned char *data, int len) if(status==0x00) { /* handle exceptions */ + throw CUSBI2CException(_HERE_,"The write operation did not succed"); } }catch(CEventTimeoutException &e){ /* handle exceptions */ + throw CUSBI2CException(_HERE_,"The write operation did not complete in the allowed time"); } } } @@ -308,6 +327,7 @@ int CUSBI2C::read(unsigned char dev_id, unsigned char *data, int len) if(data==NULL) { /* handle exceptions */ + throw CUSBI2CException(_HERE_,"Invalid data input buffer"); } else { @@ -319,6 +339,7 @@ int CUSBI2C::read(unsigned char dev_id, unsigned char *data, int len) if((written=this->comm_dev->write(cmd,2))!=2) { /* handle exceptions */ + throw CUSBI2CException(_HERE_,"Error while sending the command to the converter"); } } else @@ -328,6 +349,7 @@ int CUSBI2C::read(unsigned char dev_id, unsigned char *data, int len) if((written=this->comm_dev->write(cmd,3))!=3) { /* handle exceptions */ + throw CUSBI2CException(_HERE_,"Error while sending the command to the converter"); } } try{ @@ -338,6 +360,7 @@ int CUSBI2C::read(unsigned char dev_id, unsigned char *data, int len) }while(total_read<len); }catch(CEventTimeoutException &e){ /* handle exceptions */ + throw CUSBI2CException(_HERE_,"The read operation did not complete in the allowed time"); } } @@ -350,7 +373,8 @@ int CUSBI2C::write_reg(unsigned char dev_id, short int address, unsigned char *d std::list<std::string> events; unsigned char status; unsigned char *cmd; - + + events.push_back(this->rx_event_id); do{ if((len-total_written)>64) num=64; else num=len-total_written; @@ -378,6 +402,7 @@ int CUSBI2C::write_reg(unsigned char dev_id, short int address, unsigned char *d if((written=this->comm_dev->write(cmd,num))!=num) { /* handle exceptions */ + throw CUSBI2CException(_HERE_,"Error while sending the command to the converter"); } else { @@ -387,9 +412,11 @@ int CUSBI2C::write_reg(unsigned char dev_id, short int address, unsigned char *d if(status==0x00) { /* handle exceptions */ + throw CUSBI2CException(_HERE_,"The write operation did not succed"); } }catch(CEventTimeoutException &e){ /* handle exceptions */ + throw CUSBI2CException(_HERE_,"The write operation did not complete in the allowed time"); } } delete[] cmd; @@ -402,33 +429,37 @@ int CUSBI2C::write_reg(unsigned char dev_id, short int address, unsigned char *d int CUSBI2C::read_reg(unsigned char dev_id, short int address, unsigned char *data, int len) { - int written=0,read=0,total_read=0,num=0,total_num=0; + int written=0,read=0,total_read=0,num=0,total_num=0,num_cmd; std::list<std::string> events; unsigned char cmd[5]; + events.push_back(this->rx_event_id); do{ if((len-total_read)>60) num=60; else num=len-total_read; if(address<256) { cmd[0]=0x55; - cmd[1]=dev_id<<1; + cmd[1]=(dev_id<<1)+1; cmd[2]=address; cmd[3]=num; - written=this->comm_dev->write(cmd,4)!=4; + written=this->comm_dev->write(cmd,4); + num_cmd=4; } else { cmd[0]=0x56; - cmd[1]=dev_id<<1; + cmd[1]=(dev_id<<1)+1; cmd[2]=address/256; cmd[3]=address%256; cmd[4]=num; - written=this->comm_dev->write(cmd,5)!=5; + written=this->comm_dev->write(cmd,5); + num_cmd=5; } - if(written!=num) + if(written!=num_cmd) { /* handle exceptions */ + throw CUSBI2CException(_HERE_,"Error while sending the command to the converter"); } else { @@ -440,6 +471,7 @@ int CUSBI2C::read_reg(unsigned char dev_id, short int address, unsigned char *da }while(total_num<num); }catch(CEventTimeoutException &e){ /* handle exceptions */ + throw CUSBI2CException(_HERE_,"The write operation did not complete in the allowed time"); } } total_read+=num; diff --git a/trunk/src/usb_i2c_exceptions.cpp b/trunk/src/usb_i2c_exceptions.cpp new file mode 100755 index 0000000000000000000000000000000000000000..85ebc7263a2d6a5d892e9c07234a2c794aab9896 --- /dev/null +++ b/trunk/src/usb_i2c_exceptions.cpp @@ -0,0 +1,10 @@ +#include "usb_i2c_exceptions.h" +#include <string.h> +#include <stdio.h> + +const std::string usb_i2c_exception_msg="[CUSBI2C class] - "; + +CUSBI2CException::CUSBI2CException(const std::string& where, const std::string& error_msg):CException(where,usb_i2c_exception_msg) +{ + this->error_msg+=error_msg; +} diff --git a/trunk/src/usb_i2c_exceptions.h b/trunk/src/usb_i2c_exceptions.h new file mode 100755 index 0000000000000000000000000000000000000000..c65fdfba6600754a85757806a545228c6db55a82 --- /dev/null +++ b/trunk/src/usb_i2c_exceptions.h @@ -0,0 +1,12 @@ +#ifndef USB_I2C_EXCEPTIONS +#define USB_I2C_EXCEPTIONS + +#include "exceptions.h" + +class CUSBI2CException : public CException +{ + public: + CUSBI2CException(const std::string& where,const std::string& error_msg); +}; + +#endif