43#include "esp_twai_onchip.h"
44#include "freertos/FreeRTOS.h"
45#include "freertos/semphr.h"
269 uint32_t timeout_ms = 1000)
noexcept override;
301 void* user_data =
nullptr)
noexcept;
310 void* user_data =
nullptr)
noexcept;
315 void* user_data =
nullptr)
noexcept;
339 bool extended =
false)
noexcept override;
423 uint32_t timeout_ms = 1000)
noexcept;
438 const twai_rx_done_event_data_t* event_data,
439 void* user_ctx)
noexcept;
449 const twai_error_event_data_t* event_data,
450 void* user_ctx)
noexcept;
460 const twai_state_change_event_data_t* event_data,
461 void* user_ctx)
noexcept;
467 const twai_tx_done_event_data_t* event_data,
468 void* user_ctx)
noexcept;
481 twai_frame_t& twai_frame)
noexcept;
Abstract base class for CAN bus implementations in the HardFOC system.
void(*)(const hf_can_message_t &message) hf_can_receive_callback_t
CAN message receive callback function type.
Definition BaseCan.h:636
hf_can_err_t
Definition BaseCan.h:117
constexpr hf_u8_t HF_CAN_CLASSIC_MAX_LEN
Largest classic CAN payload in bytes.
Definition BaseCan.h:164
void(*)(const hf_can_message_t &message, void *user_data) hf_esp_can_receive_callback_t
User callback function types with user data support.
Definition EspCan.h:191
void(*)(const hf_esp_can_tx_info_t &tx_info, void *user_data) hf_esp_can_tx_callback_t
Definition EspCan.h:196
void(*)(const hf_esp_can_state_info_t &state_info, void *user_data) hf_esp_can_state_callback_t
Definition EspCan.h:195
hf_esp_can_rx_mode_t
Where EspCan delivers received frames.
Definition EspCan.h:68
@ QUEUE_ALWAYS
Every frame goes into the RX ring; a registered callback is also called.
void(*)(const hf_esp_can_error_info_t &error_info, void *user_data) hf_esp_can_error_callback_t
Definition EspCan.h:193
ESP32 CAN type definitions for hardware abstraction.
hf_can_operation_type_t
CAN operation types for statistics tracking.
Definition EspTypes_CAN.h:50
hf_can_controller_id_t
CAN controller ID for ESP32 family.
Definition EspTypes_CAN.h:33
@ HF_CAN_CONTROLLER_0
Primary CAN controller.
hf_can_mode_t
CAN operating mode mapping from ESP-IDF TWAI modes.
Definition EspTypes_CAN.h:41
@ HF_CAN_MODE_NORMAL
Normal operating mode.
hf_i32_t hf_pin_num_t
Platform-agnostic GPIO pin number type.
Definition HardwareTypes.h:99
Lock-free single-producer / single-consumer ring for ISR-to-task hand-off.
Centralized MCU platform selection and configuration header.
Abstract base class defining the unified CAN bus API.
Definition BaseCan.h:731
ESP32 CAN (TWAI) implementation using ESP-IDF v5.5+ node-based API.
Definition EspCan.h:220
hf_esp_can_state_callback_t state_cb_
Definition EspCan.h:580
void ClearErrorCallback() noexcept
Definition EspCan.cpp:429
uint32_t tx_slot_count_
number of slots
Definition EspCan.h:609
hf_can_err_t GetStatistics(hf_can_statistics_t &stats) noexcept override
Get detailed statistics.
Definition EspCan.cpp:578
SemaphoreHandle_t tx_slot_sem_
counts free slots
Definition EspCan.h:610
static bool InternalReceiveCallback(twai_node_handle_t handle, const twai_rx_done_event_data_t *event_data, void *user_ctx) noexcept
Internal receive event callback for ESP-IDF v5.5 event system.
Definition EspCan.cpp:874
hf_can_err_t SetAcceptanceFilter(uint32_t id, uint32_t mask, bool extended=false) noexcept override
Set acceptance filter for incoming messages.
Definition EspCan.cpp:551
hf_can_err_t SetReceiveCallback(hf_can_receive_callback_t callback) noexcept override
Set the BaseCan receive callback.
Definition EspCan.cpp:388
HfSpscRing< hf_can_message_t > rx_ring_
RX frames (producer: RX ISR)
Definition EspCan.h:596
std::atomic< uint8_t > bus_state_
last hf_can_bus_state_t from the ISR
Definition EspCan.h:615
static hf_can_err_t ConvertFromTwaiFrame(const twai_frame_t &twai_frame, hf_can_message_t &hf_message) noexcept
Convert ESP-IDF v5.5 TWAI frame to HF CAN message.
Definition EspCan.cpp:1012
hf_can_err_t Initialize() noexcept override
Initialize the TWAI node and allocate resources.
Definition EspCan.cpp:126
uint32_t SendMessageBatch(const hf_can_message_t *messages, uint32_t count, uint32_t timeout_ms=1000) noexcept
Send multiple messages in a batch for improved performance.
Definition EspCan.cpp:850
std::atomic< uint32_t > bus_off_count_
bus-off events
Definition EspCan.h:614
PlatformMutex rx_mutex_
Serialises ReceiveMessage() callers.
Definition EspCan.h:598
hf_can_statistics_t statistics_
Performance statistics.
Definition EspCan.h:587
hf_can_err_t ConfigureAdvancedTiming(const hf_esp_can_timing_config_t &timing_config) noexcept
Configure advanced bit timing parameters.
Definition EspCan.cpp:652
hf_can_err_t ConfigureAdvancedFilter(const hf_esp_can_filter_config_t &filter_config) noexcept
Configure hardware acceptance filter with advanced options.
Definition EspCan.cpp:711
void ClearTxCompleteCallback() noexcept
Definition EspCan.cpp:458
hf_can_err_t Reset() noexcept override
Reset the CAN controller.
Definition EspCan.cpp:515
hf_can_err_t SendMessage(const hf_can_message_t &message, uint32_t timeout_ms=1000) noexcept override
Queue a CAN message for transmission.
Definition EspCan.cpp:271
hf_esp_can_timing_config_t advanced_timing_
Advanced timing configuration.
Definition EspCan.h:591
static bool InternalErrorCallback(twai_node_handle_t handle, const twai_error_event_data_t *event_data, void *user_ctx) noexcept
Internal error event callback for comprehensive error handling.
Definition EspCan.cpp:932
hf_can_err_t SetStateChangeCallback(hf_esp_can_state_callback_t cb, void *user_data=nullptr) noexcept
Definition EspCan.cpp:435
hf_can_err_t GetBusStatus(hf_can_bus_status_t &status) noexcept override
Error state, TEC/REC, RX overruns, TX-queue-full and bus-off counters.
Definition EspCan.cpp:810
void * error_ud_
Definition EspCan.h:578
hf_can_err_t GetDiagnostics(hf_can_diagnostics_t &diagnostics) noexcept override
Get diagnostic information.
Definition EspCan.cpp:627
PlatformMutex config_mutex_
Configuration mutex.
Definition EspCan.h:564
void * state_ud_
Definition EspCan.h:581
hf_can_err_t InitiateBusRecovery() noexcept
Initiate bus recovery from bus-off state (same as RequestBusRecovery()).
Definition EspCan.cpp:772
hf_can_err_t RequestBusRecovery() noexcept override
Start bus-off recovery; returns without waiting (see BaseCan).
Definition EspCan.cpp:831
void DispatchErrorCallbacks(const hf_esp_can_error_info_t &error_info) noexcept
Dispatch error event to all registered error callbacks.
Definition EspCan.cpp:1164
void ClearReceiveCallback() noexcept override
Clear the BaseCan receive callback.
Definition EspCan.cpp:396
const hf_esp_can_config_t config_
TWAI node configuration.
Definition EspCan.h:557
hf_can_diagnostics_t diagnostics_
Diagnostic information.
Definition EspCan.h:588
static bool InternalTxDoneCallback(twai_node_handle_t handle, const twai_tx_done_event_data_t *event_data, void *user_ctx) noexcept
TX-done event (ISR): returns the frame's TX slot to the pool.
Definition EspCan.cpp:905
hf_can_err_t AllocateQueues() noexcept
Allocate the RX ring, TX slot pool and semaphores.
Definition EspCan.cpp:1123
hf_can_err_t SetTxCompleteCallback(hf_esp_can_tx_callback_t cb, void *user_data=nullptr) noexcept
Definition EspCan.cpp:450
SemaphoreHandle_t rx_sem_
Given by the RX ISR after a push.
Definition EspCan.h:597
twai_node_handle_t twai_node_handle_
Native TWAI node handle.
Definition EspCan.h:569
void ClearStateChangeCallback() noexcept
Definition EspCan.cpp:444
std::atomic< void * > receive_ud_
Definition EspCan.h:574
std::atomic< hf_esp_can_receive_callback_t > receive_cb_
Definition EspCan.h:573
hf_can_err_t ClearAcceptanceFilter() noexcept override
Clear all acceptance filters (accept all messages).
Definition EspCan.cpp:565
std::atomic< bool > is_enabled_
Node enabled state.
Definition EspCan.h:560
void UpdateErrorStatistics(uint32_t error_type) noexcept
Update error statistics from error event.
Definition EspCan.cpp:1184
std::atomic< bool > is_recovering_
Bus recovery state.
Definition EspCan.h:561
void ReleaseQueues() noexcept
Free what AllocateQueues() allocated.
Definition EspCan.cpp:1150
hf_can_err_t ResetStatistics() noexcept override
Reset statistics counters.
Definition EspCan.cpp:601
hf_can_err_t Deinitialize() noexcept override
Deinitialize the TWAI node and free resources.
Definition EspCan.cpp:224
std::unique_ptr< TxSlot[]> tx_slots_
slot pool (tx_queue_depth + 1)
Definition EspCan.h:608
hf_esp_can_tx_callback_t tx_cb_
Definition EspCan.h:583
hf_esp_can_filter_config_t current_filter_
Current filter configuration.
Definition EspCan.h:592
static bool InternalStateChangeCallback(twai_node_handle_t handle, const twai_state_change_event_data_t *event_data, void *user_ctx) noexcept
Internal state change callback for bus recovery monitoring.
Definition EspCan.cpp:948
~EspCan() noexcept override
Destructor - ensures proper cleanup and resource deallocation.
Definition EspCan.cpp:106
void RefreshBusState() noexcept
Read the controller error state into bus_state_ (task context).
Definition EspCan.cpp:1115
void UpdateStatistics(hf_can_operation_type_t operation_type, bool success) noexcept
Update statistics after an operation.
Definition EspCan.cpp:1050
hf_can_err_t SetReceiveCallbackEx(hf_esp_can_receive_callback_t cb, void *user_data=nullptr) noexcept
Definition EspCan.cpp:404
hf_can_err_t GetNodeInfo(twai_node_record_t &node_info) noexcept
Get detailed node information including error states.
Definition EspCan.cpp:835
void * tx_ud_
Definition EspCan.h:584
hf_can_err_t GetStatus(hf_can_status_t &status) noexcept override
Get current CAN bus status.
Definition EspCan.cpp:464
std::atomic< hf_can_receive_callback_t > base_receive_cb_
Definition EspCan.h:575
void DispatchStateChangeCallbacks(const hf_esp_can_state_info_t &state_info) noexcept
Dispatch state change to all registered state callbacks.
Definition EspCan.cpp:1170
bool filter_configured_
Filter configuration state.
Definition EspCan.h:593
hf_esp_can_error_callback_t error_cb_
Definition EspCan.h:577
hf_can_err_t ReceiveMessage(hf_can_message_t &message, uint32_t timeout_ms=0) noexcept override
Take the oldest frame from the RX ring.
Definition EspCan.cpp:362
hf_can_err_t ConvertEspError(esp_err_t esp_err) noexcept
Convert ESP-IDF error to HF error code.
Definition EspCan.cpp:1029
std::atomic< uint32_t > tx_queue_full_
sends refused for lack of a slot
Definition EspCan.h:613
bool DeliverReceivedFromIsr(const hf_can_message_t &message) noexcept
Deliver a received frame to the callbacks and/or the RX ring (ISR context).
Definition EspCan.cpp:1078
static hf_can_err_t ConvertToTwaiFrame(const hf_can_message_t &hf_message, twai_frame_t &twai_frame) noexcept
Convert HF CAN message to ESP-IDF v5.5 TWAI frame.
Definition EspCan.cpp:986
hf_can_err_t SetErrorCallback(hf_esp_can_error_callback_t cb, void *user_data=nullptr) noexcept
Definition EspCan.cpp:421
PlatformMutex stats_mutex_
Statistics mutex.
Definition EspCan.h:565
void ClearReceiveCallbackEx() noexcept
Definition EspCan.cpp:415
PlatformMutex callback_mutex_
Callback registry mutex.
Definition EspCan.h:566
void DispatchTxCompleteCallbacks(const hf_esp_can_tx_info_t &tx_info) noexcept
Dispatch transmission complete to all registered TX callbacks.
Definition EspCan.cpp:1176
Definition HfSpscRing.h:30
uint8_t buffer[HF_CAN_CLASSIC_MAX_LEN]
payload storage for that frame
Definition EspCan.h:605
twai_frame_t frame
frame handed to twai_node_transmit()
Definition EspCan.h:604
std::atomic< bool > in_use
slot owned by a queued frame
Definition EspCan.h:606
Error counters and queue statistics of one controller (BaseCan::GetBusStatus()).
Definition BaseCan.h:587
CAN diagnostics structure for detailed error analysis.
Definition BaseCan.h:694
Platform-agnostic CAN / CAN FD message (BaseCan v2).
Definition BaseCan.h:280
CAN bus statistics structure for performance monitoring.
Definition BaseCan.h:658
CAN bus status information structure.
Definition BaseCan.h:600
ESP32 TWAI node configuration structure for ESP-IDF v5.5.
Definition EspCan.h:80
bool enable_alerts
Enable alert monitoring.
Definition EspCan.h:106
uint32_t baud_rate
Target baud rate in bps.
Definition EspCan.h:86
uint32_t rx_queue_depth
RX ring depth for ReceiveMessage() (rounded up to a power of 2)
Definition EspCan.h:92
bool enable_listen_only
Enable listen-only mode.
Definition EspCan.h:104
bool no_receive_rtr
Filter out remote frames when using filters.
Definition EspCan.h:105
uint32_t sample_point_permill
Sample point in permille (750 = 75%)
Definition EspCan.h:87
hf_can_controller_id_t controller_id
Controller ID (0 for ESP32)
Definition EspCan.h:96
bool enable_self_test
Enable self-test mode (no ACK required)
Definition EspCan.h:102
int8_t fail_retry_cnt
Retry count (-1 = infinite, 0 = single shot)
Definition EspCan.h:98
hf_pin_num_t rx_pin
RX GPIO pin number.
Definition EspCan.h:83
uint8_t intr_priority
Interrupt priority (0-3)
Definition EspCan.h:99
bool enable_loopback
Enable loopback mode.
Definition EspCan.h:103
uint32_t secondary_sample_point
Secondary sample point for enhanced timing.
Definition EspCan.h:88
hf_esp_can_rx_mode_t rx_mode
Callback and/or RX ring delivery (see hf_esp_can_rx_mode_t)
Definition EspCan.h:93
uint32_t tx_queue_depth
Driver TX queue depth (frames waiting for the controller)
Definition EspCan.h:91
uint32_t clk_flags
Clock source flags for specific requirements.
Definition EspCan.h:109
hf_can_mode_t mode
Operating mode.
Definition EspCan.h:97
hf_esp_can_config_t() noexcept
Definition EspCan.h:111
hf_pin_num_t tx_pin
TX GPIO pin number.
Definition EspCan.h:82
Comprehensive error information structure for error callbacks.
Definition EspCan.h:160
bool bus_off_state
Bus-off state.
Definition EspCan.h:164
uint32_t rx_error_count
Receive error counter.
Definition EspCan.h:163
bool error_warning
Error warning state.
Definition EspCan.h:165
uint32_t error_type
ESP-IDF error type.
Definition EspCan.h:161
uint64_t timestamp_us
Error timestamp in microseconds.
Definition EspCan.h:167
bool error_passive
Error passive state.
Definition EspCan.h:166
uint32_t tx_error_count
Transmit error counter.
Definition EspCan.h:162
CAN message filter configuration for hardware filtering.
Definition EspCan.h:139
uint32_t id2
Second filter ID (for dual mode)
Definition EspCan.h:146
uint32_t mask
Filter mask (0 = don't care, 1 = must match)
Definition EspCan.h:141
hf_esp_can_filter_config_t() noexcept
Definition EspCan.h:149
uint32_t id
Filter ID.
Definition EspCan.h:140
uint32_t mask2
Second filter mask (for dual mode)
Definition EspCan.h:147
bool is_extended
true for 29-bit extended ID, false for 11-bit standard
Definition EspCan.h:142
bool is_dual_filter
Enable dual filter mode.
Definition EspCan.h:143
Bus state information for state change callbacks.
Definition EspCan.h:173
uint32_t previous_state
Previous bus state.
Definition EspCan.h:174
uint32_t current_state
Current bus state.
Definition EspCan.h:175
uint64_t timestamp_us
State change timestamp in microseconds.
Definition EspCan.h:176
Advanced bit timing configuration for fine-tuning.
Definition EspCan.h:124
uint32_t ssp_offset
Secondary sample point offset.
Definition EspCan.h:130
uint32_t sjw
Synchronization jump width.
Definition EspCan.h:129
uint32_t brp
Baud rate prescaler.
Definition EspCan.h:125
uint32_t tseg_2
Time segment 2 (after sample point)
Definition EspCan.h:128
uint32_t prop_seg
Propagation segment.
Definition EspCan.h:126
uint32_t tseg_1
Time segment 1 (before sample point)
Definition EspCan.h:127
hf_esp_can_timing_config_t() noexcept
Definition EspCan.h:132
Transmission completion information.
Definition EspCan.h:182
uint64_t timestamp_us
Transmission timestamp in microseconds.
Definition EspCan.h:185
bool success
Transmission success status.
Definition EspCan.h:184
hf_can_message_t message
Message that was transmitted.
Definition EspCan.h:183