done channel is now initialized on submit.
add a data() method, to avoid reaching into any xfer fields.
This commit is contained in:
@@ -70,13 +70,13 @@ type libusbIntf interface {
|
|||||||
release(*libusbDevHandle, uint8)
|
release(*libusbDevHandle, uint8)
|
||||||
setAlt(*libusbDevHandle, uint8, uint8) error
|
setAlt(*libusbDevHandle, uint8, uint8) error
|
||||||
|
|
||||||
// endpoint
|
// transfer
|
||||||
alloc(*libusbDevHandle, uint8, TransferType, time.Duration, int, []byte) (*libusbTransfer, error)
|
alloc(*libusbDevHandle, uint8, TransferType, time.Duration, int, []byte) (*libusbTransfer, error)
|
||||||
cancel(*libusbTransfer) error
|
cancel(*libusbTransfer) error
|
||||||
submit(*libusbTransfer) error
|
submit(*libusbTransfer, chan struct{}) error
|
||||||
|
data(*libusbTransfer) (int, TransferStatus)
|
||||||
free(*libusbTransfer)
|
free(*libusbTransfer)
|
||||||
setIsoPacketLengths(*libusbTransfer, uint32)
|
setIsoPacketLengths(*libusbTransfer, uint32)
|
||||||
compactIsoData(*libusbTransfer) (int, TransferStatus)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// libusbImpl is an implementation of libusbIntf using real CGo-wrapped libusb.
|
// 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{}) {
|
func (libusbImpl) handleEvents(c *libusbContext, done <-chan struct{}) {
|
||||||
tv := C.struct_timeval{tv_sec: 10}
|
tv := C.struct_timeval{tv_usec: 100e3}
|
||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
case <-done:
|
case <-done:
|
||||||
@@ -346,10 +346,20 @@ func (libusbImpl) cancel(t *libusbTransfer) error {
|
|||||||
return fromUSBError(C.libusb_cancel_transfer((*C.struct_libusb_transfer)(t)))
|
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)))
|
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) {
|
func (libusbImpl) free(t *libusbTransfer) {
|
||||||
C.libusb_free_transfer((*C.struct_libusb_transfer)(t))
|
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))
|
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
|
// libusb is an injection point for tests
|
||||||
var libusb libusbIntf = libusbImpl{}
|
var libusb libusbIntf = libusbImpl{}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user