デバイス列挙
adapter 列挙は swbt.list_adapters() を使う。これは Bluetooth adapter の候補を返す API であり、controller の open、advertising、pairing、reconnect、HID report loop は開始しない。
SwbtAdapterDiscoveryService の実装 module は nyxpy.framework.core.hardware.swbt.discovery である。
基本 API
from swbt import AdapterInfo, list_adapters
adapters: tuple[AdapterInfo, ...] = list_adapters()
for adapter in adapters:
print(adapter.name, adapter.aliases)
戻り値は AdapterInfo の tuple。候補がない場合は空 tuple。列挙自体に失敗した場合は AdapterDiscoveryError を Project_NyX 側で NYX_SWBT_ADAPTER_DISCOVERY_FAILED に変換する。
AdapterInfo の扱い
Project_NyX では次の情報を表示と validation に使う。
| field | 用途 |
|---|---|
name |
swbt controller の adapter= に渡せる代表名 |
aliases |
同じ adapter を指す候補名 |
vendor_id / product_id |
デバイス識別と表示 |
manufacturer / product |
GUI / CLI 表示 |
serial_number |
識別補助 |
bus_number / device_address / port_numbers |
デバッグ表示 |
is_bluetooth_hci |
Bluetooth HCI adapter として認識されたかの表示 |
Project_NyX DTO
CLI と GUI は swbt.AdapterInfo をそのまま外へ出さず、Project_NyX の DTO に変換する。
from dataclasses import dataclass
@dataclass(frozen=True)
class SwbtAdapterView:
name: str
aliases: tuple[str, ...]
display_name: str
vendor_id: int | None
product_id: int | None
manufacturer: str | None
product: str | None
serial_number: str | None
bus_number: int | None
device_address: int | None
port_numbers: tuple[int, ...]
is_bluetooth_hci: bool
display_name は短い表示名でよい。
usb:0 — ASUS USB-BT500 (VID:PID 0b05:190e)
保存値の選択
設定値としては AdapterInfo.name を基本にする。aliases は validation と表示補助に使う。
| 状況 | 扱い |
|---|---|
selected adapter が name に一致 |
その adapter を採用 |
selected adapter が aliases に一致 |
対応する name へ解決し、保存値も name に正規化する |
| adapter が空文字または未指定 | 候補数に関係なく NYX_SWBT_ADAPTER_NOT_SELECTED |
selected adapter がどの name / aliases にも一致しない |
NYX_SWBT_ADAPTER_NOT_FOUND |
| 複数候補が同じ alias に一致 | NYX_SWBT_ADAPTER_AMBIGUOUS |
候補が 1 件だけの場合でも adapter 未指定を自動採用しない。pair / reconnect / run は、利用者が settings または CLI / GUI で adapter を選んだ後に実行する。
CLI
nyxpy swbt adapters
nyxpy swbt adapters --json
--json は GUI 連携用ではなく、developer / automation 用の machine-readable output として扱う。GUI は Python API を直接呼ぶ。
GUI
GUI の adapter refresh button は SwbtAdapterDiscoveryService.list() を呼ぶだけである。pairing や reconnect は開始しない。
[Refresh adapters]
-> SwbtAdapterDiscoveryService.list()
-> combo box を更新
refresh 中は button を disable し、結果が空の場合は明確に表示する。
| 結果 | GUI 表示 |
|---|---|
| 1 件以上 | combo box に表示 |
| 0 件 | “No swbt USB Bluetooth adapter found.” |
| discovery error | 利用者向け status 表示 + technical log |
候補が 1 件でも combo box の先頭を自動選択しない。保存済み値が候補の name または一意な alias に一致した場合だけ代表 name を選択値にする。refresh が失敗した場合は、保存済み adapter と refresh 前の選択を維持する。
列挙は Qt worker thread で実行し、結果による combo box 更新と error 表示だけを main thread で行う。
error handling
| case | code |
|---|---|
AdapterDiscoveryError |
NYX_SWBT_ADAPTER_DISCOVERY_FAILED |
| adapter not selected | NYX_SWBT_ADAPTER_NOT_SELECTED |
| selected adapter not found | NYX_SWBT_ADAPTER_NOT_FOUND |
| ambiguous adapter | NYX_SWBT_ADAPTER_AMBIGUOUS |