python - 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)。
解决方案
每个轴都单独报告,因此您需要在某些变量中保持当前状态。
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"]
推荐阅读
- javascript - 尝试在 HTML 页面加载时读取本地文件
- sql - 动态日期案例陈述
- python - 是否可以使用 python-pptx 更改图表的绘图区域大小?
- python - 如何在 django 的扩展用户创建表单中保存自定义添加的字段
- r - 在另一个数据框中的一个数据框中查找列的值,如果找不到,则为整行输入零
- excel - 更改单元格颜色
- vb.net - 在 dgv 中选择一行
- java - 如何在保存时识别 Spring Data JPA 中的更改?
- java - Jackson InvalidDefinitionException:无法构造实例,因为没有找到默认的无参数构造函数
- matlab - 为什么 MCR 2016 MCR_CACHE_ROOT 不起作用