Class: Orocos::Async::CORBA::OutputReader
- Inherits:
-
ObjectBase
- Object
- ObjectBase
- Orocos::Async::CORBA::OutputReader
- Extended by:
- ObjectBase::Periodic::ClassMethods, Utilrb::EventLoop::Forwardable
- Includes:
- ObjectBase::Periodic
- Defined in:
- lib/orocos/async/ports.rb
Instance Attribute Summary collapse
-
#period ⇒ Object
Returns the value of attribute period.
-
#policy ⇒ Object
readonly
Returns the value of attribute policy.
-
#poll_timer ⇒ Object
readonly
The event loop timer that is polling the connection.
-
#raw_last_sample ⇒ Object
readonly
Returns the value of attribute raw_last_sample.
Attributes included from ObjectBase::Periodic::ClassMethods
Attributes inherited from ObjectBase
#emitting, #event_loop, #name, #options, #pending_adds
Instance Method Summary collapse
-
#initialize(port, reader, period: default_period) ⇒ OutputReader
constructor
A new instance of OutputReader.
- #last_sample ⇒ Object
- #reachable!(reader, options = Hash.new) ⇒ Object
- #reachable? ⇒ Boolean
- #really_add_listener(listener) ⇒ Object
- #remove_listener(listener) ⇒ Object
-
#unreachable!(options = Hash.new) ⇒ Object
TODO keep timer and remote connection in mind.
Methods included from ObjectBase::Periodic
Methods inherited from ObjectBase
#add_listener, define_event, define_events, #disable_emitting, #event, event_names, #event_names, #invalidate_delegator!, #listener?, #listeners, #number_of_listeners, #on_event, #proxy_event, #remove_all_listeners, #remove_proxy_event, #valid_delegator?, valid_event?, #valid_event?, validate_event, #validate_event, #wait
Constructor Details
#initialize(port, reader, period: default_period) ⇒ OutputReader
Returns a new instance of OutputReader
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
# 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 |
Instance Attribute Details
#period ⇒ Object
Returns the value of attribute period
11 12 13 |
# File 'lib/orocos/async/ports.rb', line 11 def period @period end |
#policy ⇒ Object (readonly)
Returns the value of attribute policy
8 9 10 |
# File 'lib/orocos/async/ports.rb', line 8 def policy @policy end |
#poll_timer ⇒ Object (readonly)
The event loop timer that is polling the connection
14 15 16 |
# File 'lib/orocos/async/ports.rb', line 14 def poll_timer @poll_timer end |
#raw_last_sample ⇒ Object (readonly)
Returns the value of attribute raw_last_sample
9 10 11 |
# File 'lib/orocos/async/ports.rb', line 9 def raw_last_sample @raw_last_sample end |
Instance Method Details
#last_sample ⇒ Object
53 54 55 56 57 |
# File 'lib/orocos/async/ports.rb', line 53 def last_sample if @raw_last_sample Typelib.to_ruby(@raw_last_sample) end end |
#reachable!(reader, options = Hash.new) ⇒ Object
85 86 87 88 89 90 |
# File 'lib/orocos/async/ports.rb', line 85 def reachable!(reader, = Hash.new) super if number_of_listeners(:data) != 0 poll_timer.start period unless poll_timer.running? end end |
#reachable? ⇒ Boolean
81 82 83 |
# File 'lib/orocos/async/ports.rb', line 81 def reachable? super && @port.reachable? end |
#really_add_listener(listener) ⇒ Object
97 98 99 100 101 102 103 104 105 106 |
# 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) ⇒ Object
108 109 110 111 112 113 |
# 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) ⇒ Object
TODO keep timer and remote connection in mind
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
# File 'lib/orocos/async/ports.rb', line 60 def unreachable!( = 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 |