class SimpleWiimote

Attributes

led[RW]
rumble[RW]
terminator[RW]

Public Class Methods

new(debug: false) click to toggle source
# File lib/simple_wiimote.rb, line 40
def initialize(debug: false)
  
  @debug = debug

  puts 'Put Wiimote in discoverable mode now (press 1+2)...'
  
  @wiimote = WiiMote.new
  @wiimote.rpt_mode = WiiMote::RPT_BTN | WiiMote::RPT_ACC
  @wiimote.active = false
          
  btn_states = %w(press down up)
  buttons = %w(2 1 b a minus void1 void2 home left right down up plus)
  
  @events = buttons.inject({}) do |r,x|
    
    h = btn_states.inject({}) do |r,state|
      
      label = ("on_button" + state).to_sym

      event = lambda do |wm| 
        method_name = ("on_btn_%s_%s" % [x, state]).to_sym
        method(method_name).call(wm) if self.respond_to? method_name
      end

      r.merge label => event
    end
    r.merge x => h
  end

  @events['void1'] = @events['void2'] = nil
  @terminator = ['1','2']    
  @led = 4.times.map { Led.new self}
  
end

Public Instance Methods

activate() { |wiimote| ... } click to toggle source
# File lib/simple_wiimote.rb, line 75
def activate()
  
  previously_pressed, pressed = [], []
  
  button = {
      press: proc   {|x, wiimote| x[:on_buttonpress].call wiimote},
       down: lambda {|x, wiimote| x[:on_buttondown].call  wiimote},
         up: proc   {|x, wiimote| x[:on_buttonup].call    wiimote}
  }
  
  begin
    
    @wiimote.get_state
    @wiimote.active = true
    sleep 0.01
    yield(@wiimote) if block_given?  
    sleep 0.01

    if @wiimote.buttons > 0 then

      val = @wiimote.buttons
      
      @events.keys.reverse.each_with_index do |x,i|          

        n = @events.length - 1 - i
        next if x == 32 or x == 64
        
        xval = 2**n
        (val -= xval; pressed << x) if xval <= val

      end
      
      puts ('@terminator: ' + @terminator.inspect).debug if @debug
      puts ('pressed: ' + pressed.inspect).debug if @debug
      
      @wiimote.active = (not ([@terminator].flatten & pressed) == @terminator)
          
      new_keypresses     = pressed            -  previously_pressed
      expired_keypresses = previously_pressed -  pressed

      previously_pressed = pressed      

      new_keypresses.each do |x| 
        button[:press].call(@events[x], @wiimote)
      end
      
      pressed.each do |x|
        button[:down].call(@events[x], @wiimote)
      end        
      
      expired_keypresses.each do |x| 
        button[:up].call(@events[x], @wiimote)
      end

      pressed = []
    else
      
      if previously_pressed.length > 0 then
        
        expired_keypresses = previously_pressed

        expired_keypresses.each do |x|
          button[:up].call(@events[x], @wiimote)
        end
        
        previously_pressed, expired_keypressed, pressed = [], [], []    
      end
    end

  end until ( not @wiimote.active )
  
  on_deactivated()
  
end
close() click to toggle source
# File lib/simple_wiimote.rb, line 152
def close()        @wiimote.close  end
on_ledchange() click to toggle source
# File lib/simple_wiimote.rb, line 154
def on_ledchange()
  @wiimote.led = @led.map(&:state).reverse.join.to_i(2)
end
rumble=(bool) click to toggle source
# File lib/simple_wiimote.rb, line 151
def rumble=(bool)  @rumble = @wiimote.rumble = bool  end

Protected Instance Methods

on_btn_1_press(wm) click to toggle source
# File lib/simple_wiimote.rb, line 161
def on_btn_1_press(wm)      puts 'button 1 pressed'     end
on_btn_2_press(wm) click to toggle source
# File lib/simple_wiimote.rb, line 160
def on_btn_2_press(wm)      puts 'button 2 pressed'     end
on_btn_a_press(wm) click to toggle source
# File lib/simple_wiimote.rb, line 163
def on_btn_a_press(wm)      puts 'button a pressed'     end
on_btn_b_down(wm) click to toggle source
# File lib/simple_wiimote.rb, line 176
def on_btn_b_down(wm)
  puts 'button b down: ' + wm.acc.inspect       
end
on_btn_b_press(wm) click to toggle source
# File lib/simple_wiimote.rb, line 162
def on_btn_b_press(wm)      puts 'button b pressed'     end
on_btn_b_up(wm) click to toggle source
# File lib/simple_wiimote.rb, line 174
def on_btn_b_up(wm)         puts 'button b up'          end
on_btn_down_press(wm) click to toggle source
# File lib/simple_wiimote.rb, line 170
def on_btn_down_press(wm)   puts 'button down pressed'  end
on_btn_home_press(wm) click to toggle source
# File lib/simple_wiimote.rb, line 167
def on_btn_home_press(wm)   puts 'button home pressed'  end
on_btn_left_press(wm) click to toggle source
# File lib/simple_wiimote.rb, line 168
def on_btn_left_press(wm)   puts 'button left pressed'  end
on_btn_minus_press(wm) click to toggle source
# File lib/simple_wiimote.rb, line 164
def on_btn_minus_press(wm)  puts 'button minus pressed' end
on_btn_plus_press(wm) click to toggle source
# File lib/simple_wiimote.rb, line 172
def on_btn_plus_press(wm)   puts 'button plus pressed'  end
on_btn_right_press(wm) click to toggle source
# File lib/simple_wiimote.rb, line 169
def on_btn_right_press(wm)  puts 'button right pressed' end
on_btn_up_press(wm) click to toggle source
# File lib/simple_wiimote.rb, line 171
def on_btn_up_press(wm)     puts 'button up pressed'    end
on_btn_void1_press(wm) click to toggle source
# File lib/simple_wiimote.rb, line 165
def on_btn_void1_press(wm)  puts 'button void1 pressed' end
on_btn_void2_press(wm) click to toggle source
# File lib/simple_wiimote.rb, line 166
def on_btn_void2_press(wm)  puts 'button void2 pressed' end
on_deactivated() click to toggle source
# File lib/simple_wiimote.rb, line 180
def on_deactivated()
  puts 'wiimote deactivated'
end