diff --git a/src/main/java/ev3dev/sensors/GenericMode.java b/src/main/java/ev3dev/sensors/GenericMode.java index 368b7d4c..9f9359fc 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,7 +96,7 @@ 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; @@ -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