ESPHome 2026.4.0
Loading...
Searching...
No Matches
wake.cpp
Go to the documentation of this file.
1#include "esphome/core/wake.h"
2#include "esphome/core/hal.h"
3
4#ifdef USE_ESP8266
5#include <coredecls.h>
6#endif
7
8#ifdef USE_HOST
10#include <sys/socket.h>
11#endif
12
13namespace esphome {
14
15// === ESP32 — IRAM_ATTR entry points ===
16#ifdef USE_ESP32
17void IRAM_ATTR wake_loop_isrsafe(BaseType_t *px_higher_priority_task_woken) {
18 esphome_main_task_notify_from_isr(px_higher_priority_task_woken);
19}
20void IRAM_ATTR wake_loop_any_context() { esphome_main_task_notify_any_context(); }
21#endif
22
23// === ESP8266 / RP2040 ===
24#if defined(USE_ESP8266) || defined(USE_RP2040)
25// NOLINTNEXTLINE(cppcoreguidelines-avoid-non-const-global-variables)
26volatile bool g_main_loop_woke = false;
27#endif
28
29#ifdef USE_ESP8266
30void IRAM_ATTR wake_loop_any_context() { wake_loop_impl(); }
31#endif
32
33// === RP2040 — wakeable_delay (needs file-scope state for alarm callback) ===
34#ifdef USE_RP2040
35// NOLINTNEXTLINE(cppcoreguidelines-avoid-non-const-global-variables)
36static volatile bool s_delay_expired = false;
37
38static int64_t alarm_callback_(alarm_id_t id, void *user_data) {
39 (void) id;
40 (void) user_data;
41 s_delay_expired = true;
42 __sev();
43 return 0;
44}
45
46namespace internal {
48 if (ms == 0) {
49 yield();
50 return;
51 }
52 if (g_main_loop_woke) {
53 g_main_loop_woke = false;
54 return;
55 }
56 s_delay_expired = false;
57 alarm_id_t alarm = add_alarm_in_ms(ms, alarm_callback_, nullptr, true);
58 if (alarm <= 0) {
59 delay(ms);
60 return;
61 }
62 while (!g_main_loop_woke && !s_delay_expired) {
63 __wfe();
64 }
65 if (!s_delay_expired)
66 cancel_alarm(alarm);
67 g_main_loop_woke = false;
68}
69} // namespace internal
70#endif // USE_RP2040
71
72// === Host (UDP loopback socket) ===
73#ifdef USE_HOST
75 if (App.wake_socket_fd_ >= 0) {
76 const char dummy = 1;
77 ::send(App.wake_socket_fd_, &dummy, 1, 0);
78 }
79}
80#endif
81
82} // namespace esphome
void wakeable_delay(uint32_t ms)
Definition wake.cpp:47
Providing packet encoding functions for exchanging data with a remote host.
Definition a01nyub.cpp:7
void wake_loop_threadsafe()
Non-ISR: always inline.
Definition wake.cpp:74
void ESPHOME_ALWAYS_INLINE wake_loop_impl()
Inline implementation — IRAM callers inline this directly.
Definition wake.h:59
volatile bool g_main_loop_woke
Definition wake.cpp:26
void HOT yield()
Definition core.cpp:25
void HOT delay(uint32_t ms)
Definition core.cpp:28
Application App
Global storage of Application pointer - only one Application can exist.
void IRAM_ATTR wake_loop_any_context()
IRAM_ATTR entry point — defined in wake.cpp.
Definition wake.cpp:20
void IRAM_ATTR wake_loop_isrsafe(BaseType_t *px_higher_priority_task_woken)
IRAM_ATTR entry point — defined in wake.cpp.
Definition wake.cpp:17
static void uint32_t
Platform-specific main loop wake primitives.