PKT8 fixes

This commit is contained in:
darksnake 2016-09-30 16:36:11 +03:00
parent a33457d025
commit 1da1d628c2
4 changed files with 101 additions and 39 deletions

View File

@ -42,12 +42,10 @@ import java.util.*;
*/ */
public class PKT8Device extends PortSensor<PKT8Result> { public class PKT8Device extends PortSensor<PKT8Result> {
private static final String[] CHANNEL_DESIGNATIONS = {"a", "b", "c", "d", "e", "f", "g", "h"};
public static final String PGA = "pga"; public static final String PGA = "pga";
public static final String SPS = "sps"; public static final String SPS = "sps";
public static final String ABUF = "abuf"; public static final String ABUF = "abuf";
private static final String[] CHANNEL_DESIGNATIONS = {"a", "b", "c", "d", "e", "f", "g", "h"};
/** /**
* The key is the letter (a,b,c,d...) as in measurements * The key is the letter (a,b,c,d...) as in measurements
*/ */
@ -77,6 +75,7 @@ public class PKT8Device extends PortSensor<PKT8Result> {
} }
super.init(); super.init();
//update parameters from meta //update parameters from meta
if (meta().hasValue("pga")) { if (meta().hasValue("pga")) {
getLogger().info("Setting dynamic range to " + meta().getInt("pga")); getLogger().info("Setting dynamic range to " + meta().getInt("pga"));
@ -95,10 +94,12 @@ public class PKT8Device extends PortSensor<PKT8Result> {
@Override @Override
public void shutdown() throws ControlException { public void shutdown() throws ControlException {
super.shutdown(); if (collector != null) {
collector.clear(); collector.clear();
collector = null; collector = null;
} }
super.shutdown();
}
@Override @Override
protected PortHandler buildHandler(String portName) throws ControlException { protected PortHandler buildHandler(String portName) throws ControlException {
@ -154,7 +155,7 @@ public class PKT8Device extends PortSensor<PKT8Result> {
private String spsToStr(int sps) { private String spsToStr(int sps) {
switch (sps) { switch (sps) {
case 0: case 0:
return "2,5 SPS"; return "2.5 SPS";
case 1: case 1:
return "5 SPS"; return "5 SPS";
case 2: case 2:
@ -196,9 +197,9 @@ public class PKT8Device extends PortSensor<PKT8Result> {
case 4: case 4:
return "± 312.5 mV"; return "± 312.5 mV";
case 5: case 5:
return "± 156,25 mV"; return "± 156.25 mV";
case 6: case 6:
return "± 78,125 mV"; return "± 78.125 mV";
default: default:
return "unknown value"; return "unknown value";
} }
@ -274,6 +275,10 @@ public class PKT8Device extends PortSensor<PKT8Result> {
return this.getMeasurement(); return this.getMeasurement();
} else { } else {
try { try {
if (getHandler().isLocked()) {
getLogger().error("Breaking hold on handler because it is locked");
getHandler().breakHold();
}
return new PKT8Measurement(getHandler()); return new PKT8Measurement(getHandler());
} catch (ControlException e) { } catch (ControlException e) {
throw new MeasurementException(e); throw new MeasurementException(e);
@ -286,8 +291,9 @@ public class PKT8Device extends PortSensor<PKT8Result> {
//clearing PKT queue //clearing PKT queue
try { try {
getHandler().send("p"); getHandler().send("p");
getHandler().sendAndWait("p", null, 1000); getHandler().sendAndWait("p", 400);
} catch (ControlException e) { } catch (ControlException e) {
getLogger().error("Failed to clear PKT8 port");
// throw new MeasurementException(e); // throw new MeasurementException(e);
} }
if (collector == null) { if (collector == null) {
@ -307,6 +313,10 @@ public class PKT8Device extends PortSensor<PKT8Result> {
@Override @Override
public void start() { public void start() {
if (isStarted()) {
getLogger().warn("Trying to start measurement which is already started");
}
try { try {
handler.holdBy(this); handler.holdBy(this);
handler.send("s"); handler.send("s");
@ -314,20 +324,26 @@ public class PKT8Device extends PortSensor<PKT8Result> {
} catch (PortException ex) { } catch (PortException ex) {
error("Failed to start measurement", ex); error("Failed to start measurement", ex);
} }
} }
@Override @Override
public boolean stop(boolean force) throws MeasurementException { public boolean stop(boolean force) throws MeasurementException {
try { if (isFinished()) {
getHandler().send("p"); getLogger().warn("Trying to stop measurement which is already stopped");
if (collector != null) {
collector.clear();
} }
return true;
try {
String response = getHandler().sendAndWait("p", 400).trim();
// Должно быть именно с большой буквы!!!
return "Stopped".equals(response) || "stopped".equals(response);
} catch (Exception ex) { } catch (Exception ex) {
error(ex); error(ex);
return false; return false;
} finally { } finally {
if (collector != null) {
collector.clear();
}
handler.unholdBy(this); handler.unholdBy(this);
} }
} }
@ -338,8 +354,8 @@ public class PKT8Device extends PortSensor<PKT8Result> {
String trimmed = message.trim(); String trimmed = message.trim();
if (isStarted()) { if (isStarted()) {
if (trimmed.equals("stopped")) { if (trimmed.equals("Stopped") || trimmed.equals("stopped")) {
afterStop(); afterPause();
getLogger().info("Measurement stopped"); getLogger().info("Measurement stopped");
} else { } else {
String designation = trimmed.substring(0, 1); String designation = trimmed.substring(0, 1);
@ -354,7 +370,6 @@ public class PKT8Device extends PortSensor<PKT8Result> {
} else { } else {
result(new PKT8Result(designation, rawValue, -1)); result(new PKT8Result(designation, rawValue, -1));
} }
setMeasurementState(MeasurementState.OK);
} }
} }
} }

View File

@ -15,7 +15,6 @@
*/ */
package inr.numass.cryotemp; package inr.numass.cryotemp;
import hep.dataforge.context.GlobalContext;
import hep.dataforge.control.devices.Device; import hep.dataforge.control.devices.Device;
import hep.dataforge.control.devices.DeviceListener; import hep.dataforge.control.devices.DeviceListener;
import hep.dataforge.control.measurements.Measurement; import hep.dataforge.control.measurements.Measurement;
@ -33,6 +32,8 @@ import hep.dataforge.plots.fx.FXPlotFrame;
import hep.dataforge.plots.fx.PlotContainer; import hep.dataforge.plots.fx.PlotContainer;
import hep.dataforge.plots.jfreechart.JFreeChartFrame; import hep.dataforge.plots.jfreechart.JFreeChartFrame;
import hep.dataforge.values.Value; import hep.dataforge.values.Value;
import javafx.beans.InvalidationListener;
import javafx.beans.Observable;
import javafx.event.ActionEvent; import javafx.event.ActionEvent;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.fxml.Initializable; import javafx.fxml.Initializable;
@ -58,18 +59,17 @@ import java.util.ResourceBundle;
public class PKT8MainViewController implements Initializable, DeviceListener, MeasurementListener<PKT8Result>, AutoCloseable { public class PKT8MainViewController implements Initializable, DeviceListener, MeasurementListener<PKT8Result>, AutoCloseable {
public static final String DEFAULT_CONFIG_LOCATION = "devices.xml"; public static final String DEFAULT_CONFIG_LOCATION = "devices.xml";
ConsoleFragment consoleFragment;
private PKT8Device device; private PKT8Device device;
private FXPlotFrame<XYPlottable> plotFrame; private FXPlotFrame<XYPlottable> plotFrame;
private TimePlottableGroup plottables; private TimePlottableGroup plottables;
private Meta currentPlotConfig;
ConsoleFragment consoleFragment;
@FXML @FXML
private Button loadConfigButton; private Button loadConfigButton;
@FXML @FXML
private ToggleButton startStopButton; private ToggleButton startStopButton;
@FXML @FXML
private ToggleButton rawDataButton;
@FXML
private AnchorPane plotArea; private AnchorPane plotArea;
@FXML @FXML
private ToggleButton consoleButton; private ToggleButton consoleButton;
@ -89,6 +89,17 @@ public class PKT8MainViewController implements Initializable, DeviceListener, Me
setupPlotFrame(null); setupPlotFrame(null);
this.consoleFragment = new ConsoleFragment(); this.consoleFragment = new ConsoleFragment();
consoleFragment.bindTo(consoleButton); consoleFragment.bindTo(consoleButton);
rawDataButton.selectedProperty().addListener(new InvalidationListener() {
@Override
public void invalidated(Observable observable) {
if (plotFrame != null) {
setupPlotFrame(plotFrame.getConfig());
if (device != null) {
setupChannels();
}
}
}
});
} }
@FXML @FXML
@ -96,7 +107,7 @@ public class PKT8MainViewController implements Initializable, DeviceListener, Me
FileChooser fileChooser = new FileChooser(); FileChooser fileChooser = new FileChooser();
fileChooser.setTitle("Open configuration file"); fileChooser.setTitle("Open configuration file");
fileChooser.setInitialFileName(DEFAULT_CONFIG_LOCATION); fileChooser.setInitialFileName(DEFAULT_CONFIG_LOCATION);
fileChooser.setInitialDirectory(GlobalContext.instance().io().getRootDirectory()); // fileChooser.setInitialDirectory(GlobalContext.instance().io().getRootDirectory());
fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("xml", "*.xml", "*.XML")); fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("xml", "*.xml", "*.XML"));
fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("json", "*.json", "*.JSON")); fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("json", "*.json", "*.JSON"));
// fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("all", "*.*")); // fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("all", "*.*"));
@ -129,7 +140,6 @@ public class PKT8MainViewController implements Initializable, DeviceListener, Me
} }
setupPlotFrame(plotConfig.getNode("plotFrame", null)); setupPlotFrame(plotConfig.getNode("plotFrame", null));
currentPlotConfig = plotConfig;
} }
if (config.hasNode("device")) { if (config.hasNode("device")) {
@ -144,7 +154,7 @@ public class PKT8MainViewController implements Initializable, DeviceListener, Me
/** /**
* Set o reset plot area * Set o reset plot area
*/ */
private void setupPlotFrame(Meta plotFrameMeta) { private synchronized void setupPlotFrame(Meta plotFrameMeta) {
plottables = new TimePlottableGroup(); plottables = new TimePlottableGroup();
plotArea.getChildren().clear(); plotArea.getChildren().clear();
plotFrame = new JFreeChartFrame(plotFrameMeta); plotFrame = new JFreeChartFrame(plotFrameMeta);
@ -169,8 +179,7 @@ public class PKT8MainViewController implements Initializable, DeviceListener, Me
device.init(); device.init();
} }
@Override private void setupChannels() {
public void notifyDeviceInitialized(Device device) {
Collection<PKT8Channel> channels = this.device.getChanels(); Collection<PKT8Channel> channels = this.device.getChanels();
//plot config from device configuration //plot config from device configuration
@ -188,16 +197,18 @@ public class PKT8MainViewController implements Initializable, DeviceListener, Me
plottables.addPlottable(plottable); plottables.addPlottable(plottable);
plotFrame.add(plottable); plotFrame.add(plottable);
}); });
plottables.applyConfig(plotFrame.getConfig());
}
@Override
public void notifyDeviceInitialized(Device device) {
setupChannels();
startStopButton.setDisable(false); startStopButton.setDisable(false);
if (currentPlotConfig != null) {
applyViewConfig(currentPlotConfig);
}
} }
public void applyViewConfig(Meta viewConfig) { // public void applyViewConfig(Meta viewConfig) {
plottables.applyConfig(viewConfig); // plottables.applyConfig(viewConfig);
} // }
@Override @Override
public void notifyDeviceShutdown(Device device) { public void notifyDeviceShutdown(Device device) {
@ -213,9 +224,13 @@ public class PKT8MainViewController implements Initializable, DeviceListener, Me
@Override @Override
public void onMeasurementResult(Measurement<PKT8Result> measurement, PKT8Result result, Instant time) { public synchronized void onMeasurementResult(Measurement<PKT8Result> measurement, PKT8Result result, Instant time) {
if (rawDataButton.isSelected()) {
plottables.put(result.channel, result.rawValue);
} else {
plottables.put(result.channel, result.temperature); plottables.put(result.channel, result.temperature);
} }
}
@Override @Override
public void onMeasurementFailed(Measurement measurement, Throwable exception) { public void onMeasurementFailed(Measurement measurement, Throwable exception) {

View File

@ -0,0 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<device>
<!-- Device configuration -->
<storage path="D:\\temp\\cryo"/>
<port>192.168.111.36:4001</port>
<abuf>1</abuf>
<averagingDuration>"PT60S"</averagingDuration>
<!-- Channel configuration -->
<channel designation="a" name="T1" r0="1000" transformationType="hyperbolic"
coefs="[17.066, -249.29, 1663.6, -5263.8, 9004.7, -7151.8, 2288.3]"/>
<channel designation="b" name="T2" r0="1000" transformationType="hyperbolic"
coefs="[73.202, -841.5, 3995.9, -9579.1, 12361.0, -7976.5, 2161.3]"/>
<channel designation="c" name="T3" r0="1000" transformationType="hyperbolic"
coefs="[52.402, -579.55, 2665.5, -6110.0, 7501.9, -4553.5, 1197.1]"/>
<channel designation="d" name="T4" r0="1000" transformationType="hyperbolic"
coefs="[17.136, -249.09, 1667.5, -5316.4, 9226.7, -7515.6, 2382.4]"/>
<channel designation="e" name="T5" r0="1000" transformationType="hyperbolic"
coefs="[58.060, -664.38, 3158.3, -7531.0, 9616.3, -6029.3, 1589.6]"/>
<!-- Обрыв -->
<!-- <channel designation="f" name="T6" r0="1000" transformationType="hyperbolic" coefs="[989.0, -1040.0, 4958.6, -11980, 15598, -10158, 2728.4]"/>-->
<channel designation="g" name="T7" r0="1000" transformationType="hyperbolic"
coefs="[71.984, -822.09, 3872.0, -9183.0, 11729.0, -7518.6, 2034.2]"/>
<channel designation="h" name="T8" r0="1000" transformationType="hyperbolic"
coefs="[23.894, -358.42, 2355.2, -7509.8, 12893.0, -10454.0, 3403.9]"/>
<!-- Plot configuration -->
<plotConfig>
<eachPlot thickness="3"/>
</plotConfig>
</device>

View File

@ -16,11 +16,11 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
--> -->
<?import javafx.scene.control.*?> <?import javafx.scene.control.*?>
<?import javafx.scene.layout.AnchorPane?> <?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.BorderPane?> <?import javafx.scene.layout.BorderPane?>
<BorderPane prefHeight="600.0" prefWidth="800.0" xmlns="http://javafx.com/javafx/8.0.60" xmlns:fx="http://javafx.com/fxml/1" fx:controller="inr.numass.cryotemp.PKT8MainViewController"> <BorderPane xmlns:fx="http://javafx.com/fxml/1" prefHeight="600.0" prefWidth="800.0"
xmlns="http://javafx.com/javafx/8.0.60" fx:controller="inr.numass.cryotemp.PKT8MainViewController">
<center> <center>
<AnchorPane fx:id="plotArea" /> <AnchorPane fx:id="plotArea" />
</center> </center>
@ -28,6 +28,7 @@ limitations under the License.
<ToolBar BorderPane.alignment="CENTER"> <ToolBar BorderPane.alignment="CENTER">
<items> <items>
<ToggleButton fx:id="startStopButton" disable="true" mnemonicParsing="false" onAction="#onStartStopClick" prefWidth="50.0" text="Start" /> <ToggleButton fx:id="startStopButton" disable="true" mnemonicParsing="false" onAction="#onStartStopClick" prefWidth="50.0" text="Start" />
<ToggleButton fx:id="rawDataButton" mnemonicParsing="false" text="Raw data"/>
<Separator orientation="VERTICAL" /> <Separator orientation="VERTICAL" />
<Button fx:id="loadConfigButton" mnemonicParsing="false" onAction="#onLoadConfigClick" text="Load config" /> <Button fx:id="loadConfigButton" mnemonicParsing="false" onAction="#onLoadConfigClick" text="Load config" />
<ToggleButton fx:id="consoleButton" contentDisplay="CENTER" mnemonicParsing="false" text="Console" /> <ToggleButton fx:id="consoleButton" contentDisplay="CENTER" mnemonicParsing="false" text="Console" />