Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

esp-csi-litetui-rs

esp-csi-litetui-rs turns an M5Stack CoreS3 SE — an ESP32-S3 with a 320×240 touchscreen and a microSD slot — into a handheld Wi-Fi CSI scope. It captures through esp-csi-rs, renders live views to the LCD, and logs every packet to the SD card for off-line analysis.

It sits in Tier 1: firmware you flash rather than a library you build against. What distinguishes it from esp-csi-cli-rs is that there is no host in the loop at all — configuration happens on the touchscreen and the capture lands on a memory card. That makes it the right tool for walking a building, or for any measurement where dragging a laptop along is the awkward part.

Like the other on-device front-ends, it is not published to crates.io; build it from the repository.

What You See

The setup screen configures node mode, channel, traffic rate (which doubles as the emitter’s injection rate), the HT40 secondary channel, the CSI sub-options, the delivery mode, and the log format — all by touch. Starting a capture switches to the live screen, which cycles through five instrument tabs:

  1. Spectrum — amplitude against subcarrier index.
  2. Phase — unwrapped phase in radians against subcarrier index.
  3. Waterfall — an amplitude heatmap over time and subcarrier.
  4. Signal — RSSI and SNR (rssi − noise_floor) trended over time.
  5. Stats — live esp-csi-rs counters (RX and TX packets per second, rate, totals, drops) alongside last-packet metadata: PHY, bandwidth, MCS, frame format classification, noise floor, sequence number, and CSI length.

The axes carry real units and there is no decorative chrome, which is the point — it is an instrument, not a demo.

Because the device is normally a collector, selecting one of the emitter modes replaces the instrument tabs with a transmit-status screen. An emitter captures nothing; point a second device at the same channel in sniffer mode to measure what it is putting out.

Logging to SD

The card must be formatted FAT32 or FAT16 — exFAT is not supported. A session opens its file once and writes incrementally, with dropped-record counts and SD status surfaced live on the Stats tab.

Two formats are available. The default is compact binary (CSInnnnn.BIN) — COBS-framed postcard records, exactly the Serialized format described in CSI Data Formats. A bundled pure-Python script converts it:

python3 tools/bin_to_csv.py CAPTURE.BIN   # -> CAPTURE.csv

The alternative is CSV (CSInnnnn.CSV), written directly — one row per packet, with an fmt column carrying the frame classification and a csi column holding the raw samples space-separated.

Building It

The Espressif Rust toolchain (via espup) and espflash are prerequisites. The target, runner, and build-std settings are preconfigured.

# Station mode joins this network — edit before flashing:
#   src/config.rs : WIFI_SSID / WIFI_PASSWORD

cargo run --release   # builds, flashes, and opens the serial monitor

Two Notes on Node Modes

Its README is out of step with upstream on ESP-NOW. The repository’s upgrade note states that esp-csi-rs removed its ESP-NOW transport and that mode indices 3–6 are permanently retired. That was true of an interim branch, but not of the release: esp-csi-rs 0.10.1 retains the ESP-NOW central and peripheral topologies, and esp-csi-cli-rs still exposes four ESP-NOW modes. If you are reading that note while planning a deployment, treat it as a statement about this firmware’s own mode list rather than about the ecosystem.

A saved configuration from an older build may not restore. Retired mode indices resolve to nothing, fall back to Sniffer, and log a one-line notice on the serial port. Reselect the mode you want on the setup screen. Station, Sniffer, and AP collector keep their indices and are unaffected.

Source: csi-rs/esp-csi-litetui-rs