Commit f1fe12db authored by Vincent van Beveren's avatar Vincent van Beveren

Finished selecting of values

Can now choose update interval
Can now save to file
parent 3dc0a5ff
package nl.nikhef.safaripark;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.Icon;
@SuppressWarnings("serial")
public abstract class ExtendedAbstractAction extends AbstractAction {
public ExtendedAbstractAction(String name, Icon icon, String shortDescription) {
super(name, icon);
putValue(Action.SHORT_DESCRIPTION, shortDescription);
}
}
\ No newline at end of file
package nl.nikhef.safaripark.monitor;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.Action;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSpinner;
import javax.swing.JTable;
import javax.swing.JToolBar;
import javax.swing.SpinnerListModel;
import javax.swing.SpinnerModel;
import javax.swing.SpinnerNumberModel;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableColumnModel;
import nl.nikhef.safaripark.ExtendedAbstractAction;
import nl.nikhef.safaripark.res.Resources;
import nl.nikhef.safaripark.vsp.ValueSelectionPane;
import nl.nikhef.sfp.ddmi.DDMI;
import nl.nikhef.sfp.ddmi.DDMIElement;
import nl.nikhef.sfp.ddmi.DDMIValue;
import nl.nikhef.tools.Filter;
@SuppressWarnings("serial")
public class Monitor extends JPanel implements ActionListener {
public class Monitor extends JPanel implements ActionListener, ChangeListener {
private JTable _table;
private JToolBar _tbar;
private Timer _timer;
private ValueSelectionPane _vsp;
private JFileChooser _fcStore;
private DateFormat _fileDateFormat = new SimpleDateFormat("yyMMdd_HHmmss");
private PrintWriter _logFile;
private static class Rate {
private final String name;
private final int interval;
public Rate(String name, int interval) {
this.interval = interval;
this.name = name;
}
@Override
public String toString() {
return this.name;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + interval;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Rate other = (Rate) obj;
if (interval != other.interval)
return false;
return true;
}
}
private Rate[] updateRates = new Rate[] {
new Rate("1 second", 1), new Rate("2 seconds", 2), new Rate("5 seconds", 5),
new Rate("10 seconds", 10), new Rate("30 seconds", 30), new Rate("1 minute", 60),
new Rate("5 minutes", 300), new Rate("10 minutes", 600) };
private JSpinner _interval;
private Action _selectColumns = new ExtendedAbstractAction("Columns", Resources.getIcon("table-gear"), "Select which columns to show and log") {
@Override
public void actionPerformed(ActionEvent e)
{
_vsp.setSelection(_mm.getColumns());
if (_vsp.showModel(Monitor.this)) {
_mm.setColumns(_vsp.getSelection());
}
}
};
private Action _recData = new ExtendedAbstractAction("Record", Resources.getIcon("media-record-2"), "Record data to file") {
@Override
public void actionPerformed(ActionEvent e)
{
startRecord();
}
};
private Action _stopData = new ExtendedAbstractAction("Stop", Resources.getIcon("media-playback-stop-2"), "Stop recording data to file") {
@Override
public void actionPerformed(ActionEvent e) {
stopRecord();
}
};
private MonitorModel _mm;
public Monitor() {
......@@ -45,18 +151,120 @@ public class Monitor extends JPanel implements ActionListener {
JScrollPane sp = new JScrollPane(_table);
_tbar = new JToolBar("Monitor");
_tbar.add(_selectColumns);
_tbar.add(_recData);
_tbar.add(_stopData);
_stopData.setEnabled(false);
_tbar.addSeparator();
_tbar.add(new JLabel(" Update rate "));
_interval = new JSpinner(new SpinnerListModel(updateRates));
_interval.setValue(updateRates[2]);
((JSpinner.DefaultEditor) _interval.getEditor()).getTextField().setEditable(false);
Dimension d = _interval.getPreferredSize();
d.width = 100;
_interval.setPreferredSize(d);
_interval.setMaximumSize(d);
_tbar.add(_interval);
_interval.addChangeListener(this);
_tbar.setFloatable(false);
_vsp = new ValueSelectionPane();
_vsp.init(new Filter<DDMIElement>() {
@Override
public boolean match(DDMIElement other) {
if (!(other instanceof DDMIValue)) {
return false;
}
DDMIValue v = DDMIValue.class.cast(other);
return v.isMonitor();
}
@Override
public Class<DDMIElement> getFilterClass() {
return DDMIElement.class;
}
}, "monitor_cols");
add(_tbar, BorderLayout.NORTH);
add(sp, BorderLayout.CENTER);
_fcStore = new JFileChooser();
FileNameExtensionFilter filter = new FileNameExtensionFilter("Column Separated Values", "csv");
_fcStore.setFileFilter(filter);
_fcStore.setFileSelectionMode(JFileChooser.FILES_ONLY);
_fcStore.setDialogTitle("Specify name of recording file");
_timer = new Timer(5000, this);
_timer.setRepeats(true);
_timer.start();
}
private void startRecord()
{
String filename = "sfpdata_" + _fileDateFormat.format(new Date()) + ".csv";
_fcStore.setSelectedFile(new File(filename));
if (_fcStore.showSaveDialog(Monitor.this) != JFileChooser.APPROVE_OPTION) return;
try {
_logFile = new PrintWriter(_fcStore.getSelectedFile());
_mm.writeHeader(_logFile);
} catch (FileNotFoundException e) {
// TODO logging and error stuff
e.printStackTrace();
if (_logFile != null) {
try {
_logFile.close();
} catch (Exception e2) {};
_logFile = null;
}
return;
}
_recData.setEnabled(false);
_stopData.setEnabled(true);
_selectColumns.setEnabled(false);
_interval.setEnabled(false);
}
private void stopRecord() {
if (_logFile != null) {
_logFile.close();
_logFile = null;
}
_recData.setEnabled(true);
_stopData.setEnabled(false);
_selectColumns.setEnabled(true);
_interval.setEnabled(true);
}
@Override
public void actionPerformed(ActionEvent e) {
_mm.fireTableDataChangedPreserveSelect();
_mm.updateData();
if (_logFile != null) {
_mm.writeData(_logFile);
}
}
@Override
public void stateChanged(ChangeEvent e) {
_timer.setInitialDelay(Rate.class.cast(_interval.getValue()).interval * 1000);
_timer.setDelay(Rate.class.cast(_interval.getValue()).interval * 1000);
_timer.restart();
}
}
package nl.nikhef.safaripark.monitor;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.SortedSet;
......@@ -35,6 +36,7 @@ public class MonitorModel extends AbstractTableModel implements SFPDeviceListene
final SFPDevice dev;
final int bay;
DDMIContext ctx;
private String[] data;
public DevAndBay(SFPDevice dev, int bay) throws IOException {
......@@ -68,6 +70,15 @@ public class MonitorModel extends AbstractTableModel implements SFPDeviceListene
}
public List<DDMIValue> getColumns() {
return _columns;
}
public void setColumns(List<DDMIValue> columns) {
_columns = columns;
fireTableStructureChanged();
}
@Override
public int getColumnCount() {
return _columns.size() + 1;
......@@ -84,6 +95,35 @@ public class MonitorModel extends AbstractTableModel implements SFPDeviceListene
return _rows.size();
}
public void updateData()
{
for (int i = 0; i < _rows.size(); i++)
{
DevAndBay dab = _rows.get(i);
if (dab.data == null || dab.data.length != _columns.size())
{
dab.data = new String[_columns.size()];
}
for (int j = 0; j < _columns.size(); j++)
{
DDMIValue val = _columns.get(j);
if (val.isValid(dab.ctx)) {
try {
dab.data[j] = val.getValueAsSting(dab.ctx);
} catch (Exception e) {
dab.data[j] = "?";
}
} else {
dab.data[j] = "-";
}
}
}
fireTableDataChangedPreserveSelect();
}
@Override
public Object getValueAt(int row, int col) {
......@@ -92,19 +132,12 @@ public class MonitorModel extends AbstractTableModel implements SFPDeviceListene
if (col == 0) {
return dab.dev.getModuleSerial(dab.bay);
} else {
DDMIValue val = _columns.get(col - 1);
if (val.isValid(dab.ctx)) {
try {
return val.getValueAsSting(dab.ctx);
} catch (Exception e) {
return "?";
}
} else {
return "-";
if (dab.data != null && (col - 1) < dab.data.length)
{
return dab.data[col - 1];
}
return "?";
}
}
......@@ -170,6 +203,33 @@ public class MonitorModel extends AbstractTableModel implements SFPDeviceListene
dev.removeDeviceListener(this);
}
public void writeHeader(PrintWriter logFile) {
logFile.print("Module Serial");
for (DDMIValue val : _columns) {
logFile.print(";" + val.getName());
}
logFile.println();
}
public void writeData(PrintWriter logFile)
{
for (int i = 0; i < _rows.size(); i++)
{
DevAndBay dab = _rows.get(i);
logFile.print(dab.dev.getModuleSerial(dab.bay));
for (int j = 0; j < _columns.size(); j++)
{
logFile.print(";");
logFile.print(dab.data[j]);
}
logFile.println();
}
}
}
......@@ -18,11 +18,10 @@ import java.util.Vector;
import java.util.prefs.BackingStoreException;
import java.util.prefs.Preferences;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.DefaultComboBoxModel;
import javax.swing.Icon;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
......@@ -35,6 +34,7 @@ import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import nl.nikhef.safaripark.ExtendedAbstractAction;
import nl.nikhef.safaripark.res.Resources;
import nl.nikhef.sfp.ddmi.DDMI;
import nl.nikhef.sfp.ddmi.DDMIElement;
......@@ -55,16 +55,7 @@ public class ValueSelectionPane extends JPanel implements ItemListener {
private Map<String, CheckableTreeNode> _pathMapping = new HashMap<String, CheckableTreeNode>();
private boolean _ignorePresetEvents = false;
private abstract class ExtendedAbstractAction extends AbstractAction {
public ExtendedAbstractAction(String name, Icon icon, String shortDescription) {
super(name, icon);
putValue(Action.SHORT_DESCRIPTION, shortDescription);
}
}
@SuppressWarnings("serial")
private Action _saveAction = new ExtendedAbstractAction("Save", Resources.getIcon("disk"), "Save preset") {
@Override
......@@ -114,6 +105,7 @@ public class ValueSelectionPane extends JPanel implements ItemListener {
};
@SuppressWarnings("serial")
private Action _deleteAction = new ExtendedAbstractAction("Delete", Resources.getIcon("bin-delete"),"Delete current preset") {
@Override
......@@ -298,7 +290,7 @@ public class ValueSelectionPane extends JPanel implements ItemListener {
}
public Collection<DDMIValue> getSelection()
public List<DDMIValue> getSelection()
{
List<DDMIValue> values = new ArrayList<DDMIValue>();
......@@ -321,8 +313,25 @@ public class ValueSelectionPane extends JPanel implements ItemListener {
}
}
}
private void crawlSetSelected(CheckableTreeNode tn, Collection<DDMIValue> values)
{
for (int i = 0; i < tn.getChildCount(); i++)
{
CheckableTreeNode child = CheckableTreeNode.class.cast(tn.getChildAt(i));
if (child.isLeaf()) {
if (values.contains(child.getUserObject())) {
child.check();
} else {
child.uncheck();
}
} else {
crawlSetSelected(child, values);
}
}
}
static ValueSelectionPane vsp;
public static void main(String[] args) {
......@@ -409,4 +418,16 @@ public class ValueSelectionPane extends JPanel implements ItemListener {
updateActions();
}
public boolean showModel(JComponent parent) {
return JOptionPane.showOptionDialog(parent, new JComponent[] { this }, "Select elements", JOptionPane.OK_CANCEL_OPTION, JOptionPane.INFORMATION_MESSAGE,
null, null, null) == JOptionPane.OK_OPTION;
}
public void setSelection(List<DDMIValue> columns) {
crawlSetSelected(_root, columns);
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment