HF-Core Platform 0.1.0-dev
Hardware-Agnostic Handler Layer & RTOS Utilities for HardFOC
Loading...
Searching...
No Matches
Max22200Handler.h
Go to the documentation of this file.
1
22#ifndef COMPONENT_HANDLER_MAX22200_HANDLER_H_
23#define COMPONENT_HANDLER_MAX22200_HANDLER_H_
24
25#include <cstdint>
26#include <memory>
27#include <type_traits>
28#include "core/hf-core-drivers/external/hf-max22200-driver/inc/max22200.hpp"
29#include "core/hf-core-drivers/external/hf-max22200-driver/inc/max22200_spi_interface.hpp"
30#include "core/hf-core-drivers/external/hf-max22200-driver/inc/max22200_types.hpp"
31#include "base/BaseSpi.h"
32#include "base/BaseGpio.h"
33#include "RtosMutex.h"
34
39
47class HalSpiMax22200Comm : public max22200::SpiInterface<HalSpiMax22200Comm> {
48public:
56 HalSpiMax22200Comm(BaseSpi& spi, BaseGpio& enable, BaseGpio& cmd,
57 BaseGpio* fault = nullptr) noexcept;
58
61
62 bool Initialize() noexcept;
63 bool Transfer(const uint8_t* tx_data, uint8_t* rx_data, size_t length) noexcept;
64 bool SetChipSelect(bool state) noexcept;
65 bool Configure(uint32_t speed_hz, uint8_t mode, bool msb_first = true) noexcept;
66 [[nodiscard]] bool IsReady() const noexcept;
67 void DelayUs(uint32_t us) noexcept;
68 void GpioSet(max22200::CtrlPin pin, max22200::GpioSignal signal) noexcept;
69 bool GpioRead(max22200::CtrlPin pin, max22200::GpioSignal& signal) noexcept;
70
72
73private:
74 BaseSpi& spi_;
75 BaseGpio& enable_;
76 BaseGpio& cmd_;
77 BaseGpio* fault_;
78 bool initialized_{false};
79};
80
82
87
102public:
104 using DriverType = max22200::MAX22200<HalSpiMax22200Comm>;
105
106 static constexpr uint8_t kNumChannels = 8;
107
108 //=========================================================================
109 // Construction
110 //=========================================================================
111
119 Max22200Handler(BaseSpi& spi, BaseGpio& enable, BaseGpio& cmd,
120 BaseGpio* fault = nullptr) noexcept;
121
122 ~Max22200Handler() noexcept;
123
124 // Non-copyable
126 Max22200Handler& operator=(const Max22200Handler&) = delete;
127
128 // Non-movable
130 Max22200Handler& operator=(Max22200Handler&&) = delete;
131
132 //=========================================================================
133 // Initialization
134 //=========================================================================
135
140 max22200::DriverStatus Initialize() noexcept;
141
146 bool EnsureInitialized() noexcept;
147
153 max22200::DriverStatus Initialize(const max22200::BoardConfig& board_config) noexcept;
154
156 max22200::DriverStatus Deinitialize() noexcept;
157
159 [[nodiscard]] bool IsInitialized() const noexcept { return initialized_; }
160
161 //=========================================================================
162 // Channel Configuration
163 //=========================================================================
164
171 max22200::DriverStatus ConfigureChannel(uint8_t channel, const max22200::ChannelConfig& config) noexcept;
172
181 max22200::DriverStatus SetupCdrChannel(uint8_t channel, uint16_t hit_ma,
182 uint16_t hold_ma, float hit_time_ms) noexcept;
183
192 max22200::DriverStatus SetupVdrChannel(uint8_t channel, float hit_duty_pct,
193 float hold_duty_pct, float hit_time_ms) noexcept;
194
195 //=========================================================================
196 // Channel Control
197 //=========================================================================
198
200 max22200::DriverStatus EnableChannel(uint8_t channel) noexcept;
201
203 max22200::DriverStatus DisableChannel(uint8_t channel) noexcept;
204
206 max22200::DriverStatus EnableAllChannels() noexcept;
207
209 max22200::DriverStatus DisableAllChannels() noexcept;
210
212 bool IsChannelEnabled(uint8_t channel) noexcept;
213
218 max22200::DriverStatus SetChannelsMask(uint8_t mask) noexcept;
219
220 //=========================================================================
221 // Status & Faults
222 //=========================================================================
223
229 max22200::DriverStatus GetStatus(max22200::StatusConfig& status) noexcept;
230
237 max22200::DriverStatus GetChannelFaults(uint8_t channel, max22200::FaultStatus& faults) noexcept;
238
240 bool HasFault() noexcept;
241
243 max22200::DriverStatus ClearFaults() noexcept;
244
245 //=========================================================================
246 // Device Control
247 //=========================================================================
248
254 max22200::DriverStatus ReadFaultRegister(max22200::FaultStatus& faults) noexcept;
255
256 //=========================================================================
257 // Direct Driver Access
258 //=========================================================================
259
264 [[nodiscard]] DriverType* GetDriver() noexcept;
265 [[nodiscard]] const DriverType* GetDriver() const noexcept;
266
268 void DumpDiagnostics() noexcept;
269
270private:
271 bool EnsureInitializedLocked() noexcept;
272
279 template <typename Fn>
280 auto withDriver(Fn&& fn) noexcept {
281 using R = std::invoke_result_t<Fn, DriverType&>;
282 static_assert(!std::is_void_v<R>, "withDriver requires non-void return");
283 MutexLockGuard lock(mutex_);
284 if (!EnsureInitializedLocked() || !driver_) {
285 if constexpr (std::is_same_v<R, max22200::DriverStatus>)
286 return max22200::DriverStatus::INITIALIZATION_ERROR;
287 else
288 return R{};
289 }
290 return fn(*driver_);
291 }
292
293 bool initialized_{false};
294 mutable RtosMutex mutex_;
295 std::unique_ptr<HalSpiMax22200Comm> comm_;
296 std::unique_ptr<DriverType> driver_;
297};
298
300
301#endif // COMPONENT_HANDLER_MAX22200_HANDLER_H_
CRTP SPI communication adapter for MAX22200 using BaseSpi and BaseGpio.
Definition Max22200Handler.h:47
bool initialized_
Definition Max22200Handler.h:78
BaseGpio * fault_
Definition Max22200Handler.h:77
void DelayUs(uint32_t us) noexcept
Definition Max22200Handler.cpp:95
BaseGpio & enable_
Definition Max22200Handler.h:75
BaseGpio & cmd_
Definition Max22200Handler.h:76
bool SetChipSelect(bool state) noexcept
Definition Max22200Handler.cpp:77
bool IsReady() const noexcept
Definition Max22200Handler.cpp:87
bool GpioRead(max22200::CtrlPin pin, max22200::GpioSignal &signal) noexcept
Definition Max22200Handler.cpp:126
HalSpiMax22200Comm(BaseSpi &spi, BaseGpio &enable, BaseGpio &cmd, BaseGpio *fault=nullptr) noexcept
Construct the SPI adapter.
Definition Max22200Handler.cpp:17
bool Configure(uint32_t speed_hz, uint8_t mode, bool msb_first=true) noexcept
Definition Max22200Handler.cpp:82
bool Transfer(const uint8_t *tx_data, uint8_t *rx_data, size_t length) noexcept
Definition Max22200Handler.cpp:69
BaseSpi & spi_
Definition Max22200Handler.h:74
bool Initialize() noexcept
Definition Max22200Handler.cpp:22
void GpioSet(max22200::CtrlPin pin, max22200::GpioSignal signal) noexcept
Definition Max22200Handler.cpp:99
Unified handler for MAX22200 octal solenoid/motor driver.
Definition Max22200Handler.h:101
DriverType * GetDriver() noexcept
Get the underlying driver for advanced operations.
Definition Max22200Handler.cpp:358
bool IsChannelEnabled(uint8_t channel) noexcept
Check if a channel is enabled.
Definition Max22200Handler.cpp:308
RtosMutex mutex_
Definition Max22200Handler.h:294
max22200::DriverStatus Initialize() noexcept
Initialize driver (ENABLE HIGH, read/clear STATUS, set ACTIVE).
Definition Max22200Handler.cpp:166
std::unique_ptr< HalSpiMax22200Comm > comm_
Definition Max22200Handler.h:295
max22200::DriverStatus DisableChannel(uint8_t channel) noexcept
Disable a channel.
Definition Max22200Handler.cpp:289
max22200::DriverStatus SetChannelsMask(uint8_t mask) noexcept
Set channels enabled by bitmask.
Definition Max22200Handler.cpp:317
max22200::DriverStatus GetStatus(max22200::StatusConfig &status) noexcept
Read the STATUS register.
Definition Max22200Handler.cpp:323
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:270
std::unique_ptr< DriverType > driver_
Definition Max22200Handler.h:296
bool initialized_
Definition Max22200Handler.h:293
max22200::DriverStatus ConfigureChannel(uint8_t channel, const max22200::ChannelConfig &config) noexcept
Configure a channel completely.
Definition Max22200Handler.cpp:250
max22200::DriverStatus EnableChannel(uint8_t channel) noexcept
Enable a channel.
Definition Max22200Handler.cpp:282
bool EnsureInitialized() noexcept
Ensure driver is initialized (lazy init entrypoint).
Definition Max22200Handler.cpp:191
bool IsInitialized() const noexcept
Check if initialized.
Definition Max22200Handler.h:159
static constexpr uint8_t kNumChannels
Definition Max22200Handler.h:106
max22200::DriverStatus Deinitialize() noexcept
Deinitialize — disable all channels, ACTIVE=0, ENABLE LOW.
Definition Max22200Handler.cpp:237
max22200::DriverStatus ClearFaults() noexcept
Clear all fault flags.
Definition Max22200Handler.cpp:346
Max22200Handler(BaseSpi &spi, BaseGpio &enable, BaseGpio &cmd, BaseGpio *fault=nullptr) noexcept
Construct MAX22200 handler.
Definition Max22200Handler.cpp:153
max22200::DriverStatus ReadFaultRegister(max22200::FaultStatus &faults) noexcept
Read fault register into status.
Definition Max22200Handler.cpp:352
max22200::MAX22200< HalSpiMax22200Comm > DriverType
Driver type alias.
Definition Max22200Handler.h:104
max22200::DriverStatus DisableAllChannels() noexcept
Disable all channels.
Definition Max22200Handler.cpp:302
bool EnsureInitializedLocked() noexcept
Definition Max22200Handler.cpp:226
auto withDriver(Fn &&fn) noexcept
Execute a lambda with a locked, initialized driver.
Definition Max22200Handler.h:280
max22200::DriverStatus GetChannelFaults(uint8_t channel, max22200::FaultStatus &faults) noexcept
Read fault flags for a channel.
Definition Max22200Handler.cpp:329
bool HasFault() noexcept
Check if any fault is present.
Definition Max22200Handler.cpp:338
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:258
max22200::DriverStatus EnableAllChannels() noexcept
Enable all channels.
Definition Max22200Handler.cpp:296
void DumpDiagnostics() noexcept
Dump diagnostics to logger.
Definition Max22200Handler.cpp:371