NAME
UAV::Pilot::EasyEvent
SYNOPSIS
my $cv = AnyEvent->condvar;
my $event = UAV::Pilot::EasyEvent->new({
condvar => $cv,
});
my @events;
my $event2 = $event->add_timer({
duration => 100,
duration_units => $event->UNITS_MILLISECOND,
cb => sub {
push @events => 'First event',
},
})->add_timer({
duration => 10,
duration_units => $event->UNITS_MILLISECOND,
cb => sub {
push @events => 'Second event',
},
});
$event2->add_timer({
duration => 50,
duration_units => $event->UNITS_MILLISECOND,
cb => sub {
push @events => 'Fourth event',
$cv->send;
},
});
$event2->add_timer({
duration => 10,
duration_units => $event->UNITS_MILLISECOND,
cb => sub {
push @events => 'Third event',
},
});
$event->activate_events;
$cv->recv;
# After time passes, prints:
# First event
# Second event
# Third event
# Fourth event
#
say $_ for @events;
DESCRIPTION
AnyEvent
is the standard event framework used for UAV::Pilot
. However, its interface isn't convenient for some of the typical things done for UAV piloting. For instance, to put the code into plain English, we might want to say:
Takeoff, wait 5 seconds, then pitch forward for 2 seconds, then pitch backwards
for 2 seconds, then land
In the usual AnyEvent
interface, this requires building the timers inside the callbacks of other timers, which leads to several levels of indentation. UAV::Pilot::EasyEvent
simplifies the handling and syntax of this kind of event workflow.
METHODS
new
new({
condvar => $cv,
})
Constructor. The condvar
argument should be an AnyEvent::CondVar
.
add_timer
add_timer({
duration => 100,
duration_units => $event->UNITS_MILLISECOND,
cb => sub { ... },
})
Add a timer to run in the event loop. It will run after duration
units of time, with the units specified by duration_units
. The cb
parameter is a reference to a subroutine to use as a callback.
Returns a child EasyEvent
object. When the timer above has finished, any timers on child objects will be setup for execution. This makes it easy to chain timers to run after each other.
activate_events
This method must be called after running a series of add_timer()
calls. You only need to call this on the root object, not the children.
You must call recv
on the condvar
yourself.