diff --git a/src/bioloid_robot.cpp b/src/bioloid_robot.cpp index 71dd216876d1a4341dd7209748b20842b12f2a64..91b493d2cf0a8ccc047ea3e85e151a0652c8051b 100644 --- a/src/bioloid_robot.cpp +++ b/src/bioloid_robot.cpp @@ -2,7 +2,7 @@ #include "bioloid_robot_exceptions.h" #include <iostream> -CBioloid_Robot::CBioloid_Robot(const std::string &name,std::string &serial_dev,int baudrate, unsigned char id,gpio_ports port, int pin) : ext_int(port,pin) +CBioloidRobot::CBioloidRobot(const std::string &name,std::string &serial_dev,int baudrate, unsigned char id,gpio_ports port, int pin) : ext_int(port,pin) { this->robot_device=NULL; this->serial_device=NULL; @@ -40,6 +40,7 @@ CBioloid_Robot::CBioloid_Robot(const std::string &name,std::string &serial_dev,i this->reset_pb=NULL; this->start_pb=NULL; this->mode_pb=NULL; + this->clear_pending_interrupts(); }catch(CException &e){ if(this->robot_device!=NULL) this->dyn_server->free_device(id); @@ -60,9 +61,9 @@ CBioloid_Robot::CBioloid_Robot(const std::string &name,std::string &serial_dev,i } // internal thread function -void *CBioloid_Robot::ext_int_thread(void *param) +void *CBioloidRobot::ext_int_thread(void *param) { - CBioloid_Robot *robot=(CBioloid_Robot *)param; + CBioloidRobot *robot=(CBioloidRobot *)param; std::list<std::string> events; unsigned char value; int event_id=0; @@ -83,6 +84,15 @@ void *CBioloid_Robot::ext_int_thread(void *param) robot->robot_device->read_byte_register(BIOLOID_USER_PB_CNTRL,&value); if(value&GPIO_INT_FLAG) robot->user_pb->call(robot); + robot->robot_device->read_byte_register(BIOLOID_RESET_PB_CNTRL,&value); + if(value&GPIO_INT_FLAG) + robot->reset_pb->call(robot); + robot->robot_device->read_byte_register(BIOLOID_START_PB_CNTRL,&value); + if(value&GPIO_INT_FLAG) + robot->start_pb->call(robot); + robot->robot_device->read_byte_register(BIOLOID_MODE_PB_CNTRL,&value); + if(value&GPIO_INT_FLAG) + robot->mode_pb->call(robot); } } } @@ -90,8 +100,18 @@ void *CBioloid_Robot::ext_int_thread(void *param) pthread_exit(NULL); } +void CBioloidRobot::clear_pending_interrupts(void) +{ + unsigned char value; + + this->robot_device->read_byte_register(BIOLOID_USER_PB_CNTRL,&value); + this->robot_device->read_byte_register(BIOLOID_RESET_PB_CNTRL,&value); + this->robot_device->read_byte_register(BIOLOID_START_PB_CNTRL,&value); + this->robot_device->read_byte_register(BIOLOID_MODE_PB_CNTRL,&value); +} + // GPIO interface -void CBioloid_Robot::set_led(led_t led) +void CBioloidRobot::set_led(led_t led) { switch(led) { @@ -106,7 +126,7 @@ void CBioloid_Robot::set_led(led_t led) } } -void CBioloid_Robot::clear_led(led_t led) +void CBioloidRobot::clear_led(led_t led) { switch(led) { @@ -121,7 +141,7 @@ void CBioloid_Robot::clear_led(led_t led) } } -void CBioloid_Robot::toggle_led(led_t led) +void CBioloidRobot::toggle_led(led_t led) { switch(led) { @@ -136,7 +156,7 @@ void CBioloid_Robot::toggle_led(led_t led) } } -void CBioloid_Robot::blink_led(led_t led,int period_ms) +void CBioloidRobot::blink_led(led_t led,int period_ms) { unsigned char data[3]; @@ -156,7 +176,7 @@ void CBioloid_Robot::blink_led(led_t led,int period_ms) } } -bool CBioloid_Robot::is_button_pressed(pushbutton_t pushbutton) +bool CBioloidRobot::is_button_pressed(pushbutton_t pushbutton) { unsigned char value; @@ -178,7 +198,7 @@ bool CBioloid_Robot::is_button_pressed(pushbutton_t pushbutton) } // motion manager interface -/*void CBioloid_Robot::mm_set_period(double period_ms) +/*void CBioloidRobot::mm_set_period(double period_ms) { unsigned short period; // internal time in 0|16 fixed point float format in seconds @@ -186,34 +206,34 @@ bool CBioloid_Robot::is_button_pressed(pushbutton_t pushbutton) this->robot_device->write_word_register(BIOLOID_MM_PERIOD_LOW,period); } -unsigned char CBioloid_Robot::mm_get_num_servos(void) +unsigned char CBioloidRobot::mm_get_num_servos(void) { this->robot_device->read_byte_register(BIOLOID_MM_NUM_SERVOS,&this->num_servos); return this->num_servos; } -void CBioloid_Robot::mm_start(void) +void CBioloidRobot::mm_start(void) { this->robot_device->write_byte_register(BIOLOID_MM_CONTROL,0x01); } -void CBioloid_Robot::mm_stop(void) +void CBioloidRobot::mm_stop(void) { this->robot_device->write_byte_register(BIOLOID_MM_CONTROL,0x00); } -void CBioloid_Robot::mm_enable_power(void) +void CBioloidRobot::mm_enable_power(void) { this->robot_device->write_byte_register(BIOLOID_DXL_POWER,0x01); } -void CBioloid_Robot::mm_disable_power(void) +void CBioloidRobot::mm_disable_power(void) { this->robot_device->write_byte_register(BIOLOID_DXL_POWER,0x00); } -bool CBioloid_Robot::mm_is_power_enabled(void) +bool CBioloidRobot::mm_is_power_enabled(void) { unsigned char value; @@ -224,7 +244,7 @@ bool CBioloid_Robot::mm_is_power_enabled(void) return false; } -void CBioloid_Robot::mm_enable_servo(unsigned char servo_id) +void CBioloidRobot::mm_enable_servo(unsigned char servo_id) { unsigned char value; @@ -241,7 +261,7 @@ void CBioloid_Robot::mm_enable_servo(unsigned char servo_id) this->robot_device->write_byte_register(BIOLOID_MM_MODULE_EN0+servo_id/2,value); } -void CBioloid_Robot::mm_disable_servo(unsigned char servo_id) +void CBioloidRobot::mm_disable_servo(unsigned char servo_id) { unsigned char value; @@ -258,7 +278,7 @@ void CBioloid_Robot::mm_disable_servo(unsigned char servo_id) this->robot_device->write_byte_register(BIOLOID_MM_MODULE_EN0+servo_id/2,value); } -bool CBioloid_Robot::mm_is_servo_enabled(unsigned char servo_id) +bool CBioloidRobot::mm_is_servo_enabled(unsigned char servo_id) { unsigned char value; @@ -284,7 +304,7 @@ bool CBioloid_Robot::mm_is_servo_enabled(unsigned char servo_id) } } -void CBioloid_Robot::mm_assign_module(unsigned char servo_id, mm_mode_t mode) +void CBioloidRobot::mm_assign_module(unsigned char servo_id, mm_mode_t mode) { unsigned char value; @@ -307,7 +327,7 @@ void CBioloid_Robot::mm_assign_module(unsigned char servo_id, mm_mode_t mode) this->robot_device->write_byte_register(BIOLOID_MM_MODULE_EN0+servo_id/2,value); } -mm_mode_t CBioloid_Robot::mm_get_module(unsigned char servo_id) +mm_mode_t CBioloidRobot::mm_get_module(unsigned char servo_id) { unsigned char value; @@ -323,7 +343,7 @@ mm_mode_t CBioloid_Robot::mm_get_module(unsigned char servo_id) return (mm_mode_t)((value&0x70)>>4); } -std::vector<double> CBioloid_Robot::mm_get_servo_angles(void) +std::vector<double> CBioloidRobot::mm_get_servo_angles(void) { int i=0; short int values[MAX_NUM_SERVOS]; @@ -337,7 +357,7 @@ std::vector<double> CBioloid_Robot::mm_get_servo_angles(void) return angles; } -double CBioloid_Robot::mm_get_servo_angle(unsigned char servo_id) +double CBioloidRobot::mm_get_servo_angle(unsigned char servo_id) { unsigned short int value; double angle; @@ -353,12 +373,12 @@ double CBioloid_Robot::mm_get_servo_angle(unsigned char servo_id) }*/ // motion action interface -/*void CBioloid_Robot::action_load_page(unsigned char page_id) +/*void CBioloidRobot::action_load_page(unsigned char page_id) { this->robot_device->write_byte_register(BIOLOID_ACTION_PAGE,page_id); } -unsigned char CBioloid_Robot::action_get_current_page(void) +unsigned char CBioloidRobot::action_get_current_page(void) { unsigned char page_id; @@ -367,17 +387,17 @@ unsigned char CBioloid_Robot::action_get_current_page(void) return page_id; } -void CBioloid_Robot::action_start(void) +void CBioloidRobot::action_start(void) { this->robot_device->write_byte_register(BIOLOID_ACTION_CONTROL,0x01); } -void CBioloid_Robot::action_stop(void) +void CBioloidRobot::action_stop(void) { this->robot_device->write_byte_register(BIOLOID_ACTION_CONTROL,0x02); } -bool CBioloid_Robot::action_is_page_running(void) +bool CBioloidRobot::action_is_page_running(void) { unsigned char status; @@ -389,7 +409,7 @@ bool CBioloid_Robot::action_is_page_running(void) return false; }*/ -CBioloid_Robot::~CBioloid_Robot() +CBioloidRobot::~CBioloidRobot() { if(this->thread_server->get_thread_state(this->ext_int_thread_id)==active) { diff --git a/src/bioloid_robot.h b/src/bioloid_robot.h index a81a343b79dfb337278b8dfc8605a477bd0c6003..72b86943749a70286517520f445cf3395301b25c 100644 --- a/src/bioloid_robot.h +++ b/src/bioloid_robot.h @@ -17,7 +17,7 @@ typedef enum {USER1_LED,USER2_LED,RXD_LED,TXD_LED} led_t; /* available pushbuttons */ typedef enum {USER_PB,RESET_PB,START_PB,MODE_PB} pushbutton_t; -class CBioloid_Robot +class CBioloidRobot { private: /* dynamixel interface */ @@ -45,8 +45,9 @@ class CBioloid_Robot CFunctor *mode_pb; protected: static void *ext_int_thread(void *param); + void clear_pending_interrupts(void); public: - CBioloid_Robot(const std::string &name,std::string &serial_dev,int baudrate, unsigned char id,gpio_ports port, int pin); + CBioloidRobot(const std::string &name,std::string &serial_dev,int baudrate, unsigned char id,gpio_ports port, int pin); // GPIO interface void set_led(led_t led); void clear_led(led_t led); @@ -54,7 +55,7 @@ class CBioloid_Robot void blink_led(led_t led, int period_ms); bool is_button_pressed(pushbutton_t pushbutton); template<class T> - void assign_button_callback(pushbutton_t pushbutton,T *obj_ptr,void (T::*pb_callback)(CBioloid_Robot *)) + void assign_button_callback(pushbutton_t pushbutton,T *obj_ptr,void (T::*pb_callback)(CBioloidRobot *)) { switch(pushbutton) { @@ -70,11 +71,41 @@ class CBioloid_Robot this->robot_device->write_byte_register(BIOLOID_USER_PB_CNTRL,0x00);//disable interrupts } break; - case RESET_PB: this->robot_device->write_byte_register(BIOLOID_RESET_PB_CNTRL,GPIO_INT_EN); + case RESET_PB: if(pb_callback!=NULL) + { + this->reset_pb=new CBioloidCallback<T>(obj_ptr,pb_callback); + this->robot_device->write_byte_register(BIOLOID_RESET_PB_CNTRL,GPIO_INT_EN);//enable interrupts + } + else + { + delete this->reset_pb; + this->reset_pb=NULL; + this->robot_device->write_byte_register(BIOLOID_RESET_PB_CNTRL,0x00);//disable interrupts + } break; - case START_PB: this->robot_device->write_byte_register(BIOLOID_START_PB_CNTRL,GPIO_INT_EN); + case START_PB: if(pb_callback!=NULL) + { + this->start_pb=new CBioloidCallback<T>(obj_ptr,pb_callback); + this->robot_device->write_byte_register(BIOLOID_START_PB_CNTRL,GPIO_INT_EN);//enable interrupts + } + else + { + delete this->start_pb; + this->start_pb=NULL; + this->robot_device->write_byte_register(BIOLOID_START_PB_CNTRL,0x00);//disable interrupts + } break; - case MODE_PB: this->robot_device->write_byte_register(BIOLOID_MODE_PB_CNTRL,GPIO_INT_EN); + case MODE_PB: if(pb_callback!=NULL) + { + this->mode_pb=new CBioloidCallback<T>(obj_ptr,pb_callback); + this->robot_device->write_byte_register(BIOLOID_MODE_PB_CNTRL,GPIO_INT_EN);//enable interrupts + } + else + { + delete this->mode_pb; + this->mode_pb=NULL; + this->robot_device->write_byte_register(BIOLOID_MODE_PB_CNTRL,0x00);//disable interrupts + } break; } } @@ -99,7 +130,7 @@ class CBioloid_Robot void action_start(void); void action_stop(void); bool action_is_page_running(void);*/ - ~CBioloid_Robot(); + ~CBioloidRobot(); }; #endif diff --git a/src/bioloid_robot_callbacks.h b/src/bioloid_robot_callbacks.h index 73f293ba487cd583f9b1417921b3a68d940bf2d2..a22788747167b57e9e46240d74fc29724f027ae5 100755 --- a/src/bioloid_robot_callbacks.h +++ b/src/bioloid_robot_callbacks.h @@ -3,7 +3,7 @@ #include "bioloid_robot_exceptions.h" -class CBioloid_Robot; +class CBioloidRobot; /** * \brief @@ -21,7 +21,7 @@ class CFunctor * \brief * */ - virtual void call(CBioloid_Robot *robot){}; + virtual void call(CBioloidRobot *robot){}; /** * \brief * @@ -41,7 +41,7 @@ class CBioloidCallback : public CFunctor /** * \irief */ - typedef void (T::*callback_fnct_ptr)(CBioloid_Robot *robot); + typedef void (T::*callback_fnct_ptr)(CBioloidRobot *robot); /** * \brief * @@ -76,7 +76,7 @@ class CBioloidCallback : public CFunctor * \brief * */ - virtual void call(CBioloid_Robot *robot) + virtual void call(CBioloidRobot *robot) { (this->obj_ptr->*this->callback_fnct)(robot); }; diff --git a/src/examples/bioloid_robot_test.cpp b/src/examples/bioloid_robot_test.cpp index 9c5e09769bae8f39bede7d52464351f0b335af13..63a350fae7f93db4f119094451ced28b49d2be33 100644 --- a/src/examples/bioloid_robot_test.cpp +++ b/src/examples/bioloid_robot_test.cpp @@ -9,10 +9,22 @@ class CCallbacks { public: CCallbacks(){}; - void user_pb_callback(CBioloid_Robot *robot) + void user_pb_callback(CBioloidRobot *robot) { std::cout << "user push button pressed" << std::endl; } + void reset_pb_callback(CBioloidRobot *robot) + { + std::cout << "reset push button pressed" << std::endl; + } + void start_pb_callback(CBioloidRobot *robot) + { + std::cout << "start push button pressed" << std::endl; + } + void mode_pb_callback(CBioloidRobot *robot) + { + std::cout << "mode push button pressed" << std::endl; + } ~CCallbacks(){}; }; @@ -22,8 +34,12 @@ int main(int argc, char *argv[]) CCallbacks callbacks; try{ - CBioloid_Robot tina("Tina",robot_device,921600,0x02,GPIO2,25); -/* for(i=0;i<4;i++) + CBioloidRobot tina("Tina",robot_device,921600,0x02,GPIO2,25); + tina.assign_button_callback(USER_PB,&callbacks,&CCallbacks::user_pb_callback); + tina.assign_button_callback(RESET_PB,&callbacks,&CCallbacks::reset_pb_callback); + tina.assign_button_callback(START_PB,&callbacks,&CCallbacks::start_pb_callback); + tina.assign_button_callback(MODE_PB,&callbacks,&CCallbacks::mode_pb_callback); + for(i=0;i<4;i++) { tina.toggle_led(RXD_LED); tina.toggle_led(TXD_LED); @@ -45,8 +61,7 @@ int main(int argc, char *argv[]) tina.clear_led(RXD_LED); tina.clear_led(TXD_LED); tina.clear_led(USER1_LED); - tina.clear_led(USER2_LED);*/ - tina.assign_button_callback(USER_PB,&callbacks,&CCallbacks::user_pb_callback); + tina.clear_led(USER2_LED); sleep(10); /* for(i=0;i<100;i++) {