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