@@ -658,6 +658,22 @@ DxlError Dynamixel::WriteMultiDxlData()
658
658
bool Dynamixel::checkReadType ()
659
659
{
660
660
for (size_t dxl_index = 1 ; dxl_index < read_data_list_.size (); dxl_index++) {
661
+ // Check if Indirect Data Read address and size are different
662
+ uint16_t indirect_addr[2 ]; // [i-1], [i]
663
+ uint8_t indirect_size[2 ]; // [i-1], [i]
664
+
665
+ if (!dxl_info_.GetDxlControlItem (
666
+ read_data_list_.at (dxl_index).id , " Indirect Data Read" , indirect_addr[1 ], indirect_size[1 ]) ||
667
+ !dxl_info_.GetDxlControlItem (
668
+ read_data_list_.at (dxl_index - 1 ).id , " Indirect Data Read" , indirect_addr[0 ], indirect_size[0 ]))
669
+ {
670
+ return BULK;
671
+ }
672
+
673
+ if (indirect_addr[1 ] != indirect_addr[0 ] || indirect_size[1 ] != indirect_size[0 ]) {
674
+ return BULK;
675
+ }
676
+
661
677
if (read_data_list_.at (dxl_index).item_name .size () !=
662
678
read_data_list_.at (dxl_index - 1 ).item_name .size ())
663
679
{
@@ -667,7 +683,11 @@ bool Dynamixel::checkReadType()
667
683
item_index++)
668
684
{
669
685
if (read_data_list_.at (dxl_index).item_name .at (item_index) !=
670
- read_data_list_.at (dxl_index - 1 ).item_name .at (item_index))
686
+ read_data_list_.at (dxl_index - 1 ).item_name .at (item_index) ||
687
+ read_data_list_.at (dxl_index).item_addr .at (item_index) !=
688
+ read_data_list_.at (dxl_index - 1 ).item_addr .at (item_index) ||
689
+ read_data_list_.at (dxl_index).item_size .at (item_index) !=
690
+ read_data_list_.at (dxl_index - 1 ).item_size .at (item_index))
671
691
{
672
692
return BULK;
673
693
}
@@ -679,6 +699,22 @@ bool Dynamixel::checkReadType()
679
699
bool Dynamixel::checkWriteType ()
680
700
{
681
701
for (size_t dxl_index = 1 ; dxl_index < write_data_list_.size (); dxl_index++) {
702
+ // Check if Indirect Data Write address and size are different
703
+ uint16_t indirect_addr[2 ]; // [i-1], [i]
704
+ uint8_t indirect_size[2 ]; // [i-1], [i]
705
+
706
+ if (!dxl_info_.GetDxlControlItem (
707
+ write_data_list_.at (dxl_index).id , " Indirect Data Write" , indirect_addr[1 ], indirect_size[1 ]) ||
708
+ !dxl_info_.GetDxlControlItem (
709
+ write_data_list_.at (dxl_index - 1 ).id , " Indirect Data Write" , indirect_addr[0 ], indirect_size[0 ]))
710
+ {
711
+ return BULK;
712
+ }
713
+
714
+ if (indirect_addr[1 ] != indirect_addr[0 ] || indirect_size[1 ] != indirect_size[0 ]) {
715
+ return BULK;
716
+ }
717
+
682
718
if (write_data_list_.at (dxl_index).item_name .size () !=
683
719
write_data_list_.at (dxl_index - 1 ).item_name .size ())
684
720
{
@@ -688,7 +724,12 @@ bool Dynamixel::checkWriteType()
688
724
item_index++)
689
725
{
690
726
if (write_data_list_.at (dxl_index).item_name .at (item_index) !=
691
- write_data_list_.at (dxl_index - 1 ).item_name .at (item_index))
727
+ write_data_list_.at (dxl_index - 1 ).item_name .at (item_index) ||
728
+ write_data_list_.at (dxl_index).item_addr .at (item_index) !=
729
+ write_data_list_.at (dxl_index - 1 ).item_addr .at (item_index) ||
730
+ write_data_list_.at (dxl_index).item_size .at (item_index) !=
731
+ write_data_list_.at (dxl_index - 1 ).item_size .at (item_index)
732
+ )
692
733
{
693
734
return BULK;
694
735
}
@@ -870,11 +911,12 @@ DxlError Dynamixel::SetBulkReadHandler(std::vector<uint8_t> id_arr)
870
911
}
871
912
// Set indirect addr.
872
913
indirect_info_read_[it_id].indirect_data_addr = IN_ADDR;
914
+
915
+ fprintf (
916
+ stderr,
917
+ " set bulk read (indirect addr) : addr %d, size %d\n " ,
918
+ IN_ADDR, indirect_info_read_[id_arr.at (0 )].size );
873
919
}
874
- fprintf (
875
- stderr,
876
- " set bulk read (indirect addr) : addr %d, size %d\n " ,
877
- IN_ADDR, indirect_info_read_[id_arr.at (0 )].size );
878
920
879
921
group_bulk_read_ = new dynamixel::GroupBulkRead (port_handler_, packet_handler_);
880
922
@@ -1130,30 +1172,29 @@ DxlError Dynamixel::SetBulkWriteItemAndHandler()
1130
1172
1131
1173
DxlError Dynamixel::SetBulkWriteHandler (std::vector<uint8_t > id_arr)
1132
1174
{
1133
- uint16_t INDIRECT_ADDR = 0 ;
1134
- uint8_t INDIRECT_SIZE ;
1175
+ uint16_t IN_ADDR = 0 ;
1176
+ uint8_t IN_SIZE = 0 ;
1135
1177
1136
1178
for (auto it_id : id_arr) {
1137
1179
// Get the indirect addr.
1138
- if (dxl_info_.GetDxlControlItem (
1139
- it_id, " Indirect Data Write" , INDIRECT_ADDR,
1140
- INDIRECT_SIZE) == false )
1141
- {
1180
+ if (dxl_info_.GetDxlControlItem (it_id, " Indirect Data Write" , IN_ADDR, IN_SIZE) == false ) {
1142
1181
fprintf (
1143
1182
stderr,
1144
1183
" Fail to set indirect address bulk write. "
1145
1184
" the dxl unincluding indirect address in control table are being used.\n " );
1146
1185
return DxlError::SET_BULK_WRITE_FAIL;
1147
1186
}
1148
1187
// Set indirect addr.
1149
- indirect_info_write_[it_id].indirect_data_addr = INDIRECT_ADDR;
1188
+ indirect_info_write_[it_id].indirect_data_addr = IN_ADDR;
1189
+
1190
+ fprintf (
1191
+ stderr,
1192
+ " set bulk write (indirect addr) : addr %d, size %d\n " ,
1193
+ IN_ADDR, indirect_info_write_[id_arr.at (0 )].size );
1150
1194
}
1151
- fprintf (
1152
- stderr,
1153
- " set bulk write (indirect addr) : addr %d, size %d\n " ,
1154
- INDIRECT_ADDR, indirect_info_write_[id_arr.at (0 )].size );
1155
1195
1156
1196
group_bulk_write_ = new dynamixel::GroupBulkWrite (port_handler_, packet_handler_);
1197
+
1157
1198
return DxlError::OK;
1158
1199
}
1159
1200
0 commit comments