surface3-scripts/autorotate/autorotate.py

132 lines
5.6 KiB
Python
Executable File

#!/usr/bin/env python2
import time
import os
import subprocess
import sys
from gi.repository import Notify
#FUNCTIONS
def readFile(path): #self.filename
myDatei = open(path, "r")
myList = []
#Liste aus Datei erstellen
for Line in myDatei:
Line = Line.rstrip()
#Line = Line.decode('utf8')
myList.append(Line)
myDatei.close()
return(myList)
def writeFile(path, myList): #self.filename
myDatei = open(path, "w")
#Liste aus Datei erstelle
myDatei.writelines(myList)
myDatei.close()
def refreshtouch():
os.system('xinput disable "NTRG0001:01 1B96:1B05"')
os.system('xinput enable "NTRG0001:01 1B96:1B05"')
#PARAMETERS
count = 0
path = os.path.abspath(os.path.dirname(os.path.abspath(__file__)))
devicename = "'NTRG0001:01 1B96:1B05'"
penname = "'NTRG0001:01 1B96:1B05 Pen'"
freq = 5.0
# Look for accelerometer
while count <= 9:
if os.path.exists('/sys/bus/iio/devices/iio:device' + str(count) + '/in_accel_scale') == True:
dpath = '/sys/bus/iio/devices/iio:device' + str(count) + '/' # directory of accelerometer device (iio)
break
count = count + 1
#print(dpath)
#Commands for correct rotation
normal = 'xrandr -o normal; '+'xinput set-prop ' + devicename +" 'Coordinate Transformation Matrix' 1 0 0 0 1 0 0 0 1;"+'xinput set-prop ' + penname +" 'Coordinate Transformation Matrix' 1 0 0 0 1 0 0 0 1;"
inverted = 'xrandr -o inverted; '+'xinput set-prop ' + devicename +" 'Coordinate Transformation Matrix' -1 0 1 0 -1 1 0 0 1;"+'xinput set-prop ' + penname +" 'Coordinate Transformation Matrix' -1 0 1 0 -1 1 0 0 1;"
right = 'xrandr -o left; '+'xinput set-prop ' + devicename +" 'Coordinate Transformation Matrix' 0 -1 1 1 0 0 0 0 1;"+'xinput set-prop ' + penname +" 'Coordinate Transformation Matrix' 0 -1 1 1 0 0 0 0 1;"
left = 'xrandr -o right; '+'xinput set-prop ' + devicename +" 'Coordinate Transformation Matrix' 0 1 0 -1 0 1 0 0 1;"+'xinput set-prop ' + penname +" 'Coordinate Transformation Matrix' 0 1 0 -1 0 1 0 0 1;"
state_dict = {0: "normal", 1: "inverted", 2: "right", 3: "left"}
current_state = 0
previous_tstate = "on"
previousStylusProximityStatus = "out"
#ACCELEROMETER
with open(dpath + 'in_accel_scale') as f:
scale = float(f.readline())
while True:
time.sleep(1.0/freq)
previous_state = current_state
status = readFile(os.path.join(path, 'status.txt'))
if str(status[0]) == "on":
with open(dpath + 'in_accel_x_raw', 'r') as fx:
with open(dpath + 'in_accel_y_raw', 'r') as fy:
with open(dpath + 'in_accel_z_raw', 'r') as fz:
thex = float(fx.readline())
they = float(fy.readline())
thez = float(fz.readline())
if (thex >= 65000 or thex <=650):
if (they <= 65000 and they >= 64000):
os.system(normal)
current_state = 0
if (they >= 650 and they <= 1100):
os.system(inverted)
current_state = 1
if (thex <= 64999 and thex >= 650):
if (thex >= 800 and thex <= 1000):
os.system(right)
current_state = 2
if (thex >= 64500 and thex <=64700):
os.system(left)
current_state = 3
os.system('clear')
print("A-ROT: " + status[0])
print(" x: " + str(thex))
print(" y: " + str(they))
print(" z: " + str(thez))
print(" POS: " + state_dict[current_state])
if status[0] == "off":
os.system('clear')
print("A-ROT: " + status[0])
print(" x: " + status[0])
print(" y: " + status[0])
print(" z: " + status[0])
print(" POS: " + state_dict[previous_state])
if current_state != previous_state:
refreshtouch()
print "Touchscreen refreshed"
print("##########################")
#SCREEN
stylusProximityCommand = 'xinput query-state "NTRG0001:01 1B96:1B05 Pen" | grep Proximity | cut -d " " -f3 | cut -d "=" -f2'
stylusProximityStatus = str(subprocess.check_output(stylusProximityCommand, shell=True).lower().rstrip())
tstatus = readFile(os.path.join(path, 'touch.txt'))
#TOUCHSCREEN
if str(tstatus[0]) == "on" and stylusProximityStatus == "out":
os.system('xinput enable ' + devicename + '')
print("TOUCH: " + tstatus[0])
if str(tstatus[0]) != previous_tstate:
Notify.init ("Touchscreen-ON")
RotationON=Notify.Notification.new ("Touchscreen","Touchscreen is now turned ON","dialog-information")
RotationON.show()
elif str(tstatus[0]) == "off" and stylusProximityStatus == "out":
os.system('xinput disable ' + devicename + '')
print("TOUCH: " + tstatus[0])
if str(tstatus[0]) != previous_tstate:
Notify.init ("Touchscreen-OFF")
RotationOFF=Notify.Notification.new ("Touchscreen","Touchscreen is now turned OFF","dialog-information")
RotationOFF.show()
previous_tstate = str(tstatus[0])
#PEN
if str(tstatus[0]) == "off" and stylusProximityStatus == "in":
print("TOUCH: " + tstatus[0])
print(" PEN: " + stylusProximityStatus)
elif str(tstatus[0]) == "on" and stylusProximityStatus == "in":
os.system('xinput disable "NTRG0001:01 1B96:1B05"')
print("TOUCH: " + "off")
print(" PEN: " + stylusProximityStatus)
elif stylusProximityStatus == "out":
print(" PEN: " + stylusProximityStatus)