diff --git a/src/darwin_robot.cpp b/src/darwin_robot.cpp index acdd3372954cbebbd15d176a2a72e061f4978ce6..2054b9c2669b67fcae313aed29a58b80de12a8b3 100644 --- a/src/darwin_robot.cpp +++ b/src/darwin_robot.cpp @@ -1962,6 +1962,256 @@ void CDarwinRobot::smart_charger_set_limit_current(double limit_current) throw CDarwinRobotException(_HERE_,"Invalid robot device"); } +/* grippers interface */ +void CDarwinRobot::gripper_set_max_angle(grippers_t gripper_id,double max_angle) +{ + unsigned short int value; + + if(this->robot_device!=NULL) + { + value=max_angle*128.0; + if(gripper_id==LEFT_GRIPPER) + this->robot_device->write_word_register(DARWIN_GRIPPER_LEFT_MAX_ANGLE_L,value); + else + this->robot_device->write_word_register(DARWIN_GRIPPER_RIGHT_MAX_ANGLE_L,value); + usleep(100000); + } + else + throw CDarwinRobotException(_HERE_,"Invalid robot device"); +} + +double CDarwinRobot::gripper_get_max_angle(grippers_t gripper_id) +{ + unsigned short int value; + + if(this->robot_device!=NULL) + { + if(gripper_id==LEFT_GRIPPER) + this->robot_device->read_word_register(DARWIN_GRIPPER_LEFT_MAX_ANGLE_L,&value); + else + this->robot_device->read_word_register(DARWIN_GRIPPER_RIGHT_MAX_ANGLE_L,&value); + return ((double)value)/128.0; + } + else + throw CDarwinRobotException(_HERE_,"Invalid robot device"); +} + +void CDarwinRobot::gripper_set_min_angle(grippers_t gripper_id,double min_angle) +{ + unsigned short int value; + + if(this->robot_device!=NULL) + { + value=min_angle*128.0; + if(gripper_id==LEFT_GRIPPER) + this->robot_device->write_word_register(DARWIN_GRIPPER_LEFT_MIN_ANGLE_L,value); + else + this->robot_device->write_word_register(DARWIN_GRIPPER_RIGHT_MAX_ANGLE_L,value); + usleep(100000); + } + else + throw CDarwinRobotException(_HERE_,"Invalid robot device"); +} + +double CDarwinRobot::gripper_get_min_angle(grippers_t gripper_id) +{ + unsigned short int value; + + if(this->robot_device!=NULL) + { + if(gripper_id==LEFT_GRIPPER) + this->robot_device->read_word_register(DARWIN_GRIPPER_LEFT_MIN_ANGLE_L,&value); + else + this->robot_device->read_word_register(DARWIN_GRIPPER_RIGHT_MIN_ANGLE_L,&value); + return ((double)value)/128.0; + } + else + throw CDarwinRobotException(_HERE_,"Invalid robot device"); +} + +void CDarwinRobot::gripper_set_max_force(grippers_t gripper_id,unsigned short int max_force) +{ + if(this->robot_device!=NULL) + { + if(max_force>1024) + max_force=1024; + if(gripper_id==LEFT_GRIPPER) + this->robot_device->write_word_register(DARWIN_GRIPPER_LEFT_MAX_FORCE_L,max_force); + else + this->robot_device->write_word_register(DARWIN_GRIPPER_RIGHT_MAX_FORCE_L,max_force); + usleep(100000); + } + else + throw CDarwinRobotException(_HERE_,"Invalid robot device"); +} + +unsigned short int CDarwinRobot::gripper_get_max_force(grippers_t gripper_id) +{ + unsigned short int value; + + if(this->robot_device!=NULL) + { + if(gripper_id==LEFT_GRIPPER) + this->robot_device->read_word_register(DARWIN_GRIPPER_LEFT_MAX_FORCE_L,&value); + else + this->robot_device->read_word_register(DARWIN_GRIPPER_RIGHT_MAX_FORCE_L,&value); + return value; + } + else + throw CDarwinRobotException(_HERE_,"Invalid robot device"); +} + +void CDarwinRobot::gripper_set_servo_ids(grippers_t gripper_id, unsigned char top_id, unsigned char bot_id) +{ + if(this->robot_device!=NULL) + { + if(gripper_id==LEFT_GRIPPER) + { + this->robot_device->write_byte_register(DARWIN_GRIPPER_LEFT_TOP_ID,top_id); + usleep(100000); + this->robot_device->write_byte_register(DARWIN_GRIPPER_LEFT_BOT_ID,bot_id); + usleep(100000); + } + else + { + this->robot_device->write_byte_register(DARWIN_GRIPPER_RIGHT_TOP_ID,top_id); + usleep(100000); + this->robot_device->write_byte_register(DARWIN_GRIPPER_RIGHT_BOT_ID,bot_id); + usleep(100000); + } + } + else + throw CDarwinRobotException(_HERE_,"Invalid robot device"); +} + +void CDarwinRobot::gripper_get_servo_ids(grippers_t gripper_id, unsigned char *top_id, unsigned char *bot_id) +{ + unsigned short int value; + + if(this->robot_device!=NULL) + { + if(gripper_id==LEFT_GRIPPER) + { + this->robot_device->read_byte_register(DARWIN_GRIPPER_LEFT_TOP_ID,top_id); + this->robot_device->read_byte_register(DARWIN_GRIPPER_LEFT_BOT_ID,bot_id); + } + else + { + this->robot_device->read_byte_register(DARWIN_GRIPPER_RIGHT_TOP_ID,top_id); + this->robot_device->read_byte_register(DARWIN_GRIPPER_RIGHT_BOT_ID,bot_id); + } + } + else + throw CDarwinRobotException(_HERE_,"Invalid robot device"); +} + +void CDarwinRobot::gripper_open(grippers_t gripper_id) +{ + if(this->robot_device!=NULL) + { + if(gripper_id==LEFT_GRIPPER) + this->robot_device->write_byte_register(DARWIN_GRIPPER_CNTRL,0x04); + else + this->robot_device->write_byte_register(DARWIN_GRIPPER_CNTRL,0x01); + } + else + throw CDarwinRobotException(_HERE_,"Invalid robot device"); +} + +void CDarwinRobot::gripper_close(grippers_t gripper_id) +{ + if(this->robot_device!=NULL) + { + if(gripper_id==LEFT_GRIPPER) + this->robot_device->write_byte_register(DARWIN_GRIPPER_CNTRL,0x08); + else + this->robot_device->write_byte_register(DARWIN_GRIPPER_CNTRL,0x02); + } + else + throw CDarwinRobotException(_HERE_,"Invalid robot device"); +} + +bool CDarwinRobot::gripper_is_moving(grippers_t gripper_id) +{ + unsigned char status; + + if(this->robot_device!=NULL) + { + if(gripper_id==LEFT_GRIPPER) + { + this->robot_device->read_byte_register(DARWIN_GRIPPER_CNTRL,&status); + if(status&GRIPPER_MOVING_LEFT) + return true; + else + return false; + } + else + { + this->robot_device->read_byte_register(DARWIN_GRIPPER_CNTRL,&status); + if(status&GRIPPER_MOVING_RIGHT) + return true; + else + return false; + } + } + else + throw CDarwinRobotException(_HERE_,"Invalid robot device"); +} + +bool CDarwinRobot::gripper_is_open(grippers_t gripper_id) +{ + unsigned char status; + + if(this->robot_device!=NULL) + { + if(gripper_id==LEFT_GRIPPER) + { + this->robot_device->read_byte_register(DARWIN_GRIPPER_CNTRL,&status); + if(status&GRIPPER_OPENED_LEFT) + return true; + else + return false; + } + else + { + this->robot_device->read_byte_register(DARWIN_GRIPPER_CNTRL,&status); + if(status&GRIPPER_OPENED_RIGHT) + return true; + else + return false; + } + } + else + throw CDarwinRobotException(_HERE_,"Invalid robot device"); +} + +bool CDarwinRobot::gripper_is_close(grippers_t gripper_id) +{ + unsigned char status; + + if(this->robot_device!=NULL) + { + if(gripper_id==LEFT_GRIPPER) + { + this->robot_device->read_byte_register(DARWIN_GRIPPER_CNTRL,&status); + if(status&GRIPPER_OPENED_LEFT) + return false; + else + return true; + } + else + { + this->robot_device->read_byte_register(DARWIN_GRIPPER_CNTRL,&status); + if(status&GRIPPER_OPENED_RIGHT) + return false; + else + return true; + } + } + else + throw CDarwinRobotException(_HERE_,"Invalid robot device"); +} + CDarwinRobot::~CDarwinRobot() { if(this->robot_device!=NULL) diff --git a/src/darwin_robot.h b/src/darwin_robot.h index 45a925dd0e7989a557085513479fe6749db0888c..acda926c0e29ee2168e577bc1426c78ad2210d5a 100644 --- a/src/darwin_robot.h +++ b/src/darwin_robot.h @@ -203,53 +203,67 @@ class CDarwinRobot void head_get_current_target(double *pan,double *tilt); // smart charger interface - /** - * \brief Function to check if smart charger module is detected - */ + /** + * \brief Function to check if smart charger module is detected + */ bool is_smart_charger_detected(void); - /** - * \brief Function to check if smart charger module is enabled - */ + /** + * \brief Function to check if smart charger module is enabled + */ bool is_smart_charger_enabled(void); -/** - * \brief Function to enable smart charger module - */ + /** + * \brief Function to enable smart charger module + */ void smart_charger_enable(void); - /** - * \brief Function to disable smart charger module - */ + /** + * \brief Function to disable smart charger module + */ void smart_charger_disable(void); - /** - * \brief Function to set smart charger's read operation period - * \param period Period in s of smart charger module - */ + /** + * \brief Function to set smart charger's read operation period + * \param period Period in s of smart charger module + */ void smart_charger_set_period(double period); - /** - * \brief Function to get smart charger's read operation period in segs - */ + /** + * \brief Function to get smart charger's read operation period in segs + */ double smart_charger_get_period(void); -/** - * \brief Function to get smart charger's data: Battery average time to empty and to full and battery status - * - * Battery status: indicates whether if AC and/or battery are connected or not - * Avg time to full - * Avg time to empty - */ + /** + * \brief Function to get smart charger's data: Battery average time to empty and to full and battery status + * + * Battery status: indicates whether if AC and/or battery are connected or not + * Avg time to full + * Avg time to empty + */ TChargerData smart_charger_get_data(void); - /** - * - */ + /** + * + */ void smart_charger_set_range_current(double min_current, double max_current); - /** - * \brief Function to get limit current in A - */ + /** + * \brief Function to get limit current in A + */ double smart_charger_get_limit_current(void); /** - * \brief Function to set smart charger's limit current - * \param limit_current Value of limit current in A - */ + * \brief Function to set smart charger's limit current + * \param limit_current Value of limit current in A + */ void smart_charger_set_limit_current(double limit_current); + /* grippers interface */ + void gripper_set_max_angle(grippers_t gripper_id,double max_angle); + double gripper_get_max_angle(grippers_t gripper_id); + void gripper_set_min_angle(grippers_t gripper_id,double min_angle); + double gripper_get_min_angle(grippers_t gripper_id); + void gripper_set_max_force(grippers_t gripper_id,unsigned short int max_force); + unsigned short int gripper_get_max_force(grippers_t gripper_id); + void gripper_set_servo_ids(grippers_t gripper_id, unsigned char top_id, unsigned char bot_id); + void gripper_get_servo_ids(grippers_t gripper_id, unsigned char *top_id, unsigned char *bot_id); + void gripper_open(grippers_t gripper_id); + void gripper_close(grippers_t gripper_id); + bool gripper_is_moving(grippers_t gripper_id); + bool gripper_is_open(grippers_t gripper_id); + bool gripper_is_close(grippers_t gripper_id); ~CDarwinRobot(); };