84#ifndef COMPONENT_HANDLER_TMC5160_HANDLER_H_
85#define COMPONENT_HANDLER_TMC5160_HANDLER_H_
92#include "core/hf-core-drivers/external/hf-tmc5160-driver/inc/tmc51x0.hpp"
93#include "core/hf-core-drivers/external/hf-tmc5160-driver/inc/tmc51x0_comm_interface.hpp"
94#include "core/hf-core-drivers/external/hf-tmc5160-driver/inc/tmc51x0_types.hpp"
95#include "core/hf-core-drivers/external/hf-tmc5160-driver/inc/tmc51x0_result.hpp"
96#include "base/BaseSpi.h"
97#include "base/BaseUart.h"
98#include "base/BaseGpio.h"
125 BaseGpio*
get(tmc51x0::TMC51x0CtrlPin pin)
noexcept {
127 case tmc51x0::TMC51x0CtrlPin::EN:
return &
enable;
128 case tmc51x0::TMC51x0CtrlPin::DIAG0:
return diag0;
129 case tmc51x0::TMC51x0CtrlPin::DIAG1:
return diag1;
130 default:
return nullptr;
155 BaseGpio* diag0 =
nullptr, BaseGpio* diag1 =
nullptr,
156 const tmc51x0::PinActiveLevels& active_levels = {})
noexcept;
162 tmc51x0::Result<void>
SpiTransfer(
const uint8_t* tx, uint8_t* rx,
size_t length)
noexcept;
165 tmc51x0::Result<void>
GpioSet(tmc51x0::TMC51x0CtrlPin pin, tmc51x0::GpioSignal signal)
noexcept;
168 tmc51x0::Result<tmc51x0::GpioSignal>
GpioRead(tmc51x0::TMC51x0CtrlPin pin)
noexcept;
171 void DebugLog(
int level,
const char* tag,
const char* format, va_list args)
noexcept;
174 void DelayMs(uint32_t ms)
noexcept;
177 void DelayUs(uint32_t us)
noexcept;
180 [[nodiscard]] tmc51x0::CommMode
GetMode() const noexcept {
return tmc51x0::CommMode::SPI; }
209 BaseGpio* diag0 =
nullptr, BaseGpio* diag1 =
nullptr,
210 const tmc51x0::PinActiveLevels& active_levels = {})
noexcept;
216 tmc51x0::Result<void>
UartSend(
const uint8_t* data,
size_t length)
noexcept;
219 tmc51x0::Result<void>
UartReceive(uint8_t* data,
size_t length)
noexcept;
222 tmc51x0::Result<void>
GpioSet(tmc51x0::TMC51x0CtrlPin pin, tmc51x0::GpioSignal signal)
noexcept;
225 tmc51x0::Result<tmc51x0::GpioSignal>
GpioRead(tmc51x0::TMC51x0CtrlPin pin)
noexcept;
228 void DebugLog(
int level,
const char* tag,
const char* format, va_list args)
noexcept;
231 void DelayMs(uint32_t ms)
noexcept;
234 void DelayUs(uint32_t us)
noexcept;
237 [[nodiscard]] tmc51x0::CommMode
GetMode() const noexcept {
return tmc51x0::CommMode::UART; }
272 using DriverVariant = std::variant<std::monostate, SpiDriver*, UartDriver*>;
290 BaseGpio* diag0 =
nullptr, BaseGpio* diag1 =
nullptr,
291 uint8_t daisy_chain_position = 0,
292 const tmc51x0::PinActiveLevels& active_levels = {})
noexcept;
304 BaseGpio* diag0 =
nullptr, BaseGpio* diag1 =
nullptr,
305 uint8_t uart_node_address = 0,
306 const tmc51x0::PinActiveLevels& active_levels = {})
noexcept;
327 tmc51x0::ErrorCode
Initialize(const tmc51x0::DriverConfig& config,
bool verbose = true) noexcept;
377 template <
typename Fn>
378 auto visitDriver(Fn&& fn)
noexcept ->
decltype(fn(std::declval<SpiDriver&>())) {
379 using ReturnType =
decltype(fn(std::declval<SpiDriver&>()));
380 MutexLockGuard lock(
mutex_);
382 if constexpr (std::is_void_v<ReturnType>) {
393 if constexpr (std::is_void_v<ReturnType>) {
427 return std::monostate{};
438 return std::monostate{};
464 static tmc51x0::DriverConfig
GetDefaultConfig() noexcept {
return tmc51x0::DriverConfig{}; }
509 template <
typename Fn>
511 using ReturnType =
decltype(fn(std::declval<SpiDriver&>()));
517 if constexpr (std::is_void_v<ReturnType>) {
Concrete SPI communication adapter for TMC5160 using BaseSpi and BaseGpio.
Definition Tmc5160Handler.h:144
tmc51x0::Result< tmc51x0::GpioSignal > GpioRead(tmc51x0::TMC51x0CtrlPin pin) noexcept
Read a TMC5160 control pin's current logical signal state.
Definition Tmc5160Handler.cpp:55
BaseSpi & spi_
Definition Tmc5160Handler.h:185
HalSpiTmc5160Comm(BaseSpi &spi, BaseGpio &enable, BaseGpio *diag0=nullptr, BaseGpio *diag1=nullptr, const tmc51x0::PinActiveLevels &active_levels={}) noexcept
Construct the SPI communication adapter.
Definition Tmc5160Handler.cpp:17
void DelayUs(uint32_t us) noexcept
Delay in microseconds.
Definition Tmc5160Handler.cpp:82
void DelayMs(uint32_t ms) noexcept
Delay in milliseconds.
Definition Tmc5160Handler.cpp:78
void DebugLog(int level, const char *tag, const char *format, va_list args) noexcept
Debug logging — routes to HardFOC Logger.
Definition Tmc5160Handler.cpp:73
Tmc5160CtrlPins ctrl_pins_
Definition Tmc5160Handler.h:186
tmc51x0::PinActiveLevels active_levels_
Definition Tmc5160Handler.h:187
tmc51x0::Result< void > SpiTransfer(const uint8_t *tx, uint8_t *rx, size_t length) noexcept
Low-level SPI transfer (5 bytes per TMC5160 datagram).
Definition Tmc5160Handler.cpp:25
tmc51x0::Result< void > GpioSet(tmc51x0::TMC51x0CtrlPin pin, tmc51x0::GpioSignal signal) noexcept
Set a TMC5160 control pin to a given logical signal state.
Definition Tmc5160Handler.cpp:37
tmc51x0::CommMode GetMode() const noexcept
Get communication mode (always SPI).
Definition Tmc5160Handler.h:180
Concrete UART communication adapter for TMC5160 using BaseUart and BaseGpio.
Definition Tmc5160Handler.h:198
BaseUart & uart_
Definition Tmc5160Handler.h:242
void DelayMs(uint32_t ms) noexcept
Delay in milliseconds.
Definition Tmc5160Handler.cpp:163
tmc51x0::Result< void > GpioSet(tmc51x0::TMC51x0CtrlPin pin, tmc51x0::GpioSignal signal) noexcept
Set a TMC5160 control pin.
Definition Tmc5160Handler.cpp:122
tmc51x0::Result< tmc51x0::GpioSignal > GpioRead(tmc51x0::TMC51x0CtrlPin pin) noexcept
Read a TMC5160 control pin.
Definition Tmc5160Handler.cpp:140
HalUartTmc5160Comm(BaseUart &uart, BaseGpio &enable, BaseGpio *diag0=nullptr, BaseGpio *diag1=nullptr, const tmc51x0::PinActiveLevels &active_levels={}) noexcept
Construct the UART communication adapter.
Definition Tmc5160Handler.cpp:90
void DebugLog(int level, const char *tag, const char *format, va_list args) noexcept
Debug logging.
Definition Tmc5160Handler.cpp:158
tmc51x0::CommMode GetMode() const noexcept
Get communication mode (always UART).
Definition Tmc5160Handler.h:237
tmc51x0::Result< void > UartReceive(uint8_t *data, size_t length) noexcept
Receive data over UART.
Definition Tmc5160Handler.cpp:110
void DelayUs(uint32_t us) noexcept
Delay in microseconds.
Definition Tmc5160Handler.cpp:167
tmc51x0::PinActiveLevels active_levels_
Definition Tmc5160Handler.h:244
Tmc5160CtrlPins ctrl_pins_
Definition Tmc5160Handler.h:243
tmc51x0::Result< void > UartSend(const uint8_t *data, size_t length) noexcept
Send data over UART.
Definition Tmc5160Handler.cpp:98
Unified handler for TMC5160/TMC5130 stepper motor driver.
Definition Tmc5160Handler.h:264
SpiDriver * driverViaSpi() noexcept
Get typed SPI driver pointer (null if UART mode or not initialized).
Definition Tmc5160Handler.cpp:281
bool Deinitialize() noexcept
Deinitialize — disable motor and release resources.
Definition Tmc5160Handler.cpp:263
const char * GetDescription() const noexcept
Get a human-readable description of the handler.
Definition Tmc5160Handler.cpp:326
tmc51x0::TMC51x0< HalUartTmc5160Comm > UartDriver
UART driver type alias.
Definition Tmc5160Handler.h:269
Tmc5160Handler(BaseSpi &spi, BaseGpio &enable, BaseGpio *diag0=nullptr, BaseGpio *diag1=nullptr, uint8_t daisy_chain_position=0, const tmc51x0::PinActiveLevels &active_levels={}) noexcept
Construct a TMC5160 handler with SPI communication.
Definition Tmc5160Handler.cpp:175
auto visitDriverInternal(Fn &&fn) noexcept -> decltype(fn(std::declval< SpiDriver & >()))
Helper: execute a visitor on the active driver (no lock, internal use)
Definition Tmc5160Handler.h:510
uint8_t address_
Daisy chain position (SPI) or node address (UART)
Definition Tmc5160Handler.h:500
tmc51x0::ErrorCode Initialize(const tmc51x0::DriverConfig &config, bool verbose=true) noexcept
Initialize the TMC5160 driver with full configuration.
Definition Tmc5160Handler.cpp:207
std::variant< std::monostate, SpiDriver *, UartDriver * > DriverVariant
Non-owning variant holding either driver type or empty (monostate).
Definition Tmc5160Handler.h:272
const tmc51x0::DriverConfig & GetDriverConfig() const noexcept
Get the driver configuration used during initialization.
Definition Tmc5160Handler.h:473
bool EnsureInitialized() noexcept
Ensure driver is initialized (lazy init entrypoint).
Definition Tmc5160Handler.cpp:251
bool EnsureInitializedLocked() noexcept
Definition Tmc5160Handler.cpp:256
bool IsSpi() const noexcept
Check if SPI is being used.
Definition Tmc5160Handler.h:349
ConstDriverVariant GetDriver() const noexcept
Const overload of GetDriver().
Definition Tmc5160Handler.h:431
DriverVariant GetDriver() noexcept
Get the active driver pointer without requiring visitor usage.
Definition Tmc5160Handler.h:420
bool is_spi_
Communication mode flag.
Definition Tmc5160Handler.h:479
tmc51x0::TMC51x0< HalSpiTmc5160Comm > SpiDriver
SPI driver type alias.
Definition Tmc5160Handler.h:267
bool initialized_
Initialization state.
Definition Tmc5160Handler.h:482
std::unique_ptr< HalSpiTmc5160Comm > spi_comm_
SPI communication adapter (owned, null if UART)
Definition Tmc5160Handler.h:488
std::unique_ptr< SpiDriver > spi_driver_
SPI driver instance (owned, null if UART)
Definition Tmc5160Handler.h:494
void DumpDiagnostics() noexcept
Dump diagnostic information to logger.
Definition Tmc5160Handler.cpp:308
bool IsInitialized() const noexcept
Check if the handler is initialized.
Definition Tmc5160Handler.h:344
char description_[64]
Human-readable handler description.
Definition Tmc5160Handler.h:506
tmc51x0::DriverConfig config_
Configuration snapshot.
Definition Tmc5160Handler.h:503
auto visitDriver(Fn &&fn) noexcept -> decltype(fn(std::declval< SpiDriver & >()))
Visit the typed driver with a callable.
Definition Tmc5160Handler.h:378
RtosMutex mutex_
Thread safety mutex.
Definition Tmc5160Handler.h:485
std::variant< std::monostate, const SpiDriver *, const UartDriver * > ConstDriverVariant
Const version of DriverVariant.
Definition Tmc5160Handler.h:274
std::unique_ptr< HalUartTmc5160Comm > uart_comm_
UART communication adapter (owned, null if SPI)
Definition Tmc5160Handler.h:491
~Tmc5160Handler() noexcept
Destructor.
Definition Tmc5160Handler.cpp:201
static tmc51x0::DriverConfig GetDefaultConfig() noexcept
Get a sensible default DriverConfig.
Definition Tmc5160Handler.h:464
std::unique_ptr< UartDriver > uart_driver_
UART driver instance (owned, null if SPI)
Definition Tmc5160Handler.h:497
UartDriver * driverViaUart() noexcept
Get typed UART driver pointer (null if SPI mode or not initialized).
Definition Tmc5160Handler.cpp:294
Shared helper holding TMC5160 host-side control pin references.
Definition Tmc5160Handler.h:116
BaseGpio & enable
DRV_ENN enable pin (active LOW disables driver)
Definition Tmc5160Handler.h:117
BaseGpio * diag0
Optional DIAG0 diagnostic pin.
Definition Tmc5160Handler.h:118
BaseGpio * diag1
Optional DIAG1 diagnostic pin.
Definition Tmc5160Handler.h:119
BaseGpio * get(tmc51x0::TMC51x0CtrlPin pin) noexcept
Resolve a TMC51x0CtrlPin enum to the corresponding BaseGpio pointer.
Definition Tmc5160Handler.h:125