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, )
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, )
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
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)]