From 1909f88be4736480950ddaac8b310b3348b70259 Mon Sep 17 00:00:00 2001 From: iamnicknack <5727098+IAmNickNack@users.noreply.github.com> Date: Wed, 18 Oct 2023 18:46:35 +0100 Subject: [PATCH 1/3] Read expected payload size --- .../com/pi4j/library/pigpio/PiGpioPacket.java | 62 ++++++++++--------- 1 file changed, 34 insertions(+), 28 deletions(-) diff --git a/libraries/pi4j-library-pigpio/src/main/java/com/pi4j/library/pigpio/PiGpioPacket.java b/libraries/pi4j-library-pigpio/src/main/java/com/pi4j/library/pigpio/PiGpioPacket.java index efa4b45d..2d738591 100644 --- a/libraries/pi4j-library-pigpio/src/main/java/com/pi4j/library/pigpio/PiGpioPacket.java +++ b/libraries/pi4j-library-pigpio/src/main/java/com/pi4j/library/pigpio/PiGpioPacket.java @@ -350,23 +350,17 @@ public String dataToString(){ * @throws IOException if an error occurs accessing {@code stream}. */ public static PiGpioPacket decode(InputStream stream) throws IOException { - return PiGpioPacket.decode(stream.readNBytes(stream.available())); - } + // check data length for minimum package size +// int available = stream.available(); +// if(available < 16){ +// throw new IllegalArgumentException("Insufficient number of data bytes bytes received; COUNT=" + available); +// } - /** - *

decode.

- * - * @param data an array of {@link byte} objects. - * @return a {@link com.pi4j.library.pigpio.PiGpioPacket} object. - */ - public static PiGpioPacket decode(byte[] data) { - ByteBuffer rx = ByteBuffer.wrap(data); - rx.order(ByteOrder.LITTLE_ENDIAN); + // read only header bytes + byte[] header = stream.readNBytes(16); - // check data length for minimum package size - if(data.length < 16){ - throw new IllegalArgumentException("Insufficient number of data bytes bytes received; COUNT=" + data.length); - } + ByteBuffer rx = ByteBuffer.wrap(header); + rx.order(ByteOrder.LITTLE_ENDIAN); // parse packet parameters from raw received bytes PiGpioCmd cmd = PiGpioCmd.from(rx.getInt()); // CMD <4 bytes :: 0-3> @@ -376,23 +370,37 @@ public static PiGpioPacket decode(byte[] data) { // create new packet PiGpioPacket packet = new PiGpioPacket(cmd, p1, p2) - .p3(p3); // set RAW P3 value - - // apply any extra payload data (if available) - int remaining = rx.remaining(); + .p3(p3); // set RAW P3 value - // bounds check remaining byte count - if(p3 < remaining) remaining = p3; + int remaining = bytesToRead(packet, stream); - //logger.info("HAS-REMAINING: " + remaining); - if(remaining > 0){ - var temp = new byte[remaining]; - rx.get(temp, 0, remaining); + if(remaining > 0) { + var temp = stream.readNBytes(remaining); packet.data(temp); } return packet; } + /** + * The packet may indicate the number of bytes to expect from the stream. + * + * E.g. I2C packets provide this value via {@link PiGpioPacket#p3} + * + * @param packet the packet being read + * @param stream incoming data + * @return the number of bytes to expect to read from the input stream + * @throws IOException + */ + static int bytesToRead(PiGpioPacket packet, InputStream stream) throws IOException { + switch (packet.cmd) { + case I2CRI: + case I2CRD: + return packet.p3; + default: + return stream.available(); + } + } + /** *

encode.

* @@ -427,6 +435,4 @@ public String toString(){ else return String.format("CMD=%s(%d); P1=%d; P2=%d; P3=%d", cmd().name(), cmd().value(), p1(), p2(), p3()); } -} - - +} \ No newline at end of file From 5b8df97b0800b66994b649cacc45d176618abe7d Mon Sep 17 00:00:00 2001 From: iamnicknack <5727098+IAmNickNack@users.noreply.github.com> Date: Wed, 18 Oct 2023 18:52:00 +0100 Subject: [PATCH 2/3] Use socket timeout to fail on insufficient data --- .../main/java/com/pi4j/library/pigpio/PiGpioPacket.java | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/libraries/pi4j-library-pigpio/src/main/java/com/pi4j/library/pigpio/PiGpioPacket.java b/libraries/pi4j-library-pigpio/src/main/java/com/pi4j/library/pigpio/PiGpioPacket.java index 2d738591..3f6b9222 100644 --- a/libraries/pi4j-library-pigpio/src/main/java/com/pi4j/library/pigpio/PiGpioPacket.java +++ b/libraries/pi4j-library-pigpio/src/main/java/com/pi4j/library/pigpio/PiGpioPacket.java @@ -33,6 +33,7 @@ import java.io.IOException; import java.io.InputStream; +import java.net.SocketOptions; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.charset.StandardCharsets; @@ -350,12 +351,6 @@ public String dataToString(){ * @throws IOException if an error occurs accessing {@code stream}. */ public static PiGpioPacket decode(InputStream stream) throws IOException { - // check data length for minimum package size -// int available = stream.available(); -// if(available < 16){ -// throw new IllegalArgumentException("Insufficient number of data bytes bytes received; COUNT=" + available); -// } - // read only header bytes byte[] header = stream.readNBytes(16); From c0a880b0b3f2a697c74c0c5849d2391beb347100 Mon Sep 17 00:00:00 2001 From: iamnicknack <5727098+IAmNickNack@users.noreply.github.com> Date: Wed, 18 Oct 2023 18:54:32 +0100 Subject: [PATCH 3/3] Remove unused import --- .../src/main/java/com/pi4j/library/pigpio/PiGpioPacket.java | 1 - 1 file changed, 1 deletion(-) diff --git a/libraries/pi4j-library-pigpio/src/main/java/com/pi4j/library/pigpio/PiGpioPacket.java b/libraries/pi4j-library-pigpio/src/main/java/com/pi4j/library/pigpio/PiGpioPacket.java index 3f6b9222..1bbacb04 100644 --- a/libraries/pi4j-library-pigpio/src/main/java/com/pi4j/library/pigpio/PiGpioPacket.java +++ b/libraries/pi4j-library-pigpio/src/main/java/com/pi4j/library/pigpio/PiGpioPacket.java @@ -33,7 +33,6 @@ import java.io.IOException; import java.io.InputStream; -import java.net.SocketOptions; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.charset.StandardCharsets;