From f06ce30065a772aeef274ffb25ae2de386bbc42b Mon Sep 17 00:00:00 2001 From: Simon J Stuart Date: Thu, 20 Aug 2026 23:38:39 +0200 Subject: [PATCH 01/10] chore: prepare Threads 3.1.3 dependency metadata (#45) --- library.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/library.json b/library.json index 9f2e306..bc52524 100644 --- a/library.json +++ b/library.json @@ -10,7 +10,7 @@ "type": "git", "url": "https://github.com/Flowduino/ESPressio-Threads.git" }, - "version": "3.1.2", + "version": "3.1.3", "license": "Apache-2.0", "frameworks": [ "arduino" @@ -21,7 +21,7 @@ "dependencies": [ { "name": "Flowduino ESPressio-Timing", - "version": ">=2.2.2 <3.0.0", + "version": ">=2.2.3 <3.0.0", "url": "https://github.com/Flowduino/ESPressio-Timing.git" }, { From 6888dbda660d22ec6fc887530e20c0fd528a0ab3 Mon Sep 17 00:00:00 2001 From: Simon J Stuart Date: Thu, 20 Aug 2026 23:38:53 +0200 Subject: [PATCH 02/10] chore: prepare Threads 3.1.3 Arduino metadata (#45) --- library.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/library.properties b/library.properties index f3b078d..ba9ee1e 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=ESPressio-Threads -version=3.1.2 +version=3.1.3 author=Simon J. Stuart maintainer=Flowduino.com sentence=Threading library for single- and multi-core ESP32 microcontrollers @@ -8,4 +8,4 @@ category=Data Processing url=https://github.com/Flowduino/ESPressio-Threads architectures=esp32 includes=ESPressio_Thread.hpp,ESPressio_PrecisionThread.hpp -depends=Flowduino ESPressio-Timing (>=2.2.2 && <3.0.0),Flowduino ESPressio-Observable (>=3.0.1 && <4.0.0) +depends=Flowduino ESPressio-Timing (>=2.2.3 && <3.0.0),Flowduino ESPressio-Observable (>=3.0.1 && <4.0.0) From 463e142e177550d52d97acd18e033cb97d8a605a Mon Sep 17 00:00:00 2001 From: Simon J Stuart Date: Thu, 20 Aug 2026 23:39:04 +0200 Subject: [PATCH 03/10] chore: update Threads component version to 3.1.3 (#45) --- component.mk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/component.mk b/component.mk index 11a9c16..2576c3e 100644 --- a/component.mk +++ b/component.mk @@ -5,5 +5,5 @@ COMPONENT_REQUIRES := ESPressio_Timing ESPressio_Observable CXXFLAGS += -DESPRESSIO_THREADS CXXFLAGS += -DESPRESSIO_THREADS_VERSION_MAJOR=3 CXXFLAGS += -DESPRESSIO_THREADS_VERSION_MINOR=1 -CXXFLAGS += -DESPRESSIO_THREADS_VERSION_PATCH=2 -CXXFLAGS += -DESPRESSIO_THREADS_VERSION_STRING=\"3.1.2\" +CXXFLAGS += -DESPRESSIO_THREADS_VERSION_PATCH=3 +CXXFLAGS += -DESPRESSIO_THREADS_VERSION_STRING=\"3.1.3\" From 34a899d41a9ab97aab073e0bde0f0e8f70130276 Mon Sep 17 00:00:00 2001 From: Simon J Stuart Date: Thu, 20 Aug 2026 23:39:26 +0200 Subject: [PATCH 04/10] docs: record Threads 3.1.3 dependency refresh (#45) --- CHANGELOG.md | 33 +++++++++++++++++++++++---------- 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 45d0f02..33ab178 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,7 +12,20 @@ Versioning](https://semver.org/). > had little or no release-note detail, the entry is intentionally terse > rather than inferring unsupported intent. -## \[3.1.2\] - 2026-08-20 +## [3.1.3] - 2026-08-20 + +### Changed + +- Raised the required ESPressio Timing baseline from 2.2.2 to 2.2.3, carrying the Units 0.2.2 / Serializable 0.10.1 dependency refresh downstream. +- Preserved the direct ESPressio Observable baseline at `>=3.0.1 <4.0.0`. +- Updated package and ESP-IDF component version metadata for Threads 3.1.3. +- Preserved the dependency direction `Threads -> Timing -> Units -> optional Serializable`; Threads does not acquire a direct Serializable dependency. + +### Compatibility + +- No public Threads interfaces or runtime semantics changed. + +## [3.1.2] - 2026-08-20 ### Changed @@ -21,7 +34,7 @@ Versioning](https://semver.org/). - Updated package and ESP-IDF component version metadata for Threads 3.1.2. - No public Threads interfaces or runtime semantics changed. -## \[3.1.1\] - 2026-08-19 +## [3.1.1] - 2026-08-19 ### Changed @@ -30,7 +43,7 @@ Versioning](https://semver.org/). - Bounded ESPressio Observable compatibility to the current 3.x major line (`>=3.0.0 <4.0.0`). - Updated package metadata and current installation/dependency guidance for Threads 3.1.1. -## \[3.1.0\] - 2026-08-19 +## [3.1.0] - 2026-08-19 ### Added @@ -53,7 +66,7 @@ Versioning](https://semver.org/). - Kept the notification layer synchronous and independent of ESPressio Event so Event bridges can remain opt-in. -## \[3.0.0\] - 2026-08-18 +## [3.0.0] - 2026-08-18 ### Added @@ -77,7 +90,7 @@ Versioning](https://semver.org/). - Corrected integration issues found while validating the 3.0 codebase against the newest ESPressio dependencies. -## \[2.0.0\] - 2026-08-13 +## [2.0.0] - 2026-08-13 ### Changed @@ -92,34 +105,34 @@ Versioning](https://semver.org/). window is changed or disabled. - Clarified process-lifetime Thread infrastructure ownership. -## \[1.4.1\] +## [1.4.1] ### Fixed - Maintenance corrections to the 1.4 series. -## \[1.3.0\] +## [1.3.0] ### Added - Expanded the Thread/PrecisionThread feature set and lifecycle infrastructure. -## \[1.2.0\] +## [1.2.0] ### Added - Continued development of precision-threading and lifecycle-management capabilities. -## \[1.1.0\] +## [1.1.0] ### Added - Extended the initial Thread abstraction with additional lifecycle/scheduling functionality. -## \[1.0.0\] +## [1.0.0] ### Added From 0f92ad42caedb11bcbaaaa077082bec0320f3379 Mon Sep 17 00:00:00 2001 From: Simon J Stuart Date: Thu, 20 Aug 2026 23:39:44 +0200 Subject: [PATCH 05/10] docs: refresh Threads dependency chart for 3.1.3 (#45) --- ESPRESSIO_DEPENDENCY_CHART.md | 383 +++++----------------------------- 1 file changed, 52 insertions(+), 331 deletions(-) diff --git a/ESPRESSIO_DEPENDENCY_CHART.md b/ESPRESSIO_DEPENDENCY_CHART.md index 923cded..213b6e1 100644 --- a/ESPRESSIO_DEPENDENCY_CHART.md +++ b/ESPRESSIO_DEPENDENCY_CHART.md @@ -2,362 +2,83 @@ ![ESPressio Library Dependency Chart](ESPRESSIO_DEPENDENCY_CHART.png) -## Purpose +## ESPressio Threads 3.1.3 -This document describes the dependency relationships between the current ESPressio libraries. - -The chart is hierarchical: libraries with no **required** ESPressio dependencies are positioned at the top, while libraries that build on progressively more of the ESPressio ecosystem appear lower in the hierarchy. - -### Relationship notation - -- **Solid arrow** — a required ESPressio library dependency. -- **Dashed arrow** — an opt-in relationship. The dependency is required only when the consuming application selects the associated feature, integration, type, or header. -- Arrows point from the **dependent library** to the **library it consumes**. - -This distinction is important to the ESPressio architecture. Optional integrations are intentionally kept out of the normal/core include path wherever possible so that a project does not acquire unrelated ESPressio dependencies simply by consuming a library. - ---- - -## ESPressio Units 0.2.0 - -**Required ESPressio dependencies: none.** - -ESPressio Units is a foundational library providing strongly typed physical quantities and unit representations. Its ordinary Unit types are deliberately independent of the rest of the ESPressio ecosystem. - -### ESPressio Units → ESPressio Serializable — opt-in - -The ordinary Unit headers do **not** require ESPressio Serializable. - -Serializable counterparts are supplied through separate `*_Serializable.hpp` sibling headers, together with the `ESPressio_SerializableUnits.hpp` batch header. - -The relationship therefore exists only when an application explicitly selects a Serializable Unit type. - -This preserves both use cases: - -```text -ordinary Unit type - -> ESPressio Units only - -Serializable Unit type - -> ESPressio Units - -> ESPressio Serializable -``` - ---- - -## ESPressio Observable >= 3.0.0 - -**Required ESPressio dependencies: none represented in this chart.** - -ESPressio Observable is a foundational synchronous observation/notification mechanism. - -It is consumed by higher-level libraries when lifecycle or state changes need to be observable without forcing those notifications through the asynchronous ESPressio Event system. - -In the current dependency hierarchy it is directly consumed by: - -- ESPressio Timing; -- ESPressio Threads; -- ESPressio Event. - ---- - -## ESPressio Serializable 0.9.0 - -**Required ESPressio dependencies: none represented in this chart.** - -ESPressio Serializable is the foundational serialization framework. - -It remains intentionally optional for libraries that can operate entirely with non-Serializable types. - -Current opt-in relationships shown in the chart are: - -- ESPressio Units → Serializable, when Serializable Unit variants are selected; -- ESPressio Event → Serializable, when Serializable Events or Event Transport are used. - -ESPressio Timing can operate with Serializable Unit time representations because its clock types are generic, but Timing itself does not directly depend upon ESPressio Serializable. The Serializable relationship is provided by the selected ESPressio Units time type. - ---- - -## ESPressio Sockets 0.2.0 - -**Required ESPressio dependencies: none.** - -The core ESPressio Sockets library deliberately has no mandatory dependency on another ESPressio library. - -It provides socket/network infrastructure and then exposes integrations through opt-in headers. - -### ESPressio Sockets → ESPressio Event — opt-in - -Socket Event Transport adapters implement the ESPressio Event transport abstraction. - -This relationship is activated only when an Event Transport header is used, for example the UDP, TCP, TLS, WebSocket, or MQTT Event Transport adapters. - -A project using only the core socket facilities does not require ESPressio Event. - -Because Event Transport operates on Serializable Events, the relevant Event/Serializable requirements are then inherited through that selected integration rather than imposed by the Sockets core. - -### ESPressio Sockets → ESPressio Timing — opt-in - -Version 0.2.0 adds socket-based System Clock synchronization implementations. - -The Timing relationship is activated only when the clock-synchronization headers are selected. - -These implementations provide network mechanisms such as: - -- UDP request/response synchronization; -- UDP broadcast/multicast synchronization; -- TCP synchronization; -- WebSocket synchronization; -- SNTP reference acquisition. - -ESPressio Timing continues to own clock discipline, synchronization calculations, System Clock state, and Observer notifications. ESPressio Sockets only supplies the network-side synchronization mechanism. - ---- - -## ESPressio Timing 2.2.0 - -**Required ESPressio dependencies:** - -- ESPressio Units >= 0.2.0; -- ESPressio Observable >= 3.0.0. - -### ESPressio Timing → ESPressio Units — required - -Timing uses ESPressio Units for its strongly typed time representations. - -Timing 2.x is generic over the selected time representation, allowing the implementing application to use ordinary Unit time types, Serializable Unit variants, or another compatible representation. - -This is why Timing itself does not need a direct Serializable dependency. - -### ESPressio Timing → ESPressio Observable — required - -Timing exposes logical clock and synchronization lifecycle notifications through ESPressio Observable. - -This includes particularly important System Clock synchronization notifications, allowing observers to inspect relevant synchronization state and values such as the before/after clock difference. - -The synchronous Observer layer also provides the source notifications consumed by the optional Timing Event Bridge implemented in ESPressio Event. - ---- - -## ESPressio Threads 3.1.0 - -**Required ESPressio dependencies:** - -- ESPressio Timing >= 2.0.0; -- ESPressio Observable >= 3.0.0. - -### ESPressio Threads → ESPressio Timing — required - -Threads uses Timing for its time-related execution and scheduling infrastructure. - -This establishes Timing—and therefore Timing's own required Units and Observable relationships—beneath Threads in the hierarchy. - -### ESPressio Threads → ESPressio Observable — required - -Threads uses Observable for synchronous infrastructure notifications. - -This includes notifications associated with singleton/infrastructure behavior such as Garbage Collection and other logical lifecycle operations where observers need to react directly. - -These Observer notifications deliberately exist independently of ESPressio Event. - -ESPressio Event can optionally bridge them into asynchronous Events, but Threads itself does not require Event. - ---- - -## ESPressio ESP-Now 0.2.0 - -**Required ESPressio dependencies:** - -- ESPressio Timing >= 2.1.0. - -### ESPressio ESP-Now → ESPressio Timing — required - -The library provides ESP-NOW-based distributed System Clock synchronization. - -ESPressio ESP-Now gathers the transport-specific timing measurements and submits completed synchronization samples into ESPressio Timing. - -Timing remains responsible for the actual clock synchronization and discipline. - -### ESPressio ESP-Now → ESPressio Event — opt-in - -`ESPNowEventTransport` provides an ESP-NOW implementation of the ESPressio Event transport abstraction. - -The Event dependency is deliberately opt-in. - -Applications using ESPressio ESP-Now only for ESP-NOW communication and/or System Clock synchronization do not need ESPressio Event. - -When `ESPNowEventTransport` is selected, the application also acquires the Serializable requirements associated with ESPressio Event Transport. - ---- - -## ESPressio Event 5.4.0 - -**Required ESPressio dependencies:** - -- ESPressio Threads >= 3.1.0; -- ESPressio Observable >= 3.0.0; -- ESPressio Timing >= 2.2.0. - -Event currently sits at the deepest point in the core ESPressio dependency hierarchy represented here. - -### ESPressio Event → ESPressio Threads — required - -Event uses ESPressio Threads for its asynchronous Event processing/execution infrastructure. - -Because Threads itself requires Timing and Observable, those relationships also exist transitively beneath Event. - -### ESPressio Event → ESPressio Observable — required - -Observable is used directly by Event and by the Observer/Event bridge architecture. - -This direct dependency allows ESPressio Event to convert synchronous Observer notifications from other ESPressio subsystems into asynchronous Event dispatches without requiring those source libraries to depend upon Event. - -### ESPressio Event → ESPressio Timing — required - -Timing is a direct Event dependency because the optional System Clock Event Bridge compiles against Timing's public Observer API. - -The bridge subscribes to Timing Observer notifications and emits corresponding asynchronous Timing Event types. - -The same architectural pattern is used for the Threads infrastructure Event Bridges. - -Importantly, the dependency direction remains: +Threads has two required ESPressio dependencies: ```text -ESPressio Event - -> ESPressio Timing / Threads - -not - -ESPressio Timing / Threads - -> ESPressio Event +ESPressio Threads 3.1.3 + -> ESPressio Timing >= 2.2.3 < 3.0.0 + -> ESPressio Observable >= 3.0.1 < 4.0.0 ``` -This prevents foundational/runtime libraries from acquiring an Event dependency merely to make asynchronous bridging possible. - -### ESPressio Event → ESPressio Serializable — opt-in - -Ordinary Event usage does not require ESPressio Serializable. - -Serializable Event support and Event Transport are explicitly opt-in. - -When those facilities are selected, Serializable provides the representation required to encode an Event for transport beyond the local Event dispatcher. - -This preserves the lightweight local-only case: +Timing supplies the scheduling/time abstraction and carries its own required +Units dependency: ```text -ordinary local Event - -> no Serializable requirement +Threads + -> Timing 2.2.3 + -> Units 0.2.2 + - - -> Serializable 0.10.1 + only when Serializable Unit types are selected ``` -while supporting: +Threads therefore does **not** acquire a direct Serializable dependency. -```text -Serializable / remotely transported Event - -> ESPressio Serializable -``` - ---- - -## Dependency hierarchy summary - -The required-dependency hierarchy can be summarized as: +## Current coordinated ecosystem ```text FOUNDATIONAL -├── ESPressio Units -├── ESPressio Observable -├── ESPressio Serializable -└── ESPressio Sockets - | - | optional integrations only - v +├── Observable 3.0.1 +├── Serializable 0.10.1 +├── Units 0.2.2 +├── Security 0.2.0 +└── Command 0.3.0 RUNTIME -└── ESPressio Timing - ├── Units - └── Observable - -EXECUTION / COMMUNICATION -├── ESPressio Threads -│ ├── Timing -│ └── Observable -│ -└── ESPressio ESP-Now - └── Timing - -EVENT INFRASTRUCTURE -└── ESPressio Event - ├── Threads - ├── Timing - └── Observable +└── Timing 2.2.3 + ├── Units >= 0.2.2 < 1.0.0 + └── Observable >= 3.0.1 < 4.0.0 + +EXECUTION +└── Threads 3.1.3 + ├── Timing >= 2.2.3 < 3.0.0 + └── Observable >= 3.0.1 < 4.0.0 + +TRANSPORT / EVENT +├── Sockets 0.5.0 +├── ESP-Now 0.5.1 +└── Event 5.8.1 + +DIAGNOSTICS / OPERATOR +└── Serial 0.5.1 ``` -The opt-in cross-cutting relationships are: - -```text -Units - - - -> Serializable - Serializable Unit variants +## Downstream consumers -Event - - - -> Serializable - Serializable Events / Event Transport +Event 5.8.1 consumes Threads 3.1.3 as a required dependency. Serial 0.5.1 may +consume Threads directly only through its opt-in diagnostic integration. -ESP-Now - - - -> Event - ESP-NOW Event Transport +Threads itself remains independent of Event and Serial. -Sockets - - - -> Event - socket Event Transports +## Dependency-direction rule -Sockets - - - -> Timing - socket/SNTP clock synchronization -``` +Dependency changes cascade downstream. An upstream runtime library should not +depend back on a downstream integration merely to host adapter code. ---- - -## Architectural principle - -The dependency graph follows a general ESPressio design rule: - -> A foundational library should expose the synchronous or transport-neutral abstraction it owns; higher-level integration libraries should opt into that abstraction rather than forcing the foundational library to depend upward. - -Examples include: - -```text -Timing - exposes Observer notifications - -Event - optionally bridges those notifications into Events -``` +The currently known reciprocal optional Event/ESP-Now relationship is an +architectural exception: ```text -Timing - exposes transport-neutral clock synchronization +ESP-Now - - -> Event + ESPNowEventTransport -ESP-Now / Sockets - provide concrete synchronization transports +Event - - -> ESP-Now + ESPNowTransportEventBridge ``` -```text -Event - exposes transport-neutral Event Transport - -ESP-Now / Sockets - provide concrete Event transports -``` - -and: - -```text -Units - provides ordinary Unit types - -Units + Serializable - optionally provides Serializable Unit variants -``` +The preferred resolution is to keep Event upstream and transport-neutral and +move the ESP-Now-specific Observer-to-Event bridge downstream into ESP-Now's +Event integration (or a dedicated downstream integration package). -This keeps the individual libraries independently useful while allowing progressively richer ESPressio compositions without imposing unnecessary dependencies on applications that do not use those integrations. +No new reciprocal dependency should be introduced. From 211a886b432627255992e6b63ce38bc0ae556af0 Mon Sep 17 00:00:00 2001 From: Simon J Stuart Date: Thu, 20 Aug 2026 23:48:26 +0200 Subject: [PATCH 06/10] ci: refresh Threads 3.1.3 README on feature branch (#45) --- .github/workflows/readme-refresh.yml | 49 ++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 .github/workflows/readme-refresh.yml diff --git a/.github/workflows/readme-refresh.yml b/.github/workflows/readme-refresh.yml new file mode 100644 index 0000000..8fe98c0 --- /dev/null +++ b/.github/workflows/readme-refresh.yml @@ -0,0 +1,49 @@ +name: Refresh dependency README + +on: + push: + branches: + - feature/45-timing-2.2.3-dependency-refresh + +permissions: + contents: write + +jobs: + refresh: + if: github.actor != 'github-actions[bot]' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + ref: feature/45-timing-2.2.3-dependency-refresh + - name: Refresh current-version documentation + shell: python + run: | + from pathlib import Path + path = Path('README.md') + text = path.read_text() + replacements = [ + ('This source tree is version **3.1.2**.', 'This source tree is version **3.1.3**.'), + ('ESPressio Threads `3.1.2` targets the **ESP32 family under Arduino-ESP32**.', 'ESPressio Threads `3.1.3` targets the **ESP32 family under Arduino-ESP32**.'), + ('the `3.1.2` PlatformIO package', 'the `3.1.3` PlatformIO package'), + ('flowduino/ESPressio-Threads@^3.1.2', 'flowduino/ESPressio-Threads@^3.1.3'), + ] + for old, new in replacements: + if old not in text: + raise SystemExit(f'missing expected README text: {old}') + text = text.replace(old, new, 1) + marker = 'Refer to the GitHub Releases page for the latest published release/tag.\n' + addition = marker + '\nCurrent required ESPressio baselines:\n\n```text\nTiming >= 2.2.3 < 3.0.0\nObservable >= 3.0.1 < 4.0.0\n```\n\nTiming 2.2.3 carries Units 0.2.2 downstream; Serializable remains optional through Serializable Unit representations rather than becoming a direct Threads dependency.\n' + if addition not in text: + if marker not in text: + raise SystemExit('missing release marker') + text = text.replace(marker, addition, 1) + path.write_text(text) + - name: Commit README + run: | + if git diff --quiet -- README.md; then exit 0; fi + git config user.name 'github-actions[bot]' + git config user.email '41898282+github-actions[bot]@users.noreply.github.com' + git add -- README.md + git commit -m 'docs: refresh Threads 3.1.3 README (#45)' + git push origin HEAD:feature/45-timing-2.2.3-dependency-refresh From 365e37ef8f085b1c9f3b6deefc4d0be4393c6602 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 20 Aug 2026 21:48:35 +0000 Subject: [PATCH 07/10] docs: refresh Threads 3.1.3 README (#45) --- README.md | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 735d6e9..d7b2290 100644 --- a/README.md +++ b/README.md @@ -4,15 +4,24 @@ Threading Components of the Flowduino ESPressio Development Platform. Light-weight and easy-to-use Threading for your Microcontroller development work. ## Current Source Version -This source tree is version **3.1.2**. +This source tree is version **3.1.3**. Refer to the GitHub Releases page for the latest published release/tag. +Current required ESPressio baselines: + +```text +Timing >= 2.2.3 < 3.0.0 +Observable >= 3.0.1 < 4.0.0 +``` + +Timing 2.2.3 carries Units 0.2.2 downstream; Serializable remains optional through Serializable Unit representations rather than becoming a direct Threads dependency. + ## Compatibility -ESPressio Threads `3.1.2` targets the **ESP32 family under Arduino-ESP32**. This includes classic ESP32 and current single- and multi-core variants such as ESP32-S2, ESP32-S3, ESP32-C3, ESP32-C6, ESP32-H2, and ESP32-P4 when supported by the installed Arduino-ESP32/framework version. Single-core devices use CPU 0; multiple hardware cores are not required. +ESPressio Threads `3.1.3` targets the **ESP32 family under Arduino-ESP32**. This includes classic ESP32 and current single- and multi-core variants such as ESP32-S2, ESP32-S3, ESP32-C3, ESP32-C6, ESP32-H2, and ESP32-P4 when supported by the installed Arduino-ESP32/framework version. Single-core devices use CPU 0; multiple hardware cores are not required. -The implementation directly uses ESP-IDF FreeRTOS task, queue, semaphore, and task-local-storage APIs through Arduino-ESP32. The source architecture remains intentionally close to ESP-IDF and the repository retains its CMake/component files, but the `3.1.2` PlatformIO package does **not currently advertise pure ESP-IDF framework support** because the published ESPressio Timing/Units dependency chain does not yet advertise the same framework compatibility. +The implementation directly uses ESP-IDF FreeRTOS task, queue, semaphore, and task-local-storage APIs through Arduino-ESP32. The source architecture remains intentionally close to ESP-IDF and the repository retains its CMake/component files, but the `3.1.3` PlatformIO package does **not currently advertise pure ESP-IDF framework support** because the published ESPressio Timing/Units dependency chain does not yet advertise the same framework compatibility. The library is not compatible with ESP8266 or non-ESP32 families such as AVR, SAMD, RP2040, STM32, or Renesas merely because another FreeRTOS port is available there. @@ -64,7 +73,7 @@ You can quickly and easily add this library to your project in PlatformIO by sim ```ini lib_deps = - flowduino/ESPressio-Threads@^3.1.2 + flowduino/ESPressio-Threads@^3.1.3 ``` Alternatively, if you want to use the bleeding-edge (effectively "Developer Integration Testing" or "DIT") sources, you can instead use: From efc21c0e9fea4b1babfa1ec052028fb45ea8fa95 Mon Sep 17 00:00:00 2001 From: Simon J Stuart Date: Fri, 21 Aug 2026 00:06:24 +0200 Subject: [PATCH 08/10] chore: remove temporary Threads README helper (#45) --- .github/workflows/readme-refresh.yml | 49 ---------------------------- 1 file changed, 49 deletions(-) delete mode 100644 .github/workflows/readme-refresh.yml diff --git a/.github/workflows/readme-refresh.yml b/.github/workflows/readme-refresh.yml deleted file mode 100644 index 8fe98c0..0000000 --- a/.github/workflows/readme-refresh.yml +++ /dev/null @@ -1,49 +0,0 @@ -name: Refresh dependency README - -on: - push: - branches: - - feature/45-timing-2.2.3-dependency-refresh - -permissions: - contents: write - -jobs: - refresh: - if: github.actor != 'github-actions[bot]' - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - ref: feature/45-timing-2.2.3-dependency-refresh - - name: Refresh current-version documentation - shell: python - run: | - from pathlib import Path - path = Path('README.md') - text = path.read_text() - replacements = [ - ('This source tree is version **3.1.2**.', 'This source tree is version **3.1.3**.'), - ('ESPressio Threads `3.1.2` targets the **ESP32 family under Arduino-ESP32**.', 'ESPressio Threads `3.1.3` targets the **ESP32 family under Arduino-ESP32**.'), - ('the `3.1.2` PlatformIO package', 'the `3.1.3` PlatformIO package'), - ('flowduino/ESPressio-Threads@^3.1.2', 'flowduino/ESPressio-Threads@^3.1.3'), - ] - for old, new in replacements: - if old not in text: - raise SystemExit(f'missing expected README text: {old}') - text = text.replace(old, new, 1) - marker = 'Refer to the GitHub Releases page for the latest published release/tag.\n' - addition = marker + '\nCurrent required ESPressio baselines:\n\n```text\nTiming >= 2.2.3 < 3.0.0\nObservable >= 3.0.1 < 4.0.0\n```\n\nTiming 2.2.3 carries Units 0.2.2 downstream; Serializable remains optional through Serializable Unit representations rather than becoming a direct Threads dependency.\n' - if addition not in text: - if marker not in text: - raise SystemExit('missing release marker') - text = text.replace(marker, addition, 1) - path.write_text(text) - - name: Commit README - run: | - if git diff --quiet -- README.md; then exit 0; fi - git config user.name 'github-actions[bot]' - git config user.email '41898282+github-actions[bot]@users.noreply.github.com' - git add -- README.md - git commit -m 'docs: refresh Threads 3.1.3 README (#45)' - git push origin HEAD:feature/45-timing-2.2.3-dependency-refresh From 63f175e59e3470c7a5c4f814e975e52220232085 Mon Sep 17 00:00:00 2001 From: Simon J Stuart Date: Fri, 21 Aug 2026 00:10:08 +0200 Subject: [PATCH 09/10] ci: validate Threads 3.1.3 dependency refresh (#45) --- .../workflows/dependency-refresh-tests.yml | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 .github/workflows/dependency-refresh-tests.yml diff --git a/.github/workflows/dependency-refresh-tests.yml b/.github/workflows/dependency-refresh-tests.yml new file mode 100644 index 0000000..5a2b3b3 --- /dev/null +++ b/.github/workflows/dependency-refresh-tests.yml @@ -0,0 +1,69 @@ +name: Dependency Refresh Tests + +on: + push: + branches: + - feature/45-timing-2.2.3-dependency-refresh + pull_request: + branches: + - main + +jobs: + esp32-compile: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + path: project/ESPressio-Threads + - uses: actions/checkout@v4 + with: + repository: Flowduino/ESPressio-Timing + ref: feature/5-units-0.2.2-dependency-refresh + path: project/dependencies/ESPressio-Timing + - uses: actions/checkout@v4 + with: + repository: Flowduino/ESPressio-Units + ref: feature/2-serializable-0.10.1-dependency-refresh + path: project/dependencies/ESPressio-Units + - uses: actions/checkout@v4 + with: + repository: Flowduino/ESPressio-Observable + ref: 3.0.1 + path: project/dependencies/ESPressio-Observable + - uses: actions/setup-python@v5 + with: + python-version: '3.x' + - name: Install PlatformIO + run: pip install platformio + - name: Create consumer project + shell: bash + run: | + mkdir -p project/compile/src + cat > project/compile/platformio.ini <<'EOF' + [env:esp32] + platform = espressif32 + board = esp32dev + framework = arduino + build_flags = + -std=gnu++17 + -frtti + build_unflags = + -std=gnu++11 + -fno-rtti + lib_ldf_mode = deep+ + lib_deps = + ../dependencies/ESPressio-Observable + ../dependencies/ESPressio-Units + ../dependencies/ESPressio-Timing + ../ESPressio-Threads + EOF + cat > project/compile/src/main.cpp <<'EOF' + #include + #include + #include + + void setup() {} + void loop() {} + EOF + - name: Compile Threads against Timing 2.2.3 candidate + run: pio run -d project/compile From 7897bb28ebbb9c518608eaedde44f34af5a62c17 Mon Sep 17 00:00:00 2001 From: Simon J Stuart Date: Fri, 21 Aug 2026 00:28:22 +0200 Subject: [PATCH 10/10] ci: validate released Timing 2.2.3 and Units 0.2.2 (#45) --- .github/workflows/dependency-refresh-tests.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/dependency-refresh-tests.yml b/.github/workflows/dependency-refresh-tests.yml index 5a2b3b3..496afe3 100644 --- a/.github/workflows/dependency-refresh-tests.yml +++ b/.github/workflows/dependency-refresh-tests.yml @@ -18,12 +18,12 @@ jobs: - uses: actions/checkout@v4 with: repository: Flowduino/ESPressio-Timing - ref: feature/5-units-0.2.2-dependency-refresh + ref: 2.2.3 path: project/dependencies/ESPressio-Timing - uses: actions/checkout@v4 with: repository: Flowduino/ESPressio-Units - ref: feature/2-serializable-0.10.1-dependency-refresh + ref: 0.2.2 path: project/dependencies/ESPressio-Units - uses: actions/checkout@v4 with: @@ -65,5 +65,5 @@ jobs: void setup() {} void loop() {} EOF - - name: Compile Threads against Timing 2.2.3 candidate + - name: Compile Threads against released Timing 2.2.3 run: pio run -d project/compile