Device-Ericsson-AccessoryMenu

 view release on metacpan or  search on metacpan

Build.PL  view on Meta::CPAN

use strict;
use Module::Build;

Module::Build->new(
    module_name => "Device::Ericsson::AccessoryMenu",
    license     => 'perl',
    requires    => {
        'Test::More'            => 0,
        'Class::Accessor::Fast' => 0,
    },
    recommends  => {
        'Device::SerialPort' => 0,
    },
    create_makefile_pl => 'traditional',
   )

Changes  view on Meta::CPAN

	Applied the following patch by Arne Georg Gleditsch:
		Added examples/x11pointer
		Added xmms playlist clear/add directory to examples/remote 
		Reworking of the timeout code to allow for better co-operation
		with foreign event loops.
		Setting of the default charset
	Thanks Arne!

0.7	Monday 22nd September, 2003
	Fixed a packageing mistake - we weren't shipping 
	lib/Device/Ericsson/AccessoryMenu/Mouse.pm due to a glitch in
	MANIFEST.SKIP


0.6	Wednesday 25th June, 2003
	Rewrote everything to be stateful.  We now have a stack of
	states.  You can enter a new state, or exit and query the
	current state. The current state's handle method will be
	invoked for each line received by ->control

	It is expected that states will be based on, or at least
	implement the interface of Device::Ericsson::AccessoryMenu::State, 
 	and that they will be named Device::Ericsson::AccessoryMenu::$state.

	INCOMPATIBLE CHANGE moved send_menu over to Menu->on_enter

	reimplemented send_text as a thin shim around enter_state( 'Text' )

	implemented mouse_move as a similar shim

	worked over examples/remote to be much more functional


0.5	Thursday 14th June, 2003
	Initial CPAN release

MANIFEST  view on Meta::CPAN

Changes
README
MANIFEST
MANIFEST.SKIP
META.yml
Build.PL
Makefile.PL
lib/Device/Ericsson/AccessoryMenu.pm
lib/Device/Ericsson/AccessoryMenu/Menu.pm
lib/Device/Ericsson/AccessoryMenu/Mouse.pm
lib/Device/Ericsson/AccessoryMenu/Slider.pm
lib/Device/Ericsson/AccessoryMenu/State.pm
lib/Device/Ericsson/AccessoryMenu/Text.pm
examples/remote
examples/xblast
examples/x11pointer
t/remote.t

META.yml  view on Meta::CPAN

--- #YAML:1.0
name: Device-Ericsson-AccessoryMenu
version: 0.8
author:
  - Richard Clamp <richardc@unixbeard.net>
abstract: allows use of a T68i as a remote control
license: perl
requires:
  Class::Accessor::Fast: 0
  Test::More: 0
recommends:
  Device::SerialPort: 0
provides:
  Device::Ericsson::AccessoryMenu:
    file: lib/Device/Ericsson/AccessoryMenu.pm
    version: 0.8
  Device::Ericsson::AccessoryMenu::Menu:
    file: lib/Device/Ericsson/AccessoryMenu/Menu.pm
  Device::Ericsson::AccessoryMenu::Mouse:
    file: lib/Device/Ericsson/AccessoryMenu/Mouse.pm
  Device::Ericsson::AccessoryMenu::Slider:
    file: lib/Device/Ericsson/AccessoryMenu/Slider.pm
  Device::Ericsson::AccessoryMenu::State:
    file: lib/Device/Ericsson/AccessoryMenu/State.pm
  Device::Ericsson::AccessoryMenu::Text:
    file: lib/Device/Ericsson/AccessoryMenu/Text.pm
generated_by: Module::Build version 0.23

Makefile.PL  view on Meta::CPAN

# Note: this file was auto-generated by Module::Build::Compat version 0.03
use ExtUtils::MakeMaker;
WriteMakefile
(
          'NAME' => 'Device::Ericsson::AccessoryMenu',
          'VERSION_FROM' => 'lib/Device/Ericsson/AccessoryMenu.pm',
          'PREREQ_PM' => {
                           'Test::More' => 0,
                           'Class::Accessor::Fast' => 0
                         },
          'INSTALLDIRS' => 'site',
          'PL_FILES' => {}
        )
;

README  view on Meta::CPAN

README for Device::Ericsson::AccessoryMenu 0.8

=head1 NAME

Device::Ericsson::AccessoryMenu - allows use of a T68i as a remote control

=head1 SYNOPSIS

 my $remote = Device::Ericsson::AccessoryMenu->new;
 $remote->menu( [ 'Remote' => [ pause  => sub { ... },
                                Volume => [ up   => sub { ... },
                                            down => sub { ... },
                                          ],
                              ],
                ] );

 # on Win32, Win32::SerialPort should be equivalent
 my $port = Device::SerialPort->new('/dev/rfcomm0')
    or die "couldn't connect to T68i";

README  view on Meta::CPAN

		Added xmms playlist clear/add directory to examples/remote 
		Reworking of the timeout code to allow for better co-operation
		with foreign event loops.
		Setting of the default charset
	Thanks Arne!


=item 0.7	Monday 22nd September, 2003

	Fixed a packageing mistake - we weren't shipping 
	lib/Device/Ericsson/AccessoryMenu/Mouse.pm due to a glitch in
	MANIFEST.SKIP



=item 0.6	Wednesday 25th June, 2003

	Rewrote everything to be stateful.  We now have a stack of
	states.  You can enter a new state, or exit and query the
	current state. The current state's handle method will be
	invoked for each line received by ->control

	It is expected that states will be based on, or at least
	implement the interface of Device::Ericsson::AccessoryMenu::State, 
 	and that they will be named Device::Ericsson::AccessoryMenu::$state.

	INCOMPATIBLE CHANGE moved send_menu over to Menu->on_enter

	reimplemented send_text as a thin shim around enter_state( 'Text' )

	implemented mouse_move as a similar shim

	worked over examples/remote to be much more functional


=back

examples/remote  view on Meta::CPAN

#!/usr/local/bin/perl -w
use lib qw(lib);
use strict;
use Device::Ericsson::AccessoryMenu;
use Device::SerialPort;
use Xmms::Remote;
use X11::GUITest qw(SendKeys);

my $xmms = Xmms::Remote->new;

#invoke galeon
sub galeon ($) {
    system qw( galeon -x ), "javascript:". shift;
    return;

examples/remote  view on Meta::CPAN

	}
    }
    closedir($d);

    return \@res;
}


my $port = shift || '/dev/rfcomm0';

my $remote = Device::Ericsson::AccessoryMenu->new(
    debug => 1,
    port  => Device::SerialPort->new( $port ) || die,
    menu  => [
        'Remote' => [
            XMMS => [
                "Play/Pause" => sub {
                    # start xmms if it isn't already
                    system ('xmms &') unless $xmms->is_running;
                    $xmms->is_playing ? $xmms->pause : $xmms->play;
                },

examples/remote  view on Meta::CPAN

                },
                Down    => sub { galeon 'scrollBy(0,  window.innerHeight)' },
                Up      => sub { galeon 'scrollBy(0, -window.innerHeight)' },
                Top     => sub { galeon 'scrollBy(0, -document.body.scrollTop)' },
               ],
            Test => [
                "Send Text" => sub {
                    my $r = shift;
                    $r->send_text('hello, world', "isn't this fun");
                },
                "Dynamic Menu" => sub { [ Literal => 'What we have here is failure to communicate',] },
                Mouse  => sub {
                    my $r = shift;
                    $r->mouse_mode( callback => sub {
                                        my ($key, $updown) = @_;
                                        print "### key $key event $updown\n";
                                    });
                },
               ],
            Restart => sub { exec $^X, $0 },
            Quit    => sub { exit },

examples/x11pointer  view on Meta::CPAN

#!/usr/local/bin/perl -w
use lib qw(lib);
use strict;
use Device::Ericsson::AccessoryMenu;
use Device::SerialPort;
use X11::GUITest qw(SendKeys GetMousePos MoveMouseAbs PressMouseButton ReleaseMouseButton);

my %mousestate;

my $port = shift || '/dev/rfcomm0';

my $remote = Device::Ericsson::AccessoryMenu->new(
    debug => 1,
    port  => Device::SerialPort->new( $port ) || die,
    menu  => [
        'Remote' => [
	    'X11' => sub {
		my $r = shift;
		%mousestate = ();
		$r->mouse_mode( callback => sub {
		    my ($key, $updown) = @_;
		    if ($key =~ /^[v<>^]$/) {

examples/xblast  view on Meta::CPAN

#!/usr/local/bin/perl -w
use lib qw(lib);
use strict;
use Device::Ericsson::AccessoryMenu;
use Device::SerialPort;
use X11::GUITest qw(PressKey ReleaseKey); # local modified version

my $port = shift || '/dev/rfcomm0';

my %player1 = ( '^' => 'up',  2 => 'up',       # up
                'v' => 'dow', 8 => 'dow',      # down
                '<' => 'lef', 4 => 'lef',      # left
                '>' => 'rig', 6 => 'rig',      # right
                              5 => 'KP_Begin', # stop

examples/xblast  view on Meta::CPAN

    my $remote = shift;
    my %keymap = @_;
    $remote->mouse_mode( callback => sub {
                             my ($key, $updown) = @_;
                             return unless exists $keymap{$key};
                             $updown ? PressKey($keymap{$key})
                                     : ReleaseKey($keymap{$key});
                         });
}

my $menu = Device::Ericsson::AccessoryMenu->new(
    port => Device::SerialPort->new( $port ) || die,
    menu => [ XBlast => [
        Player1 => sub { translate_keys( shift, %player1 ) },
        Player2 => sub { translate_keys( shift, %player2 ) },
       ],
    ],
    debug => 1,
   );

$menu->register_menu;

lib/Device/Ericsson/AccessoryMenu.pm  view on Meta::CPAN

use strict;
package Device::Ericsson::AccessoryMenu;
use base 'Class::Accessor::Fast';
__PACKAGE__->mk_accessors( qw( states menu port debug callback ) );
use vars qw( $VERSION );
$VERSION = '0.8';

=head1 NAME

Device::Ericsson::AccessoryMenu - allows use of a T68i as a remote control

=head1 SYNOPSIS

 my $remote = Device::Ericsson::AccessoryMenu->new;
 $remote->menu( [ 'Remote' => [ pause  => sub { ... },
                                Volume => [ up   => sub { ... },
                                            down => sub { ... },
                                          ],
                              ],
                ] );

 # on Win32, Win32::SerialPort should be equivalent
 my $port = Device::SerialPort->new('/dev/rfcomm0')
    or die "couldn't connect to T68i";
 $remote->port( $port );

 $remote->register_menu;

 while (1) {
     $remote->control;
 }

=head1 DESCRIPTION

Device::Ericsson::AccessoryMenu provides a framework for adding an
accessory menu to devices that obey the EAM set of AT commands.

This allows you to write programs with similar function to the Romeo
and Clicker applications for OSX, only instead of applescript your
actions invoke perl subroutines (which of course may invoke
applescript events, if that's your desire).

=head1 METHODS

=head2 new

lib/Device/Ericsson/AccessoryMenu.pm  view on Meta::CPAN

sub new {
    my $class = shift;
    $class->SUPER::new({ menu => [], @_ });
}

=head2 menu

your menus and actions.

If your action is a subroutine, it will be invoked with the
Device::Ericsson::AccesoryMenu object as its first parameter.

If the action returns a scalar, this is sent on to the phone via
C<send_text>

If your action is, or returns an array reference, then it's taken as a
sub menu.

=head2 port

The serial port to communicate over.

lib/Device/Ericsson/AccessoryMenu.pm  view on Meta::CPAN

    return unless $line;

    print "# control '$line'\n" if $self->debug;

    if ( my $state = $self->current_state ) {
        $state->handle( $line );
        return;
    }

    if ($line =~ /EAAI/) { # top level menu
        $self->enter_state( 'Menu', data => $self->menu );
        return;
    }

    warn "control got unexpected '$line'\n";
}

1;
__END__

=head1 CAVEATS

lib/Device/Ericsson/AccessoryMenu/Menu.pm  view on Meta::CPAN

use strict;
package Device::Ericsson::AccessoryMenu::Menu;
use base 'Device::Ericsson::AccessoryMenu::State';
__PACKAGE__->mk_accessors( qw( data selected ) );


sub _get_pairs {
    my $self = shift;

    my @menu = @{ $self->data };
    my @entries = @{ $menu[1] };
    my @pairs;
    while (@entries) {

lib/Device/Ericsson/AccessoryMenu/Menu.pm  view on Meta::CPAN


        my @pairs = $self->_get_pairs;
        unshift @pairs, []; # dummy one so the offsets all work out
        my ($name, $action) = @{ $pairs[ $item ] };

        $self->selected( $item );
        print "invoking $item: $action\n" if $self->debug;
        $action = $action->( $self->parent ) if ref $action eq 'CODE';

        if (ref $action eq 'ARRAY') { # wander down
            $self->enter_state( 'Menu', data => [ $name => $action ] );
            return;
        }

        if (defined $action && !ref $action) {
            $self->parent->send_text( $name, $action );
            return;
        }

        # update and resend, if we're still in this state
        $self->on_enter if $self->current_state == $self;

lib/Device/Ericsson/AccessoryMenu/Mouse.pm  view on Meta::CPAN

use strict;
package Device::Ericsson::AccessoryMenu::Mouse;
use base 'Device::Ericsson::AccessoryMenu::State';
__PACKAGE__->mk_accessors( qw( callback title upup ) );

sub on_enter {
    my $self = shift;

    my $title = $self->title;

    # show the user a dialog they can quit from
    $self->send( qq{AT*EAID=13,2,"$title"} );
    $self->expect( 'OK' );

lib/Device/Ericsson/AccessoryMenu/Slider.pm  view on Meta::CPAN

use strict;
package Device::Ericsson::AccessoryMenu::Slider;
use base 'Device::Ericsson::AccessoryMenu::State';
__PACKAGE__->mk_accessors( qw( callback value steps title ) );


sub on_enter {
    my $self = shift;

    my $title = $self->title;
    my $steps = $self->steps;
    my $value = int( $self->value / 100 * $steps ); # starting step

lib/Device/Ericsson/AccessoryMenu/State.pm  view on Meta::CPAN

use strict;
package Device::Ericsson::AccessoryMenu::State;
use base 'Class::Accessor::Fast';
__PACKAGE__->mk_accessors( 'parent' );

sub new {
    my $class = shift;
    $class->SUPER::new({ @_ });
}

sub on_exit {}
sub on_enter {}

lib/Device/Ericsson/AccessoryMenu/Text.pm  view on Meta::CPAN

use strict;
package Device::Ericsson::AccessoryMenu::Text;
use base 'Device::Ericsson::AccessoryMenu::State';
__PACKAGE__->mk_accessors( qw( title lines ) );


sub on_enter {
    my $self = shift;

    my $title = $self->title;
    $self->send( join ',',
                 qq{AT*EAID=14,2,"$title"},
                 map { qq{"$_"} } @{ $self->lines }

t/remote.t  view on Meta::CPAN

#!perl -w
use strict;
use Test::More tests => 2;

my $pkg = 'Device::Ericsson::AccessoryMenu';
use_ok( $pkg );
my $remote = $pkg->new;

isa_ok( $remote, $pkg );

$remote->menu( [
    'Remote' => [
        pause => sub { print "# paused\n" },
        Volume => [
            up   => sub { print "# vol +\n" },



( run in 0.956 second using v1.01-cache-2.11-cpan-49f99fa48dc )