art_ Napisano Styczeń 12, 2010 Zgłoszenie Share Napisano Styczeń 12, 2010 Pytanko: czy ktos moze zintegrowal iple w swoim htpc (moj frontend to mythtv). Ja glownie uzywam pilota do obslugi, takze szukam dobrego rozwiazania bez myszy. Jezeli ktos mial jakies doswiadczenia w tej kwesti to bardzo bym prosil o uwagi/pomysly itd. zwiazane z tematem. Dzieki art Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
art_ Napisano Styczeń 17, 2010 Autor Zgłoszenie Share Napisano Styczeń 17, 2010 Widzę, że nie ma zainteresowanych czy może pomysłów … ale jeżeli jednak ktoś będzie miał podobny problem to moje rozwiązanie jest następujące: Jak wyżej pisałem cel tej zabawy był taki (trochę więcej szczegółów): 1.odpalić iplę z mythtv frontend – tu ipla powinna się połączyć ze swoim serwerem i od razu przejść do trybu pełnoekranowego 2.być w stanie operować ją z pilota – tu przyciski pilota góra/dół/prawo/lewo powinny działać jako myszka i enter jako lewy klik myszy. Inne przyciski na pilocie powinny działać jako przyciski ipli: do przodu/ do tyłu/nowe/cenione/popularne/po kolei itd. 3.nie powinny te powyższe akcje kolidować z mythtv i innymi programami Eksperymentowałem trochę z irxevent, ale tu był problem bo irxevent nie rozpoznaje ipli, okazało się że aktywne okno ipli to jest „child window” i nie ma tytułu także pewnie dlatego irxevent nie mógł sobie poradzić. Rozwiązanie: Napisać skrypt, który będzie działał podobnie jak irxevent, wysyłał kliknięcia myszki do określonych punktów na ipli i będzie w stanie przesuwać kursor myszki; oczywiście musi też rozpoznać iplę/mythtv i wysłać odpowiednie polecenia do danego aktywnego programu. Szczegóły: Skrypt jest w perl (wybór osobisty), z modułem „X11::GUITest”, „IO::Socket”. Można je zainstalować z CPAN. Potrzebny też jest program „wmiface” (perl ma problemy z niektórymi operacjami na oknie ipli). Skrypt będzie siedział w pamięci i czekał na polecenia dostarczane poprzez TCP przez lirc/irexec/skrypt „iplaclient”. Skrypt „iplaclient”, prosty bash skrypt, który prześle nazwy przycisków do skryptu „iplaserver.pl”: #!/bin/bash echo $1 > /dev/tcp/localhost/9000 Skrypt „iplaserver.pl”, wszystkie przyciski do ipli są zdefiniowane w „%iplaButtons” razem z punktami, które trzeba kliknąć, punkty są oparte na trybie pełnoekranowym w rozdzielczości 1920 x 1080, niektóre nazwy przycisków odnoszą się do nazw przycisków na moim pilocie (skip- = "do tyłu", skip+ = "do przodu", ...); w „%common” są zdefiniowane przyciski, które trzeba przechwycić inaczej lirc wyśle je do mythtv nawet jak ipla jest na górze: #!/usr/bin/perl use IO::Socket; use X11::GUITest qw/:ALL :CONST/; use Switch; my $handle = 0; my $mouseMoveBy = 15; my $menuarea = 202; # area 0,0,202, screen height # define common buttons for mythtv & other progs # see X11::GUITest README for more definitions my %common = ( 'sel' => 'ENT', 'up' => 'UP', 'down' => 'DOW', 'right' => 'RIG', 'left' => 'LEF', 'exit' => 'ESC', 'menu' => 'M' ); # map of ipla buttons - x, y on 1920 x 1080 resolution in fullscreen mode my %iplaButtons = ( 'skip+' => [145, 20], 'skip-' => [50, 20], 'home' => [225, 20], 'menu' => [100, 205], 'guide' => [240, 220], 'nowe' => [415, 160], 'cenione' => [850, 160], 'popularne' => [1280, 160], 'pokolei' => [1705, 160], 'play' => [95, 1050], 'stop' => [45, 1050], 'przegladaj' => [1080, 405], 'powtorz' => [830, 405], 'detailspgup' => [1060, 200], 'detailspgdown' => [1060, 995], 'meupgup' => [100, 195], 'menupgdown' => [100, 995], # buttons that don't use specific click points 'up' => [0,0], 'down' => [0,0], 'right' => [0,0], 'left' => [0,0], 'sel' => [0,0], 'ch-' => [0,0], 'ch+' => [0,0], 'exit' => [0,0] ); my $socket = new IO::Socket::INET ( LocalHost => '127.0.0.1', LocalPort => '9000', Proto => 'tcp', Listen => 5, Reuse => 1 ); die "Coudn't open socket" unless $socket; # server loop while (1){ my $client_socket = $socket->accept(); $client_socket->recv($received_data,1024); # remove all new line $received_data =~ s/\n//g; # check if server should quit if ( $received_data =~ m/quitdaemon/ ) { close $client_socket; last; } else { if ($received_data =~ m/startipla/) { &startIpla(); } else { &processButton($received_data); } } } sub processButton() { my ($button) = @_; # get active window my $activeHandle = GetInputFocus(); # check active window title my $title = GetWindowName $activeHandle; # perl will pick up ipla's child window if it's active # child window has no name, so get parent window and check again if ($title eq ''){ $activeHandle = GetParentWindow($activeHandle); $title = GetWindowName $activeHandle; } if ( $title eq 'ipla' ) { # if server was restarted for some reason while # ipla was running $handle will be zero, or if it's different # set it to activeHandle $handle = $activeHandle; &processIpla($button); } else { # other apps SendKeys("{$common{$button}}") if exists $common{$button}; } } sub processIpla(){ my($button) = @_; # get button position if defined if (exists $iplaButtons{$button}) { my ($x, $y) = ($iplaButtons{$button}[0], $iplaButtons{$button}[1]); switch ($button){ case 'sel' { ClickMouseButton M_LEFT } case 'exit' { &killIpla() } case ['up','down','right','left'] { &moveMouse($button) } case ['ch+','ch-'] { &pgUpDown($button) } case ['menu','guide'] { MoveMouseAbs $x, $y } else { ClickWindow $handle, $x, $y, M_LEFT } } } } sub moveMouse(){ my ($direction) = @_; # get current position my ($x, $y) = GetMousePos(); switch ($direction) { case 'up' { MoveMouseAbs $x, $y - $mouseMoveBy } case 'down' { MoveMouseAbs $x, $y + $mouseMoveBy } case 'right' { MoveMouseAbs $x + $mouseMoveBy, $y } case 'left' { MoveMouseAbs $x - $mouseMoveBy, $y } } } sub pgUpDown(){ my ($button) = @_; # get mouse cursor position and check if # it's on the left menu or details my ($a, $ = GetMousePos(); my ($x, $y); if ($a >= $menuarea) { # in details area if ($button eq 'ch+') { ($x, $y) = ($iplaButtons{'detailspgup'}[0], $iplaButtons{'detailspgup'}[1]) }; if ($button eq 'ch-') { ($x, $y) = ($iplaButtons{'detailspgdown'}[0], $iplaButtons{'detailspgdown'}[1]) }; ClickWindow $handle, $x, $y, M_LEFT; } else { # in menu area if ($button eq 'ch+') { ($x, $y) = ($iplaButtons{'menupgup'}[0], $iplaButtons{'menupgup'}[1]) }; if ($button eq 'ch-') { ($x, $y) = ($iplaButtons{'menupgdown'}[0], $iplaButtons{'menupgdown'}[1]) }; ClickWindow $handle, $x, $y, M_LEFT; } } sub killIpla() { system("wmiface closeWindow $handle"); # reset handle $handle = 0; } sub startIpla() { # start iplalite StartApp('/opt/iplalite/bin/iplalite'); # wait for app to come up # this will be splash screen ($handle) = WaitWindowViewable('ipla'); # wait for splash screen to close WaitWindowClose($handle); # wait for main window to show up ($handle) = WaitWindowViewable('ipla'); # bring window to front # RaiseWindow doesn't work every time, use wmiface system("wmiface forceActiveWindow $handle"); sleep 1; SendKeys('{F11}'); } Następnie w „/home/<user>/.lircrc” dodajemy definicje do wszystkich przycisków, podaję przykładowe dwa: ... begin prog = irexec remote = myremote button = up config = /home/art/mythscripts/iplaclient up repeat = 4 end begin prog = irexec remote = myhd button = down config = /home/art/mythscripts/iplaclient down repeat = 4 end ... Wszystko działa jak należy, poza przyciskiem „następna strona”, który zmienia pozycję jak ten zielony pasek na dole się pojawia po pierwszym odtworzeniu jakiegoś programu. Szkoda, że ipli się nie da operować przez klawiaturę, ale ten skrypt jak na razie rozwiązuje mój problem i co najważniejsze żonka aprobuje to rozwiązanie też Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
Rekomendowane odpowiedzi
Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto
Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.
Zarejestruj nowe konto
Załóż nowe konto. To bardzo proste!
Zarejestruj sięZaloguj się
Posiadasz już konto? Zaloguj się poniżej.
Zaloguj się