diff --git a/dynamixel_base/src/dynamixel_master.c b/dynamixel_base/src/dynamixel_master.c index ba4ab98207b6b880e91f02862afc9a9009ea59a6..113992a75626b08ec216de072cc1ee5e21396037 100644 --- a/dynamixel_base/src/dynamixel_master.c +++ b/dynamixel_base/src/dynamixel_master.c @@ -533,19 +533,31 @@ unsigned char dyn_master_is_sync_read_done(TDynamixelMaster *master,unsigned cha } } else + { + num_dev_done=0; return error; + } } else + { + num_dev_done=0; return DYN_CHECKSUM_ERROR; + } } else return error; } else + { + num_dev_done=0; return DYN_SUCCESS; + } } else + { + num_dev_done=0; return DYN_SUCCESS; + } } else return error; @@ -676,10 +688,16 @@ unsigned char dyn_master_is_bulk_read_done(TDynamixelMaster *master,unsigned cha } } else + { + num_dev_done=0; return error; + } } else - return DYN_CHECKSUM_ERROR; + { + num_dev_done++; + return DYN_BUSY; + } } else { @@ -697,20 +715,32 @@ unsigned char dyn_master_is_bulk_read_done(TDynamixelMaster *master,unsigned cha } } else + { + num_dev_done=0; return error; + } } else - return DYN_CHECKSUM_ERROR; + { + num_dev_done++; + return DYN_BUSY; + } } } else return error; } else + { + num_dev_done=0; return DYN_SUCCESS; + } } else + { + num_dev_done=0; return DYN_SUCCESS; + } } else return error; diff --git a/dynamixel_manager/include/dyn_manager.h b/dynamixel_manager/include/dyn_manager.h index 2860e0ceb0d8171eac3301e512d87df7c28aca57..3069f47f30090c25f97f73240b36d2d247529d3a 100644 --- a/dynamixel_manager/include/dyn_manager.h +++ b/dynamixel_manager/include/dyn_manager.h @@ -123,7 +123,8 @@ typedef struct{ sched_channel_t sch_scan_ch; TMemory *memory; TMemModule mem_module; - unsigned char running; + volatile unsigned char running; + unsigned char stop_flag; unsigned int present_devices; volatile unsigned char lock; }TDynManager; @@ -136,6 +137,10 @@ static inline unsigned char dyn_manager_get_period(TDynManager *manager) return manager->period_ms; } void dyn_manager_start(TDynManager *manager); +inline void dyn_manager_wait_stopped(TDynManager *manager) +{ + while(manager->running==0x01); +} void dyn_manager_stop(TDynManager *manager); void dyn_manager_scan(TDynManager *manager); void dyn_manager_add_master(TDynManager *manager,TDynamixelMaster *master); diff --git a/dynamixel_manager/src/dyn_manager.c b/dynamixel_manager/src/dyn_manager.c index df5a9440cf9c65dbb6d0304675b24832c9fd864e..ebf5509a09e996ea63331a7c0e8f3c1f55025e8b 100644 --- a/dynamixel_manager/src/dyn_manager.c +++ b/dynamixel_manager/src/dyn_manager.c @@ -330,6 +330,7 @@ unsigned char dyn_manager_init(TDynManager *manager,TMemory *memory,TScheduler * manager->ram_base_address=ram_base_address; manager->memory=memory; manager->running=0x00; + manager->stop_flag=0x00; return 0x01; } @@ -356,16 +357,17 @@ void dyn_manager_start(TDynManager *manager) void dyn_manager_stop(TDynManager *manager) { scheduler_disable_channel(manager->scheduler,manager->sch_loop_ch); - manager->running=0x00; - manager->memory->data[manager->ram_base_address+DYN_MANAGER_CONTROL_OFFSET]&=(~DYN_MANAGER_RUNNING); + manager->stop_flag=0x01; } void dyn_manager_scan(TDynManager *manager) { - unsigned char servo_ids[DYN_MANAGER_MAX_NUM_DEVICES]; + unsigned char servo_ids[255]; unsigned char i,j,k,num=0; unsigned short int model; + dyn_manager_wait_stopped(manager); + HAL_Delay(1000); manager->present_devices=0x00000000; manager->num_devices=0; // scan all dynamixel buses @@ -373,6 +375,8 @@ void dyn_manager_scan(TDynManager *manager) { // scan the bus dyn_master_scan(manager->masters[i],&num,servo_ids); + if(num>DYN_MANAGER_MAX_NUM_DEVICES) + num=DYN_MANAGER_MAX_NUM_DEVICES; for(j=0;j<num;j++) { // get the servo module @@ -1191,4 +1195,10 @@ void dyn_manager_loop(TDynManager *manager) } } } + if(manager->stop_flag==0x01) + { + manager->running=0x00; + manager->memory->data[manager->ram_base_address+DYN_MANAGER_CONTROL_OFFSET]&=(~DYN_MANAGER_RUNNING); + manager->stop_flag=0x00; + } }