stestのシェルスクリプトを使用してゲームコントローラが自分のスクリプトと対話するようにするにはどうすればよいですか?

stestのシェルスクリプトを使用してゲームコントローラが自分のスクリプトと対話するようにするにはどうすればよいですか?

私はこれで部分的に成功しましたが、詰まっています。これは私のスクリプトです。

ユーザーにメッセージを表示し、USBゲームパッドの入力を待ってから、押したボタンに従ってコマンドを実行したいと思います。

if lsusb | grep -q '0583:2060'
then
  echo "press the A button"
  #
  if jstest --event /dev/input/js0 | grep -q "number 0, value 1"
  then
    echo "you pressed the A button"
  else
    echo "you pressed the NOT A button"
  fi
fi

ゲームパッドがしっかりと接続されていることを確認してください。 Aボタンを押すとstestも確認し、「Aボタンを押しました」というメッセージが表示されます。

ただし、この場合、grepはstest(Aボタン)で「ボタン0、値1」のみをフィルタリングするため、「else」部分を実行することはできません。つまり、Aボタンを押さないと stest になります。パイピングです。 grepする必要はありません。常にAボタンを待ちます。

私はこれを行う方法があるかもしれないと思いました:

grep -q "number ., value 1" 

押したボタンが何でも返され、次にgrepが表示する内容に応じて別のコマンドを実行します。私はこれのためにケースステートメントを使用できると思いましたが、ステストをケースと一緒に使用することはできません。

私はstestがこの種の作業にはテストには適していないと思いますが、幅広いインターネット検索を介してスクリプトを介してゲームパッドと対話する他のオプションがないことに気付きました。

ユーザーにメッセージを表示し、ボタンが押されるのを待ってから、押したボタンに従って別のコマンドを実行するシェルスクリプトをどのように作成できますか?

答え1

grep一致するテキストを出力する必要があります。そして試合が終わったら停止してください。また、タイプ1(ボタン)のイベントにのみ興味があるので、イベントをより徹底的にフィルタリングする必要があります。

jstest --event /dev/input/js0 | grep -m 1 "type 1, time .*, number .*, value 1"

jstestボタンを押すまで実行した後、イベント情報を出力します。read押したボタンの数を見つけるには、次の方法を使用してこれを処理できます。

jstest --event /dev/input/js0 | grep -m 1 "type 1, time .*, number .*, value 1" | read _ _ _ _ _ _ number _ _
if [ "${number%%,*}" -eq 0 ]
then
    echo "You pressed the A button."
else
    echo "You pressed a button other than A."
fi

関連情報