brainvision
Rust library and terminal UI for Brain Products BrainVision Recorder RDA EEG streams over TCP/IP.
Features
- Pure-Rust BrainVision RDA protocol parser (Start / Data16 / Data32 / Stop)
- High-level
BrainVisionDeviceAPI overTcpStream - Reconnect with exponential backoff
- Stream abstractions:
next_block(),next_scan(),capture() - Marker parsing and export helpers (
CSV, BrainVision-like triplet) - CLI and ratatui TUI binaries
- Optional feature flags:
dsp,verify,sandbox,tui
Installation
Quick start
use *;
let mut dev = connect_default?;
let header = dev.wait_for_start?;
println!;
let scans = dev.capture?;
println!;
Recorder settings
In BrainVision Recorder:
- Enable Remote Data Access (RDA)
- Select port:
51244(int16 stream)51234(float32 stream)
- Start acquisition in Recorder before running client
Environment variables:
BRAINVISION_HOST(default127.0.0.1)BRAINVISION_PORT(default51244)
Protocol frame layout
[GUID:16] [SIZE:4 little-endian] [PAYLOAD: SIZE-20 bytes]
Message GUIDs:
- Start/header
- Data16 (int16 samples)
- Data32 (float32 samples)
- Stop
Data blocks include:
- block number
- number of points
- marker count
- interleaved channel samples
- marker records (
size, position, points, channel, type, description)
Export helpers
write_scans_csv(path, scans)write_markers_csv(path, markers)write_brainvision_triplet(prefix, header, scans, markers)writes:<prefix>.vhdr<prefix>.eeg.csv<prefix>.vmrk.csv
Troubleshooting
- Connected but no Start message
- Ensure Recorder RDA is enabled and acquisition actually started.
- Connection refused
- Check host/port and local firewall.
- Frequent reconnects
- Increase Recorder stability / network quality.
- Use
next_block_resilient()backoff.
- Flat lines or wrong amplitudes
- Verify channel resolutions from Start header.
Project layout
brainvision-rs/
├── src/
│ ├── lib.rs
│ ├── main.rs
│ ├── bin/tui.rs
│ ├── types.rs
│ ├── protocol.rs
│ ├── device.rs
│ ├── export.rs
│ ├── dsp.rs
│ ├── verify.rs
│ ├── sandbox.rs
│ └── error.rs
├── examples/
│ ├── scan.rs
│ ├── stream.rs
│ └── read_eeg.rs
└── tests/
└── types_tests.rs