我已经绞尽脑汁好几个星期了,我对Linux的理解不太清楚,所以我很容易忽略了它。你知道吗
在我的系统中,我有一个arduino,它通过I2C向我的RaspberryPi发送数据。 PI查看数据,然后模拟系统中的按钮按下。 我使用python脚本和evdev来完成这个。 系统首先以吸引模式(游戏模拟器前端)引导,然后从那里引导所需的模拟器+游戏。你知道吗
我首先在中启动python脚本rc.本地具有
sudo python myscript.py &
这使它运行。
它可以读取I2C没有任何问题,但evdev的东西没有按预期工作。你知道吗
树莓皮没有键盘插头。 在我的第一次测试中,我插入了一个用于测试目的的键盘,并且一切正常,python evdev发送的按钮在吸引模式下被识别,然后在启动的仿真器中被识别。 太好了!我以为。。。你知道吗
这是工作代码: `你知道吗
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#DECLARATIONS
import smbus
import time
import subprocess
import alsaaudio
from evdev import UInput, ecodes as e
ui = UInput()
debug = True
bus = smbus.SMBus(1)
address = 0x18
keys = [
e.KEY_ESC,
e.KEY_0,
e.KEY_ENTER,
e.KEY_LEFT,
e.KEY_UP,
e.KEY_RIGHT,
e.KEY_DOWN,
e.KEY_1,
e.KEY_2,
e.KEY_3,
e.KEY_4,
e.KEY_5,
e.KEY_6]
state = []
oldState = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
backHold = False
backTime = 0
#FUNCTIONS
def readController():
global state
global oldState
try:
state = bus.read_i2c_block_data(address,0,15)
backBtn(state[0])
if oldState != state:
DEBUG(state)
return True
except IOError:
subprocess.call(["i2cdetect","-y","1"])
return False
def updateButtons():
i = 0
global state
global oldState
while(i < len(state)):
if state[i] != oldState[i] and state[i] == 0 or state[i] == 1:
DEBUG("Button State: " + str(state[i]))
oldState[i] = state[i]
if i < 13 and i > 0:
UInput(i,state[i])
if i >= 13:
volumeControl(i,state[i])
i = i+1
return
def UInput(btn,state):
ui.write(e.EV_KEY,keys[btn],state)
ui.syn()
DEBUG("Button Pressed: " + str(keys[btn]))
return
def volumeControl(btn,state):
m = alsaaudio.Mixer("PCM")
vol = m.getvolume()
vol = int(vol[0])
DEBUG("Current Volume: " + str(vol))
if state == 1:
if btn == 13:
#INCREASE
newVol = vol + 5
if newVol > 100:
newVol = 100
else:
#DECREASE
newVol = vol - 5
if newVol < 0:
newVol = 0
DEBUG("New Volume: " + str(newVol))
m.setvolume(newVol)
return
def backBtn(state):
global backHold
global backTime
if state == 1:
backHold = True
else:
backHold = False
backTime = 0
UInput(0,0)
if backHold:
backTime = backTime + 1
DEBUG ("Holding ESC Time: " + str(backTime))
if backTime == 50:
backTime = 0
UInput(0,1)
def DEBUG(msg):
if debug:
print msg
#MAIN LOOP
while True:
if readController():
updateButtons()
time.sleep(0.10)
`
然后我关闭系统,拔下键盘,再次启动系统,现在我的问题开始了; 如果没有同时插入“吸引”模式和“启动”模式的键盘,模拟器将无法再识别任何按键。 所以我试着做这里描述的: http://python-evdev.readthedocs.io/en/latest/tutorial.html#specifying-uinput-device-options
得到了不同的结果。你知道吗
现在我的按钮在吸引模式下工作得很好,但一旦启动模拟器就停止工作。 但是如果我在模拟器启动后重新运行脚本,按钮也会在那里工作。你知道吗
这是我对代码的修改:
cap = {e.EV_KEY : [
e.KEY_ESC,
e.KEY_0,
e.KEY_ENTER,
e.KEY_LEFT,
e.KEY_UP,
e.KEY_RIGHT,
e.KEY_DOWN,
e.KEY_1,
e.KEY_2,
e.KEY_3,
e.KEY_4,
e.KEY_5,
e.KEY_6]
}
ui = UInput(cap, name='ArcadeController', version=0x1)
我真的不知道如何解决这个问题,如果我忽略了什么或是错过了什么。你知道吗
我试过:http://python-evdev.readthedocs.io/en/latest/tutorial.html#create-uinput-device-with-capabilities-of-another-device 并尝试在init.d中将脚本作为服务启动。 我监视键盘按下,这样我就可以在模拟器启动时看到我的脚本正在运行。你知道吗
编辑:
如果我在使用第二个版本的脚本时运行cat /proc/bus/input/devices
(在吸引模式下工作但在启动的模拟器中不工作的脚本,除非我再次运行该脚本),我将得到以下结果:
I: Bus=0003 Vendor=0001 Product=0001 Version=0001
N: Name="ArcadeController"
P: Phys=
S: Sysfs=/devices/virtual/input/input1
U: Uniq=
H: Handlers=kbd event1
B: PROP=0
B: EV=3
B: KEY=1680 0 0 100008fe
我可以通过cat /dev/input/event1
看到它正在接收我的输入。你知道吗
如果我运行的第一个版本只有在有外置键盘的情况下才有效,我得到的是:
I: Bus=0003 Vendor=0001 Product=0001 Version=0001
N: Name="py-evdev-uinput"
P: Phys=
S: Sysfs=/devices/virtual/input/input3
U: Uniq=
H: Handlers=sysrq kbd event3 rfkill
B: PROP=0
B: EV=3
B: KEY=ff ffffffff 0 0 3f 3007f 1000f 7fff0fff 7fe001f ffff000f 7ffffff ffffffff ffffffff 3fdff 7fff8fff ff03ff 1ffffff ffffff07 ffffffff ffffffff ffffffff ffefffff ffffffff fffffffe
如果我在没有外部键盘的情况下运行相同的版本:
I: Bus=0003 Vendor=0001 Product=0001 Version=0001
N: Name="py-evdev-uinput"
P: Phys=
S: Sysfs=/devices/virtual/input/input1
U: Uniq=
H: Handlers=sysrq kbd event1 rfkill
B: PROP=0
B: EV=3
B: KEY=ff ffffffff 0 0 3f 3007f 1000f 7fff0fff 7fe001f ffff000f 7ffffff ffffffff ffffffff 3fdff 7fff8fff ff03ff 1ffffff ffffff07 ffffffff ffffffff ffffffff ffefffff ffffffff fffffffe
目前没有回答
相关问题 更多 >
编程相关推荐