Pberndt V4
Direkt zum Inhalt springen
Quellcode hdaps.py
Sourcecode
"""
vim:fileencoding=iso-8859-1:ft=python
Yet another HDAPS class
Copyright (c) Phillip Berndt, 2006
Call this file for some examples.
"""
import time
class HDAPS:
"""
A basic class for HDAPS access
"""
__calibration = ()
HIT_RIGHT = -1
HIT_LEFT = 1
def __init__(self):
self.calibrate()
def __valueGet(self, file):
"""
Load a rotation tuple from HDAPS
"""
try:
valueTuple = open("/sys/bus/platform/devices/hdaps/%s" % file, "r").read()[1:-2]
return map(lambda x: int(x), valueTuple.split(","))
except:
raise "HDAPS module not loaded or HDAPS not working"
def calibrate(self):
"""
Calibrate the object using the HDAPS calibration
"""
self.__calibration = self.__valueGet("calibrate")
def getAbsolute(self):
"""
Get absolute position
"""
return self.__valueGet("position")
def getRelative(self, round = 1):
"""
Get relative position
The parameter round is for rounding values
(p.e. round = 5 means every value x returned will be
x mod 5 = 0)
"""
position = [0, 0]
while max(position) is 0:
position = self.getAbsolute()
relative = [ int(float(self.__calibration[n] - position[n]) / round) * round for n in (0, 1) ]
return relative
def getShock(self, sens = 8):
"""
Wait until a shock in the X-values is noticed
(e.g. someone hit the notebook from the side)
Sens means sensitivity. Higher values means less
false-positives and more true-negatives.
This function will ignore anything if the laptop
if moved too much
"""
lastValues = []
while len(lastValues) < 16:
time.sleep(0.005)
lastValues.append(self.getRelative(5)[0])
while 1:
time.sleep(0.005)
lastValues.append(self.getRelative(5)[0])
if len(lastValues) > 16:
lastValues.pop(0)
if max(lastValues[8:]) > sens and min(lastValues[8:]) < -sens:
if (sum(map(lambda x: abs(x), lastValues[:8])) / 8) > 10:
continue
for value in lastValues[8:]:
if value is not 0:
return value / abs(value)
class Smack:
"""
A smack class (for smackbook-like applications)
Override this one ;)
"""
myHDAPS = None
def __init__(self):
self.myHDAPS = HDAPS()
def loop(self):
"""
Loop and wait for shocks
"""
while 1:
shock = self.myHDAPS.getShock()
if shock is self.myHDAPS.HIT_RIGHT:
self.hit_right()
elif shock is self.myHDAPS.HIT_LEFT:
self.hit_left()
def hit_right(self):
"""
This function is called when the laptop
is hit on the right side
"""
print "TODO: Implement hit_right()"
def hit_left(self):
"""
This function is called when the laptop
is hit on the left side
"""
print "TODO: Implement hit_left()"
def test():
"""
Test HDAPS. Shows every change in the
HDAPS values
"""
myHDAPS = HDAPS()
last = 0
start = time.clock()
while 1:
new = myHDAPS.getRelative(4)[0]
if new == last:
continue
last = new
print "[%f] %d" % (time.clock() - start, last)
time.sleep(0.01)
if __name__ == "__main__":
import os, math, sys
class Smack_ChangeDesktop(Smack):
"""
A demo for the smack-class
(My laptop has special keys, F19 and F20, for desktop change)
"""
def hit_right(self):
pipe = os.popen("xmacroplay :0 &>/dev/null", "w")
pipe.write("KeyStr F19")
pipe.close()
def hit_left(self):
pipe = os.popen("xmacroplay :0 &>/dev/null", "w")
pipe.write("KeyStr F20")
pipe.close()
class Smack_Lock(Smack):
"""
Another demo: Lock screen and unlock after 2 smacks left and
1 smack right
"""
time = 0
stage = 0
xlock = 0
def __init__(self):
self.xlock = os.spawnvp(os.P_NOWAIT, "xlock", [ "xlock", "-mode", "blank" ])
Smack.__init__(self)
def hit_left(self):
if time.clock() - self.time > 2:
self.time = time.clock()
self.stage = 0
if self.stage is 0:
self.stage = 1
elif self.stage is 1:
self.stage = 2
elif self.stage is 2:
pass
else:
self.stage = 0
def hit_right(self):
if time.clock() - self.time > 2:
self.time = time.clock()
self.stage = 0
if self.stage is 2:
print "Magic hit-sequence..."
os.kill(self.xlock, 2) # Int
time.sleep(1)
os.kill(self.xlock, 9) # Kill
sys.exit(0)
self.stage = 0
class Smack_ChangeVT(Smack):
"""
A third demo for the smack-class
Change VT
"""
vt = 1
def hit_right(self):
self.vt -= 1
os.system("chvt %d" % self.vt)
def hit_left(self):
self.vt += 1
os.system("chvt %d" % self.vt)
print "Smackbook demo"
print "A demonstration for this python interface"
print
print "Demo 1: Start xlock and kill it upon 2x smack left followed by 1x smack right (requires xlock)"
print "Demo 2: Call xmacroplay upon smacks to send F19 and F20 (Change desktop, needs to be configured in your WM!)"
print "Demo 3: chvt on smack (Requires root permissions on most systems)"
print "Demo 4: Print events"
print
print "Please enter your choice: ",
cmd = 0
while cmd not in range(1, 5):
cmd = input()
if cmd is 1:
mySmack = Smack_Lock()
elif cmd is 2:
mySmack = Smack_ChangeDesktop()
elif cmd is 3:
mySmack = Smack_ChangeVT()
elif cmd is 4:
mySmack = Smack()
mySmack.loop()
Download
- Dateiname
- hdaps.py
- Größe
- 5.07kb
- Copyright (c) Phillip Berndt, 2006-2013
- Letztes Update 30.10.2013