Class: Orocos::Async::CORBA::OutputReader

Inherits:
ObjectBase
  • Object
show all
Extended by:
ObjectBase::Periodic::ClassMethods, Utilrb::EventLoop::Forwardable
Includes:
ObjectBase::Periodic
Defined in:
lib/orocos/async/ports.rb

Instance Attribute Summary collapse

Attributes included from ObjectBase::Periodic::ClassMethods

#default_period

Attributes inherited from ObjectBase

#emitting, #event_loop, #name, #options, #pending_adds

Instance Method Summary collapse

Methods included from ObjectBase::Periodic

#default_period

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

Parameters:

  • port (Async::OutputPort)

    The Asyn::OutputPort

  • reader (Orocos::OutputReader)

    The designated reader



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

#periodObject

Returns the value of attribute period



11
12
13
# File 'lib/orocos/async/ports.rb', line 11

def period
  @period
end

#policyObject (readonly)

Returns the value of attribute policy



8
9
10
# File 'lib/orocos/async/ports.rb', line 8

def policy
  @policy
end

#poll_timerObject (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_sampleObject (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_sampleObject



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,options = Hash.new)
    super
    if number_of_listeners(:data) != 0
        poll_timer.start period unless poll_timer.running?
    end
end

#reachable?Boolean

Returns:

  • (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!(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