HF-Core Platform 0.1.0-dev
Hardware-Agnostic Handler Layer & RTOS Utilities for HardFOC
Loading...
Searching...
No Matches
Tmc5160Handler.h
Go to the documentation of this file.
1
84#ifndef COMPONENT_HANDLER_TMC5160_HANDLER_H_
85#define COMPONENT_HANDLER_TMC5160_HANDLER_H_
86
87#include <cstdint>
88#include <memory>
89#include <type_traits>
90#include <cstdarg>
91#include <variant>
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"
99#include "RtosMutex.h"
100
106
117 BaseGpio& enable;
118 BaseGpio* diag0{nullptr};
119 BaseGpio* diag1{nullptr};
120
125 BaseGpio* get(tmc51x0::TMC51x0CtrlPin pin) noexcept {
126 switch (pin) {
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;
131 }
132 }
133};
134
144class HalSpiTmc5160Comm : public tmc51x0::SpiCommInterface<HalSpiTmc5160Comm> {
145public:
154 HalSpiTmc5160Comm(BaseSpi& spi, BaseGpio& enable,
155 BaseGpio* diag0 = nullptr, BaseGpio* diag1 = nullptr,
156 const tmc51x0::PinActiveLevels& active_levels = {}) noexcept;
157
160
162 tmc51x0::Result<void> SpiTransfer(const uint8_t* tx, uint8_t* rx, size_t length) noexcept;
163
165 tmc51x0::Result<void> GpioSet(tmc51x0::TMC51x0CtrlPin pin, tmc51x0::GpioSignal signal) noexcept;
166
168 tmc51x0::Result<tmc51x0::GpioSignal> GpioRead(tmc51x0::TMC51x0CtrlPin pin) noexcept;
169
171 void DebugLog(int level, const char* tag, const char* format, va_list args) noexcept;
172
174 void DelayMs(uint32_t ms) noexcept;
175
177 void DelayUs(uint32_t us) noexcept;
178
180 [[nodiscard]] tmc51x0::CommMode GetMode() const noexcept { return tmc51x0::CommMode::SPI; }
181
183
184private:
185 BaseSpi& spi_;
187 tmc51x0::PinActiveLevels active_levels_;
188};
189
198class HalUartTmc5160Comm : public tmc51x0::UartCommInterface<HalUartTmc5160Comm> {
199public:
208 HalUartTmc5160Comm(BaseUart& uart, BaseGpio& enable,
209 BaseGpio* diag0 = nullptr, BaseGpio* diag1 = nullptr,
210 const tmc51x0::PinActiveLevels& active_levels = {}) noexcept;
211
214
216 tmc51x0::Result<void> UartSend(const uint8_t* data, size_t length) noexcept;
217
219 tmc51x0::Result<void> UartReceive(uint8_t* data, size_t length) noexcept;
220
222 tmc51x0::Result<void> GpioSet(tmc51x0::TMC51x0CtrlPin pin, tmc51x0::GpioSignal signal) noexcept;
223
225 tmc51x0::Result<tmc51x0::GpioSignal> GpioRead(tmc51x0::TMC51x0CtrlPin pin) noexcept;
226
228 void DebugLog(int level, const char* tag, const char* format, va_list args) noexcept;
229
231 void DelayMs(uint32_t ms) noexcept;
232
234 void DelayUs(uint32_t us) noexcept;
235
237 [[nodiscard]] tmc51x0::CommMode GetMode() const noexcept { return tmc51x0::CommMode::UART; }
238
240
241private:
242 BaseUart& uart_;
244 tmc51x0::PinActiveLevels active_levels_;
245};
246
248
254
265public:
267 using SpiDriver = tmc51x0::TMC51x0<HalSpiTmc5160Comm>;
269 using UartDriver = tmc51x0::TMC51x0<HalUartTmc5160Comm>;
270
272 using DriverVariant = std::variant<std::monostate, SpiDriver*, UartDriver*>;
274 using ConstDriverVariant = std::variant<std::monostate, const SpiDriver*, const UartDriver*>;
275
276 //=========================================================================
277 // Construction
278 //=========================================================================
279
289 Tmc5160Handler(BaseSpi& spi, BaseGpio& enable,
290 BaseGpio* diag0 = nullptr, BaseGpio* diag1 = nullptr,
291 uint8_t daisy_chain_position = 0,
292 const tmc51x0::PinActiveLevels& active_levels = {}) noexcept;
293
303 Tmc5160Handler(BaseUart& uart, BaseGpio& enable,
304 BaseGpio* diag0 = nullptr, BaseGpio* diag1 = nullptr,
305 uint8_t uart_node_address = 0,
306 const tmc51x0::PinActiveLevels& active_levels = {}) noexcept;
307
309 ~Tmc5160Handler() noexcept;
310
311 // Non-copyable, non-movable
313 Tmc5160Handler& operator=(const Tmc5160Handler&) = delete;
315 Tmc5160Handler& operator=(Tmc5160Handler&&) = delete;
316
317 //=========================================================================
318 // Initialization
319 //=========================================================================
320
327 tmc51x0::ErrorCode Initialize(const tmc51x0::DriverConfig& config, bool verbose = true) noexcept;
328
333 bool EnsureInitialized() noexcept;
334
339 bool Deinitialize() noexcept;
340
344 [[nodiscard]] bool IsInitialized() const noexcept { return initialized_; }
345
349 [[nodiscard]] bool IsSpi() const noexcept { return is_spi_; }
350
351 //=========================================================================
352 // Direct Driver Access (typed pointers + visitDriver pattern)
353 //=========================================================================
354
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_);
381 if (!EnsureInitialized()) {
382 if constexpr (std::is_void_v<ReturnType>) {
383 return;
384 } else {
385 return ReturnType{};
386 }
387 }
388 if (is_spi_ && spi_driver_) {
389 return fn(*spi_driver_);
390 } else if (!is_spi_ && uart_driver_) {
391 return fn(*uart_driver_);
392 }
393 if constexpr (std::is_void_v<ReturnType>) {
394 return;
395 } else {
396 return ReturnType{};
397 }
398 }
399
406 [[nodiscard]] SpiDriver* driverViaSpi() noexcept;
407 [[nodiscard]] const SpiDriver* driverViaSpi() const noexcept;
408
413 [[nodiscard]] UartDriver* driverViaUart() noexcept;
414 [[nodiscard]] const UartDriver* driverViaUart() const noexcept;
415
420 [[nodiscard]] DriverVariant GetDriver() noexcept {
421 if (auto* spi = driverViaSpi()) {
422 return spi;
423 }
424 if (auto* uart = driverViaUart()) {
425 return uart;
426 }
427 return std::monostate{};
428 }
429
431 [[nodiscard]] ConstDriverVariant GetDriver() const noexcept {
432 if (auto* spi = driverViaSpi()) {
433 return spi;
434 }
435 if (auto* uart = driverViaUart()) {
436 return uart;
437 }
438 return std::monostate{};
439 }
440
441 //=========================================================================
442 // Diagnostics
443 //=========================================================================
444
448 void DumpDiagnostics() noexcept;
449
450 //=========================================================================
451 // Utility
452 //=========================================================================
453
458 const char* GetDescription() const noexcept;
459
464 static tmc51x0::DriverConfig GetDefaultConfig() noexcept { return tmc51x0::DriverConfig{}; }
465
466 //=========================================================================
467 // Configuration Snapshot
468 //=========================================================================
469
473 [[nodiscard]] const tmc51x0::DriverConfig& GetDriverConfig() const noexcept { return config_; }
474
475private:
476 bool EnsureInitializedLocked() noexcept;
477
479 bool is_spi_{true};
480
482 bool initialized_{false};
483
485 mutable RtosMutex mutex_;
486
488 std::unique_ptr<HalSpiTmc5160Comm> spi_comm_;
489
491 std::unique_ptr<HalUartTmc5160Comm> uart_comm_;
492
494 std::unique_ptr<SpiDriver> spi_driver_;
495
497 std::unique_ptr<UartDriver> uart_driver_;
498
500 uint8_t address_{0};
501
503 tmc51x0::DriverConfig config_{};
504
506 char description_[64]{};
507
509 template <typename Fn>
510 auto visitDriverInternal(Fn&& fn) noexcept -> decltype(fn(std::declval<SpiDriver&>())) {
511 using ReturnType = decltype(fn(std::declval<SpiDriver&>()));
512 if (is_spi_ && spi_driver_) {
513 return fn(*spi_driver_);
514 } else if (!is_spi_ && uart_driver_) {
515 return fn(*uart_driver_);
516 }
517 if constexpr (std::is_void_v<ReturnType>) {
518 return;
519 } else {
520 return ReturnType{};
521 }
522 }
523};
524
526
527#endif // COMPONENT_HANDLER_TMC5160_HANDLER_H_
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