HardFOC Core
API reference
Loading...
Searching...
No Matches
HandlerCommon.h
Go to the documentation of this file.
1
14#pragma once
15
16#include <cstdarg>
17#include <cstdint>
18#include <cstdio>
19
20#include "Logger.h"
21
22#if defined(ESP_PLATFORM)
23#include "esp_rom_sys.h"
24#include "freertos/FreeRTOS.h"
25#include "freertos/task.h"
26#elif defined(HF_RTOS_FREERTOS)
27#include "OsUtility.h"
28#elif defined(USE_HAL_DRIVER)
29extern "C" void HAL_Delay(uint32_t Delay);
30#elif defined(HF_RTOS_THREADX) || defined(HF_RTOS_NONE)
31#include "OsUtility.h"
32#endif
33
34namespace handler_utils {
35
50inline void RouteLogToLogger(int level, const char* tag,
51 const char* format, va_list args) noexcept {
52 char buf[256];
53 vsnprintf(buf, sizeof(buf), format, args);
54 auto& log = Logger::GetInstance();
55 switch (level) {
56 case 0: log.Error(tag, "%s", buf); break;
57 case 1: log.Warn(tag, "%s", buf); break;
58 case 2: log.Info(tag, "%s", buf); break;
59 default: log.Debug(tag, "%s", buf); break;
60 }
61}
62
77inline void DelayMs(uint32_t ms) noexcept {
78#if defined(ESP_PLATFORM)
79 if (ms == 0U) {
80 return;
81 }
82 TickType_t ticks = pdMS_TO_TICKS(ms);
83 if (ticks == 0U) {
84 ticks = 1U;
85 }
86 vTaskDelay(ticks);
87#elif defined(HF_RTOS_FREERTOS) || (!defined(USE_HAL_DRIVER) && (defined(HF_RTOS_THREADX) || defined(HF_RTOS_NONE)))
88 while (ms > 0U) {
89 const uint16_t chunk =
90 (ms > 60000U) ? static_cast<uint16_t>(60000U)
91 : static_cast<uint16_t>(ms);
92 os_delay_msec(chunk);
93 ms -= chunk;
94 }
95#elif defined(USE_HAL_DRIVER)
96 HAL_Delay(ms);
97#else
98 /* Last-resort busy-wait (~1 ms @ ~200 MHz Cortex-M). Prefer RTOS/HAL. */
99 for (uint32_t m = 0; m < ms; ++m) {
100 for (uint32_t spin = 40000U; spin > 0U; --spin) {
101 __asm__ volatile("" ::: "memory");
102 }
103 }
104#endif
105}
106
117inline void DelayUs(uint32_t us) noexcept {
118 if (us >= 1000U) {
119 DelayMs((us + 999U) / 1000U);
120 return;
121 }
122#if defined(ESP_PLATFORM)
123 esp_rom_delay_us(us);
124#else
125 /* ~1 µs/iteration @ Cortex-M ~200–240 MHz. */
126 for (uint32_t i = 0; i < us; ++i) {
127 for (uint32_t spin = 40U; spin > 0U; --spin) {
128 __asm__ volatile("" ::: "memory");
129 }
130 }
131#endif
132}
133
134} // namespace handler_utils
Advanced logging system with formatting capabilities.
static Logger & GetInstance() noexcept
Get singleton instance.
Definition Logger.cpp:91
Definition HandlerCommon.h:34
void RouteLogToLogger(int level, const char *tag, const char *format, va_list args) noexcept
Route a driver log message to the Logger singleton.
Definition HandlerCommon.h:50
void DelayUs(uint32_t us) noexcept
Microsecond delay with automatic fallback to RTOS delay for large values.
Definition HandlerCommon.h:117
void DelayMs(uint32_t ms) noexcept
RTOS-aware millisecond delay.
Definition HandlerCommon.h:77