我需要轮询USB鼠标的移动,并且仅在鼠标移动时才运行代码。
首先,我已经在大约5天的时间里自学了Python,因此如果编码不好,我深表歉意。其次,我在运行Stretch的Raspberry Pi上使用PyUSB。
我已经编写了一些Python代码,使我可以将USB鼠标与旧的串行类型连接器(例如旧的准将)连接(除了其不同类型的协议)。 该代码可以正常工作并将其按我的需要输出到GPIO,但是数据数组保留其最后一个值,这导致我的代码将其视为运动,因此鼠标永远不会停留在屏幕上。 我尝试将数组清零(在下一次迭代中被覆盖),尝试在循环末尾存储数据并比较两个数组,但无法正常工作。
如何使代码仅在鼠标移动时更新? 我可以以某种方式轮询鼠标运动吗?
#Start USB Data Collection
while 1:
try:
data = dev.read(endpoint.bEndpointAddress,endpoint.wMaxPacketSize)
#Extract data we need from array
B = data[0] # Button Data
X = data[1] # X Data
Y = data[2] # Y Data
S = data[3] # Scroll Wheel
IO.output(dataPinBL, 1) #Set Mouse Buttons to HIGH
IO.output(dataPinBR, 1) #Set Mouse Buttons to HIGH
IO.output(dataPinST, 1) #Turn on Status LED
## print('START')
#Debugging only
print (data) #Testing Only- Uncomment to see outputs
if Y == 0:
uFreq=0
dFreq=0
YD.ChangeDutyCycle(dFreq)
YU.ChangeDutyCycle(uFreq)
print("Y Zero")
if X == 0:
rFreq=0
lFreq=0
XL.ChangeDutyCycle(lFreq)
XR.ChangeDutyCycle(rFreq)
print("X Zero")
#X Movement
if X >> 0:
if X <= 127:
rFreq=((X/127.0)*100.0)
XR.ChangeDutyCycle(rFreq)
print(X, "RIGHT",data) #Testing Only
elif X >= 128:
lFreq= 200-0.78*X
XL.ChangeDutyCycle(lFreq)
print("LEFT",data) #Testing Only
#Y Movement
if Y >> 0:
if Y <= 127:
dFreq=((Y/127.0)*100.0)
YD.ChangeDutyCycle(dFreq)
##print("DOWN",dFreq) #Testing Only
elif Y >=128:
uFreq= 200-0.78*Y
YU.ChangeDutyCycle(uFreq)
print("UP",uFreq) #Testing Only
Y=0
X=0
#Button Presses
if B == 1:
IO.output(dataPinBL , 0)
print("LEFT CLICK") #Testing Only
sleep(0.0)
elif B == 2:
IO.output(dataPinBR, 0)
print("RIGHT CLICK") #Testing Only
sleep(0.0)
except usb.core.USBError as e:
data = None
if e.args == ('Operation timed out',):
print ('Time Out')
continue
break
#End USB Data Collection
#release Mouse back to OS
我希望数组(或至少输出)在鼠标移动之前保持为0,但无法弄清楚如何实现。