@@ -926,6 +926,10 @@ DxlError Dynamixel::SetSyncReadHandler(std::vector<uint8_t> id_arr)
926
926
" set sync read (indirect addr) : addr %d, size %d\n " ,
927
927
IN_ADDR, indirect_info_read_[id_arr.at (0 )].size );
928
928
929
+ if (group_sync_read_) {
930
+ delete group_sync_read_;
931
+ group_sync_read_ = nullptr ;
932
+ }
929
933
group_sync_read_ =
930
934
new dynamixel::GroupSyncRead (
931
935
port_handler_, packet_handler_,
@@ -1014,6 +1018,16 @@ DxlError Dynamixel::GetDxlValueFromSyncRead(double period_ms)
1014
1018
1015
1019
DxlError Dynamixel::SetBulkReadItemAndHandler ()
1016
1020
{
1021
+ if (group_fast_bulk_read_) {
1022
+ delete group_fast_bulk_read_;
1023
+ group_fast_bulk_read_ = nullptr ;
1024
+ }
1025
+ group_fast_bulk_read_ = new dynamixel::GroupFastBulkRead (port_handler_, packet_handler_);
1026
+
1027
+ if (group_bulk_read_) {
1028
+ delete group_bulk_read_;
1029
+ group_bulk_read_ = nullptr ;
1030
+ }
1017
1031
group_bulk_read_ = new dynamixel::GroupBulkRead (port_handler_, packet_handler_);
1018
1032
1019
1033
std::vector<uint8_t > indirect_id_arr;
@@ -1216,6 +1230,17 @@ DxlError Dynamixel::AddDirectRead(
1216
1230
id, item_name.c_str (), item_addr, item_size);
1217
1231
return DxlError::SET_BULK_READ_FAIL;
1218
1232
}
1233
+
1234
+ if (group_fast_bulk_read_->addParam (id, item_addr, item_size) == true ) {
1235
+ fprintf (
1236
+ stderr, " [ID:%03d] Add FastBulkRead item : [%s][%d][%d]\n " ,
1237
+ id, item_name.c_str (), item_addr, item_size);
1238
+ } else {
1239
+ fprintf (
1240
+ stderr, " [ID:%03d] Failed to FastBulkRead item : [%s][%d][%d]\n " ,
1241
+ id, item_name.c_str (), item_addr, item_size);
1242
+ return DxlError::SET_BULK_READ_FAIL;
1243
+ }
1219
1244
return DxlError::OK;
1220
1245
}
1221
1246
@@ -1230,6 +1255,11 @@ DxlError Dynamixel::GetDxlValueFromBulkRead(double period_ms)
1230
1255
DxlError comm_result = ProcessReadCommunication (port_handler_, period_ms, false , true );
1231
1256
if (comm_result == DxlError::OK) {
1232
1257
// Success, process data, and use fast bulk read permanently
1258
+ if (group_bulk_read_) {
1259
+ delete group_bulk_read_;
1260
+ group_bulk_read_ = nullptr ;
1261
+ }
1262
+
1233
1263
for (auto it_read_data : read_data_list_) {
1234
1264
uint8_t id = it_read_data.id ;
1235
1265
uint16_t indirect_addr = indirect_info_read_[id].indirect_data_addr ;
@@ -1240,7 +1270,7 @@ DxlError Dynamixel::GetDxlValueFromBulkRead(double period_ms)
1240
1270
it_read_data.item_size ,
1241
1271
it_read_data.item_data_ptr_vec ,
1242
1272
[this ](uint8_t id, uint16_t addr, uint8_t size) {
1243
- return group_bulk_read_ ->getData (id, addr, size);
1273
+ return group_fast_bulk_read_ ->getData (id, addr, size);
1244
1274
});
1245
1275
} else {
1246
1276
ProcessReadData (
@@ -1250,7 +1280,7 @@ DxlError Dynamixel::GetDxlValueFromBulkRead(double period_ms)
1250
1280
indirect_info_read_[id].item_size ,
1251
1281
it_read_data.item_data_ptr_vec ,
1252
1282
[this ](uint8_t id, uint16_t addr, uint8_t size) {
1253
- return group_bulk_read_ ->getData (id, addr, size);
1283
+ return group_fast_bulk_read_ ->getData (id, addr, size);
1254
1284
});
1255
1285
}
1256
1286
}
@@ -1262,6 +1292,10 @@ DxlError Dynamixel::GetDxlValueFromBulkRead(double period_ms)
1262
1292
++fast_read_fail_count_;
1263
1293
fprintf (stderr, " FastBulkRead TxRx failed (attempt %d/10)\n " , fast_read_fail_count_);
1264
1294
if (fast_read_fail_count_ >= 10 ) {
1295
+ if (group_fast_bulk_read_) {
1296
+ delete group_fast_bulk_read_;
1297
+ group_fast_bulk_read_ = nullptr ;
1298
+ }
1265
1299
// Permanently switch to normal bulk read
1266
1300
fprintf (stderr,
1267
1301
" FastBulkRead failed 10 times, switching to normal BulkRead permanently.\n " );
0 commit comments