HardFOC Core
API reference
Loading...
Searching...
No Matches
DynamixelHandler.h
Go to the documentation of this file.
1
18#ifndef COMPONENT_HANDLER_DYNAMIXEL_HANDLER_H_
19#define COMPONENT_HANDLER_DYNAMIXEL_HANDLER_H_
20
21#include <atomic>
22#include <cstddef>
23#include <cstdint>
24
25#include "RtosMutex.h"
26#include "base/BaseUart.h"
27
28#include "dynamixel.hpp"
29
30//==============================================================================
31// CRTP UART ADAPTER FOR BaseUart
32//==============================================================================
33
40class HalUartDynamixelComm : public dynamixel::Transport<HalUartDynamixelComm> {
41public:
42 explicit HalUartDynamixelComm(BaseUart& uart) noexcept : uart_(uart) {}
43
44 dynamixel::DriverError open(const dynamixel::TransportConfig&) noexcept;
45 void close() noexcept;
46 dynamixel::DriverError set_baud_rate(std::uint32_t baud) noexcept;
47 dynamixel::TransportIo write_some(const std::uint8_t* data, std::size_t length) noexcept;
48 dynamixel::DriverError finish_transmit() noexcept;
49 dynamixel::TransportIo read_some(std::uint8_t* out, std::size_t max) noexcept;
50 void discard_stale_input() noexcept;
51 std::uint64_t now_us() noexcept;
52 void delay_ms_impl(std::uint32_t ms) noexcept;
53
54private:
55 BaseUart& uart_;
56};
57
58//==============================================================================
59// HANDLER CONFIGURATION
60//==============================================================================
61
63 std::uint8_t servo_id{1};
64 dynamixel::TransportConfig transport{};
65 bool bind_xseries_fallback{true};
66 std::uint8_t device_index{0};
67};
68
69//==============================================================================
70// HANDLER
71//==============================================================================
72
81public:
82 explicit DynamixelHandler(BaseUart& uart,
84 RtosMutex* bus_mutex = nullptr) noexcept;
85
90
91 bool EnsureInitialized() noexcept;
92
93 [[nodiscard]] bool IsPresent() const noexcept {
94 return initialized_.load(std::memory_order_acquire);
95 }
96
97 [[nodiscard]] const dynamixel::PingInfo& Identity() const noexcept {
98 return identity_;
99 }
100
101 [[nodiscard]] const dynamixel::ModelDescriptor* Model() const noexcept {
102 return device_.model();
103 }
104
105 void BindModel(const dynamixel::ModelDescriptor& desc) noexcept;
106 void BindXSeriesFallback() noexcept;
107
108 dynamixel::DriverResult<dynamixel::PingInfo> Ping() noexcept;
110 dynamixel::DriverResult<uint8_t> Scan(uint8_t* out_ids, uint8_t max_ids,
111 uint8_t first_id = dynamixel::kMinDeviceId,
112 uint8_t last_id = dynamixel::kMaxDeviceId) noexcept;
113
115 dynamixel::DriverResult<void> Reboot() noexcept;
116
117 dynamixel::DriverResult<void> SetTorqueEnabled(bool enabled) noexcept;
118 dynamixel::DriverResult<void> SetOperatingMode(dynamixel::OperatingMode mode) noexcept;
119 dynamixel::DriverResult<void> SetMotionProfile(uint32_t profile_acceleration,
120 uint32_t profile_velocity) noexcept;
121 dynamixel::DriverResult<void> SetGoalPosition(int32_t ticks) noexcept;
122 dynamixel::DriverResult<void> SetGoalVelocity(int32_t ticks_per_sec) noexcept;
123
124 dynamixel::DriverResult<int32_t> ReadPosition() noexcept;
125 dynamixel::DriverResult<dynamixel::Telemetry> ReadTelemetry() noexcept;
126
127 dynamixel::Bus& bus() noexcept { return bus_; }
128 dynamixel::Device& device() noexcept { return device_; }
129
130 template <typename Fn>
131 auto visitDevice(Fn&& fn) noexcept {
132 MutexLockGuard lock(*bus_mutex_);
133 return fn(device_);
134 }
135
136private:
137 bool EnsureInitializedLocked() noexcept;
138
141 dynamixel::Bus bus_;
142 dynamixel::Device device_;
143 dynamixel::PingInfo identity_{};
144 std::atomic<bool> initialized_{false};
145 RtosMutex private_mutex_;
146 RtosMutex* bus_mutex_;
147};
148
149#endif // COMPONENT_HANDLER_DYNAMIXEL_HANDLER_H_
HAL handler wrapping one Dynamixel servo on a BaseUart.
Definition DynamixelHandler.h:80
dynamixel::Device & device() noexcept
Definition DynamixelHandler.h:128
RtosMutex * bus_mutex_
Definition DynamixelHandler.h:146
auto visitDevice(Fn &&fn) noexcept
Definition DynamixelHandler.h:131
const dynamixel::PingInfo & Identity() const noexcept
Definition DynamixelHandler.h:97
DynamixelHandler(DynamixelHandler &&)=delete
DynamixelHandler & operator=(DynamixelHandler &&)=delete
DynamixelHandler(const DynamixelHandler &)=delete
RtosMutex private_mutex_
Definition DynamixelHandler.h:145
const dynamixel::ModelDescriptor * Model() const noexcept
Definition DynamixelHandler.h:101
DynamixelHandler & operator=(const DynamixelHandler &)=delete
CRTP adapter that turns a BaseUart& into dynamixel::Transport.
Definition DynamixelHandler.h:40
dynamixel::TransportIo write_some(const std::uint8_t *data, std::size_t length) noexcept
Definition DynamixelHandler.cpp:28
BaseUart & uart_
Definition DynamixelHandler.h:55
void delay_ms_impl(std::uint32_t ms) noexcept
Definition DynamixelHandler.cpp:70
void close() noexcept
Definition DynamixelHandler.cpp:21
dynamixel::DriverError finish_transmit() noexcept
Definition DynamixelHandler.cpp:40
dynamixel::DriverError open(const dynamixel::TransportConfig &) noexcept
Definition DynamixelHandler.cpp:16
HalUartDynamixelComm(BaseUart &uart) noexcept
Definition DynamixelHandler.h:42
dynamixel::TransportIo read_some(std::uint8_t *out, std::size_t max) noexcept
Definition DynamixelHandler.cpp:46
void discard_stale_input() noexcept
Definition DynamixelHandler.cpp:62
std::uint64_t now_us() noexcept
Definition DynamixelHandler.cpp:66
dynamixel::DriverError set_baud_rate(std::uint32_t baud) noexcept
Definition DynamixelHandler.cpp:23
Definition DynamixelHandler.h:62