17 #ifndef ABSTRACT_TTL_DRIVER_HPP
18 #define ABSTRACT_TTL_DRIVER_HPP
25 #include "dynamixel_sdk/dynamixel_sdk.h"
26 #include "common/common_defs.hpp"
27 #include "common/model/hardware_type_enum.hpp"
28 #include "common/model/single_motor_cmd.hpp"
29 #include "common/model/abstract_synchronize_motor_cmd.hpp"
43 std::shared_ptr<dynamixel::PacketHandler> packetHandler);
46 virtual int ping(uint8_t
id);
48 uint16_t& model_number);
49 virtual int scan(std::vector<uint8_t>& id_list);
50 virtual int reboot(uint8_t
id);
52 virtual int readCustom(uint16_t address, uint8_t data_len, uint8_t
id, uint32_t& data);
53 virtual int writeCustom(uint16_t address, uint8_t data_len, uint8_t
id, uint32_t data);
55 virtual int writeSingleCmd(
const std::unique_ptr<common::model::AbstractTtlSingleMotorCmd >& cmd) = 0;
56 virtual int writeSyncCmd(
int type,
const std::vector<uint8_t>& ids,
const std::vector<uint32_t>& params) = 0;
59 virtual std::string
str()
const;
72 virtual int readVoltage(uint8_t
id,
double& voltage) = 0;
75 virtual int syncReadFirmwareVersion(
const std::vector<uint8_t>& id_list, std::vector<std::string>& firmware_version) = 0;
76 virtual int syncReadTemperature(
const std::vector<uint8_t>& id_list, std::vector<uint8_t>& temperature_list) = 0;
77 virtual int syncReadVoltage(
const std::vector<uint8_t>& id_list, std::vector<double>& voltage_list) = 0;
78 virtual int syncReadRawVoltage(
const std::vector<uint8_t>& id_list, std::vector<double>& voltage_list) = 0;
79 virtual int syncReadHwErrorStatus(
const std::vector<uint8_t>& id_list, std::vector<uint8_t>& hw_error_list) = 0;
80 virtual int syncReadHwStatus(
const std::vector<uint8_t> &id_list, std::vector<std::pair<double, uint8_t> >& data_array_list) = 0;
85 int read(uint16_t address, uint8_t
id, T& data);
88 int syncRead(uint16_t address,
const std::vector<uint8_t>& id_list, std::vector<T>& data_list);
90 template<
typename T, const
size_t N>
92 const std::vector<uint8_t> &id_list,
93 std::vector<std::array<T, N> >& data_list);
96 int write(uint16_t address, uint8_t
id, T data);
99 int syncWrite(uint16_t address,
const std::vector<uint8_t>& id_list,
const std::vector<T>& data_list);
139 int dxl_comm_result = COMM_TX_FAIL;
148 id, address, &raw_data, &error);
149 data =
static_cast<T
>(raw_data);
157 id, address, &raw_data, &error);
158 data =
static_cast<T
>(raw_data);
166 id, address, &raw_data, &error);
167 data =
static_cast<T
>(raw_data);
171 printf(
"AbstractTtlDriver::read ERROR: Size param must be 1, 2 or 4 bytes\n");
177 printf(
"AbstractTtlDriver::write ERROR: device return error: id=%d, addr=%d, len=%d, err=0x%02x\n",
id, address,
static_cast<int>(
sizeof(T)), error);
178 dxl_comm_result = error;
181 return dxl_comm_result;
193 template<
typename T, const
size_t N>
195 const std::vector<uint8_t> &id_list,
196 std::vector<std::array<T, N> >& data_list)
199 uint16_t data_size =
sizeof(T);
200 int dxl_comm_result = COMM_TX_FAIL;
204 for (
auto const&
id : id_list)
206 if (!groupSyncRead.addParam(
id))
208 groupSyncRead.clearParam();
213 dxl_comm_result = groupSyncRead.txRxPacket();
215 if (COMM_SUCCESS == dxl_comm_result)
217 for (
auto const&
id : id_list)
219 if (groupSyncRead.isAvailable(
id, address, data_size * N))
221 std::array<T, N> blocks{};
223 for(uint8_t b = 0; b < N; ++b)
225 T data =
static_cast<T
>(groupSyncRead.getData(
id, address + b * data_size, data_size));
229 data_list.emplace_back(std::move(blocks));
239 groupSyncRead.clearParam();
241 return dxl_comm_result;
253 const std::vector<uint8_t> &id_list,
254 std::vector<T> &data_list)
256 int dxl_comm_result = COMM_TX_FAIL;
259 uint8_t data_len =
sizeof(T);
264 for (
auto const&
id : id_list)
266 if (!groupSyncRead.addParam(
id))
268 groupSyncRead.clearParam();
273 dxl_comm_result = groupSyncRead.txRxPacket();
275 if (COMM_SUCCESS == dxl_comm_result)
277 for (
auto const&
id : id_list)
279 if (groupSyncRead.isAvailable(
id, address, data_len))
281 T data =
static_cast<T
>(groupSyncRead.getData(
id, address, data_len));
282 data_list.emplace_back(data);
292 groupSyncRead.clearParam();
296 printf(
"AbstractTtlDriver::syncRead ERROR: Size param must be 1, 2 or 4 bytes\n");
299 return dxl_comm_result;
305 int dxl_comm_result = COMM_TX_FAIL;
312 id, address, data, &error);
316 id, address, data, &error);
320 id, address, data, &error);
323 printf(
"AbstractTtlDriver::write ERROR: Size param must be 1, 2 or 4 bytes\n");
329 printf(
"AbstractTtlDriver::write ERROR: device return error: id=%d, addr=%d, len=%d, err=0x%02x\n",
id, address,
static_cast<int>(
sizeof(T)), error);
330 dxl_comm_result = error;
333 return dxl_comm_result;
339 int dxl_comm_result = COMM_SUCCESS;
340 uint8_t data_len =
sizeof(T);
342 if (!id_list.empty())
344 if (id_list.size() == data_list.size())
351 bool dxl_senddata_result =
false;
353 for (
size_t i = 0; i < id_list.size(); ++i)
355 uint8_t
id = id_list.at(i);
356 T data = data_list.at(i);
362 uint8_t params[1] = {
static_cast<uint8_t
>(data)};
363 dxl_senddata_result = groupSyncWrite.addParam(
id, params);
368 uint8_t params[2] = {DXL_LOBYTE(
static_cast<uint16_t
>(data)),
369 DXL_HIBYTE(
static_cast<uint16_t
>(data))};
370 dxl_senddata_result = groupSyncWrite.addParam(
id, params);
375 uint8_t params[4] = {DXL_LOBYTE(DXL_LOWORD(data)),
376 DXL_HIBYTE(DXL_LOWORD(data)),
377 DXL_LOBYTE(DXL_HIWORD(data)),
378 DXL_HIBYTE(DXL_HIWORD(data))};
379 dxl_senddata_result = groupSyncWrite.addParam(
id, params);
383 printf(
"AbstractTtlDriver::syncWrite ERROR: Size param must be 1, 2 or 4 bytes\n");
387 if (!dxl_senddata_result)
396 dxl_comm_result = groupSyncWrite.txPacket();
398 groupSyncWrite.clearParam();
406 return dxl_comm_result;
411 #endif // ABSTRACT_TTL_DRIVER_HPP