python-evdev:同时读取游戏手柄的X和Y轴

时间:2018-09-01 00:50:54

标签: python evdev

我手上有一个小项目,我认为这是学习python的一个很好的借口。使用我在这里的游戏手柄(Logitech F310),操纵杆的X轴和Y轴的值在0-255之间变化,当它们在中间“空闲”时为127或128。

使用此代码(来自http://www.lafavre.us/robotics/IoT_LogitechF310.pdf

from evdev import InputDevice, categorize, ecodes, KeyEvent 
    gamepad = InputDevice('/dev/input/event3') 
for event in gamepad.read_loop(): 
    if event.type == ecodes.EV_ABS: 
        absevent = categorize(event) 
        if ecodes.bytype[absevent.event.type][absevent.event.code] == 'ABS_RZ':
            if absevent.event.value > 128: 
                print 'reverse' 
                print absevent.event.value 
            elif absevent.event.value < 127: 
                print 'forward' 
                print absevent.event.value 
       if ecodes.bytype[absevent.event.type][absevent.event.code] == 'ABS_Z': 
            if absevent.event.value > 128 : 
                print 'right' 
                print absevent.event.value 
            elif absevent.event.value < 127: 
                print 'left' 
                print absevent.event.value

我能够获得上,下,右,左的位置;到目前为止,我未能完成的工作是,如何在操纵杆位于X轴和Y轴之间时检索X和Y的值,这是很短的间隔(准确地说是4个)。

2 个答案:

答案 0 :(得分:0)

每个轴都是单独报告的,因此您需要在某些变量中保持当前状态。

from evdev import InputDevice, categorize, ecodes, KeyEvent 
    gamepad = InputDevice('/dev/input/event3') 
    last = {
        "ABS_RZ": 128,
        "ABS_Z": 128
    }
for event in gamepad.read_loop(): 
    if event.type == ecodes.EV_ABS: 
        absevent = categorize(event) 
        if ecodes.bytype[absevent.event.type][absevent.event.code] == 'ABS_RZ':
            last["ABS_RZ"] = absevent.event.value

       if ecodes.bytype[absevent.event.type][absevent.event.code] == 'ABS_Z': 
            last["ABS_Z"] = absevent.event.value

        if last["ABS_RZ"] > 128: 
            print 'reverse' 
            print last["ABS_RZ"] 
        elif last["ABS_RZ"] < 127: 
            print 'forward' 
            print last["ABS_RZ"] 

        if last["ABS_Z"] > 128 : 
            print 'right' 
            print last["ABS_Z"] 
        elif last["ABS_Z"] < 127: 
            print 'left' 
            print last["ABS_Z"]

答案 1 :(得分:0)

通过仔细阅读文档,我发现您可以使用absinfo从某个操纵杆中检索值:https://python-evdev.readthedocs.io/en/latest/apidoc.html#evdev.device.AbsInfo

例如,要获取轴0、1、2和5(在-1和1之间转换)的值,请使用以下代码:

device = evdev.InputDevice('/dev/input/event26')

def get_axis_value(i):
    return (device.absinfo(i).value - 128) / 128

def check_gamepad():
    [a, b, c, d] = map(get_axis_value, [0, 1, 2, 5])