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"
42 std::shared_ptr<dynamixel::PacketHandler> packetHandler);
45 virtual int ping(uint8_t
id);
47 virtual int scan(std::vector<uint8_t> &id_list);
48 virtual int reboot(uint8_t
id);
50 virtual int readCustom(uint16_t address, uint8_t data_len, uint8_t
id, uint32_t &data);
51 virtual int writeCustom(uint16_t address, uint8_t data_len, uint8_t
id, uint32_t data);
53 virtual int writeSingleCmd(
const std::unique_ptr<common::model::AbstractTtlSingleMotorCmd> &cmd) = 0;
54 virtual int writeSyncCmd(
int type,
const std::vector<uint8_t> &ids,
const std::vector<uint32_t> ¶ms) = 0;
57 virtual std::string
str()
const;
70 virtual int readVoltage(uint8_t
id,
double &voltage) = 0;
74 std::vector<std::string> &firmware_version) = 0;
75 virtual int syncReadTemperature(
const std::vector<uint8_t> &id_list, std::vector<uint8_t> &temperature_list) = 0;
76 virtual int syncReadVoltage(
const std::vector<uint8_t> &id_list, std::vector<double> &voltage_list) = 0;
77 virtual int syncReadRawVoltage(
const std::vector<uint8_t> &id_list, std::vector<double> &voltage_list) = 0;
78 virtual int syncReadHwErrorStatus(
const std::vector<uint8_t> &id_list, std::vector<uint8_t> &hw_error_list) = 0;
80 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 std::vector<std::array<T, N> > &data_list);
95 int write(uint16_t address, uint8_t
id, T data);
98 int syncWrite(uint16_t address,
const std::vector<uint8_t> &id_list,
const std::vector<T> &data_list);
133 template <
typename T>
139 int dxl_comm_result = COMM_TX_FAIL;
147 data =
static_cast<T
>(raw_data);
154 data =
static_cast<T
>(raw_data);
161 data =
static_cast<T
>(raw_data);
165 printf(
"AbstractTtlDriver::read ERROR: Size param must be 1, 2 or 4 bytes\n");
171 printf(
"AbstractTtlDriver::write ERROR: device return error: id=%d, addr=%d, len=%d, err=0x%02x\n",
id, address,
172 static_cast<int>(
sizeof(T)), error);
173 dxl_comm_result = error;
176 return dxl_comm_result;
187 template <
typename T, const
size_t N>
189 std::vector<std::array<T, N> > &data_list)
192 uint16_t data_size =
sizeof(T);
193 int dxl_comm_result = COMM_TX_FAIL;
197 for (
auto const &
id : id_list)
199 if (!groupSyncRead.addParam(
id))
201 groupSyncRead.clearParam();
206 dxl_comm_result = groupSyncRead.txRxPacket();
208 if (COMM_SUCCESS == dxl_comm_result)
210 for (
auto const &
id : id_list)
212 if (groupSyncRead.isAvailable(
id, address, data_size * N))
214 std::array<T, N> blocks{};
216 for (uint8_t b = 0; b < N; ++b)
218 T data =
static_cast<T
>(groupSyncRead.getData(
id, address + b * data_size, data_size));
222 data_list.emplace_back(std::move(blocks));
232 groupSyncRead.clearParam();
234 return dxl_comm_result;
244 template <
typename T>
247 int dxl_comm_result = COMM_TX_FAIL;
250 uint8_t data_len =
sizeof(T);
255 for (
auto const &
id : id_list)
257 if (!groupSyncRead.addParam(
id))
259 groupSyncRead.clearParam();
264 dxl_comm_result = groupSyncRead.txRxPacket();
266 if (COMM_SUCCESS == dxl_comm_result)
268 for (
auto const &
id : id_list)
270 if (groupSyncRead.isAvailable(
id, address, data_len))
272 T data =
static_cast<T
>(groupSyncRead.getData(
id, address, data_len));
273 data_list.emplace_back(data);
283 groupSyncRead.clearParam();
287 printf(
"AbstractTtlDriver::syncRead ERROR: Size param must be 1, 2 or 4 bytes\n");
290 return dxl_comm_result;
293 template <
typename T>
296 int dxl_comm_result = COMM_TX_FAIL;
311 printf(
"AbstractTtlDriver::write ERROR: Size param must be 1, 2 or 4 bytes\n");
317 printf(
"AbstractTtlDriver::write ERROR: device return error: id=%d, addr=%d, len=%d, err=0x%02x\n",
id, address,
318 static_cast<int>(
sizeof(T)), error);
319 dxl_comm_result = error;
322 return dxl_comm_result;
325 template <
typename T>
328 int dxl_comm_result = COMM_SUCCESS;
329 uint8_t data_len =
sizeof(T);
331 if (!id_list.empty())
333 if (id_list.size() == data_list.size())
337 bool dxl_senddata_result =
false;
339 for (
size_t i = 0; i < id_list.size(); ++i)
341 uint8_t
id = id_list.at(i);
342 T data = data_list.at(i);
347 uint8_t params[1] = {
static_cast<uint8_t
>(data) };
348 dxl_senddata_result = groupSyncWrite.addParam(
id, params);
352 uint8_t params[2] = { DXL_LOBYTE(
static_cast<uint16_t
>(data)), DXL_HIBYTE(
static_cast<uint16_t
>(data)) };
353 dxl_senddata_result = groupSyncWrite.addParam(
id, params);
357 uint8_t params[4] = { DXL_LOBYTE(DXL_LOWORD(data)), DXL_HIBYTE(DXL_LOWORD(data)),
358 DXL_LOBYTE(DXL_HIWORD(data)), DXL_HIBYTE(DXL_HIWORD(data)) };
359 dxl_senddata_result = groupSyncWrite.addParam(
id, params);
363 printf(
"AbstractTtlDriver::syncWrite ERROR: Size param must be 1, 2 or 4 bytes\n");
367 if (!dxl_senddata_result)
376 dxl_comm_result = groupSyncWrite.txPacket();
378 groupSyncWrite.clearParam();
386 return dxl_comm_result;
391 #endif // ABSTRACT_TTL_DRIVER_HPP