17 #ifndef NED3PRO_END_EFFECTOR_DRIVER_HPP
18 #define NED3PRO_END_EFFECTOR_DRIVER_HPP
30 #include "common/model/end_effector_command_type_enum.hpp"
31 #include "common/model/end_effector_state.hpp"
33 using ::common::model::EEndEffectorCommandType;
41 template <
typename reg_type = Ned3ProEndEffectorReg>
46 std::shared_ptr<dynamixel::PacketHandler> packetHandler);
52 std::string
str()
const override;
58 int readVoltage(uint8_t
id,
double &voltage)
override;
61 int syncReadFirmwareVersion(
const std::vector<uint8_t> &id_list, std::vector<std::string> &firmware_list)
override;
62 int syncReadTemperature(
const std::vector<uint8_t> &id_list, std::vector<uint8_t> &temperature_list)
override;
63 int syncReadVoltage(
const std::vector<uint8_t> &id_list, std::vector<double> &voltage_list)
override;
64 int syncReadRawVoltage(
const std::vector<uint8_t> &id_list, std::vector<double> &voltage_list)
override;
65 int syncReadHwStatus(
const std::vector<uint8_t> &id_list, std::vector<std::pair<double, uint8_t>> &data_list)
override;
67 int syncReadHwErrorStatus(
const std::vector<uint8_t> &id_list, std::vector<uint8_t> &hw_error_list)
override;
75 int syncReadButtonsStatus(
const uint8_t &
id, std::vector<common::model::EActionType> &action_list)
override;
99 template <
typename reg_type>
102 std::move(packetHandler))
114 template <
typename reg_type>
125 template <
typename reg_type>
128 uint16_t model_number = 0;
129 int ping_result = getModelNumber(
id, model_number);
131 if (ping_result == COMM_SUCCESS)
133 if (model_number && model_number != reg_type::MODEL_NUMBER)
135 return PING_WRONG_MODEL_NUMBER;
148 template <
typename reg_type>
151 int res = COMM_RX_FAIL;
153 res = read<typename reg_type::TYPE_FIRMWARE_VERSION>(reg_type::ADDR_FIRMWARE_VERSION,
id, data);
154 version = interpretFirmwareVersion(data);
166 template <
typename reg_type>
169 return read<typename reg_type::TYPE_PRESENT_TEMPERATURE>(reg_type::ADDR_PRESENT_TEMPERATURE,
id, temperature);
178 template <
typename reg_type>
181 uint16_t voltage_mV = 0;
182 int res = read<typename reg_type::TYPE_PRESENT_VOLTAGE>(reg_type::ADDR_PRESENT_VOLTAGE,
id, voltage_mV);
183 voltage =
static_cast<double>(voltage_mV) / reg_type::VOLTAGE_CONVERSION;
193 template <
typename reg_type>
196 hardware_error_status = 0;
197 return read<typename reg_type::TYPE_HW_ERROR_STATUS>(reg_type::ADDR_HW_ERROR_STATUS,
id, hardware_error_status);
206 template <
typename reg_type>
210 firmware_list.clear();
211 std::vector<uint32_t> data_list{};
212 res = syncRead<typename reg_type::TYPE_FIRMWARE_VERSION>(reg_type::ADDR_FIRMWARE_VERSION, id_list, data_list);
213 for (
auto const &data : data_list)
214 firmware_list.emplace_back(interpretFirmwareVersion(data));
224 template <
typename reg_type>
227 return syncRead<typename reg_type::TYPE_PRESENT_TEMPERATURE>(reg_type::ADDR_PRESENT_TEMPERATURE, id_list, temperature_list);
236 template <
typename reg_type>
239 voltage_list.clear();
240 std::vector<uint16_t> v_read;
241 int res = syncRead<typename reg_type::TYPE_PRESENT_VOLTAGE>(reg_type::ADDR_PRESENT_VOLTAGE, id_list, v_read);
242 for (
auto const &v : v_read)
243 voltage_list.emplace_back(
static_cast<double>(v) / reg_type::VOLTAGE_CONVERSION);
253 template <
typename reg_type>
256 voltage_list.clear();
257 std::vector<uint16_t> v_read;
258 int res = syncRead<typename reg_type::TYPE_PRESENT_VOLTAGE>(reg_type::ADDR_PRESENT_VOLTAGE, id_list, v_read);
259 for (
auto const &v : v_read)
260 voltage_list.emplace_back(
static_cast<double>(v));
270 template <
typename reg_type>
272 std::vector<std::pair<double, uint8_t>> &data_list)
276 std::vector<std::array<uint8_t, 3>> raw_data;
277 int res = syncReadConsecutiveBytes<uint8_t, 3>(reg_type::ADDR_PRESENT_VOLTAGE, id_list, raw_data);
279 for (
auto const &data : raw_data)
282 auto voltage =
static_cast<double>((
static_cast<uint16_t
>(data.at(1)) << 8) | data.at(0));
285 uint8_t temperature = data.at(2);
287 data_list.emplace_back(std::make_pair(voltage, temperature));
299 template <
typename reg_type>
302 return syncRead<typename reg_type::TYPE_HW_ERROR_STATUS>(reg_type::ADDR_HW_ERROR_STATUS, id_list, hw_error_list);
313 template <
typename reg_type>
315 common::model::EActionType &action)
318 int res = read<typename reg_type::TYPE_BUTTON_STATUS>(reg_type::ADDR_STATE_BUTTON_CUSTOM,
id, status);
319 action = interpretActionValue(status);
329 template <
typename reg_type>
333 int res = read<typename reg_type::TYPE_BUTTON_STATUS>(reg_type::ADDR_STATE_BUTTON_SAVE,
id, status);
334 action = interpretActionValue(status);
344 template <
typename reg_type>
348 int res = read<typename reg_type::TYPE_BUTTON_STATUS>(reg_type::ADDR_STATE_BUTTON_FREEDRIVE,
id, status);
349 action = interpretActionValue(status);
359 template <
typename reg_type>
361 std::vector<common::model::EActionType> &action_list)
363 std::vector<std::array<typename reg_type::TYPE_BUTTON_STATUS, 3>> data_array_list;
365 res = syncReadConsecutiveBytes<typename reg_type::TYPE_BUTTON_STATUS, 3>(reg_type::ADDR_STATE_BUTTON_FREEDRIVE, {
id}, data_array_list);
366 if (res == COMM_SUCCESS && data_array_list.size() == 1)
368 for (
auto data : data_array_list.at(0))
370 action_list.push_back(interpretActionValue(data));
383 template <
typename reg_type>
386 return read<typename reg_type::TYPE_ACCELERO_VALUE_X>(reg_type::ADDR_ACCELERO_VALUE_X,
id, x_value);
395 template <
typename reg_type>
398 return read<typename reg_type::TYPE_ACCELERO_VALUE_Y>(reg_type::ADDR_ACCELERO_VALUE_Y,
id, y_value);
407 template <
typename reg_type>
410 return read<typename reg_type::TYPE_ACCELERO_VALUE_Z>(reg_type::ADDR_ACCELERO_VALUE_Z,
id, z_value);
419 template <
typename reg_type>
424 int res = read<typename reg_type::TYPE_COLLISION_STATUS>(reg_type::ADDR_COLLISION_STATUS,
id, value);
425 if (COMM_SUCCESS == res)
427 status = (value > 0) ?
true :
false;
438 template <
typename reg_type>
442 int res = read<typename reg_type::TYPE_DIGITAL_IN>(reg_type::ADDR_DIGITAL_INPUT,
id, value);
443 in = (value > 0) ?
true :
false;
453 template <
typename reg_type>
456 return COMM_TX_ERROR;
465 template <
typename reg_type>
468 return write<typename reg_type::TYPE_DIGITAL_OUT>(reg_type::ADDR_DIGITAL_OUTPUT,
id,
static_cast<uint8_t
>(out));
477 template <
typename reg_type>
480 return write<typename reg_type::TYPE_COLLISION_THRESHOLD_ALGO_1>(reg_type::ADDR_COLLISION_DETECT_THRESH_ALGO_1,
id,
static_cast<uint32_t
>(thresh));
489 template <
typename reg_type>
492 return read<typename reg_type::TYPE_COLLISION_THRESHOLD_ALGO_1>(reg_type::ADDR_COLLISION_DETECT_THRESH_ALGO_1,
id, thresh);
501 template <
typename reg_type>
504 return write<typename reg_type::TYPE_COLLISION_THRESHOLD_ALGO_2>(reg_type::ADDR_COLLISION_DETECT_THRESH_ALGO_2,
id,
static_cast<uint32_t
>(thresh));
513 template <
typename reg_type>
516 return read<typename reg_type::TYPE_COLLISION_THRESHOLD_ALGO_2>(reg_type::ADDR_COLLISION_DETECT_THRESH_ALGO_2,
id, thresh);
521 #endif // Ned3ProEndEffectorDriver