view release on metacpan or search on metacpan
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',
)
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
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
--- #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 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";
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 }
#!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" },