HF Interface Wrapper 0.1.0-dev
Embedded C++ hardware abstraction layer
Loading...
Searching...
No Matches
BasePio.h
Go to the documentation of this file.
1
19#pragma once
20
21#include "HardwareTypes.h"
22#include <cstdint>
23#include <string_view>
24
30//--------------------------------------
31// HardFOC PIO Error Codes (Table)
32//--------------------------------------
41#define HF_PIO_ERR_LIST(X) \
42 /* Success codes */ \
43 X(PIO_SUCCESS, 0, "Success") \
44 /* General errors */ \
45 X(PIO_ERR_FAILURE, 1, "General failure") \
46 X(PIO_ERR_NOT_INITIALIZED, 2, "Not initialized") \
47 X(PIO_ERR_ALREADY_INITIALIZED, 3, "Already initialized") \
48 X(PIO_ERR_INVALID_PARAMETER, 4, "Invalid parameter") \
49 X(PIO_ERR_NULL_POINTER, 5, "Null pointer") \
50 X(PIO_ERR_OUT_OF_MEMORY, 6, "Out of memory") \
51 /* Channel errors */ \
52 X(PIO_ERR_INVALID_CHANNEL, 7, "Invalid PIO channel") \
53 X(PIO_ERR_CHANNEL_BUSY, 8, "Channel already in use") \
54 X(PIO_ERR_CHANNEL_NOT_AVAILABLE, 9, "Channel not available") \
55 X(PIO_ERR_INSUFFICIENT_CHANNELS, 10, "Insufficient channels available") \
56 /* Timing errors */ \
57 X(PIO_ERR_INVALID_RESOLUTION, 11, "Invalid time resolution") \
58 X(PIO_ERR_RESOLUTION_TOO_HIGH, 12, "Time resolution too high") \
59 X(PIO_ERR_RESOLUTION_TOO_LOW, 13, "Time resolution too low") \
60 X(PIO_ERR_DURATION_TOO_LONG, 14, "Duration too long") \
61 X(PIO_ERR_DURATION_TOO_SHORT, 15, "Duration too short") \
62 /* Buffer errors */ \
63 X(PIO_ERR_BUFFER_OVERFLOW, 16, "Buffer overflow") \
64 X(PIO_ERR_BUFFER_UNDERFLOW, 17, "Buffer underflow") \
65 X(PIO_ERR_BUFFER_TOO_SMALL, 18, "Buffer too small") \
66 X(PIO_ERR_BUFFER_TOO_LARGE, 19, "Buffer too large") \
67 /* Hardware errors */ \
68 X(PIO_ERR_HARDWARE_FAULT, 20, "Hardware fault") \
69 X(PIO_ERR_COMMUNICATION_TIMEOUT, 21, "Communication timeout") \
70 X(PIO_ERR_COMMUNICATION_FAILURE, 22, "Communication failure") \
71 X(PIO_ERR_DEVICE_NOT_RESPONDING, 23, "Device not responding") \
72 /* Configuration errors */ \
73 X(PIO_ERR_INVALID_CONFIGURATION, 24, "Invalid configuration") \
74 X(PIO_ERR_UNSUPPORTED_OPERATION, 25, "Unsupported operation") \
75 X(PIO_ERR_PIN_CONFLICT, 26, "Pin already in use") \
76 X(PIO_ERR_RESOURCE_BUSY, 27, "Resource busy") \
77 /* System errors */ \
78 X(PIO_ERR_SYSTEM_ERROR, 28, "System error") \
79 X(PIO_ERR_PERMISSION_DENIED, 29, "Permission denied") \
80 X(PIO_ERR_OPERATION_ABORTED, 30, "Operation aborted") \
81 X(PIO_ERR_UNKNOWN, 31, "Unknown error")
82
83enum class hf_pio_err_t : hf_u8_t {
84#define X(NAME, VALUE, DESC) NAME = VALUE,
86#undef X
87};
88
94constexpr std::string_view HfPioErrToString(hf_pio_err_t err) noexcept {
95 switch (err) {
96#define X(NAME, VALUE, DESC) \
97 case hf_pio_err_t::NAME: \
98 return DESC;
100#undef X
101 default:
103 }
104}
105
106//--------------------------------------
107// PIO Configuration Structures
108//--------------------------------------
109
114 Transmit = 0,
115 Receive = 1,
116 Bidirectional = 2
117};
118
123 Normal = 0,
124 Inverted = 1
125};
126
131 Low = 0,
132 High = 1
133};
134
152
158 bool level;
159
160 hf_pio_symbol_t() noexcept : duration(0), level(false) {}
161 hf_pio_symbol_t(hf_u32_t dur, bool lvl) noexcept : duration(dur), level(lvl) {}
162};
163
177
191
216
235
236//--------------------------------------
237// Callback Types
238//--------------------------------------
239
247 void(*)(hf_u8_t channel_id, size_t symbols_sent, void* user_data);
248
256using hf_pio_receive_callback_t = void(*)( hf_u8_t channel_id, const hf_pio_symbol_t* symbols, size_t symbol_count, void* user_data);
257
265 void(*)(hf_u8_t channel_id, hf_pio_err_t error, void* user_data);
266
267//--------------------------------------
268// Abstract Base Class
269//--------------------------------------
270
292class BasePio {
293public:
297 virtual ~BasePio() noexcept = default;
298
299 // Disable copy constructor and assignment operator for safety
300 BasePio(const BasePio&) = delete;
301 BasePio& operator=(const BasePio&) = delete;
302
303 // Allow move operations
304 BasePio(BasePio&&) noexcept = default;
305 BasePio& operator=(BasePio&&) noexcept = default;
306
307 //==============================================//
308 // PURE VIRTUAL FUNCTIONS - MUST BE OVERRIDDEN //
309 //==============================================//
310
315 virtual hf_pio_err_t Initialize() noexcept = 0;
316
321 virtual hf_pio_err_t Deinitialize() noexcept = 0;
322
327 [[nodiscard]] bool IsInitialized() const noexcept {
328 return initialized_;
329 }
330
335 bool EnsureInitialized() noexcept {
336 if (!initialized_) {
338 }
339 return initialized_;
340 }
341
346 bool EnsureDeinitialized() noexcept {
347 if (initialized_) {
349 return !initialized_;
350 }
351 return true;
352 }
353
361 const hf_pio_channel_config_t& config) noexcept = 0;
362
371 virtual hf_pio_err_t Transmit(hf_u8_t channel_id, const hf_pio_symbol_t* symbols,
372 size_t symbol_count, bool wait_completion = false) noexcept = 0;
373
382 virtual hf_pio_err_t StartReceive(hf_u8_t channel_id, hf_pio_symbol_t* buffer, size_t buffer_size,
383 hf_u32_t timeout_us = 0) noexcept = 0;
384
391 virtual hf_pio_err_t StopReceive(hf_u8_t channel_id, size_t& symbols_received) noexcept = 0;
392
398 virtual bool IsChannelBusy(hf_u8_t channel_id) const noexcept = 0;
399
407 hf_pio_channel_status_t& status) const noexcept = 0;
408
414 virtual hf_pio_err_t GetCapabilities(hf_pio_capabilities_t& capabilities) const noexcept = 0;
415
422 virtual void SetTransmitCallback(hf_u8_t channel_id, hf_pio_transmit_callback_t callback,
423 void* user_data = nullptr) noexcept = 0;
424
431 virtual void SetReceiveCallback(hf_u8_t channel_id, hf_pio_receive_callback_t callback,
432 void* user_data = nullptr) noexcept = 0;
433
440 virtual void SetErrorCallback(hf_u8_t channel_id, hf_pio_error_callback_t callback,
441 void* user_data = nullptr) noexcept = 0;
442
447 virtual void ClearChannelCallbacks(hf_u8_t channel_id) noexcept = 0;
448
452 virtual void ClearCallbacks() noexcept = 0;
453
454 //==============================================//
455 // STATISTICS AND DIAGNOSTICS
456 //==============================================//
457
463 virtual hf_pio_err_t ResetStatistics() noexcept {
464 statistics_ = hf_pio_statistics_t{}; // Reset statistics to default values
466 }
467
473 virtual hf_pio_err_t ResetDiagnostics() noexcept {
474 diagnostics_ = hf_pio_diagnostics_t{}; // Reset diagnostics to default values
476 }
477
485 hf_pio_statistics_t& statistics) const noexcept {
486 // This method needs to be implemented to return platform-specific statistics
488 }
489
497 hf_pio_diagnostics_t& diagnostics) const noexcept {
498 // This method needs to be implemented to return platform-specific diagnostics
500 }
501
502protected:
506 BasePio() noexcept : initialized_(false), statistics_{}, diagnostics_{} {}
507
514};
hf_pio_idle_state_t
PIO idle state.
Definition BasePio.h:130
@ Low
Idle state is low.
@ High
Idle state is high.
hf_pio_polarity_t
PIO signal polarity.
Definition BasePio.h:122
@ Normal
Normal polarity (idle low, active high)
@ Inverted
Inverted polarity (idle high, active low)
hf_pio_direction_t
PIO channel direction.
Definition BasePio.h:113
@ Receive
Receive mode (input)
@ Transmit
Transmit mode (output)
@ Bidirectional
Bidirectional mode (if supported)
#define X(NAME, VALUE, DESC)
Definition BasePio.h:84
void(*)( hf_u8_t channel_id, const hf_pio_symbol_t *symbols, size_t symbol_count, void *user_data) hf_pio_receive_callback_t
Callback for PIO reception complete events.
Definition BasePio.h:256
hf_pio_err_t
Definition BasePio.h:83
@ PIO_ERR_UNSUPPORTED_OPERATION
void(*)(hf_u8_t channel_id, hf_pio_err_t error, void *user_data) hf_pio_error_callback_t
Callback for PIO error events.
Definition BasePio.h:264
constexpr std::string_view HfPioErrToString(hf_pio_err_t err) noexcept
Convert hf_pio_err_t to human-readable string.
Definition BasePio.h:94
void(*)(hf_u8_t channel_id, size_t symbols_sent, void *user_data) hf_pio_transmit_callback_t
Callback for PIO transmission complete events.
Definition BasePio.h:246
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
hf_i32_t hf_pin_num_t
Platform-agnostic GPIO pin number type.
Definition HardwareTypes.h:99
Abstract base class for Programmable IO Channel implementations.
Definition BasePio.h:292
virtual hf_pio_err_t Transmit(hf_u8_t channel_id, const hf_pio_symbol_t *symbols, size_t symbol_count, bool wait_completion=false) noexcept=0
Transmit a sequence of symbols.
virtual hf_pio_err_t ConfigureChannel(hf_u8_t channel_id, const hf_pio_channel_config_t &config) noexcept=0
Configure a PIO channel.
bool EnsureInitialized() noexcept
Ensures that the PIO is initialized (lazy initialization).
Definition BasePio.h:335
virtual hf_pio_err_t StartReceive(hf_u8_t channel_id, hf_pio_symbol_t *buffer, size_t buffer_size, hf_u32_t timeout_us=0) noexcept=0
Start receiving symbols.
virtual void ClearCallbacks() noexcept=0
Clear all callbacks.
virtual hf_pio_err_t GetDiagnostics(hf_u8_t channel_id, hf_pio_diagnostics_t &diagnostics) const noexcept
Get PIO diagnostic information.
Definition BasePio.h:496
hf_pio_diagnostics_t diagnostics_
PIO diagnostic information.
Definition BasePio.h:513
hf_pio_statistics_t statistics_
PIO operation statistics.
Definition BasePio.h:512
virtual hf_pio_err_t StopReceive(hf_u8_t channel_id, size_t &symbols_received) noexcept=0
Stop receiving and get the number of symbols received.
bool EnsureDeinitialized() noexcept
Ensures that the PIO is deinitialized (lazy deinitialization).
Definition BasePio.h:346
virtual bool IsChannelBusy(hf_u8_t channel_id) const noexcept=0
Check if a channel is currently busy.
virtual ~BasePio() noexcept=default
Virtual destructor.
virtual hf_pio_err_t ResetDiagnostics() noexcept
Reset PIO diagnostic information.
Definition BasePio.h:473
virtual hf_pio_err_t GetChannelStatus(hf_u8_t channel_id, hf_pio_channel_status_t &status) const noexcept=0
Get channel status information.
bool initialized_
Initialization state tracking.
Definition BasePio.h:511
virtual void SetErrorCallback(hf_u8_t channel_id, hf_pio_error_callback_t callback, void *user_data=nullptr) noexcept=0
Set callback for error events.
virtual hf_pio_err_t Deinitialize() noexcept=0
Deinitialize the PIO peripheral.
bool IsInitialized() const noexcept
Check if the PIO is initialized.
Definition BasePio.h:327
virtual void SetReceiveCallback(hf_u8_t channel_id, hf_pio_receive_callback_t callback, void *user_data=nullptr) noexcept=0
Set callback for reception complete events.
virtual hf_pio_err_t ResetStatistics() noexcept
Reset PIO operation statistics.
Definition BasePio.h:463
virtual void SetTransmitCallback(hf_u8_t channel_id, hf_pio_transmit_callback_t callback, void *user_data=nullptr) noexcept=0
Set callback for transmission complete events.
virtual hf_pio_err_t GetCapabilities(hf_pio_capabilities_t &capabilities) const noexcept=0
Get PIO capabilities.
virtual hf_pio_err_t GetStatistics(hf_u8_t channel_id, hf_pio_statistics_t &statistics) const noexcept
Get PIO operation statistics.
Definition BasePio.h:484
virtual void ClearChannelCallbacks(hf_u8_t channel_id) noexcept=0
Clear all callbacks for a specific channel.
virtual hf_pio_err_t Initialize() noexcept=0
Initialize the PIO peripheral.
BasePio() noexcept
Protected constructor.
Definition BasePio.h:506
#define HF_PIO_ERR_LIST(X)
HardFOC PIO error codes.
Definition BasePio.h:41
PIO capability information.
Definition BasePio.h:181
bool supports_carrier
Supports carrier modulation.
Definition BasePio.h:189
size_t max_buffer_size
Maximum buffer size.
Definition BasePio.h:186
bool supports_bidirectional
Supports bidirectional mode.
Definition BasePio.h:187
hf_u8_t max_channels
Maximum number of channels.
Definition BasePio.h:182
hf_u32_t max_duration
Maximum single duration.
Definition BasePio.h:185
bool supports_loopback
Supports loopback mode.
Definition BasePio.h:188
hf_u32_t max_resolution_ns
Maximum time resolution.
Definition BasePio.h:184
hf_u32_t min_resolution_ns
Minimum time resolution.
Definition BasePio.h:183
PIO channel configuration structure.
Definition BasePio.h:138
hf_pio_idle_state_t idle_state
Idle state.
Definition BasePio.h:143
hf_pin_num_t gpio_pin
GPIO pin for PIO signal.
Definition BasePio.h:139
hf_pio_direction_t direction
Channel direction.
Definition BasePio.h:140
size_t buffer_size
Buffer size for symbols/durations.
Definition BasePio.h:145
hf_pio_channel_config_t() noexcept
Definition BasePio.h:147
hf_pio_polarity_t polarity
Signal polarity.
Definition BasePio.h:142
hf_u32_t resolution_ns
Time resolution in nanoseconds (user-friendly interface)
Definition BasePio.h:141
hf_u32_t timeout_us
Operation timeout in microseconds.
Definition BasePio.h:144
PIO channel status information.
Definition BasePio.h:167
bool is_receiving
Channel is receiving.
Definition BasePio.h:171
hf_u32_t timestamp_us
Timestamp of last operation.
Definition BasePio.h:175
bool is_busy
Channel is currently busy.
Definition BasePio.h:169
size_t symbols_queued
Number of symbols in queue.
Definition BasePio.h:172
bool is_transmitting
Channel is transmitting.
Definition BasePio.h:170
bool is_initialized
Channel is initialized.
Definition BasePio.h:168
size_t symbols_processed
Number of symbols processed.
Definition BasePio.h:173
hf_pio_err_t last_error
Last error that occurred.
Definition BasePio.h:174
PIO diagnostic information.
Definition BasePio.h:220
bool pioInitialized
PIO initialization status.
Definition BasePio.h:225
hf_u32_t lastErrorTimestamp
Last error timestamp.
Definition BasePio.h:223
bool pioHealthy
Overall PIO health status.
Definition BasePio.h:221
bool bidirectionalSupported
Bidirectional mode support.
Definition BasePio.h:228
hf_u8_t activeChannels
Number of active channels.
Definition BasePio.h:226
hf_pio_err_t lastErrorCode
Last error code.
Definition BasePio.h:222
hf_u32_t consecutiveErrors
Consecutive error count.
Definition BasePio.h:224
hf_pio_diagnostics_t()
Definition BasePio.h:230
hf_u32_t currentResolutionNs
Current time resolution.
Definition BasePio.h:227
PIO operation statistics.
Definition BasePio.h:195
hf_u32_t totalReceptions
Total receptions performed.
Definition BasePio.h:199
hf_u32_t symbolsTransmitted
Total symbols transmitted.
Definition BasePio.h:202
hf_u32_t bufferOverflows
Number of buffer overflows.
Definition BasePio.h:208
hf_u32_t averageTransmissionTimeUs
Average transmission time (microseconds)
Definition BasePio.h:204
hf_u32_t successfulTransmissions
Successful transmissions.
Definition BasePio.h:197
hf_u32_t minTransmissionTimeUs
Minimum transmission time.
Definition BasePio.h:206
hf_u32_t failedReceptions
Failed receptions.
Definition BasePio.h:201
hf_u32_t failedTransmissions
Failed transmissions.
Definition BasePio.h:198
hf_u32_t successfulReceptions
Successful receptions.
Definition BasePio.h:200
hf_u32_t timingErrors
Number of timing errors.
Definition BasePio.h:207
hf_u32_t symbolsReceived
Total symbols received.
Definition BasePio.h:203
hf_u32_t totalTransmissions
Total transmissions performed.
Definition BasePio.h:196
hf_u32_t maxTransmissionTimeUs
Maximum transmission time.
Definition BasePio.h:205
hf_pio_statistics_t()
Definition BasePio.h:210
PIO symbol structure for precise timing.
Definition BasePio.h:156
hf_pio_symbol_t() noexcept
Definition BasePio.h:160
bool level
Signal level (true = high, false = low)
Definition BasePio.h:158
hf_pio_symbol_t(hf_u32_t dur, bool lvl) noexcept
Definition BasePio.h:161
hf_u32_t duration
Duration in resolution units.
Definition BasePio.h:157