Separated FX fragments from FX windows

This commit is contained in:
Alexander Nozik 2016-10-09 14:04:26 +03:00
parent f9f605bde0
commit 6953869c87
12 changed files with 120 additions and 103 deletions

View File

@ -8,8 +8,8 @@ mainClassName = mainClass
//mainClassName = "inr.numass.readvac.Main" //mainClassName = "inr.numass.readvac.Main"
dependencies { dependencies {
compile 'commons-cli:commons-cli:1.3' // compile 'commons-cli:commons-cli:1.3'
compile 'de.jensd:shichimifx:1.0.5' // compile 'de.jensd:shichimifx:1.0.5'
compile project(':dataforge-control') compile project(':dataforge-control')
compile project(':dataforge-storage') compile project(':dataforge-storage')
compile project(':dataforge-plots:plots-jfc') compile project(':dataforge-plots:plots-jfc')

View File

@ -19,9 +19,11 @@ import ch.qos.logback.classic.Level;
import hep.dataforge.control.connections.Roles; import hep.dataforge.control.connections.Roles;
import hep.dataforge.control.connections.StorageConnection; import hep.dataforge.control.connections.StorageConnection;
import hep.dataforge.exceptions.ControlException; import hep.dataforge.exceptions.ControlException;
import hep.dataforge.exceptions.StorageException;
import hep.dataforge.io.MetaFileReader; import hep.dataforge.io.MetaFileReader;
import hep.dataforge.meta.Meta; import hep.dataforge.meta.Meta;
import hep.dataforge.meta.MetaUtils; import hep.dataforge.meta.MetaUtils;
import hep.dataforge.storage.api.Storage;
import hep.dataforge.storage.commons.StorageFactory; import hep.dataforge.storage.commons.StorageFactory;
import hep.dataforge.storage.commons.StorageManager; import hep.dataforge.storage.commons.StorageManager;
import javafx.application.Application; import javafx.application.Application;
@ -95,7 +97,15 @@ public class PKT8App extends Application {
// setting up storage connections // setting up storage connections
if (config.hasNode("storage")) { if (config.hasNode("storage")) {
config.getNodes("storage").forEach(node -> { config.getNodes("storage").forEach(node -> {
device.connect(new StorageConnection(StorageFactory.buildStorage(device.getContext(), node)), Roles.STORAGE_ROLE); Storage storage = StorageFactory.buildStorage(device.getContext(), node);
if(config.hasValue("numass.run")){
try {
storage = storage.buildShelf(config.getString("numass.run"), Meta.empty());
} catch (StorageException e) {
throw new RuntimeException(e);
}
}
device.connect(new StorageConnection(storage), Roles.STORAGE_ROLE);
}); });
} }

View File

@ -6,7 +6,8 @@ import hep.dataforge.control.measurements.Measurement;
import hep.dataforge.control.measurements.MeasurementListener; import hep.dataforge.control.measurements.MeasurementListener;
import hep.dataforge.exceptions.ControlException; import hep.dataforge.exceptions.ControlException;
import hep.dataforge.exceptions.MeasurementException; import hep.dataforge.exceptions.MeasurementException;
import hep.dataforge.fx.ConsoleFragment; import hep.dataforge.fx.fragments.ConsoleFragment;
import hep.dataforge.fx.fragments.FragmentWindow;
import hep.dataforge.values.Value; import hep.dataforge.values.Value;
import javafx.application.Platform; import javafx.application.Platform;
import javafx.event.ActionEvent; import javafx.event.ActionEvent;
@ -59,9 +60,9 @@ public class PKT8Controller implements Initializable, DeviceListener, Measuremen
@Override @Override
public void initialize(URL location, ResourceBundle resources) { public void initialize(URL location, ResourceBundle resources) {
this.consoleFragment = new ConsoleFragment(); this.consoleFragment = new ConsoleFragment();
consoleFragment.bindTo(consoleButton); new FragmentWindow(consoleFragment).bindTo(consoleButton);
plotFragment = new PKT8PlotFragment(device); plotFragment = new PKT8PlotFragment(device);
plotFragment.bindTo(plotButton); new FragmentWindow(plotFragment).bindTo(plotButton);
sensorColumn.setCellValueFactory(new PropertyValueFactory<>("channel")); sensorColumn.setCellValueFactory(new PropertyValueFactory<>("channel"));
resColumn.setCellValueFactory(new PropertyValueFactory<>("rawString")); resColumn.setCellValueFactory(new PropertyValueFactory<>("rawString"));

View File

@ -1,47 +1,34 @@
package inr.numass.cryotemp; package inr.numass.cryotemp;
import hep.dataforge.fx.FXFragment; import hep.dataforge.fx.fragments.Fragment;
import javafx.fxml.FXMLLoader; import javafx.fxml.FXMLLoader;
import javafx.scene.Parent; import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
import javafx.stage.Window;
import java.io.IOException; import java.io.IOException;
/** /**
* Created by darksnake on 07-Oct-16. * Created by darksnake on 07-Oct-16.
*/ */
public class PKT8PlotFragment extends FXFragment { public class PKT8PlotFragment extends Fragment {
private final PKT8Device device; private final PKT8Device device;
private PKT8PlotController plotController; private PKT8PlotController plotController;
public PKT8PlotFragment(PKT8Device device) { public PKT8PlotFragment(PKT8Device device) {
super("PKT8 cryogenic temperature viewer", 600, 400);
this.device = device; this.device = device;
showingProperty().addListener((observable, oldValue, newValue) -> {
if (device.isMeasuring()) {
if (newValue) {
device.getMeasurement().addListener(plotController);
} else {
device.getMeasurement().removeListener(plotController);
} }
}
public PKT8PlotFragment(Window window, PKT8Device device) { });
super(window);
this.device = device;
} }
@Override @Override
protected Stage buildStage(Parent root) { protected Parent buildRoot() {
Stage stage = new Stage();
Scene scene = new Scene(root, 600, 400);
stage.setTitle("PKT8 cryogenic temperature viewer");
stage.setScene(scene);
stage.setMinHeight(400);
stage.setMinWidth(600);
stage.sizeToScene();
return stage;
}
@Override
protected Parent getRoot() {
FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/PKT8Plot.fxml")); FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/PKT8Plot.fxml"));
plotController = new PKT8PlotController(device); plotController = new PKT8PlotController(device);
loader.setController(plotController); loader.setController(plotController);
@ -51,20 +38,4 @@ public class PKT8PlotFragment extends FXFragment {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
} }
@Override
protected void onShow() {
super.onShow();
if (device.isMeasuring()) {
device.getMeasurement().addListener(plotController);
}
}
@Override
protected void onHide() {
super.onHide();
if (device.isMeasuring()) {
device.getMeasurement().removeListener(plotController);
}
}
} }

View File

@ -22,7 +22,8 @@ import hep.dataforge.control.connections.StorageConnection;
import hep.dataforge.exceptions.ControlException; import hep.dataforge.exceptions.ControlException;
import hep.dataforge.exceptions.PortException; import hep.dataforge.exceptions.PortException;
import hep.dataforge.exceptions.StorageException; import hep.dataforge.exceptions.StorageException;
import hep.dataforge.fx.ConsoleFragment; import hep.dataforge.fx.fragments.ConsoleFragment;
import hep.dataforge.fx.fragments.FragmentWindow;
import hep.dataforge.io.MetaFileReader; import hep.dataforge.io.MetaFileReader;
import hep.dataforge.meta.ConfigChangeListener; import hep.dataforge.meta.ConfigChangeListener;
import hep.dataforge.meta.Configuration; import hep.dataforge.meta.Configuration;
@ -124,7 +125,7 @@ public class MspViewController implements Initializable, MspListener {
@Override @Override
public void initialize(URL url, ResourceBundle rb) { public void initialize(URL url, ResourceBundle rb) {
logArea = new ConsoleFragment(); logArea = new ConsoleFragment();
logArea.bindTo(consoleButton); new FragmentWindow(logArea).bindTo(consoleButton);
fillamentSelector.setItems(FXCollections.observableArrayList(1, 2)); fillamentSelector.setItems(FXCollections.observableArrayList(1, 2));
fillamentSelector.setConverter(new StringConverter<Integer>() { fillamentSelector.setConverter(new StringConverter<Integer>() {
@Override @Override

View File

@ -14,7 +14,8 @@ import hep.dataforge.control.measurements.MeasurementListener;
import hep.dataforge.control.measurements.Sensor; import hep.dataforge.control.measurements.Sensor;
import hep.dataforge.exceptions.ControlException; import hep.dataforge.exceptions.ControlException;
import hep.dataforge.exceptions.MeasurementException; import hep.dataforge.exceptions.MeasurementException;
import hep.dataforge.fx.ConsoleFragment; import hep.dataforge.fx.fragments.ConsoleFragment;
import hep.dataforge.fx.fragments.FragmentWindow;
import hep.dataforge.meta.Meta; import hep.dataforge.meta.Meta;
import hep.dataforge.meta.MetaBuilder; import hep.dataforge.meta.MetaBuilder;
import hep.dataforge.plots.data.TimePlottable; import hep.dataforge.plots.data.TimePlottable;
@ -111,7 +112,7 @@ public class VacCollectorController implements Initializable, DeviceListener, Me
}); });
consoleWindow = new ConsoleFragment(); consoleWindow = new ConsoleFragment();
consoleWindow.bindTo(logButton); new FragmentWindow(consoleWindow).bindTo(logButton);
consoleWindow.hookStd(); consoleWindow.hookStd();
} }

View File

@ -16,10 +16,11 @@ import hep.dataforge.data.FileDataFactory;
import hep.dataforge.description.ActionDescriptor; import hep.dataforge.description.ActionDescriptor;
import hep.dataforge.description.DescriptorUtils; import hep.dataforge.description.DescriptorUtils;
import hep.dataforge.exceptions.NameNotFoundException; import hep.dataforge.exceptions.NameNotFoundException;
import hep.dataforge.fx.ConsoleFragment;
import hep.dataforge.fx.FXDataOutputPane; import hep.dataforge.fx.FXDataOutputPane;
import hep.dataforge.fx.FXReportListener; import hep.dataforge.fx.FXReportListener;
import hep.dataforge.fx.configuration.MetaEditor; import hep.dataforge.fx.configuration.MetaEditor;
import hep.dataforge.fx.fragments.ConsoleFragment;
import hep.dataforge.fx.fragments.FragmentWindow;
import hep.dataforge.fx.work.WorkManagerFragment; import hep.dataforge.fx.work.WorkManagerFragment;
import hep.dataforge.io.IOManager; import hep.dataforge.io.IOManager;
import hep.dataforge.io.MetaFileReader; import hep.dataforge.io.MetaFileReader;
@ -117,12 +118,12 @@ public class NumassWorkbenchController implements Initializable, StagePaneHolder
logTab.setContent(logPane.getRoot()); logTab.setContent(logPane.getRoot());
ConsoleFragment consoleWindow = new ConsoleFragment(); ConsoleFragment consoleWindow = new ConsoleFragment();
consoleWindow.bindTo(consoleButton); new FragmentWindow(consoleWindow).bindTo(consoleButton);
consoleWindow.addRootLogHandler(); consoleWindow.addRootLogHandler();
consoleWindow.hookStd(); consoleWindow.hookStd();
processWindow = new WorkManagerFragment(); processWindow = new WorkManagerFragment();
processWindow.bindTo(processButton); new FragmentWindow(processWindow).bindTo(processButton);
isRunning.addListener((ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) -> { isRunning.addListener((ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) -> {
runButton.setSelected(newValue); runButton.setSelected(newValue);

View File

@ -6,23 +6,15 @@
package inr.numass.scripts package inr.numass.scripts
import hep.dataforge.io.MetaStreamReader
import hep.dataforge.io.MetaStreamWriter import hep.dataforge.io.MetaStreamWriter
import hep.dataforge.io.envelopes.Envelope import hep.dataforge.io.envelopes.Envelope
import hep.dataforge.io.envelopes.EnvelopeBuilder
import hep.dataforge.meta.Meta import hep.dataforge.meta.Meta
import hep.dataforge.meta.MetaBuilder import hep.dataforge.meta.MetaBuilder
import hep.dataforge.storage.commons.JSONMetaWriter import hep.dataforge.storage.commons.JSONMetaWriter
import hep.dataforge.storage.commons.StorageManager
import java.io.RandomAccessFile;
import java.nio.ByteBuffer
import inr.numass.client.NumassClient
import java.nio.MappedByteBuffer
import java.nio.channels.FileChannel
import hep.dataforge.storage.commons.LoaderFactory import hep.dataforge.storage.commons.LoaderFactory
import hep.dataforge.meta.MetaBuilder import hep.dataforge.storage.commons.StorageManager
import hep.dataforge.tables.MapPoint import hep.dataforge.tables.MapPoint
import inr.numass.client.NumassClient
new StorageManager().startGlobal(); new StorageManager().startGlobal();
@ -57,7 +49,7 @@ new NumassClient("127.0.0.1",8335).withCloseable{
.build(); .build();
def response = it.sendAndRecieve(bin); def response = it.respond(bin);
println parser.writeString(response.meta()); println parser.writeString(response.meta());

View File

@ -8,19 +8,15 @@ package inr.numass.client;
import hep.dataforge.meta.Meta; import hep.dataforge.meta.Meta;
import hep.dataforge.storage.commons.StorageManager; import hep.dataforge.storage.commons.StorageManager;
import hep.dataforge.values.Value; import hep.dataforge.values.Value;
import org.apache.commons.cli.*;
import org.slf4j.LoggerFactory;
import java.io.BufferedReader; import java.io.BufferedReader;
import java.io.IOException; import java.io.IOException;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.util.Map; import java.util.Map;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.DefaultParser;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
import org.slf4j.LoggerFactory;
/** /**
*
* @author Alexander Nozik * @author Alexander Nozik
*/ */
public class Cli { public class Cli {
@ -137,8 +133,8 @@ public class Cli {
private static Options buildOptions() { private static Options buildOptions() {
Options options = new Options(); Options options = new Options();
options.addOption("a", true, "IP address of the server. Default: 192.168.111.1"); options.addOption("a", "ip", true, "IP address of the server. Default: 192.168.111.1");
options.addOption("p", true, "Server port. Default: 8335"); options.addOption("p", "port", true, "Server port. Default: 8335");
return options; return options;
} }

View File

@ -15,22 +15,17 @@
*/ */
package inr.numass.client; package inr.numass.client;
import hep.dataforge.io.envelopes.DefaultEnvelopeReader; import hep.dataforge.io.envelopes.*;
import hep.dataforge.io.envelopes.DefaultEnvelopeWriter;
import hep.dataforge.io.envelopes.Envelope;
import hep.dataforge.io.envelopes.EnvelopeBuilder;
import hep.dataforge.meta.Meta; import hep.dataforge.meta.Meta;
import hep.dataforge.meta.MetaBuilder; import hep.dataforge.meta.MetaBuilder;
import hep.dataforge.storage.commons.MessageFactory; import hep.dataforge.storage.commons.MessageFactory;
import hep.dataforge.storage.commons.StorageUtils; import hep.dataforge.storage.commons.StorageUtils;
import hep.dataforge.values.Value; import hep.dataforge.values.Value;
import inr.numass.storage.NumassStorage; import inr.numass.storage.NumassStorage;
import java.io.Closeable; import org.slf4j.LoggerFactory;
import java.io.File; import org.zeroturnaround.zip.ZipUtil;
import java.io.FileNotFoundException;
import java.io.IOException; import java.io.*;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket; import java.net.Socket;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.nio.channels.FileChannel; import java.nio.channels.FileChannel;
@ -39,14 +34,11 @@ import java.time.Instant;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import org.slf4j.LoggerFactory;
import org.zeroturnaround.zip.ZipUtil;
/** /**
*
* @author darksnake * @author darksnake
*/ */
public class NumassClient extends MessageFactory implements Closeable { public class NumassClient extends MessageFactory implements AutoCloseable, Responder {
Socket socket; Socket socket;
@ -63,7 +55,8 @@ public class NumassClient extends MessageFactory implements Closeable {
socket.close(); socket.close();
} }
public Envelope sendAndRecieve(Envelope message) { @Override
public Envelope respond(Envelope message) {
try { try {
write(message, socket.getOutputStream()); write(message, socket.getOutputStream());
return read(socket.getInputStream()); return read(socket.getInputStream());
@ -87,17 +80,17 @@ public class NumassClient extends MessageFactory implements Closeable {
} }
public Meta getCurrentRun() { public Meta getCurrentRun() {
return sendAndRecieve(requestActionBase("numass.run", "get").build()).meta(); return respond(requestActionBase("numass.run", "get").build()).meta();
} }
public Meta startRun(String name) { public Meta startRun(String name) {
return sendAndRecieve(requestActionBase("numass.run", "start") return respond(requestActionBase("numass.run", "start")
.putMetaValue("path", name) .putMetaValue("path", name)
.build()).meta(); .build()).meta();
} }
public Meta resetRun() { public Meta resetRun() {
return sendAndRecieve(requestActionBase("numass.run", "reset") return respond(requestActionBase("numass.run", "reset")
.build()).meta(); .build()).meta();
} }
@ -132,7 +125,7 @@ public class NumassClient extends MessageFactory implements Closeable {
.setData(buffer) .setData(buffer)
.build(); .build();
return sendAndRecieve(bin).meta(); return respond(bin).meta();
} catch (IOException ex) { } catch (IOException ex) {
return StorageUtils.getErrorMeta(ex); return StorageUtils.getErrorMeta(ex);
} }
@ -142,7 +135,7 @@ public class NumassClient extends MessageFactory implements Closeable {
* Get state map for given state names from the root state loader. If * Get state map for given state names from the root state loader. If
* stateNames is empty, return all states. * stateNames is empty, return all states.
* *
* @param stateName * @param stateNames
* @return * @return
*/ */
public Map<String, Value> getStates(String... stateNames) { public Map<String, Value> getStates(String... stateNames) {
@ -152,7 +145,7 @@ public class NumassClient extends MessageFactory implements Closeable {
env.putMetaValue("name", Arrays.asList(stateNames)); env.putMetaValue("name", Arrays.asList(stateNames));
} }
Meta response = sendAndRecieve(env.build()).meta(); Meta response = respond(env.build()).meta();
if (response.getBoolean("success", true)) { if (response.getBoolean("success", true)) {
Map<String, Value> res = new HashMap<>(); Map<String, Value> res = new HashMap<>();
response.getNodes("state").stream().forEach((stateMeta) -> { response.getNodes("state").stream().forEach((stateMeta) -> {
@ -178,7 +171,7 @@ public class NumassClient extends MessageFactory implements Closeable {
.setValue("value", value) .setValue("value", value)
.build()); .build());
return sendAndRecieve(env.build()).meta(); return respond(env.build()).meta();
} }
/** /**
@ -195,7 +188,7 @@ public class NumassClient extends MessageFactory implements Closeable {
.setValue("value", state.getValue()) .setValue("value", state.getValue())
.build()); .build());
}); });
return sendAndRecieve(env.build()).meta(); return respond(env.build()).meta();
} }
public Meta addNote(String text, Instant time) { public Meta addNote(String text, Instant time) {
@ -204,7 +197,7 @@ public class NumassClient extends MessageFactory implements Closeable {
if (time != null) { if (time != null) {
env.putMetaValue("note.time", time); env.putMetaValue("note.time", time);
} }
return sendAndRecieve(env.build()).meta(); return respond(env.build()).meta();
} }
public Meta getNotes(int limit) { public Meta getNotes(int limit) {
@ -212,7 +205,7 @@ public class NumassClient extends MessageFactory implements Closeable {
if (limit > 0) { if (limit > 0) {
env.putMetaValue("limit", limit); env.putMetaValue("limit", limit);
} }
return sendAndRecieve(env.build()).meta(); return respond(env.build()).meta();
} }

View File

@ -0,0 +1,50 @@
package inr.numass.client;
import hep.dataforge.exceptions.StorageException;
import hep.dataforge.meta.Meta;
import hep.dataforge.storage.api.Loader;
import hep.dataforge.storage.api.Storage;
import hep.dataforge.storage.commons.AbstractStorage;
import java.io.IOException;
/**
* Created by darksnake on 09-Oct-16.
*/
public class RemoteNumassStorage extends AbstractStorage {
private NumassClient client;
private RemoteNumassStorage(Storage parent, String name, Meta annotation) {
super(parent, name, annotation);
}
public RemoteNumassStorage(String name) {
super(name);
}
private String getIP() {
return meta().getString("numass.server.ip", "192.168.111.1");
}
private int getPort() {
return meta().getInt("numass.server.port", 8335);
}
private NumassClient getClient() throws IOException {
if (client == null) {
client = new NumassClient(getIP(), getPort());
}
return client;
}
@Override
public Loader buildLoader(Meta loaderConfiguration) throws StorageException {
return null;
}
@Override
public Storage buildShelf(String shelfName, Meta shelfConfiguration) throws StorageException {
return new RemoteNumassStorage(this, shelfName, shelfConfiguration);
}
}

View File

@ -19,7 +19,8 @@ import hep.dataforge.computation.ProgressCallback;
import hep.dataforge.context.Context; import hep.dataforge.context.Context;
import hep.dataforge.context.GlobalContext; import hep.dataforge.context.GlobalContext;
import hep.dataforge.exceptions.StorageException; import hep.dataforge.exceptions.StorageException;
import hep.dataforge.fx.ConsoleFragment; import hep.dataforge.fx.fragments.ConsoleFragment;
import hep.dataforge.fx.fragments.FragmentWindow;
import hep.dataforge.fx.work.WorkManagerFragment; import hep.dataforge.fx.work.WorkManagerFragment;
import inr.numass.NumassProperties; import inr.numass.NumassProperties;
import inr.numass.storage.NumassData; import inr.numass.storage.NumassData;
@ -102,8 +103,8 @@ public class MainViewerController implements Initializable {
public void initialize(URL url, ResourceBundle rb) { public void initialize(URL url, ResourceBundle rb) {
ConsoleFragment consoleFragment = new ConsoleFragment(); ConsoleFragment consoleFragment = new ConsoleFragment();
consoleFragment.hookStd(); consoleFragment.hookStd();
consoleFragment.bindTo(consoleButton); new FragmentWindow(consoleFragment).bindTo(consoleButton);
WorkManagerFragment.attachToContext(GlobalContext.instance()).bindTo(processManagerButton); new FragmentWindow(WorkManagerFragment.attachToContext(GlobalContext.instance())).bindTo(processManagerButton);
mspController = new MspViewController(getContext()); mspController = new MspViewController(getContext());
this.mspTab.setContent(mspController.getRoot()); this.mspTab.setContent(mspController.getRoot());