Move device handle to newUSBTransfer args, remove separate attach()

This commit is contained in:
Sebastian Zagrodzki
2017-02-14 01:24:20 +01:00
parent 16f99ed0b0
commit 0ba09a9942
2 changed files with 11 additions and 10 deletions

View File

@@ -62,11 +62,10 @@ func (e *endpoint) transfer(buf []byte, timeout time.Duration) (int, error) {
} }
tt := e.TransferType() tt := e.TransferType()
t, err := newUSBTransfer(e.EndpointInfo, buf, timeout) t, err := newUSBTransfer(e.Device.handle, e.EndpointInfo, buf, timeout)
if err != nil { if err != nil {
return 0, err return 0, err
} }
t.attach(e.Device.handle)
defer t.free() defer t.free()
if err := t.submit(); err != nil { if err := t.submit(); err != nil {

View File

@@ -35,17 +35,16 @@ func xfer_callback(cptr unsafe.Pointer) {
} }
type usbTransfer struct { type usbTransfer struct {
// xfer is the allocated libusb_transfer.
xfer *C.struct_libusb_transfer xfer *C.struct_libusb_transfer
// buf is the buffer allocated for the transfer. Both buf and xfer.buffer
// point to the same piece of memory.
buf []byte buf []byte
// done is blocking until the transfer is complete and data and transfer
// status are available.
done chan struct{} done chan struct{}
} }
type deviceHandle *C.libusb_device_handle
func (t *usbTransfer) attach(dev deviceHandle) {
t.xfer.dev_handle = dev
}
func (t *usbTransfer) submit() error { func (t *usbTransfer) submit() error {
t.done = make(chan struct{}) t.done = make(chan struct{})
t.xfer.user_data = (unsafe.Pointer)(&t.done) t.xfer.user_data = (unsafe.Pointer)(&t.done)
@@ -80,7 +79,9 @@ func (t *usbTransfer) free() error {
return nil return nil
} }
func newUSBTransfer(ei EndpointInfo, buf []byte, timeout time.Duration) (*usbTransfer, error) { type deviceHandle *C.libusb_device_handle
func newUSBTransfer(dev deviceHandle, ei EndpointInfo, buf []byte, timeout time.Duration) (*usbTransfer, error) {
var isoPackets int var isoPackets int
tt := ei.TransferType() tt := ei.TransferType()
if tt == TRANSFER_TYPE_ISOCHRONOUS { if tt == TRANSFER_TYPE_ISOCHRONOUS {
@@ -92,6 +93,7 @@ func newUSBTransfer(ei EndpointInfo, buf []byte, timeout time.Duration) (*usbTra
return nil, fmt.Errorf("libusb_alloc_transfer(%d) failed", isoPackets) return nil, fmt.Errorf("libusb_alloc_transfer(%d) failed", isoPackets)
} }
xfer.dev_handle = dev
xfer.timeout = C.uint(timeout / time.Millisecond) xfer.timeout = C.uint(timeout / time.Millisecond)
xfer.endpoint = C.uchar(ei.Address) xfer.endpoint = C.uchar(ei.Address)
xfer._type = C.uchar(tt) xfer._type = C.uchar(tt)