HardFOC Core
API reference
Loading...
Searching...
No Matches
Ads9324Handler.h
Go to the documentation of this file.
1
25#ifndef COMPONENT_HANDLER_ADS9324_HANDLER_H_
26#define COMPONENT_HANDLER_ADS9324_HANDLER_H_
27
28#include <cstdint>
29#include <memory>
30#include <type_traits>
31#include <utility>
32#include "core/hf-core-drivers/external/hf-ads9324-driver/inc/ads9324.hpp"
33#include "base/BaseSpi.h"
34#include "base/BaseAdc.h"
35#include "base/BaseGpio.h"
36#include "RtosMutex.h"
37
38//======================================================//
39// ADS9324 SPI + HOST BRIDGE ADAPTER (CRTP)
40//======================================================//
41
53class Ads9324SpiHostAdapter : public ads9324::SpiInterface<Ads9324SpiHostAdapter>,
54 public ads9324::HostInterface<Ads9324SpiHostAdapter> {
55public:
62 Ads9324SpiHostAdapter(BaseSpi& spi, BaseGpio* convst, BaseGpio* drdy) noexcept;
63
71 bool transfer(const uint8_t* tx, uint8_t* rx, std::size_t len) noexcept;
72
77 void ConvstWrite(bool high) noexcept;
78
83 bool DrdyRead() noexcept;
84
89 bool HasDrdy() const noexcept;
90
95 void DelayUs(uint32_t us) noexcept;
96
101 void DelayMs(uint32_t ms) noexcept;
102
103private:
104 BaseSpi& spi_;
105 BaseGpio* convst_;
106 BaseGpio* drdy_;
107};
108
109//======================================================//
110// HANDLER CONFIGURATION
111//======================================================//
112
117 ads9324::ChannelConfig default_channel{};
118 ads9324::DataFormat format = ads9324::DataFormat::TwosComplement;
119 uint8_t device_index = 0;
120};
121
128 cfg.default_channel.type = ads9324::InputType::Differential;
129 cfg.default_channel.range = ads9324::InputRange::PlusMinus5V;
130 cfg.default_channel.bandwidth = ads9324::PgaBandwidth::Low;
131 return cfg;
132}
133
134//======================================================//
135// HANDLER DIAGNOSTICS
136//======================================================//
137
142 bool initialized = false;
143 bool driver_ready = false;
144 uint16_t device_id = 0;
145 uint32_t total_reads = 0;
146 uint32_t error_count = 0;
147 uint8_t device_index = 0;
148};
149
150//======================================================//
151// HANDLER CLASS — implements BaseAdc
152//======================================================//
153
160class Ads9324Handler : public BaseAdc {
161public:
169 Ads9324Handler(BaseSpi& spi, BaseGpio* convst, BaseGpio* drdy = nullptr,
170 const Ads9324HandlerConfig& config = GetDefaultAds9324Config()) noexcept;
171
173 ~Ads9324Handler() noexcept override = default;
174
176 Ads9324Handler& operator=(const Ads9324Handler&) = delete;
178 Ads9324Handler& operator=(Ads9324Handler&&) = delete;
179
185 bool Initialize() noexcept override;
186
191 bool Deinitialize() noexcept override;
192
197 hf_u8_t GetMaxChannels() const noexcept override;
198
203 bool IsChannelAvailable(hf_channel_id_t channel) const noexcept override;
204
213 hf_adc_err_t ReadChannelV(hf_channel_id_t channel, float& voltage, hf_u8_t samples = 1,
214 hf_time_t timeout_ms = 0) noexcept override;
215
223 hf_adc_err_t ReadChannelCount(hf_channel_id_t channel, hf_u32_t& count, hf_u8_t samples = 1,
224 hf_time_t timeout_ms = 0) noexcept override;
225
240 hf_adc_err_t ReadChannel(hf_channel_id_t channel, hf_u32_t& count, float& voltage,
241 hf_u8_t samples = 1, hf_time_t timeout_ms = 0) noexcept override;
242
250 hf_adc_err_t ReadMultipleChannels(const hf_channel_id_t* channels, hf_u8_t num_channels,
251 hf_u32_t* counts, float* voltages) noexcept override;
252
259 bool ConfigureChannel(uint8_t channel, const ads9324::ChannelConfig& cfg) noexcept;
260
267 bool SetChannelOffset(uint8_t channel, int16_t ofs_10bit) noexcept;
268
276 bool SetChannelGain(uint8_t channel, int16_t gan_14bit) noexcept;
277
283 bool ReadSnapshot(ads9324::Snapshot& snap) noexcept;
284
290 ads9324::ADS9324<Ads9324SpiHostAdapter, Ads9324SpiHostAdapter>* GetDriver() noexcept;
291
293 const ads9324::ADS9324<Ads9324SpiHostAdapter, Ads9324SpiHostAdapter>* GetDriver() const noexcept;
294
301 template <typename Fn>
302 auto visitDriver(Fn&& fn) noexcept -> decltype(fn(
303 std::declval<ads9324::ADS9324<Ads9324SpiHostAdapter, Ads9324SpiHostAdapter>&>())) {
304 using ReturnType = decltype(fn(
305 std::declval<ads9324::ADS9324<Ads9324SpiHostAdapter, Ads9324SpiHostAdapter>&>()));
306 MutexLockGuard lock(handler_mutex_);
308 if constexpr (std::is_void_v<ReturnType>) {
309 return;
310 } else {
311 return ReturnType{};
312 }
313 }
314 return fn(*adc_driver_);
315 }
316
320 const char* GetDescription() const noexcept;
321
327 bool GetHandlerDiagnostics(Ads9324Diagnostics& diag) const noexcept;
328
330 void DumpDiagnostics() const noexcept;
331
335 uint8_t GetDeviceIndex() const noexcept { return config_.device_index; }
336
337private:
338 BaseSpi& spi_ref_;
339 BaseGpio* convst_;
340 BaseGpio* drdy_;
341 std::unique_ptr<Ads9324SpiHostAdapter> adapter_;
342 std::unique_ptr<ads9324::ADS9324<Ads9324SpiHostAdapter, Ads9324SpiHostAdapter>> adc_driver_;
344 mutable RtosMutex handler_mutex_;
345 char description_[64]{};
346 mutable uint32_t total_reads_{0};
347 mutable uint32_t error_count_{0};
348 uint16_t device_id_{0};
349
354 bool EnsureInitializedLocked() noexcept;
355};
356
365std::unique_ptr<Ads9324Handler> CreateAds9324Handler(
366 BaseSpi& spi, BaseGpio* convst, BaseGpio* drdy = nullptr,
367 const Ads9324HandlerConfig& config = GetDefaultAds9324Config()) noexcept;
368
369#endif
Ads9324HandlerConfig GetDefaultAds9324Config() noexcept
Default handler config: differential ±5 V, low PGA bandwidth, two's-complement.
Definition Ads9324Handler.h:126
std::unique_ptr< Ads9324Handler > CreateAds9324Handler(BaseSpi &spi, BaseGpio *convst, BaseGpio *drdy=nullptr, const Ads9324HandlerConfig &config=GetDefaultAds9324Config()) noexcept
Factory: construct an Ads9324Handler on the heap.
Definition Ads9324Handler.cpp:318
Thread-safe BaseAdc handler for one ADS9324 on a SPI bus.
Definition Ads9324Handler.h:160
uint32_t error_count_
Failures.
Definition Ads9324Handler.h:347
RtosMutex handler_mutex_
Serializes all driver access except GetDriver().
Definition Ads9324Handler.h:344
bool IsChannelAvailable(hf_channel_id_t channel) const noexcept override
Whether channel is in [0, 15] (API 0 = AIN1).
Definition Ads9324Handler.cpp:151
bool ConfigureChannel(uint8_t channel, const ads9324::ChannelConfig &cfg) noexcept
Program one channel PGA (mutex-protected).
Definition Ads9324Handler.cpp:232
BaseGpio * drdy_
Optional DRDY.
Definition Ads9324Handler.h:340
hf_adc_err_t ReadChannelV(hf_channel_id_t channel, float &voltage, hf_u8_t samples=1, hf_time_t timeout_ms=0) noexcept override
Read voltage (averaged). Internally a full simultaneous snapshot per sample.
Definition Ads9324Handler.cpp:187
BaseGpio * convst_
Required CONVST.
Definition Ads9324Handler.h:339
void DumpDiagnostics() const noexcept
Log CONVST/DRDY presence, DEVICE_ID, and read/error counts.
Definition Ads9324Handler.cpp:292
hf_adc_err_t ReadChannel(hf_channel_id_t channel, hf_u32_t &count, float &voltage, hf_u8_t samples=1, hf_time_t timeout_ms=0) noexcept override
Read count and voltage (averaged).
Definition Ads9324Handler.cpp:155
hf_adc_err_t ReadChannelCount(hf_channel_id_t channel, hf_u32_t &count, hf_u8_t samples=1, hf_time_t timeout_ms=0) noexcept override
Read raw count (averaged). See ReadChannel for signed-code caveat.
Definition Ads9324Handler.cpp:193
bool GetHandlerDiagnostics(Ads9324Diagnostics &diag) const noexcept
Copy diagnostics under the handler mutex.
Definition Ads9324Handler.cpp:281
uint32_t total_reads_
Successful operations.
Definition Ads9324Handler.h:346
std::unique_ptr< Ads9324SpiHostAdapter > adapter_
CRTP bridge.
Definition Ads9324Handler.h:341
hf_adc_err_t ReadMultipleChannels(const hf_channel_id_t *channels, hf_u8_t num_channels, hf_u32_t *counts, float *voltages) noexcept override
One snapshot, then index the requested channels.
Definition Ads9324Handler.cpp:199
bool EnsureInitializedLocked() noexcept
Initialize if needed while handler_mutex_ is already held.
Definition Ads9324Handler.cpp:85
uint8_t GetDeviceIndex() const noexcept
Logical device index from config.
Definition Ads9324Handler.h:335
bool SetChannelGain(uint8_t channel, int16_t gan_14bit) noexcept
Program GAN_AINx (14-bit two's complement). Correction = GAN / 65536.
Definition Ads9324Handler.cpp:248
bool Deinitialize() noexcept override
Destroy driver and adapter; leave GPIOs as-is.
Definition Ads9324Handler.cpp:141
~Ads9324Handler() noexcept override=default
Releases driver/adapter unique_ptrs.
auto visitDriver(Fn &&fn) noexcept -> decltype(fn(std::declval< ads9324::ADS9324< Ads9324SpiHostAdapter, Ads9324SpiHostAdapter > & >()))
Invoke fn with the driver while holding the handler mutex.
Definition Ads9324Handler.h:302
hf_u8_t GetMaxChannels() const noexcept override
Channel count for BaseAdc.
Definition Ads9324Handler.cpp:149
BaseSpi & spi_ref_
SPI device.
Definition Ads9324Handler.h:338
ads9324::ADS9324< Ads9324SpiHostAdapter, Ads9324SpiHostAdapter > * GetDriver() noexcept
Raw driver pointer.
Definition Ads9324Handler.cpp:270
uint16_t device_id_
Cached DEVICE_ID.
Definition Ads9324Handler.h:348
Ads9324HandlerConfig config_
Init defaults.
Definition Ads9324Handler.h:343
char description_[64]
GetDescription buffer.
Definition Ads9324Handler.h:345
bool Initialize() noexcept override
Create adapter + driver, 1-lane SDOUT bring-up, DEVICE_ID, default PGA.
Definition Ads9324Handler.cpp:92
bool ReadSnapshot(ads9324::Snapshot &snap) noexcept
Simultaneous capture of all enabled channels.
Definition Ads9324Handler.cpp:256
std::unique_ptr< ads9324::ADS9324< Ads9324SpiHostAdapter, Ads9324SpiHostAdapter > > adc_driver_
Definition Ads9324Handler.h:342
const char * GetDescription() const noexcept
Human-readable instance tag (ADS9324_Handler_SPI_DevN).
Definition Ads9324Handler.cpp:279
bool SetChannelOffset(uint8_t channel, int16_t ofs_10bit) noexcept
Program OFS_AINx (10-bit two's-complement).
Definition Ads9324Handler.cpp:240
CRTP adapter connecting BaseSpi + CONVST/DRDY GPIO to the ADS9324 driver.
Definition Ads9324Handler.h:54
bool transfer(const uint8_t *tx, uint8_t *rx, std::size_t len) noexcept
Full-duplex SPI transfer (CRTP dispatch target).
Definition Ads9324Handler.cpp:25
void DelayUs(uint32_t us) noexcept
Busy-wait microseconds (nested volatile loop).
Definition Ads9324Handler.cpp:57
void DelayMs(uint32_t ms) noexcept
Sleep milliseconds via os_delay_msec (chunked at 65535 ms).
Definition Ads9324Handler.cpp:67
bool HasDrdy() const noexcept
Whether a DRDY GPIO was supplied.
Definition Ads9324Handler.cpp:55
void ConvstWrite(bool high) noexcept
Drive CONVST.
Definition Ads9324Handler.cpp:35
bool DrdyRead() noexcept
Sample DRDY.
Definition Ads9324Handler.cpp:46
BaseGpio * drdy_
Optional DRDY; nullptr = timed wait.
Definition Ads9324Handler.h:106
BaseSpi & spi_
SPI device.
Definition Ads9324Handler.h:104
BaseGpio * convst_
CONVST (required at handler Initialize).
Definition Ads9324Handler.h:105
Diagnostic snapshot for one ADS9324 handler instance.
Definition Ads9324Handler.h:141
uint32_t error_count
Failed reads / snapshots.
Definition Ads9324Handler.h:146
bool initialized
BaseAdc initialized flag.
Definition Ads9324Handler.h:142
bool driver_ready
Driver unique_ptr is non-null.
Definition Ads9324Handler.h:143
uint16_t device_id
DEVICE_ID read at init (expect 0x0004).
Definition Ads9324Handler.h:144
uint8_t device_index
Copy of Ads9324HandlerConfig::device_index.
Definition Ads9324Handler.h:147
uint32_t total_reads
Successful BaseAdc / snapshot operations.
Definition Ads9324Handler.h:145
Configuration applied at Ads9324Handler::Initialize.
Definition Ads9324Handler.h:116
ads9324::DataFormat format
GEN_CFG3 coding.
Definition Ads9324Handler.h:118
ads9324::ChannelConfig default_channel
PGA applied to all 16 channels at init.
Definition Ads9324Handler.h:117
uint8_t device_index
Logical index for logs / multi-CS maps.
Definition Ads9324Handler.h:119