|
@@ -0,0 +1,730 @@
|
|
|
+#!/usr/bin/python3
|
|
|
+
|
|
|
+#cat touchscreen_pointer_mapping_5.py
|
|
|
+
|
|
|
+import os, tempfile
|
|
|
+import time
|
|
|
+import subprocess
|
|
|
+from _thread import start_new_thread
|
|
|
+
|
|
|
+import sys
|
|
|
+sys.stdout.write("\x1b]2;TOUCHSCREEN EVENT\x07")
|
|
|
+
|
|
|
+debug = 0
|
|
|
+
|
|
|
+def mapFromTo_(x,a,b,c,d):
|
|
|
+ y=(x-a)/(b-a)*(d-c)+c
|
|
|
+ return y
|
|
|
+
|
|
|
+def mapFromTo(value,in_min,in_max,out_min,out_max):
|
|
|
+ #y=(value-in_min)/(in_max-in_min)*(out_max-out_min)+out_min
|
|
|
+ y= (value - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
|
|
|
+ if y < out_min:
|
|
|
+ y = out_min
|
|
|
+ if y > out_max:
|
|
|
+ y = out_max
|
|
|
+ return y
|
|
|
+
|
|
|
+class PIPE():
|
|
|
+ def __init__(self):
|
|
|
+ self.tmpdir = tempfile.mkdtemp()
|
|
|
+ try:os.mkdir(self.tmpdir)
|
|
|
+ except:pass
|
|
|
+ self.filename = os.path.join(self.tmpdir, 'myfifo')
|
|
|
+ def init(self):
|
|
|
+ print()
|
|
|
+ print( "create ifio file")
|
|
|
+
|
|
|
+ print( self.filename)
|
|
|
+ try:
|
|
|
+ os.mkfifo(self.filename)
|
|
|
+ except OSError as e:
|
|
|
+ print( "Failed to create FIFO: %s" % e)
|
|
|
+ print( "ende")
|
|
|
+ return self.filename
|
|
|
+
|
|
|
+ def __del__(self):
|
|
|
+ print( "PIPE DESTRUKTOR")
|
|
|
+ #self.fifo.close()
|
|
|
+ os.remove(self.filename)
|
|
|
+ os.rmdir(self.tmpdir)
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+def get_touch_id():
|
|
|
+ cmd = ["xinput"]
|
|
|
+
|
|
|
+ sub = subprocess.Popen(cmd, stdout=subprocess.PIPE)
|
|
|
+ output = sub.communicate()[0]
|
|
|
+
|
|
|
+ #print( output)
|
|
|
+ data = output.split("\n")
|
|
|
+
|
|
|
+ odata = []
|
|
|
+ pattern = "TouchController"
|
|
|
+ print( "GET INPUT TUCHSCREEN ID")
|
|
|
+ for line in data:
|
|
|
+ if pattern in line:
|
|
|
+ print( line,end="")
|
|
|
+ if "id=" in line:
|
|
|
+ idx = line.index("id=")
|
|
|
+ idx = line.index("id=")
|
|
|
+ line = line[idx+3:]
|
|
|
+ line = line.split(" ")[0]
|
|
|
+ line = line.split("\t")[0]
|
|
|
+ print( [line])
|
|
|
+ odata.append(line)
|
|
|
+ return odata
|
|
|
+
|
|
|
+
|
|
|
+def system(cmd):
|
|
|
+ print( "EXECUTE ",cmd)
|
|
|
+ os.system(cmd)
|
|
|
+ print( "END PROCESS",cmd)
|
|
|
+
|
|
|
+def start_xinput(filename):
|
|
|
+
|
|
|
+ print()
|
|
|
+ print( "START suprocess")
|
|
|
+ input_id0 = 14 #touch digitizer
|
|
|
+ input_id = 15 #touch digitizer
|
|
|
+ #input_id = 12 #mouse
|
|
|
+ input_ids = get_touch_id()
|
|
|
+
|
|
|
+ for i in input_ids:
|
|
|
+ system("xinput map-to-output %s VGA1" % str(i) )
|
|
|
+ #system("xinput map-to-output %s VGA1" % str(input_id0) )
|
|
|
+
|
|
|
+ cmd = ["xinput", "test",str(i),">",filename]
|
|
|
+ print( cmd)
|
|
|
+ #os.system( " ".join(cmd) )
|
|
|
+ start_new_thread( system, ( " ".join(cmd), ) )
|
|
|
+
|
|
|
+
|
|
|
+ #subprocess.Popen(cmd)
|
|
|
+ #stdoutdata, stderrdata = p.communicate()
|
|
|
+ #print stdoutdata, stderrdata
|
|
|
+ #subprocess.run(["tail", "-l"])
|
|
|
+ print( "end suprocess")
|
|
|
+
|
|
|
+def start_evtest(filename):
|
|
|
+
|
|
|
+ print()
|
|
|
+ print("START suprocess")
|
|
|
+ input_id0 = 14 #touch digitizer
|
|
|
+ input_id = 15 #touch digitizer
|
|
|
+ input_id = 23 #touch digitizer
|
|
|
+ input_id = 5 #touch digitizer
|
|
|
+ #input_id = 12 #mouse
|
|
|
+ #input_ids = get_touch_id()
|
|
|
+
|
|
|
+
|
|
|
+ cmd = ["evtest", "/dev/input/event3",">",filename]
|
|
|
+ #cmd = ["evtest", "/dev/input/by-id/usb-eGalax_Inc._USB_TouchController-event-mouse",">",filename]
|
|
|
+ cmd = ["evtest", "/dev/input/event23",">",filename]
|
|
|
+ #cmd = ["cat", "/dev/input/event23",">",filename]
|
|
|
+ cmd = ["evtest", "/dev/input/event5",">",filename]
|
|
|
+ cmd = ["evtest", "/dev/input/event24",">",filename]
|
|
|
+ #xrandr --listmonitors
|
|
|
+ print( cmd)
|
|
|
+ start_new_thread( system, ( " ".join(cmd), ) )
|
|
|
+ print( "end suprocess")
|
|
|
+
|
|
|
+def disable_xinput_touch(name):
|
|
|
+ cmd="xinput list"
|
|
|
+ print("cmd",cmd)
|
|
|
+ r=os.popen(cmd)
|
|
|
+ lines = r.readlines()
|
|
|
+ for line in lines:
|
|
|
+ if name in line:
|
|
|
+ line = line.strip()
|
|
|
+ line = line.split("\t")
|
|
|
+ print("DISABLE !!",[line])
|
|
|
+ _id =""
|
|
|
+ for l in line:
|
|
|
+ if "id=" in l:
|
|
|
+ _id = l.replace("id=","")
|
|
|
+ if _id:
|
|
|
+ cmd="xinput disable {}".format(_id) # disable touch as normal input
|
|
|
+ print("cmd:",cmd)
|
|
|
+ os.system(cmd)
|
|
|
+ #exit()
|
|
|
+
|
|
|
+def read(filename):
|
|
|
+ #filename = "eventlog"
|
|
|
+ import fcntl
|
|
|
+ print()
|
|
|
+ print( "START readinloop",filename)
|
|
|
+ #stream = open(filename,"rt", )
|
|
|
+ stream = open(filename,"rb", buffering=0)
|
|
|
+
|
|
|
+ # NON BLOCKING FILE
|
|
|
+ fd = stream.fileno()
|
|
|
+ flag = fcntl.fcntl(fd,fcntl.F_GETFL)
|
|
|
+ #print flag
|
|
|
+ fcntl.fcntl(fd,fcntl.F_SETFL,flag | os.O_NONBLOCK)
|
|
|
+ flag = fcntl.fcntl(fd,fcntl.F_GETFL)
|
|
|
+ #print flag
|
|
|
+
|
|
|
+ #stream.seek(0 ,2)
|
|
|
+ line =""
|
|
|
+ A = Action()
|
|
|
+ A.mode = "touchpad" # or touchscreen
|
|
|
+ A.mode = "touchscreen"
|
|
|
+ while 1:
|
|
|
+ stream_read = ""
|
|
|
+ try:
|
|
|
+ stream_read = stream.read()
|
|
|
+ except IOError as err:
|
|
|
+ if err.errno == 11: # no data
|
|
|
+ pass
|
|
|
+ else:
|
|
|
+ raise err
|
|
|
+
|
|
|
+ for ch in stream_read:
|
|
|
+ #print [ch ]
|
|
|
+ if ch:
|
|
|
+ if "\n" == ch:
|
|
|
+ if debug:print( "------", len(line))
|
|
|
+ if line:
|
|
|
+ if debug:print( [line])
|
|
|
+ A.action(line)
|
|
|
+ line = ""
|
|
|
+ else:
|
|
|
+ line += ch
|
|
|
+ time.sleep(0.01)
|
|
|
+
|
|
|
+def cleanup_multipointer(prefix="multipointer_"):
|
|
|
+ import os
|
|
|
+ cmd="xinput list | grep '{}'".format(prefix)
|
|
|
+ print("cleanup xinput", cmd)
|
|
|
+ r=os.popen(cmd )
|
|
|
+
|
|
|
+ lines = r.readlines()
|
|
|
+
|
|
|
+ for line in lines:
|
|
|
+ line = line.strip()
|
|
|
+ line = line.replace("\t"," " )
|
|
|
+ if " " in line:
|
|
|
+ line = line.replace(" "," ")
|
|
|
+
|
|
|
+ if "id=" in line and "pointer" in line:
|
|
|
+ line = line.split()
|
|
|
+ print("LINE",[line])
|
|
|
+ _id = line[-4]
|
|
|
+ _id = _id.replace("id=","")
|
|
|
+ cmd= "xinput remove-master '{}'".format(_id)
|
|
|
+ print(cmd)
|
|
|
+ print(" kill X11 ")
|
|
|
+ #os.system(cmd)
|
|
|
+ """traps: xfce4-terminal[283904] trap int3 ip:7f784386cabb sp:7ffebb961c10 error:0 in libglib-2.0.so.0.6600.8[7f784382e000+88000]
|
|
|
+ [24187.974998] xfce4-terminal[306138]: segfault at 90 ip 00007f1b725ac838 sp 00007ffd8e83b940 error 4 in libgdk-3.so.0.2404.20[7f1b72573000+7f000]
|
|
|
+ [24187.975015] Code: 41 0f 10 4f 60 48 89 5d 38 f2 0f 5e c8 f2 0f 11 4d 48 e8 8b 72 fd ff 48 89 df e8 93 fb fc ff 48 89 ef 48 89 c6 e8 38 7f fd ff <49> 8b b5 90 00 00 00 48 89 ef e8 89 7f fd ff 49 8d 97 b8 00 00 00
|
|
|
+ """
|
|
|
+
|
|
|
+
|
|
|
+class Action():
|
|
|
+ def __init__(self, output=""):
|
|
|
+ self._X = 0
|
|
|
+ self._Y = 0
|
|
|
+ self._Xmin = 10000000000
|
|
|
+ self._Ymin = 10000000000
|
|
|
+ self._Xmax = 0
|
|
|
+ self._Ymax = 0
|
|
|
+ self.touch_config= {"x_max":1024,"y_max":"768"}
|
|
|
+ self.touch = ""
|
|
|
+ self.screen_config = {}
|
|
|
+ self.screen = output # "DP-2"
|
|
|
+ self.timer = time.time()
|
|
|
+ self.motion_changeX =0
|
|
|
+ self.motion_changeY =0
|
|
|
+ self.motion_change = 0
|
|
|
+ self.btn_cmd = ""
|
|
|
+ self.btn_timer = time.time()
|
|
|
+ self.btn_down = 0
|
|
|
+ self.btn_up = 0
|
|
|
+ self._btn_timer = 0
|
|
|
+
|
|
|
+ self._config_ok = 0
|
|
|
+ self._config_data = []
|
|
|
+
|
|
|
+ self.pointer_config = []
|
|
|
+ self.pointer_create_count = 0
|
|
|
+ self.MT_SLOT = 0 #int(ix)
|
|
|
+
|
|
|
+ self.mode = "touchpad" # or touchscreen
|
|
|
+ self.refresh_screen_config()
|
|
|
+
|
|
|
+ self.refresh_multipointer_config(cleanup=1)
|
|
|
+ def refresh_multipointer_config(self,cleanup=0):
|
|
|
+ print("==============")
|
|
|
+ self.pointer_config = []
|
|
|
+ prefix = "multipointer_"
|
|
|
+ prefix = "librelight_pointer_z"
|
|
|
+ if cleanup:
|
|
|
+ cleanup_multipointer(prefix=prefix)
|
|
|
+
|
|
|
+ cmd = "xinput list | grep '{}' | grep 'XTEST pointer'".format(prefix)
|
|
|
+ r = os.popen(cmd)
|
|
|
+ lines = r.readlines()
|
|
|
+ for line in lines:
|
|
|
+ cfg = {}
|
|
|
+ line = line.strip().split()
|
|
|
+ print([line])
|
|
|
+ _id = line[5]
|
|
|
+ _id = _id.replace(")","")
|
|
|
+ _id = _id.replace("(","")
|
|
|
+ _id = _id.replace("id=","")
|
|
|
+ cfg["id"] = _id
|
|
|
+ cfg["name"] = line[2]
|
|
|
+ self.pointer_config.append( cfg )
|
|
|
+
|
|
|
+
|
|
|
+ create = []
|
|
|
+ for i in range(1,5+1):
|
|
|
+ ok = 0
|
|
|
+ n = "{}{}".format(prefix,i)
|
|
|
+ for j in self.pointer_config:
|
|
|
+ print("pt",i,j)
|
|
|
+ print("pt",n, j["name"])
|
|
|
+ if n == j["name"]:
|
|
|
+ ok = 1
|
|
|
+ break
|
|
|
+
|
|
|
+
|
|
|
+ if not ok:
|
|
|
+ create.append(n)
|
|
|
+
|
|
|
+
|
|
|
+ if 0: #for i in create:
|
|
|
+ cmd = "xinput create-master '{}'".format(i)
|
|
|
+ print("CMD:",cmd)
|
|
|
+ os.system(cmd)
|
|
|
+
|
|
|
+ if len(create) and self.pointer_create_count < 10: # recursion !!
|
|
|
+ print("self.refresh_multipointer_config() # recursion !!!")
|
|
|
+ self.pointer_create_count += 1
|
|
|
+ #print(self.pointer_create_count)
|
|
|
+
|
|
|
+ self.refresh_multipointer_config()
|
|
|
+
|
|
|
+ #exit()
|
|
|
+
|
|
|
+
|
|
|
+ def refresh_screen_config(self):
|
|
|
+ #self.screen_config = {}
|
|
|
+ cmd = "xrandr --listmonitors"
|
|
|
+ r = os.popen(cmd)
|
|
|
+ lines = r.readlines()
|
|
|
+ for line in lines[1:]:
|
|
|
+ cfg = {}
|
|
|
+ line = line.strip().split()
|
|
|
+ #print("scr_cfg",[line])
|
|
|
+ cfg["id"] = line[0]
|
|
|
+ cfg["name"] = line[1]
|
|
|
+ cfg["res"] = line[2]
|
|
|
+ output = line[3]
|
|
|
+ cfg["output"] = output
|
|
|
+
|
|
|
+ if "*" in cfg["name"]:
|
|
|
+ cfg["primary"] = 1
|
|
|
+ else:
|
|
|
+ cfg["primary"] = 0
|
|
|
+
|
|
|
+ x,y = cfg["res"].split("x")
|
|
|
+ cfg["x"] = x.split("/")[0]
|
|
|
+ cfg["y"] = y.split("/")[0]
|
|
|
+ pos = y.split("/")
|
|
|
+ pos = pos[-1]
|
|
|
+ pos = pos.split("+")
|
|
|
+ cfg["x_pos"] = pos[1]
|
|
|
+ cfg["y_pos"] = pos[2]
|
|
|
+
|
|
|
+ for k in cfg:
|
|
|
+ v = cfg[k]
|
|
|
+ try:
|
|
|
+ cfg[k] = int(v)
|
|
|
+ except ValueError:
|
|
|
+ pass
|
|
|
+ print(cfg)
|
|
|
+
|
|
|
+ self.screen_config[ output] = cfg
|
|
|
+ print()
|
|
|
+ #exit()
|
|
|
+
|
|
|
+
|
|
|
+ def x(self):
|
|
|
+ v = self._X
|
|
|
+ if self.mode == "touchpad":
|
|
|
+ scr = self.screen_config[self.screen]
|
|
|
+ v = mapFromTo(self._X,0,self.touch_config["ABS_X"]["Max"],scr["x_pos"],scr["x_pos"]+scr["x"])
|
|
|
+ elif self.mode == "touchscreen":
|
|
|
+ v = mapFromTo(self._X,10,4000,0,1600)
|
|
|
+ return round(v,2)
|
|
|
+
|
|
|
+ def y(self):
|
|
|
+ v = self._Y
|
|
|
+ if self.mode == "touchpad":
|
|
|
+ scr = self.screen_config[self.screen]
|
|
|
+ v = mapFromTo(self._Y,0,self.touch_config["ABS_Y"]["Max"],scr["y_pos"],scr["y_pos"]+scr["y"])
|
|
|
+ elif self.mode == "touchscreen":
|
|
|
+ v = mapFromTo(self._Y,0,1400,0,1600)
|
|
|
+
|
|
|
+ return round(v,2)
|
|
|
+
|
|
|
+
|
|
|
+ def _parse_config(self):
|
|
|
+ print("_parse_config")
|
|
|
+ code = ""
|
|
|
+ lines = self._config_data
|
|
|
+ for i,line in enumerate(lines):
|
|
|
+ #print(i,[line])
|
|
|
+ cfg = {}
|
|
|
+ if "Event code" in line:
|
|
|
+ line = line.strip()
|
|
|
+ if " " in line:
|
|
|
+ line = line.replace(" "," ")
|
|
|
+ tmp = line.split()
|
|
|
+ key = tmp[3]
|
|
|
+ key = key.replace("(","").replace(")","")
|
|
|
+ cfg["key"] = key
|
|
|
+ cfg["code"] = tmp[2]
|
|
|
+ for j in range(1,10):
|
|
|
+ tmp = lines[i+j]
|
|
|
+ if not tmp.startswith(" "): #sub config
|
|
|
+ break
|
|
|
+ tmp = tmp.strip()
|
|
|
+ if " " in tmp:
|
|
|
+ tmp = tmp.replace(" "," ")
|
|
|
+ tmp = tmp.split()
|
|
|
+ k = tmp[0]
|
|
|
+ v = tmp[1]
|
|
|
+ try:
|
|
|
+ v = int(v)
|
|
|
+ except ValueError:
|
|
|
+ pass
|
|
|
+ cfg[k] = v
|
|
|
+ #print(" ADD CFG",key,[k,v])
|
|
|
+ print("t_cfg",cfg)
|
|
|
+ self.touch_config[key] = cfg
|
|
|
+
|
|
|
+
|
|
|
+ def check_config(self,line):
|
|
|
+
|
|
|
+ if not self._config_ok:
|
|
|
+ self._config_data.append( line)
|
|
|
+ print("CONFIG:",[line])
|
|
|
+ if "Testing ... (interrupt to exit)" in line:
|
|
|
+ self._config_ok = 1
|
|
|
+ self._parse_config()
|
|
|
+ return 0
|
|
|
+
|
|
|
+ else: #init touch screen config
|
|
|
+ if "Input driver version is" in line:
|
|
|
+ self._config_ok = 0
|
|
|
+ elif "Input device ID:" in line:
|
|
|
+ self._config_ok = 0
|
|
|
+ return 1
|
|
|
+
|
|
|
+ def cur_pointer_id(self):
|
|
|
+ i = self.MT_SLOT
|
|
|
+ return "xxx"
|
|
|
+ return self.pointer_config[i]["id"]
|
|
|
+
|
|
|
+
|
|
|
+ def _check_ABS(self,line):
|
|
|
+ #print([line])
|
|
|
+
|
|
|
+ if "ABS_MT_SLOT" in line:
|
|
|
+ key =", value "
|
|
|
+ #print("ABS_MT_SLOT", line)
|
|
|
+ line = line.strip()
|
|
|
+ if key in line:
|
|
|
+ ix = line.split()[-1] #.index(key)
|
|
|
+
|
|
|
+ try:
|
|
|
+ ix = int(ix)
|
|
|
+ if ix > 5:
|
|
|
+ ix = 5
|
|
|
+ self.MT_SLOT = ix
|
|
|
+ #print("++++++++++++++++++++++++++++++++++++++++++++++++++++ NEW SLOT",ix)
|
|
|
+ #self.cur_pointer_id()
|
|
|
+ except ValueError:
|
|
|
+ pass
|
|
|
+
|
|
|
+ if "ABS_X" in line or "ABS_Y" in line:# or "ABS_MT_POSITION_X" in line or "ABS_MT_POSITION_Y" in line:
|
|
|
+ key =", value "
|
|
|
+ #print("ABS", [line])
|
|
|
+ if key in line:
|
|
|
+ ix = line.index(key)
|
|
|
+ try:
|
|
|
+ c = line[ix+len(key):]
|
|
|
+ c = int(c)
|
|
|
+ if "_X" in line:
|
|
|
+ self._X =c
|
|
|
+ if c > self._Xmax:
|
|
|
+ self._Xmax = c
|
|
|
+ if c < self._Xmin:
|
|
|
+ self._Xmin = c
|
|
|
+ self.motion_changeX += 1
|
|
|
+
|
|
|
+ else:
|
|
|
+ self._Y =c
|
|
|
+
|
|
|
+ if debug:print( [c , self._Ymin,c < self._Ymin])
|
|
|
+ if c > self._Ymax:
|
|
|
+ self._Ymax = c
|
|
|
+ if c < self._Ymin:
|
|
|
+ self._Ymin = c
|
|
|
+ self.motion_changeY += 1
|
|
|
+
|
|
|
+ #cmd = "xdotool mousemove {} {}".format(self.x(),self.y())
|
|
|
+
|
|
|
+ # 3 position changes to acept position
|
|
|
+ if self.motion_changeX >0 and self.motion_changeY >0:
|
|
|
+ self.motion_changeX =0
|
|
|
+ self.motion_changeY =0
|
|
|
+ self.motion_change = 1
|
|
|
+
|
|
|
+
|
|
|
+ if debug:
|
|
|
+ print( line)
|
|
|
+ print( cmd)
|
|
|
+ print( self._Xmin,self._Xmax,self._Ymin,self._Ymax)
|
|
|
+
|
|
|
+ #os.system(cmd)
|
|
|
+ except Exception as e:
|
|
|
+ print( "ERR:",e)
|
|
|
+ print( "E:", [line])
|
|
|
+ def action(self,line):
|
|
|
+ """GET DEVICE INPUT LINE AND DECODE IT
|
|
|
+
|
|
|
+ xinput test
|
|
|
+ motion a[0]=366 a[1]=558
|
|
|
+
|
|
|
+ evtestEvent:
|
|
|
+ time 1556826444.499763, type 2 (EV_REL), code 0 (REL_X), value 8
|
|
|
+ """
|
|
|
+ if "motion" in line: #xinput test id
|
|
|
+ if "a[2]=1" in line:
|
|
|
+ #cmd = "xdotool click 1"
|
|
|
+ cmd = "xdotool mouseup 1"
|
|
|
+ p = self.cur_pointer_id()
|
|
|
+ cmd = "xte -i {} mouseup 1".format(p)
|
|
|
+ print("\033[92m{}\033[0m".format( cmd))
|
|
|
+ #print( line,cmd)
|
|
|
+ os.system(cmd)
|
|
|
+ #os.system("ls -l")
|
|
|
+ if "a[2]=0" in line:
|
|
|
+ #cmd = "xdotool click 1"
|
|
|
+ cmd = "xdotool mousedown 1"
|
|
|
+ print("\033[95m{}\033[0m".format( cmd))
|
|
|
+ #print( line,cmd)
|
|
|
+ #os.system(cmd)
|
|
|
+ #os.system("ls -l")
|
|
|
+ if "BTN_LEFT" in line or "BTN_TOUCH" in line: #evtest /dev/input/eventX
|
|
|
+ " Mouse Button Click "
|
|
|
+
|
|
|
+ key =", value "
|
|
|
+ if key in line:
|
|
|
+ ix = line.index(key)
|
|
|
+ try:
|
|
|
+ c = line[ix+len(key):]
|
|
|
+ c = int(c)
|
|
|
+ if c:
|
|
|
+ self.btn_down = 1
|
|
|
+ else:
|
|
|
+ self.btn_up = 1
|
|
|
+
|
|
|
+ #RESET MOTION CHANGE
|
|
|
+ self.motion_changeX =0
|
|
|
+ self.motion_changeY =0
|
|
|
+ self.motion_change = 0
|
|
|
+ self.btn_timer = time.time()
|
|
|
+ #print( line)
|
|
|
+ #print( self.btn_cmd )
|
|
|
+
|
|
|
+ except Exception as e:
|
|
|
+ print( "ERR:",e)
|
|
|
+ print( "E:", [line])
|
|
|
+
|
|
|
+ if not self.check_config(line):
|
|
|
+ return
|
|
|
+
|
|
|
+ self._check_ABS(line)
|
|
|
+
|
|
|
+ self.run()
|
|
|
+
|
|
|
+ def btn(self,val):
|
|
|
+ if val:
|
|
|
+ #time.sleep(0.01)
|
|
|
+ cmd = "xdotool mousedown 1"
|
|
|
+ p = self.cur_pointer_id()
|
|
|
+ cmd = "xte -i {} 'mousedown 1'".format(p)
|
|
|
+ print("\033[92m{:30}\033[0m".format( cmd),"{:8} {:8} ".format(self.x(),self.y()) , self.screen ,"MT_SLOT",self.MT_SLOT)
|
|
|
+
|
|
|
+ if self.MT_SLOT == 0:
|
|
|
+ pass
|
|
|
+ os.system(cmd)
|
|
|
+ self.btn_down = 0
|
|
|
+ self._btn_timer = time.time()
|
|
|
+ else:
|
|
|
+ cmd = "xdotool mouseup 1"
|
|
|
+ p = self.cur_pointer_id()
|
|
|
+ cmd = "xte -i {} 'mouseup 1'".format(p)
|
|
|
+ #print( cmd)
|
|
|
+ t = time.time() - self._btn_timer
|
|
|
+ print("\033[95m{:30}\033[0m".format( cmd),"{:8} {:8} ".format(self.x(),self.y()) , self.screen ,"MT_SLOT", self.MT_SLOT,"t:",round(t,2))
|
|
|
+ os.system(cmd)
|
|
|
+ self.btn_up = 0
|
|
|
+ self._btn_timer = time.time()
|
|
|
+ time.sleep(0.001)
|
|
|
+
|
|
|
+ def set_pointer(self):
|
|
|
+ cmd = "xdotool mousemove {:8} {:8} ".format(self.x(),self.y())
|
|
|
+
|
|
|
+ p = self.cur_pointer_id()
|
|
|
+ cmd = "xte -i {} 'mousemove {:8} {:8}' ".format(p,int(self.x()),int(self.y()))
|
|
|
+
|
|
|
+ t = int((time.time() - self._btn_timer)*10)/10.
|
|
|
+ #print(t,"\033[95m{}\033[0m".format( cmd),self.mode)
|
|
|
+
|
|
|
+ if self.MT_SLOT == 0:
|
|
|
+ os.system(cmd)
|
|
|
+ #os.system(cmd)
|
|
|
+ self.motion_changeX =0
|
|
|
+ self.motion_changeY =0
|
|
|
+ self.motion_change = 0
|
|
|
+ self.timer = time.time()
|
|
|
+ #time.sleep(0.000001)
|
|
|
+
|
|
|
+
|
|
|
+ def run(self):
|
|
|
+ #print "RUN"
|
|
|
+
|
|
|
+ if self.btn_up:
|
|
|
+ if time.time() - self._btn_timer > 0.05: # long press
|
|
|
+ self.set_pointer()
|
|
|
+ self.btn(0)
|
|
|
+ #self.btn(0)
|
|
|
+
|
|
|
+
|
|
|
+ if self.motion_change and self.timer+0.01 < time.time():
|
|
|
+ if self.btn_down:
|
|
|
+ #self.btn(0)
|
|
|
+ self.set_pointer()
|
|
|
+ self.btn(1)
|
|
|
+
|
|
|
+
|
|
|
+ if self.motion_change and self.timer+0.01 < time.time():
|
|
|
+ if time.time() - self._btn_timer > 0.05: # long press
|
|
|
+ self.set_pointer()
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+def main():
|
|
|
+ pipe = PIPE()
|
|
|
+ time.sleep(0.1)
|
|
|
+ filename = pipe.init()
|
|
|
+ time.sleep(0.2)
|
|
|
+ #start_xinput(filename)
|
|
|
+ start_evtest(filename)
|
|
|
+ time.sleep(0.2)
|
|
|
+ #time.sleep(2)
|
|
|
+
|
|
|
+ #read from evtest or xinput and redirekt std output into file(fifo pipe)
|
|
|
+ read(filename)
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+def get_touch_list():
|
|
|
+ cmd = 'echo "\n" | evtest 2>&1 | grep event'
|
|
|
+ print("cmd", [cmd])
|
|
|
+ r = os.popen(cmd)
|
|
|
+ lines = r.readlines()
|
|
|
+ out = []
|
|
|
+ for line in lines:
|
|
|
+ line = line.strip()
|
|
|
+ #line = line.replace("\t"," ")
|
|
|
+ line = line.split("\t")
|
|
|
+ if len(line) >= 2:
|
|
|
+ path = line[0][:-1]
|
|
|
+ name = line[1]
|
|
|
+ out.append([name,path])
|
|
|
+ return out
|
|
|
+
|
|
|
+def touch_filter(name,lines):
|
|
|
+ out = []
|
|
|
+ for line in lines:
|
|
|
+ if name == line[0]:
|
|
|
+ out = line
|
|
|
+ return out
|
|
|
+
|
|
|
+
|
|
|
+#touch_list = get_touch_list()
|
|
|
+
|
|
|
+#name="ELAN Touchscreen"
|
|
|
+#x= touch_filter(name,touch_list)
|
|
|
+#print(x)
|
|
|
+#
|
|
|
+#name = "iSolution multitouch"
|
|
|
+#x= touch_filter(name,touch_list)
|
|
|
+#print(x)
|
|
|
+
|
|
|
+
|
|
|
+def main_threading():
|
|
|
+
|
|
|
+ pipe = PIPE()
|
|
|
+ filename = pipe.init()
|
|
|
+ start_xinput(filename)
|
|
|
+ #start_evtest(filename)
|
|
|
+ #time.sleep(2)
|
|
|
+ read(filename)
|
|
|
+
|
|
|
+
|
|
|
+def main2(cmd="",output=""):
|
|
|
+ a = Action(output)
|
|
|
+ line = ""
|
|
|
+ #cmd="evtest /dev/input/event5"
|
|
|
+ #cmd="evtest /dev/input/event24"
|
|
|
+ r = os.popen(cmd)
|
|
|
+ print(cmd)
|
|
|
+ while 1:
|
|
|
+ line = r.readline()
|
|
|
+ a.action(line)
|
|
|
+
|
|
|
+if __name__ == "__main__":
|
|
|
+ #main()
|
|
|
+
|
|
|
+ touch_list = get_touch_list()
|
|
|
+
|
|
|
+ touchscreen_count = 0
|
|
|
+
|
|
|
+ #TOUCH 1
|
|
|
+ name = "iSolution multitouch"
|
|
|
+ x= touch_filter(name,touch_list)
|
|
|
+ print(x)
|
|
|
+
|
|
|
+ if len(x):
|
|
|
+ disable_xinput_touch(name)
|
|
|
+ #cmd="evtest /dev/input/event24"
|
|
|
+ cmd="evtest {}".format(x[1])
|
|
|
+ start_new_thread(main2,(cmd,"DP-2"))
|
|
|
+ touchscreen_count +=1
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ #TOUCH 1
|
|
|
+ name="ELAN Touchscreen"
|
|
|
+ x= touch_filter(name,touch_list)
|
|
|
+ print(x)
|
|
|
+ if len(x):
|
|
|
+ disable_xinput_touch(name)
|
|
|
+ #cmd="evtest /dev/input/event5"
|
|
|
+ cmd="evtest {}".format(x[1])
|
|
|
+ start_new_thread(main2,(cmd,"eDP-1"))
|
|
|
+ touchscreen_count +=1
|
|
|
+
|
|
|
+ #main2()
|
|
|
+ while 1:
|
|
|
+ time.sleep(1)
|