Usando um shell script com jstest, como posso obter um gamepad para interagir com meu script?

5

Eu tenho sido parcialmente bem sucedido com isso, mas estou preso. Aqui está o meu script:

Eu quero solicitar ao usuário, aguardar a entrada de um gamepad USB e, em seguida, executar um comando com base no botão pressionado.

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

Verifica se o gamepad está bem conectado. Ele também verifica o jstest e echos "você pressionou o botão A" quando eu pressionar o botão A.

Não consigo executar a parte "else" nessa situação, já que o grep filtra apenas "botão 0, valor 1" do jstest (o botão A), o que significa que se eu não estiver pressionando o botão A O jstest está colocando nada no grep, ele sempre espera pelo botão A.

Eu estava pensando que talvez houvesse alguma maneira de fazer:

grep -q "number ., value 1" 

que retornará QUALQUER botão sendo pressionado e, em seguida, terá diferentes comandos executados com base no que o grep mostra. Eu pensei que poderia usar uma declaração de caso para isso, mas não posso começar a trabalhar com o caso.

Eu sinto que jstest não é para esse tipo de coisa, apenas para testar, mas o googling extensivo não me mostrou outras opções para interagir com um game pad por meio de um script.

Como posso criar um script de shell que solicite ao usuário, aguarde o pressionamento de um botão e execute comandos diferentes com base em qual botão foi pressionado?

    
por rhcpepper 09.03.2017 / 01:34

1 resposta

1

Você precisa obter grep para exibir o texto correspondente, e parar após uma correspondência. Você também precisa filtrar eventos um pouco mais detalhadamente, já que você está interessado apenas em eventos do tipo 1 (botões):

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

Isso manterá jstest em execução até que você pressione um botão e, em seguida, exiba as informações do evento. Você pode processar isso usando read para encontrar o número do botão que foi pressionado:

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
    
por 26.03.2017 / 17:34