diff --git a/dynamixel_manager/include/dyn_manager.h b/dynamixel_manager/include/dyn_manager.h index 834faa5ee09ad0cc45f76bc83cd3a8492f27e075..0b8635b9f447022158f8124ca54b6c910c9fb954 100644 --- a/dynamixel_manager/include/dyn_manager.h +++ b/dynamixel_manager/include/dyn_manager.h @@ -124,6 +124,7 @@ typedef struct{ TMemModule mem_module; unsigned char running; unsigned char do_scan; + unsigned int present_devices; }TDynManager; // public functions diff --git a/dynamixel_manager/include/dyn_manager_registers.h b/dynamixel_manager/include/dyn_manager_registers.h index af8c3c629298e053e80e7413feb9b847f52f551c..c7e37603271f9a28d6f40e92dea1048af36cecb6 100644 --- a/dynamixel_manager/include/dyn_manager_registers.h +++ b/dynamixel_manager/include/dyn_manager_registers.h @@ -1,7 +1,7 @@ #ifndef _DYN_MANAGER_REGISTERS_H #define _DYN_MANAGER_REGISTERS_H -#define RAM_DYN_MANAGER_LENGTH 4 +#define RAM_DYN_MANAGER_LENGTH 8 #define DYN_MANAGER_NUM_MODULES_OFFSET 0 #define DYN_MANAGER_NUM_MASTERS_OFFSET 1 @@ -14,6 +14,7 @@ #define DYN_MANAGER_SCANNING 0x80 #define DYN_MANAGER_NUM_DEVICES_OFFSET 3 +#define DYN_MANAGER_PRESENT_DEVICES 4 #define EEPROM_DYN_MANAGER_LENGTH 1 diff --git a/dynamixel_manager/include/modules/motion_manager.h b/dynamixel_manager/include/modules/motion_manager.h index f2ac07d48ef91af79de0a148ffb7fcffa2448877..59ef8ffd3c0529094abdf8d2fb14ce052d0a4468 100644 --- a/dynamixel_manager/include/modules/motion_manager.h +++ b/dynamixel_manager/include/modules/motion_manager.h @@ -13,7 +13,7 @@ extern "C" { #error "Please, specify the maximum number of motion modules with the MM_MAX_NUM_MOTION_MODULES macro" #endif -typedef enum {MM_NONE = -1, +typedef enum {MM_NONE = 7, MM_ACTION = 0, MM_WALKING = 1, MM_JOINTS = 2, @@ -48,6 +48,7 @@ typedef struct { TMemModule mem_module; unsigned short int ram_base_address; unsigned short int eeprom_base_address; + unsigned int present_servos; }TMotionManager; unsigned char mmanager_init(TMotionManager *mmanager,TMemory *memory,unsigned short int ram_base_address,unsigned short int eeprom_base_address); diff --git a/dynamixel_manager/include/modules/motion_manager_registers.h b/dynamixel_manager/include/modules/motion_manager_registers.h index 6086f1169749c53d878a9d73787beb3c87e933c9..1d0bc4b1447149c7d54fc44965d395b2d0effda3 100644 --- a/dynamixel_manager/include/modules/motion_manager_registers.h +++ b/dynamixel_manager/include/modules/motion_manager_registers.h @@ -3,9 +3,10 @@ #include "dyn_module_registers.h" -#define RAM_MM_LENGTH (DYN_MANAGER_MAX_NUM_DEVICES/2) +#define RAM_MM_LENGTH (4+DYN_MANAGER_MAX_NUM_DEVICES/2) -#define MM_ENABLE_MODULE_OFFSET 0 +#define MM_PRESENT_SERVOS_OFFSET 0 +#define MM_ENABLE_MODULE_OFFSET 4 #define MM_EVEN_SER_EN 0x80 #define MM_EVEN_SER_MOD 0x70 #define MM_ODD_SER_EN 0x08 diff --git a/dynamixel_manager/src/dyn_manager.c b/dynamixel_manager/src/dyn_manager.c index 3eac3989c6840fc6202df469d7c15f466b4c3ef8..db25cf8667d0a5688fcf111927b2c603f67bbc22 100644 --- a/dynamixel_manager/src/dyn_manager.c +++ b/dynamixel_manager/src/dyn_manager.c @@ -292,6 +292,7 @@ unsigned char dyn_manager_init(TDynManager *manager,TMemory *memory,TScheduler * manager->op_handles[i].handle_index=i; } manager->num_ops=0x00; + manager->present_devices=0x00000000; /* initialize scheduler */ scheduler_set_channel(scheduler,sch_channel,(void(*)(void *))dyn_manager_loop,100,manager); manager->scheduler=scheduler; @@ -349,6 +350,7 @@ void dyn_manager_scan(TDynManager *manager) unsigned char i,j,k,num=0; unsigned short int model; + manager->present_devices=0x00000000; // scan all dynamixel buses for(i=0;i<manager->num_masters;i++) { @@ -364,6 +366,7 @@ void dyn_manager_scan(TDynManager *manager) manager->devices[servo_ids[j]].model=model; manager->devices[servo_ids[j]].master_index=i; manager->num_devices++; + manager->present_devices|=(0x00000001<<servo_ids[j]); // pass the infor to each of the modules for(k=0;k<DYN_MANAGER_MAX_NUM_MODULES;k++) if(manager->modules[k]!=0x00000000) @@ -374,6 +377,10 @@ void dyn_manager_scan(TDynManager *manager) } manager->memory->data[manager->ram_base_address+DYN_MANAGER_NUM_DEVICES_OFFSET]=manager->num_devices; manager->memory->data[manager->ram_base_address+DYN_MANAGER_CONTROL_OFFSET]&=(~DYN_MANAGER_SCANNING); + manager->memory->data[manager->ram_base_address+DYN_MANAGER_PRESENT_DEVICES]=manager->present_devices&0x000000FF; + manager->memory->data[manager->ram_base_address+DYN_MANAGER_PRESENT_DEVICES+1]=(manager->present_devices>>8)&0x000000FF; + manager->memory->data[manager->ram_base_address+DYN_MANAGER_PRESENT_DEVICES+2]=(manager->present_devices>>16)&0x000000FF; + manager->memory->data[manager->ram_base_address+DYN_MANAGER_PRESENT_DEVICES+3]=(manager->present_devices>>24)&0x000000FF; // configure the operations for(i=0;i<manager->num_modules;i++) if(manager->modules[i]->setup!=0x00000000) diff --git a/dynamixel_manager/src/modules/motion_manager.c b/dynamixel_manager/src/modules/motion_manager.c index a5fc87b8df43a6ef1eda1622799a1c8a01cee241..84dcad807083e1c25ab7a892f25a54fb3aba71ae 100644 --- a/dynamixel_manager/src/modules/motion_manager.c +++ b/dynamixel_manager/src/modules/motion_manager.c @@ -132,6 +132,11 @@ void mmanager_add_device(TMotionManager *mmanager,unsigned char id,unsigned shor // read the servo limits mmanager->servo_configs[id]->cw_angle_limit=(mmanager_value_to_angle(mmanager,id,cw_value)<<9); mmanager->servo_configs[id]->ccw_angle_limit=(mmanager_value_to_angle(mmanager,id,ccw_value)<<9); + mmanager->present_servos|=(0x00000001<<id); + mmanager->memory->data[mmanager->ram_base_address+MM_PRESENT_SERVOS_OFFSET]=mmanager->present_servos&0x000000FF; + mmanager->memory->data[mmanager->ram_base_address+MM_PRESENT_SERVOS_OFFSET+1]=(mmanager->present_servos>>8)&0x000000FF; + mmanager->memory->data[mmanager->ram_base_address+MM_PRESENT_SERVOS_OFFSET+2]=(mmanager->present_servos>>16)&0x000000FF; + mmanager->memory->data[mmanager->ram_base_address+MM_PRESENT_SERVOS_OFFSET+3]=(mmanager->present_servos>>24)&0x000000FF; } } @@ -285,6 +290,7 @@ unsigned char mmanager_init(TMotionManager *mmanager,TMemory *memory,unsigned sh mmanager->feedback_op[0]=0x00000000; mmanager->feedback_op[1]=0x00000000; mmanager->balance=0x00000000; + mmanager->present_servos=0x00000000; /* initialize memory module */ mem_module_init(&mmanager->mem_module); @@ -300,6 +306,8 @@ unsigned char mmanager_init(TMotionManager *mmanager,TMemory *memory,unsigned sh if(!mem_add_module(memory,&mmanager->mem_module)) return 0x00; mmanager->memory=memory; + for(i=0;i<DYN_MANAGER_MAX_NUM_DEVICES/2;i++) + mmanager->memory->data[ram_base_address+MM_ENABLE_MODULE_OFFSET+i]=0x77; return 0x01; } @@ -333,13 +341,16 @@ void mmanager_enable_servo(TMotionManager *mmanager,unsigned char servo_id) { mmanager->servo_values[servo_id].enabled=0x01; /* add an operation to enable the servo */ - if(mmanager->enable_op==0x00000000 || mmanager->enable_op->op_type==no_op) + 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); } } @@ -351,13 +362,16 @@ void mmanager_disable_servo(TMotionManager *mmanager,unsigned char servo_id) { mmanager->servo_values[servo_id].enabled=0x00; /* add an operation to enable the servo */ - if(mmanager->enable_op==0x00000000 || mmanager->enable_op->op_type==no_op) + 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); } }