Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 32 additions & 17 deletions src/main/java/ev3dev/sensors/GenericMode.java
Original file line number Diff line number Diff line change
@@ -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.
Expand All @@ -12,28 +15,30 @@
* are valid only when the sensor itself is in the correct mode.
* Otherwise, wrong data will be returned.</p>
*/
public class GenericMode implements SensorMode {

protected final File pathDevice;
public class GenericMode implements SensorMode, Closeable {

private final int sampleSize;
private final String modeName;

private final float correctMin;
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.
* @param sampleSize Number of returned samples.
* @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);
}

/**
Expand All @@ -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
Expand All @@ -71,7 +80,6 @@ public int sampleSize() {
return sampleSize;
}


/**
* Fetches a sample from the sensor.
*
Expand All @@ -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;
Expand All @@ -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();
}
}
}
2 changes: 2 additions & 0 deletions src/main/java/ev3dev/sensors/nxt/NXTTemperatureSensor.java
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -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
Expand Down