Class: Orocos::Async::CORBA::OutputPort

Inherits:
Port show all
Defined in:
lib/orocos/async/ports.rb

Instance Attribute Summary

Attributes inherited from Port

#options

Attributes inherited from ObjectBase

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

Instance Method Summary collapse

Methods inherited from Port

#reachable?, #task, #to_async, #to_proxy

Methods inherited from ObjectBase

define_event, define_events, #disable_emitting, #event, event_names, #event_names, #invalidate_delegator!, #listener?, #listeners, #number_of_listeners, #on_event, #proxy_event, #reachable?, #remove_all_listeners, #remove_proxy_event, #valid_delegator?, valid_event?, #valid_event?, validate_event, #validate_event, #wait

Constructor Details

#initialize(async_task, port, options = Hash.new) ⇒ OutputPort

Returns a new instance of OutputPort



246
247
248
249
# File 'lib/orocos/async/ports.rb', line 246

def initialize(async_task,port,options=Hash.new)
    super
    @readers = Array.new
end

Instance Method Details

#add_listener(listener) ⇒ Object



343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
# 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_sampleObject



251
252
253
# 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) ⇒ Object



287
288
289
290
291
292
293
294
295
296
297
298
299
300
# 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) ⇒ Object



302
303
304
305
306
307
308
309
310
311
312
313
314
315
# 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) ⇒ Object



259
260
261
262
# File 'lib/orocos/async/ports.rb', line 259

def options=(options)
    super
    @global_reader = nil
end

#period=(value) ⇒ Object



317
318
319
320
# 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_sampleObject



255
256
257
# 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) ⇒ Object



378
379
380
381
382
383
384
385
386
387
# 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) ⇒ Object



264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
# 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) ⇒ Object



322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
# 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) ⇒ Object



362
363
364
365
366
367
368
369
# 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) ⇒ Object



371
372
373
374
375
376
# 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