class RfRgb::Keyboard

Constants

ENDPOINT_IN
ENDPOINT_OUT
INTERFACE
PRODUCT_ID
VENDOR_ID

Attributes

device[R]
handle[R]

Public Class Methods

all() click to toggle source
# File lib/rf_rgb/keyboard.rb, line 11
def self.all
  context = LIBUSB::Context.new
  context.debug = LIBUSB_DEBUG
  context.devices(idVendor: VENDOR_ID, idProduct: PRODUCT_ID)
end
first() click to toggle source
# File lib/rf_rgb/keyboard.rb, line 17
def self.first
  all.first
end
new(device = RfRgb::Keyboard.first) click to toggle source
# File lib/rf_rgb/keyboard.rb, line 31
def initialize(device = RfRgb::Keyboard.first)
  @device = device
  @handle = initialize_device(device)
end
run_and_release(device = RfRgb::Keyboard.first) { |keyboard| ... } click to toggle source
# File lib/rf_rgb/keyboard.rb, line 21
def self.run_and_release(device = RfRgb::Keyboard.first, &block)
  keyboard = nil
  begin
    keyboard = new(device)
    yield keyboard
  ensure
    keyboard&.release_to_os
  end
end

Public Instance Methods

actuation_height=(new_height) click to toggle source
# File lib/rf_rgb/keyboard.rb, line 120
def actuation_height=(new_height)
  if new_height.is_a? String
    send_and_verify RfRgb::Protocol.change_actuation_height_all(new_height)
  else
    calls = RfRgb::Protocol.user_specified_actuation_heights(new_height)
    reset_effect
    calls.each do |call|
      send_and_verify call
    end
  end
end
Also aliased as: actuation_heights=
actuation_heights=(new_height)
Alias for: actuation_height=
brightness=(new_brightness) click to toggle source
# File lib/rf_rgb/keyboard.rb, line 116
def brightness=(new_brightness)
  send_and_verify RfRgb::Protocol.change_brightness(new_brightness)
end
color=(new_colors)
Alias for: colors=
colors=(new_colors) click to toggle source
# File lib/rf_rgb/keyboard.rb, line 51
def colors=(new_colors)
  if new_colors.is_a? String
    new_colors = {default: new_colors}
  end

  calls = RfRgb::Protocol.user_specified_colors(new_colors)
  reset_effect
  calls.each do |call|
    send_and_verify call
  end
end
Also aliased as: color=
disable_effect() click to toggle source
# File lib/rf_rgb/keyboard.rb, line 46
def disable_effect
  reset_effect
  send_and_verify RfRgb::Protocol.disable_effects
end
effect_color_bar() click to toggle source
# File lib/rf_rgb/keyboard.rb, line 94
def effect_color_bar
  reset_effect
  send_and_verify RfRgb::Protocol.color_bar
end
effect_demo_mode() click to toggle source
# File lib/rf_rgb/keyboard.rb, line 84
def effect_demo_mode
  reset_effect
  send_and_verify RfRgb::Protocol.demo_mode
end
effect_pressed_key(rgb_hex) click to toggle source
# File lib/rf_rgb/keyboard.rb, line 69
def effect_pressed_key(rgb_hex)
  reset_effect
  send_and_verify RfRgb::Protocol.pressed_key_lighting(rgb_hex)
end
effect_pressed_key_with_backlight(rgb_hex) click to toggle source
# File lib/rf_rgb/keyboard.rb, line 74
def effect_pressed_key_with_backlight(rgb_hex)
  reset_effect
  send_and_verify RfRgb::Protocol.pressed_key_lighting_with_backlight(rgb_hex)
end
effect_rainbow_wave() click to toggle source
# File lib/rf_rgb/keyboard.rb, line 64
def effect_rainbow_wave
  reset_effect
  send_and_verify RfRgb::Protocol.rainbow_wave
end
effect_random_lights() click to toggle source
# File lib/rf_rgb/keyboard.rb, line 89
def effect_random_lights
  reset_effect
  send_and_verify RfRgb::Protocol.random_lights
end
effect_shooting_star(rgb_hex, interval) click to toggle source
# File lib/rf_rgb/keyboard.rb, line 79
def effect_shooting_star(rgb_hex, interval)
  reset_effect
  send_and_verify RfRgb::Protocol.shooting_star(rgb_hex, interval)
end
lock_keys() click to toggle source

There's more to key locking than just this, but the way it's done is odd and is among the lowest of priorities on this project.

# File lib/rf_rgb/keyboard.rb, line 101
def lock_keys
  send_and_verify RfRgb::Protocol.key_lock
end
locked_keys=(keys) click to toggle source
# File lib/rf_rgb/keyboard.rb, line 105
def locked_keys=(keys)
  calls = RfRgb::Protocol.user_specified_key_locks(keys)
  calls.each do |call|
    send_and_verify call
  end
end
release_to_os() click to toggle source
# File lib/rf_rgb/keyboard.rb, line 40
def release_to_os
  return unless @handle
  @handle.release_interface(INTERFACE)
  @handle.close
end
save() click to toggle source
# File lib/rf_rgb/keyboard.rb, line 36
def save
  send_and_verify RfRgb::Protocol.save_changes
end
swap_caps_ctrl() click to toggle source
# File lib/rf_rgb/keyboard.rb, line 133
def swap_caps_ctrl
  send_and_verify RfRgb::Protocol.swap_caps_ctrl
end
unlock_keys() click to toggle source
# File lib/rf_rgb/keyboard.rb, line 112
def unlock_keys
  send_and_verify RfRgb::Protocol.key_unlock
end
unswap_caps_ctrl() click to toggle source
# File lib/rf_rgb/keyboard.rb, line 137
def unswap_caps_ctrl
  send_and_verify RfRgb::Protocol.unswap_caps_ctrl
end

Private Instance Methods

initialize_device(device) click to toggle source
# File lib/rf_rgb/keyboard.rb, line 149
def initialize_device(device)
  handle = device.open
  handle.auto_detach_kernel_driver = true
  handle.set_configuration(1) rescue nil
  handle.claim_interface(INTERFACE)
  # handle.clear_halt endpoint0
  handle
end
receive_message() click to toggle source
# File lib/rf_rgb/keyboard.rb, line 166
def receive_message
  @handle.interrupt_transfer(
    endpoint: ENDPOINT_IN,
    dataIn: 64,
    timeout: 10_000
  )
end
reset_effect() click to toggle source

I don't know what this actually does, but the Windows software sends this message before any effect change.

# File lib/rf_rgb/keyboard.rb, line 145
def reset_effect
  send_and_verify RfRgb::Protocol.reset_effect
end
send_and_verify(data, retries = 2) click to toggle source
# File lib/rf_rgb/keyboard.rb, line 174
def send_and_verify(data, retries = 2)
  retry_count = 0
  begin
    send_message data
    ack = receive_message
    verify_message!(data, ack)
  rescue RfRgb::VerificationError
    retry_count += 1
    retry if retry_count <= retries
  end
end
send_message(data) click to toggle source
# File lib/rf_rgb/keyboard.rb, line 158
def send_message(data)
  @handle.interrupt_transfer(
    endpoint: ENDPOINT_OUT,
    dataOut: data,
    timeout: 10_000
  )
end
verify_message(data, ack) click to toggle source

The keyboard acknowledges each packet sent with a response of x55x55x<third byte of sent packet>

# File lib/rf_rgb/keyboard.rb, line 187
def verify_message(data, ack)
  ack.bytes[0..2] == "\x55\x55#{data[2]}".bytes
end
verify_message!(data, ack) click to toggle source
# File lib/rf_rgb/keyboard.rb, line 191
def verify_message!(data, ack)
  unless verify_message(data, ack)
    raise RfRgb::VerificationError, "Ack[#{ack.bytes}] did not match data[#{data.bytes}]!"
  end
end