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;
}