code: 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
docs: Opens the device.
  
   Returns the device.