class Usblamp::Controller

Controller class

Constants

INIT_PACKET1
INIT_PACKET2
PRODUCT_ID
VENDOR_ID

Attributes

color[RW]
device[RW]

Public Class Methods

new() click to toggle source
# File lib/usblamp/controller.rb, line 12
def initialize
  @device = nil
  @color = nil
end

Public Instance Methods

fade_in(delay, new_color) click to toggle source
# File lib/usblamp/controller.rb, line 69
def fade_in(delay, new_color)
  delay = delay.to_i
  color = Color.new
  max_value = [new_color.red, new_color.green, new_color.blue].max
  (0..max_value).each do |i|
    sleep((delay.to_f * 1000.to_f / max_value.to_f + 1.to_f) / 1000.to_f)
    color.red = transition(i,
                           @color.red,
                           new_color.red,
                           max_value)
    color.green = transition(i,
                             @color.green,
                             new_color.green,
                             max_value)
    color.blue = transition(i,
                            @color.blue,
                            new_color.blue,
                            max_value)
    send_color(color)
  end
end
open() click to toggle source
# File lib/usblamp/controller.rb, line 17
def open
  usb = LIBUSB::Context.new
  device = usb.devices(idVendor: VENDOR_ID, idProduct: PRODUCT_ID).first

  fail 'Could no find a supported device.' if device.nil?
  @device = device.open
  @device.detach_kernel_driver(0) if @device.kernel_driver_active?(0)
  @device.claim_interface(0)
  send(INIT_PACKET1)
  send(INIT_PACKET2)
end
parse(args) click to toggle source
# File lib/usblamp/controller.rb, line 63
def parse(args)
  color = Color.new(args[:c]) unless args[:c].nil?
  color = Color.new(args[:r], args[:g], args[:b]) if args[:c].nil?
  color
end
send(data) click to toggle source
# File lib/usblamp/controller.rb, line 29
def send(data)
  return true if @device
    .control_transfer(
                      bmRequestType: LIBUSB::REQUEST_TYPE_CLASS |
                      LIBUSB::RECIPIENT_INTERFACE,
                      bRequest: LIBUSB::REQUEST_SET_CONFIGURATION,
                      wValue: 0x81,
                      wIndex: LIBUSB::ENDPOINT_OUT,
                      dataOut: data.map(&:chr).reduce(:+),
                      timeout: 10) == 8

  false
end
send_color(color) click to toggle source
# File lib/usblamp/controller.rb, line 43
def send_color(color)
  fail TypeError, 'Parameter must be an instance of Color' unless
    color.is_a?(Color)

  @color = color
  data = [color.red,
          color.green,
          color.blue,
          0x00,
          0x00,
          0x00,
          0x00,
          0x05]
  send(data)
end
switch_off() click to toggle source
# File lib/usblamp/controller.rb, line 59
def switch_off
  send_color(Color.new('black'))
end

Private Instance Methods

transition(index, start_point, end_point, maximum) click to toggle source
# File lib/usblamp/controller.rb, line 102
def transition(index, start_point, end_point, maximum)
  (((start_point.to_f + (end_point.to_f - start_point.to_f)) *
    (index.to_f + 1.to_f)
    ) / maximum.to_f
   ).to_i
end