刹那(せつな)の瞬き

Willkömmen! Ich heiße Setsuna. Haben Sie etwas Zeit für mich?

Ubuntuでcontrollermapだけをビルドして動かす

以前、手持ちの PS3 用コントローラ HORI PAD 3 MINI の各ボタン・スティックの定義を調べる、その為だけに別途 OS を用意して SDL2 をソースからコンパイルしてました。

しかし、よくよく考えてみたら、Ubuntu 20.04 LTS には予め SDL2 開発用のパッケージが用意されています。

$ apt search libsdl2-dev
ソート中... 完了
全文検索... 完了  
libsdl2-dev/focal 2.0.10+dfsg1-3 amd64
  Simple DirectMedia Layer - 開発用ファイル

このパッケージを導入して、必要な controllermap だけをビルドすれば依存関係を乱さずに controllermap の実行ファイルを入手できそうです。

$ sudo apt install libsdl2-dev

依存関係にあるパッケージが多数インストールされます。
私の環境だと 65 個のパッケージが追加されました。

....

続いて SDL2 のソースを公式サイトからダウンロードします。

最新バージョンは 2.0.12 ですが、インストールした libsdl2-dev のバージョンは 2.0.10 なので、一応それに合わせてます。

$ cd ~
$ mkdir work
$ cd work
$ wget https://www.libsdl.org/release/SDL2-2.0.10.tar.gz
$ tar xzvf SDL2-2.0.10.tar.gz

適当な場所にダウンロードして展開した後はビルドです。
既にパッケージが導入済みなので、いきなり controllermap をビルドします。

$ cd SDL2-2.0.10/test
$ ./configure
$ make controllermap

ビルドが終了したら、PC にコントローラを接続して、実行してみます。

$ ./controllermap
INFO: There are 1 joysticks attached
INFO: Joystick 0: HORI CO.,LTD  PAD A
INFO:        axes: 4
INFO:       balls: 0
INFO:        hats: 1
INFO:     buttons: 13
INFO: instance id: 0
INFO:        guid: 030000000d0f00004d00000011010000
INFO:     VID/PID: 0x0f0d/0x004d
INFO: 

Usage: ./controllermap number
For example: ./controllermap 0
Or: ./controllermap 0 >> gamecontrollerdb.txt

以前の記事と同じですが、認識しているコントローラ番号を引数に指定して実行すると、そのコントローラの確認画面が表示されます。
ついでに結果を任意のファイルにリダイレクトしておくと便利です。

$ ./controllermap 0 > ps3_hori_pad3_mini.txt

f:id:infinity_volts:20190524001254p:plain

この画面が表示された後、緑色のインジケータに合わせて、実際のコントローラのボタンを順次押していきます。

という感じで、以前の記事よりは、シンプルに目的を達成できました。

....

おまけ

PPSSPP の場合、gamecontrollerdb.txt は assets ディレクトリに配置されています。
そこに前述の実行結果を追記すれば、非対応のコントローラが使えるようになります。

Flatpak 版 PPSSPP 1.10.3 をそのまま起動すると、

$ flatpak run org.ppsspp.PPSSPP 
I: VulkanLoader.cpp:268: VulkanMayBeAvailable: Device allowed ('SDL:Linux')
I: VulkanLoader.cpp:275: VulkanMayBeAvailable: Library loaded ('libvulkan.so.1')
 〜(ざっくり省略)〜
loading control pad mappings from gamecontrollerdb.txt: SUCCESS!
Control pad device 0 not supported by SDL game controller database, attempting to create default mapping...
Added default mapping ok
found control pad: HORI CO., loading mapping: SUCCESS, mapping is:
030000000d0f00004d00000011010000,HORI CO.,LTD  PAD A,x:b3,a:b0,b:b1,y:b2,back:b8,guide:b10,start:b9,dpleft:b15,dpdown:b14,dpright:b16,dpup:b13,leftshoulder:b4,lefttrigger:a2,rightshoulder:b6,rightshoulder:b5,righttrigger:a5,leftstick:b7,leftstick:b11,rightstick:b12,leftx:a0,lefty:a1,rightx:a3,righty:a4
pad 1 has been assigned to control pad: HORI CO.
 〜(ざっくり省略)〜

コントローラを認識してるようにも見えますが、誤った定義が割り当てられてしまい、このままでは使えません。

そこで、controllermap の実行結果を記録したps3_hori_pad3_mini.txtの内容を assets/gamecontrollerdb.txt に追記します。

$ sudo bash -c 'cat ps3_hori_pad3_mini.txt >> /var/lib/flatpak/app/org.ppsspp.PPSSPP/current/active/files/ppsspp/assets/gamecontrollerdb.txt'

再度、PPSSPP を起動すると、

$ flatpak run org.ppsspp.PPSSPP 
 〜(ざっくり省略)〜
loading control pad mappings from gamecontrollerdb.txt: SUCCESS!
found control pad: HORI CO.LTD  PAD A, loading mapping: SUCCESS, mapping is:
030000000d0f00004d00000011010000,HORI CO.LTD  PAD A,platform:Linux,a:b1,b:b2,x:b0,y:b3,back:b8,guide:b12,start:b9,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,
pad 1 has been assigned to control pad: HORI CO.LTD  PAD A
 〜(ざっくり省略)〜

今度は gamecontrollerdb.txt から追記したコントローラの情報が読み込まれ、期待通りにコントローラを認識してくれました。※この件とは別にパッドの調整は必要です。