Skip to content

Commit 0076da8

Browse files
committed
- modified to prevent duplicate indirect address write
- fixed a bug that occure when handling bulk read item that does not exist.
1 parent 05f4a5e commit 0076da8

File tree

2 files changed

+23
-4
lines changed

2 files changed

+23
-4
lines changed

robotis_controller/src/robotis_controller/robotis_controller.cpp

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -485,6 +485,8 @@ void RobotisController::initializeDevice(const std::string init_file_path)
485485
{
486486
if (dxl->bulk_read_items_.size() != 0)
487487
{
488+
uint16_t data16 = 0;
489+
488490
bulkread_start_addr = dxl->bulk_read_items_[0]->address_;
489491
bulkread_data_length = 0;
490492

@@ -498,7 +500,11 @@ void RobotisController::initializeDevice(const std::string init_file_path)
498500
for (int l = 0; l < addr_leng; l++)
499501
{
500502
// ROS_WARN("[%12s] INDIR_ADDR: %d, ITEM_ADDR: %d", joint_name.c_str(), indirect_addr, dxl->ctrl_table[dxl->bulk_read_items[i]->item_name]->address + _l);
501-
write2Byte(joint_name, indirect_addr, dxl->ctrl_table_[dxl->bulk_read_items_[i]->item_name_]->address_ + l);
503+
read2Byte(joint_name, indirect_addr, &data16);
504+
if (data16 != dxl->ctrl_table_[dxl->bulk_read_items_[i]->item_name_]->address_ + l)
505+
{
506+
write2Byte(joint_name, indirect_addr, dxl->ctrl_table_[dxl->bulk_read_items_[i]->item_name_]->address_ + l);
507+
}
502508
indirect_addr += 2;
503509
}
504510
}
@@ -552,6 +558,8 @@ void RobotisController::initializeDevice(const std::string init_file_path)
552558
{
553559
if (sensor->bulk_read_items_.size() != 0)
554560
{
561+
uint16_t data16 = 0;
562+
555563
bulkread_start_addr = sensor->bulk_read_items_[0]->address_;
556564
bulkread_data_length = 0;
557565

@@ -565,9 +573,13 @@ void RobotisController::initializeDevice(const std::string init_file_path)
565573
for (int l = 0; l < addr_leng; l++)
566574
{
567575
// ROS_WARN("[%12s] INDIR_ADDR: %d, ITEM_ADDR: %d", sensor_name.c_str(), indirect_addr, sensor->ctrl_table[sensor->bulk_read_items[i]->item_name]->address + _l);
568-
write2Byte(sensor_name,
569-
indirect_addr,
570-
sensor->ctrl_table_[sensor->bulk_read_items_[i]->item_name_]->address_ + l);
576+
read2Byte(sensor_name, indirect_addr, &data16);
577+
if (data16 != sensor->ctrl_table_[sensor->bulk_read_items_[i]->item_name_]->address_ + l)
578+
{
579+
write2Byte(sensor_name,
580+
indirect_addr,
581+
sensor->ctrl_table_[sensor->bulk_read_items_[i]->item_name_]->address_ + l);
582+
}
571583
indirect_addr += 2;
572584
}
573585
}

robotis_device/src/robotis_device/robot.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,13 @@ Robot::Robot(std::string robot_file_path, std::string dev_desc_dir_path)
154154
uint16_t indirect_data_addr = dxl->ctrl_table_[INDIRECT_DATA_1]->address_;
155155
for (int _i = 0; _i < sub_tokens.size(); _i++)
156156
{
157+
std::map<std::string, ControlTableItem *>::iterator bulkread_it = dxl->ctrl_table_.find(sub_tokens[_i]);
158+
if(bulkread_it == dxl->ctrl_table_.end())
159+
{
160+
fprintf(stderr, "\n ##### BULK READ ITEM [ %s ] NOT FOUND!! #####\n\n", sub_tokens[_i].c_str());
161+
continue;
162+
}
163+
157164
dxl->bulk_read_items_.push_back(new ControlTableItem());
158165
ControlTableItem *dest_item = dxl->bulk_read_items_[_i];
159166
ControlTableItem *src_item = dxl->ctrl_table_[sub_tokens[_i]];

0 commit comments

Comments
 (0)