Python脚本停止处理新启动的应用程序(pythonevdev)

2024-09-30 01:37:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经绞尽脑汁好几个星期了,我对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

Tags: keydebug脚本ifdef模式键盘模拟器

热门问题