diff --git a/.github/workflows/host-tests.yml b/.github/workflows/host-tests.yml index 1d13025..9292fb9 100644 --- a/.github/workflows/host-tests.yml +++ b/.github/workflows/host-tests.yml @@ -4,7 +4,7 @@ on: push: branches: - main - - feature/observable-callback-coverage + - feature/10-timing-2.2.3-dependency-refresh pull_request: branches: - main @@ -53,13 +53,13 @@ jobs: - uses: actions/checkout@v4 with: repository: Flowduino/ESPressio-Timing - ref: 2.2.2 + ref: 2.2.3 path: deps/ESPressio-Timing - uses: actions/checkout@v4 with: repository: Flowduino/ESPressio-Units - ref: 0.2.1 + ref: 0.2.2 path: deps/ESPressio-Units - uses: actions/checkout@v4 diff --git a/.github/workflows/security-integration-tests.yml b/.github/workflows/security-integration-tests.yml index c056ecb..bdd118d 100644 --- a/.github/workflows/security-integration-tests.yml +++ b/.github/workflows/security-integration-tests.yml @@ -2,7 +2,7 @@ name: Security Integration on: push: - branches: [feature/security-integration, feature/observable-callback-coverage, main] + branches: [feature/security-integration, feature/10-timing-2.2.3-dependency-refresh, main] pull_request: branches: [main] @@ -43,12 +43,12 @@ jobs: - uses: actions/checkout@v4 with: repository: Flowduino/ESPressio-Timing - ref: 2.2.2 + ref: 2.2.3 path: deps/ESPressio-Timing - uses: actions/checkout@v4 with: repository: Flowduino/ESPressio-Units - ref: 0.2.1 + ref: 0.2.2 path: deps/ESPressio-Units - uses: actions/checkout@v4 with: diff --git a/CHANGELOG.md b/CHANGELOG.md index 420a32d..ddb6073 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,18 @@ # Changelog +## 0.5.1 — 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 required ESPressio Observable baseline at `>=3.0.1 <4.0.0`. +- Preserved Command >= 0.3.0 < 1.0.0 and Security >= 0.2.0 < 1.0.0 as opt-in integration baselines. +- Updated package and compile-time version metadata to 0.5.1. +- Documented the existing reciprocal optional Event/ESP-Now integration as an architectural dependency-cycle exception pending downstream relocation of the ESP-Now-specific Observer-to-Event bridge. + +### Compatibility +- ESP-NOW transport, clock synchronization, Event Transport, Command Transport, Security integration, and Observable APIs remain source-compatible with 0.5.0. +- Event remains opt-in; no new mandatory Event dependency is introduced. + ## 0.5.0 — 2026-08-20 ### Added @@ -102,7 +115,7 @@ Versioning](https://semver.org/). - Existing ESP-NOW System Clock synchronization remains unchanged. - Event Transport remains opt-in; applications using only ESP-NOW/Timing functionality do not acquire ESPressio Event or Serializable dependencies. -## \[0.2.0\] - 2026-08-19 +## [0.2.0] - 2026-08-19 ### Added @@ -126,7 +139,7 @@ Versioning](https://semver.org/). - Preserved receive-callback isolation and existing Timing/System Clock synchronization. -## \[0.1.0\] - 2026-08-18 +## [0.1.0] - 2026-08-18 ### Added diff --git a/ESPRESSIO_DEPENDENCY_CHART.md b/ESPRESSIO_DEPENDENCY_CHART.md index 3770437..eaec180 100644 --- a/ESPRESSIO_DEPENDENCY_CHART.md +++ b/ESPRESSIO_DEPENDENCY_CHART.md @@ -1,23 +1,46 @@ -# ESPressio Dependency Chart — ESP-Now 0.4.0 +# ESPressio Dependency Chart — ESP-Now 0.5.1 -ESPressio ESP-Now keeps core dependencies small and exposes higher-level integrations only when selected by the application. +ESPressio ESP-Now keeps its core dependencies small and exposes higher-level +integrations only when explicitly selected. ```text -ESPressio ESP-Now 0.4.x +ESPressio ESP-Now 0.5.1 | -+-- required --> ESPressio Timing >= 2.2.2 < 3.0.0 ++-- required --> ESPressio Timing >= 2.2.3 < 3.0.0 | -+-- optional --> ESPressio Event >= 5.7.1 < 6.0.0 -| +-- used by ESPNowEventTransport ++-- required --> ESPressio Observable >= 3.0.1 < 4.0.0 | -+-- optional --> ESPressio Command >= 0.2.0 < 1.0.0 -| +-- used by ESPNowCommandTransport ++-- optional --> ESPressio Event >= 5.8.0 < 6.0.0 +| +-- ESPNowEventTransport | -+-- optional --> ESPressio Security >= 0.1.0 < 1.0.0 - +-- used by ESPNowSecureTransport ++-- optional --> ESPressio Command >= 0.3.0 < 1.0.0 +| +-- ESPNowCommandTransport +| ++-- optional --> ESPressio Security >= 0.2.0 < 1.0.0 + +-- ESPNowSecureTransport +``` + +The Event baseline intentionally remains a compatible 5.x range here rather +than creating a hard ESP-Now 0.5.1 -> Event 5.8.1 release dependency. Event is +optional and, importantly, Event 5.8 currently also contains an ESP-Now-specific +Observer bridge. Strengthening both edges would make the reciprocal dependency +more difficult to remove. + +## Transitive Timing chain + +```text +ESP-Now 0.5.1 + -> Timing 2.2.3 + -> Units 0.2.2 + - - -> Serializable >= 0.10.1 < 1.0.0 + only for Serializable Unit representations + -> Observable 3.0.1 ``` -## Security Placement +ESP-Now does not acquire a direct Units or Serializable dependency through this +chain. + +## Security placement ```text Event / Command / Clock Sync / application protocol @@ -35,9 +58,11 @@ Event / Command / Clock Sync / application protocol ESP-NOW ``` -Security is deliberately below application protocol semantics and above the concrete ESP-NOW radio transport. Event, Command, and Timing therefore do not gain direct Security dependencies merely because their payloads may be protected. +Security remains below application protocol semantics and above the concrete +ESP-NOW radio transport. Event, Command, and Timing therefore do not gain direct +Security dependencies merely because their payloads may be protected. -## Optional Dependency Rule +## Optional dependency rule The normal: @@ -46,16 +71,39 @@ The normal: ``` does not include headers that introduce Event, Command, or Security dependencies. +Applications explicitly select the relevant integration headers. -Applications explicitly select: +## Circular-dependency audit -```cpp -#include -#include -#include +The current ecosystem contains one reciprocal optional relationship: + +```text +ESP-Now - - -> Event + ESPNowEventTransport + +Event - - -> ESP-Now + ESPNowTransportEventBridge +``` + +This is not the desired long-term dependency direction. The preferred hierarchy +is: + +```text +Event + ^ + | + | optional downstream integration + | +ESP-Now + +-- ESPNowEventTransport + +-- ESPNowTransportEventBridge (preferred future location) ``` -and must then provide the corresponding library dependency. +`ESPNowTransportEventBridge` is transport-specific integration and should move +downstream into ESP-Now's Event integration, or into a dedicated integration +package, so Event remains transport-neutral and no Event -> ESP-Now edge exists. + +No new reciprocal dependency should be introduced before that relocation. ## PlatformIO @@ -63,21 +111,15 @@ Core: ```ini lib_deps = - https://github.com/Flowduino/ESPressio-ESP-Now@^0.4.0 - https://github.com/Flowduino/ESPressio-Timing@^2.2.2 + https://github.com/Flowduino/ESPressio-ESP-Now@^0.5.1 + https://github.com/Flowduino/ESPressio-Timing@^2.2.3 + https://github.com/Flowduino/ESPressio-Observable@^3.0.1 ``` -Security integration: +Security integration additionally requires: ```ini -lib_deps = - https://github.com/Flowduino/ESPressio-ESP-Now@^0.4.0 - https://github.com/Flowduino/ESPressio-Security@^0.1.0 - https://github.com/Flowduino/ESPressio-Timing@^2.2.2 + https://github.com/Flowduino/ESPressio-Security@^0.2.0 ``` -Command/Event dependencies are added only when those adapters are compiled. - -## Version Policy - -Dependency ranges stay within the currently supported major line so a future breaking major release is not selected automatically. +Command/Event dependencies are added only when their adapters are compiled. diff --git a/README.md b/README.md index 81ee7d2..be73c88 100755 --- a/README.md +++ b/README.md @@ -2,24 +2,20 @@ ESP-NOW transport and distributed ESPressio implementations for the Flowduino ESPressio Development Platform. -ESPressio ESP-Now provides a reusable ESP-NOW transport foundation for ESP32-family applications, distributed System Clock synchronization, optional Event and Command transports, and from 0.4.0 an optional transport-neutral authenticated-encryption layer through ESPressio Security. +ESPressio ESP-Now provides a reusable ESP-NOW transport foundation for ESP32-family applications, distributed System Clock synchronization, optional Event and Command transports, and optional transport-neutral authenticated encryption through ESPressio Security. -## Latest Stable Version +## Current Version — 0.5.1 -The latest Stable Version is **0.4.0**. +ESPressio ESP-Now **0.5.1** is a dependency-maintenance patch over 0.5.0. It retains the Observable transport/peer lifecycle API while raising the required Timing baseline to 2.2.3. -## Current Development Version — 0.5.0 - -The `feature/observable-callback-coverage` branch targets **0.5.0** and adds native Observable coverage for ESP-NOW transport and peer lifecycle without replacing the existing protocol-handler receive path. - -For this development branch, the dependency model is: +Current dependency model: ```text Required - ESPressio Timing >= 2.2.2 < 3.0.0 + ESPressio Timing >= 2.2.3 < 3.0.0 ESPressio Observable >= 3.0.1 < 4.0.0 -Optional Event Transport / observer bridge +Optional Event Transport ESPressio Event >= 5.8.0 < 6.0.0 Optional Command Transport @@ -29,15 +25,13 @@ Optional Secure Transport ESPressio Security >= 0.2.0 < 1.0.0 ``` -`ESPNowTransport` now exposes observable initialization, shutdown, peer-add/remove, and send success/failure lifecycle information. Protocol receive handlers remain the authoritative data-delivery mechanism. +`ESPNowTransport` exposes observable initialization, shutdown, peer-add/remove, and send success/failure lifecycle information. Protocol receive handlers remain the authoritative data-delivery mechanism. -ESPressio Event remains **opt-in**. Event 5.8 provides `ESPNowTransportEventBridge`; ESP-Now itself does not depend on Event. ESPressio Serial 0.5 can consume the same observer contract directly for diagnostics. - -The stable-release documentation below remains intact so existing 0.4.0 users retain accurate historical guidance. +The Event relationship deliberately remains a compatible 5.x opt-in range rather than being tightened to Event 5.8.1: Event currently also hosts an ESP-Now-specific Observer bridge. Strengthening both directions would reinforce a circular optional dependency. The preferred future architecture moves `ESPNowTransportEventBridge` downstream into ESP-Now's optional Event integration, or into a dedicated integration package. ## Compatibility -ESPressio ESP-Now `0.4.0` targets the ESP32 family under Arduino-ESP32 and requires C++17. +ESPressio ESP-Now `0.5.1` targets the ESP32 family under Arduino-ESP32 and requires C++17. The common ESP-NOW transport uses Espressif ESP-NOW/Wi-Fi APIs plus FreeRTOS queues/tasks. The initial ESPressio wire format remains within the classic 250-byte ESP-NOW payload limit for broad compatibility, while higher-level Event, Command, and Security integrations provide their own bounded fragmentation where required. @@ -58,26 +52,27 @@ ESPressio and its component libraries are licensed under the **Apache License 2. ## ESPressio Library Dependencies -### Required for stable 0.4.0 +### Required for 0.5.1 ```text -ESPressio Timing >= 2.2.2 < 3.0.0 +ESPressio Timing >= 2.2.3 < 3.0.0 +ESPressio Observable >= 3.0.1 < 4.0.0 Arduino-ESP32 ``` -The 0.5.0 development branch additionally requires ESPressio Observable >= 3.0.1 < 4.0.0 as documented above. +Timing 2.2.3 carries Units 0.2.2 downstream. Serializable remains optional through selected Serializable Unit/Event facilities and is not a core ESP-Now dependency. -### Optional for stable 0.4.0 +### Optional for 0.5.1 ```text Event Transport - ESPressio Event >= 5.7.1 < 6.0.0 + ESPressio Event >= 5.8.0 < 6.0.0 Command Transport - ESPressio Command >= 0.2.0 < 1.0.0 + ESPressio Command >= 0.3.0 < 1.0.0 Secure Transport - ESPressio Security >= 0.1.0 < 1.0.0 + ESPressio Security >= 0.2.0 < 1.0.0 ``` Optional integrations are intentionally not pulled into the normal umbrella merely because their implementations exist. @@ -107,16 +102,17 @@ ESPNowSecureTransport (optional Security dependency) ESPNowSecurityProtocol ``` -The 0.5.0 development branch additionally exposes `IESPNowTransportObserver` through the core transport. +`IESPNowTransportObserver` is part of the current 0.5.x core transport API. ## PlatformIO -Core ESP-NOW/Timing usage for stable 0.4.0: +Core ESP-NOW/Timing usage: ```ini lib_deps = - https://github.com/Flowduino/ESPressio-ESP-Now@^0.4.0 - https://github.com/Flowduino/ESPressio-Timing@^2.2.2 + https://github.com/Flowduino/ESPressio-ESP-Now@^0.5.1 + https://github.com/Flowduino/ESPressio-Timing@^2.2.3 + https://github.com/Flowduino/ESPressio-Observable@^3.0.1 build_flags = -std=gnu++17 @@ -130,12 +126,10 @@ Add Security when selecting the secure adapter: ```ini lib_deps = - https://github.com/Flowduino/ESPressio-ESP-Now@^0.4.0 - https://github.com/Flowduino/ESPressio-Security@^0.1.0 + https://github.com/Flowduino/ESPressio-ESP-Now@^0.5.1 + https://github.com/Flowduino/ESPressio-Security@^0.2.0 ``` -For the 0.5.0 development branch, also include ESPressio Observable 3.0.1 or newer within the 3.x line, and use the Command/Security floors listed in the development-version section above. - Add Command/Event dependencies only when those adapters are selected. ## Header Structure @@ -192,7 +186,7 @@ transport.AddPeer(peer); `peer.Encrypt` controls native ESP-NOW link encryption and remains independent of ESPressio Security application/transport-layer protection. -In the 0.5.0 development branch, successful peer additions/removals and failed peer-management operations are also available through the transport observer contract. +Successful peer additions/removals and failed peer-management operations are available through the transport observer contract. ## ESPressio ESP-NOW Wire Format @@ -205,7 +199,7 @@ protocol identifier payload length ``` -Protocol allocation in 0.4.0 is: +Protocol allocation is: ```text 1 Clock Synchronization @@ -248,7 +242,7 @@ Call `sync.Update()` regularly for Client modes. The Event integration remains distinct from Command and Security semantics. -The 0.5.0 observer-to-Event bridge is also supplied by ESPressio Event 5.8 rather than by the core ESP-Now umbrella, preserving the dependency direction. +For 0.5.x compatibility, `ESPNowTransportEventBridge` remains supplied by ESPressio Event 5.8. The dependency audit for issue #10 identifies this reciprocal optional relationship as architectural debt: because ESP-Now already consumes Event for `ESPNowEventTransport`, the bridge should ultimately move downstream into this Event integration rather than requiring Event to consume ESP-Now. ## Command Transport @@ -258,7 +252,7 @@ Features include correlation IDs, fragmentation/reassembly, per-peer isolation, ## Secure Transport -0.4.0 introduces `ESPNowSecureTransport` backed by ESPressio Security 0.1.x. +0.4.0 introduced `ESPNowSecureTransport`, backed by ESPressio Security. Architecture: @@ -320,7 +314,7 @@ secure.SetReceiveHandler( ); ``` -Security failures can be observed with the existing secure-adapter failure mechanism without exposing secret key material; the 0.5.0 transport observer adds general ESP-NOW transport/peer lifecycle diagnostics rather than duplicating the Security observer contract. +Security failures can be observed with the existing secure-adapter failure mechanism without exposing secret key material; the 0.5.x transport observer adds general ESP-NOW transport/peer lifecycle diagnostics rather than duplicating the Security observer contract. See [SECURITY_INTEGRATION.md](SECURITY_INTEGRATION.md). @@ -366,20 +360,19 @@ ESPNowSecurityProtocol Security-protocol tests cover protocol allocation, fragmentation, out-of-order reassembly, duplicate fragments, malformed frames, and maximum envelope bounds. -The 0.5.0 development branch additionally validates the native transport observer contract and the refreshed Observable/Command/Security dependency generation. GitHub Actions also compile real ESP32 examples against the coordinated dependencies. +The 0.5.1 candidate validates the native transport observer contract and the refreshed Timing/Units/Observable dependency generation. GitHub Actions also compile real ESP32 examples against the coordinated dependencies. ## Compatibility -0.4.0 is a backward-compatible minor release: +0.5.1 is a backward-compatible dependency-maintenance patch: -- core `ESPNowTransport` APIs are unchanged; +- core `ESPNowTransport` APIs are unchanged from 0.5.0; - clock synchronization APIs are unchanged; - Event Transport APIs are unchanged; - Command Transport APIs are unchanged; -- Security integration is opt-in; -- core ESP-NOW does not acquire a mandatory Security dependency. - -The 0.5.0 development branch is designed as a backward-compatible minor extension. Observable becomes a required core dependency because the core transport now owns its lifecycle observation; Event, Command, and Security integrations remain opt-in. +- Security integration remains opt-in; +- Observable remains the required lifecycle-observation dependency introduced by 0.5.0; +- Event, Command, and Security integrations remain opt-in. ## Contributing @@ -391,4 +384,4 @@ See [CHANGELOG.md](CHANGELOG.md). ## License -Apache License 2.0. See [LICENSE](LICENSE). +Apache License 2.0. See [LICENSE](LICENSE). \ No newline at end of file diff --git a/component.mk b/component.mk index f0fdc57..6ed77f3 100755 --- a/component.mk +++ b/component.mk @@ -5,5 +5,5 @@ COMPONENT_REQUIRES := ESPressio_Timing CXXFLAGS += -DESPRESSIO_ESPNOW CXXFLAGS += -DESPRESSIO_ESPNOW_VERSION_MAJOR=0 CXXFLAGS += -DESPRESSIO_ESPNOW_VERSION_MINOR=5 -CXXFLAGS += -DESPRESSIO_ESPNOW_VERSION_PATCH=0 -CXXFLAGS += -DESPRESSIO_ESPNOW_VERSION_STRING=\"0.5.0\" +CXXFLAGS += -DESPRESSIO_ESPNOW_VERSION_PATCH=1 +CXXFLAGS += -DESPRESSIO_ESPNOW_VERSION_STRING=\"0.5.1\" diff --git a/library.json b/library.json index f689009..fdf4550 100755 --- a/library.json +++ b/library.json @@ -16,14 +16,14 @@ "type": "git", "url": "https://github.com/Flowduino/ESPressio-ESP-Now.git" }, - "version": "0.5.0", + "version": "0.5.1", "license": "Apache-2.0", "frameworks": "arduino", "platforms": "espressif32", "dependencies": [ { "name": "ESPressio-Timing", - "version": ">=2.2.2 <3.0.0", + "version": ">=2.2.3 <3.0.0", "url": "https://github.com/Flowduino/ESPressio-Timing.git", "platforms": "espressif32" }, diff --git a/library.properties b/library.properties index 892be5d..e2aee16 100755 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=Flowduino ESPressio-ESPNow -version=0.5.0 +version=0.5.1 author=Simon J. Stuart maintainer=Flowduino.com sentence=ESP-NOW transport and distributed ESPressio integrations for ESP32 @@ -8,4 +8,4 @@ category=Communication url=https://github.com/Flowduino/ESPressio-ESP-Now architectures=esp32 includes=ESPressio_ESPNow.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)