vita_gamepad/README.md

202 lines
6.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Vita Gamepad
把一台已安装 HENkaku/enso 的 PlayStation Vita 通过局域网变成 Windows 或
macOS 游戏手柄。
## 功能
- 同一 Wi-Fi 下自动发现电脑,无需在 Vita 上输入 IP
- 约 120 Hz 的 UDP 输入传输
- 双摇杆、方向键、四个动作键、L1/R1、Start/Select
- 后触摸板左右半区模拟 L2/R2
- 前触摸板底部左右角模拟 L3/R3
- 断线 300 ms 后自动释放全部按键,避免卡键
- Windows 输出标准 Xbox 360/XInput 虚拟手柄
- macOS 提供实验性通用 HID 后端;新版系统可能受 entitlement 限制
## 按键映射
| PS Vita | Xbox 游戏内名称 | PlayStation 名称 |
|---|---|---|
| × | A | Cross |
| ○ | B | Circle |
| □ | X | Square |
| △ | Y | Triangle |
| L / R | LB / RB | L1 / R1 |
| 后触摸板左 / 右 | LT / RT | L2 / R2 |
| Select / Start | Back / Start | Share / Options |
| 前触摸板左下 / 右下 | LS / RS | L3 / R3 |
## 电脑端
需要 Python 3.10 或更高版本。建议先创建虚拟环境。
### Windows
支持 Windows 10/11电脑端会创建标准 Xbox 360/XInput 虚拟手柄。
#### 1. 安装虚拟手柄驱动
从 [ViGEmBus 官方 Releases](https://github.com/nefarius/ViGEmBus/releases)
下载并安装 `ViGEmBus Setup 1.22.0`。该项目已经归档,因此只建议从官方仓库
下载签名驱动,不要使用第三方重新打包版本。安装完成后建议重启一次 Windows。
#### 2. 安装 Vita Gamepad 电脑端
打开 PowerShell进入本项目目录后运行
```powershell
py -3 -m venv .venv
Set-ExecutionPolicy -Scope Process Bypass
.\.venv\Scripts\Activate.ps1
python -m pip install --upgrade pip
pip install -e ".[windows]"
vitapad-gui
```
程序会自动打开 `http://127.0.0.1:8765/` 控制面板。首次运行出现 Windows
防火墙提示时,只需允许“专用网络”访问,不建议开放公用网络。
#### 3. 连接与测试
1. 确保 Windows 电脑和 PSVita 连接同一个 Wi-Fi。
2. 在控制面板点击“开启使用”。
3. 打开 Vita Gamepad等待页面显示 Vita IP。
4. 按 Vita 按键,页面中的对应按键会实时亮起;双摇杆和 L2/R2 也会跟随。
5.`Win + R`,输入 `joy.cpl`,应能看到 `Controller (XBOX 360 For Windows)`
6. 在该设备的“属性”页面可进一步检查 Windows 收到的按键和摇杆输入。
点击控制面板的“暂停”会立即释放按键、停止网络接收并移除虚拟手柄。
#### Windows 命令行模式
不需要控制面板时可运行:
```powershell
vitapad
```
只测试 Vita 网络和按键,不创建 Xbox 虚拟手柄:
```powershell
vitapad --backend debug
```
#### 打包 Windows EXE
已提供自动打包脚本。在 PowerShell 中运行:
```powershell
powershell -ExecutionPolicy Bypass -File scripts\build_windows.ps1
```
生成文件位于 `dist\windows\VitaGamepadDashboard.exe`。目标电脑仍需先安装
ViGEmBus 驱动。
#### Windows 常见问题
- 提示“无法创建虚拟手柄”:确认已安装 ViGEmBus并在设备管理器的“系统设备”
中检查 `Nefarius Virtual Gamepad Emulation Bus`,然后重启电脑。
- 控制页面没有自动打开:手动访问 `http://127.0.0.1:8765/`
- 一直等待 Vita确认网络类型为“专用网络”允许 Python 或
`VitaGamepadDashboard.exe` 通过防火墙,并检查路由器没有开启 AP/客户端隔离。
- PowerShell 禁止运行激活脚本:重新执行
`Set-ExecutionPolicy -Scope Process Bypass`,它只影响当前窗口。
- `5000` 端口被占用:关闭其他 Vita Gamepad 实例或占用该端口的程序;当前
Vita 端固定使用 UDP 5000。
### macOS
> [!WARNING]
> macOS 没有正式、稳定的系统级虚拟游戏手柄 API。当前实验性
> `IOHIDUserDevice` 后端在旧版系统上可尝试通过管理员权限运行,但在
> macOS 26 等新版系统上可能仍被 entitlement/签名策略拒绝。控制面板和实时
> 按键测试可以使用 `--backend debug`,但该模式不会向游戏创建虚拟手柄。
```bash
python3 -m venv .venv
source .venv/bin/activate
pip install -e .
sudo .venv/bin/vitapad
```
macOS 后端通过 `IOHIDUserDevice` 尝试创建通用 HID 手柄,需要管理员权限,
且不保证能被当前系统或游戏接受。
使用预编译的 Apple Silicon 接收端时,解压后运行:
```bash
sudo ./VitaGamepadReceiver
```
如果 macOS 阻止首次打开,可在“系统设置 → 隐私与安全性”中允许,或执行:
```bash
xattr -dr com.apple.quarantine VitaGamepadReceiver
```
### 图形控制面板
预编译的 `VitaGamepadDashboard` 启动后会自动打开本机控制页面,页面只监听
`127.0.0.1`。可以在其中:
- 点击“开启使用”创建虚拟手柄并开始自动发现 Vita
- 点击“暂停”立即释放全部按键并停止接收
- 查看运行状态、Vita IP、运行时间和端口
- 在手柄预览中实时检查按键高亮、双摇杆位置和 L2/R2 压力
- 查看连接、断线、重连和错误日志
macOS 需要通过终端以管理员权限启动:
```bash
sudo ./VitaGamepadDashboard
```
关闭浏览器页面不会结束接收程序;需要结束程序时在终端按 `Control-C`
### 仅测试网络,不创建手柄
```bash
vitapad --backend debug
```
收到数据后会在终端显示按键和摇杆状态,适合排查防火墙或 Wi-Fi 隔离问题。
可选参数:
```text
--port 5000 输入端口
--discovery-port 5001 自动发现端口
--bind 0.0.0.0 监听地址
--allow 192.168.1.25 只接受指定 Vita IP
--timeout-ms 300 断线释放时间
```
## PSVita 端构建与安装
需要安装 [VitaSDK](https://vitasdk.org/) 和 `vita2dlib`
```bash
cd vita
python3 assets/generate_assets.py # 仅在需要重新生成 LiveArea 图片时运行
cmake -S . -B build
cmake --build build
```
`build/vita-gamepad.vpk` 传到 Vita 并用 VitaShell 安装。启动电脑端
`vitapad` 后再打开 Vita Gamepad两台设备必须在同一局域网且路由器不能启用
客户端/AP 隔离。
Vita 界面显示电脑 IP 和已发送包数。按住 `Start + Select` 两秒可退出。
## 网络协议
协议说明见 [docs/protocol.md](docs/protocol.md)。它只有固定 20 字节,不执行
远程命令,也不接收来自电脑的代码。自动发现只发送一个固定文本信标。
## 开发测试
```bash
python -m unittest discover -s tests -v
```