swbt 連携

この文書群は、Project_NyX から swbt-python を controller backend として利用するための設計方針を定義する。

swbt-python 0.5.3 は NX 互換の仮想 Bluetooth HID controller を Python から扱うための library である。Project_NyX では、Bluetooth adapter の列挙、schema v2 pairing profile の作成、保存済み profile に基づく reconnect、入力 report の送信を controller backend の実装として扱う。マクロ作者から見える通常 API は Command、GUI の仮想コントローラーから見える境界は既存の ControllerOutputPort に止める。

最小構成

[controller]
backend = "swbt"

[controller.swbt]
controller_type = "pro-controller"
adapter = "usb:0"
profile_path = ".nyxpy/swbt/pro-controller-profile.json"
connect_timeout_sec = 30.0
report_period_us = 8000

controller_type は settings / CLI / GUI の境界でだけ文字列として扱う。runtime 内部では SwbtControllerTypeSwbtControllerModel に正規化し、Literal[...] や raw string key による controller class dispatch を残さない。

swbt-python は通常依存である。利用者に swbt 用の extra 指定や追加同期手順を求めない。

adapter が空文字または未指定のまま接続操作を行った場合は、候補が 1 件でも自動採用せず NYX_SWBT_ADAPTER_NOT_SELECTED とする。profile_path が未指定なら .nyxpy/swbt/<controller>-profile.json を使う。

入力反映の基本方針

swbt backend は、GUI 仮想コントローラー専用の入力 session を追加しない。

現行の GUI はすでに次の経路で十分に抽象化されている。

GUI widget
  -> VirtualControllerPane
  -> VirtualControllerModel
  -> ControllerOutputPort

swbt 対応後もこの経路を維持する。

GUI widget
  -> VirtualControllerPane
  -> VirtualControllerModel
  -> ControllerOutputPort
  -> SwbtControllerOutputPort
  -> hardware.swbt.SwbtControllerSession
  -> swbt-python controller

serial backend では次のままになる。

GUI widget
  -> VirtualControllerPane
  -> VirtualControllerModel
  -> ControllerOutputPort
  -> SerialControllerOutputPort
  -> SerialProtocolInterface
  -> SerialComm

SwbtControllerSession は GUI manual input 用の上位機能ではない。swbt-python の async controller lifecycle と InputState.apply() を同期 port 実装から扱うための backend 内部部品である。status() は同期 API であり、pair / reconnect 後の connection_state を接続判定に使う。

GUI の範囲

GUI の swbt 設定画面に置く機能は、実機運用に必要なものに絞る。

機能 目的
デバイス一覧取得 / 更新 list_adapters() で利用可能な dedicated USB Bluetooth adapter 候補を表示する
コントローラー種別指定 Pro Controller / Joy-Con L / Joy-Con R を選ぶ
ペアリング 選択した adapter、controller type、pairing profile path で pairing する
pairing key に基づく reconnect 保存済み pairing profile を使って reconnect する
仮想コントローラー manual input 既存 VirtualControllerModel から ControllerOutputPort へ button / D-pad / stick を送る

GUI と CLI の間で値を受け渡すための clipboard 機能、CLI command 生成、CLI 実行履歴との連携、diagnostics folder を開く導線、controller color editor は持たせない。

manual input は GUI の仮想コントローラー操作として扱う。マクロ生成や CLI 補助ではなく、接続確認、メニュー操作、実機状態の調整に使う直接入力である。IMU 操作 UI は含めない。

IMU 入力

CommandControllerOutputPort には IMU 入力命令を追加する。

cmd.imu(IMUFrame.gyro(x=100, y=0, z=0))
cmd.imu(IMUFrame.neutral())

swbt backend は swbt.IMUFrameInputState.with_imu(...) へ変換して送信する。IMU を扱わない backend は silent no-op にせず、既定実装で NotImplementedError を送出する。

GUI manual input では IMU を直接操作しない。preset gesture、pose editor、raw frame editor、replay / recording は対象外とする。

主要な設計判断

項目 方針
package nyxpy.framework.core.hardware.swbt に swbt 固有実装を集約する
module 名 package で namespace を切るため swbt_*.py にはしない
controller type SwbtControllerType / SwbtControllerModel で扱い、文字列は設定境界で解決する
adapter refresh Python API の list_adapters() を直接呼ぶ
pairing 明示操作として扱い、通常の macro run では勝手に pairing しない
reconnect pairing profile に保存済み pairing 情報があることを前提にする
disconnect factory lifetime を維持する GUI から cached session を明示的に閉じる。fresh factory を作る CLI command は提供しない
input NyX state から InputState を構成し、apply(state) を使う
manual input 既存 VirtualControllerModelControllerOutputPort 経路を使う
unsupported input silent no-op にせず明示的に失敗させる
diagnostics swbt diagnostics writer を NyX の LoggerPort.technical(...) へ流す。GUI / CLI / settings に path は出さない

文書一覧

文書 内容
architecture.md package 配置、依存方向、import policy
abstraction-audit.md 余計な抽象レイヤーを入れていないかの自己検証
public-api.md Project_NyX が使う swbt-python 公開 API
controller-models.md controller type の domain model と registry
adapter-discovery.md list_adapters()AdapterInfo の扱い
runtime-composition.md runtime builder、factory、GUI lifetime controller
controller-session.md SwbtControllerSession の責務と connection lifecycle
manual-input.md GUI 仮想コントローラー manual input
imu-command.md Command.imu(...) と backend 対応方針
controller-port-contract.md ControllerOutputPort と swbt input API の対応
input-mapping.md Button / Hat / Stick / IMU の mapping と controller type 制約
configuration-cli-gui.md settings、CLI、GUI の仕様
testing.md unit / session / CLI / GUI / 実機 test
testing-rollout.md 導入順序、完了条件、リスク

対象範囲

対象に含めるもの:

  • swbt backend の controller 出力
  • dedicated USB Bluetooth adapter の列挙
  • Pro Controller / Joy-Con L / Joy-Con R の選択
  • pairing と pairing profile への保存
  • 保存済み pairing key に基づく reconnect
  • GUI が管理する cached session の disconnect
  • ControllerOutputPort からの button / D-pad / stick / IMU 入力
  • GUI 仮想コントローラーによる manual input

対象に含めないもの:

  • 3DS touch、keyboard、sleep control を swbt backend で代替すること
  • 左右 Joy-Con を 1 つの controller として扱うこと
  • GUI から CLI 用の値を生成・コピーすること
  • GUI で swbt diagnostics や controller colors を編集すること
  • CLI / GUI / settings に diagnostics path を公開すること
  • GUI manual input から IMU gesture / pose / raw frame を送ること
  • PC の通常 Bluetooth stack をそのまま使うこと