diff --git a/dynamixel_manager/include/dyn_manager.h b/dynamixel_manager/include/dyn_manager.h index 3069f47f30090c25f97f73240b36d2d247529d3a..ab8e01a12620396670419d9a382603cdd623defb 100644 --- a/dynamixel_manager/include/dyn_manager.h +++ b/dynamixel_manager/include/dyn_manager.h @@ -127,6 +127,10 @@ typedef struct{ unsigned char stop_flag; unsigned int present_devices; volatile unsigned char lock; + unsigned char modules_period_count[DYN_MANAGER_MAX_NUM_MODULES]; + unsigned char single_op_period_count[DYN_MANAGER_MAX_NUM_SINGLE_OP]; + unsigned char sync_op_period_count[DYN_MANAGER_MAX_NUM_SYNC_OP]; + unsigned char bulk_op_period_count[DYN_MANAGER_MAX_NUM_BULK_OP]; }TDynManager; // public functions diff --git a/dynamixel_manager/src/dyn_manager.c b/dynamixel_manager/src/dyn_manager.c index 3685f03401909efe5a4818760a8d8de87b91a1ec..b9282ff446e165f93de35bf79334bbae8d3aa43a 100644 --- a/dynamixel_manager/src/dyn_manager.c +++ b/dynamixel_manager/src/dyn_manager.c @@ -253,6 +253,7 @@ unsigned char dyn_manager_init(TDynManager *manager,TMemory *memory,TScheduler * manager->operations[i].single_op[j].address=0x0000; manager->operations[i].single_op[j].length=0x0000; manager->operations[i].single_op[j].data=0x00000000; + manager->single_op_period_count[i]=0; } manager->operations[i].num_single_op=0; for(j=0;j<DYN_MANAGER_MAX_NUM_SYNC_OP;j++) @@ -269,6 +270,7 @@ unsigned char dyn_manager_init(TDynManager *manager,TMemory *memory,TScheduler * } manager->operations[i].sync_op[j].address=0x0000; manager->operations[i].sync_op[j].length=0x0000; + manager->sync_op_period_count[i]=0; } manager->operations[i].num_sync_op=0; for(j=0;j<DYN_MANAGER_MAX_NUM_BULK_OP;j++) @@ -285,12 +287,16 @@ unsigned char dyn_manager_init(TDynManager *manager,TMemory *memory,TScheduler * manager->operations[i].bulk_op[j].length[k]=0x0000; manager->operations[i].bulk_op[j].data[k]=0x00000000; } + manager->bulk_op_period_count[i]=0; } manager->operations[i].num_bulk_op=0; } manager->num_masters=0; for(i=0;i<DYN_MANAGER_MAX_NUM_MODULES;i++) + { manager->modules[i]=0x00000000; + manager->modules_period_count[i]=0; + } manager->num_modules=0; for(i=0;i<DYN_MANAGER_MAX_NUM_DEVICES;i++) { @@ -659,7 +665,7 @@ OP_HANDLE *dyn_manager_sync_op_new(TDynManager *manager,unsigned char mode,unsig current_op->length=length; current_op->ids[current_op->num_devices]=ids[i]; current_op->data[current_op->num_devices]=data[i]; - current_op->num_devices++; + current_op->num_devices=1; manager->operations[master_index].num_sync_op++; } } @@ -689,18 +695,21 @@ OP_HANDLE *dyn_manager_sync_op_new(TDynManager *manager,unsigned char mode,unsig void dyn_manager_sync_op_add_devices(TDynManager *manager,OP_HANDLE *op,unsigned char num,unsigned char *ids,unsigned char * const data[]) { - TDynManagerSyncOp *current_op; - unsigned char i,j; + TDynManagerSyncOp *current_op,*other_op; + unsigned char i,j,master_index,current_op_index; dyn_manager_lock(manager); - for(i=0;i<manager->num_masters;i++) + for(i=0;i<num;i++) { - if(op->op_index[i]!=0xFF) + if((master_index=dyn_manager_check_id(manager,ids[i]))==0xFF) + continue; + else { - current_op=&manager->operations[i].sync_op[op->op_index[i]]; - for(j=0;j<num;j++) + if(op->op_index[master_index]!=0xFF) { - if(dyn_manager_id_present(current_op->num_devices,current_op->ids,ids[j])==0x00) + current_op_index=op->op_index[master_index]; + current_op=&manager->operations[master_index].sync_op[current_op_index]; + if(dyn_manager_id_present(current_op->num_devices,current_op->ids,ids[i])==0x00) { if(current_op->num_devices<DYN_MANAGER_MAX_NUM_DEVICES) { @@ -710,6 +719,30 @@ void dyn_manager_sync_op_add_devices(TDynManager *manager,OP_HANDLE *op,unsigned } } } + else + { + current_op_index=manager->operations[master_index].num_sync_op; + if(current_op_index<DYN_MANAGER_MAX_NUM_SYNC_OP) + { + current_op=&manager->operations[master_index].sync_op[current_op_index]; + for(j=0;j<DYN_MANAGER_MAX_NUM_MASTERS;j++) + if(op->op_index[j]!=0xFF) + { + other_op=&manager->operations[j].sync_op[current_op_index]; + current_op->address=other_op->address; + current_op->length=other_op->length; + current_op->common.operation=other_op->common.operation; + current_op->common.repetitions=other_op->common.repetitions; + current_op->common.period_count=other_op->common.period_count; + current_op->common.op_handle=other_op->common.op_handle; + } + op->op_index[master_index]=current_op_index; + current_op->ids[current_op->num_devices]=ids[i]; + current_op->data[current_op->num_devices]=data[i]; + current_op->num_devices=1; + manager->operations[master_index].num_sync_op++; + } + } } } dyn_manager_unlock(manager); @@ -875,29 +908,54 @@ OP_HANDLE *dyn_manager_bulk_op_new(TDynManager *manager,unsigned char mode,unsig void dyn_manager_bulk_op_add_devices(TDynManager *manager,OP_HANDLE *op,unsigned char num,unsigned char *ids,unsigned short int *address, unsigned short int *length,unsigned char * const data[]) { - TDynManagerBulkOp *current_op; - unsigned char i,j; + TDynManagerBulkOp *current_op,*other_op; + unsigned char i,j,master_index,current_op_index; dyn_manager_lock(manager); - for(i=0;i<manager->num_masters;i++) + for(i=0;i<num;i++) { - if(op->op_index[i]!=0xFF) + if((master_index=dyn_manager_check_id(manager,ids[i]))==0xFF) + continue; + else { - current_op=&manager->operations[i].bulk_op[op->op_index[i]]; - for(j=0;j<num;j++) + if(op->op_index[master_index]!=0xFF) { - if(dyn_manager_id_present(current_op->num_devices,current_op->ids,ids[j])==0x00) + current_op_index=op->op_index[master_index]; + current_op=&manager->operations[master_index].bulk_op[current_op_index]; + if(dyn_manager_id_present(current_op->num_devices,current_op->ids,ids[i])==0x00) { if(current_op->num_devices<DYN_MANAGER_MAX_NUM_DEVICES) { current_op->ids[current_op->num_devices]=ids[i]; - current_op->address[current_op->num_devices]=address[i]; - current_op->length[current_op->num_devices]=length[i]; current_op->data[current_op->num_devices]=data[i]; current_op->num_devices++; } } } + else + { + current_op_index=manager->operations[master_index].num_bulk_op; + if(current_op_index<DYN_MANAGER_MAX_NUM_SYNC_OP) + { + current_op=&manager->operations[master_index].bulk_op[current_op_index]; + for(j=0;j<DYN_MANAGER_MAX_NUM_MASTERS;j++) + if(op->op_index[j]!=0xFF) + { + other_op=&manager->operations[j].bulk_op[current_op_index]; + current_op->common.operation=other_op->common.operation; + current_op->common.repetitions=other_op->common.repetitions; + current_op->common.period_count=other_op->common.period_count; + current_op->common.op_handle=other_op->common.op_handle; + } + op->op_index[master_index]=current_op_index; + current_op->ids[current_op->num_devices]=ids[i]; + current_op->data[current_op->num_devices]=data[i]; + current_op->address[current_op->num_devices]=address[i]; + current_op->length[current_op->num_devices]=length[i]; + current_op->num_devices=1; + manager->operations[master_index].num_bulk_op++; + } + } } } dyn_manager_unlock(manager); @@ -1018,12 +1076,9 @@ void dyn_manager_loop(TDynManager *manager) TDynManagerSingleOp *single_op[DYN_MANAGER_MAX_NUM_MASTERS]; TDynManagerSyncOp *sync_op[DYN_MANAGER_MAX_NUM_MASTERS]; TDynManagerBulkOp *bulk_op[DYN_MANAGER_MAX_NUM_MASTERS]; - static unsigned char modules_period_count[DYN_MANAGER_MAX_NUM_MODULES]={0}; - static unsigned char single_op_period_count[DYN_MANAGER_MAX_NUM_SINGLE_OP]={0}; - static unsigned char sync_op_period_count[DYN_MANAGER_MAX_NUM_SINGLE_OP]={0}; - static unsigned char bulk_op_period_count[DYN_MANAGER_MAX_NUM_SINGLE_OP]={0}; // initialize the remaining operations + dyn_manager_lock(manager); for(i=0;i<manager->num_masters;i++) { states[i]=start_single_ops; @@ -1037,18 +1092,17 @@ void dyn_manager_loop(TDynManager *manager) { if(manager->modules[i]->enabled) { - modules_period_count[i]++; - if(modules_period_count[i]==manager->modules[i]->period_count) + manager->modules_period_count[i]++; + if(manager->modules_period_count[i]==manager->modules[i]->period_count) { if(manager->modules[i]->pre_process!=0x00000000) manager->modules[i]->pre_process(manager->modules[i]->data); - modules_period_count[i]=0; + manager->modules_period_count[i]=0; } } } // send all the commands - dyn_manager_lock(manager); do{ for(i=0;i<manager->num_masters;i++) { @@ -1058,16 +1112,16 @@ void dyn_manager_loop(TDynManager *manager) states[i]=start_bulk_ops; else { - single_op_period_count[current_single_op[i]]++; + manager->single_op_period_count[current_single_op[i]]++; single_op[i]=&manager->operations[i].single_op[current_single_op[i]]; - if(single_op_period_count[current_single_op[i]]==single_op[i]->common.period_count) + if(manager->single_op_period_count[current_single_op[i]]==single_op[i]->common.period_count) { if((single_op[i]->common.operation&DYN_MANAGER_MODE_MASK)==DYN_MANAGER_READ) dyn_master_start_read_table(manager->masters[i],single_op[i]->id,single_op[i]->address,single_op[i]->length,single_op[i]->data); else dyn_master_start_write_table(manager->masters[i],single_op[i]->id,single_op[i]->address,single_op[i]->length,single_op[i]->data); states[i]=wait_single_ops; - single_op_period_count[current_single_op[i]]=0; + manager->single_op_period_count[current_single_op[i]]=0; } else { @@ -1100,16 +1154,16 @@ void dyn_manager_loop(TDynManager *manager) } else { - sync_op_period_count[current_sync_op[i]]++; + manager->sync_op_period_count[current_sync_op[i]]++; sync_op[i]=&manager->operations[i].sync_op[current_sync_op[i]]; - if(sync_op_period_count[current_sync_op[i]]==sync_op[i]->common.period_count) + if(manager->sync_op_period_count[current_sync_op[i]]==sync_op[i]->common.period_count) { if((sync_op[i]->common.operation&DYN_MANAGER_MODE_MASK)==DYN_MANAGER_READ) dyn_master_start_sync_read(manager->masters[i],sync_op[i]->num_devices,sync_op[i]->ids,sync_op[i]->address,sync_op[i]->length,sync_op[i]->data); else dyn_master_start_sync_write(manager->masters[i],sync_op[i]->num_devices,sync_op[i]->ids,sync_op[i]->address,sync_op[i]->length,sync_op[i]->data); states[i]=wait_sync_ops; - sync_op_period_count[current_sync_op[i]]=0; + manager->sync_op_period_count[current_sync_op[i]]=0; } else { @@ -1139,16 +1193,16 @@ void dyn_manager_loop(TDynManager *manager) states[i]=start_sync_ops; else { - bulk_op_period_count[current_bulk_op[i]]++; + manager->bulk_op_period_count[current_bulk_op[i]]++; bulk_op[i]=&manager->operations[i].bulk_op[current_bulk_op[i]]; - if(bulk_op_period_count[current_bulk_op[i]]==bulk_op[i]->common.period_count) + if(manager->bulk_op_period_count[current_bulk_op[i]]==bulk_op[i]->common.period_count) { if((bulk_op[i]->common.operation&DYN_MANAGER_MODE_MASK)==DYN_MANAGER_READ) dyn_master_start_bulk_read(manager->masters[i],bulk_op[i]->num_devices,bulk_op[i]->ids,bulk_op[i]->address,bulk_op[i]->length,bulk_op[i]->data); else dyn_master_start_bulk_write(manager->masters[i],bulk_op[i]->num_devices,bulk_op[i]->ids,bulk_op[i]->address,bulk_op[i]->length,bulk_op[i]->data); states[i]=wait_bulk_ops; - bulk_op_period_count[current_bulk_op[i]]=0; + manager->bulk_op_period_count[current_bulk_op[i]]=0; } else { @@ -1179,21 +1233,21 @@ void dyn_manager_loop(TDynManager *manager) } } }while(loop_done>0); - dyn_manager_unlock(manager); // execute the pre_process functions for all modules for(i=0;i<manager->num_modules;i++) { if(manager->modules[i]->enabled) { - if(modules_period_count[i]==manager->modules[i]->period_count) + if(manager->modules_period_count[i]==manager->modules[i]->period_count) { if(manager->modules[i]->post_process!=0x00000000) manager->modules[i]->post_process(manager->modules[i]->data); - modules_period_count[i]=0; + manager->modules_period_count[i]=0; } } } + dyn_manager_unlock(manager); if(manager->stop_flag==0x01) { manager->running=0x00; diff --git a/dynamixel_manager/src/modules/motion_manager.c b/dynamixel_manager/src/modules/motion_manager.c index 29dc9a569a13952abd8fd15bd6efdc79d1800f73..cfc7a2d0f697c4a92de0c327a1d9b39937b6ec0a 100644 --- a/dynamixel_manager/src/modules/motion_manager.c +++ b/dynamixel_manager/src/modules/motion_manager.c @@ -366,17 +366,20 @@ void mmanager_enable_servo(TMotionManager *mmanager,unsigned char servo_id) if(servo_id<DYN_MANAGER_MAX_NUM_DEVICES) { - mmanager->servo_values[servo_id].enabled=0x01; - /* add an operation to enable the servo */ - if(mmanager->servo_configs[servo_id]!=0x00000000) + if(mmanager->servo_values[servo_id].enabled==0x00) { - if(mmanager->enable_op==0x00000000 || mmanager->enable_op->op_type==no_op) + mmanager->servo_values[servo_id].enabled=0x01; + /* add an operation to enable the servo */ + if(mmanager->servo_configs[servo_id]!=0x00000000) { - mmanager->enable_op=dyn_manager_sync_op_new(mmanager->dyn_module.manager,DYN_MANAGER_WRITE,1,&servo_id,mmanager->servo_configs[servo_id]->registers[torque_en].address,1,&data); - dyn_manager_set_op_repetitions(mmanager->dyn_module.manager,mmanager->enable_op,1); + if(mmanager->enable_op==0x00000000 || mmanager->enable_op->op_type==no_op) + { + mmanager->enable_op=dyn_manager_sync_op_new(mmanager->dyn_module.manager,DYN_MANAGER_WRITE,1,&servo_id,mmanager->servo_configs[servo_id]->registers[torque_en].address,1,&data); + dyn_manager_set_op_repetitions(mmanager->dyn_module.manager,mmanager->enable_op,1); + } + else + dyn_manager_sync_op_add_devices(mmanager->dyn_module.manager,mmanager->enable_op,1,&servo_id,&data); } - else - dyn_manager_sync_op_add_devices(mmanager->dyn_module.manager,mmanager->enable_op,1,&servo_id,&data); } } } @@ -387,17 +390,20 @@ void mmanager_disable_servo(TMotionManager *mmanager,unsigned char servo_id) if(servo_id<DYN_MANAGER_MAX_NUM_DEVICES) { - mmanager->servo_values[servo_id].enabled=0x00; - /* add an operation to enable the servo */ - if(mmanager->servo_configs[servo_id]!=0x00000000) + if(mmanager->servo_values[servo_id].enabled==0x01) { - if(mmanager->enable_op==0x00000000 || mmanager->enable_op->op_type==no_op) + mmanager->servo_values[servo_id].enabled=0x00; + /* add an operation to enable the servo */ + if(mmanager->servo_configs[servo_id]!=0x00000000) { - mmanager->enable_op=dyn_manager_sync_op_new(mmanager->dyn_module.manager,DYN_MANAGER_WRITE,1,&servo_id,mmanager->servo_configs[servo_id]->registers[torque_en].address,1,&data); - dyn_manager_set_op_repetitions(mmanager->dyn_module.manager,mmanager->enable_op,1); - } - else - dyn_manager_sync_op_add_devices(mmanager->dyn_module.manager,mmanager->enable_op,1,&servo_id,&data); + if(mmanager->enable_op==0x00000000 || mmanager->enable_op->op_type==no_op) + { + mmanager->enable_op=dyn_manager_sync_op_new(mmanager->dyn_module.manager,DYN_MANAGER_WRITE,1,&servo_id,mmanager->servo_configs[servo_id]->registers[torque_en].address,1,&data); + dyn_manager_set_op_repetitions(mmanager->dyn_module.manager,mmanager->enable_op,1); + } + else + dyn_manager_sync_op_add_devices(mmanager->dyn_module.manager,mmanager->enable_op,1,&servo_id,&data); + } } } }