Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
1eeec20
feat: add Command observable monitor
LK-Simon Aug 20, 2026
9e2fd57
feat: expose Command observable monitor
LK-Simon Aug 20, 2026
1a8d0f5
feat: add Security observable monitor
LK-Simon Aug 20, 2026
a127502
feat: expose Security observable monitor
LK-Simon Aug 20, 2026
68118cc
feat: add socket worker observable monitor
LK-Simon Aug 20, 2026
849da16
feat: add socket security session monitor
LK-Simon Aug 20, 2026
6d69913
feat: expose socket worker monitor
LK-Simon Aug 20, 2026
e33e0f2
feat: expose socket security session monitor
LK-Simon Aug 20, 2026
e18250c
feat: add ESP-NOW observable monitor
LK-Simon Aug 20, 2026
caa33d5
feat: expose ESP-NOW observable monitor
LK-Simon Aug 20, 2026
181c31f
feat: extend aggregate diagnostics with observable monitors
LK-Simon Aug 20, 2026
0e509a6
chore: bump Serial to 0.5.0
LK-Simon Aug 20, 2026
68ddba8
chore: update Serial Arduino metadata
LK-Simon Aug 20, 2026
b71031f
chore: update Serial component version and include paths
LK-Simon Aug 20, 2026
02f0427
docs: expose observable monitor entry points
LK-Simon Aug 20, 2026
831fe56
docs: add Serial 0.5.0 changelog
LK-Simon Aug 20, 2026
210448f
docs: document Serial 0.5.0 observable monitors
LK-Simon Aug 20, 2026
a78bbbc
docs: restore full README and document observable monitors
LK-Simon Aug 20, 2026
33b78fd
ci: validate Serial 0.5.0 against released observer dependencies
LK-Simon Aug 20, 2026
511e288
docs: refresh Serial 0.5.0 dependency chart
LK-Simon Aug 20, 2026
8eb2107
test: include Observable for Command 0.3.0 host contracts
LK-Simon Aug 20, 2026
7aee430
ci: include Observable in Command 0.3.0 host validation
LK-Simon Aug 20, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
112 changes: 108 additions & 4 deletions .github/workflows/host-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ name: Host Tests

on:
push:
branches: [main]
branches: [main, feature/observable-callback-coverage]
pull_request:

jobs:
Expand All @@ -11,15 +11,119 @@ jobs:
steps:
- name: Checkout Serial
uses: actions/checkout@v4
- name: Checkout ESPressio Command 0.2.0
- name: Checkout ESPressio Command 0.3.0
uses: actions/checkout@v4
with:
repository: Flowduino/ESPressio-Command
ref: 0.2.0
ref: 0.3.0
path: deps/ESPressio-Command
- name: Checkout ESPressio Observable 3.0.1
uses: actions/checkout@v4
with:
repository: Flowduino/ESPressio-Observable
ref: 3.0.1
path: deps/ESPressio-Observable
- name: Configure
run: cmake -S tests -B build -DESPRESSIO_COMMAND_INCLUDE_DIR="$GITHUB_WORKSPACE/deps/ESPressio-Command/src"
run: >-
cmake -S tests -B build
-DESPRESSIO_COMMAND_INCLUDE_DIR="$GITHUB_WORKSPACE/deps/ESPressio-Command/src"
-DESPRESSIO_OBSERVABLE_INCLUDE_DIR="$GITHUB_WORKSPACE/deps/ESPressio-Observable/src"
- name: Build
run: cmake --build build --parallel
- name: Test
run: ctest --test-dir build --output-on-failure

esp32-observable-monitors:
runs-on: ubuntu-latest
steps:
- name: Checkout Serial
uses: actions/checkout@v4
with:
path: project/ESPressio-Serial
- name: Checkout ESPressio Observable 3.0.1
uses: actions/checkout@v4
with:
repository: Flowduino/ESPressio-Observable
ref: 3.0.1
path: project/dependencies/ESPressio-Observable
- name: Checkout ESPressio Units 0.2.1
uses: actions/checkout@v4
with:
repository: Flowduino/ESPressio-Units
ref: 0.2.1
path: project/dependencies/ESPressio-Units
- name: Checkout ESPressio Timing 2.2.2
uses: actions/checkout@v4
with:
repository: Flowduino/ESPressio-Timing
ref: 2.2.2
path: project/dependencies/ESPressio-Timing
- name: Checkout ESPressio Command 0.3.0
uses: actions/checkout@v4
with:
repository: Flowduino/ESPressio-Command
ref: 0.3.0
path: project/dependencies/ESPressio-Command
- name: Checkout ESPressio Security 0.2.0
uses: actions/checkout@v4
with:
repository: Flowduino/ESPressio-Security
ref: 0.2.0
path: project/dependencies/ESPressio-Security
- name: Checkout ESPressio Sockets 0.5.0
uses: actions/checkout@v4
with:
repository: Flowduino/ESPressio-Sockets
ref: 0.5.0
path: project/dependencies/ESPressio-Sockets
- name: Checkout ESPressio ESP-Now 0.5.0
uses: actions/checkout@v4
with:
repository: Flowduino/ESPressio-ESP-Now
ref: 0.5.0
path: project/dependencies/ESPressio-ESP-Now
- uses: actions/setup-python@v5
with:
python-version: '3.x'
- name: Install PlatformIO
run: pip install platformio
- name: Create monitor compile 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
-I../dependencies/ESPressio-Command/src
-I../dependencies/ESPressio-Security/src
-I../dependencies/ESPressio-Sockets/src
-I../dependencies/ESPressio-ESP-Now/src
build_unflags =
-std=gnu++11
-fno-rtti
lib_ldf_mode = deep+
lib_deps =
../dependencies/ESPressio-Observable
../dependencies/ESPressio-Units
../dependencies/ESPressio-Timing
../ESPressio-Serial
EOF
cat > project/compile/src/main.cpp <<'EOF'
#include <Arduino.h>
#include <WiFi.h>
#include <ESPressio_CommandMonitor.hpp>
#include <ESPressio_SecurityMonitor.hpp>
#include <ESPressio_SocketWorkerMonitor.hpp>
#include <ESPressio_SocketSecuritySessionMonitor.hpp>
#include <ESPressio_ESPNowTransportMonitor.hpp>

void setup() {}
void loop() {}
EOF
- name: Compile ESP32 Observable monitors
run: pio run -d project/compile
10 changes: 10 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,13 @@
## 0.5.0

- Added opt-in `CommandMonitor` for ESPressio Command 0.3.x registry lifecycle observation.
- Added opt-in `SecurityMonitor` for ESPressio Security 0.2.x configuration, session, replay and failure observation.
- Added opt-in `SocketWorkerMonitor` and `SocketSecuritySessionMonitor` for ESPressio Sockets 0.5.x lifecycle observation.
- Added opt-in `ESPNowTransportMonitor` for ESPressio ESP-Now 0.5.x transport, peer and send lifecycle observation.
- Extended `DiagnosticMonitor` with optional Command and ESP-Now monitoring while preserving its existing default behavior.
- Updated the validated optional ESPressio Event integration baseline to Event 5.8.0 within the 5.x line.
- Preserved Serial's dependency-free core: all new monitors are selected explicitly and observe the originating subsystem rather than duplicating its lifecycle semantics.

## 0.4.0

- Added optional ESPressio Command 0.2.x integration through `CommandConsole`.
Expand Down
98 changes: 66 additions & 32 deletions ESPRESSIO_DEPENDENCY_CHART.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,88 +4,122 @@

## Purpose

This document describes the current dependency relationships between ESPressio libraries.
This document describes the current dependency relationships between ESPressio libraries relevant to ESPressio Serial 0.5.0.

The chart is hierarchical: libraries with no **required** ESPressio dependencies appear at the top, while libraries that build on progressively more of the ecosystem appear lower.

- **Solid arrow** — required ESPressio dependency.
- **Dashed arrow** — opt-in dependency activated only by the associated feature/header.
- Arrows point from the dependent library to the library it consumes.

## ESPressio Serial 0.4.0
## ESPressio Serial 0.5.0

The ESPressio Serial core and generic `Console` have no required ESPressio dependency.

All integrations remain opt-in.

### CommandConsole
### CommandConsole and CommandMonitor

`CommandConsole` consumes:
`CommandConsole` and `CommandMonitor` consume:

```text
ESPressio Command >= 0.2.0 < 1.0.0
ESPressio Command >= 0.3.0 < 1.0.0
```

Command supplies the transport-neutral typed Command registry, parsing, validation, invocation, help/completion metadata, and ownership-safe scoped command registration used by dynamic Serial integrations.
Command supplies the transport-neutral typed Command registry, parsing, validation, invocation, help/completion metadata, scoped command registration, and Observable registry lifecycle used by Serial's Command integrations.

### EventMonitor
### SecurityMonitor

`EventMonitor` consumes:
`SecurityMonitor` consumes:

```text
ESPressio Event >= 5.7.1 < 6.0.0
ESPressio Serializable >= 0.10.0 < 1.0.0
ESPressio Security >= 0.2.0 < 1.0.0
```

Event supplies the Event Transport Transaction Observation stream.
Security supplies the Observable configuration, secure-session, replay-protection, and failure lifecycle observed directly by the monitor.

Serializable supplies structured payload decoding used for human-readable diagnostic output.
### Socket monitors

### Timing and Threads monitors
`SocketWorkerMonitor` consumes:

`SystemClockMonitor` optionally consumes:
```text
ESPressio Sockets >= 0.5.0 < 1.0.0
```

`SocketSecuritySessionMonitor` consumes:

```text
ESPressio Timing >= 2.2.2 < 3.0.0
ESPressio Sockets >= 0.5.0 < 1.0.0
ESPressio Security >= 0.2.0 < 1.0.0
```

`ThreadMonitor` optionally consumes:
Sockets supplies the Observable socket worker and secure-session lifecycle contracts. Security is only relevant to the secure-session integration.

### ESPNowTransportMonitor

`ESPNowTransportMonitor` consumes:

```text
ESPressio Threads >= 3.1.2 < 4.0.0
ESPressio ESP-Now >= 0.5.0 < 1.0.0
```

## ESPressio Serial Event Console
ESP-Now supplies the Observable transport, peer, and send lifecycle contract.

The legacy EventConsole initialization path remains supported for compatibility.
### EventMonitor and EventConsole

The recommended Serial 0.4.0 Command-backed EventConsole integration consumes:
`EventMonitor` consumes:

```text
ESPressio Command >= 0.2.0 < 1.0.0
ESPressio Event >= 5.7.1 < 6.0.0
ESPressio Event >= 5.8.0 < 6.0.0
ESPressio Serializable >= 0.10.0 < 1.0.0
```

Command supplies the shared `event`/`events` command tree and scoped registration lifetime.
Event supplies the Event Transport Transaction Observation stream. Serializable supplies structured payload decoding used for human-readable diagnostic output.

Event supplies runtime Serializable Event discovery, descriptors, construction and dispatch.
The legacy EventConsole initialization path remains supported for compatibility. The recommended Command-backed EventConsole integration consumes:

Serializable supplies `JsonArchive` and validation diagnostics.
```text
ESPressio Command >= 0.3.0 < 1.0.0
ESPressio Event >= 5.8.0 < 6.0.0
ESPressio Serializable >= 0.10.0 < 1.0.0
```

Command supplies the shared `event`/`events` command tree and scoped registration lifetime. Event supplies runtime Serializable Event discovery, descriptors, construction and dispatch. Serializable supplies `JsonArchive` and validation diagnostics.

The external ArduinoJson dependency is required only by the optional Serializable `JsonArchive`; it is outside this ESPressio-to-ESPressio dependency chart.

Applications using only the core ESPressio Serial layer acquire none of these optional ESPressio dependencies.
### Timing and Threads monitors

`SystemClockMonitor` optionally consumes:

```text
ESPressio Timing >= 2.2.2 < 3.0.0
```

`ThreadMonitor` optionally consumes:

## Other current relationships
```text
ESPressio Threads >= 3.1.2 < 4.0.0
```

### Event bridges versus Serial monitors

The 0.5.0 Observable monitors subscribe directly to the originating subsystem. They do not require ESPressio Event.

ESPressio Event 5.8.0 separately supplies optional Event bridges for Command, Security, Sockets, and ESP-Now when asynchronous Event conversion is desired. Serial diagnostics therefore remain usable without introducing Event as an intermediary.

## Current ecosystem relationships

- Observable 3.0.1 has no mandatory ESPressio dependencies.
- Serializable 0.10.0 has no mandatory ESPressio dependencies.
- Units 0.2.1 optionally consumes Serializable for Serializable Unit counterparts.
- Timing 2.2.2 requires Units and Observable.
- Threads 3.1.2 requires Timing and Observable.
- Event 5.7.1 requires Threads, Timing, and Observable; Serializable functionality remains opt-in.
- ESP-Now 0.2.3 requires Timing and optionally Event for ESP-NOW Event Transport.
- Sockets 0.2.3 has no mandatory ESPressio dependency but optionally consumes Event and Timing.
- Command 0.2.0 has no mandatory ESPressio dependencies.
- Serial 0.4.0 has no mandatory ESPressio dependencies; Command/Event/Serializable/Timing/Threads integrations are opt-in.
- Security 0.2.0 requires Observable; Event conversion is opt-in downstream through Event 5.8.0.
- Command 0.3.0 requires Observable; Event conversion is opt-in downstream through Event 5.8.0.
- Sockets 0.5.0 consumes Observable for lifecycle observation and optionally integrates Command and Security.
- ESP-Now 0.5.0 requires Timing and Observable and optionally integrates Command, Security, and Event transport functionality.
- Event 5.8.0 requires Threads, Timing, and Observable and optionally bridges Security, Command, Sockets, and ESP-Now observer contracts.
- Serial 0.5.0 has no mandatory ESPressio dependencies; Command, Security, Sockets, ESP-Now, Event, Serializable, Timing, and Threads integrations are all opt-in.

Applications using only the core ESPressio Serial layer acquire none of these optional ESPressio dependencies.
36 changes: 35 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,36 @@ Version 0.3.0 adds a reusable Stream/Print command console and an opt-in operato

The latest stable version is **0.4.0**.

## Current Development Version — 0.5.0

The `feature/observable-callback-coverage` branch targets **0.5.0** and extends Serial's diagnostics layer to consume the new Observable lifecycle contracts provided by ESPressio Command, Security, Sockets, and ESP-Now.

Core ESPressio Serial remains free of mandatory ESPressio-library dependencies. The new monitors are selected only when their corresponding upstream headers are available:

```text
CommandMonitor
- - -> ESPressio Command >= 0.3.0 < 1.0.0

SecurityMonitor
- - -> ESPressio Security >= 0.2.0 < 1.0.0

SocketWorkerMonitor
- - -> ESPressio Sockets >= 0.5.0 < 1.0.0

SocketSecuritySessionMonitor
- - -> ESPressio Sockets >= 0.5.0 < 1.0.0
- - -> ESPressio Security >= 0.2.0 < 1.0.0

ESPNowTransportMonitor
- - -> ESPressio ESP-Now >= 0.5.0 < 1.0.0
```

`DiagnosticMonitor` can additionally compose `CommandMonitor` and `ESPNowTransportMonitor` when those dependencies are present. Security and Socket monitors remain instance-oriented because the application must choose the specific `TransportSecurity`, `SocketWorker`, or `SocketSecuritySession` object to observe.

These monitors subscribe directly to the originating library's Observable contract. They do not invent parallel Serial lifecycle semantics and do not require ESPressio Event. Event-backed observation remains a separate opt-in integration in ESPressio Event 5.8.0.

The complete historical/stable documentation below remains intact.

## ESPressio Development Platform

ESPressio is a collection of discrete, composable component libraries designed around a common development ethos:
Expand Down Expand Up @@ -53,6 +83,8 @@ ESPressio Event >= 5.7.1 < 6.0.0
ESPressio Serializable >= 0.10.0 < 1.0.0
```

For the 0.5.0 development branch, the additional opt-in monitoring dependencies are listed in the development-version section above. Existing Event Monitor/EventConsole guidance below remains the stable 0.4.0 baseline unless explicitly identified otherwise.

For the complete ecosystem hierarchy, see:

**[ESPressio Library Dependency Chart](ESPRESSIO_DEPENDENCY_CHART.md)**
Expand Down Expand Up @@ -625,6 +657,8 @@ void setup() {

The aggregate uses compile-time feature detection. It does not itself make Timing, Threads, Event, or Serializable mandatory package dependencies.

In the 0.5.0 development branch, `DiagnosticMonitorConfig` additionally supports `Commands` and `ESPNow`. These remain disabled by default and are available only when the corresponding optional upstream headers are present.

## Dependency model

```text
Expand All @@ -645,7 +679,7 @@ EventMonitor
- - -> ESPressio Serializable >= 0.10.0 < 1.0.0
```

All ESPressio relationships remain opt-in.
All ESPressio relationships remain opt-in. The 0.5.0 development observer monitors add the additional optional relationships documented near the top of this README.

---

Expand Down
8 changes: 6 additions & 2 deletions component.mk
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
COMPONENT_ADD_INCLUDEDIRS := \
src \
src/console \
src/command \
src/command-console \
src/diagnostics \
src/espnow \
src/event \
src/event-console \
src/logging \
src/security \
src/sockets \
src/threads \
src/timing

Expand All @@ -16,6 +20,6 @@ CXXFLAGS += -std=gnu++17
CPPFLAGS += \
-DESPRESSIO_SERIAL \
-DESPRESSIO_SERIAL_VERSION_MAJOR=0 \
-DESPRESSIO_SERIAL_VERSION_MINOR=4 \
-DESPRESSIO_SERIAL_VERSION_MINOR=5 \
-DESPRESSIO_SERIAL_VERSION_PATCH=0 \
-DESPRESSIO_SERIAL_VERSION_STRING=\"0.4.0\"
-DESPRESSIO_SERIAL_VERSION_STRING=\"0.5.0\"
Loading
Loading