d.sunnyone.org
sunnyone.org

ページ

2015-04-07

シェルスクリプトでゲームパッドのボタン入力をキー入力に変換する

ステップオーバーやステップインなどの作業はF7, F8などにバインドされていることが多いが、IDEによって異なるので、Windowsではゲームパッド/ジョイスティックのボタン入力にバインドしていた。Ubuntuでも同じようなことがしたいなぁと思ってやってみた。最終的なキーの対応は、こんな感じ。


パッケージのインストール

ツールが入っている「joystick」パッケージと、GUIで確認できる「jstest-gtk」パッケージをインストールする。
# apt-get install joystick jstest-gtk
これで、jstest-gtkコマンドが使えるようになるので、GUIで見ながら動作するかどうかを確認する。マッピング変更もできるらしい。jstest /dev/input/js0 などとすると、コマンドラインでも確認できる。

普通の使い方

さらに「xserver-xorg-input-joystick」パッケージをインストールし、Xを再起動すると、スティックがマウスカーソルに、ボタンがマウスボタンのように使えるようになる。Xの設定やら、xbindkeysの設定などすればそれはそれで良い感じで使えると思う。が、今回は消した。

シェルスクリプトで処理する

ただ、Xの入力に変換すると、どこのインプットデバイスから来たのかなど設定が面倒そうなので、(cf. Multiple keyboards)今回はシンプルにシェルスクリプトと先ほどのjstestコマンド、それからキー操作がコマンドでできるxdotoolコマンドでやることにした。

jstest --event /dev/input/js0 とすると、以下の感じで1行1イベントで飛んでくる。type 1がボタンのイベントで、numberがボタンの番号、valueがpress/releaseを意味している。type 2は軸の動作。
Event: type 1, time 28407820, number 0, value 1
Event: type 1, time 28407884, number 0, value 0
Event: type 1, time 28408052, number 2, value 1
Event: type 1, time 28408132, number 2, value 0
Event: type 1, time 28408308, number 3, value 1
Event: type 1, time 28408396, number 3, value 0
Event: type 1, time 28408588, number 1, value 1
Event: type 1, time 28408636, number 1, value 0
Event: type 2, time 28411012, number 1, value -17229
Event: type 2, time 28411028, number 1, value -32767
Event: type 2, time 28411172, number 1, value 0
Event: type 2, time 28411636, number 5, value -32767
Event: type 2, time 28411796, number 5, value 0
Event: type 2, time 28412500, number 1, value 10810
Event: type 2, time 28412516, number 1, value 32767
Event: type 2, time 28412700, number 1, value 15877
Event: type 2, time 28412716, number 1, value 0
view raw gistfile1.txt hosted with ❤ by GitHub

releaseだけ見ておけば使える感じになったので、こうなった。
#!/bin/sh
jstest --event /dev/input/js0 | \
sed -une 's/^Event: type 1, time [0-9]*, number \([0-9]*\), value 0.*$/\1/p' | \
while read BUTTON; do
BUTTON=`expr $BUTTON + 1` # Adjust to a printed name
echo "JoyKey: $BUTTON"
case $BUTTON in
1) ;; # Y:
2) ;; # X:
3) xdotool key F8;; # B: Step Over
4) xdotool key F7;; # A: Step Into
5) xdotool key Shift+F8;; # L1: Step Out
6) xdotool key F9;; # R1: Resume
7) ;; # L2:
8) xdotool key Ctrl+F5;; # R2: Rerun
9) xdotool key Ctrl+F2;; # SELECT: Stop
10) ;; # START:
esac
done
view raw joydebugkey.sh hosted with ❤ by GitHub

sedにはバッファしない-uオプションを忘れないようにしないと、流れてこなくなる。

Pythonで処理する(おまけ)

jaraco.inputで一応できたけど、余計なイベントが飛んでくる感じだったので、もう少し気合を入れて実装しないといけなそうだった。今回は、コマンド実行するだけなのでシェルスクリプトで行くことにした。なお、pipでインストールできるjaraco.input 1.0.1はバグっていて、コンストラクタの処理を肩代わりしないといけないのに注意。最新版はもう少し頑張っている模様。

0 件のコメント:

コメントを投稿