首页 > 解决方案 > python-evdev:同时读取游戏手柄的 X 轴和 Y 轴

问题描述

手头有一个小项目,我认为这将是学习 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)。

标签: pythonevdev

解决方案


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

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"]

推荐阅读