Commit Graph
13286 Commits
Author SHA1 Message Date
J. Nick KostonandClaude Opus 4.6 9b3800c867 Guard TAG, log.h, and cinttypes behind ESPHOME_DEBUG_SCHEDULER
These are only used in debug rollover logging. Guarding them avoids
unused variable warnings and unnecessary includes in normal builds.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 11:39:34 -10:00
J. Nick Koston f9d6df5403 Merge remote-tracking branch 'upstream/dev' into move-millis64-impl
# Conflicts:
#	esphome/core/scheduler.cpp
#	esphome/core/scheduler.h
2026-02-27 11:20:56 -10:00
J. Nick KostonandClaude Opus 4.6 280f874edc [rp2040] Use native time_us_64() for millis_64() (#14356)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 11:18:02 -10:00
J. Nick KostonandClaude Opus 4.6 c9a2fe5b80 Move HALF_MAX_UINT32 inside compute() function
Only used within the function, matches the pattern of ROLLOVER_WINDOW.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 11:04:46 -10:00
J. Nick KostonandClaude Opus 4.6 3d674ae1d2 Restructure preprocessor guards to single if/elif/else chain
Pure code reorganization — no functional change. Combines the separate
#ifndef ESPHOME_THREAD_SINGLE and #ifdef ESPHOME_THREAD_MULTI_ATOMICS
guards into one if/elif/else chain so each threading model's static
variables are grouped together.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 11:02:37 -10:00
J. Nick KostonandClaude Opus 4.6 ec2259733e Revert spinlock back to Mutex for atomics path
A std::atomic_flag spinlock is unsafe on preemptive single-core RTOS
platforms (like LN882H) due to priority inversion: a high-priority task
spinning would prevent the lock holder from running to release it.
FreeRTOS Mutex has priority inheritance to handle this correctly.

Added a comment explaining why spinlock can't be used here.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 11:01:06 -10:00
J. Nick KostonandClaude Opus 4.6 c121d8dc2a Move millis_64() call inside non-defer path
defer() items go straight into defer_queue_ and never use a timestamp.
Now that millis_64() has its own lock separate from the scheduler,
the call no longer needs to happen before taking the scheduler lock.
Move it inside the non-defer branch so defer() avoids the cost entirely.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 10:56:29 -10:00
J. Nick KostonandClaude Opus 4.6 6c8542026f Replace Mutex with atomic_flag spinlock for MULTI_ATOMICS path
The atomics path only takes the lock during rollover (every ~49.7 days)
for a ~5 instruction critical section. A std::atomic_flag spinlock
(1 byte) replaces the full FreeRTOS Mutex (~80-100 bytes RAM) since
contention is near-zero. The full Mutex is kept only for the
MULTI_NO_ATOMICS path (BK72xx) which needs it for broader locking.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 10:51:40 -10:00
J. Nick KostonandClaude Opus 4.6 c3252e861f Don't allocate Mutex on single-threaded platforms
On ESPHOME_THREAD_SINGLE (ESP8266), the lock is never used.
Guarding it avoids the static local guard variable overhead
(8 bytes RAM + init check on every call).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 10:39:53 -10:00
J. Nick KostonandClaude Opus 4.6 ea47af1fe3 Use cg.add_define for USE_NATIVE_64BIT_TIME
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 10:36:04 -10:00
J. Nick KostonandClaude Opus 4.6 fedf9d0ad5 [core] Move millis_64 rollover tracking out of Scheduler into time_64.cpp
millis_64_impl_() handles 32-bit millis() rollover tracking for
platforms without native 64-bit time (ESP8266, LibreTiny). It was a
Scheduler method using Scheduler fields (last_millis_, millis_major_,
lock_), but has nothing to do with scheduling.

Move it to esphome/core/time_64.cpp as Millis64Impl::compute() with
static local state. Access is restricted via friend to millis_64()
(HAL) and Scheduler only.

Also introduces USE_NATIVE_64BIT_TIME define emitted by ESP32, Host,
Zephyr, and RP2040 platforms, replacing the verbose multi-platform
#if guards throughout scheduler.h/cpp.

time_64.cpp is only compiled on platforms that need it (ESP8266,
LibreTiny) via the build filter in config.py.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 10:32:06 -10:00
Jonathan SwobodaandCopilot f6755aabae [ci] Add PR title format check (#14345)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-02-27 15:18:07 -05:00
J. Nick Koston 8588063f65 fix stale comment 2026-02-27 10:12:09 -10:00
J. Nick Koston d1de36840c Merge remote-tracking branch 'upstream/dev' into millis64-rp2040-native
# Conflicts:
#	esphome/core/scheduler.cpp
#	esphome/core/scheduler.h
2026-02-27 10:03:53 -10:00
J. Nick Koston 52af4bced0 [component] Devirtualize call_dump_config (#14355) 2026-02-27 10:01:23 -10:00
J. Nick KostonandClaude Opus 4.6 63e757807e [zephyr] Use native k_uptime_get() for millis_64() (#14350)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 10:01:09 -10:00
dependabot[bot] edd63e3d2d Bump actions/download-artifact from 7.0.0 to 8.0.0 (#14327)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-02-27 14:43:10 -05:00
dependabot[bot] 32133e2f46 Bump ruff from 0.15.3 to 0.15.4 (#14357)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-02-27 14:42:20 -05:00
Clyde Stubbs 2255c68377 [esp32] Enable execute_from_psram for P4 (#14329) 2026-02-28 06:40:55 +11:00
J. Nick Koston 9c1d1a0d9f [color] Use integer math in Color::gradient to reduce code size (#14354) 2026-02-27 19:25:13 +00:00
J. Nick Koston e110ac24d5 [rp2040] Use native time_us_64() for millis_64()
RP2040's Pico SDK provides time_us_64() which reads the hardware
timer registers directly, returning native uint64_t microseconds.
This eliminates the need for 32-bit rollover tracking on this
platform.

millis() is now derived from millis_64() (like Zephyr) instead of
the other way around, unifying the time source.

Also removes IRAM_ATTR from all RP2040 HAL functions. On RP2040,
IRAM_ATTR is a no-op: the functions it decorated (millis, micros,
delayMicroseconds, arch_get_cpu_cycle_count) all call into Pico SDK
functions that reside in flash (XIP), so the attribute had no effect.
2026-02-27 09:03:20 -10:00
J. Nick Koston fad0d9ec30 Merge remote-tracking branch 'upstream/dev' into millis64-zephyr-native
# Conflicts:
#	esphome/core/scheduler.cpp
#	esphome/core/scheduler.h
2026-02-27 08:55:47 -10:00
J. Nick KostonandClaude Opus 4.6 8698b01bc7 [host] Use native clock_gettime for millis_64() (#14340)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 18:54:13 +00:00
J. Nick KostonandCopilot 3411ce2150 [core] Fix Application asm label for Mach-O using __USER_LABEL_PREFIX__ (#14334)
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-02-27 08:49:57 -10:00
J. Nick Koston 29e1e8bdfd [wifi] Add LibreTiny component test configs (#14351) 2026-02-27 18:45:20 +00:00
J. Nick Koston 317dd5b2da [ci] Skip memory impact target branch build when tests don't exist (#14316) 2026-02-27 08:42:08 -10:00
J. Nick Koston 67003efcb5 [zephyr] Derive millis() from millis_64() to unify time source 2026-02-27 08:29:15 -10:00
Michael CassanitiandJonathan Swoboda 4ae7633418 [safe_mode] Add feature to explicitly mark a boot as successful (#14306)
Co-authored-by: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com>
2026-02-27 13:23:02 -05:00
J. Nick Koston c3a0eeceec [wifi] Use direct SDK APIs for LibreTiny SSID retrieval (#14349) 2026-02-27 18:17:17 +00:00
J. Nick KostonandClaude Opus 4.6 8d932ed855 [zephyr] Use native k_uptime_get() for millis_64()
Zephyr's k_uptime_get() returns int64_t milliseconds directly,
eliminating the need for 32-bit rollover tracking on this platform.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 08:03:46 -10:00
J. Nick Koston 40632cb941 Revert "[zephyr] Use native k_uptime_get() for millis_64()"
This reverts commit 77baa0a187.
2026-02-27 08:03:34 -10:00
J. Nick KostonandClaude Opus 4.6 77baa0a187 [zephyr] Use native k_uptime_get() for millis_64()
Zephyr's k_uptime_get() returns int64_t milliseconds directly,
eliminating the need for 32-bit rollover tracking on this platform.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 08:01:43 -10:00
J. Nick Koston 4fe173b644 [wifi] Remove stale TODO comment for ESP8266 callback deferral (#14347) 2026-02-27 17:56:57 +00:00
J. Nick Koston f4d21e8582 Merge remote-tracking branch 'upstream/dev' into millis64-host-native
# Conflicts:
#	esphome/components/host/core.cpp
#	esphome/core/scheduler.cpp
#	esphome/core/scheduler.h
2026-02-27 07:53:14 -10:00
J. Nick Koston 1c7f769ec7 [core] Add millis_64() HAL function with native ESP32 implementation (#14339) 2026-02-27 07:48:21 -10:00
72ca514cc2 [esp32_hosted] Add configurable SDIO clock frequency (#14319)
Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com>
Co-authored-by: Deirdre <obyrne@rk1.lan>
Co-authored-by: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com>
2026-02-27 17:25:53 +00:00
J. Nick Koston 20314b4d63 [mdns] Update espressif/mdns to v1.10.0 (#14338) 2026-02-27 17:20:08 +00:00
Kevin Ahrendt 017d1b2872 [audio] Bump microOpus to v0.3.4 (#14346) 2026-02-27 12:12:50 -05:00
Jonathan SwobodaandCopilot ef9fc87351 [zigbee] Fix codegen ordering for basic/identify attribute lists (#14343)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-02-27 11:17:04 -05:00
J. Nick KostonandClaude Opus 4.6 0f7ac1726d [core] Extend fast select optimization to LibreTiny platforms (#14254)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 06:03:37 -10:00
bd3f8e006c [esp32_ble] allow setting of min/max key_size and auth_req_mode (#7138)
Co-authored-by: J. Nick Koston <nick@koston.org>
Co-authored-by: J. Nick Koston <nick@home-assistant.io>
2026-02-27 06:02:29 -10:00
J. Nick Koston c7182404a3 [host] Use native clock_gettime for millis_64()
The host platform already uses clock_gettime(CLOCK_MONOTONIC) for
millis(). Use it directly for millis_64() instead of delegating to
the Scheduler's rollover tracking.

This eliminates the MULTI_ATOMICS rollover code path (CAS/atomic)
on host builds and removes the dependency on App.scheduler for
millis_64() to work.
2026-02-26 23:36:22 -10:00
J. Nick Koston 0e05ae56e5 Fix friend declaration for ESP8266 clang-tidy
The fully-qualified friend uint64_t ::esphome::millis_64() syntax
causes 'uint64_t is not a class, namespace, or enumeration' errors
on the ESP8266 clang-tidy toolchain. Use unqualified form which
resolves correctly within the esphome namespace.
2026-02-26 23:18:55 -10:00
J. Nick Koston 33d4f62510 Restore explicit cast for -Wsign-conversion consistency
millis() on the line above casts esp_timer_get_time() to uint32_t.
Match that pattern in millis_64() with static_cast<uint64_t> to
avoid implicit signed-to-unsigned conversion.
2026-02-26 23:05:18 -10:00
J. Nick Koston 554e2ac7f1 Use 1000ULL for consistency, tighten @param comment
- Use 1000ULL divisor in millis_64() to match millis() style and
  avoid implicit signed-to-unsigned conversion
- Clarify next_schedule_in @param: now is unused for 64-bit
  extension on ESP32, but still used for 32-bit paths in call()
2026-02-26 23:03:14 -10:00
J. Nick Koston 2a101832ca Address review feedback
- Remove unnecessary uint64_t cast on esp_timer_get_time() (already
  returns int64_t, always non-negative after boot)
- Fix next_schedule_in @param comment: now is only unused on ESP32,
  used for rollover tracking on other platforms
- Use fully-qualified friend declaration (::esphome::millis_64())
2026-02-26 22:59:29 -10:00
J. Nick Koston 915b32cb33 Fix clang-tidy redundant-declaration warning
Include hal.h directly in scheduler.h instead of forward-declaring
millis_64(), which clang-tidy flags as redundant when both headers
are included in the same translation unit.
2026-02-26 22:52:48 -10:00
J. Nick Koston 420ecb4efd [core] Add millis_64() HAL function with native ESP32 implementation
On ESP32, millis() truncates esp_timer_get_time() to 32-bit, then
Scheduler::millis_64_() reconstructs 64-bit using 193 bytes of
CAS/atomic/lock rollover tracking code. This is unnecessary since
esp_timer_get_time() already provides native 64-bit microseconds.

Add millis_64() as a HAL-level function alongside millis():
- ESP32: native esp_timer_get_time()/1000 (26 bytes, lock-free)
- Other platforms: delegate to Scheduler::millis_64_impl_() which
  retains the existing rollover tracking (renamed from millis_64_)

Saves 344 bytes flash and ~8 bytes RAM on ESP32 by eliminating the
rollover tracking code and associated atomic fields. External callers
(uptime, web_server) now use millis_64() directly instead of
App.scheduler.millis_64().
2026-02-26 22:41:19 -10:00
dependabot[bot] 07406c96e1 Bump actions/upload-artifact from 6.0.0 to 7.0.0 (#14326)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-02-26 21:35:15 -10:00
4044520ccc [esp32_touch] Migrate to new unified touch sensor driver (esp_driver_touch_sens) (#14033)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: J. Nick Koston <nick@home-assistant.io>
2026-02-26 20:38:36 -10:00