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
Calls superclass method
Orocos::Async::ObjectBase::Periodic#period=
# 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
Calls superclass method
Orocos::Async::ObjectBase#really_add_listener
# 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
Calls superclass method
Orocos::Async::ObjectBase#remove_listener
# 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