class HumbleRPi

Public Class Methods

new(device_name: 'rpi', sps_address: nil, sps_port: 59000, \ plugins: {}, group_id: 'root') click to toggle source
# File lib/humble_rpi.rb, line 20
def initialize(device_name: 'rpi', sps_address: nil, sps_port: 59000, \
                                            plugins: {}, group_id: 'root')

  @device_name, @sps_address, @sps_port = device_name, sps_address, sps_port
  @group_id = group_id
  
  @publisher, @subscriber = sps_address ?  initialize_sps() \
                                              :  [DummyNotifier.new, nil]    

  @plugins = initialize_plugins(plugins || [])    
  
  at_exit do
    
    @plugins.each do |x|
      if x.respond_to? :on_exit then
        puts 'stopping ' + x.inspect
        Thread.new { x.on_exit() }
      end
    end
    
  end

end

Public Instance Methods

ontopic(topic, msg) click to toggle source

triggered from a sps-sub callback

# File lib/humble_rpi.rb, line 46
def ontopic(topic, msg)

  component = topic[/\w+$/]

  method_name = "on_#{component}_message".to_sym

  @plugins.each do |x|      

    if x.respond_to? method_name then
      x.method(method_name).call(msg)
    end

  end
end
start() click to toggle source
# File lib/humble_rpi.rb, line 61
def start()

  @plugins.each do |x|
    
    if x.respond_to? :on_start then
      
      puts 'starting ' + x.inspect
      
      Thread.new do  
        
        begin
          x.on_start() 
        rescue
          puts 'problem with ' + x.to_s
          puts 'retryng ...'
          retry
        end
        
      end
      
    end
  end
      
  if @subscriber then
          
    Thread.new do
      sp = SPSSubPing.new host: @sps_address, port: @sps_port, \
                 identifier: "HumbleRPi/%s/%s" % [@group_id, @device_name]
      sp.start
    end      

    subtopics = %w(output do)
    topics = subtopics\
        .map {|x| "HumbleRPi/%s/%s/%s/#" % [@group_id, @device_name, x]}\
                                                                 .join(' | ')
    @subscriber.subscribe topic: topics
    
  else
    loop while true
  end
  
end

Private Instance Methods

initialize_plugins(plugins) click to toggle source
# File lib/humble_rpi.rb, line 118
def initialize_plugins(plugins)

  @plugins = plugins.inject([]) do |r, plugin|
    
    name, settings = plugin
    return r if settings[:active] == false and !settings[:active]
    
    klass_name = 'HumbleRPiPlugin' + name.to_s

    device_id = "HumbleRPi/%s/%s" % [@group_id, @device_name]
    vars = {device_id: device_id, notifier: @publisher}

    r << Kernel.const_get(klass_name)\
                                  .new(settings: settings, variables: vars)
    def r.to_s()
      klass_name
    end
    
    r
  end
end
initialize_sps() click to toggle source
# File lib/humble_rpi.rb, line 107
def initialize_sps()

  publisher = SPSPub.new address: @sps_address, port: @sps_port
  publisher.notice  "HumbleRPi/%s/%s/info: initialized" \
                                            % [@group_id, @device_name]
  subscriber = SPSSub.new address: @sps_address, port: @sps_port,\
                                                             callback: self
  [publisher, subscriber]
  
end