class Orocos::Async::CORBA::OutputReader

Attributes

period[R]
policy[R]
poll_timer[R]

The event loop timer that is polling the connection

raw_last_sample[R]

Public Class Methods

new(port, reader, period: default_period) click to toggle source

@param [Async::OutputPort] port The Asyn::OutputPort @param [Orocos::OutputReader] reader The designated reader

Calls superclass method Orocos::Async::ObjectBase.new
# File lib/orocos/async/ports.rb, line 20
def initialize(port, reader, period: default_period)
    super(port.name,port.event_loop)
    @port = port
    @raw_last_sample = nil
    @policy = reader.policy
    @period = period

    timeout =
        if reader.policy[:type] == :buffer
            period
        else 0
        end

    poll_timer = @event_loop.async_every(
        method(:thread_read),
        Hash[period: period,
             start: false,
             known_errors: Orocos::Async::KNOWN_ERRORS],
        timeout, &method(:thread_read_callback))
    poll_timer.doc = port.full_name
    @poll_timer = poll_timer

    # otherwise event reachable will be queued and all 
    # listeners will be called twice (one for registering and one because
    # of the queued event)
    disable_emitting do
        reachable! reader
    end
    proxy_event @port,:unreachable
rescue Orocos::NotFound => e
    emit_error e
end

Public Instance Methods

last_sample() click to toggle source
# File lib/orocos/async/ports.rb, line 53
def last_sample
    if @raw_last_sample
        Typelib.to_ruby(@raw_last_sample)
    end
end
period=(period) click to toggle source
# File lib/orocos/async/ports.rb, line 92
def period=(period)
    super
    poll_timer.period = self.period
end
reachable!(reader,options = Hash.new) click to toggle source
Calls superclass method Orocos::Async::ObjectBase#reachable!
# File lib/orocos/async/ports.rb, line 85
def reachable!(reader,options = Hash.new)
    super
    if number_of_listeners(:data) != 0
        poll_timer.start period unless poll_timer.running?
    end
end
reachable?() click to toggle source
Calls superclass method Orocos::Async::ObjectBase#reachable?
# File lib/orocos/async/ports.rb, line 81
def reachable?
    super && @port.reachable?
end
really_add_listener(listener) click to toggle source
# File lib/orocos/async/ports.rb, line 97
def really_add_listener(listener)
    if listener.event == :data
        poll_timer.start(period) unless poll_timer.running?
        listener.call Typelib.to_ruby(@raw_last_sample) if @raw_last_sample && listener.use_last_value?
    elsif listener.event == :raw_data
        poll_timer.start(period) unless poll_timer.running?
        listener.call @raw_last_sample if @raw_last_sample && listener.use_last_value?
    end
    super
end
remove_listener(listener) click to toggle source
# File lib/orocos/async/ports.rb, line 108
def remove_listener(listener)
    super
    if number_of_listeners(:data) == 0 && number_of_listeners(:raw_data) == 0
        poll_timer.cancel
    end
end
unreachable!(options = Hash.new) click to toggle source

TODO keep timer and remote connection in mind

Calls superclass method Orocos::Async::ObjectBase#unreachable!
# File lib/orocos/async/ports.rb, line 60
def unreachable!(options = Hash.new)
    poll_timer.cancel
    @raw_last_sample = nil

    # ensure that this is always called from the
    # event loop thread
    @event_loop.call do
        old = begin
                  @delegator_obj.disconnect if valid_delegator?
              rescue Orocos::ComError,Orocos::NotFound => e
              ensure
                  if valid_delegator?
                      event :unreachable
                      @delegator_obj
                  end
              end
        super
        old
    end
end