LINUX.ORG.RU

Обработка нажатий клавиш геймпада в tty

 ,


0

1

Есть устройство на Linux с EmulationStation на борту (клавиатура к нему подключается через USB). Хочу обрабатывать нажатия клавиш геймпада в терминале, чтобы не приходилось подключать клавитуру для этого.

Тестовый скрипт для определения кодов клавиш геймпада:

#!/bin/bash

echo 'Press button "L1":'
key=`jstest --event /dev/input/js0 | grep -m 1 "type 1, time .*, number .*, value 1" | awk -F ',' '{print $3}' | awk '{print $2}'`
echo 'Button "L1":' >> keycode.txt
echo "$key" >> keycode.txt

echo 'Press button "L2":'
key=`jstest --event /dev/input/js0 | grep -m 1 "type 1, time .*, number .*, value 1" | awk -F ',' '{print $3}' | awk '{print $2}'`
echo 'Button "L2":' >> keycode.txt
echo "$key" >> keycode.txt

echo 'Press button "Up":'
key=`jstest --event /dev/input/js0 | grep -m 1 "type 1, time .*, number .*, value 1" | awk -F ',' '{print $3}' | awk '{print $2}'`
echo 'Button "Up":' >> keycode.txt
echo "$key" >> keycode.txt

echo 'Press button "Down":'
key=`jstest --event /dev/input/js0 | grep -m 1 "type 1, time .*, number .*, value 1" | awk -F ',' '{print $3}' | awk '{print $2}'`
echo 'Button "Down":' >> keycode.txt
echo "$key" >> keycode.txt

echo 'Press button "Left":'
key=`jstest --event /dev/input/js0 | grep -m 1 "type 1, time .*, number .*, value 1" | awk -F ',' '{print $3}' | awk '{print $2}'`
echo 'Button "Left":' >> keycode.txt
echo "$key" >> keycode.txt

echo 'Press button "Right":'
key=`jstest --event /dev/input/js0 | grep -m 1 "type 1, time .*, number .*, value 1" | awk -F ',' '{print $3}' | awk '{print $2}'`
echo 'Button "Right":' >> keycode.txt
echo "$key" >> keycode.txt

echo 'Press button "Select":'
key=`jstest --event /dev/input/js0 | grep -m 1 "type 1, time .*, number .*, value 1" | awk -F ',' '{print $3}' | awk '{print $2}'`
echo 'Button "Select":' >> keycode.txt
echo "$key" >> keycode.txt

echo 'Press button "L3":'
key=`jstest --event /dev/input/js0 | grep -m 1 "type 1, time .*, number .*, value 1" | awk -F ',' '{print $3}' | awk '{print $2}'`
echo 'Button "L3":' >> keycode.txt
echo "$key" >> keycode.txt

echo 'Press button "Start":'
key=`jstest --event /dev/input/js0 | grep -m 1 "type 1, time .*, number .*, value 1" | awk -F ',' '{print $3}' | awk '{print $2}'`
echo 'Button "Start":' >> keycode.txt
echo "$key" >> keycode.txt

echo 'Press button "X":'
key=`jstest --event /dev/input/js0 | grep -m 1 "type 1, time .*, number .*, value 1" | awk -F ',' '{print $3}' | awk '{print $2}'`
echo 'Button "X":' >> keycode.txt
echo "$key" >> keycode.txt

echo 'Press button "Y":'
key=`jstest --event /dev/input/js0 | grep -m 1 "type 1, time .*, number .*, value 1" | awk -F ',' '{print $3}' | awk '{print $2}'`
echo 'Button "Y":' >> keycode.txt
echo "$key" >> keycode.txt

echo 'Press button "B":'
key=`jstest --event /dev/input/js0 | grep -m 1 "type 1, time .*, number .*, value 1" | awk -F ',' '{print $3}' | awk '{print $2}'`
echo 'Button "B":' >> keycode.txt
echo "$key" >> keycode.txt

echo 'Press button "A":'
key=`jstest --event /dev/input/js0 | grep -m 1 "type 1, time .*, number .*, value 1" | awk -F ',' '{print $3}' | awk '{print $2}'`
echo 'Button "A":' >> keycode.txt
echo "$key" >> keycode.txt

echo 'Press button "R3":'
key=`jstest --event /dev/input/js0 | grep -m 1 "type 1, time .*, number .*, value 1" | awk -F ',' '{print $3}' | awk '{print $2}'`
echo 'Button "R3":' >> keycode.txt
echo "$key" >> keycode.txt

echo 'Press button "R2":'
key=`jstest --event /dev/input/js0 | grep -m 1 "type 1, time .*, number .*, value 1" | awk -F ',' '{print $3}' | awk '{print $2}'`
echo 'Button "R2":' >> keycode.txt
echo "$key" >> keycode.txt

echo 'Press button "R1":'
key=`jstest --event /dev/input/js0 | grep -m 1 "type 1, time .*, number .*, value 1" | awk -F ',' '{print $3}' | awk '{print $2}'`
echo 'Button "R1":' >> keycode.txt
echo "$key" >> keycode.txt

При подключении по SSH или при выходе из EmulationStation и запуске tty скрипт отрабатывает корректно. Т.е. при нажатии клавиши геймпада, определяется код клавиши, она записывается в файл успешно, а процесс:

jstest --event /dev/input/js0

Успешно завершается.

Проблемы начинаются, если скрипт запускать напрямую из EmulationStation, видимо jstest --event /dev/input/js0 зацикливается и pipe начинает работать некорректно.

Процесс выполнения скрипта из EmulationStation:

Press button "L1":

На нажатия клавиш геймпада не реагирует при запуске этого скрипта или реагирует, но мы этого не видим.

При этом в ps aux:

user        635  0.0  0.0   2048   508 ?        S    03:58   0:00 sh -c sudo chmod 666 /dev/tty1; /opt/system/Scripts/Keycode.sh > /dev/tty1; printf "\033c" >> /dev/tty1
user        645  0.0  0.3   6464  2916 ?        S    03:58   0:00 /bin/bash /opt/system/Scripts/Keycode.sh
user        646  0.0  0.1   6464  1572 ?        S    03:58   0:00 /bin/bash /opt/system/Scripts/Keycode.sh
user        647  0.0  0.0   1924   464 ?        S    03:58   0:00 jstest --event /dev/input/js0
user        651  0.0  0.2   8416  2728 pts/0    R+   03:59   0:00 ps aux

Либо нажатия клавиш не перехватываются, либо что-то не так с кодом, shell-ом или subshellom.

Но другой скрипт, при запуске из EmulationStation отрабатывает корректно:

#!/bin/bash

jstest --event /dev/input/js0

Все нажатия клавиш при запуске второго скрипта успешно обрабатываются.

Как я понимаю, проблема именно с grep -m 1 и завершением цикла jstest --event /dev/input/js0. Как её решить непонятно. В чем может быть проблема?

Ты, видимо, очень трудолюбивый человек, но так код писать нельзя. Видишь, что последовательность действий повторяется? Заверни в функцию. Надо перебрать аргументы? Есть for button in bla1 bla2 bla3.

Bagrov ★★★★★ ()

Пост очень сложно читать, огромные бесполезные простыни постоянно.

jstest должен получать broken pipe и завершаться, когда следующий на ним grep завершается, найдя нужную строчку. Может EmulationStation SIGPIPE маскирует?

firkax ★★ ()
Последнее исправление: firkax (всего исправлений: 1)
Ограничение на отправку комментариев: только для зарегистрированных пользователей