[no commit message]

This commit is contained in:
darksnake 2016-02-02 17:00:01 +03:00
parent af7cda92bd
commit ac7577a430
5 changed files with 241 additions and 59 deletions

View File

@ -6,16 +6,14 @@
package inr.numass.readvac.devices; package inr.numass.readvac.devices;
import hep.dataforge.context.Context; import hep.dataforge.context.Context;
import hep.dataforge.control.measurements.RegularMeasurement; import hep.dataforge.control.measurements.Measurement;
import hep.dataforge.control.measurements.SingleMeasurementDevice; import hep.dataforge.control.measurements.Sensor;
import hep.dataforge.control.measurements.SimpleMeasurement;
import hep.dataforge.control.ports.ComPortHandler; import hep.dataforge.control.ports.ComPortHandler;
import hep.dataforge.control.ports.PortHandler; import hep.dataforge.control.ports.PortHandler;
import hep.dataforge.description.ValueDef; import hep.dataforge.description.ValueDef;
import hep.dataforge.exceptions.ControlException; import hep.dataforge.exceptions.ControlException;
import hep.dataforge.meta.Meta; import hep.dataforge.meta.Meta;
import hep.dataforge.values.Value;
import java.time.Duration;
import java.time.temporal.ChronoUnit;
/** /**
* *
@ -24,7 +22,7 @@ import java.time.temporal.ChronoUnit;
@ValueDef(name = "port") @ValueDef(name = "port")
@ValueDef(name = "delay") @ValueDef(name = "delay")
@ValueDef(name = "timeout") @ValueDef(name = "timeout")
public class CM32Device extends SingleMeasurementDevice<RegularMeasurement<Double>> { public class CM32Device extends Sensor<Double> {
private PortHandler handler; private PortHandler handler;
@ -47,7 +45,7 @@ public class CM32Device extends SingleMeasurementDevice<RegularMeasurement<Doubl
} }
@Override @Override
protected RegularMeasurement<Double> createMeasurement() { protected Measurement<Double> createMeasurement() {
return new CMVacMeasurement(); return new CMVacMeasurement();
} }
@ -83,7 +81,7 @@ public class CM32Device extends SingleMeasurementDevice<RegularMeasurement<Doubl
return meta().getInt("timeout", 400); return meta().getInt("timeout", 400);
} }
private class CMVacMeasurement extends RegularMeasurement<Double> { private class CMVacMeasurement extends SimpleMeasurement<Double> {
private static final String CM32_QUERY = "MES R PM 1\r\n"; private static final String CM32_QUERY = "MES R PM 1\r\n";
@ -110,12 +108,6 @@ public class CM32Device extends SingleMeasurementDevice<RegularMeasurement<Doubl
return Double.parseDouble(answer.substring(14, 17) + answer.substring(19, 23)); return Double.parseDouble(answer.substring(14, 17) + answer.substring(19, 23));
} }
} }
@Override
protected Duration getDelay() {
return Duration.of(meta().getInt("delay", 5000), ChronoUnit.MILLIS);
}
} }
} }

View File

@ -6,16 +6,15 @@
package inr.numass.readvac.devices; package inr.numass.readvac.devices;
import hep.dataforge.context.Context; import hep.dataforge.context.Context;
import hep.dataforge.control.measurements.RegularMeasurement; import hep.dataforge.control.measurements.Measurement;
import hep.dataforge.control.measurements.SingleMeasurementDevice; import hep.dataforge.control.measurements.Sensor;
import hep.dataforge.control.measurements.SimpleMeasurement;
import hep.dataforge.control.ports.ComPortHandler; import hep.dataforge.control.ports.ComPortHandler;
import hep.dataforge.control.ports.PortHandler; import hep.dataforge.control.ports.PortHandler;
import hep.dataforge.description.ValueDef; import hep.dataforge.description.ValueDef;
import hep.dataforge.exceptions.ControlException; import hep.dataforge.exceptions.ControlException;
import hep.dataforge.meta.Meta; import hep.dataforge.meta.Meta;
import hep.dataforge.values.Value; import hep.dataforge.values.Value;
import java.time.Duration;
import java.time.temporal.ChronoUnit;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import javafx.beans.property.BooleanProperty; import javafx.beans.property.BooleanProperty;
@ -30,7 +29,7 @@ import javafx.beans.property.adapter.JavaBeanBooleanPropertyBuilder;
@ValueDef(name = "port") @ValueDef(name = "port")
@ValueDef(name = "delay") @ValueDef(name = "delay")
@ValueDef(name = "timeout") @ValueDef(name = "timeout")
public class MKSVacDevice extends SingleMeasurementDevice<RegularMeasurement<Double>> { public class MKSVacDevice extends Sensor<Double> {
// private static final String DELIMETER = ";FF"; // private static final String DELIMETER = ";FF";
private PortHandler handler; private PortHandler handler;
@ -60,7 +59,7 @@ public class MKSVacDevice extends SingleMeasurementDevice<RegularMeasurement<Dou
} }
@Override @Override
protected RegularMeasurement<Double> createMeasurement() { protected Measurement<Double> createMeasurement() {
return new MKSVacMeasurement(); return new MKSVacMeasurement();
} }
@ -172,7 +171,7 @@ public class MKSVacDevice extends SingleMeasurementDevice<RegularMeasurement<Dou
return handler; return handler;
} }
private class MKSVacMeasurement extends RegularMeasurement<Double> { private class MKSVacMeasurement extends SimpleMeasurement<Double> {
@Override @Override
protected Double doMeasurement() throws Exception { protected Double doMeasurement() throws Exception {
@ -196,16 +195,5 @@ public class MKSVacDevice extends SingleMeasurementDevice<RegularMeasurement<Dou
private int getChannel() { private int getChannel() {
return meta().getInt("channel", 5); return meta().getInt("channel", 5);
} }
@Override
protected boolean stopOnError() {
return false;
}
@Override
protected Duration getDelay() {
return Duration.of(meta().getInt("delay", 5000), ChronoUnit.MILLIS);
}
} }
} }

View File

@ -0,0 +1,124 @@
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package inr.numass.readvac.devices;
import hep.dataforge.context.Context;
import hep.dataforge.control.measurements.Measurement;
import hep.dataforge.control.measurements.Sensor;
import hep.dataforge.control.measurements.SimpleMeasurement;
import hep.dataforge.control.ports.ComPortHandler;
import hep.dataforge.control.ports.PortHandler;
import hep.dataforge.description.ValueDef;
import hep.dataforge.exceptions.ControlException;
import hep.dataforge.meta.Meta;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
*
* @author Alexander Nozik
*/
@ValueDef(name = "port")
@ValueDef(name = "delay")
@ValueDef(name = "timeout")
public class VITVacDevice extends Sensor<Double> {
private PortHandler handler;
public VITVacDevice(String name, Context context, Meta meta) {
super(name, context, meta);
}
/**
* @return the handler
*/
private PortHandler getHandler() throws ControlException {
if (handler == null || !handler.isOpen()) {
String port = meta().getString("port");
getLogger().info("Connecting to port {}", port);
handler = new ComPortHandler(port, 2400, 8, 1, 0);
handler.setDelimeter("\r\n");
handler.open();
}
return handler;
}
@Override
protected Measurement<Double> createMeasurement() {
return new CMVacMeasurement();
}
@Override
public String type() {
return meta().getString("type", "Vit vacuumeter");
}
@Override
protected Object calculateState(String stateName) throws ControlException {
if (getHandler() == null) {
notifyError("No port connection", null);
return null;
}
notifyError("State not found: " + stateName, null);
return null;
//TODO add connection check here
// switch (stateName) {
// case "connection":
// return !talk("T?").isEmpty();
// default:
// notifyError("State not found: " + stateName, null);
// return null;
// }
}
public boolean isConnected() {
return getState("connection").booleanValue();
}
private int timeout() {
return meta().getInt("timeout", 400);
}
private class CMVacMeasurement extends SimpleMeasurement<Double> {
private static final String VIT_QUERY = ":010300000002FA\r\n";
@Override
protected Double doMeasurement() throws Exception {
String answer = handler.sendAndWait(VIT_QUERY, timeout());
if (answer.isEmpty()) {
this.progressUpdate("No signal");
updateState("connection", false);
return null;
} else {
Matcher match = Pattern.compile(":010304(\\w{4})(\\w{4})..\r\n").matcher(answer);
if (match.matches()) {
double base = (double) (Integer.parseInt(match.group(1), 16)) / 10d;
int exp = Integer.parseInt(match.group(2), 16);
if (exp > 32766) {
exp = exp - 65536;
}
BigDecimal res = BigDecimal.valueOf(base * Math.pow(10, exp));
res = res.setScale(4, RoundingMode.CEILING);
this.progressUpdate("OK");
updateState("connection", true);
return res.doubleValue();
} else {
this.progressUpdate("Wrong answer: " + answer);
updateState("connection", false);
return null;
}
}
}
}
}

View File

@ -0,0 +1,81 @@
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package inr.numass.readvac.devices;
import hep.dataforge.context.Context;
import hep.dataforge.control.collectors.PointCollector;
import hep.dataforge.control.collectors.ValueCollector;
import hep.dataforge.control.measurements.AbstractMeasurement;
import hep.dataforge.control.measurements.Measurement;
import hep.dataforge.control.measurements.Sensor;
import hep.dataforge.data.DataPoint;
import hep.dataforge.exceptions.ControlException;
import hep.dataforge.meta.Meta;
import java.time.Instant;
import java.util.HashMap;
import java.util.Map;
import javafx.util.Pair;
/**
*
* @author Alexander Nozik <altavir@gmail.com>
*/
public class VacCollectorDevice extends Sensor<DataPoint> {
private final Map<String, Sensor<Double>> sensorMap;
public VacCollectorDevice(String name, Context context, Meta meta, Sensor<Double>... sensors) {
super(name, context, meta);
sensorMap = new HashMap<>(sensors.length);
for (Sensor<Double> sensor : sensors) {
sensorMap.put(sensor.getName(), sensor);
}
//TODO add automatic construction from meta using deviceManager
}
@Override
protected Object calculateState(String stateName) throws ControlException {
//TODO add dot path notation for states
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
protected Measurement<DataPoint> createMeasurement() {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public String type() {
return "Numass vacuum";
}
private class VacuumMeasurement extends AbstractMeasurement<DataPoint> {
ValueCollector collector = new PointCollector(this::result, sensorMap.keySet());
@Override
protected Pair<DataPoint, Instant> doGet() throws Exception {
sensorMap.values().stream().parallel().forEach(action);
}
@Override
public boolean isFinished() {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void start() {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public boolean stop(boolean force) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
}
}

View File

@ -16,24 +16,21 @@
package hep.dataforge.plotfit; package hep.dataforge.plotfit;
import hep.dataforge.actions.OneToOneAction; import hep.dataforge.actions.OneToOneAction;
import hep.dataforge.meta.Meta;
import hep.dataforge.context.Context; import hep.dataforge.context.Context;
import hep.dataforge.data.DataPoint;
import hep.dataforge.data.DataSet; import hep.dataforge.data.DataSet;
import hep.dataforge.data.XYDataAdapter; import hep.dataforge.data.XYDataAdapter;
import hep.dataforge.datafitter.FitState; import hep.dataforge.datafitter.FitState;
import hep.dataforge.datafitter.models.XYModel; import hep.dataforge.datafitter.models.XYModel;
import hep.dataforge.description.NodeDef; import hep.dataforge.description.NodeDef;
import hep.dataforge.description.ValueDef;
import hep.dataforge.description.TypedActionDef; import hep.dataforge.description.TypedActionDef;
import hep.dataforge.description.ValueDef;
import hep.dataforge.exceptions.ContentException; import hep.dataforge.exceptions.ContentException;
import hep.dataforge.io.log.Logable; import hep.dataforge.io.log.Logable;
import hep.dataforge.meta.Meta;
import hep.dataforge.plots.PlotsPlugin; import hep.dataforge.plots.PlotsPlugin;
import hep.dataforge.plots.XYPlotFrame; import hep.dataforge.plots.XYPlotFrame;
import hep.dataforge.plots.data.PlottableData; import hep.dataforge.plots.data.PlottableData;
import hep.dataforge.plots.data.PlottableFunction; import hep.dataforge.plots.data.PlottableFunction;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.math3.analysis.UnivariateFunction; import org.apache.commons.math3.analysis.UnivariateFunction;
/** /**
@ -75,32 +72,32 @@ public class PlotFitResultAction extends OneToOneAction<FitState, FitState> {
metaData.getNode("plot", null)); metaData.getNode("plot", null));
//JFreeChartFrame.drawFrame(reader.getString("plotTitle", "Fit result plot for "+input.getName()), null); //JFreeChartFrame.drawFrame(reader.getString("plotTitle", "Fit result plot for "+input.getName()), null);
double[] x = new double[data.size()]; // double[] x = new double[data.size()];
// double[] y = new double[data.size()]; // double[] y = new double[data.size()];
double xMin = Double.POSITIVE_INFINITY; // double xMin = Double.POSITIVE_INFINITY;
//
// double xMax = Double.NEGATIVE_INFINITY;
//
// List<DataPoint> points = new ArrayList<>();
//
// for (int i = 0; i < data.size(); i++) {
// x[i] = adapter.getX(data.get(i)).doubleValue();
//// y[i] = adapter.getY(data.get(i));
//
// points.add(adapter.mapToDefault(data.get(i)));
// if (x[i] < xMin) {
// xMin = x[i];
// }
//
// if (x[i] > xMax) {
// xMax = x[i];
// }
// }
double xMax = Double.NEGATIVE_INFINITY; frame.add(new PlottableFunction("fit", null, function, data, adapter));//FIXME replace by helper
List<DataPoint> points = new ArrayList<>(); frame.add(PlottableData.plot("data", adapter, data));
for (int i = 0; i < data.size(); i++) {
x[i] = adapter.getX(data.get(i)).doubleValue();
// y[i] = adapter.getY(data.get(i));
points.add(adapter.mapToDefault(data.get(i)));
if (x[i] < xMin) {
xMin = x[i];
}
if (x[i] > xMax) {
xMax = x[i];
}
}
frame.add(new PlottableFunction("fit", null, function, points, "x"));
frame.add(PlottableData.plot("data", adapter, points));
return input; return input;
} }