前言¶
在 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
依賴與前提¶
- DSH:按你現有環境安裝並啓用 profile 機制即可。
- dualsense-pad:純 Python 標準庫實現,MIT;需 USB 直連 DualSense(藍牙不受支持,來自底座限制)。
- 本插件補丁:將
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 等待期間被當成空閒而關掉服務。
一次觸摸到會話消息¶
摸一下之後的順序是:
- 立即按手勢換燈條顏色(不等模型)
- 手指抬起時手柄震一記(即時回手)
- 落定後把結構化描述投進當前會話,例如:
【手柄】用戶剛摸了你的腳:慢慢摸,持續 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 等)。換會話一般不必改配置。
典型用法¶
- 完成底座補丁與插件安裝,USB 連接 DualSense。
- 打開 DSH 目標會話頁面,刷新後點輸入框左側手柄按鈕,等到藍色 running 狀態。
- 在觸摸板或扳機上操作;觀察燈條與震動,停手後在會話裏應出現以
【手柄】開頭的合併消息。 - 需要調手感時改
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 字段。