[no commit message]

This commit is contained in:
darksnake 2016-02-09 17:05:49 +03:00
parent 406549eecf
commit 68ff2c89da
8 changed files with 289 additions and 157 deletions

View File

@ -16,7 +16,7 @@
package inr.numass.control.msp; package inr.numass.control.msp;
import hep.dataforge.context.Context; import hep.dataforge.context.Context;
import hep.dataforge.context.GlobalContext; import hep.dataforge.control.connections.Roles;
import hep.dataforge.control.connections.StorageConnection; import hep.dataforge.control.connections.StorageConnection;
import hep.dataforge.control.devices.SingleMeasurementDevice; import hep.dataforge.control.devices.SingleMeasurementDevice;
import hep.dataforge.control.measurements.AbstractMeasurement; import hep.dataforge.control.measurements.AbstractMeasurement;
@ -380,7 +380,7 @@ public class MspDevice extends SingleMeasurementDevice implements PortHandler.Po
private void prepareLoaders() { private void prepareLoaders() {
loaders = new ArrayList<>(); loaders = new ArrayList<>();
forEachTypedConnection("storage", StorageConnection.class, (StorageConnection con) -> { forEachTypedConnection(Roles.STORAGE_ROLE, StorageConnection.class, (StorageConnection con) -> {
try { try {
Storage storage = con.getStorage(); Storage storage = con.getStorage();

View File

@ -16,6 +16,7 @@ import hep.dataforge.exceptions.ControlException;
import hep.dataforge.exceptions.MeasurementException; import hep.dataforge.exceptions.MeasurementException;
import hep.dataforge.meta.Meta; import hep.dataforge.meta.Meta;
import hep.dataforge.values.Value; import hep.dataforge.values.Value;
import java.util.Collection;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
@ -43,7 +44,7 @@ public class VacCollectorDevice extends Sensor<DataPoint> {
@Override @Override
protected Object calculateState(String stateName) throws ControlException { protected Object calculateState(String stateName) throws ControlException {
//TODO add dot path notation for states //TODO add dot path notation for states
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. return Value.NULL;
} }
@Override @Override
@ -56,6 +57,10 @@ public class VacCollectorDevice extends Sensor<DataPoint> {
return "Numass vacuum"; return "Numass vacuum";
} }
public Collection<Sensor<Double>> getSensors(){
return sensorMap.values();
}
private class VacuumMeasurement extends AbstractMeasurement<DataPoint> { private class VacuumMeasurement extends AbstractMeasurement<DataPoint> {
private final ValueCollector collector = new PointCollector(this::onResult, sensorMap.keySet()); private final ValueCollector collector = new PointCollector(this::onResult, sensorMap.keySet());

View File

@ -0,0 +1,40 @@
/*
* 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.exceptions.ControlException;
import hep.dataforge.meta.Meta;
import hep.dataforge.values.Value;
/**
*
* @author Alexander Nozik <altavir@gmail.com>
*/
public class VirtualVacDevice extends Sensor<Double> {
public VirtualVacDevice(String name, Context context, Meta meta) {
super(name, context, meta);
}
@Override
protected Object calculateState(String stateName) throws ControlException {
return Value.NULL;
}
@Override
protected Measurement<Double> createMeasurement() {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public String type() {
return "Virtual vacuumeter device";
}
}

View File

@ -5,116 +5,28 @@
*/ */
package inr.numass.readvac.fx; package inr.numass.readvac.fx;
import hep.dataforge.control.connections.DeviceView;
import hep.dataforge.control.devices.Device;
import hep.dataforge.control.measurements.Measurement;
import hep.dataforge.control.measurements.MeasurementListener;
import hep.dataforge.values.Value;
import java.io.IOException;
import java.net.URL; import java.net.URL;
import java.time.Instant;
import java.util.ResourceBundle; import java.util.ResourceBundle;
import javafx.beans.value.ObservableValue; import javafx.beans.value.ObservableValue;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Node;
import javafx.scene.control.Label;
import org.controlsfx.control.StatusBar;
import org.controlsfx.control.ToggleSwitch; import org.controlsfx.control.ToggleSwitch;
/** /**
* *
* @author Alexander Nozik <altavir@gmail.com> * @author Alexander Nozik <altavir@gmail.com>
*/ */
public class PoweredVacuumeterView extends DeviceView { public class PoweredVacuumeterView extends VacuumeterView {
private VacuumeterViewNode controller; @FXML
private Node node; ToggleSwitch powerSwitch;
@Override @Override
public void accept(Device device, String measurementName, Measurement measurement) { public void initialize(URL location, ResourceBundle resources) {
unitLabel.setText(getDevice().meta().getString("units", "mbar"));
} deviceNameLabel.setText(getDevice().getName());
powerSwitch.selectedProperty().addListener((ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) -> {
VacuumeterViewNode getController() { getDevice().setState("power", newValue);
if (controller == null) { });
getComponent();
}
return controller;
}
@Override
public void evaluateDeviceException(Device device, String message, Throwable exception) {
//show dialog or tooltip
}
@Override
public Node getComponent() {
if (getDevice() == null) {
throw new RuntimeException("Connection not attached");
} else {
if (node == null) {
try {
FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/VacBox.fxml"));
controller = new VacuumeterViewNode();
loader.setController(controller);
this.node = loader.load();
} catch (IOException ex) {
throw new RuntimeException(ex);
}
}
return node;
}
}
@Override
public void notifyDeviceStateChanged(Device device, String name, Value state) {
}
private class VacuumeterViewNode implements MeasurementListener<Double>, Initializable {
@FXML
Label deviceNameLabel;
@FXML
Label valueLabel;
@FXML
Label unitLabel;
@FXML
StatusBar status;
@FXML
ToggleSwitch powerSwitch;
@Override
public void initialize(URL location, ResourceBundle resources) {
unitLabel.setText(getDevice().meta().getString("units", "mbar"));
deviceNameLabel.setText(getDevice().getName());
powerSwitch.selectedProperty().addListener((ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) -> {
getDevice().setState("power", newValue);
});
}
@Override
public void onMeasurementFailed(Measurement measurement, Throwable exception) {
valueLabel.setText("Err");
}
@Override
public void onMeasurementResult(Measurement<Double> measurement, Double result, Instant time) {
valueLabel.setText(Double.toString(result));
}
@Override
public void onMeasurementProgress(Measurement measurement, String message) {
status.setText(message);
}
@Override
public void onMeasurementProgress(Measurement measurement, double progress) {
status.setProgress(progress);
}
} }
} }

View File

@ -0,0 +1,128 @@
/*
* 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.fx;
import hep.dataforge.control.connections.Roles;
import hep.dataforge.control.devices.Device;
import hep.dataforge.control.devices.DeviceListener;
import hep.dataforge.control.measurements.Measurement;
import hep.dataforge.control.measurements.MeasurementListener;
import hep.dataforge.data.DataPoint;
import hep.dataforge.meta.Meta;
import hep.dataforge.meta.MetaBuilder;
import hep.dataforge.plots.PlotFrame;
import hep.dataforge.plots.data.DynamicPlottable;
import hep.dataforge.plots.data.DynamicPlottableSet;
import hep.dataforge.plots.fx.PlotContainer;
import hep.dataforge.plots.jfreechart.JFreeChartFrame;
import hep.dataforge.values.Value;
import inr.numass.readvac.devices.MKSVacDevice;
import inr.numass.readvac.devices.VacCollectorDevice;
import java.net.URL;
import java.time.Instant;
import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.HBox;
/**
* FXML Controller class
*
* @author Alexander Nozik <altavir@gmail.com>
*/
public class VacCollectorController implements Initializable, DeviceListener, MeasurementListener<DataPoint> {
private VacCollectorDevice device;
private final List<VacuumeterView> views = new ArrayList<>();
private PlotContainer plotContainer;
private DynamicPlottableSet plottables;
@FXML
private AnchorPane plotHolder;
@FXML
private HBox vacBoxHolder;
@Override
public void evaluateDeviceException(Device device, String message, Throwable exception) {
}
/**
* Initializes the controller class.
*/
@Override
public void initialize(URL url, ResourceBundle rb) {
plotContainer = PlotContainer.anchorTo(plotHolder);
}
public VacCollectorDevice getDevice() {
return device;
}
@Override
public void notifyDeviceStateChanged(Device device, String name, Value state) {
}
@Override
public void onMeasurementFailed(Measurement measurement, Throwable exception) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void onMeasurementResult(Measurement<DataPoint> measurement, DataPoint result, Instant time) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
private void setupView() {
vacBoxHolder.getChildren().clear();
plottables = new DynamicPlottableSet();
views.stream().forEach((controller) -> {
vacBoxHolder.getChildren().add(controller.getComponent());
plottables.addPlottable(new DynamicPlottable(controller.getTitle(),
controller.meta(), controller.getName()));
});
plotContainer.setPlot(setupPlot(plottables));
}
private PlotFrame setupPlot(DynamicPlottableSet plottables) {
Meta plotConfig = new MetaBuilder("plotFrame")
.setNode(new MetaBuilder("yAxis")
.setValue("logAxis", true)
.setValue("axisTitle", "pressure")
.setValue("axisUnits", "mbar")
)
.setValue("xAxis.timeAxis", true);
JFreeChartFrame frame = new JFreeChartFrame("pressure", plotConfig);
frame.addAll(plottables);
return frame;
}
public void setDevice(VacCollectorDevice device) {
this.device = device;
device.getSensors().stream().map((sensor) -> {
VacuumeterView controller;
if (sensor instanceof MKSVacDevice) {
controller = new PoweredVacuumeterView();
} else {
controller = new VacuumeterView();
}
sensor.connect(controller, Roles.DEVICE_LISTENER_ROLE, Roles.MEASUREMENT_CONSUMER_ROLE);
return controller;
}).forEach((controller) -> {
views.add(controller);
});
setupView();
}
private void startMeasurement(){
getDevice().startMeasurement();
}
}

View File

@ -5,10 +5,13 @@
*/ */
package inr.numass.readvac.fx; package inr.numass.readvac.fx;
import hep.dataforge.control.connections.DeviceView; import hep.dataforge.content.Named;
import hep.dataforge.control.connections.DeviceViewController;
import hep.dataforge.control.devices.Device; import hep.dataforge.control.devices.Device;
import hep.dataforge.control.measurements.Measurement; import hep.dataforge.control.measurements.Measurement;
import hep.dataforge.control.measurements.MeasurementListener; import hep.dataforge.control.measurements.MeasurementListener;
import hep.dataforge.meta.Annotated;
import hep.dataforge.meta.Meta;
import hep.dataforge.values.Value; import hep.dataforge.values.Value;
import java.io.IOException; import java.io.IOException;
import java.net.URL; import java.net.URL;
@ -25,21 +28,25 @@ import org.controlsfx.control.StatusBar;
* *
* @author Alexander Nozik <altavir@gmail.com> * @author Alexander Nozik <altavir@gmail.com>
*/ */
public class VacuumeterView extends DeviceView { public class VacuumeterView extends DeviceViewController implements MeasurementListener<Double>, Initializable, Named, Annotated {
private VacuumeterViewNode controller; protected Node node;
private Node node;
@FXML
Label deviceNameLabel;
@FXML
StatusBar status;
@FXML
Label unitLabel;
@FXML
Label valueLabel;
@Override @Override
public void accept(Device device, String measurementName, Measurement measurement) { public void accept(Device device, String measurementName, Measurement measurement) {
measurement.addListener(this);
}
VacuumeterViewNode getController(){
if(controller == null){
getComponent();
}
return controller;
} }
@Override @Override
@ -47,13 +54,11 @@ public class VacuumeterView extends DeviceView {
//show dialog or tooltip //show dialog or tooltip
} }
@Override
public Node getComponent() { public Node getComponent() {
if (node == null) { if (node == null) {
try { try {
FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/VacBox.fxml")); FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/VacBox.fxml"));
controller = new VacuumeterViewNode(); loader.setController(this);
loader.setController(controller);
this.node = loader.load(); this.node = loader.load();
} catch (IOException ex) { } catch (IOException ex) {
throw new RuntimeException(ex); throw new RuntimeException(ex);
@ -62,51 +67,48 @@ public class VacuumeterView extends DeviceView {
return node; return node;
} }
@Override
public void initialize(URL location, ResourceBundle resources) {
unitLabel.setText(getDevice().meta().getString("units", "mbar"));
deviceNameLabel.setText(getDevice().getName());
}
@Override @Override
public void notifyDeviceStateChanged(Device device, String name, Value state) { public void notifyDeviceStateChanged(Device device, String name, Value state) {
} }
@Override
public void onMeasurementFailed(Measurement measurement, Throwable exception) {
private class VacuumeterViewNode implements MeasurementListener<Double>, Initializable{ valueLabel.setText("Err");
@FXML
Label deviceNameLabel;
@FXML
Label valueLabel;
@FXML
Label unitLabel;
@FXML
StatusBar status;
@Override
public void initialize(URL location, ResourceBundle resources) {
unitLabel.setText(getDevice().meta().getString("units", "mbar"));
deviceNameLabel.setText(getDevice().getName());
}
@Override
public void onMeasurementFailed(Measurement measurement, Throwable exception) {
valueLabel.setText("Err");
}
@Override
public void onMeasurementResult(Measurement<Double> measurement, Double result, Instant time) {
valueLabel.setText(Double.toString(result));
}
@Override
public void onMeasurementProgress(Measurement measurement, String message) {
status.setText(message);
}
@Override
public void onMeasurementProgress(Measurement measurement, double progress) {
status.setProgress(progress);
}
} }
@Override
public void onMeasurementProgress(Measurement measurement, String message) {
status.setText(message);
}
@Override
public void onMeasurementProgress(Measurement measurement, double progress) {
status.setProgress(progress);
}
@Override
public void onMeasurementResult(Measurement<Double> measurement, Double result, Instant time) {
valueLabel.setText(Double.toString(result));
}
@Override
public String getName(){
return getDevice().getName();
}
@Override
public Meta meta() {
return getDevice().meta();
}
public String getTitle(){
return meta().getString("title", getName());
}
} }

View File

@ -9,7 +9,7 @@
<?import org.controlsfx.control.StatusBar?> <?import org.controlsfx.control.StatusBar?>
<?import org.controlsfx.control.ToggleSwitch?> <?import org.controlsfx.control.ToggleSwitch?>
<AnchorPane prefHeight="170.0" prefWidth="200.0" styleClass="vacBox" xmlns="http://javafx.com/javafx/8.0.65" xmlns:fx="http://javafx.com/fxml/1"> <AnchorPane prefHeight="170.0" prefWidth="200.0" styleClass="vacBox" xmlns="http://javafx.com/javafx/8.0.65" xmlns:fx="http://javafx.com/fxml/1" fx:controller="fxml.PoweredVacBoxController">
<stylesheets> <stylesheets>
<URL value="@/styles/vacstyles.css" /> <URL value="@/styles/vacstyles.css" />
</stylesheets> </stylesheets>

View File

@ -0,0 +1,45 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.text.*?>
<?import java.lang.*?>
<?import java.net.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<AnchorPane id="AnchorPane" prefHeight="600.0" prefWidth="600.0" styleClass="mainFxmlClass" xmlns="http://javafx.com/javafx/8.0.40" xmlns:fx="http://javafx.com/fxml/1" fx:controller="inr.numass.readvac.fx.VacCollectorController">
<stylesheets>
<URL value="@/styles/vacstyles.css" />
</stylesheets>
<children>
<VBox prefHeight="200.0" prefWidth="100.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<children>
<BorderPane prefHeight="50.0">
<center>
<Pane prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER">
<children>
<Label layoutX="208.0" layoutY="8.0" text="Time: ">
<font>
<Font size="24.0" />
</font>
</Label>
<Label layoutX="271.0" layoutY="8.0" text="08.02.2016 15:57">
<font>
<Font size="24.0" />
</font>
</Label>
</children>
</Pane>
</center>
</BorderPane>
<ScrollPane prefHeight="175.0" vbarPolicy="NEVER">
<content>
<HBox fx:id="vacBoxHolder" />
</content>
</ScrollPane>
<AnchorPane fx:id="plotHolder" />
</children>
</VBox>
</children>
</AnchorPane>