48#define HF_CAN_ERR_LIST(X) \
50 X(CAN_SUCCESS, 0, "Success") \
52 X(CAN_ERR_FAILURE, 1, "General failure") \
53 X(CAN_ERR_NOT_INITIALIZED, 2, "Not initialized") \
54 X(CAN_ERR_ALREADY_INITIALIZED, 3, "Already initialized") \
55 X(CAN_ERR_INVALID_PARAMETER, 4, "Invalid parameter") \
56 X(CAN_ERR_NULL_POINTER, 5, "Null pointer") \
57 X(CAN_ERR_OUT_OF_MEMORY, 6, "Out of memory") \
59 X(CAN_ERR_BUS_OFF, 7, "Bus off state") \
60 X(CAN_ERR_BUS_ERROR, 8, "Bus error") \
61 X(CAN_ERR_BUS_BUSY, 9, "Bus busy") \
62 X(CAN_ERR_BUS_NOT_AVAILABLE, 10, "Bus not available") \
63 X(CAN_ERR_BUS_RECOVERY_FAILED, 11, "Bus recovery failed") \
64 X(CAN_ERR_BUS_ARBITRATION_LOST, 12, "Bus arbitration lost") \
66 X(CAN_ERR_MESSAGE_TIMEOUT, 13, "Message timeout") \
67 X(CAN_ERR_MESSAGE_LOST, 14, "Message lost") \
68 X(CAN_ERR_MESSAGE_INVALID, 15, "Invalid message") \
69 X(CAN_ERR_MESSAGE_TOO_LONG, 16, "Message too long") \
70 X(CAN_ERR_MESSAGE_INVALID_ID, 17, "Invalid message ID") \
71 X(CAN_ERR_MESSAGE_INVALID_DLC, 18, "Invalid data length code") \
72 X(CAN_ERR_QUEUE_FULL, 19, "Queue full") \
73 X(CAN_ERR_QUEUE_EMPTY, 20, "Queue empty") \
75 X(CAN_ERR_TX_FAILED, 21, "Transmission failed") \
76 X(CAN_ERR_TX_ABORTED, 22, "Transmission aborted") \
77 X(CAN_ERR_TX_ERROR_PASSIVE, 23, "Transmit error passive") \
78 X(CAN_ERR_TX_ERROR_WARNING, 24, "Transmit error warning") \
80 X(CAN_ERR_RX_OVERRUN, 25, "Receive overrun") \
81 X(CAN_ERR_RX_ERROR_PASSIVE, 26, "Receive error passive") \
82 X(CAN_ERR_RX_ERROR_WARNING, 27, "Receive error warning") \
83 X(CAN_ERR_RX_FIFO_FULL, 28, "Receive FIFO full") \
85 X(CAN_ERR_HARDWARE_FAULT, 29, "Hardware fault") \
86 X(CAN_ERR_COMMUNICATION_FAILURE, 30, "Communication failure") \
87 X(CAN_ERR_DEVICE_NOT_RESPONDING, 31, "Device not responding") \
88 X(CAN_ERR_VOLTAGE_OUT_OF_RANGE, 32, "Voltage out of range") \
89 X(CAN_ERR_CLOCK_ERROR, 33, "Clock error") \
90 X(CAN_ERR_TRANSCEIVER_ERROR, 34, "Transceiver error") \
92 X(CAN_ERR_INVALID_CONFIGURATION, 35, "Invalid configuration") \
93 X(CAN_ERR_UNSUPPORTED_OPERATION, 36, "Unsupported operation") \
94 X(CAN_ERR_INVALID_BAUD_RATE, 37, "Invalid baud rate") \
95 X(CAN_ERR_INVALID_CONTROLLER_ID, 38, "Invalid controller ID") \
96 X(CAN_ERR_FILTER_ERROR, 39, "Filter error") \
97 X(CAN_ERR_FILTER_FULL, 40, "Filter table full") \
99 X(CAN_ERR_STUFF_ERROR, 41, "Bit stuffing error") \
100 X(CAN_ERR_FORM_ERROR, 42, "Frame format error") \
101 X(CAN_ERR_CRC_ERROR, 43, "CRC error") \
102 X(CAN_ERR_ACK_ERROR, 44, "Acknowledgment error") \
103 X(CAN_ERR_BIT_ERROR, 45, "Bit error") \
105 X(CAN_ERR_SYSTEM_ERROR, 46, "System error") \
106 X(CAN_ERR_PERMISSION_DENIED, 47, "Permission denied") \
107 X(CAN_ERR_OPERATION_ABORTED, 48, "Operation aborted") \
110 X(CAN_ERR_FAIL, 49, "Generic failure") \
111 X(CAN_ERR_RESOURCE_BUSY, 50, "Resource busy") \
112 X(CAN_ERR_INVALID_STATE, 51, "Invalid state") \
113 X(CAN_ERR_NOT_SUPPORTED, 52, "Not supported") \
114 X(CAN_ERR_TIMEOUT_ALT, 53, "Operation timeout") \
115 X(CAN_ERR_UNKNOWN, 54, "Unknown error")
118#define X(NAME, VALUE, DESC) NAME = VALUE,
130#define X(NAME, VALUE, DESC) \
131 case hf_can_err_t::NAME: \
286 return id <= 0x1FFFFFFF;
403 last_error_timestamp(0), controller_resets(0), bus_load_percentage(0),
404 bit_error_rate(0.0f) {}
445 bool EnsureInitialized() noexcept {
460 return !initialized_;
494 hf_u32_t timeout_ms = 1000) noexcept = 0;
503 hf_u32_t timeout_ms = 0) noexcept = 0;
520 bool extended = false) noexcept = 0;
543 virtual
void ClearReceiveCallback() noexcept {}
551 return SetAcceptanceFilter(0, 0,
false);
583 hf_u32_t timeout_ms = 1000) noexcept {
606 (void)nominal_prescaler;
609 (void)data_prescaler;
638 hf_u32_t timeout_ms = 1000) noexcept {
639 if (!messages || count == 0) {
644 for (
hf_u32_t i = 0; i < count; ++i) {
661 hf_u32_t timeout_ms = 100) noexcept {
662 if (!messages || max_count == 0) {
667 for (
hf_u32_t i = 0; i < max_count; ++i) {
674 return received_count;
688 statistics_.messages_sent.store(0);
689 statistics_.messages_received.store(0);
690 statistics_.bytes_transmitted.store(0);
691 statistics_.bytes_received.store(0);
692 statistics_.send_failures.store(0);
693 statistics_.receive_failures.store(0);
694 statistics_.bus_error_count.store(0);
695 statistics_.arbitration_lost_count.store(0);
696 statistics_.tx_failed_count.store(0);
697 statistics_.bus_off_events.store(0);
698 statistics_.error_warning_events.store(0);
699 statistics_.uptime_seconds.store(0);
700 statistics_.last_activity_timestamp.store(0);
702 statistics_.tx_queue_peak.store(0);
703 statistics_.rx_queue_peak.store(0);
704 statistics_.tx_queue_overflows.store(0);
705 statistics_.rx_queue_overflows.store(0);
727 statistics.messages_sent = statistics_.messages_sent.load();
728 statistics.messages_received = statistics_.messages_received.load();
729 statistics.bytes_transmitted = statistics_.bytes_transmitted.load();
730 statistics.bytes_received = statistics_.bytes_received.load();
731 statistics.send_failures = statistics_.send_failures.load();
732 statistics.receive_failures = statistics_.receive_failures.load();
733 statistics.bus_error_count = statistics_.bus_error_count.load();
734 statistics.arbitration_lost_count = statistics_.arbitration_lost_count.load();
735 statistics.tx_failed_count = statistics_.tx_failed_count.load();
736 statistics.bus_off_events = statistics_.bus_off_events.load();
737 statistics.error_warning_events = statistics_.error_warning_events.load();
738 statistics.uptime_seconds = statistics_.uptime_seconds.load();
739 statistics.last_activity_timestamp = statistics_.last_activity_timestamp.load();
740 statistics.last_error = statistics_.last_error.load();
741 statistics.tx_queue_peak = statistics_.tx_queue_peak.load();
742 statistics.rx_queue_peak = statistics_.rx_queue_peak.load();
743 statistics.tx_queue_overflows = statistics_.tx_queue_overflows.load();
744 statistics.rx_queue_overflows = statistics_.rx_queue_overflows.load();
755 diagnostics = diagnostics_;
763 BaseCan() noexcept : initialized_(false), statistics_{}, diagnostics_{} {}
constexpr std::string_view HfCanErrToString(hf_can_err_t err) noexcept
Convert hf_can_err_t to human-readable string.
Definition BaseCan.h:128
void(*)(const hf_can_message_t &message) hf_can_receive_callback_t
CAN message receive callback function type.
Definition BaseCan.h:333
#define X(NAME, VALUE, DESC)
Definition BaseCan.h:118
hf_can_err_t
Definition BaseCan.h:117
@ CAN_ERR_UNSUPPORTED_OPERATION
void(*)(const hf_can_message_t &message, const hf_can_reception_info_t &info) hf_can_fd_receive_callback_t
Definition BaseCan.h:347
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
constexpr hf_pin_num_t HF_INVALID_PIN
Invalid pin constant for unassigned or invalid pins.
Definition HardwareTypes.h:104
hf_i32_t hf_pin_num_t
Platform-agnostic GPIO pin number type.
Definition HardwareTypes.h:99
uint64_t hf_u64_t
Platform-agnostic 64-bit unsigned integer type.
Definition HardwareTypes.h:58
uint16_t hf_u16_t
Platform-agnostic 16-bit unsigned integer type.
Definition HardwareTypes.h:46
hf_u32_t hf_baud_rate_t
Platform-agnostic baud rate type.
Definition HardwareTypes.h:153
Abstract base class defining the unified CAN bus API.
Definition BaseCan.h:428
bool EnsureDeinitialized() noexcept
Ensures that the CAN bus is deinitialized.
Definition BaseCan.h:456
virtual hf_u32_t ReceiveMessageBatch(hf_can_message_t *messages, hf_u32_t max_count, hf_u32_t timeout_ms=100) noexcept
Receive multiple messages in a batch.
Definition BaseCan.h:660
virtual hf_can_err_t GetDiagnostics(hf_can_diagnostics_t &diagnostics) noexcept
Get CAN diagnostic information.
Definition BaseCan.h:754
BaseCan() noexcept
Protected constructor.
Definition BaseCan.h:763
bool IsInitialized() const noexcept
Checks if the class is initialized.
Definition BaseCan.h:467
hf_can_statistics_t statistics_
CAN operation statistics.
Definition BaseCan.h:770
virtual bool SetCanFDMode(bool enable, hf_u32_t data_baudrate=2000000, hf_u32_t timeout_ms=1000) noexcept
Enable or disable CAN-FD mode.
Definition BaseCan.h:582
virtual hf_can_err_t SetReceiveCallbackFD(hf_can_fd_receive_callback_t callback) noexcept
Set CAN-FD receive callback with enhanced information.
Definition BaseCan.h:560
virtual hf_can_err_t ClearAcceptanceFilter() noexcept
Clear all acceptance filters (accept all messages).
Definition BaseCan.h:550
virtual bool SupportsCanFD() const noexcept
Check if CAN-FD is supported by this controller.
Definition BaseCan.h:570
bool initialized_
Initialization status.
Definition BaseCan.h:769
virtual bool ConfigureCanFDTiming(hf_u16_t nominal_prescaler, hf_u8_t nominal_tseg1, hf_u8_t nominal_tseg2, hf_u16_t data_prescaler, hf_u8_t data_tseg1, hf_u8_t data_tseg2, hf_u8_t sjw=1) noexcept
Configure CAN-FD timing parameters.
Definition BaseCan.h:602
virtual hf_u32_t SendMessageBatch(const hf_can_message_t *messages, hf_u32_t count, hf_u32_t timeout_ms=1000) noexcept
Send multiple messages in a batch.
Definition BaseCan.h:637
hf_can_diagnostics_t diagnostics_
CAN diagnostic information.
Definition BaseCan.h:771
virtual hf_can_err_t ResetDiagnostics() noexcept
Reset CAN diagnostic information.
Definition BaseCan.h:714
virtual hf_can_err_t Initialize() noexcept=0
Initialize the CAN controller (must be implemented by derived classes).
virtual hf_can_err_t GetStatistics(hf_can_statistics_t &statistics) noexcept
Get CAN operation statistics.
Definition BaseCan.h:725
virtual ~BaseCan() noexcept=default
Virtual destructor ensures proper cleanup in derived classes.
virtual hf_can_err_t ResetStatistics() noexcept
Reset CAN operation statistics.
Definition BaseCan.h:686
virtual bool SetTransmitterDelayCompensation(hf_u8_t tdc_offset, hf_u8_t tdc_filter) noexcept
Set transmitter delay compensation (CAN-FD feature).
Definition BaseCan.h:623
#define HF_CAN_ERR_LIST(X)
HardFOC CAN error codes.
Definition BaseCan.h:48
Platform-agnostic CAN bus configuration.
Definition BaseCan.h:145
hf_u16_t tx_queue_size
TX queue size (implementation-dependent)
Definition BaseCan.h:151
hf_u16_t rx_queue_size
RX queue size (implementation-dependent)
Definition BaseCan.h:152
hf_pin_num_t rx_pin
CAN RX pin.
Definition BaseCan.h:147
bool silent_mode
Enable silent mode (listen-only)
Definition BaseCan.h:150
hf_can_config_t() noexcept
Definition BaseCan.h:154
bool loopback_mode
Enable loopback mode for testing.
Definition BaseCan.h:149
hf_baud_rate_t baudrate
CAN baudrate (bps)
Definition BaseCan.h:148
hf_pin_num_t tx_pin
CAN TX pin.
Definition BaseCan.h:146
CAN diagnostics structure for detailed error analysis.
Definition BaseCan.h:391
hf_u32_t tx_error_count
Transmit error counter.
Definition BaseCan.h:392
hf_u32_t rx_queue_peak
Peak RX queue usage.
Definition BaseCan.h:395
float bit_error_rate
Bit error rate (errors/bits)
Definition BaseCan.h:399
hf_u32_t rx_error_count
Receive error counter.
Definition BaseCan.h:393
hf_u32_t last_error_timestamp
Timestamp of last error.
Definition BaseCan.h:396
hf_u32_t tx_queue_peak
Peak TX queue usage.
Definition BaseCan.h:394
hf_u32_t controller_resets
Number of controller resets.
Definition BaseCan.h:397
hf_u32_t bus_load_percentage
Current bus load percentage.
Definition BaseCan.h:398
hf_can_diagnostics_t() noexcept
Definition BaseCan.h:401
Platform-agnostic CAN message structure.
Definition BaseCan.h:165
hf_u8_t GetEffectiveDLC() const noexcept
Get effective DLC for the current frame type.
Definition BaseCan.h:217
hf_u32_t id
Message ID (11 or 29-bit)
Definition BaseCan.h:167
hf_u64_t timestamp_us
Precise timestamp in microseconds.
Definition BaseCan.h:179
hf_u8_t error_count
Associated error count.
Definition BaseCan.h:183
hf_u8_t controller_id
Originating controller ID.
Definition BaseCan.h:181
void SetSingleShot() noexcept
Set single shot transmission.
Definition BaseCan.h:269
bool IsValidId() const noexcept
Validate message ID for current frame format.
Definition BaseCan.h:284
bool is_self
Self reception request flag.
Definition BaseCan.h:175
bool IsValidDLC(hf_u8_t dlc) const noexcept
Validate DLC for current frame type.
Definition BaseCan.h:209
bool is_rtr
Remote transmission request flag.
Definition BaseCan.h:173
hf_u8_t retry_count
Number of transmission retries.
Definition BaseCan.h:182
hf_can_message_t() noexcept
Definition BaseCan.h:191
constexpr hf_u8_t GetMaxDataLength() const noexcept
Get maximum data length for current frame type.
Definition BaseCan.h:200
hf_u8_t dlc
Data length code (0-8 for classic CAN)
Definition BaseCan.h:168
void SetStandardFrame() noexcept
Set standard frame format (11-bit ID)
Definition BaseCan.h:241
bool is_canfd
CAN-FD frame flag.
Definition BaseCan.h:186
void SetDataFrame() noexcept
Set data frame (not remote)
Definition BaseCan.h:255
bool is_ss
Single shot flag (no retransmission)
Definition BaseCan.h:174
hf_u8_t data[8]
Message data (max 8 bytes for classic CAN)
Definition BaseCan.h:169
bool dlc_non_comp
DLC is non-compliant (> 8 for classic CAN)
Definition BaseCan.h:176
bool is_extended
Extended ID flag (29-bit vs 11-bit)
Definition BaseCan.h:172
void SetExtendedFrame() noexcept
Set extended frame format (29-bit ID)
Definition BaseCan.h:248
bool is_brs
Bit Rate Switching flag (CAN-FD)
Definition BaseCan.h:187
bool is_esi
Error State Indicator flag (CAN-FD)
Definition BaseCan.h:188
void SetSelfReception() noexcept
Set self reception request.
Definition BaseCan.h:276
hf_u8_t canfd_dlc
CAN-FD DLC (can be > 8)
Definition BaseCan.h:189
hf_u32_t sequence_number
Message sequence number.
Definition BaseCan.h:180
void SetRemoteFrame() noexcept
Set remote frame.
Definition BaseCan.h:262
bool SetDLC(hf_u8_t dlc) noexcept
Set data length code for current frame type.
Definition BaseCan.h:226
CAN-FD specific receive callback with enhanced information.
Definition BaseCan.h:340
bool data_phase_error
Error occurred in data phase.
Definition BaseCan.h:343
float bit_timing_tolerance
Measured bit timing tolerance.
Definition BaseCan.h:345
bool arbitration_lost
Arbitration was lost during transmission.
Definition BaseCan.h:344
hf_u32_t timestamp_us
Reception timestamp in microseconds.
Definition BaseCan.h:341
hf_u8_t rx_fifo_level
RX FIFO level when received.
Definition BaseCan.h:342
CAN bus statistics structure for performance monitoring.
Definition BaseCan.h:355
std::atomic< hf_u32_t > tx_queue_overflows
TX queue overflow count.
Definition BaseCan.h:379
std::atomic< hf_u64_t > bytes_received
Total bytes received.
Definition BaseCan.h:360
std::atomic< hf_u64_t > messages_sent
Total messages successfully sent.
Definition BaseCan.h:357
std::atomic< hf_u32_t > bus_error_count
Total bus errors.
Definition BaseCan.h:365
std::atomic< hf_u32_t > error_warning_events
Error warning events.
Definition BaseCan.h:369
std::atomic< hf_u32_t > arbitration_lost_count
Arbitration lost events.
Definition BaseCan.h:366
std::atomic< hf_u32_t > rx_queue_overflows
RX queue overflow count.
Definition BaseCan.h:380
std::atomic< hf_u32_t > send_failures
Failed send operations.
Definition BaseCan.h:363
std::atomic< hf_u64_t > bytes_transmitted
Total bytes transmitted.
Definition BaseCan.h:359
std::atomic< hf_u32_t > rx_queue_peak
Peak RX queue usage.
Definition BaseCan.h:378
std::atomic< hf_u32_t > last_activity_timestamp
Last activity timestamp.
Definition BaseCan.h:373
std::atomic< hf_u32_t > tx_failed_count
Transmission failures.
Definition BaseCan.h:367
std::atomic< hf_u64_t > uptime_seconds
Total uptime in seconds.
Definition BaseCan.h:372
std::atomic< hf_can_err_t > last_error
Last error encountered.
Definition BaseCan.h:374
hf_can_statistics_t() noexcept=default
std::atomic< hf_u32_t > tx_queue_peak
Peak TX queue usage.
Definition BaseCan.h:377
std::atomic< hf_u32_t > receive_failures
Failed receive operations.
Definition BaseCan.h:364
std::atomic< hf_u64_t > messages_received
Total messages successfully received.
Definition BaseCan.h:358
std::atomic< hf_u32_t > bus_off_events
Bus-off occurrences.
Definition BaseCan.h:368
CAN bus status information structure.
Definition BaseCan.h:297
hf_u32_t crc_errors
CRC errors.
Definition BaseCan.h:317
bool error_warning
Error warning state.
Definition BaseCan.h:303
hf_u32_t rx_missed_count
Missed reception count.
Definition BaseCan.h:301
hf_u32_t ack_errors
Acknowledgment errors.
Definition BaseCan.h:319
hf_u32_t data_baudrate
Data bit rate (data phase for CAN-FD)
Definition BaseCan.h:310
hf_u32_t tx_error_count
Transmit error counter.
Definition BaseCan.h:298
bool error_passive
Error passive state.
Definition BaseCan.h:304
hf_u32_t canfd_tx_count
Number of CAN-FD frames transmitted.
Definition BaseCan.h:311
hf_u32_t form_errors
CAN-FD form errors.
Definition BaseCan.h:315
hf_u32_t nominal_baudrate
Nominal bit rate (arbitration phase)
Definition BaseCan.h:309
hf_u32_t brs_rx_count
Number of BRS frames received.
Definition BaseCan.h:314
bool bus_off
Bus-off state.
Definition BaseCan.h:302
hf_u32_t canfd_rx_count
Number of CAN-FD frames received.
Definition BaseCan.h:312
hf_u32_t brs_tx_count
Number of BRS frames transmitted.
Definition BaseCan.h:313
hf_u32_t bit_errors
Bit errors.
Definition BaseCan.h:318
hf_u32_t tx_failed_count
Failed transmission count.
Definition BaseCan.h:300
bool canfd_brs_enabled
Bit Rate Switching is enabled.
Definition BaseCan.h:308
hf_u32_t stuff_errors
Stuff errors.
Definition BaseCan.h:316
bool canfd_enabled
CAN-FD mode is active.
Definition BaseCan.h:307
hf_u32_t rx_error_count
Receive error counter.
Definition BaseCan.h:299
hf_can_status_t() noexcept
Definition BaseCan.h:321