class Dozen

Public Class Methods

VERSION() click to toggle source
# File lib/dozen.rb, line 59
def self.VERSION
  '1.1.0'
end
new() click to toggle source
# File lib/dozen.rb, line 5
def initialize
  @usb = LIBUSB::Context.new
  @devices = query_usb_for_sixaxis_devices
  if @devices.length == 0
    puts "No Sixaxis controllers connected via USB."
  end
end
parse_bluetooth_address(raw_address) click to toggle source
# File lib/dozen.rb, line 43
def self.parse_bluetooth_address(raw_address)
  begin
    preparedAddress = raw_address.split(':').map{ |x| Integer("0x" + x)}
  rescue
    return false
  end
  return false if preparedAddress.length != 6
  return false if preparedAddress.any? {|x| x < 0 || x > 0xFF}
  preparedAddress
end
show_header() click to toggle source
# File lib/dozen.rb, line 54
def self.show_header
  puts "Dozen v#{Dozen.VERSION}"
  puts
end

Public Instance Methods

assign_address_to_all(address) click to toggle source
# File lib/dozen.rb, line 34
def assign_address_to_all(address)
  @devices.each_with_index do |device, index|
    device.open do |handle|
      puts "Assigning address #{formatAddress(address)} to controller ##{index}"
      assign_master_to_handle(address, handle)
    end
  end
end
assign_address_to_controller(address, controller_index) click to toggle source
# File lib/dozen.rb, line 22
def assign_address_to_controller(address, controller_index)
  if @devices[controller_index].nil?
    puts "No device available at index #{controller_index}"
    return
  end

  @devices[controller_index].open do |handle|
    puts "Assigning address #{formatAddress(address)} to controller ##{controller_index}"
    assign_master_to_handle(address, handle)
  end
end
list_controllers() click to toggle source
# File lib/dozen.rb, line 13
def list_controllers
  @devices.each_with_index do |device, index|
    device.open do |handle|
      master = get_device_master_from_handle(handle)
      puts "Controller ##{index} is paired with #{master.each_byte.map { |b| b.to_s(16) }.join(':')}"
    end
  end
end

Private Instance Methods

assign_master_to_handle(address, handle) click to toggle source
# File lib/dozen.rb, line 83
def assign_master_to_handle(address, handle)
  msg = ([0x01, 0x00] + address).pack('c*')
  handle.control_transfer(
    :bmRequestType => LIBUSB::REQUEST_TYPE_CLASS | LIBUSB::ENDPOINT_OUT | LIBUSB::RECIPIENT_INTERFACE,
    :bRequest => 0x09,
    :wValue => 0x03f5,
    :wIndex => 0x0000,
    :dataOut => msg,
    :timeout => 5000)
end
formatAddress(address) click to toggle source
# File lib/dozen.rb, line 65
def formatAddress(address)
  address.map{|x| x.to_s(16)}.join(':')
end
get_device_master_from_handle(handle) click to toggle source
# File lib/dozen.rb, line 73
def get_device_master_from_handle(handle)
  handle.control_transfer(
    :bmRequestType => LIBUSB::REQUEST_TYPE_CLASS | LIBUSB::ENDPOINT_IN | LIBUSB::RECIPIENT_INTERFACE,
    :bRequest => 0x01,
    :wValue => 0x03f5,
    :wIndex => 0x0000,
    :dataIn => 8,
    :timeout => 5000)[2,6]
end
query_usb_for_sixaxis_devices() click to toggle source
# File lib/dozen.rb, line 69
def query_usb_for_sixaxis_devices
  @usb.devices(:idVendor => 0x054c, :idProduct => 0x0268)
end