FU Logo
  • Startseite
  • Kontakt
  • Impressum
  • Home
  • Listenauswahl
  • Anleitungen

[linux-minidisc] [PATCH 6/6] Implement asynchronous transfers.

<-- thread -->
<-- date -->
  • From: Vincent Pelletier <plr.vincent@gmail.com>
  • To: linux-minidisc@lists.fu-berlin.de
  • Date: Tue, 26 Jan 2010 21:26:03 +0100
  • Domainkey-signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=message-id:in-reply-to:references:from:date:subject:to:x-length :x-uid:mime-version:content-type:content-transfer-encoding; b=SwnG+TgiwdGid2S3jNwJfxh5BIRdnY3LbF5obW7btPlNiAfVB0hNjfvIuA+iXyCVTs KNO9zKrIVl9CgZSW+ARoXws7CdoM6BbKWkAjo1PnqbgGzg5pgZkI58DY1RGr4fdvs0Ex Q7LmdkPT2gut3YibG5h8PPF1FHTnm27sCkBZI=
  • Subject: [linux-minidisc] [PATCH 6/6] Implement asynchronous transfers.

---
 netmd/usb1.py |  106 
++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 105 insertions(+), 1 deletions(-)

diff --git a/netmd/usb1.py b/netmd/usb1.py
index d22f52a..34731b3 100644
--- a/netmd/usb1.py
+++ b/netmd/usb1.py
@@ -1,6 +1,6 @@
 # pyusb compatibility layer for libus-1.0
 import libusb1
-from ctypes import byref, create_string_buffer, c_int
+from ctypes import byref, create_string_buffer, c_int, sizeof, POINTER
 from cStringIO import StringIO
 
 __all__ = ['LibUSBContext']
@@ -162,6 +162,72 @@ class USBDeviceHandle(object):
         transferred = self._interruptTransfer(endpoint, data, length, 
timeout)
         return data.raw[:transferred]
 
+    def _getTransfer(self, iso_packets=0):
+        result = libusb1.libusb_alloc_transfer(iso_packets)
+        if not result:
+            raise libusb1.USBError, 'Unable to get a transfer object'
+        return result
+
+    def fillBulkTransfer(self, transfer, endpoint, string_buffer,
+                         callback, user_data, timeout):
+        libusb1.libusb_fill_bulk_transfer(transfer, self.handle,
+            endpoint, string_buffer, sizeof(string_buffer),
+            libusb1.libusb_transfer_cb_fn_p(callback), user_data,
+            timeout)
+
+    def getBulkTransfer(self, endpoint, string_buffer, callback,
+                        user_data=None, timeout=0):
+        result = self._getTransfer()
+        self.fillBulkTransfer(result, endpoint, string_buffer, callback,
+            user_data, timeout)
+        return result
+
+    def fillInterruptTransfer(self, transfer, endpoint, string_buffer,
+                              callback, user_data, timeout):
+        libusb1.libusb_fill_interrupt_transfer(transfer, self.handle,
+            endpoint, string_buffer,  sizeof(string_buffer),
+            libusb1.libusb_transfer_cb_fn_p(callback), user_data,
+            timeout)
+
+    def getInterruptTransfer(self, endpoint, string_buffer, callback,
+                             user_data=None, timeout=0):
+        result = self._getTransfer()
+        self.fillInterruptTransfer(result, endpoint, string_buffer,
+            callback, user_data, timeout)
+        return result
+
+    def fillControlSetup(self, string_buffer, request_type, request, value,
+			 index, length):
+        libusb1.libusb_fill_control_setup(string_buffer, request_type,
+	    request, value, index, length)
+
+    def fillControlTransfer(self, transfer, setup, callback,
+                            user_data, timeout):
+        libusb1.libusb_fill_control_transfer(transfer, self.handle,
+            setup, libusb1.libusb_transfer_cb_fn_p(callback), user_data,
+	    timeout)
+
+    def getControlTransfer(self, setup, callback, user_data=None, timeout=0):
+        result = self._getTransfer()
+        self.fillControlTransfer(result, setup, callback, user_data, timeout)
+        return result
+
+    def fillISOTransfer(self, *args, **kw):
+        raise NotImplementedError
+
+    def getISOTransfer(self, *args, **kw):
+        raise NotImplementedError
+
+    def submitTransfer(self, transfer):
+        result = libusb1.libusb_submit_transfer(transfer)
+        if result:
+            raise libusb1.USBError, result
+
+    def cancelTransfer(self, transfer):
+        result = libusb1.libusb_cancel_transfer(transfer)
+        if result:
+            raise libusb1.USBError, result
+
 class USBDevice(object):
 
     configuration_descriptor_list = None
@@ -347,3 +413,41 @@ class LibUSBContext(object):
             result = None
         return result
 
+    def getPollFDList(self):
+        pollfd_p_p = libusb1.libusb_get_pollfds(self.context_p)
+        result = []
+        append = result.append
+        fd_index = 0
+        while pollfd_p_p[fd_index]:
+            append((pollfd_p_p[fd_index].contents.fd,
+                    pollfd_p_p[fd_index].contents.events))
+            fd_index += 1
+        return result
+
+    def handleEvents(self):
+        result = libusb1.libusb_handle_events(self.context_p)
+        if result:
+            raise libusb1.USBError, result
+
+    def handleEventsTimeout(self, tv=None):
+        assert tv is None, 'tv parameter is not supported yet'
+        tv = libusb1.timeval(0, 0)
+        result = libusb1.libusb_handle_events_timeout(self.context_p, 
byref(tv))
+        if result:
+            raise libusb1.USBError, result
+
+    def setPollFDNotifiers(self, added_cb=None, removed_cb=None, 
user_data=None):
+        if added_cb is None:
+          added_cb = POINTER(None)
+        else:
+          added_cb = libusb1.libusb_pollfd_added_cb_p(added_cb)
+        if removed_cb is None:
+          removed_cb = POINTER(None)
+        else:
+          removed_cb = libusb1.libusb_pollfd_removed_cb_p(removed_cb)
+        libusb1.libusb_set_pollfd_notifiers(self.context_p, added_cb,
+                                            removed_cb, user_data)
+
+    def getNextTimeout(self):
+        return libusb1.libusb_get_next_timeout(self.context_p, None)
+
-- 
1.6.6




<-- thread -->
<-- date -->
  • linux-minidisc - January 2010 - Archives indexes sorted by:
    [ thread ] [ subject ] [ author ] [ date ]
  • Complete archive of the linux-minidisc mailing list
  • More info on this list...

Hilfe

  • FAQ
  • Dienstbeschreibung
  • ZEDAT Beratung
  • postmaster@lists.fu-berlin.de

Service-Navigation

  • Startseite
  • Listenauswahl

Einrichtung Mailingliste

  • ZEDAT-Portal
  • Mailinglisten Portal