27#ifndef COMPONENT_HANDLER_MAX22200_HANDLER_H_
28#define COMPONENT_HANDLER_MAX22200_HANDLER_H_
34#include "core/hf-core-drivers/external/hf-max22200-driver/inc/max22200.hpp"
35#include "core/hf-core-drivers/external/hf-max22200-driver/inc/max22200_spi_interface.hpp"
36#include "core/hf-core-drivers/external/hf-max22200-driver/inc/max22200_types.hpp"
37#include "base/BaseSpi.h"
38#include "base/BaseGpio.h"
65 BaseGpio* fault =
nullptr)
noexcept;
80 bool Transfer(
const uint8_t* tx_data, uint8_t* rx_data,
size_t length)
noexcept;
92 bool Configure(uint32_t speed_hz, uint8_t mode,
bool msb_first =
true)
noexcept;
95 [[nodiscard]]
bool IsReady()
const noexcept;
98 void DelayUs(uint32_t us)
noexcept;
104 void GpioSet(max22200::CtrlPin pin, max22200::GpioSignal signal)
noexcept;
111 bool GpioRead(max22200::CtrlPin pin, max22200::GpioSignal& signal)
noexcept;
170 BaseGpio* fault =
nullptr) noexcept;
212 max22200::DriverStatus
Initialize(const max22200::BoardConfig& board_config) noexcept;
243 max22200::DriverStatus
ConfigureChannel(uint8_t channel, const max22200::ChannelConfig& config) noexcept;
259 max22200::DriverStatus
SetupCdrChannel(uint8_t channel, uint16_t hit_ma,
260 uint16_t hold_ma,
float hit_time_ms) noexcept;
273 max22200::DriverStatus
SetupVdrChannel(uint8_t channel,
float hit_duty_pct,
274 float hold_duty_pct,
float hit_time_ms) noexcept;
285 max22200::DriverStatus
EnableChannel(uint8_t channel) noexcept;
323 max22200::DriverStatus
GetStatus(max22200::StatusConfig& status) noexcept;
334 max22200::DriverStatus
GetChannelFaults(uint8_t channel, max22200::FaultStatus& faults) noexcept;
340 [[nodiscard]]
bool HasFault() noexcept;
356 max22200::DriverStatus
ReadFaultRegister(max22200::FaultStatus& faults) noexcept;
376 template <typename Fn>
378 using R = std::invoke_result_t<Fn, DriverType&>;
379 if constexpr (std::is_void_v<R>) {
380 MutexLockGuard lock(
mutex_);
445 template <typename Fn>
447 using R = std::invoke_result_t<Fn, DriverType&>;
448 static_assert(!std::is_void_v<R>,
"withDriver requires non-void return");
449 MutexLockGuard lock(
mutex_);
451 if constexpr (std::is_same_v<R, max22200::DriverStatus>)
452 return max22200::DriverStatus::INITIALIZATION_ERROR;
461 std::unique_ptr<HalSpiMax22200Comm>
comm_;
CRTP SPI communication adapter for MAX22200 using BaseSpi and BaseGpio.
Definition Max22200Handler.h:55
bool initialized_
Definition Max22200Handler.h:120
BaseGpio * fault_
Definition Max22200Handler.h:119
void DelayUs(uint32_t us) noexcept
Blocking microsecond delay (handler_utils::DelayUs).
Definition Max22200Handler.cpp:151
BaseGpio & enable_
Definition Max22200Handler.h:117
BaseGpio & cmd_
Definition Max22200Handler.h:118
bool SetChipSelect(bool state) noexcept
Soft-CS no-op — chip select is owned by StmSpiDevice.
Definition Max22200Handler.cpp:132
bool IsReady() const noexcept
True when comm adapter and all bound GPIO/SPI objects are ready.
Definition Max22200Handler.cpp:143
bool GpioRead(max22200::CtrlPin pin, max22200::GpioSignal &signal) noexcept
Read ENABLE, CMD, or nFAULT level.
Definition Max22200Handler.cpp:191
bool Configure(uint32_t speed_hz, uint8_t mode, bool msb_first=true) noexcept
SPI mode/speed no-op — BaseSpi is pre-configured (Mode 0).
Definition Max22200Handler.cpp:138
bool Transfer(const uint8_t *tx_data, uint8_t *rx_data, size_t length) noexcept
SPI exchange via aligned internal-SRAM staging buffers.
Definition Max22200Handler.cpp:96
BaseSpi & spi_
Definition Max22200Handler.h:116
bool Initialize() noexcept
Park ENABLE/CMD, optional nFAULT input, and 5 ms VM settle.
Definition Max22200Handler.cpp:39
void GpioSet(max22200::CtrlPin pin, max22200::GpioSignal signal) noexcept
Drive ENABLE, CMD, or nFAULT through BaseGpio.
Definition Max22200Handler.cpp:155
Unified handler for MAX22200 octal solenoid/motor driver.
Definition Max22200Handler.h:150
DriverType * GetDriver() noexcept
Get the underlying driver for advanced operations.
Definition Max22200Handler.cpp:556
bool IsChannelEnabled(uint8_t channel) noexcept
Check if a channel is enabled (reads STATUS channels_on_mask).
Definition Max22200Handler.cpp:506
RtosMutex mutex_
Definition Max22200Handler.h:460
auto WithDriver(Fn &&fn) noexcept
Run fn against the raw driver with mutex_ held.
Definition Max22200Handler.h:377
max22200::DriverStatus Initialize() noexcept
Initialize driver (ENABLE HIGH, read/clear STATUS, set ACTIVE).
Definition Max22200Handler.cpp:231
std::unique_ptr< HalSpiMax22200Comm > comm_
Definition Max22200Handler.h:461
max22200::DriverStatus DisableChannel(uint8_t channel) noexcept
Disable a channel.
Definition Max22200Handler.cpp:487
bool WaitForActiveAndDrainFaults() noexcept
Post-init wake poll: poke ACTIVE=1, wait for latch or SPI-live fallback.
Definition Max22200Handler.cpp:328
max22200::DriverStatus SetChannelsMask(uint8_t mask) noexcept
Set channels enabled by bitmask.
Definition Max22200Handler.cpp:515
max22200::DriverStatus GetStatus(max22200::StatusConfig &status) noexcept
Read the STATUS register.
Definition Max22200Handler.cpp:521
max22200::DriverStatus SetupVdrChannel(uint8_t channel, float hit_duty_pct, float hold_duty_pct, float hit_time_ms) noexcept
Quick VDR setup with duty cycle percentages.
Definition Max22200Handler.cpp:465
std::unique_ptr< DriverType > driver_
Definition Max22200Handler.h:462
bool initialized_
Definition Max22200Handler.h:459
max22200::DriverStatus ConfigureChannel(uint8_t channel, const max22200::ChannelConfig &config) noexcept
Configure a channel completely.
Definition Max22200Handler.cpp:419
max22200::DriverStatus EnableChannel(uint8_t channel) noexcept
Enable a channel (sets bit in STATUS channels_on_mask).
Definition Max22200Handler.cpp:480
bool EnsureInitialized() noexcept
Ensure driver is initialized (lazy init entrypoint).
Definition Max22200Handler.cpp:269
bool IsInitialized() const noexcept
Check if Initialize completed successfully.
Definition Max22200Handler.h:221
static constexpr uint8_t kNumChannels
Number of MAX22200 output channels (0..7).
Definition Max22200Handler.h:156
max22200::DriverStatus Deinitialize() noexcept
Deinitialize — disable all channels, ACTIVE=0, ENABLE LOW.
Definition Max22200Handler.cpp:406
max22200::DriverStatus ClearFaults() noexcept
Clear all latched fault flags (read-clear FAULT register).
Definition Max22200Handler.cpp:544
max22200::DriverStatus ReadFaultRegister(max22200::FaultStatus &faults) noexcept
Read the FAULT register (OCP/OLF/HHF/DPM channel bitmasks).
Definition Max22200Handler.cpp:550
max22200::MAX22200< HalSpiMax22200Comm > DriverType
Underlying max22200::MAX22200 driver type.
Definition Max22200Handler.h:153
max22200::DriverStatus DisableAllChannels() noexcept
Disable all channels.
Definition Max22200Handler.cpp:500
bool EnsureInitializedLocked() noexcept
Definition Max22200Handler.cpp:313
max22200::DriverStatus InitializeLocked() noexcept
Initialize while mutex_ is held (no board IFS).
Definition Max22200Handler.cpp:236
auto withDriver(Fn &&fn) noexcept
Execute a lambda with a locked, initialized driver.
Definition Max22200Handler.h:446
max22200::DriverStatus GetChannelFaults(uint8_t channel, max22200::FaultStatus &faults) noexcept
Read the device-wide FAULT register (channel param is range-checked only).
Definition Max22200Handler.cpp:527
bool HasFault() noexcept
Check if any fault flag is set (reads STATUS fault summary).
Definition Max22200Handler.cpp:536
uint8_t GetLastFaultByte() const noexcept
STATUS[7:0] captured on the last command-phase SPI byte.
Definition Max22200Handler.cpp:324
max22200::DriverStatus SetupCdrChannel(uint8_t channel, uint16_t hit_ma, uint16_t hold_ma, float hit_time_ms) noexcept
Quick CDR setup with milliamp values.
Definition Max22200Handler.cpp:451
uint8_t last_fault_byte_
Definition Max22200Handler.h:464
max22200::DriverStatus EnableAllChannels() noexcept
Enable all eight channels (writes full channels_on_mask).
Definition Max22200Handler.cpp:494
void DumpDiagnostics() noexcept
Log STATUS, FAULT register, and SPI transfer statistics.
Definition Max22200Handler.cpp:569