Skocz do zawartości

Ipla + Htpc (mythtv)


art_

Rekomendowane odpowiedzi

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

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

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ę
×
×
  • Dodaj nową pozycję...