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

completed clone tool

removed print stuff
parent c795c870
......@@ -151,7 +151,7 @@ public class MultiSFPDevice extends SFPDeviceBase {
_modulePresentMask = nowPresent;
System.out.printf("Present: %02x\n", _modulePresentMask);
// System.out.printf("Present: %02x\n", _modulePresentMask);
if (changes != 0) {
for (int i = 0; i < NO_OF_BAYS; ++i)
......
......@@ -29,7 +29,7 @@ public class MultiSFPProvider extends SFPProviderBase
{
devs = FTDevice.getDevices(true);
System.out.printf("FTDevice.getDevices() Found %d devices\n", devs.size());
// System.out.printf("FTDevice.getDevices() Found %d devices\n", devs.size());
}
for (FTDevice devRaw : devs)
......
......@@ -9,8 +9,10 @@ public abstract class DDMIElement {
private String _id;
private String _condition;
private String _name;
private String _qName;
private DDMIElement _parent;
private String _sourceId;
......@@ -75,7 +77,7 @@ public abstract class DDMIElement {
sb.append(Character.toLowerCase(c));
}
}
System.out.println("Created name " + sb.toString());
// System.out.println("Created name " + sb.toString());
_name = sb.toString();
}
......@@ -151,6 +153,33 @@ public abstract class DDMIElement {
return true;
}
public String getQualifiedName() {
if (_qName == null) {
makeQName();
}
return _qName;
}
private void makeQName() {
if (_parent != null) {
_qName = _parent.getQualifiedName();
} else {
_qName = null;
}
if (_qName == null) {
_qName = getName();
} else if (getName() != null) {
_qName = _qName + "." + getName();
}
}
}
......@@ -51,7 +51,7 @@ public class DDMIMeta<T extends Object> {
private float _offset = 0;
public Conversion() {
System.out.println("Conversion created, no args");
// System.out.println("Conversion created, no args");
}
public void setScaling(float scale, float offset)
......
......@@ -205,6 +205,7 @@ public class DDMIValue extends DDMIElement {
}
}
......
......@@ -95,7 +95,7 @@ public abstract class DataSource {
if (nLen % 8 != 0) {
nLen = nLen + (8 - (nLen % 8));
}
System.out.printf("Rescaling write, old-off=%d new-off=%d old-len=%d new-len=%d\n", off, nOff, data.length, nLen);
// System.out.printf("Rescaling write, old-off=%d new-off=%d old-len=%d new-len=%d\n", off, nOff, data.length, nLen);
byte[] newData = read(ctx, nOff, nLen);
System.arraycopy(data, 0, newData, err, data.length);
......
......@@ -24,7 +24,7 @@ public class I2CDataSource extends DataSource {
if (i2c == null) return new byte[len];
System.out.printf("Read media %02x, off=%d, len=%d\n", _addr, off, len);
// System.out.printf("Read media %02x, off=%d, len=%d\n", _addr, off, len);
byte[] offData = new byte[] { (byte)off };
try {
......
......@@ -202,7 +202,28 @@ public final class Utils {
}
}
final protected static char[] hexArray = "0123456789ABCDEF".toCharArray();
public static String bytesToHexString(byte[] bytes) {
char[] hexChars = new char[bytes.length * 2];
for ( int j = 0; j < bytes.length; j++ ) {
int v = bytes[j] & 0xFF;
hexChars[j * 2] = hexArray[v >>> 4];
hexChars[j * 2 + 1] = hexArray[v & 0x0F];
}
return new String(hexChars);
}
public static byte[] hexStringToBytes(String s) {
int len = s.length();
if ((len & 1) != 0) return null;
byte[] data = new byte[len / 2];
for (int i = 0; i < len; i += 2) {
data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
+ Character.digit(s.charAt(i+1), 16));
}
return data;
}
}
......@@ -195,7 +195,7 @@ public class FTDevice {
}
Logger.getLogger(FTDevice.class.getName()).log(Level.INFO,
Logger.getLogger(FTDevice.class.getName()).log(Level.FINE,
"Found devs: {0} (All:{1})",
new Object[]{devs.size(), devNum.getValue()});
......@@ -226,7 +226,7 @@ public class FTDevice {
}
Logger.getLogger(FTDevice.class.getName()).log(Level.INFO,
Logger.getLogger(FTDevice.class.getName()).log(Level.FINE,
"Found devs: {0} (All:{1})",
new Object[]{devs.size(), devNum.getValue()});
......@@ -288,7 +288,7 @@ public class FTDevice {
}
Logger.getLogger(FTDevice.class.getName()).log(Level.INFO,
Logger.getLogger(FTDevice.class.getName()).log(Level.FINE,
"Found devs: {0} (All:{1})",
new Object[]{devs.size(), devNum.getValue()});
......
......@@ -43,7 +43,7 @@ public class PCA9848 {
*/
public void setChannels(int bitmask) throws IOException
{
System.out.printf("Select: %02x\n", bitmask);
// System.out.printf("Select: %02x\n", bitmask);
_i2c.write(_addr, new byte[] { (byte)bitmask });
}
......
......@@ -25,7 +25,7 @@ public class JavaFTD2xxMPSSE extends MPSSE {
*/
public JavaFTD2xxMPSSE(FTDevice dev) throws IOException
{
System.out.println("JavaFTD2xxMPSEE created");
// System.out.println("JavaFTD2xxMPSEE created");
ftdi = dev;
ftdi.open();
}
......@@ -54,7 +54,7 @@ public class JavaFTD2xxMPSSE extends MPSSE {
try {
q = ftdi.getQueueStatus();
} catch (FTD2XXException e) {
System.out.printf("Error, with FTDI handle, attempting to recover\n");
// System.out.printf("Error, with FTDI handle, attempting to recover\n");
ftdi.open();
switchMode(_pinDirs);
}
......@@ -82,14 +82,14 @@ public class JavaFTD2xxMPSSE extends MPSSE {
}
ftdi.purgeBuffer(true, true);
System.out.println("Error:" + sb.toString());
// System.out.println("Error:" + sb.toString());
throw new IOException(sb.toString());
}
public void close() throws FTD2XXException {
System.out.println("FTDI Close");
// System.out.println("FTDI Close");
ftdi.close();
}
......
......@@ -60,6 +60,9 @@
java -cp "rebus.jar;jna-4.3.0.jar;nikhef-tools.jar;luaj-jse-3.0.1.jar;jsfp.jar;safaripark.jar;miglayout-4.0-swing.jar" nl.nikhef.safaripark.SaFariPark
pause
</echo>
<zip destfile="safaripark-${git.branch}-${git.tag}-${git.revision}.zip" basedir="${dist}">
</zip>
</target>
<target name="compile" depends="jsfp">
......
......@@ -18,7 +18,6 @@ public class ActiveLogArea extends TextArea {
setEditable(false);
Logger gLogger = Logger.getLogger("");
System.out.println(gLogger);
gLogger.addHandler(new Handler() {
@Override
......@@ -28,7 +27,6 @@ public class ActiveLogArea extends TextArea {
@Override
public void run() {
String txt = String.format("[%s] %s (%s)\n", record.getLevel(), _format.formatMessage(record), record.getLoggerName());
System.out.println(txt);
append(txt);
}
......
......@@ -143,7 +143,7 @@ public class ModuleManager implements BaySelectionListener
for (DataSource ds : orderedSources)
{
if (!ds.isValid(_ctx)) continue;
System.out.println("Exporting datasource " + ds);
// System.out.println("Exporting datasource " + ds);
try {
......@@ -173,7 +173,7 @@ public class ModuleManager implements BaySelectionListener
for (DataSource ds : orderedSources)
{
if (!ds.isValid(_ctx)) continue;
System.out.println("Exporting datasource " + ds);
// System.out.println("Exporting datasource " + ds);
try {
......
......@@ -14,8 +14,10 @@ import java.io.InputStream;
import java.util.Locale;
import java.util.Map.Entry;
import java.util.Properties;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.LogManager;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.inject.Inject;
......@@ -127,7 +129,9 @@ public class SaFariPark extends JFrame implements BaySelectionListener, WindowLi
_status = new StatusBar();
_modMgr = new ModuleManager(_saveBinary, _loader, _ctxCache);
_devMgr.addDeviceSelectedListener(_modMgr);
_dp = new DollyPanel(_loader, new DollyModel());
DollyModel dm = new DollyModel(_ctxCache);
_sfpManager.addSFPProviderListener(dm);
_dp = new DollyPanel(_loader, dm);
makeToolbar();
JSplitPane split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
split.setDividerLocation(300);
......@@ -256,6 +260,11 @@ public class SaFariPark extends JFrame implements BaySelectionListener, WindowLi
LogManager.getLogManager().getLogger("").setLevel(Level.INFO);
Logger globalLogger = Logger.getLogger("");
Handler[] handlers = globalLogger.getHandlers();
for(Handler handler : handlers) {
globalLogger.removeHandler(handler);
}
if (args.length == 2 && args[0].equals("--setdpi")){
......
package nl.nikhef.safaripark;
import java.awt.BorderLayout;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.LogRecord;
import java.util.logging.Logger;
import java.util.logging.SimpleFormatter;
import javax.swing.BorderFactory;
import javax.swing.JLabel;
......@@ -17,6 +22,8 @@ public class StatusBar extends JPanel {
private int _max;
private volatile boolean _prgsUdPending = false;
private SimpleFormatter _format = new SimpleFormatter();
public StatusBar() {
setLayout(new BorderLayout());
setBorder(BorderFactory.createEtchedBorder());
......@@ -25,9 +32,53 @@ public class StatusBar extends JPanel {
_pb = new JProgressBar();
add(_pb, BorderLayout.LINE_END);
_pb.setEnabled(false);
loggerAsStatus();
}
private void loggerAsStatus() {
Logger gLogger = Logger.getLogger("");
gLogger.addHandler(new Handler() {
@Override
public void publish(final LogRecord record) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
if (record.getLevel().intValue() < Level.INFO.intValue()) return;
String txt = _format.formatMessage(record);
setStatus(txt);
}
});
}
@Override
public void flush() {
}
@Override
public void close() throws SecurityException {
}
});
}
private synchronized void updateProgress() {
if (!_prgsUdPending) return;
if (_max == -1) {
......
package nl.nikhef.safaripark.dolly;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.logging.Logger;
import javax.swing.ComboBoxModel;
import javax.swing.DefaultComboBoxModel;
import javax.swing.DefaultListModel;
import javax.swing.ListModel;
import nl.nikhef.safaripark.devmgr.BaySelectionListener;
import nl.nikhef.safaripark.ContextCache;
import nl.nikhef.safaripark.extra.Module;
import nl.nikhef.sfp.SFPDevice;
import nl.nikhef.sfp.SFPDeviceListener;
import nl.nikhef.sfp.SFPProvider;
import nl.nikhef.sfp.SFPProviderListener;
import nl.nikhef.sfp.ddmi.DDMIValue;
public class DollyModel implements SFPDeviceListener, BaySelectionListener {
public class DollyModel implements SFPDeviceListener, SFPProviderListener {
private DefaultComboBoxModel<Module> _dcb;
private static final Logger LOG = Logger.getLogger(DollyModel.class.getSimpleName());
private DefaultComboBoxModel<Module> _dcb = new DefaultComboBoxModel<Module>();
private DefaultListModel<Module> _dlm = new DefaultListModel<Module>();
private File _sourceFile;
private Module _sourceModule;
private File _targetFile;
private Collection<Module> _targetModules;
private String _errorMessage;
private List<DDMIValue> _selectedValues;
private ContextCache _cc;
public DollyModel()
public DollyModel(ContextCache cc)
{
_cc = cc;
}
public ComboBoxModel<Module> getInputComboboxModel() {
return _dcb;
}
public ListModel<Module> getOutputListModel() {
return _dlm;
}
......@@ -20,21 +54,161 @@ public class DollyModel implements SFPDeviceListener, BaySelectionListener {
@Override
public void sfpModuleStateChanged(SFPDevice dev, int bay)
{
Module mod = new Module(dev, bay);
if (dev.isModulePresent(bay))
{
_dcb.addElement(mod);
_dlm.addElement(mod);
} else {
_dcb.removeElement(mod);
_dlm.removeElement(mod);
}
}
@Override
public void baySelected(SFPDevice dev, int bay) {
public void sfpDeviceAdded(SFPProvider provider, SFPDevice dev) {
dev.addDeviceListener(this);
}
@Override
public boolean canSelectBay(SFPDevice dev, int bay) {
return true;
public void sfpDeviceRemoved(SFPProvider provider, SFPDevice dev) {
dev.removeDeviceListener(this);
}
public void setSourceModule(Module m) {
_sourceModule = m;
_sourceFile = null;
}
public void setSourceFile(File sourceFile) {
_sourceFile = sourceFile;
_sourceModule = null;
}
public void setTargetFile(File targetFile) {
_targetFile = targetFile;
}
private void checkErrors()
{
_errorMessage = null;
if (_sourceFile == null && _sourceModule == null) {
_errorMessage = "No valid source";
return;
}
if (_sourceFile != null && !_sourceFile.isFile()) {
_errorMessage = "Source file does not exist";
return;
}
if ((_targetModules == null || _targetModules.isEmpty()) && _targetFile == null) {
_errorMessage = "No target specified";
return;
}
if (_targetModules != null && _targetModules.contains(_sourceModule)) {
_errorMessage = "Target can not be source";
return;
}
if (_selectedValues == null || _selectedValues.size() == 0)
{
_errorMessage = "No values selected";
return;
}
}
public boolean canRun() {
checkErrors();
return _errorMessage == null;
}
public String getErrorMessage() {
return _errorMessage;
}
public void setTargetModules(Collection<Module> selectedItems) {
_targetModules = selectedItems;
}
public void setSelectedValues(List<DDMIValue> selection) {
_selectedValues = selection;
}
public void doClone() {
ValueGetter vg;
if (_sourceFile != null) {
try {
vg = new FileValueGetter(_sourceFile);
} catch (IOException e) {
LOG.severe(String.format("Clone failed, could not load file %s: %s", _sourceFile.getPath(), e));
return;
}
} else {
vg = new ModuleValueGetter(_cc, _sourceModule);
}
List<ValueSetter> vs = new ArrayList<ValueSetter>();
for (Module m : _targetModules) {
vs.add(new ModuleValueSetter(_cc, m));
}
if (_targetFile != null) {
vs.add(new FileValueSetter(_targetFile));
}
for (DDMIValue v : _selectedValues)
{
byte[] value;
try {
value = vg.getValue(v);
} catch (IOException e) {
LOG.severe("Clone failed : " + e);
break;
}
if (value == null || value.length == 0) continue;
for (ValueSetter setter : vs) {
try {
setter.setValue(v, value);
} catch (IOException e) {
LOG.warning(String.format("Failed to set value %s to %s: %s", v, setter, e));
}
}
}
for (ValueSetter setter : vs) {
try {
setter.finished();
} catch (IOException e) {
LOG.warning(String.format("Failed to finish %s: %s", setter, e));
}
}
LOG.info(String.format("Cloned %d value(s) to %d output(s)", _selectedValues.size(), vs.size()));
}
}
package nl.nikhef.safaripark.dolly;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.io.File;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JSeparator;
import javax.swing.plaf.basic.BasicBorders.RadioButtonBorder;
import javax.swing.JTextField;
import javax.swing.filechooser.FileNameExtensionFilter;
import net.miginfocom.swing.MigLayout;
import nl.nikhef.safaripark.Title;
import nl.nikhef.safaripark.extra.CheckableList;
import nl.nikhef.safaripark.extra.Module;
import nl.nikhef.safaripark.res.Resources;
import nl.nikhef.safaripark.vsp.ValueSelectionPane;
import nl.nikhef.sfp.ddmi.DDMIElement;
......@@ -25,23 +33,30 @@ import nl.nikhef.sfp.ddmi.DDMILoader;
import nl.nikhef.sfp.ddmi.DDMIValue;
import nl.nikhef.tools.Filter;
public class DollyPanel extends JPanel {
public class DollyPanel extends JPanel implements ActionListener, ItemListener {
private ValueSelectionPane _vsp;
private JRadioButton _sourceFile = new JRadioButton("File:");
private JLabel _sourceFileName = new JLabel("<none>");
private JButton _sourceFileSelect = new JButton("...");
private JRadioButton _sourceDevice = new JRadioButton("Device:");
private JRadioButton _sourceFileOption = new JRadioButton("File:");
private JTextField _sourceFileName = new JTextField("<none>");
private JButton _sourceFileSelect = new JButton("...");
private JRadioButton _sourceModuleOption = new JRadioButton("Device:");
private JComboBox<Module> _sourceModule;
private File _sourceFile;
private JCheckBox _targetFile = new JCheckBox("File: ");
private JLabel _targetFileName = new JLabel("<none>");
private JButton _targetFileSelect = new JButton("...");
private JCheckBox _targetFileOption = new JCheckBox("File: ");
private JTextField _targetFileName = new JTextField("<none>");
private JButton _targetFileSelect = new JButton("...");
private CheckableList<Module> _targetModuleSelects;
private File _targetFile;
private JButton _clone = new JButton("Clone");
private JButton _clone = new JButton("Clone");
private JLabel _errorMsg = new JLabel();
private DollyModel _model;
private DollyModel _model;
private JFileChooser _fileChooser;
public DollyPanel(DDMILoader loader, DollyModel model) {
......@@ -60,13 +75,15 @@ public class DollyPanel extends JPanel {
source.add(new JLabel("Source"), "wrap");
source.add(new JSeparator(),"growx, span 3, wrap");
ButtonGroup bg = new ButtonGroup();
bg.add(_sourceDevice);
bg.add(_sourceFile);
_sourceDevice.setSelected(true);
source.add(_sourceDevice);
source.add(new JComboBox<String>(),"growx, span 2,wrap");
source.add(_sourceFile);
source.add(_sourceFileName);
bg.add(_sourceModuleOption);
bg.add(_sourceFileOption);
_sourceModuleOption.setSelected(true);
source.add(_sourceModuleOption);
_sourceModule = new JComboBox<Module>(_model.getInputComboboxModel());
source.add(_sourceModule,"growx, span 2,wrap");
source.add(_sourceFileOption);
source.add(_sourceFileName, "growx");
_sourceFileName.setEditable(false);
source.add(_sourceFileSelect,"wrap");
core.add(source, BorderLayout.NORTH);
......@@ -80,9 +97,14 @@ public class DollyPanel extends JPanel {
target.add(new JLabel("Targets"), "wrap");
target.add(new JSeparator(),"growx, span 3, wrap");
target.add(new JLabel("Devices: "));
target.add(new JScrollPane(new JList<String>()),"growx, span 2, wrap");
target.add(_targetFile);
target.add(_targetFileName);
_targetModuleSelects = new CheckableList<Module>(_model.getOutputListModel());
JScrollPane jsp = new JScrollPane(_targetModuleSelects);
target.add(new JScrollPane(_targetModuleSelects),"growx, span 2, wrap, height :100:");
target.add(_targetFileOption);
target.add(_targetFileName, "growx");
_targetFileName.setEditable(false);
target.add(_targetFileSelect,"wrap");
core.add(target, BorderLayout.SOUTH);
......@@ -108,14 +130,135 @@ public class DollyPanel extends JPanel {
}, "dolly");
_vsp.addItemListener(this);
add(core, BorderLayout.CENTER);
JPanel buttons = new JPanel();
buttons.setLayout(new BorderLayout());
_errorMsg.setIcon(Resources.getIcon("emblem-notice"));
_errorMsg.setForeground(Color.RED);
_errorMsg.setVisible(false);
buttons.add(_errorMsg, BorderLayout.CENTER);
buttons.add(_clone, BorderLayout.EAST);
add(buttons, BorderLayout.SOUTH);
_fileChooser = new JFileChooser();
FileNameExtensionFilter filter = new FileNameExtensionFilter("SFP Module values", "smv");
_fileChooser.setFileFilter(filter);
_sourceModuleOption.addActionListener(this);
_sourceFileOption.addActionListener(this);
_targetFileOption.addActionListener(this);
_targetModuleSelects.addItemListener(this);
_sourceModule.addItemListener(this);
_targetFileSelect.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
selectTargetFile();
}
});
_sourceFileSelect.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
selectSourceFile();
}
});
_clone.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
_model.doClone();
}
});
updateAll();
}
protected void selectSourceFile()
{
if (_fileChooser.showOpenDialog(this) != JFileChooser.APPROVE_OPTION) return;
_sourceFile = _fileChooser.getSelectedFile();
_sourceFileName.setText(_sourceFile.getPath());
updateAll();
}
protected void selectTargetFile() {
if (_fileChooser.showSaveDialog(this) != JFileChooser.APPROVE_OPTION) return;
_targetFile = _fileChooser.getSelectedFile();
String targetFileName = _targetFile.getPath();
if (!targetFileName.toLowerCase().endsWith(".smv")) {
_targetFile = new File(targetFileName + ".smv");
}
_targetFileName.setText(_targetFile.getPath());
updateAll();
}
private void updateEnabled() {
_sourceModule.setEnabled(_sourceModuleOption.isSelected());
_sourceFileSelect.setEnabled(_sourceFileOption.isSelected());
_targetFileSelect.setEnabled(_targetFileOption.isSelected());
}
private void updateModel() {
if (_sourceModuleOption.isSelected())
{
// source module must be selected
Module m = Module.class.cast(_sourceModule.getSelectedItem());
_model.setSourceModule(m);
} else {
_model.setSourceFile(_sourceFile);
}
if (_targetFileOption.isSelected()) {
_model.setTargetFile(_targetFile);
}
_model.setTargetModules(_targetModuleSelects.getSelectedItems());
_model.setSelectedValues(_vsp.getSelection());
if (_model.canRun()) {
_clone.setEnabled(true);
_errorMsg.setVisible(false);
} else {
_clone.setEnabled(false);
_errorMsg.setText(_model.getErrorMessage());
_errorMsg.setVisible(true);
}
}
private void updateAll() {
updateModel();
updateEnabled();
}
@Override
public void actionPerformed(ActionEvent e)
{
updateAll();
}
@Override
public void itemStateChanged(ItemEvent e) {
updateAll();
}
}
package nl.nikhef.safaripark.dolly;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.util.Properties;
import nl.nikhef.sfp.ddmi.DDMIValue;
import nl.nikhef.tools.Utils;
public class FileValueGetter implements ValueGetter {
private Properties _props = new Properties();
public FileValueGetter(File sourceFile) throws IOException {
Reader r = new FileReader(sourceFile);
try {
_props.load(r);
} finally {
try {
r.close();
} catch (IOException e) {};
}
}
@Override
public byte[] getValue(DDMIValue v) {
String name = v.getQualifiedName();
String prop = _props.getProperty(name, null);
if (prop == null) return null;
return Utils.hexStringToBytes(prop);
}
}
package nl.nikhef.safaripark.dolly;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.Writer;
import java.util.Properties;
import nl.nikhef.sfp.ddmi.DDMIValue;
import nl.nikhef.tools.Utils;
public class FileValueSetter implements ValueSetter {
private Properties _props;
private File _target;
public FileValueSetter(File targetFile)
{
_props = new Properties();
_target = targetFile;
}
@Override
public void setValue(DDMIValue value, byte[] data) throws IOException
{
String qName = value.getQualifiedName();
_props.setProperty(qName, Utils.bytesToHexString(data));
}
@Override
public void finished() throws IOException {
Writer w = new FileWriter(_target);
try {
_props.store(w, "SFP Module Values file");
} finally {
try {
w.close();
} catch (IOException e) { } // prevent close exception from overwriting the actual error
}
}
}
package nl.nikhef.safaripark.dolly;
import java.io.IOException;
import nl.nikhef.safaripark.ContextCache;
import nl.nikhef.safaripark.extra.Module;
import nl.nikhef.sfp.ddmi.DDMIValue;
public class ModuleValueGetter implements ValueGetter {
private Module _mod;
private ContextCache _ctxCache;
public ModuleValueGetter(ContextCache cache, Module sourceModule)
{
_mod = sourceModule;
_ctxCache = cache;
}
@Override
public byte[] getValue(DDMIValue v) throws IOException {
return v.readRaw(_ctxCache.getContextFor(_mod.dev, _mod.bay));
}
}
package nl.nikhef.safaripark.dolly;
import java.io.IOException;
import nl.nikhef.safaripark.ContextCache;
import nl.nikhef.safaripark.extra.Module;
import nl.nikhef.sfp.ddmi.DDMI;
import nl.nikhef.sfp.ddmi.DDMIContext;
import nl.nikhef.sfp.ddmi.DDMIValue;
import nl.nikhef.sfp.ddmi.DataSource;
public class ModuleValueSetter implements ValueSetter {
private Module _mod;
private ContextCache _ctxCache;
public ModuleValueSetter(ContextCache cache, Module targetModule) {
_mod = targetModule;
_ctxCache = cache;
}
@Override
public void setValue(DDMIValue value, byte[] data) throws IOException {
value.writeRaw(_ctxCache.getContextFor(_mod.dev, _mod.bay), data);
}
@Override
public void finished() throws IOException {
DDMIContext ctx = _ctxCache.getContextFor(_mod.dev, _mod.bay);
DDMI ddmi = ctx.getDDMI();
for (DataSource ds: ddmi.getSources()) {
ds.updateChecksums(ctx);
}
}
}
package nl.nikhef.safaripark.dolly;
import java.io.IOException;
import nl.nikhef.sfp.ddmi.DDMIValue;
public interface ValueGetter {
byte[] getValue(DDMIValue v) throws IOException;
}
package nl.nikhef.safaripark.dolly;
import java.io.IOException;
import nl.nikhef.sfp.ddmi.DDMIValue;
public interface ValueSetter {
void setValue(DDMIValue value, byte[] data) throws IOException;
void finished() throws IOException;
}
package nl.nikhef.safaripark.extra;
import java.awt.Component;
import java.awt.ItemSelectable;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import javax.swing.DefaultListModel;
import javax.swing.JCheckBox;
import javax.swing.JList;
import javax.swing.ListCellRenderer;
import javax.swing.ListModel;
import javax.swing.UIManager;
import javax.swing.event.ListDataEvent;
import javax.swing.event.ListDataListener;
import nl.nikhef.tools.ListenerManager;
public class CheckableList<T> extends JList<T> implements ListDataListener, ItemSelectable
{
private Set<T> _checked = new HashSet<T>();
private CheckboxCellRenderer<T> _renderer;
private ListenerManager<ItemListener> _lm = new ListenerManager<ItemListener>(ItemListener.class);
public CheckableList() {
initComponent();
}
public CheckableList(T[] items) {
super(items);
initComponent();
}
public CheckableList(ListModel<T> dataModel) {
super(dataModel);
dataModel.addListDataListener(this);
initComponent();
}
private void emitItemChange(T obj, boolean selected) {
ItemEvent ie = new ItemEvent(this, ItemEvent.ITEM_STATE_CHANGED,
obj, selected ? ItemEvent.SELECTED : ItemEvent.DESELECTED);
_lm.getProxy().itemStateChanged(ie);
}
private void initComponent() {
addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
int index = locationToIndex(e.getPoint());
if (index != -1 && e.getPoint().getX() < _renderer.checkboxWidth)
{
T obj = getModel().getElementAt(index);
if (_checked.contains(obj)) {
_checked.remove(obj);
emitItemChange(obj, false);
} else {
_checked.add(obj);
emitItemChange(obj, true);
}
repaint();
}
}
});
_renderer = new CheckboxCellRenderer();
setCellRenderer(_renderer);
}
public Collection<T> getSelectedItems()
{
return Collections.unmodifiableCollection(_checked);
}
protected class CheckboxCellRenderer<T> extends JCheckBox implements ListCellRenderer<T>
{
protected final int checkboxWidth;
public CheckboxCellRenderer() {
setOpaque(false);
checkboxWidth = UIManager.getIcon("CheckBox.icon").getIconWidth() + 8; // So, this is a bit of a nasty hack, the +8 ... should be twice the margin
}
@Override
public Component getListCellRendererComponent(JList<? extends T> list, T value, int index,
boolean isSelected, boolean cellHasFocus) {
setText(value.toString());
if (_checked.contains(value)) {
this.setSelected(true);
} else {
this.setSelected(false);
}
return this;
}
}
private boolean contains(T object) {
// fast way
if (getModel() instanceof DefaultListModel)
{
return DefaultListModel.class.cast(getModel()).contains(object);
}
// backup slow way
for (int i = 0; i < getModel().getSize(); ++i)
{
if (getModel().getElementAt(i).equals(object)) return true;
}
return false;
}
/**
* Update checked must be called if the contents of the list changes.
* When providing a model, this function will be called automatically if the model changes.
*/
public void updateChecked()
{
Iterator<T> e = _checked.iterator();
while (e.hasNext()) {
T obj = e.next();
if (!contains(obj))
{
e.remove();
emitItemChange(obj, false);
}
}
}
@Override
public void intervalAdded(ListDataEvent e) {
updateChecked();
}
@Override
public void intervalRemoved(ListDataEvent e) {
updateChecked();
}
@Override
public void contentsChanged(ListDataEvent e) {
updateChecked();
}
@Override
public Object[] getSelectedObjects() {
return _checked.toArray(new Object[_checked.size()]);
}
@Override
public void addItemListener(ItemListener l) {
_lm.addListener(l);;
}
@Override
public void removeItemListener(ItemListener l) {
_lm.removeListener(l);
}
}
......@@ -21,6 +21,36 @@ public class Module {
{
return dev.getModuleName(bay);
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + bay;
result = prime * result + ((dev == null) ? 0 : dev.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Module other = (Module) obj;
if (bay != other.bay)
return false;
if (dev == null) {
if (other.dev != null)
return false;
} else if (!dev.equals(other.dev))
return false;
return true;
}
......
......@@ -11,6 +11,7 @@ import javax.swing.event.TableModelEvent;
import javax.swing.table.AbstractTableModel;
import nl.nikhef.safaripark.ContextCache;
import nl.nikhef.safaripark.extra.Module;
import nl.nikhef.sfp.SFPDevice;
import nl.nikhef.sfp.SFPDeviceListener;
import nl.nikhef.sfp.SFPManager;
......@@ -32,23 +33,18 @@ public class MonitorModel extends AbstractTableModel implements SFPDeviceListene
private ContextCache _ctxCache;
private List<DevAndBay> _rows = new ArrayList<DevAndBay>();
private List<MonitoredModule> _rows = new ArrayList<MonitoredModule>();
private class DevAndBay
private class MonitoredModule extends Module
{
final SFPDevice dev;
final int bay;
DDMIContext ctx;
private String[] data;
public DevAndBay(SFPDevice dev, int bay) throws IOException {
public MonitoredModule(SFPDevice dev, int bay) throws IOException {
super(dev, bay);
// this.dev.getLink(bay);
ctx = _ctxCache.getContextFor(dev, bay);
this.dev = dev;
this.bay = bay;
}
}
......@@ -104,7 +100,7 @@ public class MonitorModel extends AbstractTableModel implements SFPDeviceListene
{
for (int i = 0; i < _rows.size(); i++)
{
DevAndBay dab = _rows.get(i);
MonitoredModule dab = _rows.get(i);
if (dab.data == null || dab.data.length != _columns.size())
{
......@@ -132,7 +128,7 @@ public class MonitorModel extends AbstractTableModel implements SFPDeviceListene
@Override
public Object getValueAt(int row, int col) {
DevAndBay dab = _rows.get(row);
MonitoredModule dab = _rows.get(row);
if (col == 0) {
return dab.dev.getModuleName(dab.bay);
......@@ -169,7 +165,7 @@ public class MonitorModel extends AbstractTableModel implements SFPDeviceListene
private boolean updateRowCount() {
int rc = 0;
List<DevAndBay> dAb = new ArrayList<DevAndBay>();
List<MonitoredModule> dAb = new ArrayList<MonitoredModule>();
for (SFPDevice dev : _devices)
{
......@@ -180,7 +176,7 @@ public class MonitorModel extends AbstractTableModel implements SFPDeviceListene
if (!dev.hasDiagnostics(i)) continue;
try {
dAb.add(new DevAndBay(dev, i));
dAb.add(new MonitoredModule(dev, i));
rc++;
} catch (Exception e) {
e.printStackTrace();
......@@ -222,7 +218,7 @@ public class MonitorModel extends AbstractTableModel implements SFPDeviceListene
{
for (int i = 0; i < _rows.size(); i++)
{
DevAndBay dab = _rows.get(i);
MonitoredModule dab = _rows.get(i);
logFile.print(dab.dev.getModuleName(dab.bay));
......
......@@ -18,10 +18,12 @@ public class CheckableTreeNode extends DefaultMutableTreeNode
private final String _label;
private boolean _checked;
private CheckableTreeNode _parent;
public CheckableTreeNode(DDMIElement userObject, String label) {
public CheckableTreeNode(CheckableTreeNode parent, DDMIElement userObject, String label) {
super(userObject);
_label = label;
_parent = parent;
}
public void check()
......@@ -34,6 +36,12 @@ public class CheckableTreeNode extends DefaultMutableTreeNode
_checked = false;
}
protected void checkStateChanged() {
if (_parent != null) {
_parent.checkStateChanged();
}
}
@Override
public void setUserObject(Object userObject) {
......@@ -51,7 +59,7 @@ public class CheckableTreeNode extends DefaultMutableTreeNode
} else {
setChildState(v == TristateCheckbox.CHECKED);
}
checkStateChanged();
return;
}
......
......@@ -2,6 +2,7 @@ package nl.nikhef.safaripark.vsp;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.ItemSelectable;
import java.awt.event.ActionEvent;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
......@@ -45,8 +46,9 @@ import nl.nikhef.sfp.ddmi.DDMIGroup;
import nl.nikhef.sfp.ddmi.DDMILoader;
import nl.nikhef.sfp.ddmi.DDMIValue;
import nl.nikhef.tools.Filter;
import nl.nikhef.tools.ListenerManager;
public class ValueSelectionPane extends JPanel implements ItemListener {
public class ValueSelectionPane extends JPanel implements ItemListener, ItemSelectable {
private JTree tree = new JTree();
// private static final Dimension MIN_SIZE = new Dimension(400, 400);
......@@ -58,6 +60,9 @@ public class ValueSelectionPane extends JPanel implements ItemListener {
private JComboBox<String> _presetCb;
private Map<String, CheckableTreeNode> _pathMapping = new HashMap<String, CheckableTreeNode>();
private boolean _ignorePresetEvents = false;
private ListenerManager<ItemListener> _ilmgr = new ListenerManager<ItemListener>(ItemListener.class);
private boolean _ignoreCheckEvents = false;
@SuppressWarnings("serial")
private Action _saveAction = new ExtendedAbstractAction("Save", Resources.getIcon("disk"), "Save preset") {
......@@ -131,6 +136,7 @@ public class ValueSelectionPane extends JPanel implements ItemListener {
};
@SuppressWarnings("serial")
public ValueSelectionPane(DDMILoader loader) {
setLayout(new BorderLayout());
CheckBoxNodeRenderer renderer = new CheckBoxNodeRenderer();
......@@ -141,6 +147,7 @@ public class ValueSelectionPane extends JPanel implements ItemListener {
tree.setShowsRootHandles(true);
tree.setRootVisible(false);
JToolBar jtb = new JToolBar();
jtb.setFloatable(false);
jtb.add(new JLabel(" Preset "));
......@@ -157,10 +164,22 @@ public class ValueSelectionPane extends JPanel implements ItemListener {
//setMinimumSize(MIN_SIZE);
//setPreferredSize(MIN_SIZE);
_ddmi = loader.getDDMI();
_root = new CheckableTreeNode(_ddmi, "DDMI");
_root = new CheckableTreeNode(null, _ddmi, "DDMI") {
protected void checkStateChanged() {
ValueSelectionPane.this.checkStateChanged();
};
};
}
protected void checkStateChanged() {
if (_ignoreCheckEvents) return;
// XXX nasty hack! Should have a proper event object
_ilmgr.getProxy().itemStateChanged(null);
}
private void savePreset(String name) {
Preferences p = _presets.node(name);
......@@ -190,6 +209,7 @@ public class ValueSelectionPane extends JPanel implements ItemListener {
private void loadPreset(String name) {
_ignoreCheckEvents = true;
Preferences p = _presets.node(name);
for (Map.Entry<String, CheckableTreeNode> entry : _pathMapping.entrySet())
{
......@@ -204,6 +224,8 @@ public class ValueSelectionPane extends JPanel implements ItemListener {
}
//DefaultTreeModel.class.cast(tree.getModel())
tree.repaint();
_ignoreCheckEvents = false;
checkStateChanged();
}
private int fillTree(String path, CheckableTreeNode root, DDMIGroup group, Filter<DDMIElement> ddmiFilter)
......@@ -218,7 +240,7 @@ public class ValueSelectionPane extends JPanel implements ItemListener {
continue;
}
CheckableTreeNode dmt = new CheckableTreeNode(e, e.getLabel());
CheckableTreeNode dmt = new CheckableTreeNode(root, e, e.getLabel());
String ePath;
......@@ -254,6 +276,7 @@ public class ValueSelectionPane extends JPanel implements ItemListener {
public void init(Filter<DDMIElement> ddmiFilter, String name)
{
_ignoreCheckEvents = true;
_root.removeAllChildren();
_pathMapping.clear();
fillTree(null, _root, _ddmi, ddmiFilter);
......@@ -278,6 +301,8 @@ public class ValueSelectionPane extends JPanel implements ItemListener {
_presetCb.setModel(_presetCbm);
_ignorePresetEvents = false;
updateActions();
_ignoreCheckEvents = false;
checkStateChanged();
}
......@@ -373,7 +398,7 @@ public class ValueSelectionPane extends JPanel implements ItemListener {
@Override
public void windowClosing(WindowEvent e) {
System.out.printf("%d element(s) selected\n", vsp.getSelection().size());
// System.out.printf("%d element(s) selected\n", vsp.getSelection().size());
}
@Override
......@@ -436,4 +461,23 @@ public class ValueSelectionPane extends JPanel implements ItemListener {
crawlSetSelected(_root, columns);
}
@Override
public Object[] getSelectedObjects() {
return getSelection().toArray();
}
@Override
public void addItemListener(ItemListener l) {
_ilmgr.addListener(l);
}
@Override
public void removeItemListener(ItemListener l) {
_ilmgr.removeListener(l);
}
}
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