Provide a Linux desktop controller configuration app with evdev input, uinput remapping, profiles, calibration, and reconnect recovery. Co-authored-by: Cursor <cursoragent@cursor.com>
116 lines
5.3 KiB
Markdown
116 lines
5.3 KiB
Markdown
# 8BitDo Control Center
|
|
|
|
A desktop configuration utility for 8BitDo Ultimate controllers on Linux. It reads the
|
|
physical controller through **evdev**, runs input through a configurable transform
|
|
pipeline (calibration, deadzones, response curves, remapping), and outputs a remapped
|
|
virtual controller through **uinput** — without depending on any proprietary 8BitDo
|
|
software or undocumented USB/firmware protocols.
|
|
|
|
Built with [Tauri 2](https://tauri.app), React + TypeScript, Tailwind CSS, and Rust.
|
|
|
|
> **Status:** Device discovery and read-only evdev input observation are implemented.
|
|
> The virtual-controller output pipeline remains opt-in work in progress; until it is
|
|
> enabled, the app never changes physical controller output.
|
|
|
|
## Features (current)
|
|
|
|
- Dark, light, and high-contrast themes
|
|
- Profile management: create, rename, duplicate, delete, reset, import, export —
|
|
persisted as versioned JSON under `~/.config/8bitdo-control-center/profiles/`
|
|
- Five built-in profiles (Default, FPS, Racing, Platformer, Custom)
|
|
- Reusable, generic SVG controller diagram (front + rear views, clickable hotspots)
|
|
- Button remapping (button/key/mouse/disabled, with turbo/toggle/hold/long-press/
|
|
double-tap modes)
|
|
- Analog stick tuning: inner/outer/anti-deadzone, radial/axial mode, sensitivity,
|
|
inversion, circularity correction, smoothing, response curve presets, with a live
|
|
raw-vs-processed preview and a draggable pad to simulate input
|
|
- Trigger tuning: deadzone, max activation, sensitivity, hair-trigger, digital mode,
|
|
inversion, response curve, with a live preview
|
|
- Motion page (gyro + vibration controls, hidden when unsupported)
|
|
- Input tester: live button/stick/trigger/gyro readout, poll rate estimate, and a
|
|
scrollable raw event log, drivable via a simulated controller
|
|
- Device information page
|
|
- Linux evdev discovery/capability probing and live raw input event streaming for
|
|
detected physical gamepads, with a simulated fallback for development
|
|
- Explicit **Apply / Revert / Save Profile** controls with unsaved-changes warnings
|
|
|
|
## Getting started (Linux Mint / Ubuntu-based)
|
|
|
|
### Prerequisites
|
|
|
|
```bash
|
|
# Rust toolchain
|
|
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
|
|
|
|
# Tauri Linux system dependencies
|
|
sudo apt update
|
|
sudo apt install -y libwebkit2gtk-4.1-dev libjavascriptcoregtk-4.1-dev \
|
|
libsoup-3.0-dev libgtk-3-dev librsvg2-dev libudev-dev \
|
|
libayatana-appindicator3-dev libssl-dev build-essential curl wget file pkg-config
|
|
```
|
|
|
|
Node.js 20+ and npm are also required.
|
|
|
|
### Run in development
|
|
|
|
```bash
|
|
npm install
|
|
npm run tauri dev
|
|
```
|
|
|
|
### Build a release bundle
|
|
|
|
```bash
|
|
npm run tauri build
|
|
```
|
|
|
|
## Project structure
|
|
|
|
```
|
|
src/ React + TypeScript frontend
|
|
├── components/
|
|
│ ├── layout/ Sidebar, TopBar, AppLayout, PageShell
|
|
│ ├── controller/ Generic SVG controller diagram + hotspots
|
|
│ ├── inputs/ Slider, Toggle, Select, TextField, SimulatedStickPad
|
|
│ ├── feedback/ Toasts, confirm dialog, unsaved-changes bar
|
|
│ ├── visualizations/ Stick/trigger preview, event log
|
|
│ └── common/ Panel, Button, Badge, StatusDot
|
|
├── pages/ One component per sidebar destination
|
|
├── hooks/ useTheme, useController, useProfileInit, ...
|
|
├── services/ Tauri command wrappers + the mock controller backend
|
|
├── stores/ Zustand stores (controller, profile, settings, ui)
|
|
├── types/ Mirrors of the Rust profile/controller structs
|
|
├── utils/ Deadzone/curve math shared by every preview
|
|
└── constants/ Canonical control IDs, nav items
|
|
|
|
src-tauri/ Rust backend (Tauri 2)
|
|
├── src/
|
|
│ ├── commands/ Tauri command handlers (profiles, system)
|
|
│ ├── profile_schema.rs Versioned profile data model + migration
|
|
│ ├── profile_manager.rs Disk-backed profile CRUD
|
|
│ └── default_profiles.rs Built-in profile templates
|
|
```
|
|
|
|
## Roadmap
|
|
|
|
1. **Phase 1 — Shell & scaffolding** *(current)* — app shell, theming, profile
|
|
management, controller visualization, and a simulated controller backend so every
|
|
page is usable before real hardware is wired up.
|
|
2. **Phase 2 — Real device visibility** — `device_detection`/`evdev_reader`, capability
|
|
probing, live Device Information + Input Tester pages.
|
|
3. **Phase 3 — Core remap pipeline** — `uinput_writer`, the real `input_transform`
|
|
deadzone/sensitivity pipeline, and Apply/Revert/Save wired to the live pipeline.
|
|
4. **Phase 4 — Profiles in depth** — shortcut-combo/process-based profile switching,
|
|
the calibration wizard, and the custom curve point editor.
|
|
5. **Phase 5 — Advanced mapping & polish** — macros, shift layers, motion/vibration
|
|
against real hardware, diagnostics/support bundle, udev rules + setup script,
|
|
packaging, and the full Rust test suite.
|
|
|
|
## Permissions
|
|
|
|
The app never needs to run as root. A later phase adds a `udev` rule and setup script
|
|
that grant a dedicated group access to the controller's `evdev` nodes and `/dev/uinput`.
|
|
|
|
See [Troubleshooting](docs/TROUBLESHOOTING.md) and the detailed
|
|
[development roadmap](docs/ROADMAP.md) for permissions and hardware-mode guidance.
|