HF-Core Platform 0.1.0-dev
Hardware-Agnostic Handler Layer & RTOS Utilities for HardFOC
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
72 void transfer(const uint8_t* tx, uint8_t* rx, std::size_t len) noexcept;
73
74private:
76};
77
78//======================================================//
79// AS5047U SENSOR DATA STRUCTURES
80//======================================================//
81
97
111
128
129//======================================================//
130// AS5047U HANDLER CLASS
131//======================================================//
132
148public:
149 //======================================================//
150 // CONSTRUCTION AND LIFECYCLE
151 //======================================================//
152
161 explicit As5047uHandler(BaseSpi& spi_interface,
162 const As5047uConfig& config = GetDefaultConfig()) noexcept;
163
167 ~As5047uHandler() noexcept = default;
168
169 // Disable copy construction and assignment
171 As5047uHandler& operator=(const As5047uHandler&) = delete;
172
173 // Non-movable (holds mutex, unique_ptrs, and raw bus pointer)
175 As5047uHandler& operator=(As5047uHandler&&) = delete;
176
177 //======================================================//
178 // INITIALIZATION AND STATUS
179 //======================================================//
180
188 bool Initialize() noexcept;
189
194 bool EnsureInitialized() noexcept;
195
200 bool Deinitialize() noexcept;
201
206 bool IsInitialized() const noexcept;
207
212 bool IsSensorReady() const noexcept;
213
224 as5047u::AS5047U<As5047uSpiAdapter>* GetSensor() noexcept;
225
230 as5047u::AS5047U<As5047uSpiAdapter>* GetDriver() noexcept;
231 const as5047u::AS5047U<As5047uSpiAdapter>* GetDriver() const noexcept;
232
237 template <typename Fn>
238 auto visitDriver(Fn&& fn) noexcept -> decltype(fn(std::declval<as5047u::AS5047U<As5047uSpiAdapter>&>())) {
239 using ReturnType = decltype(fn(std::declval<as5047u::AS5047U<As5047uSpiAdapter>&>()));
240 MutexLockGuard lock(handler_mutex_);
242 if constexpr (std::is_void_v<ReturnType>) {
243 return;
244 } else {
245 return ReturnType{};
246 }
247 }
248 return fn(*as5047u_sensor_);
249 }
250
251 //======================================================//
252 // UTILITY METHODS
253 //======================================================//
254
259 static As5047uConfig GetDefaultConfig() noexcept;
260
265 const char* GetDescription() const noexcept;
266
271 AS5047U_Error GetLastError() const noexcept;
272
277 void DumpDiagnostics() const noexcept;
278
279private:
280 //======================================================//
281 // PRIVATE MEMBERS
282 //======================================================//
283
284 BaseSpi& spi_ref_;
286 std::unique_ptr<as5047u::AS5047U<As5047uSpiAdapter>> as5047u_sensor_;
288 mutable RtosMutex handler_mutex_;
290 mutable AS5047U_Error last_error_;
292 char description_[64];
293
294 //======================================================//
295 // PRIVATE HELPER METHODS
296 //======================================================//
297
302 bool ValidateSensor() noexcept;
303
308 bool EnsureInitializedLocked() noexcept;
309
314 void HandleSensorErrors(uint16_t sensor_errors) noexcept;
315
319 void UpdateDiagnostics() noexcept;
320
326 bool ApplyConfiguration(const As5047uConfig& config) noexcept;
327};
328
329//======================================================//
330// FACTORY METHODS
331//======================================================//
332
339std::unique_ptr<As5047uHandler> CreateAs5047uHandler(
340 BaseSpi& spi_interface,
341 const As5047uConfig& config = As5047uHandler::GetDefaultConfig()) noexcept;
342
343#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:290
Unified handler for AS5047U magnetic rotary position sensor.
Definition As5047uHandler.h:147
bool EnsureInitializedLocked() noexcept
Ensure initialized while mutex is already held.
Definition As5047uHandler.cpp:216
bool initialized_
Initialization state.
Definition As5047uHandler.h:289
char description_[64]
Sensor description.
Definition As5047uHandler.h:292
bool ApplyConfiguration(const As5047uConfig &config) noexcept
Apply configuration to sensor.
Definition As5047uHandler.cpp:247
as5047u::AS5047U< As5047uSpiAdapter > * GetDriver() noexcept
Naming-consistent alias of GetSensor().
Definition As5047uHandler.cpp:170
bool ValidateSensor() noexcept
Validate sensor parameters.
Definition As5047uHandler.cpp:212
bool Initialize() noexcept
Initialize the AS5047U sensor (lazy initialization)
Definition As5047uHandler.cpp:75
std::unique_ptr< As5047uSpiAdapter > spi_adapter_
SPI CRTP adapter.
Definition As5047uHandler.h:285
void DumpDiagnostics() const noexcept
Dump comprehensive diagnostics and statistics to log as INFO level. Logs AS5047U sensor status,...
Definition As5047uHandler.cpp:294
AS5047U_Error GetLastError() const noexcept
Get last error code.
Definition As5047uHandler.cpp:203
As5047uDiagnostics diagnostics_
Cached diagnostics.
Definition As5047uHandler.h:291
static As5047uConfig GetDefaultConfig() noexcept
Get default sensor configuration.
Definition As5047uHandler.cpp:183
auto visitDriver(Fn &&fn) noexcept -> decltype(fn(std::declval< as5047u::AS5047U< As5047uSpiAdapter > & >()))
Visit the underlying AS5047U driver under handler mutex protection.
Definition As5047uHandler.h:238
void UpdateDiagnostics() noexcept
Update cached diagnostics.
Definition As5047uHandler.cpp:239
RtosMutex handler_mutex_
Thread safety mutex.
Definition As5047uHandler.h:288
void HandleSensorErrors(uint16_t sensor_errors) noexcept
Handle sensor errors and update diagnostics.
Definition As5047uHandler.cpp:224
as5047u::AS5047U< As5047uSpiAdapter > * GetSensor() noexcept
Get pointer to AS5047U driver for advanced operations.
Definition As5047uHandler.cpp:158
bool Deinitialize() noexcept
Deinitialize the sensor and free resources.
Definition As5047uHandler.cpp:136
bool EnsureInitialized() noexcept
Ensure the handler is initialized (lazy init entrypoint).
Definition As5047uHandler.cpp:127
const char * GetDescription() const noexcept
Get sensor description string.
Definition As5047uHandler.cpp:199
As5047uHandler(BaseSpi &spi_interface, const As5047uConfig &config=GetDefaultConfig()) noexcept
Construct AS5047U handler with SPI interface.
Definition As5047uHandler.cpp:59
AS5047U_Error last_error_
Last driver-reported error flags.
Definition As5047uHandler.h:290
bool IsInitialized() const noexcept
Check if sensor is initialized and ready.
Definition As5047uHandler.cpp:148
bool IsSensorReady() const noexcept
Check if sensor driver is ready (lazy initialization helper)
Definition As5047uHandler.cpp:153
std::unique_ptr< as5047u::AS5047U< As5047uSpiAdapter > > as5047u_sensor_
AS5047U driver instance.
Definition As5047uHandler.h:286
~As5047uHandler() noexcept=default
Destructor - automatically handles cleanup.
BaseSpi & spi_ref_
Reference to SPI interface.
Definition As5047uHandler.h:284
As5047uConfig config_
Sensor configuration.
Definition As5047uHandler.h:287
CRTP adapter connecting BaseSpi interface to AS5047U SpiInterface.
Definition As5047uHandler.h:58
BaseSpi & spi_interface_
Definition As5047uHandler.h:75
As5047uSpiAdapter(BaseSpi &spi_interface) noexcept
Construct SPI adapter with BaseSpi interface.
Definition As5047uHandler.cpp:34
void 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:115
uint8_t abi_resolution_bits
ABI resolution in bits (10-14)
Definition As5047uHandler.h:124
bool enable_pwm_output
Enable PWM output.
Definition As5047uHandler.h:123
uint16_t zero_position
Zero position offset (0-16383)
Definition As5047uHandler.h:120
bool enable_uvw_output
Enable UVW commutation output.
Definition As5047uHandler.h:122
uint8_t uvw_pole_pairs
UVW pole pairs (1-7)
Definition As5047uHandler.h:125
bool enable_abi_output
Enable ABI incremental output.
Definition As5047uHandler.h:121
bool enable_adaptive_filter
Enable adaptive filtering.
Definition As5047uHandler.h:119
bool high_temperature_mode
Enable 150°C operation mode.
Definition As5047uHandler.h:126
uint8_t crc_retries
Number of CRC error retries.
Definition As5047uHandler.h:117
bool enable_daec
Enable Dynamic Angle Error Compensation.
Definition As5047uHandler.h:118
FrameFormat frame_format
SPI frame format (16/24/32-bit)
Definition As5047uHandler.h:116
Sensor diagnostic information.
Definition As5047uHandler.h:101
uint32_t total_measurements
Total measurements taken.
Definition As5047uHandler.h:109
uint32_t communication_errors
Count of communication errors.
Definition As5047uHandler.h:108
bool cordic_overflow
CORDIC algorithm overflow.
Definition As5047uHandler.h:104
uint16_t last_error_flags
Last error flags read.
Definition As5047uHandler.h:107
bool agc_warning
AGC at minimum or maximum.
Definition As5047uHandler.h:103
bool magnetic_field_ok
Magnetic field strength is adequate.
Definition As5047uHandler.h:102
bool offset_compensation_ok
Offset compensation completed.
Definition As5047uHandler.h:105
bool communication_ok
SPI communication working.
Definition As5047uHandler.h:106
Complete sensor measurement data structure.
Definition As5047uHandler.h:85
int16_t velocity_raw
Raw velocity (signed 14-bit)
Definition As5047uHandler.h:88
uint16_t error_flags
Current error flags.
Definition As5047uHandler.h:94
float velocity_rad_per_sec
Velocity in radians per second.
Definition As5047uHandler.h:90
float velocity_rpm
Velocity in revolutions per minute.
Definition As5047uHandler.h:91
uint16_t magnitude
Magnetic field magnitude (0-16383)
Definition As5047uHandler.h:93
uint16_t angle_raw
Raw angle (0-16383 LSB)
Definition As5047uHandler.h:86
uint16_t angle_compensated
DAEC compensated angle (0-16383 LSB)
Definition As5047uHandler.h:87
bool valid
True if measurement is valid.
Definition As5047uHandler.h:95
uint8_t agc_value
Automatic Gain Control value (0-255)
Definition As5047uHandler.h:92
float velocity_deg_per_sec
Velocity in degrees per second.
Definition As5047uHandler.h:89