def open
      if open?
        self.open_count += 1
        if open_count < 1
          HIDAPI.debug "open_count for open device #{path} is #{open_count}"
          self.open_count = 1
        end
        return self
      end
      self.open_count = 0
      begin
        self.handle = usb_device.open
        raise 'no handle returned' unless handle

        begin
          if handle.kernel_driver_active?(interface)
            handle.detach_kernel_driver(interface)
          end
        rescue LIBUSB::ERROR_NOT_SUPPORTED
          HIDAPI.debug 'cannot determine kernel driver status, continuing to open device'
        end

        handle.claim_interface(interface)

        self.input_endpoint = self.output_endpoint = nil

        # now we need to find the endpoints.
        usb_device.settings
            .keep_if {|item| item.bInterfaceNumber == interface}
            .each do |intf_desc|
          intf_desc.endpoints.each do |ep|
            if ep.transfer_type == :interrupt
              if input_endpoint.nil? && ep.direction == :in
                self.input_endpoint = ep.bEndpointAddress
                self.input_ep_max_packet_size = ep.wMaxPacketSize
              end
              if output_endpoint.nil? && ep.direction == :out
                self.output_endpoint = ep.bEndpointAddress
              end
            end
            break if input_endpoint && output_endpoint
          end
        end

        # output_ep is optional, input_ep is required
        raise 'failed to locate input endpoint' unless input_endpoint

        # start the read thread
        self.input_reports = []
        self.thread_initialized = false
        self.shutdown_thread = false
        self.thread = Thread.start(self) { |dev| dev.send(:execute_read_thread) }
        sleep 0.001 until thread_initialized

      rescue =>e
        handle.close rescue nil
        self.handle = nil
        HIDAPI.debug "failed to open device #{path}: #{e.inspect}"
        raise DeviceOpenFailed, e.inspect
      end
      HIDAPI.debug "opened device #{path}"
      self.open_count = 1
      self
    end
def open
      if open?
        self.open_count += 1
        if open_count < 1
          HIDAPI.debug "open_count for open device #{path} is #{open_count}"
          self.open_count = 1
        end
        return self
      end
      self.open_count = 0
      begin
        self.handle = usb_device.open
        raise 'no handle returned' unless handle

        begin
          if handle.kernel_driver_active?(interface)
            handle.detach_kernel_driver(interface)
          end
        rescue LIBUSB::ERROR_NOT_SUPPORTED
          HIDAPI.debug 'cannot determine kernel driver status, continuing to open device'
        end

        handle.claim_interface(interface)

        self.input_endpoint = self.output_endpoint = nil

        # now we need to find the endpoints.
        usb_device.settings
            .keep_if {|item| item.bInterfaceNumber == interface}
            .each do |intf_desc|
          intf_desc.endpoints.each do |ep|
            if ep.transfer_type == :interrupt
              if input_endpoint.nil? && ep.direction == :in
                self.input_endpoint = ep.bEndpointAddress
                self.input_ep_max_packet_size = ep.wMaxPacketSize
              end
              if output_endpoint.nil? && ep.direction == :out
                self.output_endpoint = ep.bEndpointAddress
              end
            end
            break if input_endpoint && output_endpoint
          end
        end

        # output_ep is optional, input_ep is required
        raise 'failed to locate input endpoint' unless input_endpoint

        # start the read thread
        self.input_reports = []
        self.thread_initialized = false
        self.shutdown_thread = false
        self.thread = Thread.start(self) { |dev| dev.send(:execute_read_thread) }
        sleep 0.001 until thread_initialized

      rescue =>e
        handle.close rescue nil
        self.handle = nil
        HIDAPI.debug "failed to open device #{path}: #{e.inspect}"
        raise DeviceOpenFailed, e.inspect
      end
      HIDAPI.debug "opened device #{path}"
      self.open_count = 1
      self
    end
Opens the device.

 Returns the device.