HF Interface Wrapper 0.1.0-dev
Embedded C++ hardware abstraction layer
Loading...
Searching...
No Matches
BasePwm.h
Go to the documentation of this file.
1
18#pragma once
19
20#include "HardwareTypes.h"
21#include <cstdint>
22#include <string_view>
23
29//--------------------------------------
30// HardFOC PWM Error Codes (Table)
31//--------------------------------------
32
40#define HF_PWM_ERR_LIST(X) \
41 /* Success codes */ \
42 X(PWM_SUCCESS, 0, "Success") \
43 /* General errors */ \
44 X(PWM_ERR_FAILURE, 1, "General failure") \
45 X(PWM_ERR_NOT_INITIALIZED, 2, "Not initialized") \
46 X(PWM_ERR_ALREADY_INITIALIZED, 3, "Already initialized") \
47 X(PWM_ERR_INVALID_PARAMETER, 4, "Invalid parameter") \
48 X(PWM_ERR_NULL_POINTER, 5, "Null pointer") \
49 X(PWM_ERR_OUT_OF_MEMORY, 6, "Out of memory") \
50 /* Channel errors */ \
51 X(PWM_ERR_INVALID_CHANNEL, 7, "Invalid PWM channel") \
52 X(PWM_ERR_CHANNEL_BUSY, 8, "Channel already in use") \
53 X(PWM_ERR_CHANNEL_NOT_AVAILABLE, 9, "Channel not available") \
54 X(PWM_ERR_INSUFFICIENT_CHANNELS, 10, "Insufficient channels available") \
55 /* Frequency/timing errors */ \
56 X(PWM_ERR_INVALID_FREQUENCY, 11, "Invalid frequency") \
57 X(PWM_ERR_FREQUENCY_TOO_HIGH, 12, "Frequency too high") \
58 X(PWM_ERR_FREQUENCY_TOO_LOW, 13, "Frequency too low") \
59 X(PWM_ERR_RESOLUTION_NOT_SUPPORTED, 14, "Resolution not supported") \
60 /* Duty cycle errors */ \
61 X(PWM_ERR_INVALID_DUTY_CYCLE, 15, "Invalid duty cycle") \
62 X(PWM_ERR_DUTY_OUT_OF_RANGE, 16, "Duty cycle out of range") \
63 /* Hardware errors */ \
64 X(PWM_ERR_HARDWARE_FAULT, 17, "Hardware fault") \
65 X(PWM_ERR_TIMER_CONFLICT, 18, "Timer resource conflict") \
66 X(PWM_ERR_PIN_CONFLICT, 19, "Pin already in use") \
67 /* Communication errors (for external PWM ICs) */ \
68 X(PWM_ERR_COMMUNICATION_TIMEOUT, 20, "Communication timeout") \
69 X(PWM_ERR_COMMUNICATION_FAILURE, 21, "Communication failure") \
70 X(PWM_ERR_DEVICE_NOT_RESPONDING, 22, "Device not responding") \
71 X(PWM_ERR_INVALID_DEVICE_ID, 23, "Invalid device ID") \
72 X(PWM_ERR_UNSUPPORTED_OPERATION, 24, "Unsupported operation") \
73 X(PWM_ERR_UNKNOWN, 25, "Unknown error")
74
75// Generate enum class
76enum class hf_pwm_err_t : hf_u32_t {
77#define X(name, value, description) name = value,
79#undef X
80 PWM_ERR_COUNT // Total number of error codes
81};
82
88constexpr std::string_view HfPwmErrToString(hf_pwm_err_t err) noexcept {
89 switch (err) {
90#define X(NAME, VALUE, DESC) \
91 case hf_pwm_err_t::NAME: \
92 return DESC;
94#undef X
95 default:
97 }
98}
99
100//--------------------------------------
101// PWM Configuration Structures
102//--------------------------------------
103
122
138
139//--------------------------------------
140// Callback Types
141//--------------------------------------
142
148using hf_pwm_period_callback_t = void (*)(hf_channel_id_t channel_id, void* user_data);
149
157 void (*)(hf_channel_id_t channel_id, hf_pwm_err_t error, void* user_data);
158
159//--------------------------------------
160// Abstract Base Class
161//--------------------------------------
162
182class BasePwm {
183public:
184 //==============================================================================
185 // LIFECYCLE
186 //==============================================================================
187
188 virtual ~BasePwm() noexcept = default;
189
194 virtual hf_pwm_err_t Initialize() noexcept = 0;
195
200 virtual hf_pwm_err_t Deinitialize() noexcept = 0;
201
206 [[nodiscard]] bool IsInitialized() const noexcept {
207 return initialized_;
208 }
209
216 bool EnsureInitialized() noexcept {
217 if (!initialized_) {
219 }
220 return initialized_;
221 }
222
228 bool EnsureDeinitialized() noexcept {
229 if (initialized_) {
231 return !initialized_;
232 }
233 return true;
234 }
235 //==============================================================================
236 // CHANNEL MANAGEMENT
237 //==============================================================================
238
244 virtual hf_pwm_err_t EnableChannel(hf_channel_id_t channel_id) noexcept = 0;
245
251 virtual hf_pwm_err_t DisableChannel(hf_channel_id_t channel_id) noexcept = 0;
252
258 virtual bool IsChannelEnabled(hf_channel_id_t channel_id) const noexcept = 0;
259
260 //==============================================================================
261 // PWM CONTROL
262 //==============================================================================
263
270 virtual hf_pwm_err_t SetDutyCycle(hf_channel_id_t channel_id, float duty_cycle) noexcept = 0;
271
278 virtual hf_pwm_err_t SetDutyCycleRaw(hf_channel_id_t channel_id, hf_u32_t raw_value) noexcept = 0;
279
287 hf_frequency_hz_t frequency_hz) noexcept = 0;
288
296 float phase_shift_degrees) noexcept = 0;
297
298 //==============================================================================
299 // ADVANCED FEATURES
300 //==============================================================================
301
306 virtual hf_pwm_err_t StartAll() noexcept = 0;
307
312 virtual hf_pwm_err_t StopAll() noexcept = 0;
313
318 virtual hf_pwm_err_t UpdateAll() noexcept = 0;
319
328 hf_channel_id_t complementary_channel,
329 hf_u32_t deadtime_ns) noexcept = 0;
330
331 //==============================================================================
332 // STATUS AND INFORMATION
333 //==============================================================================
334
340 virtual float GetDutyCycle(hf_channel_id_t channel_id) const noexcept = 0;
341
347 virtual hf_frequency_hz_t GetFrequency(hf_channel_id_t channel_id) const noexcept = 0;
348
354 virtual hf_pwm_err_t GetStatistics(hf_pwm_statistics_t& statistics) const noexcept {
355 statistics = statistics_; // Return statistics by default
357 }
358
364 virtual hf_pwm_err_t GetDiagnostics(hf_pwm_diagnostics_t& diagnostics) const noexcept {
365 diagnostics = diagnostics_; // Return diagnostics by default
367 }
368
374 virtual hf_pwm_err_t ResetStatistics() noexcept {
375 statistics_ = hf_pwm_statistics_t{}; // Reset statistics to default values
377 }
378
384 virtual hf_pwm_err_t ResetDiagnostics() noexcept {
385 diagnostics_ = hf_pwm_diagnostics_t{}; // Reset diagnostics to default values
387 }
388
389 //==============================================================================
390 // UTILITY FUNCTIONS
391 //==============================================================================
392
399 static constexpr hf_u32_t DutyCycleToRaw(float duty_cycle, hf_u8_t resolution_bits) noexcept {
400 if (duty_cycle < 0.0f)
401 duty_cycle = 0.0f;
402 if (duty_cycle > 1.0f)
403 duty_cycle = 1.0f;
404 return static_cast<hf_u32_t>(duty_cycle * ((1U << resolution_bits) - 1));
405 }
406
413 static constexpr float RawToDutyCycle(hf_u32_t raw_value, hf_u8_t resolution_bits) noexcept {
414 hf_u32_t max_value = (1U << resolution_bits) - 1;
415 if (raw_value > max_value)
416 raw_value = max_value;
417 return static_cast<float>(raw_value) / static_cast<float>(max_value);
418 }
419
425 static constexpr bool IsValidDutyCycle(float duty_cycle) noexcept {
426 return (duty_cycle >= 0.0f && duty_cycle <= 1.0f);
427 }
428
436 static constexpr bool IsValidFrequency(hf_u32_t frequency_hz, hf_u32_t min_freq_hz,
437 hf_u32_t max_freq_hz) noexcept {
438 return (frequency_hz >= min_freq_hz && frequency_hz <= max_freq_hz);
439 }
440
447 static constexpr bool IsValidRawDuty(hf_u32_t raw_value, hf_u8_t resolution_bits) noexcept {
448 if (resolution_bits == 0 || resolution_bits > 16)
449 return false;
450 hf_u32_t max_value = (1U << resolution_bits) - 1;
451 return (raw_value <= max_value);
452 }
453
460 static constexpr float CalculateFrequencyAccuracy(hf_u32_t target_freq,
461 hf_u32_t actual_freq) noexcept {
462 if (target_freq == 0)
463 return 0.0f;
464 float diff = static_cast<float>(target_freq > actual_freq ? target_freq - actual_freq
465 : actual_freq - target_freq);
466 return 1.0f - (diff / static_cast<float>(target_freq));
467 }
468
474 static constexpr float ClampDutyCycle(float duty_cycle) noexcept {
475 if (duty_cycle < 0.0f)
476 return 0.0f;
477 if (duty_cycle > 1.0f)
478 return 1.0f;
479 return duty_cycle;
480 }
481
482protected:
483 BasePwm() noexcept : initialized_(false), statistics_{}, diagnostics_{} {}
484 BasePwm(const BasePwm&) = delete;
485 BasePwm& operator=(const BasePwm&) = delete;
486 BasePwm(BasePwm&&) = delete;
488
492};
void(*)(hf_channel_id_t channel_id, hf_pwm_err_t error, void *user_data) hf_pwm_fault_callback_t
Callback for PWM fault/error events.
Definition BasePwm.h:156
#define X(name, value, description)
Definition BasePwm.h:77
hf_pwm_err_t
Definition BasePwm.h:76
@ PWM_ERR_UNSUPPORTED_OPERATION
constexpr std::string_view HfPwmErrToString(hf_pwm_err_t err) noexcept
Convert PWM error code to string view.
Definition BasePwm.h:88
void(*)(hf_channel_id_t channel_id, void *user_data) hf_pwm_period_callback_t
Callback for PWM period complete events.
Definition BasePwm.h:148
Platform-agnostic hardware type definitions for the HardFOC system.
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
uint64_t hf_u64_t
Platform-agnostic 64-bit unsigned integer type.
Definition HardwareTypes.h:58
hf_u32_t hf_channel_id_t
Platform-agnostic channel identifier type.
Definition HardwareTypes.h:163
hf_u32_t hf_frequency_hz_t
Platform-agnostic frequency type (in Hz).
Definition HardwareTypes.h:145
Abstract base class for PWM implementations.
Definition BasePwm.h:182
virtual hf_pwm_err_t StartAll() noexcept=0
Start all enabled channels simultaneously.
virtual hf_pwm_err_t StopAll() noexcept=0
Stop all channels.
hf_pwm_diagnostics_t diagnostics_
PWM diagnostic information.
Definition BasePwm.h:491
static constexpr float CalculateFrequencyAccuracy(hf_u32_t target_freq, hf_u32_t actual_freq) noexcept
Calculate frequency accuracy percentage.
Definition BasePwm.h:460
static constexpr bool IsValidDutyCycle(float duty_cycle) noexcept
Validate duty cycle range.
Definition BasePwm.h:425
virtual hf_pwm_err_t SetDutyCycle(hf_channel_id_t channel_id, float duty_cycle) noexcept=0
Set duty cycle for a channel.
static constexpr float RawToDutyCycle(hf_u32_t raw_value, hf_u8_t resolution_bits) noexcept
Calculate duty cycle percentage from raw value.
Definition BasePwm.h:413
static constexpr bool IsValidRawDuty(hf_u32_t raw_value, hf_u8_t resolution_bits) noexcept
Validate raw duty value against resolution.
Definition BasePwm.h:447
virtual hf_pwm_err_t SetComplementaryOutput(hf_channel_id_t primary_channel, hf_channel_id_t complementary_channel, hf_u32_t deadtime_ns) noexcept=0
Set complementary output configuration (for motor control)
static constexpr hf_u32_t DutyCycleToRaw(float duty_cycle, hf_u8_t resolution_bits) noexcept
Calculate raw duty value from percentage.
Definition BasePwm.h:399
virtual hf_pwm_err_t Initialize() noexcept=0
Initialize the PWM system.
BasePwm & operator=(BasePwm &&)=delete
bool initialized_
Initialization state.
Definition BasePwm.h:489
static constexpr float ClampDutyCycle(float duty_cycle) noexcept
Clamp duty cycle to valid range.
Definition BasePwm.h:474
virtual ~BasePwm() noexcept=default
virtual hf_pwm_err_t GetDiagnostics(hf_pwm_diagnostics_t &diagnostics) const noexcept
Get PWM diagnostics.
Definition BasePwm.h:364
virtual hf_pwm_err_t GetStatistics(hf_pwm_statistics_t &statistics) const noexcept
Get PWM statistics.
Definition BasePwm.h:354
virtual float GetDutyCycle(hf_channel_id_t channel_id) const noexcept=0
Get current duty cycle for a channel.
virtual hf_pwm_err_t Deinitialize() noexcept=0
Deinitialize the PWM system.
virtual hf_pwm_err_t DisableChannel(hf_channel_id_t channel_id) noexcept=0
Disable a PWM channel.
bool EnsureDeinitialized() noexcept
Ensure PWM is deinitialized (lazy deinitialization pattern)
Definition BasePwm.h:228
BasePwm(BasePwm &&)=delete
virtual hf_frequency_hz_t GetFrequency(hf_channel_id_t channel_id) const noexcept=0
Get current frequency for a channel.
virtual hf_pwm_err_t UpdateAll() noexcept=0
Update all channel outputs simultaneously (for synchronized updates)
bool EnsureInitialized() noexcept
Ensure PWM is initialized (lazy initialization pattern)
Definition BasePwm.h:216
virtual hf_pwm_err_t SetDutyCycleRaw(hf_channel_id_t channel_id, hf_u32_t raw_value) noexcept=0
Set raw duty value for a channel.
BasePwm(const BasePwm &)=delete
bool IsInitialized() const noexcept
Check if PWM system is initialized.
Definition BasePwm.h:206
virtual hf_pwm_err_t ResetDiagnostics() noexcept
Reset PWM diagnostic information.
Definition BasePwm.h:384
BasePwm() noexcept
Definition BasePwm.h:483
virtual hf_pwm_err_t SetFrequency(hf_channel_id_t channel_id, hf_frequency_hz_t frequency_hz) noexcept=0
Set frequency for a channel.
virtual hf_pwm_err_t SetPhaseShift(hf_channel_id_t channel_id, float phase_shift_degrees) noexcept=0
Set phase shift for a channel (if supported)
hf_pwm_statistics_t statistics_
PWM operation statistics.
Definition BasePwm.h:490
virtual hf_pwm_err_t EnableChannel(hf_channel_id_t channel_id) noexcept=0
Enable a PWM channel.
virtual bool IsChannelEnabled(hf_channel_id_t channel_id) const noexcept=0
Check if a channel is enabled.
BasePwm & operator=(const BasePwm &)=delete
static constexpr bool IsValidFrequency(hf_u32_t frequency_hz, hf_u32_t min_freq_hz, hf_u32_t max_freq_hz) noexcept
Validate frequency range.
Definition BasePwm.h:436
virtual hf_pwm_err_t ResetStatistics() noexcept
Reset PWM operation statistics.
Definition BasePwm.h:374
#define HF_PWM_ERR_LIST(X)
HardFOC PWM error codes.
Definition BasePwm.h:40
PWM diagnostics information.
Definition BasePwm.h:126
hf_pwm_diagnostics_t() noexcept
Definition BasePwm.h:134
bool fade_functionality_ready
Hardware fade is ready.
Definition BasePwm.h:128
hf_u8_t active_timers
Number of active timers.
Definition BasePwm.h:130
bool hardware_initialized
Hardware is initialized.
Definition BasePwm.h:127
hf_u8_t active_channels
Number of active channels.
Definition BasePwm.h:129
hf_pwm_err_t last_global_error
Last global error.
Definition BasePwm.h:132
hf_u32_t system_uptime_ms
System uptime in milliseconds.
Definition BasePwm.h:131
PWM statistics information.
Definition BasePwm.h:107
hf_u32_t fade_operations_count
Total fade operations.
Definition BasePwm.h:110
hf_u32_t frequency_changes_count
Total frequency changes.
Definition BasePwm.h:109
hf_u64_t initialization_timestamp
Initialization timestamp.
Definition BasePwm.h:115
hf_u32_t error_count
Total error count.
Definition BasePwm.h:111
hf_pwm_statistics_t() noexcept
Definition BasePwm.h:117
hf_u64_t last_activity_timestamp
Last activity timestamp.
Definition BasePwm.h:114
hf_u32_t channel_disables_count
Total channel disable operations.
Definition BasePwm.h:113
hf_u32_t duty_updates_count
Total duty cycle updates.
Definition BasePwm.h:108
hf_u32_t channel_enables_count
Total channel enable operations.
Definition BasePwm.h:112