example

Example of the component espp/system v1.3.6
# System Info + Control over USB Example

Exposes the espp `SystemService` (device identity / status, reboot, reboot
into the ROM bootloader) and `MonitorService` (heap regions and the task
table, on request or streamed) on the native USB port of an ESP32-S3, over
both the **vendor (WebUSB)** and **CDC (Web Serial)** interfaces. The hosted
[system console web app](https://esp-cpp.github.io/espp/apps/system_console.html)
(`components/system/web/system_console.html`) talks to both services; the
[Device Hub](https://esp-cpp.github.io/espp/apps/dispatcher_hub.html) lists them
through discovery (`espp.system` v1 on module 7, `espp.monitor` v1 on module 8
by default).

## How to use example

### Hardware Required

An ESP32-S3 (or -S2 / -P4) board with the native USB port wired to a host. The
system console / logs go to UART0 (see `sdkconfig.defaults`).

### Build and Flash

```
idf.py set-target esp32s3
idf.py build flash monitor
```

CI builds it with the component manager off (`IDF_COMPONENT_MANAGER=0 idf.py
build`), resolving every dependency from the repository (including the
vendored `esp_tinyusb` / `tinyusb` submodules under `external/`).

Then open the system console web app and Connect (WebUSB or Web Serial):

- **Device info**: chip, ESP-IDF version, application (project, version, build
  date / time, ELF SHA-256), running / boot partition and OTA state, reset
  reason, uptime, MAC, flash / PSRAM size, CPU frequency, heap.
- **Reboot** and **Reboot into bootloader**: the device replies OK and restarts
  after the delay; in the second case it comes back in the ROM download mode
  (the S3's ROM USB CDC / DFU interface) ready for `esptool` / `idf.py flash`.
  The example's `on_reboot_request` callback logs and permits every request.
- **Heap** gauges per region and a **live task table** (CPU %, stack
  high-water mark, priority, core) with a stream toggle and period.

Task statistics need `CONFIG_FREERTOS_USE_TRACE_FACILITY` and
`CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS` (set in `sdkconfig.defaults`).

## Standard USB services

Like every espp USB example, this one serves the standard service set on its
framed USB link(s) next to its own protocol, so the hosted consoles and the
[Device Hub](https://esp-cpp.github.io/espp/apps/dispatcher_hub.html) (which
finds each service through discovery, by protocol id) work against it:

| Service | Module (default) | Protocol id | Console |
|---|---|---|---|
| `espp::SystemService` -- device info, reboot, reboot into the bootloader | 7 | `espp.system` | [system console](https://esp-cpp.github.io/espp/apps/system_console.html) |
| `espp::MonitorService` -- heap regions + task table, on request or streamed | 8 | `espp.monitor` | system console |
| `espp::OtaService` -- firmware update (host-driven rollback confirmation) | 0 | `espp.ota` | [OTA console](https://esp-cpp.github.io/espp/apps/ota_console.html) |
| `espp::CoreDumpService` -- last-crash report, core dump download / erase | 4 | `espp.coredump` | [coredump console](https://esp-cpp.github.io/espp/apps/coredump_console.html) |

`partitions.csv` therefore carries the OTA layout (`otadata`, `ota_0`, `ota_1`)
plus a `coredump` partition, and `sdkconfig.defaults` enables core dumps to
flash, OTA rollback and the FreeRTOS run-time statistics the task monitor
reads. Every device->host write on a transport goes through one mutex, so the
services (and any streaming) never interleave frames.

## Example Output

```
I (317) System Example: Starting system info + control example
I (327) System Example: System:
ESP32-S3 rev 0.2 (2 cores), ESP-IDF v6.1
app: system_example 1 built Sep 30 2026 12:34:56
partition: running 'factory', boot 'factory', OTA state n/a
reset: power-on; uptime 320 ms; MAC 34:85:18:xx:xx:xx
flash 8192 KiB, PSRAM 0 KiB, CPU 240 MHz, heap free 318412 (min 318412)
I (357) System Example: Reboot into the bootloader is supported on this chip
I (1077) System Example: Ready. Connect the native USB port and open the system console ...
```

To create a project from this example, run:

idf.py create-project-from-example "espp/system=1.3.6:example"

or download archive (~7.38 KB)