HF Interface Wrapper 0.1.0-dev
Embedded C++ hardware abstraction layer
Loading...
Searching...
No Matches
EspCan.h
Go to the documentation of this file.
1
32#pragma once
33
34#include "McuSelect.h"
35
36// ESP-IDF C headers must be wrapped in extern "C" for C++ compatibility
37#ifdef __cplusplus
38extern "C" {
39#endif
40
41// ESP-IDF v5.5 TWAI node-based API
42#include "esp_twai.h"
43#include "esp_twai_onchip.h"
44
45#ifdef __cplusplus
46}
47#endif
48
49#include "BaseCan.h"
50#include "PlatformMutex.h"
51#include "utils/EspTypes_CAN.h"
52
53#include <atomic>
54#include <memory>
55
56//==============================================================================
57// ESP32 TWAI NODE CONFIGURATION (ESP-IDF v5.5)
58//==============================================================================
59
65 // Core GPIO configuration
68
69 // Timing configuration
70 uint32_t baud_rate;
73
74 // Queue configuration
75 uint32_t tx_queue_depth;
76 uint32_t rx_queue_depth;
77
78 // Node behavior configuration
82 uint8_t intr_priority;
83
84 // Advanced features
90
91 // Clock source configuration
92 uint32_t clk_flags;
93
101};
102
107 uint32_t brp;
108 uint32_t prop_seg;
109 uint32_t tseg_1;
110 uint32_t tseg_2;
111 uint32_t sjw;
112 uint32_t ssp_offset;
113
115 : brp(8), prop_seg(10), tseg_1(4), tseg_2(5), sjw(3), ssp_offset(0) {}
116};
117
122 uint32_t id;
123 uint32_t mask;
126
127 // Dual filter configuration (when is_dual_filter = true)
128 uint32_t id2;
129 uint32_t mask2;
130
132 : id(0), mask(0), is_extended(false), is_dual_filter(false), id2(0), mask2(0) {}
133};
134
135//==============================================================================
136// ENHANCED USER CALLBACK SYSTEM
137//==============================================================================
138
151
160
169
174 void (*)(const hf_can_message_t& message, void* user_data);
176 void (*)(const hf_esp_can_error_info_t& error_info, void* user_data);
178 void (*)(const hf_esp_can_state_info_t& state_info, void* user_data);
180 void (*)(const hf_esp_can_tx_info_t& tx_info, void* user_data);
181
204class EspCan : public BaseCan {
205public:
206 //==============================================//
207 // CONSTRUCTOR AND DESTRUCTOR
208 //==============================================//
209
216 explicit EspCan(const hf_esp_can_config_t& config) noexcept;
217
221 ~EspCan() noexcept override;
222
223 //==============================================//
224 // CORE CAN OPERATIONS (From BaseCan interface)
225 //==============================================//
226
232 hf_can_err_t Initialize() noexcept override;
233
239 hf_can_err_t Deinitialize() noexcept override;
240
248 uint32_t timeout_ms = 1000) noexcept override;
249
257 hf_can_err_t ReceiveMessage(hf_can_message_t& message, uint32_t timeout_ms = 0) noexcept override;
258
266
270 void ClearReceiveCallback() noexcept override;
271
272 //==============================================//
273 // SINGLE-CALLBACK PER EVENT MANAGEMENT
274 //==============================================//
275
276 // Receive
278 void* user_data = nullptr) noexcept;
279 void ClearReceiveCallbackEx() noexcept;
280
281 // Error
282 hf_can_err_t SetErrorCallback(hf_esp_can_error_callback_t cb, void* user_data = nullptr) noexcept;
283 void ClearErrorCallback() noexcept;
284
285 // State change
287 void* user_data = nullptr) noexcept;
288 void ClearStateChangeCallback() noexcept;
289
290 // TX complete
292 void* user_data = nullptr) noexcept;
293 void ClearTxCompleteCallback() noexcept;
294
300 hf_can_err_t GetStatus(hf_can_status_t& status) noexcept override;
301
306 hf_can_err_t Reset() noexcept override;
307
315 hf_can_err_t SetAcceptanceFilter(uint32_t id, uint32_t mask,
316 bool extended = false) noexcept override;
317
322 hf_can_err_t ClearAcceptanceFilter() noexcept override;
323
324 //==============================================//
325 // STATISTICS AND DIAGNOSTICS (From BaseCan)
326 //==============================================//
327
333 hf_can_err_t GetStatistics(hf_can_statistics_t& stats) noexcept override;
334
339 hf_can_err_t ResetStatistics() noexcept override;
340
346 hf_can_err_t GetDiagnostics(hf_can_diagnostics_t& diagnostics) noexcept override;
347
348 //==============================================//
349 // ESP-IDF v5.5 SPECIFIC ADVANCED FEATURES
350 //==============================================//
351
358
365
371
377 hf_can_err_t GetNodeInfo(twai_node_record_t& node_info) noexcept;
378
386 uint32_t SendMessageBatch(const hf_can_message_t* messages, uint32_t count,
387 uint32_t timeout_ms = 1000) noexcept;
388
389private:
390 //==============================================//
391 // INTERNAL EVENT CALLBACKS (ESP-IDF v5.5)
392 //==============================================//
393
401 static bool InternalReceiveCallback(twai_node_handle_t handle,
402 const twai_rx_done_event_data_t* event_data,
403 void* user_ctx) noexcept;
404
412 static bool InternalErrorCallback(twai_node_handle_t handle,
413 const twai_error_event_data_t* event_data,
414 void* user_ctx) noexcept;
415
423 static bool InternalStateChangeCallback(twai_node_handle_t handle,
424 const twai_state_change_event_data_t* event_data,
425 void* user_ctx) noexcept;
426
427 //==============================================//
428 // INTERNAL HELPER METHODS
429 //==============================================//
430
438 twai_frame_t& twai_frame) noexcept;
439
446 hf_can_err_t ConvertFromTwaiFrame(const twai_frame_t& twai_frame,
447 hf_can_message_t& hf_message) noexcept;
448
454 hf_can_err_t ConvertEspError(esp_err_t esp_err) noexcept;
455
461 void UpdateStatistics(hf_can_operation_type_t operation_type, bool success) noexcept;
462
467 void ProcessReceivedMessage(const twai_frame_t& frame) noexcept;
468
473 void UpdateErrorStatistics(uint32_t error_type) noexcept;
474
475 //==============================================//
476 // CALLBACK DISPATCH HELPERS
477 //==============================================//
478
483 void DispatchReceiveCallbacks(const twai_frame_t& frame) noexcept;
484
489 void DispatchErrorCallbacks(const hf_esp_can_error_info_t& error_info) noexcept;
490
495 void DispatchStateChangeCallbacks(const hf_esp_can_state_info_t& state_info) noexcept;
496
501 void DispatchTxCompleteCallbacks(const hf_esp_can_tx_info_t& tx_info) noexcept;
502
503 // (no registry helpers in single-callback design)
504
505 //==============================================//
506 // MEMBER VARIABLES (ESP-IDF v5.5 Compatible)
507 //==============================================//
508
509 // Configuration (centralized)
511
512 // State flags (atomic)
513 std::atomic<bool> is_enabled_;
514 std::atomic<bool> is_recovering_;
515
516 // Thread safety (PlatformMutex)
520
521 // ESP-IDF v5.5 TWAI node handle
522 twai_node_handle_t twai_node_handle_;
523
524 // Single callbacks + user data per event type
526 void* receive_ud_ = nullptr;
527
529 void* error_ud_ = nullptr;
530
532 void* state_ud_ = nullptr;
533
535 void* tx_ud_ = nullptr;
536
537 // Statistics and diagnostics
540
541 // Advanced features
545};
546
547//==============================================//
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:333
hf_can_err_t
Definition BaseCan.h:117
void(*)(const hf_esp_can_error_info_t &error_info, void *user_data) hf_esp_can_error_callback_t
Definition EspCan.h:175
void(*)(const hf_esp_can_state_info_t &state_info, void *user_data) hf_esp_can_state_callback_t
Definition EspCan.h:177
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:173
void(*)(const hf_esp_can_tx_info_t &tx_info, void *user_data) hf_esp_can_tx_callback_t
Definition EspCan.h:179
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
Centralized MCU platform selection and configuration header.
Cross-platform RTOS mutex and synchronization primitives.
Abstract base class defining the unified CAN bus API.
Definition BaseCan.h:428
ESP32 CAN (TWAI) implementation using ESP-IDF v5.5+ node-based API.
Definition EspCan.h:204
hf_esp_can_state_callback_t state_cb_
Definition EspCan.h:531
hf_esp_can_receive_callback_t receive_cb_
Definition EspCan.h:525
void ClearErrorCallback() noexcept
Definition EspCan.cpp:333
hf_can_err_t GetStatistics(hf_can_statistics_t &stats) noexcept override
Get detailed statistics.
Definition EspCan.cpp:500
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:766
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:473
hf_can_err_t SetReceiveCallback(hf_can_receive_callback_t callback) noexcept override
Set callback for received messages (legacy support removed - use RegisterReceiveCallback).
Definition EspCan.cpp:296
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:876
hf_can_err_t Initialize() noexcept override
Initialize the TWAI node and allocate resources.
Definition EspCan.cpp:87
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:742
hf_can_statistics_t statistics_
Performance statistics.
Definition EspCan.h:538
hf_can_err_t ConfigureAdvancedTiming(const hf_esp_can_timing_config_t &timing_config) noexcept
Configure advanced bit timing parameters.
Definition EspCan.cpp:571
void * receive_ud_
Definition EspCan.h:526
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:629
void ClearTxCompleteCallback() noexcept
Definition EspCan.cpp:362
hf_can_err_t Reset() noexcept override
Reset the CAN controller.
Definition EspCan.cpp:419
hf_can_err_t SendMessage(const hf_can_message_t &message, uint32_t timeout_ms=1000) noexcept override
Send a CAN message.
Definition EspCan.cpp:210
hf_esp_can_timing_config_t advanced_timing_
Advanced timing configuration.
Definition EspCan.h:542
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:803
hf_can_err_t SetStateChangeCallback(hf_esp_can_state_callback_t cb, void *user_data=nullptr) noexcept
Definition EspCan.cpp:339
void * error_ud_
Definition EspCan.h:529
hf_can_err_t GetDiagnostics(hf_can_diagnostics_t &diagnostics) noexcept override
Get diagnostic information.
Definition EspCan.cpp:546
void ProcessReceivedMessage(const twai_frame_t &frame) noexcept
Process received message through callback system.
Definition EspCan.cpp:947
PlatformMutex config_mutex_
Configuration mutex.
Definition EspCan.h:517
void * state_ud_
Definition EspCan.h:532
hf_can_err_t InitiateBusRecovery() noexcept
Initiate bus recovery from bus-off state.
Definition EspCan.cpp:689
void DispatchErrorCallbacks(const hf_esp_can_error_info_t &error_info) noexcept
Dispatch error event to all registered error callbacks.
Definition EspCan.cpp:965
void ClearReceiveCallback() noexcept override
Clear the receive callback (legacy support removed - use UnregisterCallback).
Definition EspCan.cpp:301
const hf_esp_can_config_t config_
TWAI node configuration.
Definition EspCan.h:510
hf_can_diagnostics_t diagnostics_
Diagnostic information.
Definition EspCan.h:539
hf_can_err_t SetTxCompleteCallback(hf_esp_can_tx_callback_t cb, void *user_data=nullptr) noexcept
Definition EspCan.cpp:354
twai_node_handle_t twai_node_handle_
Native TWAI node handle.
Definition EspCan.h:522
void ClearStateChangeCallback() noexcept
Definition EspCan.cpp:348
hf_can_err_t ClearAcceptanceFilter() noexcept override
Clear all acceptance filters (accept all messages).
Definition EspCan.cpp:487
std::atomic< bool > is_enabled_
Node enabled state.
Definition EspCan.h:513
void UpdateErrorStatistics(uint32_t error_type) noexcept
Update error statistics from error event.
Definition EspCan.cpp:985
std::atomic< bool > is_recovering_
Bus recovery state.
Definition EspCan.h:514
hf_can_err_t ResetStatistics() noexcept override
Reset statistics counters.
Definition EspCan.cpp:523
hf_can_err_t Deinitialize() noexcept override
Deinitialize the TWAI node and free resources.
Definition EspCan.cpp:168
hf_esp_can_tx_callback_t tx_cb_
Definition EspCan.h:534
hf_esp_can_filter_config_t current_filter_
Current filter configuration.
Definition EspCan.h:543
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:819
~EspCan() noexcept override
Destructor - ensures proper cleanup and resource deallocation.
Definition EspCan.cpp:67
void UpdateStatistics(hf_can_operation_type_t operation_type, bool success) noexcept
Update statistics after an operation.
Definition EspCan.cpp:919
hf_can_err_t SetReceiveCallbackEx(hf_esp_can_receive_callback_t cb, void *user_data=nullptr) noexcept
Definition EspCan.cpp:310
hf_can_err_t GetNodeInfo(twai_node_record_t &node_info) noexcept
Get detailed node information including error states.
Definition EspCan.cpp:727
void * tx_ud_
Definition EspCan.h:535
hf_can_err_t GetStatus(hf_can_status_t &status) noexcept override
Get current CAN bus status.
Definition EspCan.cpp:368
void DispatchStateChangeCallbacks(const hf_esp_can_state_info_t &state_info) noexcept
Dispatch state change to all registered state callbacks.
Definition EspCan.cpp:971
bool filter_configured_
Filter configuration state.
Definition EspCan.h:544
EspCan(const hf_esp_can_config_t &config) noexcept
Constructor with TWAI node configuration.
Definition EspCan.cpp:55
hf_esp_can_error_callback_t error_cb_
Definition EspCan.h:528
hf_can_err_t ReceiveMessage(hf_can_message_t &message, uint32_t timeout_ms=0) noexcept override
Receive a CAN message (legacy polling interface).
Definition EspCan.cpp:282
hf_can_err_t ConvertEspError(esp_err_t esp_err) noexcept
Convert ESP-IDF error to HF error code.
Definition EspCan.cpp:898
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:850
hf_can_err_t SetErrorCallback(hf_esp_can_error_callback_t cb, void *user_data=nullptr) noexcept
Definition EspCan.cpp:325
void DispatchReceiveCallbacks(const twai_frame_t &frame) noexcept
Dispatch message to all registered receive callbacks.
Definition EspCan.cpp:952
PlatformMutex stats_mutex_
Statistics mutex.
Definition EspCan.h:518
void ClearReceiveCallbackEx() noexcept
Definition EspCan.cpp:319
PlatformMutex callback_mutex_
Callback registry mutex.
Definition EspCan.h:519
void DispatchTxCompleteCallbacks(const hf_esp_can_tx_info_t &tx_info) noexcept
Dispatch transmission complete to all registered TX callbacks.
Definition EspCan.cpp:977
Definition PlatformMutex.h:78
CAN diagnostics structure for detailed error analysis.
Definition BaseCan.h:391
Platform-agnostic CAN message structure.
Definition BaseCan.h:165
CAN bus statistics structure for performance monitoring.
Definition BaseCan.h:355
CAN bus status information structure.
Definition BaseCan.h:297
ESP32 TWAI node configuration structure for ESP-IDF v5.5.
Definition EspCan.h:64
bool enable_alerts
Enable alert monitoring.
Definition EspCan.h:89
uint32_t baud_rate
Target baud rate in bps.
Definition EspCan.h:70
uint32_t rx_queue_depth
Receive queue depth (internal)
Definition EspCan.h:76
bool enable_listen_only
Enable listen-only mode.
Definition EspCan.h:87
bool no_receive_rtr
Filter out remote frames when using filters.
Definition EspCan.h:88
uint32_t sample_point_permill
Sample point in permille (750 = 75%)
Definition EspCan.h:71
hf_can_controller_id_t controller_id
Controller ID (0 for ESP32-C6)
Definition EspCan.h:79
bool enable_self_test
Enable self-test mode (no ACK required)
Definition EspCan.h:85
int8_t fail_retry_cnt
Retry count (-1 = infinite, 0 = single shot)
Definition EspCan.h:81
hf_pin_num_t rx_pin
RX GPIO pin number.
Definition EspCan.h:67
uint8_t intr_priority
Interrupt priority (0-3)
Definition EspCan.h:82
bool enable_loopback
Enable loopback mode.
Definition EspCan.h:86
uint32_t secondary_sample_point
Secondary sample point for enhanced timing.
Definition EspCan.h:72
uint32_t tx_queue_depth
Transmit queue depth.
Definition EspCan.h:75
uint32_t clk_flags
Clock source flags for specific requirements.
Definition EspCan.h:92
hf_can_mode_t mode
Operating mode.
Definition EspCan.h:80
hf_esp_can_config_t() noexcept
Definition EspCan.h:94
hf_pin_num_t tx_pin
TX GPIO pin number.
Definition EspCan.h:66
Comprehensive error information structure for error callbacks.
Definition EspCan.h:142
bool bus_off_state
Bus-off state.
Definition EspCan.h:146
uint32_t rx_error_count
Receive error counter.
Definition EspCan.h:145
bool error_warning
Error warning state.
Definition EspCan.h:147
uint32_t error_type
ESP-IDF error type.
Definition EspCan.h:143
uint64_t timestamp_us
Error timestamp in microseconds.
Definition EspCan.h:149
bool error_passive
Error passive state.
Definition EspCan.h:148
uint32_t tx_error_count
Transmit error counter.
Definition EspCan.h:144
CAN message filter configuration for hardware filtering.
Definition EspCan.h:121
uint32_t id2
Second filter ID (for dual mode)
Definition EspCan.h:128
uint32_t mask
Filter mask (0 = don't care, 1 = must match)
Definition EspCan.h:123
hf_esp_can_filter_config_t() noexcept
Definition EspCan.h:131
uint32_t id
Filter ID.
Definition EspCan.h:122
uint32_t mask2
Second filter mask (for dual mode)
Definition EspCan.h:129
bool is_extended
true for 29-bit extended ID, false for 11-bit standard
Definition EspCan.h:124
bool is_dual_filter
Enable dual filter mode.
Definition EspCan.h:125
Bus state information for state change callbacks.
Definition EspCan.h:155
uint32_t previous_state
Previous bus state.
Definition EspCan.h:156
uint32_t current_state
Current bus state.
Definition EspCan.h:157
uint64_t timestamp_us
State change timestamp in microseconds.
Definition EspCan.h:158
Advanced bit timing configuration for fine-tuning.
Definition EspCan.h:106
uint32_t ssp_offset
Secondary sample point offset.
Definition EspCan.h:112
uint32_t sjw
Synchronization jump width.
Definition EspCan.h:111
uint32_t brp
Baud rate prescaler.
Definition EspCan.h:107
uint32_t tseg_2
Time segment 2 (after sample point)
Definition EspCan.h:110
uint32_t prop_seg
Propagation segment.
Definition EspCan.h:108
uint32_t tseg_1
Time segment 1 (before sample point)
Definition EspCan.h:109
hf_esp_can_timing_config_t() noexcept
Definition EspCan.h:114
Transmission completion information.
Definition EspCan.h:164
uint64_t timestamp_us
Transmission timestamp in microseconds.
Definition EspCan.h:167
bool success
Transmission success status.
Definition EspCan.h:166
hf_can_message_t message
Message that was transmitted.
Definition EspCan.h:165