HF Interface Wrapper 0.1.0-dev
Embedded C++ hardware abstraction layer
Loading...
Searching...
No Matches
EspLogger.h
Go to the documentation of this file.
1
20#pragma once
21
22#include "BaseLogger.h"
23#include "utils/PlatformMutex.h"
24
25#include <atomic>
26#include <cstring>
27#include <map>
28#include <memory>
29#include <vector>
30
31#ifdef HF_MCU_FAMILY_ESP32
32// ESP-IDF C headers must be wrapped in extern "C" for C++ compatibility
33#ifdef __cplusplus
34extern "C" {
35#endif
36
37#include "esp_log.h"
38#include "esp_timer.h"
39#include "freertos/FreeRTOS.h"
40#include "freertos/task.h"
41
42// ESP-IDF Log V2 support
43#ifdef CONFIG_LOG_VERSION_2
44#include "esp_log_v2.h"
45#endif
46
47#ifdef __cplusplus
48}
49#endif
50
124class EspLogger : public BaseLogger {
125public:
129 EspLogger() noexcept;
130
134 ~EspLogger() noexcept override;
135
136 //==============================================================================
137 // BASELOGGER INTERFACE IMPLEMENTATION
138 //==============================================================================
139
145 hf_logger_err_t Initialize(const hf_logger_config_t& config) noexcept override;
146
151 hf_logger_err_t Deinitialize() noexcept override;
152
157 bool IsInitialized() const noexcept override;
158
163 bool EnsureInitialized() noexcept override;
164
171 hf_logger_err_t SetLogLevel(const char* tag, hf_log_level_t level) noexcept override;
172
179 hf_logger_err_t GetLogLevel(const char* tag, hf_log_level_t& level) const noexcept override;
180
181 //==============================================================================
182 // LOGGING METHODS
183 //==============================================================================
184
192 hf_logger_err_t Error(const char* tag, const char* format, ...) noexcept override;
193
201 hf_logger_err_t Warn(const char* tag, const char* format, ...) noexcept override;
202
210 hf_logger_err_t Info(const char* tag, const char* format, ...) noexcept override;
211
219 hf_logger_err_t Debug(const char* tag, const char* format, ...) noexcept override;
220
228 hf_logger_err_t Verbose(const char* tag, const char* format, ...) noexcept override;
229
238 hf_logger_err_t Log(hf_log_level_t level, const char* tag, const char* format,
239 ...) noexcept override;
240
249 hf_logger_err_t LogV(hf_log_level_t level, const char* tag, const char* format,
250 va_list args) noexcept override;
251
263 hf_logger_err_t LogWithLocation(hf_log_level_t level, const char* tag, const char* file,
264 hf_u32_t line, const char* function, const char* format,
265 ...) noexcept override;
266
267 //==============================================================================
268 // ESP-IDF LOG V2 ENHANCED METHODS
269 //==============================================================================
270
279 hf_logger_err_t LogBufferHex(const char* tag, const void* buffer, hf_u32_t length,
281
290 hf_logger_err_t LogBufferChar(const char* tag, const void* buffer, hf_u32_t length,
292
301 hf_logger_err_t LogBufferHexDump(const char* tag, const void* buffer, hf_u32_t length,
303
312 hf_logger_err_t LogBuffer(const char* tag, const void* buffer, hf_u32_t length,
314
315 //==============================================================================
316 // UTILITY METHODS
317 //==============================================================================
318
323 hf_logger_err_t Flush() noexcept override;
324
331 bool IsLevelEnabled(hf_log_level_t level, const char* tag = nullptr) const noexcept override;
332
338 hf_logger_err_t GetStatistics(hf_logger_statistics_t& statistics) const noexcept override;
339
345 hf_logger_err_t GetDiagnostics(hf_logger_diagnostics_t& diagnostics) const noexcept override;
346
351 hf_logger_err_t ResetStatistics() noexcept override;
352
357 hf_logger_err_t ResetDiagnostics() noexcept override;
358
363 bool IsHealthy() const noexcept override;
364
369 hf_logger_err_t GetLastError() const noexcept override;
370
377 hf_logger_err_t GetLastErrorMessage(char* message, hf_u32_t max_length) const noexcept override;
378
383 bool IsLogV2Available() const noexcept;
384
389 hf_u8_t GetLogVersion() const noexcept;
390
391 //==============================================================================
392 // DIAGNOSTIC PRINTING METHODS
393 //==============================================================================
394
401 hf_logger_err_t PrintStatistics(const char* tag = nullptr,
402 bool detailed = true) const noexcept override;
403
410 hf_logger_err_t PrintDiagnostics(const char* tag = nullptr,
411 bool detailed = true) const noexcept override;
412
419 hf_logger_err_t PrintStatus(const char* tag = nullptr,
420 bool detailed = true) const noexcept override;
421
422private:
423 //==============================================================================
424 // PRIVATE MEMBERS
425 //==============================================================================
426
427 mutable PlatformMutex mutex_;
428 std::atomic<bool> initialized_;
429 std::atomic<bool> healthy_;
430
431 hf_logger_config_t config_;
432 hf_logger_statistics_t statistics_;
433 hf_logger_diagnostics_t diagnostics_;
434
435 std::map<std::string, hf_log_level_t, std::less<>> tag_levels_;
436 std::vector<char> message_buffer_;
437
438 hf_logger_err_t last_error_;
439 char last_error_message_[256];
440
441 hf_u64_t initialization_time_;
442 hf_u64_t last_health_check_;
443
444 // Log V2 specific members
445 bool log_v2_available_;
446 hf_u8_t log_version_;
447
448 //==============================================================================
449 // PRIVATE METHODS
450 //==============================================================================
451
457 esp_log_level_t ConvertLogLevel(hf_log_level_t level) const noexcept;
458
464 hf_log_level_t ConvertLogLevel(esp_log_level_t level) const noexcept;
465
479 hf_logger_err_t FormatMessage(hf_log_level_t level, const char* tag, const char* file,
480 hf_u32_t line, const char* function, const char* format,
481 va_list args, char* formatted_message,
482 hf_u32_t max_length) noexcept;
483
492 hf_logger_err_t WriteMessage(hf_log_level_t level, const char* tag, const char* message,
493 hf_u32_t length) noexcept;
494
503 hf_logger_err_t WriteMessageV(hf_log_level_t level, const char* tag, const char* format,
504 va_list args) noexcept;
505
512 void UpdateStatistics(hf_log_level_t level, hf_u32_t message_length, bool success) noexcept;
513
518 void UpdateDiagnostics(hf_logger_err_t error) noexcept;
519
524 bool PerformHealthCheck() noexcept;
525
531 hf_logger_err_t ValidateConfiguration(const hf_logger_config_t& config) const noexcept;
532
538 const char* ConvertErrorToString(hf_logger_err_t error) const noexcept;
539
544 hf_u64_t GetCurrentTimestamp() const noexcept;
545
550 hf_u32_t GetCurrentThreadId() const noexcept;
551
557 bool EnsureMessageBuffer(hf_u32_t required_length) noexcept;
558
563 bool InitializeLogV2() noexcept;
564
569 bool CheckLogV2Availability() const noexcept;
570};
571
572#endif // HF_MCU_FAMILY_ESP32
Unified logging base class for all logging implementations.
hf_logger_err_t
Definition BaseLogger.h:88
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
Cross-platform RTOS mutex and synchronization primitives.
Base logger abstract class.
Definition BaseLogger.h:358
Definition PlatformMutex.h:78
hf_log_level_t
Log levels enumeration.
Definition BaseLogger.h:95
@ LOG_LEVEL_INFO
Info, warning, and error messages.
Logger configuration structure.
Definition BaseLogger.h:154
Logger diagnostics structure.
Definition BaseLogger.h:187
Logger statistics structure.
Definition BaseLogger.h:170