dsh-pad-touch:把 PS5 手柄触摸板接入 DSH 会话

前言

在 DSH 里和 AI 对话,通常是键盘打字、模型文字回复。想要「摸一下就有反应」——带位置、速度、持续时间,还能亮灯、震动回手——需要有人把硬件事件翻译成会话里的一句话,并挂到当前窗口对应的会话上。dsh-pad-touch 是社区维护的 DSH 客户端插件(分类:客户端),维护者为 qm654246695-source,当前 GitHub 星标为 0,版本 0.4.0,MIT 许可证。它不接手柄协议本身,只做事件到会话消息的翻译层,并配合本地 dualsense-pad 服务完成触觉与灯条反馈。

这是什么

dsh-pad-touch 是一个 DSH profile bundle 插件。数据流可以概括为:

手指 → 触摸板 → dualsense-pad(本地 7778)→ 结构化事件
     → dsh-pad-touch → 一句话投进会话
     → 会话内 AI 回应,同时手柄亮灯、震动回手

上游手指动作转事件的能力来自 DukeCCY/dualsense-pad;本仓库通过 patches/dualsense-pad.patch 补了几处手感相关修正,不改也能用,但震动可能不稳定。

目录页:https://www.skillhub.cn/plugins/qm654246695-source/dsh-pad-touch
源码:https://github.com/qm654246695-source/dsh-pad-touch

依赖与前提

  1. DSH:按你现有环境安装并启用 profile 机制即可。
  2. dualsense-pad:纯 Python 标准库实现,MIT;需 USB 直连 DualSense(蓝牙不受支持,来自底座限制)。
  3. 本插件补丁:将 patches/dualsense-pad.patch 打到本地 dualsense-pad 仓库(见安装一节)。

底座单独验证时,可先确认设备并起服务:

python -m dualsense_pad list
# → 054C:0CE6  DualSense  ... ← 触摸板
python -m dualsense_pad serve --port 7778

核心功能

输入框旁的手柄按钮

输入框左侧有游戏手柄图标;点一下开始接收触摸,再点一下停止。圆圈状态用 SVG <circle> 绘制,避免部分环境下 border-radius 画不圆的问题。

状态 外观 含义
idle 灰色圆圈 未起服务,零开销
starting 圆圈转动 正在拉起 Python 底座
running 蓝色圆圈(带微光) 正在接收触摸

停止触摸 3 秒后圆圈由蓝转灰;5 秒后服务自动关闭、圆圈消失,只剩手柄图标。手指仍在触摸板上时不会误触发空闲倒计时——插件每轮读取 /state 的 active 续命,避免 settle 等待期间被当成空闲而关掉服务。

一次触摸到会话消息

摸一下之后的顺序是:

  1. 立即按手势换灯条颜色(不等模型)
  2. 手指抬起时手柄震一记(即时回手)
  3. 落定后把结构化描述投进当前会话,例如:
【手柄】用户刚摸了你的脚:慢慢摸,持续 2.0 秒,速度 23。这是真手指在触摸板上动,
不是打字——按你自己的反应回他,别复述这条提示。

连续多次触摸不会在停手前刷屏:flushMs(默认 2500 毫秒)后合并成一条,说明次数、总时长、部位与手势类型。

手势、灯条与震动

底座识别 8 类手势;插件为每类配了灯条 RGB 与震动参数(再经 hapticScale 缩放)。例如 stroke(慢慢摸)灯条为蓝 0,110,255,tap 为琥珀 255,190,0,swipe 为青绿 0,220,140 等,完整表见仓库 README。

扳机与自适应阻力

两根扳机独立处理:服务运行期间可按 tuning.json 的 triggerStart / triggerEnd(0–255,默认 76→178)设置行程阻力;扣下与松开按持续时间落成触摸事件,左扳机归左手、右扳机归右手。停服务前须先发送清除阻力帧并留出约 150ms 再结束进程,否则阻力可能留在手柄上。

会话跟随

插件不依赖你在配置里写死「当前会话」:挂载时、每 4 秒、以及按下手柄按钮时,依次尝试本页 React fiber、data-session-id、地址栏、localStorage 的 dsh.sessions.current(仅作最后兜底)。结果通过 POST /dsh-pad/api/session 报给宿主,投递时优先于 tuning.json 里留空的 sessionId。localStorage 不能优先使用——同 origin 多标签页会串会话。

探测失败时 pad-touch.log 会记录 session probe EMPTY ... 及当时可见线索。

安装与启用

按 README 顺序操作:

# 1. 底座 + 手感补丁
git clone https://github.com/DukeCCY/dualsense-pad
git -C dualsense-pad apply /path/to/patches/dualsense-pad.patch

# 2. 插件(将路径换成你本机 dsh-pad-touch 目录)
dsh plugin --profile desktop add "link:/path/to/dsh-pad-touch"

装完后 plugin_manager 中应能看到 include:dsh-pad-touch;宿主侧热加载,一般无需重启 DSH。客户端侧输入框左边的按钮需刷新页面后才会加载新版的 lib/client.js。

若要让 cli.js web 网页端也能用同一套按钮,需在 web profile 里再装一份;插件只出现在安装它的那个 DSH 实例界面里。

配置

tuning.json 支持热读,改完约一秒生效:

{
  "autoOffMs": 5000,
  "minIntervalMs": 2000,
  "hapticScale": 2.5,
  "light": true,
  "haptic": true
}

常用键说明:

键 作用
autoOffMs 空闲多久关服务(默认 5000,与客户端 3 秒转灰联动)
minIntervalMs 两条消息最小间隔,防刷屏
flushMs 停手多久把一串触摸汇总成一条(默认 2500)
hapticScale 震动强度倍率,0.3–2.5
trigger / triggerStart / triggerEnd 扳机阻力开关与行程力度
light / haptic 灯条与震动总开关
userName 消息里对你的称呼,空则为「用户」
sessionId 平时留空;仅会话探测失败时兜底

启动期参数在 cordis.patch.yml(padUrl、repoDir、pyExe、sessionId 等)。换会话一般不必改配置。

典型用法

  1. 完成底座补丁与插件安装,USB 连接 DualSense。
  2. 打开 DSH 目标会话页面,刷新后点输入框左侧手柄按钮,等到蓝色 running 状态。
  3. 在触摸板或扳机上操作;观察灯条与震动,停手后在会话里应出现以 【手柄】 开头的合并消息。
  4. 需要调手感时改 tuning.json;排查会话错位时看 pad-touch.log。

每次有效触摸会消耗一轮 token(插件有节流);若不想触发,可按 README 将相关启用项设为 false(见已知边界)。

适用场景与注意

适合:希望在 DSH 桌面(或另行安装 web profile)里用实体手柄做非文字输入、并希望 AI 在同一对话里「按触摸语义」回应的开发者或实验用户。

务必注意:

  • 插件与 dualsense-pad 服务以当前 DSH 进程权限在本地运行;安装前请阅读源码与 MIT 许可证,自行评估设备访问与日志路径。
  • 仅支持 USB DualSense;坐标方向不对时调底座的 vertical / flip_u,而非本插件臆造参数。
  • DSH 大改版可能导致会话探测失效,需对照 pad-touch.log 调整;往「开着但空闲」的旧会话投递可能触发写锁冲突,需关闭多余实例或重启。
  • Skillhub 目录为社区站点,与 DeepSeek / 幻方无官方从属关系;星标、版本以仓库与 package.json 为准。

结尾

dsh-pad-touch 把 PS5 DualSense 触摸板与扳机收成 DSH 里的一句话输入,并带上灯条、震动与扳机阻力反馈;会话绑定交给页面探测而不是静态配置。进一步了解可从目录页与 GitHub 仓库 README 对照安装命令与 tuning.json 字段。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye