Example #1
0
 def testSetIsochronous(self):
     """
     Simplest test: feed some data, must not raise.
     Also, test setBuffer/getBuffer/getISOBufferList/iterISO.
     """
     iso_transfer_count = 16
     transfer = self.getTransfer(iso_transfer_count)
     self._testTransferSetter(transfer, 'setIsochronous')
     # Returns whole buffers
     self.assertEqual(
         bytearray(itertools.chain(*transfer.getISOBufferList())),
         buff,
     )
     # Returns actually transfered data, so here nothing
     self.assertEqual(bytearray(
         itertools.chain(*[x for _, x in transfer.iterISO()])),
         bytearray(),
     )
     # Fake reception of whole transfers
     c_transfer = getattr(
       transfer,
       '_' + transfer.__class__.__name__ + '__transfer'
     )
     for iso_metadata in libusb1.get_iso_packet_list(c_transfer):
         iso_metadata.actual_length = iso_metadata.length
     # Now iterISO returns everythig
     self.assertEqual(bytearray(
         itertools.chain(*[x for _, x in transfer.iterISO()])),
         buff,
     )
Example #2
0
 def testSetIsochronous(self):
     """
     Simplest test: feed some data, must not raise.
     Also, test setBuffer/getBuffer/getISOBufferList/iterISO.
     """
     iso_transfer_count = 16
     transfer = self.getTransfer(iso_transfer_count)
     self._testTransferSetter(transfer, 'setIsochronous')
     # Returns whole buffers
     self.assertEqual(
         bytearray(itertools.chain(*transfer.getISOBufferList())),
         buff,
     )
     # Returns actually transfered data, so here nothing
     self.assertEqual(
         bytearray(itertools.chain(*[x for _, x in transfer.iterISO()])),
         bytearray(),
     )
     # Fake reception of whole transfers
     c_transfer = getattr(transfer,
                          '_' + transfer.__class__.__name__ + '__transfer')
     for iso_metadata in libusb1.get_iso_packet_list(c_transfer):
         iso_metadata.actual_length = iso_metadata.length
     # Now iterISO returns everythig
     self.assertEqual(
         bytearray(itertools.chain(*[x for _, x in transfer.iterISO()])),
         buff,
     )
Example #3
0
    def setIsochronous(self, endpoint, buffer_or_len, callback=None,
            user_data=None, timeout=0, iso_transfer_length_list=None):
        """
        Setup transfer for isochronous use.

        endpoint: endpoint to submit transfer to (implicitly sets transfer
          direction).
        buffer_or_len: either a string (when sending data), or expected data
          length (when receiving data)
        callback: function to call upon event. Called with transfer as
          parameter, return value ignored.
        user_data: to pass some data to/from callback
        timeout: in milliseconds, how long to wait for devices acknowledgement
          or data. Set to 0 to disable.
        iso_transfer_length_list: list of individual transfer sizes. If not
          provided, buffer_or_len's size will be divided evenly among the
          number of ISO transfers given to receive current instance, rounded
          down. Providing a list allows overriding this (both the number of
          ISO transfers and their individual lengths).
        """
        if self.__submitted:
            raise ValueError('Cannot alter a submitted transfer')
        num_iso_packets = self.__num_iso_packets
        if num_iso_packets == 0:
            raise TypeError('This transfer canot be used for isochronous I/O. '
                'You must get another one with a non-zero iso_packets '
                'parameter.')
        string_buffer = create_binary_buffer(buffer_or_len)
        buffer_length = sizeof(string_buffer)
        if iso_transfer_length_list is None:
            iso_length = buffer_length / num_iso_packets
            iso_transfer_length_list = [iso_length for _ in
                xrange(num_iso_packets)]
        configured_iso_packets = len(iso_transfer_length_list)
        if configured_iso_packets > num_iso_packets:
            raise ValueError('Too many ISO transfer lengths (%i), there are '
                'only %i ISO transfers available' % (configured_iso_packets,
                    num_iso_packets))
        if sum(iso_transfer_length_list) > buffer_length:
            raise ValueError('ISO transfers too long (%i), there are only '
                '%i bytes available' % (sum(iso_transfer_length_list),
                    buffer_length))
        transfer_p = self.__transfer
        self.__initialized = False
        libusb1.libusb_fill_iso_transfer(transfer_p, self.__handle,
            endpoint, string_buffer, buffer_length, num_iso_packets,
            self.__ctypesCallbackWrapper, user_data, timeout)
        for length, iso_packet_desc in zip(iso_transfer_length_list,
                libusb1.get_iso_packet_list(transfer_p)):
            if length <= 0:
                raise ValueError('Negative/null transfer length are not '
                    'possible.')
            iso_packet_desc.length = length
        self.__callback = callback
        self.__initialized = True
Example #4
0
 def getISOSetupList(self):
     """
     Get individual ISO transfer's setup.
     Returns a list of dicts, each containing an individual ISO transfer
     parameters:
     - length
     - actual_length
     - status
     (see libusb1's API documentation for their signification)
     Should not be called on a submitted transfer (except for 'length'
     values).
     """
     transfer_p = self.__transfer
     transfer = transfer_p.contents
     if transfer.type != libusb1.LIBUSB_TRANSFER_TYPE_ISOCHRONOUS:
         raise TypeError('This method cannot be called on non-iso '
             'transfers.')
     return [{
             'length': x.length,
             'actual_length': x.actual_length,
             'status': x.status,
         } for x in libusb1.get_iso_packet_list(transfer_p)]