class Roby::AndGenerator

Combine event generators using an AND. The generator will emit once all its source events have emitted, and become unreachable if any of its source events have become unreachable.

For instance,

a = task1.start_event
b = task2.start_event
(a & b) # will emit when both tasks have started

And events will emit only once, unless reset is called:

a = task1.intermediate_event
b = task2.intermediate_event
and_ev = (a & b)

a.intermediate_event!
b.intermediate_event! # and_ev emits here
a.intermediate_event!
b.intermediate_event! # and_ev does *not* emit

and_ev.reset
a.intermediate_event!
b.intermediate_event! # and_ev emits here

The AndGenerator tracks its sources via the signalling relations, so

and_ev << c.intermediate_event

is equivalent to

c.intermediate_event.add_signal and_ev

Public Class Methods

new() click to toggle source
Calls superclass method Roby::EventGenerator::new
# File lib/roby/and_generator.rb, line 36
def initialize
    super do |context|
        emit_if_achieved(context)
    end

    # This hash is a event_generator => event mapping of the last
    # events of each event generator. We compare the event stored in
    # this hash with the last events of each source to know if the
    # source fired since it has been added to this AndGenerator
    @events = Hash.new

    # This flag is true unless we are not waiting for the emission
    # anymore.
    @active = true
end

Public Instance Methods

<<(generator) click to toggle source

Add a new source to this generator

# File lib/roby/and_generator.rb, line 119
def << (generator)
    generator.add_signal self
    self
end
empty?() click to toggle source

True if the generator has no sources

# File lib/roby/and_generator.rb, line 89
def empty?; relation_graph_for(EventStructure::Signal).root?(self) end
events() click to toggle source

The set of source events

# File lib/roby/and_generator.rb, line 114
def events;  each_parent_object(EventStructure::Signal).to_set end
reset() click to toggle source

After this call, the AndGenerator will emit as soon as all its source events have been emitted again.

Example:

a = task1.intermediate_event
b = task2.intermediate_event
and_ev = (a & b)

a.intermediate_event!
b.intermediate_event! # and_ev emits here
a.intermediate_event!
b.intermediate_event! # and_ev does *not* emit

and_ev.reset
a.intermediate_event!
b.intermediate_event! # and_ev emits here
# File lib/roby/and_generator.rb, line 68
def reset
    @active = true
    each_parent_object(EventStructure::Signal) do |source|
        @events[source] = source.last
        if source.respond_to?(:reset)
            source.reset
        end
    end
end
waiting() click to toggle source

The set of generators that have not been emitted yet.

# File lib/roby/and_generator.rb, line 116
def waiting; each_parent_object(EventStructure::Signal).find_all { |ev| @events[ev] == ev.last } end