В линукс показания с этого датчика можно считать из файла /sys/devices/platform/hdaps/position
Можно создать виртуальный джойстик и, например, катать им шарики в neverball, крутить google earth и т.п. :)
Всё это описано тут
Я тоже решил развлечься и написал небольшую программу, которая заставляет cairo-clock сползать по экрану в зависимости от наклона ноутбука.
Для поиска и управления окном я использовал wnck и pygtk. Чтобы сгладить движение я взял физический движок pyode(биндинг к Open Dynamics Engine).
Вот как это выглядит:
www.youtube.com/v/l_Ts2BESraI&hl=en — снято фотиком для наглядности
www.youtube.com/v/5oBpODqookY&hl=en_US&rel=0 — видео с экрана
Ещё небольшой скриптик, который поворачивает экран если его сильно наклонить.(тот что есть на сайте ibm — не рабочий)
Можно создать виртуальный джойстик и, например, катать им шарики в neverball, крутить google earth и т.п. :)
Всё это описано тут
Я тоже решил развлечься и написал небольшую программу, которая заставляет cairo-clock сползать по экрану в зависимости от наклона ноутбука.
Для поиска и управления окном я использовал wnck и pygtk. Чтобы сгладить движение я взял физический движок pyode(биндинг к Open Dynamics Engine).
#!/usr/bin/python
# coding: utf-8
import gobject
from os import system
import gtk,wnck
import ode
STALE = (501,487) #значения в hdaps/position в нормальном положении
def hdaps():
pos = list(eval(open('/sys/devices/platform/hdaps/position').read()))
pos[0]+=STALE[0]
pos[1]+=STALE[1]
if abs(pos[0])<4: pos[0]=0
if abs(pos[1])<4: pos[1]=0
if not any(pos): return 0
return pos
def find_clock(scr,body,world):
""" пытаемся найти окно cairo-clock, если не находим-запускаем его
и пытаемся найти снова """
clk = None
for w in scr.get_windows():
if w.get_application().get_name()=='cairo-clock':
print clk
clk = w
break
if not clk:
system('cairo-clock &')
gobject.timeout_add(500,find_clock,scr,body,world)
else:
print clk
clk=gtk.gdk.window_foreign_new(clk.get_xid())
gscr=clk.get_screen()
body.setPosition((list(clk.get_root_origin())+[1]))
# мы нашли окно и запускаем таймер который будет им управлять
gobject.timeout_add(20,play,clk,body,world,gscr.get_width(),gscr.get_height())
def play(clk,body,world,sw,sh):
gval = hdaps()
if gval:
body.addForce( (gval+[0]))
world.step(0.04)
fx,fy,fz = body.getLinearVel()
body.addForce( (-fx/2,-fy/2,0)) #потихоньку притормаживаем движение
# при выходе за края экрана-выскакиваем с противоположного края
bx,by,bz = body.getPosition()
x,y = clk.get_position()
w,h = clk.get_size()
if x<-(w/2): bx=sw-(w/2)
elif x>sw-(w/2): bx=-(w/2)
if y<-(h/2): by=sh-(h/2)
elif y>sh-(h/2): by=-(h/2)
body.setPosition((bx,by,bz))
clk.move(int(bx),int(by))
return True
def main():
try:
scr=wnck.screen_get_default()
scr.get_windows()
world = ode.World()
world.setGravity( (0,0,0) )
body = ode.Body(world)
M = ode.Mass()
M.setSphere(2500.0, 0.05)
M.setBox(1000,250,250,1)
M.mass = 0.5
body.setMass(M)
gobject.timeout_add(200,find_clock,scr,body,world)
gtk.main()
except Exception,e:
print(e)
if __name__ == "__main__":
main()
Вот как это выглядит:
www.youtube.com/v/l_Ts2BESraI&hl=en — снято фотиком для наглядности
www.youtube.com/v/5oBpODqookY&hl=en_US&rel=0 — видео с экрана
Ещё небольшой скриптик, который поворачивает экран если его сильно наклонить.(тот что есть на сайте ibm — не рабочий)
#!/usr/bin/env python
# coding: utf-8
import os,sys
from time import sleep
ROTATE_ON = 100
STALE_VALUE = 500 # первое значение в hdaps/position в нормальном положении
def rotate(where):
return os.system('xrandr --output LVDS --rotate %s' % where)
def readx():
return int(open('/sys/devices/platform/hdaps/position').read().split(',')[0].lstrip('(')) + STALE_VALUE
if __name__ == '__main__':
while True:
sleep(0.1)
x = readx()
if x<-ROTATE_ON: rotate('right')
elif x>ROTATE_ON: rotate('left')
else: rotate('normal')
