From 9deb3fb71f2990eed45fb188491d23b29c0c0cc6 Mon Sep 17 00:00:00 2001 From: dwalend Date: Sun, 17 Jan 2021 22:31:27 -0500 Subject: [PATCH 1/2] GenericMode with a rereader --- src/main/java/ev3dev/sensors/GenericMode.java | 51 ++++++++++++------- .../sensors/nxt/NXTTemperatureSensor.java | 2 + 2 files changed, 35 insertions(+), 18 deletions(-) diff --git a/src/main/java/ev3dev/sensors/GenericMode.java b/src/main/java/ev3dev/sensors/GenericMode.java index 368b7d4c..a744ff03 100644 --- a/src/main/java/ev3dev/sensors/GenericMode.java +++ b/src/main/java/ev3dev/sensors/GenericMode.java @@ -1,9 +1,12 @@ package ev3dev.sensors; -import ev3dev.utils.Sysfs; +import ev3dev.utils.DataChannelRereader; import lejos.hardware.sensor.SensorMode; +import java.io.Closeable; import java.io.File; +import java.io.IOException; +import java.nio.file.Path; /** * Generic ev3dev sensor handler. @@ -12,9 +15,9 @@ * are valid only when the sensor itself is in the correct mode. * Otherwise, wrong data will be returned.

*/ -public class GenericMode implements SensorMode { - protected final File pathDevice; +public class GenericMode implements SensorMode, Closeable { + private final int sampleSize; private final String modeName; @@ -22,6 +25,8 @@ public class GenericMode implements SensorMode { private final float correctMax; private final float correctFactor; + private final DataChannelRereader[] rereaders; + /** * Create new generic sensor handler. * @param pathDevice Reference to the object responsible for mode setting and value reading. @@ -29,11 +34,11 @@ public class GenericMode implements SensorMode { * @param modeName Human-readable sensor mode name. */ public GenericMode( - final File pathDevice, - final int sampleSize, - final String modeName) { + final File pathDevice, + final int sampleSize, + final String modeName) { this(pathDevice, sampleSize, modeName, - Float.MIN_VALUE, Float.MAX_VALUE, 1.0f); + Float.MIN_VALUE, Float.MAX_VALUE, 1.0f); } /** @@ -42,23 +47,27 @@ public GenericMode( * @param pathDevice Reference to the object responsible for mode setting and value reading. * @param sampleSize Number of returned samples. * @param modeName Human-readable sensor mode name. - * @param correctMin Minimum value measured by the sensor. If the reading is lower, zero is returned. + * @param correctMin Minimum value measured by the sensor. If the reading is lower, negative infinity is returned * @param correctMax Maximum value measured by the sensor. If the reading is higher, positive infinity is returned. * @param correctFactor Scaling factor applied to the sensor reading. */ public GenericMode( - final File pathDevice, - final int sampleSize, - final String modeName, - final float correctMin, - final float correctMax, - final float correctFactor) { - this.pathDevice = pathDevice; + final File pathDevice, + final int sampleSize, + final String modeName, + final float correctMin, + final float correctMax, + final float correctFactor) { this.sampleSize = sampleSize; this.modeName = modeName; this.correctMin = correctMin; this.correctMax = correctMax; this.correctFactor = correctFactor; + + this.rereaders = new DataChannelRereader[sampleSize]; + for (int n = 0; n < sampleSize; n++) { + rereaders[n] = new DataChannelRereader(Path.of(pathDevice.toString(),"value" + n),32); + } } @Override @@ -71,7 +80,6 @@ public int sampleSize() { return sampleSize; } - /** * Fetches a sample from the sensor. * @@ -88,12 +96,12 @@ public void fetchSample(float[] sample, int offset) { // for all values for (int n = 0; n < sampleSize; n++) { // read - float reading = Sysfs.readFloat(this.pathDevice + "/" + "value" + n); + float reading = Float.parseFloat(rereaders[n].readString()); // apply correction reading *= correctFactor; if (reading < correctMin) { - reading = 0; + reading = Float.NEGATIVE_INFINITY; } else if (reading >= correctMax) { reading = Float.POSITIVE_INFINITY; } @@ -102,4 +110,11 @@ public void fetchSample(float[] sample, int offset) { sample[offset + n] = reading; } } + + @Override + public void close() throws IOException { + for (DataChannelRereader rereader: rereaders) { + rereader.close(); + } + } } diff --git a/src/main/java/ev3dev/sensors/nxt/NXTTemperatureSensor.java b/src/main/java/ev3dev/sensors/nxt/NXTTemperatureSensor.java index 55f94879..0021a993 100644 --- a/src/main/java/ev3dev/sensors/nxt/NXTTemperatureSensor.java +++ b/src/main/java/ev3dev/sensors/nxt/NXTTemperatureSensor.java @@ -51,6 +51,7 @@ private class InternalMode extends GenericMode { private final float correctMin; private final float correctMax; private final float correctFactor; + private final File pathDevice; public InternalMode(File pathDevice, int sampleSize, String modeName, float correctMin, float correctMax, float correctFactor) { @@ -59,6 +60,7 @@ public InternalMode(File pathDevice, int sampleSize, String modeName, this.correctMin = correctMin; this.correctMax = correctMax; this.correctFactor = correctFactor; + this.pathDevice = pathDevice; } @Override From 8ce1e718fc02d7844641532e801632ffce4360ae Mon Sep 17 00:00:00 2001 From: dwalend Date: Sun, 17 Jan 2021 22:39:06 -0500 Subject: [PATCH 2/2] Pulled back the negative infinity change --- src/main/java/ev3dev/sensors/GenericMode.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/ev3dev/sensors/GenericMode.java b/src/main/java/ev3dev/sensors/GenericMode.java index a744ff03..9f9359fc 100644 --- a/src/main/java/ev3dev/sensors/GenericMode.java +++ b/src/main/java/ev3dev/sensors/GenericMode.java @@ -101,7 +101,7 @@ public void fetchSample(float[] sample, int offset) { // apply correction reading *= correctFactor; if (reading < correctMin) { - reading = Float.NEGATIVE_INFINITY; + reading = 0; } else if (reading >= correctMax) { reading = Float.POSITIVE_INFINITY; }