-
-
Save trtg/3922875 to your computer and use it in GitHub Desktop.
#!/usr/bin/python | |
import pygame | |
import re | |
from numpy import int32 | |
import ctypes | |
import time | |
w=1280 | |
h=1024 | |
#this is the debugfs entry for the trackpad, you can figure | |
#this out by watching the system log when you connect the trackpad | |
fd = open('/sys/kernel/debug/hid/0005:05AC:030E.0008/events','r') | |
screen = pygame.display.set_mode((w,h)) | |
pygame.font.init() | |
font1 = pygame.font.match_font('mikachan') | |
mikaFont = pygame.font.Font(font1,28) | |
for index in range(20000): | |
oline=fd.readline(); | |
line=oline.split(); | |
#repaint black background | |
#if you move this outside the loop, you get | |
#fingerpainting-like behaviour, i.e. fingers leave tracks | |
screen.fill((0,0,0)) | |
packets=[] | |
if((len(line)<4) or (line[0]!= "report")): | |
continue | |
#strip out everything but digits | |
reportsize=re.sub(r'\D',"",line[2]) | |
header=line[5:9] | |
#handle the double packet message ID | |
if(int(header[0],16)==0xf7): | |
firstpktlength=int(header[1],16) | |
numpackets=2 | |
packets.append(line[7:7+firstpktlength]) | |
packets.append(line[firstpktlength+7:(len(line))]) | |
elif(int(header[0],16)==0x28): | |
packets.append(line[5:(len(line))]) | |
numpackets=1 | |
if(len(packets)<=0): | |
continue | |
for ipkt in range(0,numpackets): | |
pkt=packets[ipkt] | |
data=pkt[4:len(pkt)] | |
numtouches=len(data)/9; | |
text1 = mikaFont.render(str(numtouches),1,(255,0,0),(0,0,0)) | |
screen.blit(text1,(200,200)) | |
for itouch in range(0,(numtouches)): | |
color=(0,0,100) | |
if(itouch%5==0): | |
color=(0,0,255) | |
if(itouch%5==1): | |
color=(0,255,0) | |
if(itouch%5==2): | |
color=(255,0,0) | |
tdata=data[itouch*9:(itouch+1)*9+1] | |
if(len(tdata)<9): | |
continue | |
X=(((int(tdata[1],16)&0x1F)<<27) | (int(int(tdata[0],16)<<19))) | |
Y=((((int(tdata[3],16)&0x3)<<30) | (int(tdata[2],16)<<22)|(int(tdata[1],16)<<14))>>19) | |
X=(((X>>19))) | |
X=ctypes.c_int32(X).value | |
X=X&0x1FFF | |
Y=Y&0x1FFF | |
#handle 2's complement | |
if(X&0x1000): | |
X=X-8192 | |
if(Y&0x1000): | |
Y=Y-8192 | |
#invert Y | |
Y=-Y | |
#push coordinates up into positive range | |
#then rescale to fit inside our pygame window | |
X=(X+3499)/6 | |
Y=(Y+2856)/6 | |
radius=int(tdata[6],16)&0x3f | |
orientation=(int(tdata[7],16)>>2)-32 | |
touch_major=int(tdata[4],16) | |
touch_minor=int(tdata[5],16) | |
if((radius==0) or (touch_minor==0) or (touch_major==0)): | |
continue | |
if (radius>60): | |
radius=60 | |
#if((int(tdata[8],16)&0xf0)==0x40): #only display fingers in drag state | |
if(1): | |
surface=pygame.Surface((touch_minor*2,touch_major*2)) | |
surface.set_colorkey((0,0,0)) | |
pygame.draw.ellipse(surface, color, (0,0,2*touch_minor,2*touch_major)) | |
surface=pygame.transform.rotate(surface,orientation) | |
screen.blit(surface,(X,Y)) | |
pygame.display.flip() | |
fd.close |
huh? Invalid argument on line 11
Traceback (most recent call last):
File "C:\NE\Touchpad\main.py", line 11, in
fd = open('/sys/kernel/debug/hid/0005:05AC:030E.0008/events','r')
OSError: [Errno 22] Invalid argument: '/sys/kernel/debug/hid/0005:05AC:030E.0008/events'
@Hzzkygcs this gist was written specifically for Linux, this absolutely will not work as is with Windows. Even if you were using Linux, this was written 8 years ago, I have no idea if the kernel interface will still be the same now.
@Hzzkygcs this gist was written specifically for Linux, this absolutely will not work as is with Windows. Even if you were using Linux, this was written 8 years ago, I have no idea if the kernel interface will still be the same now.
Uh, sorry for that then... Thank you anyway...
does this work?
tdata=data[itouch_9:(itouch+1)_9+1] has wierd intdentation