HF Interface Wrapper 0.1.0-dev
Embedded C++ hardware abstraction layer
Loading...
Searching...
No Matches
EspSpi.h
Go to the documentation of this file.
1
31#pragma once
32
33#include "BaseSpi.h"
34#include "PlatformMutex.h"
35#include "utils/EspTypes.h"
36#include <memory>
37#include <vector>
38
39// Suppress pedantic warnings for ESP-IDF headers
40#ifdef __cplusplus
41#pragma GCC diagnostic push
42#pragma GCC diagnostic ignored "-Wpedantic"
43#endif
44
45// ESP-IDF C headers must be wrapped in extern "C" for C++ compatibility
46#ifdef __cplusplus
47extern "C" {
48#endif
49#include "driver/spi_common.h"
50#include "driver/spi_master.h"
51#include "esp_log.h"
52#ifdef __cplusplus
53}
54#endif
55
56// Restore warnings after ESP-IDF headers
57#ifdef __cplusplus
58#pragma GCC diagnostic pop
59#endif
60
61class EspSpiBus;
62class EspSpiDevice;
63
74class EspSpiDevice : public BaseSpi {
75public:
81 EspSpiDevice(EspSpiBus* parent, const hf_spi_device_config_t& config);
85 ~EspSpiDevice() noexcept override;
86
91 bool Initialize() noexcept override;
96 bool Deinitialize() noexcept override;
97
103 bool MarkAsDeinitialized() noexcept;
104
113 hf_spi_err_t Transfer(const hf_u8_t* tx_data, hf_u8_t* rx_data, hf_u16_t length,
114 hf_u32_t timeout_ms = 0) noexcept override;
115
120 const void* GetDeviceConfig() const noexcept override;
121
128 hf_spi_err_t AcquireBus(hf_u32_t timeout_ms) noexcept;
129
134 hf_spi_err_t ReleaseBus() noexcept;
135
140 spi_device_handle_t GetHandle() const noexcept;
145 const hf_spi_device_config_t& GetConfig() const noexcept;
146
152 hf_spi_err_t GetActualClockFrequency(hf_u32_t& actual_freq_hz) const noexcept;
153
154private:
156 spi_device_handle_t handle_;
160};
161
170public:
175 explicit EspSpiBus(const hf_spi_bus_config_t& config) noexcept;
179 ~EspSpiBus() noexcept;
180
185 bool Initialize() noexcept;
186
191 bool IsInitialized() const noexcept;
192
197 bool Deinitialize() noexcept;
198
204 int CreateDevice(const hf_spi_device_config_t& device_config) noexcept;
205
211 BaseSpi* GetDevice(int device_index) noexcept;
212
218 const BaseSpi* GetDevice(int device_index) const noexcept;
219
225 EspSpiDevice* GetEspDevice(int device_index) noexcept;
226
232 const EspSpiDevice* GetEspDevice(int device_index) const noexcept;
233
238 std::size_t GetDeviceCount() const noexcept;
239
245 bool RemoveDevice(int device_index) noexcept;
246
251 const hf_spi_bus_config_t& GetConfig() const noexcept;
256 spi_host_device_t GetHost() const noexcept;
257
258private:
262 std::vector<std::unique_ptr<EspSpiDevice>> devices_;
263};
Abstract base class for SPI device implementations in the HardFOC system.
hf_spi_err_t
Definition BaseSpi.h:84
Consolidated MCU-specific type definitions for hardware abstraction (hf_* types).
uint32_t hf_u32_t
Platform-agnostic 32-bit unsigned integer type.
Definition HardwareTypes.h:52
uint8_t hf_u8_t
Platform-agnostic 8-bit unsigned integer type.
Definition HardwareTypes.h:40
uint16_t hf_u16_t
Platform-agnostic 16-bit unsigned integer type.
Definition HardwareTypes.h:46
Cross-platform RTOS mutex and synchronization primitives.
Abstract base class for SPI device implementations.
Definition BaseSpi.h:184
Manages a single SPI bus (host). Handles bus init/deinit and device creation.
Definition EspSpi.h:169
hf_spi_bus_config_t config_
Bus configuration.
Definition EspSpi.h:259
EspSpiDevice * GetEspDevice(int device_index) noexcept
Get an ESP-specific device by index.
Definition EspSpi.cpp:167
std::vector< std::unique_ptr< EspSpiDevice > > devices_
Managed devices on this bus.
Definition EspSpi.h:262
int CreateDevice(const hf_spi_device_config_t &device_config) noexcept
Create a new SPI device on this bus and store it internally.
Definition EspSpi.cpp:133
const hf_spi_bus_config_t & GetConfig() const noexcept
Get the bus configuration.
Definition EspSpi.cpp:199
spi_host_device_t GetHost() const noexcept
Get the ESP-IDF host ID for this bus.
Definition EspSpi.cpp:203
bool initialized_
Initialization state.
Definition EspSpi.h:260
bool Initialize() noexcept
Initialize the SPI bus.
Definition EspSpi.cpp:60
PlatformMutex mutex_
Thread safety (mutable for const operations)
Definition EspSpi.h:261
~EspSpiBus() noexcept
Destructor. Automatically deinitializes the bus if needed.
Definition EspSpi.cpp:56
bool RemoveDevice(int device_index) noexcept
Remove a device from the bus.
Definition EspSpi.cpp:188
BaseSpi * GetDevice(int device_index) noexcept
Get a device by index.
Definition EspSpi.cpp:151
bool IsInitialized() const noexcept
Check if the bus is initialized.
Definition EspSpi.cpp:100
std::size_t GetDeviceCount() const noexcept
Get number of devices on this bus.
Definition EspSpi.cpp:183
bool Deinitialize() noexcept
Deinitialize the SPI bus and free resources.
Definition EspSpi.cpp:105
EspSpiBus(const hf_spi_bus_config_t &config) noexcept
Construct a new EspSpiBus.
Definition EspSpi.cpp:54
Represents a single SPI device on a bus (CS/config/handle).
Definition EspSpi.h:74
hf_spi_device_config_t config_
Device configuration.
Definition EspSpi.h:157
PlatformMutex mutex_
Thread safety.
Definition EspSpi.h:159
EspSpiDevice(EspSpiBus *parent, const hf_spi_device_config_t &config)
Construct a new EspSpiDevice.
Definition EspSpi.cpp:211
const void * GetDeviceConfig() const noexcept override
Get the device configuration for this SPI device.
Definition EspSpi.cpp:378
bool MarkAsDeinitialized() noexcept
Mark the device as deinitialized without ESP-IDF cleanup.
Definition EspSpi.cpp:289
spi_device_handle_t handle_
ESP-IDF device handle.
Definition EspSpi.h:156
hf_spi_err_t AcquireBus(hf_u32_t timeout_ms) noexcept
Acquire the SPI bus for exclusive use by this device.
Definition EspSpi.cpp:390
~EspSpiDevice() noexcept override
Destructor. Automatically deinitializes the device if needed.
Definition EspSpi.cpp:217
EspSpiBus * parent_bus_
Parent SPI bus.
Definition EspSpi.h:155
hf_spi_err_t ReleaseBus() noexcept
Release the bus lock after operations.
Definition EspSpi.cpp:409
hf_spi_err_t Transfer(const hf_u8_t *tx_data, hf_u8_t *rx_data, hf_u16_t length, hf_u32_t timeout_ms=0) noexcept override
Perform a full-duplex SPI transfer.
Definition EspSpi.cpp:318
bool initialized_
Initialization state.
Definition EspSpi.h:158
spi_device_handle_t GetHandle() const noexcept
Get the ESP-IDF device handle.
Definition EspSpi.cpp:382
bool Initialize() noexcept override
Initialize the SPI device (no-op if already initialized).
Definition EspSpi.cpp:222
const hf_spi_device_config_t & GetConfig() const noexcept
Get the device configuration.
Definition EspSpi.cpp:386
bool Deinitialize() noexcept override
Deinitialize the SPI device and free resources.
Definition EspSpi.cpp:299
hf_spi_err_t GetActualClockFrequency(hf_u32_t &actual_freq_hz) const noexcept
Get the actual clock frequency used by this device.
Definition EspSpi.cpp:417
Definition PlatformMutex.h:78
Platform-agnostic SPI bus configuration for STM32.
Definition EspTypes_SPI.h:150
SPI device configuration for STM32.
Definition EspTypes_SPI.h:210