NAME
UAV::Pilot::Commands
SYNOPSIS
my $device; # Some UAV::Pilot::Control instance, defined elsewhere
my $cmds = UAV::Pilot::Commands->new({
device => $device,
controller_callback_ardrone => \&make_ardrone_controller,
controller_callback_wumpusrover => \&make_wumpusrover_controller,
});
$cmds->load_lib( 'ARDrone' );
$cmds->run_cmd( 'takeoff;' );
$cmds->run_cmd( 'land;' );
DESCRIPTION
Provides an interface for loading UAV extensions and running them, particularly for REPL shells.
METHODS
new
new({
condvar => $cv,
controller_callback_ardrone => sub { ... },
controller_callback_wumpusrover => sub { .. },
})
Constructor. The condvar
parameter is an AnyEvent::Condvar
.
The controller_callback_*
parameters take a sub ref. The subroutines take a the parameters ($cmd, $cv, $easy_event)
, where $cmd
is this UAV::Pilot::Commands
instance, $cv
is the condvar passed above, and $easy_event
is an UAV::Pilot::EasyEvent
instance. It should return a UAV::Pilot::Control
object of the associated type (generally one of the *::Event
types with init_event_loop()
called).
Note that this API is likely to change to a factory pattern in the near future.
load_lib
load_lib( 'ARDrone', {
pack => 'AR',
})
Loads an extension by name. The pack
paramter will load the library into a specific namespace. If you don't specify it, you won't need to qualify commands with a namespace prefix. Example:
load_lib( 'ARDrone', { pack => 'AR' } );
run_cmd( 'takeoff;' ); # Error: no subroutine named 'takeoff'
run_cmd( 'AR::takeoff;' ); # This works
load_lib( 'ARDrone' );
run_cmd( 'takeoff;' ); # Now this works, too
Any other parmaeters you pass will be passed to the module's uav_module_init()
subroutine.
run_cmd
run_cmd( 'takeoff;' )
Executes a command. Note that this will execute arbitrary Perl statements.
COMMANDS
Commands provide an easy interface for writing simple UAV programms in a REPL shell. They are usually thin interfaces over a UAV::Pilot::Control. If you're writing a complicated script, it's suggested that you skip this interface and write to the UAV::Pilot::Control directly.
load
load 'ARDrone', {
namespace => 'AR',
};
Direct call to load_lib
. The namespace
paramter will load the library into a specific namespace. If you don't specify it, you won't need to qualify commands with a namespace prefix. Example:
load 'ARDrone', { namespace => 'AR' };
takeoff; # Error: no subroutine named 'takeoff'
AR::takeoff; # This works
load ARDrone;
takeoff; # Now this works, too
Any other parmaeters you pass will be passed to the module's uav_module_init()
subroutine.
WRITING YOUR OWN EXTENSIONS
When calling load_lib( 'Foo' )
, we look for UAV::Pilot::Foo::Commands
in the current @INC
.
You write them much like any Perl module, but don't use a package
statement--the package will be controlled by UAV::Pilot::Command
when loaded. Like a Perl module, it should return true as its final statement (put a 1;
at the end).
Likewise, be careful not to make any assumptions about what package you're in. Modules may or may not get loaded into different, arbitrary packages.
For ease of use, it's recommended to use function prototypes to reduce the need for parens.
The method uav_module_init()
is called with the package name as the first argument. Subsquent arguments will be the hashref passed to load()/load_lib()
. After being called, this sub will be deleted from the package.
The method uav_module_quit()
is called when the REPL is closing.