Commit 48f2d98b authored by Vincent van Beveren's avatar Vincent van Beveren

continued on quest to remove singletons

parent dfca1fa9
package nl.nikhef.safaripark;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import nl.nikhef.sfp.ddmi.DDMIContext;
import nl.nikhef.sfp.ddmi.DDMIValue;
import nl.nikhef.tools.ListenerManager;
/**
* Reading the I2C can take a bit of time. The deferred reader
* allows slow read out while still allowing fast applciation response.
*
* @author Vincent van Beveren
*/
public class DeferredReader {
private class ReaderTask
{
final DDMIContext ctx;
final DDMIValue value;
final DeferredReaderResult result;
public ReaderTask(DDMIContext ctx, DDMIValue value, DeferredReaderResult result) {
this.ctx = ctx;
this.value = value;
this.result = result;
}
}
public static final DeferredReader SINGLETON = new DeferredReader();
private ListenerManager<DeferredListener> _lm =
new ListenerManager<DeferredListener>(DeferredListener.class);
private BlockingQueue<ReaderTask> _queue = new LinkedBlockingQueue<ReaderTask>();
private Thread _deferredReaderThread = new Thread(new Runnable() {
@Override
public void run() {
try {
readerThread();
} catch (InterruptedException e) {
}
}
}, "DeferredReader");
public DeferredReader() {
_deferredReaderThread.start();
}
public void addListener(DeferredListener dl)
{
_lm.addListener(dl);
}
public void removeListener(DeferredListener dl)
{
_lm.removeListener(dl);
}
public void read(DDMIContext ctx, DDMIValue value, DeferredReaderResult result)
{
try {
_queue.put(new ReaderTask(ctx, value, result));
_lm.getProxy().deferredTasksUpdated(_queue.size());
} catch (InterruptedException e) {
}
}
private void readerThread() throws InterruptedException
{
byte[] result = null;
Exception ex= null;
while (!Thread.interrupted())
{
ReaderTask task = _queue.take();
try {
result = task.value.readRaw(task.ctx);
ex = null;
} catch (Exception e)
{
ex = e;
result = null;
}
task.result.readResult(result, ex);
_lm.getProxy().deferredTasksUpdated(_queue.size());
}
}
public void shutdown()
{
_deferredReaderThread.interrupt();
try {
_deferredReaderThread.join();
} catch (InterruptedException e) {
}
}
}
package nl.nikhef.safaripark;
public interface DeferredReaderResult
{
public void readResult(byte[] data, Exception e);
}
\ No newline at end of file
......@@ -24,8 +24,6 @@ import nl.nikhef.safaripark.res.Resources;
public class OverlayManager {
public static final OverlayManager SINGLETON = new OverlayManager();
private Map<String, Boolean> _overlays = new HashMap<String, Boolean>();
private File _overlayDir;
private Preferences _prefs = Config.PREFS.node("overlays");
......
......@@ -58,6 +58,7 @@ public class SaFariPark extends JFrame implements BaySelectionListener, WindowLi
private SFPManager _sfpManager;
private DDMILoader _loader;
private ContextCache _ctxCache;
private OverlayManager _ovlMgr;
private Action _selectOverlays = new ExtendedAbstractAction("Select overlays", Resources.getIcon("books"), "Select which SFP+ overlays to load") {
......@@ -65,7 +66,7 @@ public class SaFariPark extends JFrame implements BaySelectionListener, WindowLi
public void actionPerformed(ActionEvent e)
{
OverlayManager.SINGLETON.showDialog(SaFariPark.this);
_ovlMgr.showDialog(SaFariPark.this);
}
};
......@@ -73,9 +74,8 @@ public class SaFariPark extends JFrame implements BaySelectionListener, WindowLi
public SaFariPark() throws IOException, XMLStreamException
{
SINGLETON = this;
OverlayManager.SINGLETON.scanDirectory(new File("overlays"));
DDMI.initSingleton(OverlayManager.SINGLETON.getOverlays());
setLayout(new BorderLayout());
setTitle("SaFariPark");
setSize(640, 480);
......@@ -84,6 +84,11 @@ public class SaFariPark extends JFrame implements BaySelectionListener, WindowLi
_sfpManager = new SFPManager();
_loader = new DDMILoader();
_ovlMgr = new OverlayManager();
_ovlMgr.scanDirectory(new File("overlays"));
_loader.loadOverlays(_ovlMgr.getOverlays());
_ctxCache = new ContextCache(_sfpManager, _loader);
_devMgr = new DeviceManager(_sfpManager);
......@@ -111,7 +116,6 @@ public class SaFariPark extends JFrame implements BaySelectionListener, WindowLi
setExtendedState(JFrame.MAXIMIZED_BOTH);
addWindowListener(this);
DeferredReader.SINGLETON.addListener(this);
_timer = new Timer(1000, new ActionListener() {
......@@ -226,12 +230,6 @@ public class SaFariPark extends JFrame implements BaySelectionListener, WindowLi
public void deinit() {
_timer.stop();
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
DeferredReader.SINGLETON.shutdown();
}
});
}
......
......@@ -6,8 +6,6 @@ import java.util.Arrays;
import javax.swing.JLabel;
import javax.swing.JPanel;
import nl.nikhef.safaripark.DeferredReader;
import nl.nikhef.safaripark.DeferredReaderResult;
import nl.nikhef.sfp.ddmi.AccessException;
import nl.nikhef.sfp.ddmi.DDMIMeta;
import nl.nikhef.sfp.ddmi.DDMIValue;
......@@ -16,8 +14,6 @@ import nl.nikhef.tools.Utils;
@SuppressWarnings("serial")
public abstract class ValueEditor extends JPanel {
private static final boolean USE_DEFERRED_READER = false;
protected final DDMIValue value;
protected byte[] rawValue;
......@@ -63,34 +59,14 @@ public abstract class ValueEditor extends JPanel {
clearValue();
} else {
if (USE_DEFERRED_READER) {
DeferredReader.SINGLETON.read(_ctx.getContext(), value, new DeferredReaderResult() {
@Override
public void readResult(byte[] data, Exception e) {
rawValue = data;
// RawValue == null must be a read error
if (rawValue == null)
{
setEnabled(false);
clearValue();
} else {
setEnabled(true);
updateValue();
}
}
});
rawValue = value.readRaw(_ctx.getContext());
if (rawValue == null)
{
setEnabled(false);
clearValue();
} else {
rawValue = value.readRaw(_ctx.getContext());
if (rawValue == null)
{
setEnabled(false);
clearValue();
} else {
setEnabled(true);
updateValue();
}
setEnabled(true);
updateValue();
}
......
package nl.nikhef.safaripark.extra;
import java.awt.Component;
import javax.swing.*;
......
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