gpt4 book ai didi

Python-无线 Controller 和加数/值列表

转载 作者:行者123 更新时间:2023-12-02 03:17:07 24 4
gpt4 key购买 nike

硬件: RPi4 4GB,SteelSeries Stratus Duo WiFi/BTLE无线 Controller

长期目标:使用无线 Controller 执行多项任务(即移动/归零工具头、启动/暂停/停止程序等),该 Controller 将与正在运行的 RPi 连接控制 CNC 路由器的服务器。

短期目标:确定正在按下的按钮组合,而不使用过多的 if/elif 语句。

摘要:我已经弄清楚如何使用 PyUSB 读取无线 Controller 的输出。我已经更改/添加了 PyUSB 中包含的代码,以产生一些人类可读的结果。输出采用列表格式,每个项目的值由某种按钮组合确定。 (我知道它说的是“数组”,但 Python 似乎将它视为一个列表。)

这是未按下任何按钮时的输出(默认):

array('B', [0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])

前两个值 (...[0, 20,...]) 似乎是某种标识符,并且它们永远不会改变。然而,多个按钮使用列表中相同的索引位置。它们都有不同的值,同时按下时会相加。按钮值的组合不会为索引位置生成相同的输出。示例:

按钮 A: array('B', [0, 20, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])

左上角: array('B', [0, 20, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])

左上角 & A: array('B', [0, 20, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])

这是我当前的程序,正如您所看到的 if/elif 语句开始有点失控。:

#!/usr/bin/python
from __future__ import division

import usb.core
import usb.util
import time
import os
import sys
#import csv

USB_IF = 0 # Interface
USB_TIMEOUT = 5 # Timeout in MS

USB_VENDOR = 0x1038 # SteelSeries
USB_PRODUCT = 0x1430 # Stratus Duo

dev = usb.core.find(idVendor=USB_VENDOR, idProduct=USB_PRODUCT)

endpoint = dev[0][(0,0)][0]

if dev.is_kernel_driver_active(USB_IF) is True:
dev.detach_kernel_driver(USB_IF)

usb.util.claim_interface(dev, USB_IF)

while True:
control = None

try:
control = dev.read(endpoint.bEndpointAddress, endpoint.wMaxPacketSize, USB_TIMEOUT)
CtrlA = control[2] #Directional Pad, Start/Select, L/R Stick Press
CtrlB = control[3] #Top Left/Top Right, Center, A, B, X, Y
CtrlC = control[4] #Left Trigger (0-255)
CtrlD = control[5] #Right Trigger (0-255)
CtrlEH = control[6:10] #Left Stick
CtrlIL = control[10:14] #Right Stick
print control
if CtrlA ==0:
print "No Input"
elif CtrlA == 1:
print "Directional Pad: Up"
elif CtrlA == 2:
print "Directional Pad: Down"
elif CtrlA == 4:
print "Directional Pad: Left"
elif CtrlA == 8:
print "Directional Pad: Right"
elif CtrlA == 16:
print "Right Center Button"
elif CtrlA == 32:
print "Left Center Button"
elif CtrlA == 64:
print "Left Stick Pressed"
elif CtrlA == 128:
print "Right Stick Pressed"
elif CtrlA == 192:
print "Right & Left Sticks Pressed"
else:
break

if CtrlC == 0:
print "Left Trigger: No Input"
elif 1 <= CtrlC <=254:
print "Left Trigger: " + "{:.0%}".format(CtrlC/255)
elif CtrlC == 255:
print "Left Trigger: Max"
else:
break


if CtrlD == 0:
print "Right Trigger: No Input"
elif 1 <= CtrlD <=254:
print "Right Trigger: " + "{:.0%}".format(CtrlD/255)
elif CtrlD == 255:
print "Right Trigger: Max"
else:
break

except:
pass

#Let Ctrl+C actually exit.
time.sleep(0.01)

同样,我想要的结果是让程序确定按下的按钮组合 - 例如,如果 control[3] 的值为 17,有没有一种方法可以有效地让程序确定它是 161 分配值的组合(“A”按钮和“左上”按钮)?

我研究了使用 CSV 文件、itertools(排列、组合等)、嵌入式列表和其他此类可能的解决方案的可能性。乍一看,所有这些似乎都在我想做的事情的范围内。不幸的是,这些(至少它们本身)似乎都没有实现目标。这对我来说是一个完全未知的编程领域,任何指导将不胜感激。

最佳答案

这就是我要做的。

我会为每个按钮分配自己的位置和值元组,如下所示:

buttons = [
('dir_up', 2, 1),
('dir_down', 2, 2),
('dir_left', 2, 4),
('dir_right', 2, 8),
# ... etc, other buttons here
]

然后您可以使用生成器查看实际按下了哪些按钮:

def pressed_buttons(control):
for button in buttons:
name, control_pos, value = button
# To check if the button was pressed, perform a binary masking
if control[control_pos] & value == value:
yield button

P。 S. 为了更加清楚,您可能会找到 namedtuples甚至enums有用。

关于Python-无线 Controller 和加数/值列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60229413/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com