HardFOC Core
API reference
Loading...
Searching...
No Matches
As5047uHandler.h
Go to the documentation of this file.
1
33#ifndef COMPONENT_HANDLER_AS5047U_HANDLER_H_
34#define COMPONENT_HANDLER_AS5047U_HANDLER_H_
35
36#include <cstdint>
37#include <memory>
38#include <type_traits>
39#include <utility>
40#include "core/hf-core-drivers/external/hf-as5047u-driver/inc/as5047u.hpp"
41#include "base/BaseSpi.h"
42#include "RtosMutex.h"
43
44//======================================================//
45// AS5047U SPI BRIDGE ADAPTER
46//======================================================//
47
58class As5047uSpiAdapter : public as5047u::SpiInterface<As5047uSpiAdapter> {
59public:
64 explicit As5047uSpiAdapter(BaseSpi& spi_interface) noexcept;
65
74 bool transfer(const uint8_t* tx, uint8_t* rx, std::size_t len) noexcept;
75
76private:
78};
79
80//======================================================//
81// AS5047U SENSOR DATA STRUCTURES
82//======================================================//
83
99
113
130
131//======================================================//
132// AS5047U HANDLER CLASS
133//======================================================//
134
150public:
151 //======================================================//
152 // CONSTRUCTION AND LIFECYCLE
153 //======================================================//
154
163 explicit As5047uHandler(BaseSpi& spi_interface,
164 const As5047uConfig& config = GetDefaultConfig()) noexcept;
165
169 ~As5047uHandler() noexcept = default;
170
171 // Disable copy construction and assignment
173 As5047uHandler& operator=(const As5047uHandler&) = delete;
174
175 // Non-movable (holds mutex, unique_ptrs, and raw bus pointer)
177 As5047uHandler& operator=(As5047uHandler&&) = delete;
178
179 //======================================================//
180 // INITIALIZATION AND STATUS
181 //======================================================//
182
190 bool Initialize() noexcept;
191
196 bool EnsureInitialized() noexcept;
197
202 bool Deinitialize() noexcept;
203
208 bool IsInitialized() const noexcept;
209
214 bool IsSensorReady() const noexcept;
215
226 as5047u::AS5047U<As5047uSpiAdapter>* GetSensor() noexcept;
227
232 as5047u::AS5047U<As5047uSpiAdapter>* GetDriver() noexcept;
233 const as5047u::AS5047U<As5047uSpiAdapter>* GetDriver() const noexcept;
234
239 template <typename Fn>
240 auto visitDriver(Fn&& fn) noexcept -> decltype(fn(std::declval<as5047u::AS5047U<As5047uSpiAdapter>&>())) {
241 using ReturnType = decltype(fn(std::declval<as5047u::AS5047U<As5047uSpiAdapter>&>()));
242 MutexLockGuard lock(handler_mutex_);
244 if constexpr (std::is_void_v<ReturnType>) {
245 return;
246 } else {
247 return ReturnType{};
248 }
249 }
250 return fn(*as5047u_sensor_);
251 }
252
253 //======================================================//
254 // UTILITY METHODS
255 //======================================================//
256
261 static As5047uConfig GetDefaultConfig() noexcept;
262
267 const char* GetDescription() const noexcept;
268
280 AS5047U_Error GetLastError() const noexcept;
281
288 As5047uDiagnostics GetDiagnostics() const noexcept;
289
294 bool RefreshDiagnostics() noexcept;
295
300 void DumpDiagnostics() const noexcept;
301
302private:
303 //======================================================//
304 // PRIVATE MEMBERS
305 //======================================================//
306
307 BaseSpi& spi_ref_;
309 std::unique_ptr<as5047u::AS5047U<As5047uSpiAdapter>> as5047u_sensor_;
311 mutable RtosMutex handler_mutex_;
313 mutable AS5047U_Error last_error_;
315 char description_[64];
316
317 //======================================================//
318 // PRIVATE HELPER METHODS
319 //======================================================//
320
325 bool ValidateSensor() noexcept;
326
331 bool EnsureInitializedLocked() noexcept;
332
337 void HandleSensorErrors(uint16_t sensor_errors) noexcept;
338
342 void UpdateDiagnostics() noexcept;
343
349 bool ApplyConfiguration(const As5047uConfig& config) noexcept;
350};
351
352//======================================================//
353// FACTORY METHODS
354//======================================================//
355
362std::unique_ptr<As5047uHandler> CreateAs5047uHandler(
363 BaseSpi& spi_interface,
364 const As5047uConfig& config = As5047uHandler::GetDefaultConfig()) noexcept;
365
366#endif // COMPONENT_HANDLER_AS5047U_HANDLER_H_
std::unique_ptr< As5047uHandler > CreateAs5047uHandler(BaseSpi &spi_interface, const As5047uConfig &config=As5047uHandler::GetDefaultConfig()) noexcept
Create AS5047U handler instance.
Definition As5047uHandler.cpp:303
Unified handler for AS5047U magnetic rotary position sensor.
Definition As5047uHandler.h:149
bool EnsureInitializedLocked() noexcept
Ensure initialized while mutex is already held.
Definition As5047uHandler.cpp:229
bool initialized_
Initialization state.
Definition As5047uHandler.h:312
char description_[64]
Sensor description.
Definition As5047uHandler.h:315
bool ApplyConfiguration(const As5047uConfig &config) noexcept
Apply configuration to sensor.
Definition As5047uHandler.cpp:260
as5047u::AS5047U< As5047uSpiAdapter > * GetDriver() noexcept
Naming-consistent alias of GetSensor().
Definition As5047uHandler.cpp:169
bool ValidateSensor() noexcept
Validate sensor parameters.
Definition As5047uHandler.cpp:225
bool Initialize() noexcept
Initialize the AS5047U sensor (lazy initialization)
Definition As5047uHandler.cpp:67
std::unique_ptr< As5047uSpiAdapter > spi_adapter_
SPI CRTP adapter.
Definition As5047uHandler.h:308
void DumpDiagnostics() const noexcept
Dump comprehensive diagnostics and statistics to log as INFO level. Logs AS5047U sensor status,...
Definition As5047uHandler.cpp:307
AS5047U_Error GetLastError() const noexcept
Get last error code.
Definition As5047uHandler.cpp:202
As5047uDiagnostics diagnostics_
Cached diagnostics.
Definition As5047uHandler.h:314
static As5047uConfig GetDefaultConfig() noexcept
Get default sensor configuration.
Definition As5047uHandler.cpp:182
auto visitDriver(Fn &&fn) noexcept -> decltype(fn(std::declval< as5047u::AS5047U< As5047uSpiAdapter > & >()))
Visit the underlying AS5047U driver under handler mutex protection.
Definition As5047uHandler.h:240
bool RefreshDiagnostics() noexcept
Read ERRFL from the sensor and update the cached diagnostics.
Definition As5047uHandler.cpp:212
void UpdateDiagnostics() noexcept
Update cached diagnostics.
Definition As5047uHandler.cpp:252
RtosMutex handler_mutex_
Thread safety mutex.
Definition As5047uHandler.h:311
void HandleSensorErrors(uint16_t sensor_errors) noexcept
Handle sensor errors and update diagnostics.
Definition As5047uHandler.cpp:237
as5047u::AS5047U< As5047uSpiAdapter > * GetSensor() noexcept
Get pointer to AS5047U driver for advanced operations.
Definition As5047uHandler.cpp:157
bool Deinitialize() noexcept
Deinitialize the sensor and free resources.
Definition As5047uHandler.cpp:135
bool EnsureInitialized() noexcept
Ensure the handler is initialized (lazy init entrypoint).
Definition As5047uHandler.cpp:126
As5047uDiagnostics GetDiagnostics() const noexcept
Snapshot of the diagnostics cached at the last refresh.
Definition As5047uHandler.cpp:207
const char * GetDescription() const noexcept
Get sensor description string.
Definition As5047uHandler.cpp:198
AS5047U_Error last_error_
Last driver-reported error flags.
Definition As5047uHandler.h:313
bool IsInitialized() const noexcept
Check if sensor is initialized and ready.
Definition As5047uHandler.cpp:147
bool IsSensorReady() const noexcept
Check if sensor driver is ready (lazy initialization helper)
Definition As5047uHandler.cpp:152
std::unique_ptr< as5047u::AS5047U< As5047uSpiAdapter > > as5047u_sensor_
AS5047U driver instance.
Definition As5047uHandler.h:309
~As5047uHandler() noexcept=default
Destructor - automatically handles cleanup.
BaseSpi & spi_ref_
Reference to SPI interface.
Definition As5047uHandler.h:307
As5047uConfig config_
Sensor configuration.
Definition As5047uHandler.h:310
CRTP adapter connecting BaseSpi interface to AS5047U SpiInterface.
Definition As5047uHandler.h:58
BaseSpi & spi_interface_
Definition As5047uHandler.h:77
bool transfer(const uint8_t *tx, uint8_t *rx, std::size_t len) noexcept
Perform full-duplex SPI transfer (CRTP dispatch target)
Definition As5047uHandler.cpp:37
AS5047U configuration structure.
Definition As5047uHandler.h:117
uint8_t abi_resolution_bits
ABI resolution in bits (10-14)
Definition As5047uHandler.h:126
bool enable_pwm_output
Enable PWM output.
Definition As5047uHandler.h:125
uint16_t zero_position
Zero position offset (0-16383)
Definition As5047uHandler.h:122
bool enable_uvw_output
Enable UVW commutation output.
Definition As5047uHandler.h:124
uint8_t uvw_pole_pairs
UVW pole pairs (1-7)
Definition As5047uHandler.h:127
bool enable_abi_output
Enable ABI incremental output.
Definition As5047uHandler.h:123
bool enable_adaptive_filter
Enable adaptive filtering.
Definition As5047uHandler.h:121
bool high_temperature_mode
Enable 150°C operation mode.
Definition As5047uHandler.h:128
uint8_t crc_retries
Number of CRC error retries.
Definition As5047uHandler.h:119
bool enable_daec
Enable Dynamic Angle Error Compensation.
Definition As5047uHandler.h:120
FrameFormat frame_format
SPI frame format (16/24/32-bit)
Definition As5047uHandler.h:118
Sensor diagnostic information.
Definition As5047uHandler.h:103
uint32_t total_measurements
Total measurements taken.
Definition As5047uHandler.h:111
uint32_t communication_errors
Count of communication errors.
Definition As5047uHandler.h:110
bool cordic_overflow
CORDIC algorithm overflow.
Definition As5047uHandler.h:106
uint16_t last_error_flags
Last error flags read.
Definition As5047uHandler.h:109
bool agc_warning
AGC at minimum or maximum.
Definition As5047uHandler.h:105
bool magnetic_field_ok
Magnetic field strength is adequate.
Definition As5047uHandler.h:104
bool offset_compensation_ok
Offset compensation completed.
Definition As5047uHandler.h:107
bool communication_ok
SPI communication working.
Definition As5047uHandler.h:108
Complete sensor measurement data structure.
Definition As5047uHandler.h:87
int16_t velocity_raw
Raw velocity (signed 14-bit)
Definition As5047uHandler.h:90
uint16_t error_flags
Current error flags.
Definition As5047uHandler.h:96
float velocity_rad_per_sec
Velocity in radians per second.
Definition As5047uHandler.h:92
float velocity_rpm
Velocity in revolutions per minute.
Definition As5047uHandler.h:93
uint16_t magnitude
Magnetic field magnitude (0-16383)
Definition As5047uHandler.h:95
uint16_t angle_raw
Raw angle (0-16383 LSB)
Definition As5047uHandler.h:88
uint16_t angle_compensated
DAEC compensated angle (0-16383 LSB)
Definition As5047uHandler.h:89
bool valid
True if measurement is valid.
Definition As5047uHandler.h:97
uint8_t agc_value
Automatic Gain Control value (0-255)
Definition As5047uHandler.h:94
float velocity_deg_per_sec
Velocity in degrees per second.
Definition As5047uHandler.h:91