From: <cs-...@li...> - 2012-03-05 21:27:24
|
details: http://cs-studio.hg.sourceforge.net/hgweb/cs-studio/cs-studio//hgroot/cs-studio/cs-studio/rev/bdc946d72e5e changeset: 14226:bdc946d72e5e user: kasemir date: Mon Mar 05 14:21:47 2012 -0500 description: SNS scan system: Server allows modifying command properties details: http://cs-studio.hg.sourceforge.net/hgweb/cs-studio/cs-studio//hgroot/cs-studio/cs-studio/rev/f310890e2390 changeset: 14227:f310890e2390 user: kasemir date: Mon Mar 05 14:34:58 2012 -0500 description: SNS scan system: Tree editor allows modifying command properties of scan on server details: http://cs-studio.hg.sourceforge.net/hgweb/cs-studio/cs-studio//hgroot/cs-studio/cs-studio/rev/1ae793fc2991 changeset: 14228:1ae793fc2991 user: kasemir date: Mon Mar 05 16:25:37 2012 -0500 description: SNS scan system: Undo for live scan parameter updates. Background Job. diffstat: products/SNS/plugins/org.csstudio.scan.custom/src/org/csstudio/scan/command/CommentCommand.java | 2 +- products/SNS/plugins/org.csstudio.scan.server/src/org/csstudio/scan/server/internal/Scan.java | 58 ++++++ products/SNS/plugins/org.csstudio.scan.server/src/org/csstudio/scan/server/internal/ScanServerImpl.java | 59 ++--- products/SNS/plugins/org.csstudio.scan.server/test/org/csstudio/scan/ScanHeadlessTest.java | 9 +- products/SNS/plugins/org.csstudio.scan.ui.scantree/src/org/csstudio/scan/ui/scantree/ScanEditor.java | 35 +++- products/SNS/plugins/org.csstudio.scan.ui.scantree/src/org/csstudio/scan/ui/scantree/gui/CommandTreeLabelProvider.java | 5 +- products/SNS/plugins/org.csstudio.scan.ui.scantree/src/org/csstudio/scan/ui/scantree/messages.properties | 2 +- products/SNS/plugins/org.csstudio.scan.ui.scantree/src/org/csstudio/scan/ui/scantree/operations/PropertyChangeOperation.java | 95 ++++++++- products/SNS/plugins/org.csstudio.scan/src/org/csstudio/scan/TODO.java | 2 +- products/SNS/plugins/org.csstudio.scan/src/org/csstudio/scan/command/DelayCommand.java | 2 +- products/SNS/plugins/org.csstudio.scan/src/org/csstudio/scan/command/LogCommand.java | 2 +- products/SNS/plugins/org.csstudio.scan/src/org/csstudio/scan/command/LoopCommand.java | 16 +- products/SNS/plugins/org.csstudio.scan/src/org/csstudio/scan/command/ScanCommand.java | 17 +- products/SNS/plugins/org.csstudio.scan/src/org/csstudio/scan/command/SetCommand.java | 12 +- products/SNS/plugins/org.csstudio.scan/src/org/csstudio/scan/command/UnknownScanCommandPropertyException.java | 4 +- products/SNS/plugins/org.csstudio.scan/src/org/csstudio/scan/command/WaitCommand.java | 10 +- products/SNS/plugins/org.csstudio.scan/src/org/csstudio/scan/server/ScanServer.java | 9 + products/SNS/plugins/org.csstudio.scan/src/org/csstudio/scan/server/UnknownScanException.java | 34 +++ 18 files changed, 286 insertions(+), 87 deletions(-) diffs (truncated from 721 to 300 lines): diff -r 097d78f69519 -r 1ae793fc2991 products/SNS/plugins/org.csstudio.scan.custom/src/org/csstudio/scan/command/CommentCommand.java --- a/products/SNS/plugins/org.csstudio.scan.custom/src/org/csstudio/scan/command/CommentCommand.java Mon Mar 05 12:51:25 2012 -0500 +++ b/products/SNS/plugins/org.csstudio.scan.custom/src/org/csstudio/scan/command/CommentCommand.java Mon Mar 05 16:25:37 2012 -0500 @@ -31,7 +31,7 @@ new ScanCommandProperty("comment", "Comment", String.class), }; - private String comment; + private volatile String comment; /** Initialize with example comment */ public CommentCommand() diff -r 097d78f69519 -r 1ae793fc2991 products/SNS/plugins/org.csstudio.scan.server/src/org/csstudio/scan/server/internal/Scan.java --- a/products/SNS/plugins/org.csstudio.scan.server/src/org/csstudio/scan/server/internal/Scan.java Mon Mar 05 12:51:25 2012 -0500 +++ b/products/SNS/plugins/org.csstudio.scan.server/src/org/csstudio/scan/server/internal/Scan.java Mon Mar 05 16:25:37 2012 -0500 @@ -15,6 +15,7 @@ ******************************************************************************/ package org.csstudio.scan.server.internal; +import java.rmi.RemoteException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -26,6 +27,7 @@ import java.util.logging.Level; import java.util.logging.Logger; +import org.csstudio.scan.command.LoopCommand; import org.csstudio.scan.command.ScanCommand; import org.csstudio.scan.commandimpl.WaitForDevicesCommand; import org.csstudio.scan.commandimpl.WaitForDevicesCommandImpl; @@ -176,6 +178,62 @@ return commands; } + /** @param address Command address + * @return ScanCommand with that address + * @throws RemoteException when not found + */ + public ScanCommand getCommandByAddress(final long address) throws RemoteException + { + final ScanCommand found = findCommandByAddress(getScanCommands(), address); + if (found == null) + throw new RemoteException("Invalid command address " + address); + return found; + } + + /** Recursively search for command by address + * @param commands Command list + * @param address Desired command address + * @return Command with that address or <code>null</code> + */ + private ScanCommand findCommandByAddress(final List<ScanCommand> commands, + final long address) + { + for (ScanCommand command : commands) + { + if (command.getAddress() == address) + return command; + else if (command instanceof LoopCommand) + { + final LoopCommand loop = (LoopCommand) command; + final ScanCommand found = findCommandByAddress(loop.getBody(), address); + if (found != null) + return found; + } + } + return null; + } + + /** Attempt to update a command parameter to a new value + * @param address Address of the command + * @param property_id Property to update + * @param value New value for the property + * @throws RemoteException on error + */ + public void updateScanProperty(final long address, final String property_id, + final Object value) throws RemoteException + { + final ScanCommand command = getCommandByAddress(address); + try + { + command.setProperty(property_id, value); + } + catch (Exception ex) + { + throw new RemoteException("Cannot update " + property_id + " of " + + command.getCommandName(), ex); + } + } + /** @return Data logger of this scan */ public DataLogger getDataLogger() { diff -r 097d78f69519 -r 1ae793fc2991 products/SNS/plugins/org.csstudio.scan.server/src/org/csstudio/scan/server/internal/ScanServerImpl.java --- a/products/SNS/plugins/org.csstudio.scan.server/src/org/csstudio/scan/server/internal/ScanServerImpl.java Mon Mar 05 12:51:25 2012 -0500 +++ b/products/SNS/plugins/org.csstudio.scan.server/src/org/csstudio/scan/server/internal/ScanServerImpl.java Mon Mar 05 16:25:37 2012 -0500 @@ -43,6 +43,7 @@ import org.csstudio.scan.server.ScanCommandImplTool; import org.csstudio.scan.server.ScanInfo; import org.csstudio.scan.server.ScanServer; +import org.csstudio.scan.server.UnknownScanException; /** Server-side implementation of the {@link ScanServer} interface * that the remote client invokes. @@ -135,19 +136,8 @@ Device[] devices; if (id >= 0) { - try - { - final Scan scan = findScan(id); - if (scan == null) - return null; - devices = scan.getDevices(); - } - catch (Exception ex) - { - Logger.getLogger(getClass().getName()).log(Level.WARNING, - "Error reading device context", ex); - devices = new Device[0]; - } + final Scan scan = findScan(id); + devices = scan.getDevices(); } else { @@ -234,16 +224,17 @@ /** Find scan by ID * @param id Scan ID - * @return {@link Scan} or <code>null</code> if not found + * @return {@link Scan} + * @throws UnknownScanException if scan ID not valid */ - private Scan findScan(final long id) + private Scan findScan(final long id) throws UnknownScanException { final List<Scan> scans = scan_engine.getScans(); // Linear lookup. Good enough? for (Scan scan : scans) if (scan.getId() == id) return scan; - return null; + throw new UnknownScanException(id); } /** {@inheritDoc} */ @@ -251,36 +242,31 @@ public ScanInfo getScanInfo(final long id) throws RemoteException { final Scan scan = findScan(id); - if (scan != null) - return scan.getScanInfo(); - return null; + return scan.getScanInfo(); } /** {@inheritDoc} */ @Override public String getScanCommands(long id) throws RemoteException { + final Scan scan = findScan(id); try { - final Scan scan = findScan(id); - if (scan != null) - return XMLCommandWriter.toXMLString(scan.getScanCommands()); + return XMLCommandWriter.toXMLString(scan.getScanCommands()); } catch (Exception ex) { throw new RemoteException(ex.getMessage(), ex); } - return null; } /** @param id Scan ID * @return {@link DataLogger} of scan or <code>null</code> + * @throws UnknownScanException if scan ID not valid */ - private DataLogger getDataLogger(final long id) + private DataLogger getDataLogger(final long id) throws UnknownScanException { final Scan scan = findScan(id); - if (scan == null) - return null; return scan.getDataLogger(); } @@ -306,13 +292,21 @@ /** {@inheritDoc} */ @Override + public void updateScanProperty(final long id, final long address, + final String property_id, final Object value) throws RemoteException + { + final Scan scan = findScan(id); + scan.updateScanProperty(address, property_id, value); + } + + /** {@inheritDoc} */ + @Override public void pause(final long id) throws RemoteException { if (id >= 0) { final Scan scan = findScan(id); - if (scan != null) - scan.pause(); + scan.pause(); } else { @@ -329,8 +323,7 @@ if (id >= 0) { final Scan scan = findScan(id); - if (scan != null) - scan.resume(); + scan.resume(); } else { @@ -345,8 +338,7 @@ public void abort(final long id) throws RemoteException { final Scan scan = findScan(id); - if (scan != null) - scan_engine.abortScan(scan); + scan_engine.abortScan(scan); } /** {@inheritDoc} */ @@ -354,8 +346,7 @@ public void remove(final long id) throws RemoteException { final Scan scan = findScan(id); - if (scan != null) - scan_engine.removeScan(scan); + scan_engine.removeScan(scan); } /** {@inheritDoc} */ diff -r 097d78f69519 -r 1ae793fc2991 products/SNS/plugins/org.csstudio.scan.server/test/org/csstudio/scan/ScanHeadlessTest.java --- a/products/SNS/plugins/org.csstudio.scan.server/test/org/csstudio/scan/ScanHeadlessTest.java Mon Mar 05 12:51:25 2012 -0500 +++ b/products/SNS/plugins/org.csstudio.scan.server/test/org/csstudio/scan/ScanHeadlessTest.java Mon Mar 05 16:25:37 2012 -0500 @@ -102,8 +102,7 @@ new LoopCommand("ypos", 1.0, 5.0, 1.0, new SetCommand("setpoint", 0), new WaitCommand("readback", Comparison.EQUALS, 0, 0.2, 0.0), - new SetCommand("setpoint", 0.5), - new WaitCommand("readback", Comparison.EQUALS, 0.5, 0.1, 0.0), + new SetCommand("setpoint", 1.0, "readback", true, 0.1, 0.0), new LogCommand("xpos", "ypos", "readback") ) ); @@ -113,6 +112,12 @@ assertEquals(1, commands.size()); assertSame(command, commands.get(0)); + // Check addressing and updating of command property + final SetCommand set = (SetCommand)scan.getCommandByAddress(4); + assertEquals(1.0, (Double)set.getValue(), 0.1); + scan.updateScanProperty(4, "value", 0.5); + assertEquals(0.5, (Double)set.getValue(), 0.1); + // Check Idle state ScanInfo info = scan.getScanInfo(); assertEquals(ScanState.Idle, info.getState()); diff -r 097d78f69519 -r 1ae793fc2991 products/SNS/plugins/org.csstudio.scan.ui.scantree/src/org/csstudio/scan/ui/scantree/ScanEditor.java --- a/products/SNS/plugins/org.csstudio.scan.ui.scantree/src/org/csstudio/scan/ui/scantree/ScanEditor.java Mon Mar 05 12:51:25 2012 -0500 +++ b/products/SNS/plugins/org.csstudio.scan.ui.scantree/src/org/csstudio/scan/ui/scantree/ScanEditor.java Mon Mar 05 16:25:37 2012 -0500 @@ -9,6 +9,7 @@ import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; +import java.rmi.RemoteException; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; @@ -28,6 +29,7 @@ import org.csstudio.scan.ui.scantree.gui.ScanTreeGUI; import org.csstudio.scan.ui.scantree.model.ScanTreeModel; import org.csstudio.scan.ui.scantree.model.ScanTreeModelListener; +import org.csstudio.scan.ui.scantree.operations.PropertyChangeOperation; import org.csstudio.scan.ui.scantree.operations.RedoHandler; import org.csstudio.scan.ui.scantree.operations.UndoHandler; import org.csstudio.scan.ui.scantree.properties.ScanCommandPropertyAdapterFactory; @@ -504,6 +506,13 @@ } // Update status of this scan in editor + if (this_scan.getState().isDone()) + { // Scan finished + scan_id = -1; + gui.setActiveCommand(-1); + setMessage(null); + return; + } |