Skip to content

Commit 3755159

Browse files
committed
transferOut() with offset and length
1 parent 3b83cf5 commit 3755159

File tree

5 files changed

+40
-12
lines changed

5 files changed

+40
-12
lines changed

java-does-usb/src/main/java/net/codecrete/usb/USBDevice.java

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -293,11 +293,34 @@ public interface USBDevice {
293293
* </p>
294294
*
295295
* @param endpointNumber the endpoint number (in the range between 1 and 127)
296-
* @param timeout the timeout period, in milliseconds (0 for no timeout)
297296
* @param data data to send
297+
* @param timeout the timeout period, in milliseconds (0 for no timeout)
298298
*/
299299
void transferOut(int endpointNumber, byte[] data, int timeout);
300300

301+
/**
302+
* Sends data to this device.
303+
* <p>
304+
* This method blocks until the data has been sent, the timeout period has expired
305+
* or an error has occurred. If the timeout expires, a {@link USBTimeoutException} is thrown.
306+
* </p>
307+
* <p>
308+
* This method can send data to bulk and interrupt endpoints.
309+
* </p>
310+
* <p>
311+
* If the sent data length is a multiple of the packet size, it is often
312+
* required to send an additional zero-length packet (ZLP) for the device
313+
* to actually process the data. This method will not do it automatically.
314+
* </p>
315+
*
316+
* @param endpointNumber the endpoint number (in the range between 1 and 127)
317+
* @param data buffer containing data to send
318+
* @param offset offset of the first byte to send
319+
* @param length number of bytes to send
320+
* @param timeout the timeout period, in milliseconds (0 for no timeout)
321+
*/
322+
void transferOut(int endpointNumber, byte[] data, int offset, int length, int timeout);
323+
301324
/**
302325
* Receives data from this device.
303326
* <p>

java-does-usb/src/main/java/net/codecrete/usb/common/USBDeviceImpl.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -320,11 +320,16 @@ protected int getInterfaceNumber(USBDirection direction, int endpointNumber) {
320320

321321
@Override
322322
public void transferOut(int endpointNumber, byte[] data) {
323-
transferOut(endpointNumber, data, 0);
323+
transferOut(endpointNumber, data, 0, data.length, 0);
324324
}
325325

326326
@Override
327-
public abstract void transferOut(int endpointNumber, byte[] data, int timeout);
327+
public void transferOut(int endpointNumber, byte[] data, int timeout) {
328+
transferOut(endpointNumber, data, 0, data.length, timeout);
329+
}
330+
331+
@Override
332+
public abstract void transferOut(int endpointNumber, byte[] data, int offset, int length, int timeout);
328333

329334
@Override
330335
public byte[] transferIn(int endpointNumber) {

java-does-usb/src/main/java/net/codecrete/usb/linux/LinuxUSBDevice.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -271,10 +271,10 @@ private LinuxTransfer createSyncCtrlTransfer(Arena arena, USBDirection direction
271271
}
272272

273273
@Override
274-
public void transferOut(int endpointNumber, byte[] data, int timeout) {
274+
public void transferOut(int endpointNumber, byte[] data, int offset, int length, int timeout) {
275275
try (var arena = Arena.openConfined()) {
276-
var buffer = arena.allocate(data.length);
277-
buffer.copyFrom(MemorySegment.ofArray(data));
276+
var buffer = arena.allocate(length);
277+
buffer.copyFrom(MemorySegment.ofArray(data).asSlice(offset, length));
278278
var transfer = createSyncTransfer(buffer);
279279

280280
synchronized (transfer) {

java-does-usb/src/main/java/net/codecrete/usb/macos/MacosUSBDevice.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -412,18 +412,18 @@ public void controlTransferOut(USBControlTransfer setup, byte[] data) {
412412
}
413413

414414
@Override
415-
public void transferOut(int endpointNumber, byte[] data, int timeout) {
415+
public void transferOut(int endpointNumber, byte[] data, int offset, int length, int timeout) {
416416

417417
EndpointInfo epInfo = getEndpointInfo(endpointNumber, USBDirection.OUT, USBTransferType.BULK,
418418
USBTransferType.INTERRUPT);
419419

420420
try (var arena = Arena.openConfined()) {
421-
var nativeData = arena.allocateArray(JAVA_BYTE, data.length);
422-
nativeData.copyFrom(MemorySegment.ofArray(data));
421+
var nativeData = arena.allocateArray(JAVA_BYTE, length);
422+
nativeData.copyFrom(MemorySegment.ofArray(data).asSlice(offset, length));
423423

424424
var transfer = new MacosTransfer();
425425
transfer.data = nativeData;
426-
transfer.dataSize = data.length;
426+
transfer.dataSize = length;
427427
transfer.completion = USBDeviceImpl::onSyncTransferCompleted;
428428

429429
synchronized (transfer) {

java-does-usb/src/main/java/net/codecrete/usb/windows/WindowsUSBDevice.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -244,10 +244,10 @@ public byte[] controlTransferIn(USBControlTransfer setup, int length) {
244244
}
245245

246246
@Override
247-
public void transferOut(int endpointNumber, byte[] data, int timeout) {
247+
public void transferOut(int endpointNumber, byte[] data, int offset, int length, int timeout) {
248248
try (var arena = Arena.openConfined()) {
249249
var buffer = arena.allocate(data.length);
250-
buffer.copyFrom(MemorySegment.ofArray(data));
250+
buffer.copyFrom(MemorySegment.ofArray(data).asSlice(offset, length));
251251
var transfer = createSyncTransfer(buffer);
252252

253253
synchronized (transfer) {

0 commit comments

Comments
 (0)