class UVC::UVCDevice

Constants

KNOWN_CONTROLS

mapping size: 1 | unsigned number => C size: 1 | signed number => c size: 2 | unsigned number => v size: 2 | signed number => s< size: 4 | unsigned number => V size: 4 | signed number => l<

Attributes

descriptors[R]

Public Class Methods

devices() click to toggle source
# File lib/uvc.rb, line 653
def self.devices
        libusb.devices(bClass: 0xef, bSubClass: 0x02, bProtocol: 1)
end
libusb() click to toggle source
# File lib/uvc.rb, line 649
def self.libusb
        @@libusb ||= LIBUSB::Context.new
end
new(setting) click to toggle source
# File lib/uvc.rb, line 667
def initialize(setting)
        @setting = setting
        @descriptors = ClassSpecificVCInterfaceDescriptor.parse_array(setting.extra)
end
video_control_interface_settings_of(device) click to toggle source
# File lib/uvc.rb, line 657
def self.video_control_interface_settings_of(device)
        video_control_interface_settings = device.interfaces.flat_map {|interface|
                interface.alt_settings.select {|setting|
                        setting.bInterfaceClass == CC_VIDEO && setting.bInterfaceSubClass == SC_VIDEOCONTROL
                }
        }
end

Public Instance Methods

camera_terminals() click to toggle source
# File lib/uvc.rb, line 672
def camera_terminals
        @descriptors.select {|i| i.kind_of? CameraTerminalDescriptor }
end
close() click to toggle source
# File lib/uvc.rb, line 710
def close
        handle = @handle
        @handle = nil
        handle.close
end
error_code() click to toggle source
# File lib/uvc.rb, line 741
def error_code
        bRequestErrorCode = @handle.control_transfer(
                bmRequestType: 0b10100001,
                bRequest: GET_CUR,
                wValue: (VC_REQUEST_ERROR_CODE_CONTROL << 8) | 0x00,
                wIndex: @setting.bInterfaceNumber,
                dataIn: 1
        ).unpack("C")[0]
end
extension_units() click to toggle source
# File lib/uvc.rb, line 684
def extension_units
        @descriptors.select {|i| i.kind_of? ExtensionUnitDescriptor }
end
get_info(control_selector, entityID) click to toggle source
# File lib/uvc.rb, line 1056
def get_info(control_selector, entityID)
        Info.new(get_request(GET_INFO, control_selector, entityID, 1).unpack("B8")[0])
end
get_len(control_selector, entityID) click to toggle source
# File lib/uvc.rb, line 1060
def get_len(control_selector, entityID)
        get_request(GET_LEN, control_selector, entityID, 1).unpack("C")[0]
end
get_request(bRequest, control_selector, entityID, length) click to toggle source
# File lib/uvc.rb, line 729
def get_request(bRequest, control_selector, entityID, length)
        @handle.control_transfer(
                bmRequestType: 0b10100001, # video control interface
                bRequest: bRequest,
                wValue: (control_selector << 8) | 0x00,
                wIndex: (entityID << 8) | @setting.bInterfaceNumber,
                dataIn: length
        )
rescue LIBUSB::ERROR_PIPE => e
        raise UVCError.new(error_code)
end
input_terminals() click to toggle source
# File lib/uvc.rb, line 688
def input_terminals
        @descriptors.select {|u| u.kind_of? InputTerminalDescriptor }
end
open() { |handle| ... } click to toggle source
# File lib/uvc.rb, line 696
def open
        @handle = @setting.device.open
        if block_given?
                begin
                        @handle.claim_interface(@setting.bInterfaceNumber)
                        yield @handle
                ensure
                        close
                end
        else
                @handle.claim_interface(@setting.bInterfaceNumber)
        end
end
output_terminals() click to toggle source
# File lib/uvc.rb, line 692
def output_terminals
        @descriptors.select {|u| u.kind_of? OutputTerminalDescriptor }
end
processing_units() click to toggle source
# File lib/uvc.rb, line 676
def processing_units
        @descriptors.select {|i| i.kind_of? ProcessingUnitDescriptor }
end
selector_units() click to toggle source
# File lib/uvc.rb, line 680
def selector_units
        @descriptors.select {|i| i.kind_of? SelectorUnitDescriptor }
end
set_cur(control_selector, entityID, data) click to toggle source
# File lib/uvc.rb, line 1076
def set_cur(control_selector, entityID, data)
        control = KNOWN_CONTROLS.find {|c| c[:selector] == control_selector }
        p [:set_cur, control]
        data = control[:encode].call(data) if control
        set_request(SET_CUR, UVC.const_get(control_selector), entityID, data)
end
set_request(bRequest, control_selector, entityID, data) click to toggle source
# File lib/uvc.rb, line 716
def set_request(bRequest, control_selector, entityID, data)
        warn "set_request: %#04x %#04x %d %p" % [bRequest, control_selector, entityID, data]
        @handle.control_transfer(
                bmRequestType: 0b00100001, # video control interface
                bRequest: bRequest,
                wValue: (control_selector << 8) | 0x00,
                wIndex: (entityID << 8) | @setting.bInterfaceNumber,
                dataOut: data
        )
rescue LIBUSB::ERROR_PIPE => e
        raise UVCError.new(error_code)
end