조이스틱 인식후 부팅선택


개요

얼마전에 라즈베리파이 부팅시 기능을 선택할 수 있도록 토글스위치를 달았던 적이 있는데요.

https://kimstar.kr/8155/

별도의 H/W없이 S/W로만 비슷한 기능을 구현해 보고자 했습니다.
결론적으로 말하면, 같은 기능을 구현은 하였으나 사용성이 안 좋아서 최종적으로 적용은 하지 않았습니다.
차후 비슷한 기능이 필요할 듯하여 기록으로 남겨둡니다.

조이스틱 인식

GPIO를 사용하지 않고, 조이스틱을 인식하려고 기존에는 PyGame을 사용했었는데요.
단순히 조이스틱 입출력용으로 사용하기 무거운 느낌이 있어서 다른 것을 찾아보니 Inputs 라는 것이 있네요.

참고 : https://inputs.readthedocs.io/en/latest/index.html
설치 : https://inputs.readthedocs.io/en/latest/user/install.html

sudo pip install inputs 를 입력하여 설치합니다.

buttonDetect.py - 버튼 이름 확인

조이스틱 버튼이 눌러졌을때 버튼 이름을 출력하도록 하였습니다.
버튼 이름은 차후 부팅선택기에서 사용됩니다.
아래 코드를 수행하고 버튼을 누를때마다 이름이 출력됩니다.

#!/usr/bin/python

import sys
from inputs import get_gamepad

print("Press Button")
try:
	while 1:
		events = get_gamepad()
		for event in events:
			if event.ev_type == "Key" and event.state == 1 :
				print("button : " + event.code)

except KeyboardInterrupt:
    sys.exit(0)

autostart.sh 수정 - 부팅시 실행

부팅시 autostart.sh 파일이 실행되면서, EmulationStation이 구동되는데요.
ES를 주석처리하고 아래와 같이 제가 작성한 파이썬 코드를 실행하도록 수정합니다.

$ sudo vi /opt/retropie/configs/all/autostart.sh
/usr/bin/python3 /home/pi/Kimstar-Data/python/bootSelector.py

bootSelector.py - 부팅시 기능 선택

bootSelector.py 실행시 원하는 버튼 3개 (BTN_TOP, BTN_THUMB2, BTN_BASE2)가 눌러져 있으면 kodi를 실행하고,
다른 버튼이라면 EmulationStation을 실행하도록 하였습니다.
또한 30초 동안 아무것도 안눌려지면 EmulationStation를 실행합니다.

#!/usr/bin/python

import sys, signal, subprocess
from inputs import get_gamepad

class Timeout():
	class Timeout(Exception):
		pass

	def __init__(self, sec):
		self.sec = sec
		pressedButton = ""
 
	def __enter__(self):
		signal.signal(signal.SIGALRM, self.raise_timeout)
		signal.alarm(self.sec)
 
	def __exit__(self, *args):
		signal.alarm(0)
 
	def raise_timeout(self, *args):
		raise Timeout.Timeout()

def buttonDetect():
	while 1:
		events = get_gamepad()
		for event in events:
			if event.ev_type == "Key" and event.state == 1 :
				return event.code

processExcuted = False

try:
	with Timeout(30):
		print("To execute KODI, press the button within 30 seconds.")
		if buttonDetect() in ("BTN_TOP", "BTN_THUMB2", "BTN_BASE2"):
			processExcuted = True
			subprocess.call("kodi")
		else:
			processExcuted = True
			subprocess.call("emulationstation")

except Timeout.Timeout:
	if processExcuted is False:
		subprocess.call("emulationstation")

문제점

코드는 정상적으로 실행됐지만, 문제점은 autostart.sh의 실행시점입니다.
라즈베리파이에 전원을 넣고, autostart.sh가 실행되는 시점이 10초 이상 걸리는데요.
전원 넣고 10초 기다렸다가 버튼을 누르는 행위가 그다지 효과적이지 않아서 최종적으로 버리는 코드가 됐습니다.
현재 환경을 크게 고치지 않는 범위에서 좋은 방법이 있는지 고민해 봐야할듯합니다.

다운로드

광고

댓글 남기기