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:
- Spectrum — amplitude against subcarrier index.
- Phase — unwrapped phase in radians against subcarrier index.
- Waterfall — an amplitude heatmap over time and subcarrier.
- Signal — RSSI and SNR (
rssi − noise_floor) trended over time. - Stats — live
esp-csi-rscounters (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.
Relevant Links & Resources
Source: csi-rs/esp-csi-litetui-rs