jstest의 쉘 스크립트를 사용하여 게임 컨트롤러가 내 스크립트와 상호 작용하도록 하려면 어떻게 해야 합니까?

jstest의 쉘 스크립트를 사용하여 게임 컨트롤러가 내 스크립트와 상호 작용하도록 하려면 어떻게 해야 합니까?

나는 이것으로 부분적으로 성공했지만 막혔습니다. 이것은 내 스크립트입니다.

사용자에게 메시지를 표시하고 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 버튼을 누르면 jstest도 확인하고 "A 버튼을 눌렀습니다"라는 메시지가 표시됩니다.

하지만 이 경우에는 grep이 jstest(A 버튼)에서 "버튼 0, 값 1"만 필터링하기 때문에 "else" 부분을 수행할 수 없습니다. 즉, A 버튼을 누르지 않으면 jstest가 됩니다. 파이핑입니다. grep할 필요가 없습니다. 항상 A 버튼을 기다립니다.

나는 이것을 할 수 있는 어떤 방법이 있을지도 모른다고 생각했습니다:

grep -q "number ., value 1" 

누른 버튼이 무엇이든 반환한 다음 grep이 표시하는 내용에 따라 다른 명령을 실행합니다. 나는 이것을 위해 케이스 문을 사용할 수 있다고 생각했지만 jstest를 케이스와 함께 사용할 수는 없습니다.

나는 jstest가 이런 종류의 작업에는 테스트용으로 적합하지 않다고 생각하지만 광범위한 인터넷 검색을 통해 스크립트를 통해 게임 패드와 상호 작용할 수 있는 다른 옵션이 없다는 것을 알게 되었습니다.

사용자에게 메시지를 표시하고, 버튼이 눌릴 때까지 기다린 다음, 누른 버튼에 따라 다른 명령을 실행하는 쉘 스크립트를 어떻게 만들 수 있습니까?

답변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

관련 정보