Ural penguins - Сообщения с тегом ThinkPad
http://uralbash.ru/blog/tag/thinkpad/atom.xml
2013-02-17T17:04:00Z
ABlog
ThinkPad управление музыкой с помощью HDAPS
http://uralbash.ru/articles/2013/hdaps_music/
2013-02-17T17:04:00Z
2013-02-17T17:04:00Z
Uralbash
<div class="section" id="thinkpad-hdaps">
<div class="line-block">
<div class="line">Хорошая статья из Ынтернета как управлять плеером cups наклоняя ноутбук.</div>
<div class="line"><a class="reference external" href="http://www.mhermans.net/dhaps-controlled-thinkpad.html">Ссылка на оригинал</a></div>
</div>
<p>Сначала установим HDAPS:</p>
<div class="highlight-bash"><div class="highlight"><pre><span></span>$ sudo apt-get install tp-smapi-dkms hdapsd
</pre></div>
</div>
<p>Затем проверим:</p>
<div class="highlight-bash"><div class="highlight"><pre><span></span>$ cat /sys/devices/platform/hdaps/position
<span class="o">(</span><span class="m">471</span>,504<span class="o">)</span>
</pre></div>
</div>
<p>И запустим следующий скрипт на <a class="reference external" href="http://www.python.org/">Python</a>:</p>
<div class="highlight-python"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">time</span><span class="o">,</span> <span class="nn">subprocess</span>
<span class="k">class</span> <span class="nc">Orientation</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">readfreq</span><span class="o">=</span><span class="mi">1</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">x_init</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">y_init</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">x_hist</span> <span class="o">=</span> <span class="p">[]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">y_hist</span> <span class="o">=</span> <span class="p">[]</span>
<span class="c1"># read in some values to smooth movement</span>
<span class="bp">self</span><span class="o">.</span><span class="n">collect</span><span class="p">()</span>
<span class="c1"># cooldown makes sure only a single command</span>
<span class="c1"># is executed in one movement</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cooldown</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">def</span> <span class="nf">read</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">f</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="s1">'/sys/bus/platform/devices/hdaps/position'</span><span class="p">)</span>
<span class="n">s</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">read</span><span class="p">()</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
<span class="n">f</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="n">x</span><span class="p">,</span> <span class="n">y</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="n">strip</span><span class="p">(</span><span class="s1">'()'</span><span class="p">)</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">','</span><span class="p">)</span>
<span class="k">return</span> <span class="nb">int</span><span class="p">(</span><span class="n">x</span><span class="p">),</span> <span class="nb">int</span><span class="p">(</span><span class="n">y</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">collect</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">n</span><span class="o">=</span><span class="mi">10</span><span class="p">):</span>
<span class="c1"># change n for smoothing over longer period</span>
<span class="k">while</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x_hist</span><span class="p">)</span> <span class="o"><</span> <span class="n">n</span><span class="o">+</span><span class="mi">1</span><span class="p">:</span>
<span class="n">coords</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">x_hist</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">coords</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
<span class="bp">self</span><span class="o">.</span><span class="n">y_hist</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">coords</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">x_avg</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">sum</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x_hist</span><span class="p">)</span><span class="o">/</span><span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x_hist</span><span class="p">)</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">y_avg</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">sum</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">y_hist</span><span class="p">)</span><span class="o">/</span><span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">y_hist</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">tick</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="mf">0.1</span><span class="p">):</span>
<span class="c1"># timeout provides the period between "ticks", i.e.</span>
<span class="c1"># the frequency of reads and checks on thresholds</span>
<span class="bp">self</span><span class="o">.</span><span class="n">update</span><span class="p">()</span> <span class="c1"># read in and process new position</span>
<span class="c1"># if not in cooldown period, check if thresholds are</span>
<span class="c1"># triggerd, and possibly execute a command</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">cooldown</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">()</span>
<span class="k">else</span><span class="p">:</span> <span class="c1"># reduce cooldown periode every tick</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cooldown</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">cooldown</span> <span class="o">-</span> <span class="mi">1</span>
<span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="n">timeout</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">update</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">x</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">y</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
<span class="c1"># position relative to the moving average position</span>
<span class="bp">self</span><span class="o">.</span><span class="n">x_rel</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">y_rel</span> <span class="o">=</span> <span class="n">o</span><span class="o">.</span><span class="n">x</span> <span class="o">-</span> <span class="n">o</span><span class="o">.</span><span class="n">x_avg</span><span class="p">,</span> <span class="n">o</span><span class="o">.</span><span class="n">y</span> <span class="o">-</span> <span class="n">o</span><span class="o">.</span><span class="n">y_avg</span>
<span class="c1"># keep a stack of n observations by popping the first</span>
<span class="c1"># and appending to the end</span>
<span class="bp">self</span><span class="o">.</span><span class="n">x_hist</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">x_hist</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">y_hist</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">y_hist</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">y</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">tresholds</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x_min</span><span class="o">=-</span><span class="mi">30</span><span class="p">,</span> <span class="n">x_max</span><span class="o">=</span><span class="mi">30</span><span class="p">,</span> <span class="n">y_min</span><span class="o">=-</span><span class="mi">30</span><span class="p">,</span> <span class="n">y_max</span><span class="o">=</span><span class="mi">30</span><span class="p">):</span>
<span class="c1"># check if thresholds are triggerd, turns a tuple with</span>
<span class="c1"># four True/False values</span>
<span class="n">triggered</span> <span class="o">=</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x_rel</span> <span class="o"><</span> <span class="n">x_min</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">x_rel</span> <span class="o">></span> <span class="n">x_max</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">y_rel</span> <span class="o"><</span> <span class="n">y_min</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">y_rel</span> <span class="o">></span> <span class="n">y_max</span><span class="p">)</span>
<span class="k">return</span> <span class="n">triggered</span>
<span class="k">def</span> <span class="nf">execute</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">t</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">tresholds</span><span class="p">()</span>
<span class="k">if</span> <span class="n">t</span> <span class="o">==</span> <span class="p">(</span><span class="bp">True</span><span class="p">,</span> <span class="bp">False</span><span class="p">,</span> <span class="bp">False</span><span class="p">,</span> <span class="bp">False</span><span class="p">):</span>
<span class="k">print</span> <span class="s1">'Detected a forward tilt'</span>
<span class="n">subprocess</span><span class="o">.</span><span class="n">call</span><span class="p">([</span><span class="s1">'cmus-remote'</span><span class="p">,</span> <span class="s1">'-v'</span><span class="p">,</span> <span class="s1">'-10%'</span><span class="p">])</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cooldown</span> <span class="o">=</span> <span class="mi">10</span>
<span class="k">if</span> <span class="n">t</span> <span class="o">==</span> <span class="p">(</span><span class="bp">False</span><span class="p">,</span> <span class="bp">True</span><span class="p">,</span> <span class="bp">False</span><span class="p">,</span> <span class="bp">False</span><span class="p">):</span>
<span class="k">print</span> <span class="s1">'Detected a backward tilt'</span>
<span class="n">subprocess</span><span class="o">.</span><span class="n">call</span><span class="p">([</span><span class="s1">'cmus-remote'</span><span class="p">,</span> <span class="s1">'-v'</span><span class="p">,</span> <span class="s1">'+10%'</span><span class="p">])</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cooldown</span> <span class="o">=</span> <span class="mi">10</span>
<span class="k">if</span> <span class="n">t</span> <span class="o">==</span> <span class="p">(</span><span class="bp">False</span><span class="p">,</span> <span class="bp">False</span><span class="p">,</span> <span class="bp">True</span><span class="p">,</span> <span class="bp">False</span><span class="p">):</span>
<span class="k">print</span> <span class="s1">'Detected a left tilt'</span>
<span class="n">subprocess</span><span class="o">.</span><span class="n">call</span><span class="p">([</span><span class="s1">'cmus-remote'</span><span class="p">,</span> <span class="s1">'-u'</span><span class="p">])</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cooldown</span> <span class="o">=</span> <span class="mi">10</span>
<span class="k">if</span> <span class="n">t</span> <span class="o">==</span> <span class="p">(</span><span class="bp">False</span><span class="p">,</span> <span class="bp">False</span><span class="p">,</span> <span class="bp">False</span><span class="p">,</span> <span class="bp">True</span><span class="p">):</span>
<span class="k">print</span> <span class="s1">'Detected a right tilt'</span>
<span class="n">subprocess</span><span class="o">.</span><span class="n">call</span><span class="p">([</span><span class="s1">'cmus-remote'</span><span class="p">,</span> <span class="s1">'-n'</span><span class="p">])</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cooldown</span> <span class="o">=</span> <span class="mi">10</span>
<span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s1">'__main__'</span><span class="p">:</span>
<span class="n">o</span> <span class="o">=</span> <span class="n">Orientation</span><span class="p">()</span>
<span class="k">while</span> <span class="bp">True</span><span class="p">:</span>
<span class="c1">#print o.x_rel, o.y_rel, o.cooldown</span>
<span class="n">o</span><span class="o">.</span><span class="n">tick</span><span class="p">()</span>
</pre></div>
</div>
<p>Все теперь можно запускать <code class="docutils literal"><span class="pre">cups</span></code> и баловаться.</p>
</div>
x220 tablet и доп кнопки в Linux
http://uralbash.ru/articles/2012/x220t_buttons/
2012-11-12T00:23:00Z
2012-11-12T00:23:00Z
Uralbash
<div class="section" id="x220-tablet-linux">
<img alt="_static/2012/x220t.jpg" class="align-left" src="_static/2012/x220t.jpg" />
<p>В принципе мой <a class="reference external" href="https://www.debian.org/">Debian</a> Wheezy определил почти все системные клавиши кроме 2х
справа на картинке (<code class="docutils literal"><span class="pre">Ctr+Alt+Del</span></code> и <code class="docutils literal"><span class="pre">поворот</span> <span class="pre">экрана</span></code>), микрофон и zoom по
<code class="docutils literal"><span class="pre">Fn+пробел</span></code>. <code class="docutils literal"><span class="pre">Ctr+Alt+Del</span></code> не нужен, микрофон и зум это повод написать
отдельную тему, а про поворот экрана я напишу подробно.</p>
<br clear="both"/><p>Вначале определим код кнопки:</p>
<div class="line-block">
<div class="line">1 - запускаем команду <code class="docutils literal"><span class="pre">xev</span></code> и нажимаем кнопку если появляется код то гуд иначе <code class="docutils literal"><span class="pre">п.2</span></code></div>
<div class="line">2 - можно посмотреть код этой кнопки в файле <code class="docutils literal"><span class="pre">/lib/udev/keymaps/lenovo-thinkpad_x200_tablet</span></code> называется <code class="docutils literal"><span class="pre">"rotate</span> <span class="pre">screen"</span></code> код <code class="docutils literal"><span class="pre">0x6c</span></code>, или можно погуглить например <a class="reference external" href="http://www.thinkwiki.org/wiki/Tablet_Hardware_Buttons">http://www.thinkwiki.org/wiki/Tablet_Hardware_Buttons</a> или если не Ъ то запускаем <code class="docutils literal"><span class="pre">tail</span> <span class="pre">-f</span> <span class="pre">|</span> <span class="pre">dmesg</span></code> нажимаем кнопку и видим:</div>
</div>
<br/><div class="highlight-bash"><div class="highlight"><pre><span></span><span class="o">[</span> <span class="m">3650</span>.281439<span class="o">]</span> atkbd serio0: Unknown key released <span class="o">(</span>translated <span class="nb">set</span> <span class="m">2</span>, code 0x6c on isa0060/serio0<span class="o">)</span>.
<span class="o">[</span> <span class="m">3650</span>.281443<span class="o">]</span> atkbd serio0: Use <span class="s1">'setkeycodes 6c <keycode>'</span> to make it known.
</pre></div>
</div>
<p>Тут же нам подсказывают что надо задать <code class="docutils literal"><span class="pre">keycode</span></code> этой кнопке.</p>
<p>3 - ищем свободный код командой <code class="docutils literal"><span class="pre">getkeycodes|grep</span> <span class="pre"><код></span></code>, например: <code class="docutils literal"><span class="pre">getkeycodes|grep</span> <span class="pre">220</span></code></p>
<p>Если вывода не последовало то код свободен</p>
<div class="line-block">
<div class="line">4 - назначаем код кнопке, в файле <code class="docutils literal"><span class="pre">/etc/rc.local</span></code> пишем <code class="docutils literal"><span class="pre">exec</span> <span class="pre">sudo</span> <span class="pre">setkeycodes</span> <span class="pre">6c</span> <span class="pre">220</span> <span class="pre">&</span></code></div>
<div class="line">5 - рестартимся или выполняем <code class="docutils literal"><span class="pre">setkeycodes</span></code> вручную, запускаем <code class="docutils literal"><span class="pre">xev</span></code> и нажимаем кнопку поворота, должны появится надписи</div>
</div>
<p>Дальше я привязал кнопку к действию при помощи <code class="docutils literal"><span class="pre">xbindkeys</span></code> (<code class="docutils literal"><span class="pre">apt-get</span> <span class="pre">install</span>
<span class="pre">xbindkeys</span></code>):</p>
<div class="line-block">
<div class="line">1 - создаем <code class="docutils literal"><span class="pre">~/.xbindkeysrc</span></code></div>
<div class="line">2 - вызываем <code class="docutils literal"><span class="pre">xbindkeys</span> <span class="pre">-k</span></code></div>
<div class="line">3 - нажимаем кнопку и копируем вывод</div>
<div class="line">4 - записываем в <code class="docutils literal"><span class="pre">xbindkeysrc</span></code>:</div>
</div>
<br/><div class="highlight-bash"><div class="highlight"><pre><span></span><span class="s2">"think-rotate"</span>
m:0x10 + c:224
</pre></div>
</div>
<p>Выполняем <code class="docutils literal"><span class="pre">xbindkeys</span></code> и вуаля!</p>
<div class="line-block">
<div class="line"><code class="docutils literal"><span class="pre">think-rotate</span></code> это скрипт поворота экрана из директории <code class="docutils literal"><span class="pre">/usr/bin/</span></code>.</div>
<div class="line">Сам скрипт я скачал с github’a: <a class="reference external" href="https://github.com/martin-ueding/think-rotate">https://github.com/martin-ueding/think-rotate</a></div>
</div>
<br/><div class="line-block">
<div class="line">P.S.: Если вдруг у Вас не завелись другие кнопки то можно по аналогии привязать к ним скрипты от сюда:</div>
<div class="line">1 - <a class="reference external" href="http://www.debian-fr.org/x220-install-configuration-t36152.html#p364748">http://www.debian-fr.org/x220-install-configuration-t36152.html#p364748</a></div>
<div class="line">2 - <a class="reference external" href="https://github.com/aconbere/thinkpad-x201-acpi-scripts">https://github.com/aconbere/thinkpad-x201-acpi-scripts</a></div>
</div>
<br/><div class="line-block">
<div class="line">UPD: вот еще нашел хорошую инструкцию <a class="reference external" href="http://kubuntu.ru/book/export/html/3491">http://kubuntu.ru/book/export/html/3491</a></div>
<div class="line">UPDUPD: Если кому то нужна кнопка посередине на экране то код <code class="docutils literal"><span class="pre">0x67</span></code></div>
<div class="line">UPDUPDUPD: Кнопка может быть привязана через <code class="docutils literal"><span class="pre">acpi</span></code> поэтому неплохо бы еще вначале проверить <code class="docutils literal"><span class="pre">acpi_listen</span></code> и если гут, то все таки сделать через <code class="docutils literal"><span class="pre">acpi</span></code>.</div>
</div>
</div>
ThinkPad TrackPoint настройка в Linux
http://uralbash.ru/articles/2011/thinkpad_trackpoint/
2011-10-17T23:22:00Z
2011-10-17T23:22:00Z
Uralbash
<div class="section" id="thinkpad-trackpoint-linux">
<p>Вообще всю информацию по настройке <a class="reference external" href="https://ru.wikipedia.org/wiki/Тензометрический_джойстик">trackpoint</a> можно взять здесь: <a class="reference external" href="http://www.thinkwiki.org/wiki/How_to_configure_the_TrackPoint">How to
configure the TrackPoint</a></p>
<p>Но для ленивых ниже скрипт для автозагрузки:</p>
<div class="highlight-bash"><div class="highlight"><pre><span></span><span class="ch">#!/bin/sh</span>
xinput list <span class="p">|</span> sed -ne <span class="s1">'s/^[^ ][^V].*id=\([0-9]*\).*/\1/p'</span> <span class="p">|</span> <span class="k">while</span> <span class="nb">read</span> id
<span class="k">do</span>
<span class="k">case</span> <span class="sb">`</span>xinput list-props <span class="nv">$id</span><span class="sb">`</span> in
*<span class="s2">"Middle Button Emulation"</span>*<span class="o">)</span>
xinput set-int-prop <span class="nv">$id</span> <span class="s2">"Evdev Wheel Emulation"</span> <span class="m">8</span> <span class="m">1</span>
xinput set-int-prop <span class="nv">$id</span> <span class="s2">"Evdev Wheel Emulation Button"</span> <span class="m">8</span> <span class="m">2</span>
xinput set-int-prop <span class="nv">$id</span> <span class="s2">"Evdev Wheel Emulation Timeout"</span> <span class="m">8</span> <span class="m">200</span>
xinput set-int-prop <span class="nv">$id</span> <span class="s2">"Evdev Wheel Emulation Axes"</span> <span class="m">8</span> <span class="m">6</span> <span class="m">7</span> <span class="m">4</span> <span class="m">5</span>
xinput set-int-prop <span class="nv">$id</span> <span class="s2">"Evdev Middle Button Emulation"</span> <span class="m">8</span> <span class="m">1</span>
xinput set-int-prop <span class="nv">$id</span> <span class="s2">"Evdev Middle Button Timeout"</span> <span class="m">8</span> <span class="m">50</span>
<span class="p">;;</span>
<span class="k">esac</span>
<span class="k">done</span>
<span class="c1"># disable middle button</span>
<span class="c1">#xmodmap -e "pointer = 1 9 3 4 5 6 7 8 2"</span>
</pre></div>
</div>
</div>