Показаны сообщения с ярлыком thinkpad. Показать все сообщения
Показаны сообщения с ярлыком thinkpad. Показать все сообщения

17 февраля 2013

ThinkPad управление музыкой с помощью HDAPS

Хорошая статья из Ынтернета как управлять плеером cups наклоняя ноутбук.
Ссылка на оригинал

Сначала установим HDAPS
sudo apt-get install tp-smapi-dkms hdapsd

Затем проверим
cat /sys/devices/platform/hdaps/position
(471,504)

И запустим следующий скрипт на Python
import time, subprocess

class Orientation(object):
    def __init__(self, readfreq=1):
        self.x_init, self.y_init = self.read()
        self.x_hist = []
        self.y_hist = []

        # read in some values to smooth movement
        self.collect()

        # cooldown makes sure only a single command
        # is executed in one movement
        self.cooldown = 0

    def read(self):
        f = open('/sys/bus/platform/devices/hdaps/position')
        s = f.read().strip()
        f.close()
        x, y = s.strip('()').split(',')

        return int(x), int(y)

    def collect(self, n=10):
        # change n for smoothing over longer period
        while len(self.x_hist) < n+1:
            coords = self.read()
            self.x_hist.append(coords[0])
            self.y_hist.append(coords[1])

    @property
    def x_avg(self):
        return sum(self.x_hist)/len(self.x_hist)

    @property
    def y_avg(self):
        return sum(self.y_hist)/len(self.y_hist)

    def tick(self, timeout=0.1):
        # timeout provides the period between "ticks", i.e.
        # the frequency of reads and checks on thresholds

        self.update() # read in and process new position

        # if not in cooldown period, check if thresholds are
        # triggerd, and possibly execute a command
        if not self.cooldown:
            self.execute()
        else: # reduce cooldown periode every tick
            self.cooldown = self.cooldown - 1

        time.sleep(timeout)

    def update(self):
        self.x, self.y = self.read()

        # position relative to the moving average position
        self.x_rel, self.y_rel = o.x - o.x_avg, o.y - o.y_avg

        # keep a stack of n observations by popping the first
        # and appending to the end
        self.x_hist.pop(0)
        self.x_hist.append(self.x)
        self.y_hist.pop(0)
        self.y_hist.append(self.y)

    def tresholds(self, x_min=-30, x_max=30, y_min=-30, y_max=30):
        # check if thresholds are triggerd, turns a tuple with
        # four True/False values

        triggered = (self.x_rel < x_min, self.x_rel > x_max,
                self.y_rel < y_min, self.y_rel > y_max)

        return triggered

    def execute(self):
        t = self.tresholds()
        if t == (True, False, False, False):
            print 'Detected a forward tilt'
            subprocess.call(['cmus-remote', '-v', '-10%'])
            self.cooldown = 10

        if t == (False, True, False, False):
            print 'Detected a backward tilt'
            subprocess.call(['cmus-remote', '-v', '+10%'])
            self.cooldown = 10

        if t == (False, False, True, False):
            print 'Detected a left tilt'
            subprocess.call(['cmus-remote', '-u'])
            self.cooldown = 10

        if t == (False, False, False, True):
            print 'Detected a right tilt'
            subprocess.call(['cmus-remote', '-n'])
            self.cooldown = 10

if __name__ == '__main__':
    o = Orientation()
    while True:
        #print o.x_rel, o.y_rel, o.cooldown
        o.tick()

Все теперь можно запускать cups и баловаться.

12 ноября 2012

x220 tablet и доп кнопки в Linux

В принципе мой Debian Wheezy определил почти все системные клавиши кроме 2х справа на картинке(Ctr+Alt+Del и поворот экрана), микрофон и zoom по Fn+пробел. Ctr+Alt+Del не нужен, микрофон и зум это повод написать отдельную тему, а про поворот экрана я напишу подробно.
Вначале определим код кнопки:
1 - запускаем команду xev и нажимаем кнопку если появляется код то гуд иначе п.2
2 - можно посмотреть код этой кнопки в файле /lib/udev/keymaps/lenovo-thinkpad_x200_tablet называется "rotate screen" код 0x6c, или можно погуглить например http://www.thinkwiki.org/wiki/Tablet_Hardware_Buttons или если не Ъ то запускаем tail -f | dmesg нажимаем кнопку и видим:
[ 3650.281439] atkbd serio0: Unknown key released (translated set 2, code 0x6c on isa0060/serio0).
[ 3650.281443] atkbd serio0: Use 'setkeycodes 6c ' to make it known.
Тут же нам подсказывают что надо задать keycode этой кнопке.
3 - ищем свободный код командой getkeycodes|grep <код>, например:
getkeycodes|grep 220
Если вывода не последовало то код свободен
4 - назначаем код кнопке, в файле /etc/rc.local пишем exec sudo setkeycodes 6c 220 &
5 - рестартимся или выполняем setkeycodes вручную, запускаем xev и нажимаем кнопку поворота, должны появится надписи

Дальше я привязал кнопку к действию при помощи xbindkeys(apt-get install xbindkeys)
1 - создаем ~/.xbindkeysrc
2 - вызываем xbindkeys -k
3 - нажимаем кнопку и копируем вывод
4 - записываем в xbindkeysrc:
"think-rotate"
m:0x10 + c:224
Выполняем xbindkeys и вуаля!

think-rotate это скрипт поворота экрана из директории /usr/bin/
Сам скрипт я скачал с github'a: https://github.com/martin-ueding/think-rotate

P.S.: Если вдруг у Вас не завелись другие кнопки то можно по аналогии привязать к ним скрипты от сюда:
1 - http://www.debian-fr.org/x220-install-configuration-t36152.html#p364748
2 - https://github.com/aconbere/thinkpad-x201-acpi-scripts

UPD: вот еще нашел хорошую инструкцию http://kubuntu.ru/book/export/html/3491
UPDUPD: Если комуто нужна кнопка посередине на экране то код 0x67
UPDUPDUPD: Кнопка может быть привязана через acpi поэтому неплохо бы еще вначале проверить acpi_listen и если гут, то все таки сделать через acpi

17 октября 2011

ThinkPad TrackPoint настройка в Linux

Вообще всю информацию по настройке trackpoint можно взять здесь: How to configure the TrackPoint

Но для ленивых ниже скрипт для автозагрузки:
#!/bin/sh
xinput list | sed -ne 's/^[^ ][^V].*id=\([0-9]*\).*/\1/p' | while read id
do
        case `xinput list-props $id` in
        *"Middle Button Emulation"*)
                xinput set-int-prop $id "Evdev Wheel Emulation" 8 1
                xinput set-int-prop $id "Evdev Wheel Emulation Button" 8 2
                xinput set-int-prop $id "Evdev Wheel Emulation Timeout" 8 200
                xinput set-int-prop $id "Evdev Wheel Emulation Axes" 8 6 7 4 5
                xinput set-int-prop $id "Evdev Middle Button Emulation" 8 1
                xinput set-int-prop $id "Evdev Middle Button Timeout" 8 50
                ;;
        esac
done

# disable middle button 
#xmodmap -e "pointer = 1 9 3 4 5 6 7 8 2"