class Orocos::Async::CORBA::OutputPort

Public Class Methods

new(async_task,port,options=Hash.new) click to toggle source
Calls superclass method Orocos::Async::CORBA::Port.new
# File lib/orocos/async/ports.rb, line 246
def initialize(async_task,port,options=Hash.new)
    super
    @readers = Array.new
end

Public Instance Methods

add_listener(listener) click to toggle source
Calls superclass method Orocos::Async::ObjectBase#add_listener
# File lib/orocos/async/ports.rb, line 343
def add_listener(listener)
    super
    if((listener.event == :data || listener.event == :raw_data) && !@global_reader)
        # Errors during reader creation are reported on the port. Do
        # #on_error on the port to get them
        reader(@options) do |reader|
            if @global_reader
                # We created multiple readers because of concurrency.
                # Just ignore this one
                reader.disconnect
            elsif number_of_listeners(:data) > 0 || number_of_listeners(:raw_data) > 0  # The listener might already have been removed !
                @global_reader = reader
                proxy_event(reader,:data,:raw_data)
                @global_reader.period = @options[:period] if @options.has_key? :period
            end
        end
    end
end
last_sample() click to toggle source
# File lib/orocos/async/ports.rb, line 251
def last_sample
    @global_reader.last_sample if @global_reader
end
on_data(policy = Hash.new,&block) click to toggle source
# File lib/orocos/async/ports.rb, line 287
def on_data(policy = Hash.new,&block)
    @options = if policy.empty?
                   @options
               elsif @options.empty? && !@global_reader
                   policy
               elsif @options == policy
                   @options
               else
                   Orocos.warn "Changing global reader policy for #{full_name} from #{@options} to #{policy}"
                   self.options = @options
                   @options
               end
    on_event :data,&block
end
on_raw_data(policy = Hash.new,&block) click to toggle source
# File lib/orocos/async/ports.rb, line 302
def on_raw_data(policy = Hash.new,&block)
    @options = if policy.empty?
                   @options
               elsif @options.empty? && !@global_reader
                   policy
               elsif @options == policy
                   @options
               else
                   Orocos.warn "Changing global reader policy for #{full_name} from #{@options} to #{policy}"
                   self.options = @options
                   @options
               end
    on_event :raw_data,&block
end
options=(options) click to toggle source
Calls superclass method
# File lib/orocos/async/ports.rb, line 259
def options=(options)
    super
    @global_reader = nil
end
period=(value) click to toggle source
# File lib/orocos/async/ports.rb, line 317
def period=(value)
    @period = value
    @global_reader.period = value if @global_reader.respond_to?(:period=)
end
raw_last_sample() click to toggle source
# File lib/orocos/async/ports.rb, line 255
def raw_last_sample
    @global_reader.raw_last_sample if @global_reader
end
reachable!(port,options = Hash.new) click to toggle source
Calls superclass method Orocos::Async::CORBA::Port#reachable!
# File lib/orocos/async/ports.rb, line 378
def reachable!(port,options = Hash.new)
    super
    if @global_reader
        orig_reader(@global_reader.policy) do |reader,error|
            unless error
                @global_reader.reachable!(reader)
            end
        end
    end
end
reader(options = Hash.new,&block) click to toggle source
# File lib/orocos/async/ports.rb, line 264
def reader(options = Hash.new,&block)
    options, policy = Kernel.filter_options options, :period => nil
    policy[:init] = true unless policy.has_key?(:init)
    policy[:pull] = true unless policy.has_key?(:pull)
    if block
        orig_reader(policy) do |reader,error|
            unless error
                reader = OutputReader.new(self,reader,options)
                proxy_event(reader,:error)
            end
            if block.arity == 2
                block.call(reader,error)
            elsif !error
                block.call(reader)
            end
        end
    else
        reader = OutputReader.new(self,orig_reader(policy),options)
        proxy_event(reader,:error)
        reader
    end
end
really_add_listener(listener) click to toggle source
# File lib/orocos/async/ports.rb, line 322
def really_add_listener(listener)
    super
    if listener.event == :data
        if @global_reader
            if listener.use_last_value?
                if sample = @global_reader.last_sample
                    listener.call sample
                end
            end
        end
    elsif listener.event == :raw_data
        if @global_reader
            if listener.use_last_value?
                if sample = @global_reader.raw_last_sample
                    listener.call sample
                end
            end
        end
    end
end
remove_listener(listener) click to toggle source
# File lib/orocos/async/ports.rb, line 362
def remove_listener(listener)
    super
    if number_of_listeners(:data) == 0  && number_of_listeners(:raw_data) == 0 && @global_reader
        remove_proxy_event(@global_reader)
        @global_reader.disconnect{} # call it asynchron
        @global_reader = nil
    end
end
unreachable!(options = Hash.new) click to toggle source
Calls superclass method Orocos::Async::CORBA::Port#unreachable!
# File lib/orocos/async/ports.rb, line 371
def unreachable!(options = Hash.new)
    if @global_reader.respond_to?(:unreachable!)
        @global_reader.unreachable! 
    end
    super
end