#!/usr/bin/perl
my
$IP
=
'192.168.1.1'
;
my
$PROMPT
=
'uav> '
;
my
$MULTILINE_PROMPT
=
"\t"
;
my
@LIB_PATHS
= ();
my
@LIBS
= ();
my
$IFACE
=
undef
;
GetOptions(
'host=s'
=> \
$IP
,
'i|iface=s'
=> \
$IFACE
,
'l|load=s'
=> \
@LIBS
,
'L|library=s'
=> \
@LIB_PATHS
,
);
sub
run_cmd
{
my
(
$cmd
,
$repl
) =
@_
;
my
$return
= 1;
if
(
$cmd
=~ /\A(?:
exit
| quit |
q )
\s*;\s*\z/x ) {
$return
= 0;
}
else
{
eval
{
$repl
->run_cmd(
$cmd
);
};
warn
$@
if
$@;
}
return
$return
;
}
sub
load_libraries
{
my
(
$repl
,
$lib_paths
,
$libs
,
$cv
) =
@_
;
$repl
->add_lib_dir(
$_
)
for
@$lib_paths
;
$repl
->add_lib_dir( UAV::Pilot->default_module_dir );
print
"Library paths:\n"
.
join
(
"\n"
,
map
{
"\t$_"
} @{
$repl
->lib_dirs } ) .
"\n"
;
foreach
my
$lib
(
@$libs
) {
print
"Loading library '$lib' . . . "
;
$repl
->load_lib(
$lib
, {
condvar
=>
$cv
,
});
print
"OK\n"
;
}
print
"\n"
;
return
1;
}
{
my
@cmd
= ();
sub
add_cmd
{
my
(
$cmd
) =
@_
;
push
@cmd
=>
$cmd
;
return
1;
}
sub
full_cmd
{
my
$cmd
=
join
(
' '
,
@cmd
);
@cmd
= ();
return
$cmd
;
}
}
{
my
$continue
= 1;
my
$driver_args
= {
host
=>
$IP
,
};
$driver_args
->{iface} =
$IFACE
if
defined
$IFACE
;
my
$ardrone
= UAV::Pilot::ARDrone::Driver->new(
$driver_args
);
$ardrone
->
connect
;
my
$dev
= UAV::Pilot::ARDrone::Control::Event->new({
driver
=>
$ardrone
,
});
my
$cv
=
$dev
->init_event_loop;
my
$repl
= UAV::Pilot::Commands->new({
device
=>
$dev
,
condvar
=>
$cv
,
});
load_libraries(
$repl
, \
@LIB_PATHS
, \
@LIBS
,
$cv
);
my
$readline
;
$readline
= AnyEvent::ReadLine::Gnu->new(
prompt
=>
$PROMPT
,
on_line
=>
sub
{
my
(
$line
) =
@_
;
add_cmd(
$line
);
if
(
$line
=~ /; \s* \z/x ) {
my
$cmd
= full_cmd;
$readline
->hide;
my
$do_continue
= run_cmd(
$cmd
,
$repl
);
$readline
->show;
$cv
->
send
(
$do_continue
)
unless
$do_continue
;
}
},
);
$cv
->
recv
;
}