From 00dbfd23dd3734336965303420122e76a4377d39 Mon Sep 17 00:00:00 2001 From: Sebastian Zagrodzki Date: Sun, 26 Feb 2017 21:02:29 +0100 Subject: [PATCH] done channel is now initialized on submit. add a data() method, to avoid reaching into any xfer fields. --- usb/libusb.go | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/usb/libusb.go b/usb/libusb.go index d5412a9..b708fb6 100644 --- a/usb/libusb.go +++ b/usb/libusb.go @@ -70,13 +70,13 @@ type libusbIntf interface { release(*libusbDevHandle, uint8) setAlt(*libusbDevHandle, uint8, uint8) error - // endpoint + // transfer alloc(*libusbDevHandle, uint8, TransferType, time.Duration, int, []byte) (*libusbTransfer, error) cancel(*libusbTransfer) error - submit(*libusbTransfer) error + submit(*libusbTransfer, chan struct{}) error + data(*libusbTransfer) (int, TransferStatus) free(*libusbTransfer) setIsoPacketLengths(*libusbTransfer, uint32) - compactIsoData(*libusbTransfer) (int, TransferStatus) } // libusbImpl is an implementation of libusbIntf using real CGo-wrapped libusb. @@ -91,7 +91,7 @@ func (libusbImpl) init() (*libusbContext, error) { } func (libusbImpl) handleEvents(c *libusbContext, done <-chan struct{}) { - tv := C.struct_timeval{tv_sec: 10} + tv := C.struct_timeval{tv_usec: 100e3} for { select { case <-done: @@ -346,10 +346,20 @@ func (libusbImpl) cancel(t *libusbTransfer) error { return fromUSBError(C.libusb_cancel_transfer((*C.struct_libusb_transfer)(t))) } -func (libusbImpl) submit(t *libusbTransfer) error { +func (libusbImpl) submit(t *libusbTransfer, done chan struct{}) error { + t.user_data = (unsafe.Pointer)(&done) return fromUSBError(C.submit((*C.struct_libusb_transfer)(t))) } +func (libusbImpl) data(t *libusbTransfer) (int, TransferStatus) { + if TransferType(t._type) == TRANSFER_TYPE_ISOCHRONOUS { + var status TransferStatus + n := int(C.compact_iso_data((*C.struct_libusb_transfer)(t), (*C.uchar)(unsafe.Pointer(&status)))) + return n, status + } + return int(t.actual_length), TransferStatus(t.status) +} + func (libusbImpl) free(t *libusbTransfer) { C.libusb_free_transfer((*C.struct_libusb_transfer)(t)) } @@ -358,12 +368,6 @@ func (libusbImpl) setIsoPacketLengths(t *libusbTransfer, length uint32) { C.libusb_set_iso_packet_lengths((*C.struct_libusb_transfer)(t), C.uint(length)) } -func (libusbImpl) compactIsoData(t *libusbTransfer) (int, TransferStatus) { - var status TransferStatus - n := int(C.compact_iso_data((*C.struct_libusb_transfer)(t), (*C.uchar)(unsafe.Pointer(&status)))) - return n, status -} - // libusb is an injection point for tests var libusb libusbIntf = libusbImpl{}