Commit a36916c7 authored by Andrey Filippov's avatar Andrey Filippov

Adding possibility to runs several sequential external tools waiting for

completion, preparing to communicate with external server.
parent 0c056d60
/com /com
/BuildParamsItem.class
...@@ -266,7 +266,7 @@ public class LaunchCore { ...@@ -266,7 +266,7 @@ public class LaunchCore {
if (!saveAllEditors(true)) { if (!saveAllEditors(true)) {
return; return;
} }
System.out.println("launchInBackground, JOB_NAME="+JOB_NAME);
Job job = new Job(JOB_NAME) { Job job = new Job(JOB_NAME) {
public IStatus run(final IProgressMonitor monitor) { public IStatus run(final IProgressMonitor monitor) {
try { try {
...@@ -293,6 +293,7 @@ public class LaunchCore { ...@@ -293,6 +293,7 @@ public class LaunchCore {
if (!saveAllEditors(true)) { if (!saveAllEditors(true)) {
return; return;
} }
System.out.println("launchInForeground, JOB_NAME="+JOB_NAME);
IRunnableWithProgress runnable = new IRunnableWithProgress() { IRunnableWithProgress runnable = new IRunnableWithProgress() {
public void run(IProgressMonitor monitor) throws InvocationTargetException { public void run(IProgressMonitor monitor) throws InvocationTargetException {
......
...@@ -18,7 +18,6 @@ ...@@ -18,7 +18,6 @@
package com.elphel.vdt.core.launching; package com.elphel.vdt.core.launching;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.CoreException;
...@@ -49,6 +48,8 @@ public class VDTLaunchConfigurationDelegate implements ILaunchConfigurationDeleg ...@@ -49,6 +48,8 @@ public class VDTLaunchConfigurationDelegate implements ILaunchConfigurationDeleg
) throws CoreException ) throws CoreException
{ {
VDTRunner runner = VDTLaunchUtil.getRunner();
if (monitor == null) { if (monitor == null) {
monitor = new NullProgressMonitor(); monitor = new NullProgressMonitor();
} }
...@@ -71,21 +72,14 @@ public class VDTLaunchConfigurationDelegate implements ILaunchConfigurationDeleg ...@@ -71,21 +72,14 @@ public class VDTLaunchConfigurationDelegate implements ILaunchConfigurationDeleg
// resolve working directory // resolve working directory
runConfig.setWorkingDirectory(VDTLaunchUtil.getWorkingDirectory(configuration)); runConfig.setWorkingDirectory(VDTLaunchUtil.getWorkingDirectory(configuration));
runConfig.setProjectPath(VDTLaunchUtil.getProjectPath(configuration)); runConfig.setProjectPath(VDTLaunchUtil.getProjectPath(configuration));
runConfig.setConfiguration(configuration); // to be resumed
runConfig.setLaunch(launch); // to be resumed
runConfig.setMonitor(monitor); // to be resumed
// done the half of creating arguments phase // done the half of creating arguments phase
monitor.worked(1); monitor.worked(1);
// resolve arguments
List<String> arguments = VDTLaunchUtil.getArguments(configuration);
// get tool is a shell
boolean isShell=VDTLaunchUtil.getIsShell(configuration);
// get patterns for Error parser
String patternErrors= VDTLaunchUtil.getPatternErrors(configuration);
String patternWarnings=VDTLaunchUtil.getPatternWarnings(configuration);
String patternInfo= VDTLaunchUtil.getPatternInfo(configuration);
// check for cancellation // check for cancellation
if (monitor.isCanceled()) { if (monitor.isCanceled()) {
return; return;
...@@ -93,8 +87,6 @@ public class VDTLaunchConfigurationDelegate implements ILaunchConfigurationDeleg ...@@ -93,8 +87,6 @@ public class VDTLaunchConfigurationDelegate implements ILaunchConfigurationDeleg
// done the creating arguments phase // done the creating arguments phase
monitor.worked(2); monitor.worked(2);
// resolve resources
// List<String> resources = VDTLaunchUtil.getResources(configuration);
// check for cancellation // check for cancellation
if (monitor.isCanceled()) { if (monitor.isCanceled()) {
...@@ -104,34 +96,22 @@ public class VDTLaunchConfigurationDelegate implements ILaunchConfigurationDeleg ...@@ -104,34 +96,22 @@ public class VDTLaunchConfigurationDelegate implements ILaunchConfigurationDeleg
monitor.worked(3); monitor.worked(3);
// resolve arguments // resolve arguments
List<String> toolArguments = new ArrayList<String>();
if (arguments != null) runConfig.setIsShell(VDTLaunchUtil.getIsShell(configuration));
toolArguments.addAll(arguments); runConfig.setPatternErrors(VDTLaunchUtil.getPatternErrors(configuration));
// if (resources != null)
// toolArguments.addAll(resources);
runConfig.setToolArguments((String[])toolArguments.toArray(new String[toolArguments.size()]));
runConfig.setIsShell(isShell);
runConfig.setPatternErrors(patternErrors);
runConfig.setToolName(VDTLaunchUtil.getToolName(configuration)); runConfig.setToolName(VDTLaunchUtil.getToolName(configuration));
runConfig.setPatternWarnings(patternWarnings); runConfig.setPatternWarnings(VDTLaunchUtil.getPatternWarnings(configuration));
runConfig.setPatternInfo(patternInfo); runConfig.setPatternInfo(VDTLaunchUtil.getPatternInfo(configuration));
runConfig.setToolProjectPath(VDTLaunchUtil.getToolProjectPath(configuration)); runConfig.setToolProjectPath(VDTLaunchUtil.getToolProjectPath(configuration));
runConfig.setBuildStep(0);
List<String> controlFiles = VDTLaunchUtil.getControlFiles(configuration); List<String> controlFiles = VDTLaunchUtil.getControlFiles(configuration);
runConfig.setControlFiles((String[])controlFiles.toArray(new String[controlFiles.size()])); runConfig.setControlFiles((String[])controlFiles.toArray(new String[controlFiles.size()]));
// Launch the configuration - 1 unit of work String consoleName=VDTRunner.renderProcessLabel(runConfig.getToolName());
VDTRunner runner = VDTLaunchUtil.getRunner(); runner.saveUnfinished(consoleName, runConfig );
runner.run(runConfig, launch, monitor); runner.resumeLaunch(consoleName);
// check for cancellation
if (monitor.isCanceled()) {
return; return;
} }
monitor.done();
}
public void launch( ILaunchConfiguration configuration public void launch( ILaunchConfiguration configuration
, String mode , String mode
...@@ -149,4 +129,5 @@ public class VDTLaunchConfigurationDelegate implements ILaunchConfigurationDeleg ...@@ -149,4 +129,5 @@ public class VDTLaunchConfigurationDelegate implements ILaunchConfigurationDeleg
} }
} }
} // class VDTLaunchConfigurationDelegate } // class VDTLaunchConfigurationDelegate
...@@ -43,6 +43,7 @@ import com.elphel.vdt.VerilogUtils; ...@@ -43,6 +43,7 @@ import com.elphel.vdt.VerilogUtils;
// import com.elphel.vdt.VDTPlugin; // import com.elphel.vdt.VDTPlugin;
import com.elphel.vdt.veditor.VerilogPlugin; import com.elphel.vdt.veditor.VerilogPlugin;
import com.elphel.vdt.core.tools.ToolsCore; import com.elphel.vdt.core.tools.ToolsCore;
import com.elphel.vdt.core.tools.contexts.BuildParamsItem;
import com.elphel.vdt.core.tools.params.Parameter; import com.elphel.vdt.core.tools.params.Parameter;
import com.elphel.vdt.core.tools.params.Tool; import com.elphel.vdt.core.tools.params.Tool;
import com.elphel.vdt.core.tools.params.ToolException; import com.elphel.vdt.core.tools.params.ToolException;
...@@ -63,8 +64,12 @@ public class VDTLaunchUtil { ...@@ -63,8 +64,12 @@ public class VDTLaunchUtil {
* Returns the VDT runner. * Returns the VDT runner.
*/ */
public static VDTRunner getRunner() { public static VDTRunner getRunner() {
if (toolRunner == null) if (toolRunner == null) {
System.out.println ("Created new VDTRunner()");
toolRunner = new VDTRunner(); toolRunner = new VDTRunner();
} else {
System.out.println ("Reused old VDTRunner()");
}
return toolRunner; return toolRunner;
} }
...@@ -122,7 +127,8 @@ public class VDTLaunchUtil { ...@@ -122,7 +127,8 @@ public class VDTLaunchUtil {
* @throws CoreException if unable to retrieve the associated launch * @throws CoreException if unable to retrieve the associated launch
* configuration attribute, or if unable to resolve any variables * configuration attribute, or if unable to resolve any variables
*/ */
public static List<String> getArguments(ILaunchConfiguration configuration) throws CoreException { // public static List<String> getArguments(ILaunchConfiguration configuration) throws CoreException {
public static BuildParamsItem[] getArguments(ILaunchConfiguration configuration) throws CoreException {
Tool tool = obtainTool(configuration); Tool tool = obtainTool(configuration);
for (Iterator i = tool.getParams().iterator(); i.hasNext(); ) { for (Iterator i = tool.getParams().iterator(); i.hasNext(); ) {
...@@ -147,13 +153,19 @@ public class VDTLaunchUtil { ...@@ -147,13 +153,19 @@ public class VDTLaunchUtil {
try { try {
String location = getWorkingDirectory(configuration); String location = getWorkingDirectory(configuration);
tool.setWorkingDirectory(location); tool.setWorkingDirectory(location);
/*
String[] paramArray = tool.buildParams(); String[] paramArray = tool.buildParams();
System.out.println("Andrey: called tool.buildParams() here (from VDTLaunchUtils.java");
List<String> arguments = new ArrayList<String>(paramArray.length); List<String> arguments = new ArrayList<String>(paramArray.length);
for(int i = 0; i < paramArray.length; i++) { for(int i = 0; i < paramArray.length; i++) {
arguments.add(paramArray[i]); arguments.add(paramArray[i]);
} }
return arguments; return arguments;
*/
BuildParamsItem[] paramItemsArray = tool.buildParams();
System.out.println("Andrey: called tool.buildParams() here (from VDTLaunchUtils.java");
return paramItemsArray;
} catch(ToolException e) { } catch(ToolException e) {
MessageUI.error("Error occured during tool launch: " + e.getMessage(), e); MessageUI.error("Error occured during tool launch: " + e.getMessage(), e);
} }
......
...@@ -20,12 +20,27 @@ package com.elphel.vdt.core.launching; ...@@ -20,12 +20,27 @@ package com.elphel.vdt.core.launching;
import java.io.File; import java.io.File;
import java.text.DateFormat; import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import java.util.Map; import java.util.Map;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
//import org.eclipse.core.resources.IProject;
//import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.IStatus;
...@@ -35,19 +50,39 @@ import org.eclipse.core.runtime.SubProgressMonitor; ...@@ -35,19 +50,39 @@ import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.debug.core.DebugPlugin; import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.ILaunch; import org.eclipse.debug.core.ILaunch;
import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.debug.core.ILaunchConfiguration;
//import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.model.IProcess; import org.eclipse.debug.core.model.IProcess;
//import org.eclipse.debug.ui.DebugUITools;
//import org.eclipse.ui.console.ConsolePlugin;
//import org.eclipse.ui.console.IConsoleManager;
//import org.eclipse.ui.console.IPatternMatchListener;
//import org.eclipse.ui.console.MessageConsole;
import org.eclipse.debug.ui.DebugUITools; import org.eclipse.debug.ui.DebugUITools;
import org.eclipse.ui.console.ConsolePlugin; import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.ui.console.IConsole; import org.eclipse.ui.console.IConsole;
//import org.eclipse.debug.ui.console.IConsole;
import org.eclipse.ui.console.ConsolePlugin;
import org.eclipse.ui.console.IConsoleManager; import org.eclipse.ui.console.IConsoleManager;
import org.eclipse.ui.console.IPatternMatchListener; import org.eclipse.ui.console.IOConsole;
import org.eclipse.ui.console.MessageConsole;
import com.elphel.vdt.Txt; import com.elphel.vdt.Txt;
import com.elphel.vdt.core.tools.contexts.BuildParamsItem;
import com.elphel.vdt.ui.MessageUI;
//import com.elphel.vdt.VDTPlugin; //import com.elphel.vdt.VDTPlugin;
import com.elphel.vdt.veditor.VerilogPlugin; import com.elphel.vdt.veditor.VerilogPlugin;
import com.elphel.vdt.veditor.preference.PreferenceStrings; import com.elphel.vdt.veditor.preference.PreferenceStrings;
import com.elphel.vdt.core.Utils;
//import com.elphel.vdt.core.Utils;
import org.eclipse.ui.console.IConsoleListener;
/** /**
* Verilog development tool runner. * Verilog development tool runner.
...@@ -58,6 +93,181 @@ import com.elphel.vdt.core.Utils; ...@@ -58,6 +93,181 @@ import com.elphel.vdt.core.Utils;
public class VDTRunner { public class VDTRunner {
// TODO:Remove
VDTRunnerConfiguration runningConfiguration; // multi-step configuration currently active
int nextBuildStep=0;
private Map<String, VDTRunnerConfiguration> unfinishedBuilds;
public VDTRunner(){
unfinishedBuilds = new HashMap<String, VDTRunnerConfiguration>();
IConsoleManager manager = ConsolePlugin.getDefault().getConsoleManager();
// This is not used, just for testing
System.out.println("***Addded console listeners");
manager.addConsoleListener(new IConsoleListener(){
public void consolesAdded(IConsole[] consoles){
VDTRunner runner = VDTLaunchUtil.getRunner();
for (int i=0;i<consoles.length;i++){
System.out.println("+++ Added: "+consoles[i].getName());
// Only shows added consoles
}
}
public void consolesRemoved(IConsole[] consoles){
VDTRunner runner = VDTLaunchUtil.getRunner();
for (int i=0;i<consoles.length;i++){
System.out.println("--- Removed: "+consoles[i].getName());
}
}
});
}
public boolean isUnfinished(String consoleName){
return unfinishedBuilds.containsKey(consoleName);
}
public VDTRunnerConfiguration resumeConfiguration(String consoleName){
VDTRunnerConfiguration conf=unfinishedBuilds.get(consoleName);
unfinishedBuilds.remove(consoleName);
return conf;
}
public void removeConfiguration(String consoleName){
unfinishedBuilds.remove(consoleName);
}
public void saveUnfinished(String consoleName, VDTRunnerConfiguration configuration ){
unfinishedBuilds.put(consoleName, configuration);
}
// make call it when console is closed
private void doResumeLaunch( String consoleName ) throws CoreException {
// System.out.println("--------- resuming "+ consoleName+" ------------");
VDTRunnerConfiguration runConfig=resumeConfiguration(consoleName);
if (runConfig==null){
System.out.println("Turned out nothing to do. Probably a bug");
return;
}
ILaunchConfiguration configuration=runConfig.getConfiguration();
BuildParamsItem[] argumentsItemsArray = VDTLaunchUtil.getArguments(configuration);
int numItem=runConfig.getBuildStep();
System.out.println("--------- resuming "+ consoleName+", numItem="+numItem+" ------------");
ILaunch launch=runConfig.getLaunch();
IProgressMonitor monitor=runConfig.getMonitor();
for (;numItem<argumentsItemsArray.length;numItem++){
List<String> toolArguments = new ArrayList<String>();
List<String> arguments=argumentsItemsArray[numItem].getParamsAsList();
if (arguments != null)
toolArguments.addAll(arguments);
// if (resources != null)
// toolArguments.addAll(resources);
if (argumentsItemsArray[numItem].getConsoleName()!=null){
System.out.println("VDTLaunchConfigurationDelegate.doLaunch: console commands not yet implemented for runner #"+numItem);
continue;
}
runConfig.setToolArguments((String[])toolArguments.toArray(new String[toolArguments.size()]));
// Launch the configuration - 1 unit of work
// VDTRunner runner = VDTLaunchUtil.getRunner();
IProcess process=run(runConfig, launch, monitor);
//Andrey: if there is a single item - launch asynchronously, if more - verify queue is empty
// will not change
// String consoleName=renderProcessLabel(runConfig.getToolName());
// check for cancellation
if (monitor.isCanceled() || (process==null)) {
removeConfiguration(consoleName);
return;
}
if (numItem<(argumentsItemsArray.length-1)){ // Not for the last
// IConsoleManager man = ConsolePlugin.getDefault().getConsoleManager(); // debugging
// IConsole[] consoles=(IConsole[]) man.getConsoles();
IOConsole iCons= (IOConsole) DebugUITools.getConsole(process); // had non-null fPatternMatcher , fType="org.eclipse.debug.ui.ProcessConsoleType"
if (iCons==null){
System.out.println("Could not get a console for the specified process");
continue;
}
System.out.println("consoleName="+consoleName+
"\nprocessConsole name="+iCons.getName());
final IOConsole fiCons=iCons;
// final String fConsoleName=fiCons.getName(); // actual console name - may be already "<terminated> ... "
final String fConsoleName=consoleName; // calculated console name - used for launching external program
// if (!fConsoleName.equals(consoleName)){ // terminated before we added listeners
if (!fConsoleName.equals(fiCons.getName())){ // terminated before we added listeners
System.out.println("Already terminated, proceed to the next item");
continue; // proceed with the next item without pausing
}
/* Prepare to postpone next commands to be resumed by event*/
runConfig.setBuildStep(numItem+1);
saveUnfinished(consoleName, runConfig );
iCons.addPropertyChangeListener( new IPropertyChangeListener() {
public void propertyChange(PropertyChangeEvent event) {
if (!fConsoleName.equals(fiCons.getName())){
fiCons.removePropertyChangeListener(this);
System.out.println(">>> "+fConsoleName+" -> "+fiCons.getName());
VDTRunner runner = VDTLaunchUtil.getRunner();
try {
runner.resumeLaunch(fConsoleName);
} catch (CoreException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
});
if (!fConsoleName.equals(consoleName)){ // terminated before we added listeners
System.out.println("Fire!");
iCons.firePropertyChange(fiCons,"org.eclipse.jface.text", consoleName, fConsoleName);
}
System.out.println("return - waiting to be awaken");
return;
}
}
monitor.done();
}
/* process.getStreamsProxy().getOutputStreamMonitor().addListener(new IStreamListener(){
public void streamAppended (String text, IStreamMonitor monitor){
//TODO: As per user requirement.
}
});
*/
/*
public void parserSetup(
VDTRunnerConfiguration configuration,
IProcess process
){
iCons= (IOConsole) DebugUITools.getConsole(process); // had non-null fPatternMatcher , fType="org.eclipse.debug.ui.ProcessConsoleType"
if (iCons==null){
System.out.println("Could not get a console for the specified process");
}
}
*/
public void resumeLaunch( String consoleName ) throws CoreException
{
try {
doResumeLaunch(consoleName);
} catch(Exception e) {
MessageUI.error(e);
if(e instanceof CoreException)
throw (CoreException)e;
}
}
/** /**
* Returns a new process aborting if the process could not be created. * Returns a new process aborting if the process could not be created.
* @param launch the launch the process is contained in * @param launch the launch the process is contained in
...@@ -78,6 +288,7 @@ public class VDTRunner { ...@@ -78,6 +288,7 @@ public class VDTRunner {
/** @see DebugPlugin#exec(String[], File, String[]) */ /** @see DebugPlugin#exec(String[], File, String[]) */
// before actual launching?
protected Process exec(String[] cmdLine, File workingDirectory, String[] envp) throws CoreException { protected Process exec(String[] cmdLine, File workingDirectory, String[] envp) throws CoreException {
return DebugPlugin.exec(cmdLine, workingDirectory, envp); return DebugPlugin.exec(cmdLine, workingDirectory, envp);
} }
...@@ -92,7 +303,7 @@ public class VDTRunner { ...@@ -92,7 +303,7 @@ public class VDTRunner {
* @param monitor progress monitor or <code>null</code> * @param monitor progress monitor or <code>null</code>
* @exception CoreException if an exception occurs while launching * @exception CoreException if an exception occurs while launching
*/ */
public void run( VDTRunnerConfiguration configuration public IProcess run( VDTRunnerConfiguration configuration
, ILaunch launch , ILaunch launch
, IProgressMonitor monitor , IProgressMonitor monitor
) throws CoreException ) throws CoreException
...@@ -158,29 +369,34 @@ public class VDTRunner { ...@@ -158,29 +369,34 @@ public class VDTRunner {
// check for cancellation // check for cancellation
if (monitor.isCanceled()) { if (monitor.isCanceled()) {
return; return null;
} }
subMonitor.subTask(Txt.s("Launch.Message.Starting")); subMonitor.subTask(Txt.s("Launch.Message.Starting"));
File workingDir = getWorkingDir(configuration); /* /data/vdt/runtime-EclipseApplication/x353 */ File workingDir = getWorkingDir(configuration); /* /data/vdt/runtime-EclipseApplication/x353 */
Process p = exec(cmdLine, workingDir, envp); Process p = exec(cmdLine, workingDir, envp);
if (p == null) { if (p == null) {
return; return null;
} }
// check for cancellation // check for cancellation
if (monitor.isCanceled()) { if (monitor.isCanceled()) {
p.destroy(); p.destroy();
return; return null;
} }
/* next actually launches the process */
/* IProcess may set/get client parameters */
VDTErrorParser parser= VerilogPlugin.getVDTErrorParser(); VDTErrorParser parser= VerilogPlugin.getVDTErrorParser();
IConsoleManager man = ConsolePlugin.getDefault().getConsoleManager(); // debugging
IConsole[] consoles=(IConsole[]) man.getConsoles();
//[Lorg.eclipse.ui.console.IConsole; cannot be cast to [Lorg.eclipse.debug.ui.console.IConsole;
/* next actually launches the process */
/* IProcess may set/get client parameters */
IProcess process= newProcess( launch IProcess process= newProcess( launch
, p , p
, renderProcessLabel(cmdLine) // , renderProcessLabel(cmdLine)
, renderProcessLabel(configuration.getToolName())
, getDefaultProcessAttrMap(configuration)); , getDefaultProcessAttrMap(configuration));
parser.parserSetup( parser.parserSetup(
configuration, configuration,
...@@ -189,6 +405,17 @@ public class VDTRunner { ...@@ -189,6 +405,17 @@ public class VDTRunner {
subMonitor.worked(1); subMonitor.worked(1);
subMonitor.done(); subMonitor.done();
man = ConsolePlugin.getDefault().getConsoleManager(); // debugging
consoles=(IConsole[]) man.getConsoles();
if (consoles.length>1){
// ((IConsole) consoles[1]).setName("Python Consloe");
}
System.out.println(consoles.length+" consoles, processes="+launch.getChildren().length);
return process;
//= consoles
//setImageDescriptor
// getImageDescriptor()
} // run() } // run()
private void log(String[] strings, private void log(String[] strings,
...@@ -247,7 +474,8 @@ public class VDTRunner { ...@@ -247,7 +474,8 @@ public class VDTRunner {
*/ */
protected Map getDefaultProcessAttrMap(VDTRunnerConfiguration config) { protected Map getDefaultProcessAttrMap(VDTRunnerConfiguration config) {
Map<String, String> map = new HashMap<String, String>(); Map<String, String> map = new HashMap<String, String>();
map.put(IProcess.ATTR_PROCESS_TYPE, Utils.getPureFileName(config.getToolToLaunch())); // map.put(IProcess.ATTR_PROCESS_TYPE, Utils.getPureFileName(config.getToolToLaunch()));
map.put(IProcess.ATTR_PROCESS_TYPE,config.getToolName());
return map; return map;
} }
...@@ -290,6 +518,10 @@ public class VDTRunner { ...@@ -290,6 +518,10 @@ public class VDTRunner {
String timestamp= DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM).format(new Date(System.currentTimeMillis())); String timestamp= DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM).format(new Date(System.currentTimeMillis()));
return Txt.s("Launch.Process.LabelFormat", new String[] {commandLine[0], timestamp}); return Txt.s("Launch.Process.LabelFormat", new String[] {commandLine[0], timestamp});
} }
public static String renderProcessLabel(String toolName) {
String timestamp= DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM).format(new Date(System.currentTimeMillis()));
return Txt.s("Launch.Process.LabelFormat", new String[] {toolName, timestamp});
}
protected static String renderCommandLine(String[] commandLine) { protected static String renderCommandLine(String[] commandLine) {
if (commandLine.length == 0) if (commandLine.length == 0)
......
...@@ -17,6 +17,10 @@ ...@@ -17,6 +17,10 @@
*******************************************************************************/ *******************************************************************************/
package com.elphel.vdt.core.launching; package com.elphel.vdt.core.launching;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.debug.core.ILaunch;
import org.eclipse.debug.core.ILaunchConfiguration;
import com.elphel.vdt.Txt; import com.elphel.vdt.Txt;
...@@ -45,6 +49,10 @@ public class VDTRunnerConfiguration { ...@@ -45,6 +49,10 @@ public class VDTRunnerConfiguration {
private String toolErrors; private String toolErrors;
private String toolWarnings; private String toolWarnings;
private String toolInfo; private String toolInfo;
private int buildStep;
private ILaunchConfiguration configuration;
private ILaunch launch;
private IProgressMonitor monitor;
private static final String[] empty= new String[0]; private static final String[] empty= new String[0];
...@@ -63,6 +71,26 @@ public class VDTRunnerConfiguration { ...@@ -63,6 +71,26 @@ public class VDTRunnerConfiguration {
this.toolToLaunch = toolToLaunch; this.toolToLaunch = toolToLaunch;
} }
public void setConfiguration(ILaunchConfiguration configuration){
this.configuration=configuration;
}
public ILaunchConfiguration getConfiguration(){
return configuration;
}
public void setLaunch(ILaunch launch){
this.launch=launch;
}
public ILaunch getLaunch(){
return launch;
}
public void setMonitor(IProgressMonitor monitor){
this.monitor=monitor;
}
public IProgressMonitor getMonitor(){
return monitor;
}
/** /**
* Returns the name of the class to launch. * Returns the name of the class to launch.
* *
...@@ -87,10 +115,22 @@ public class VDTRunnerConfiguration { ...@@ -87,10 +115,22 @@ public class VDTRunnerConfiguration {
* *
* @param args the list of arguments * @param args the list of arguments
*/ */
public void setToolArguments(String[] args) { public void setToolArguments(String[] args) {
toolArgs= args; toolArgs= args;
} }
public void setBuildStep(int buildStep){
this.buildStep=buildStep;
}
public int getBuildStep(){
return buildStep;
}
public void setIsShell(boolean isShell) { public void setIsShell(boolean isShell) {
this.isShell= isShell; this.isShell= isShell;
} }
......
...@@ -27,6 +27,7 @@ import com.elphel.vdt.core.tools.params.CommandLinesBlock; ...@@ -27,6 +27,7 @@ import com.elphel.vdt.core.tools.params.CommandLinesBlock;
import com.elphel.vdt.core.tools.params.conditions.Condition; import com.elphel.vdt.core.tools.params.conditions.Condition;
import com.elphel.vdt.core.tools.params.conditions.ConditionalStringsList; import com.elphel.vdt.core.tools.params.conditions.ConditionalStringsList;
import com.elphel.vdt.core.tools.params.conditions.NamedConditionalStringsList; import com.elphel.vdt.core.tools.params.conditions.NamedConditionalStringsList;
import com.elphel.vdt.core.tools.params.types.ParamTypeString;
public class CommandLinesNodeReader extends AbstractConditionNodeReader { public class CommandLinesNodeReader extends AbstractConditionNodeReader {
List<CommandLinesBlock> commandLinesBlocks = new ArrayList<CommandLinesBlock>(); List<CommandLinesBlock> commandLinesBlocks = new ArrayList<CommandLinesBlock>();
...@@ -70,6 +71,7 @@ public class CommandLinesNodeReader extends AbstractConditionNodeReader { ...@@ -70,6 +71,7 @@ public class CommandLinesNodeReader extends AbstractConditionNodeReader {
return new CommandLinesBlock(context.getName(), return new CommandLinesBlock(context.getName(),
name, name,
dest, dest,
ParamTypeString.KIND.FILE, //Andrey - doesn't know "kind" here yet - TODO: change to attr
sep, sep,
lines, lines,
deleteLines, deleteLines,
......
/*******************************************************************************
* Copyright (c) 2014 Elphel, Inc.
* This file is a part of Eclipse/VDT plug-in.
* Eclipse/VDT plug-in is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Eclipse/VDT plug-in is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*******************************************************************************/
package com.elphel.vdt.core.tools.contexts;
import java.util.List;
public class BuildParamsItem implements Cloneable{
private String [] params;
private String consoleName; // null for external tools running in a new console
public BuildParamsItem (
String [] params,
String consoleName) {
this.consoleName=consoleName;
this.params=params; // no need to clone?
}
public BuildParamsItem (BuildParamsItem item){
this (
item.params,
item.consoleName);
}
public BuildParamsItem clone () {
return new BuildParamsItem(this);
}
public String [] getParams(){
return params;
}
public List<String> getParamsAsList(){
List<String> arguments = new java.util.ArrayList<String>(params.length);
for(int i = 0; i < params.length; i++) {
arguments.add(params[i]);
}
return arguments;
}
/*
String[] paramArray = tool.buildParams();
System.out.println("Andrey: called tool.buildParams() here (from VDTLaunchUtils.java");
List<String> arguments = new ArrayList<String>(paramArray.length);
for(int i = 0; i < paramArray.length; i++) {
arguments.add(paramArray[i]);
}
return arguments;
*/
public String getConsoleName(){
return consoleName;
}
}
...@@ -190,8 +190,11 @@ public abstract class Context { ...@@ -190,8 +190,11 @@ public abstract class Context {
// which need to be put into a control file, and puts them to that file // which need to be put into a control file, and puts them to that file
// all other needed params are built into command line array // all other needed params are built into command line array
// that array is then returned // that array is then returned
public String[] buildParams() throws ToolException { // public String[] buildParams() throws ToolException {
List<String> commandLineParams = new ArrayList<String>(); public BuildParamsItem[] buildParams() throws ToolException {
List<BuildParamsItem> buildParamItems = new ArrayList<BuildParamsItem>();
// List<String> commandLineParams = new ArrayList<String>();
Iterator<CommandLinesBlock> commandLinesBlockIter = commandLinesBlocks.iterator(); // command lines block is empty (yes, there is nothing in project output) Iterator<CommandLinesBlock> commandLinesBlockIter = commandLinesBlocks.iterator(); // command lines block is empty (yes, there is nothing in project output)
createdControlFiles.clear(); createdControlFiles.clear();
...@@ -202,22 +205,31 @@ public abstract class Context { ...@@ -202,22 +205,31 @@ public abstract class Context {
if(!commandLinesBlock.isEnabled()) if(!commandLinesBlock.isEnabled())
continue; continue;
String paramName = commandLinesBlock.getDestination(); String paramName = commandLinesBlock.getDestination(); // Andrey debugging: null?
boolean isConsoleName=commandLinesBlock.isConsoleKind();
String sep = commandLinesBlock.getSeparator(); String sep = commandLinesBlock.getSeparator();
List<String> lines = commandLinesBlock.getLines(); // [%Param_Shell_Options, echo BuildDir=%BuildDir ;, echo SimulationTopFile=%SimulationTopFile ;, echo SimulationTopModule=%SimulationTopModule ;, echo BuildDir=%BuildDir;, %Param_PreExe, %Param_Exe, %Param_TopModule, %TopModulesOther, %ModuleLibrary, %LegacyModel, %NoSpecify, %v, %SourceList, %ExtraFiles, %Filter_String] List<String> lines = commandLinesBlock.getLines(); // [%Param_Shell_Options, echo BuildDir=%BuildDir ;, echo SimulationTopFile=%SimulationTopFile ;, echo SimulationTopModule=%SimulationTopModule ;, echo BuildDir=%BuildDir;, %Param_PreExe, %Param_Exe, %Param_TopModule, %TopModulesOther, %ModuleLibrary, %LegacyModel, %NoSpecify, %v, %SourceList, %ExtraFiles, %Filter_String]
List<List<String>> commandSequence = new ArrayList<List<String>>(); List<List<String>> commandSequence = new ArrayList<List<String>>();
for(Iterator<String> lineIter = lines.iterator(); lineIter.hasNext();) { for(Iterator<String> lineIter = lines.iterator(); lineIter.hasNext();) {
String line = (String)lineIter.next(); String line = (String)lineIter.next();
commandSequence.add(buildCommandString(line)); commandSequence.add(buildCommandString(line));
} }
// Here - already resolved to empty // Here - already resolved to empty
List<String> commandLineParams = new ArrayList<String>();
if(paramName != null) { if(paramName != null) {
Parameter commandFileParam = findParam(paramName); Parameter commandFileParam = findParam(paramName);
String controlFileName = commandFileParam != null? String controlFileName = commandFileParam != null?
commandFileParam.getValue().get(0).trim() : null; commandFileParam.getValue().get(0).trim() : null;
if (isConsoleName) {
// System.out.println("TODO: Enable console command generation here");
printStringsToConsoleLine(commandLineParams, commandSequence);
buildParamItems.add(
new BuildParamsItem (
(String[])commandLineParams.toArray(new String[commandLineParams.size()]),
controlFileName) // find console beginning with this name, send commands there
);
} else {
if(workingDirectory != null) if(workingDirectory != null)
controlFileName = workingDirectory + File.separator + controlFileName; controlFileName = workingDirectory + File.separator + controlFileName;
...@@ -234,12 +246,21 @@ public abstract class Context { ...@@ -234,12 +246,21 @@ public abstract class Context {
if(!controlFileExists) if(!controlFileExists)
createdControlFiles.add(controlFileName); createdControlFiles.add(controlFileName);
}
} else { } else {
// TODO: will need multiple command lines // Andrey
printStringsToCommandLine(commandLineParams, commandSequence); printStringsToCommandLine(commandLineParams, commandSequence);
buildParamItems.add(
new BuildParamsItem (
(String[])commandLineParams.toArray(new String[commandLineParams.size()]),
null) // external tool in a new console
);
} }
} }
// return (String[])commandLineParams.toArray(new String[commandLineParams.size()]);
return (String[])commandLineParams.toArray(new String[commandLineParams.size()]); return (BuildParamsItem[])buildParamItems.toArray(new BuildParamsItem[buildParamItems.size()]);
} }
protected List<String> buildCommandString(String paramStringTemplate) protected List<String> buildCommandString(String paramStringTemplate)
...@@ -406,6 +427,25 @@ public abstract class Context { ...@@ -406,6 +427,25 @@ public abstract class Context {
for(Iterator<List<String>> li = commandSequence.iterator(); li.hasNext();) { for(Iterator<List<String>> li = commandSequence.iterator(); li.hasNext();) {
List<String> strList = (List<String>)li.next(); List<String> strList = (List<String>)li.next();
if(strList.size() > 0) {
for(Iterator<String> si = strList.iterator(); si.hasNext();) {
String s = ((String)si.next()).trim();
if(!s.equals(""))
commandLineParams.add(s);
}
}
}
}
// Andrey: now is the same as command line, but will change to allow last element be prompt
private void printStringsToConsoleLine(List<String> commandLineParams,
List<List<String>> commandSequence)
throws ToolException
{
for(Iterator<List<String>> li = commandSequence.iterator(); li.hasNext();) {
List<String> strList = (List<String>)li.next();
if(strList.size() > 0) { if(strList.size() > 0) {
for(Iterator<String> si = strList.iterator(); si.hasNext();) { for(Iterator<String> si = strList.iterator(); si.hasNext();) {
String s = ((String)si.next()).trim(); String s = ((String)si.next()).trim();
......
...@@ -65,6 +65,10 @@ public abstract class ContextWithoutCommandLine extends Context { ...@@ -65,6 +65,10 @@ public abstract class ContextWithoutCommandLine extends Context {
"' cannot contain command line, but destination of its '" + "' cannot contain command line, but destination of its '" +
block.getName() + block.getName() +
"' command block is not specified"); "' command block is not specified");
if(!block.isFileKind())
throw new ConfigException("Context '" + name +
"' cannot contain commands for console "+
destination);
} }
} }
} }
......
...@@ -25,6 +25,7 @@ import com.elphel.vdt.core.tools.config.Config; ...@@ -25,6 +25,7 @@ import com.elphel.vdt.core.tools.config.Config;
import com.elphel.vdt.core.tools.config.ConfigException; import com.elphel.vdt.core.tools.config.ConfigException;
import com.elphel.vdt.core.tools.params.conditions.*; import com.elphel.vdt.core.tools.params.conditions.*;
import com.elphel.vdt.core.tools.params.types.ParamTypeString; import com.elphel.vdt.core.tools.params.types.ParamTypeString;
import com.elphel.vdt.core.tools.params.types.ParamTypeString.KIND;
public class CommandLinesBlock extends UpdateableStringsContainer public class CommandLinesBlock extends UpdateableStringsContainer
implements Cloneable implements Cloneable
...@@ -33,10 +34,12 @@ public class CommandLinesBlock extends UpdateableStringsContainer ...@@ -33,10 +34,12 @@ public class CommandLinesBlock extends UpdateableStringsContainer
private String name; private String name;
private String destination; private String destination;
private String separator; private String separator;
private KIND kind; //command file name or console name
public CommandLinesBlock(String contextName, public CommandLinesBlock(String contextName,
String name, String name,
String destination, String destination,
KIND kind,
String sep, String sep,
ConditionalStringsList lines, ConditionalStringsList lines,
ConditionalStringsList deleteLines, ConditionalStringsList deleteLines,
...@@ -47,6 +50,7 @@ public class CommandLinesBlock extends UpdateableStringsContainer ...@@ -47,6 +50,7 @@ public class CommandLinesBlock extends UpdateableStringsContainer
this.contextName = contextName; this.contextName = contextName;
this.name = name; this.name = name;
this.destination = destination; this.destination = destination;
this.kind=kind;
this.separator = sep; this.separator = sep;
if(separator != null) { if(separator != null) {
...@@ -59,6 +63,7 @@ public class CommandLinesBlock extends UpdateableStringsContainer ...@@ -59,6 +63,7 @@ public class CommandLinesBlock extends UpdateableStringsContainer
this(block.contextName, this(block.contextName,
block.name, block.name,
block.destination, block.destination,
block.kind,
block.separator, block.separator,
block.strings != null? block.strings != null?
(ConditionalStringsList)block.strings.clone() : null, (ConditionalStringsList)block.strings.clone() : null,
...@@ -89,13 +94,20 @@ public class CommandLinesBlock extends UpdateableStringsContainer ...@@ -89,13 +94,20 @@ public class CommandLinesBlock extends UpdateableStringsContainer
"' used for command line of context '" + context.getName() + "' used for command line of context '" + context.getName() +
"' must be of type '" + ParamTypeString.NAME + "' must be of type '" + ParamTypeString.NAME +
"'"); "'");
} else if(((ParamTypeString)param.getType()).getKind() != ParamTypeString.KIND.FILE) { } else {
kind=((ParamTypeString)param.getType()).getKind();
if(kind != ParamTypeString.KIND.FILE) {
if(((ParamTypeString)param.getType()).getKind() != ParamTypeString.KIND.TEXT) { // Andrey - adding console name option
throw new ConfigException("Destination parameter '" + destination + throw new ConfigException("Destination parameter '" + destination +
"' of type '" + ParamTypeString.NAME + "' of type '" + ParamTypeString.NAME +
"' used for command line of context '" + context.getName() + "' used for command line of context '" + context.getName() +
"' must be of kind '" + ParamTypeString.KIND_FILE_ID + "' must be of kind '" + ParamTypeString.KIND_FILE_ID +
"' or '" + ParamTypeString.KIND_TEXT_ID +
"'"); "'");
} }
System.out.println("Got string text kind for command block (for console name)");
}
}
} }
} }
...@@ -111,6 +123,18 @@ public class CommandLinesBlock extends UpdateableStringsContainer ...@@ -111,6 +123,18 @@ public class CommandLinesBlock extends UpdateableStringsContainer
return destination; return destination;
} }
public KIND getKind() {
return kind;
}
public boolean isFileKind() {
return kind == ParamTypeString.KIND.FILE;
}
public boolean isConsoleKind() {
return kind == ParamTypeString.KIND.TEXT;
}
public List<String> getLines() { public List<String> getLines() {
return ConditionUtils.resolveConditionStrings(strings); return ConditionUtils.resolveConditionStrings(strings);
} }
......
...@@ -374,6 +374,12 @@ public class Tool extends Context implements Cloneable, Inheritable { ...@@ -374,6 +374,12 @@ public class Tool extends Context implements Cloneable, Inheritable {
} }
public Parameter findParam(String paramID) { public Parameter findParam(String paramID) {
// System.out.println("findParam("+paramID+")");
// if (paramID==null){
// System.out.println("findParam(null!!!)");
// return null;
// }
Parameter param = super.findParam(paramID); //Andrey: happily finds ProjectContext parameter, thinks it is tool context Parameter param = super.findParam(paramID); //Andrey: happily finds ProjectContext parameter, thinks it is tool context
/* /*
* Andrey: Added isChild property to the Property, and still left static inheritance at XML parsing time. Then, during parameter * Andrey: Added isChild property to the Property, and still left static inheritance at XML parsing time. Then, during parameter
...@@ -411,7 +417,8 @@ public class Tool extends Context implements Cloneable, Inheritable { ...@@ -411,7 +417,8 @@ public class Tool extends Context implements Cloneable, Inheritable {
return baseTool; return baseTool;
} }
public String[] buildParams() throws ToolException { // public String[] buildParams() throws ToolException {
public BuildParamsItem[] buildParams() throws ToolException {
if(parentPackage != null) if(parentPackage != null)
parentPackage.buildParams(); parentPackage.buildParams();
......
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2006 Elphel, Inc and Excelsior, LLC. * Copyright (c) 2014 Elphel, Inc.
* This file is a part of Eclipse/VDT plug-in. * This file is a part of Eclipse/VDT plug-in.
* Eclipse/VDT plug-in is free software; you can redistribute it and/or modify * Eclipse/VDT plug-in is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by the * it under the terms of the GNU General Public License as published by
* Free Software Foundation; either version 2 of the License, or (at your option) * the Free Software Foundation, either version 3 of the License, or
* any later version. * (at your option) any later version.
* *
* Eclipse/VDT plug-in is distributed in the hope that it will be useful, but * Eclipse/VDT plug-in is distributed in the hope that it will be useful,
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * but WITHOUT ANY WARRANTY; without even the implied warranty of
* FITNESS FOR A PARTICULAR PURPOSE. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* See the GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License along * You should have received a copy of the GNU General Public License
* with Eclipse VDT plug-in; if not, write to the Free Software * along with this program. If not, see <http://www.gnu.org/licenses/>.
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*******************************************************************************/ *******************************************************************************/
package com.elphel.vdt.core.tools.params.types; package com.elphel.vdt.core.tools.params.types;
......
...@@ -251,7 +251,12 @@ public class SelectedResourceManager implements IWindowListener, ISelectionListe ...@@ -251,7 +251,12 @@ public class SelectedResourceManager implements IWindowListener, ISelectionListe
IProject project=getSelectedProject(); IProject project=getSelectedProject();
if (project==null) return; if (project==null) return;
IPath path = new Path(fChosenTarget); IPath path = new Path(fChosenTarget);
IFile file = (path==null)?null:project.getFile(path); IFile file=null;
try {
file = (path==null)?null:project.getFile(path);
} catch (IllegalArgumentException e) {
// Path must include project and resource name: /x353
}
if ((file != null) && (VerilogUtils.isHhdlFile(file))) if ((file != null) && (VerilogUtils.isHhdlFile(file)))
fChosenVerilogFile=file; fChosenVerilogFile=file;
else if (fChosenVerilogFile==null) else if (fChosenVerilogFile==null)
......
...@@ -40,6 +40,15 @@ ...@@ -40,6 +40,15 @@
icon="gtkwave.ico" icon="gtkwave.ico"
call="iverilog"/> call="iverilog"/>
</menu> </menu>
<menuitem name="RemotePython"
label="Run remote Python session"
icon="python.png"
call="RemotePython"/>
<menuitem name="RemotePythonCommand"
label="Send a command to the remote Python session"
icon="my_tool.gif"
call="RemotePythonCommand"/>
<menu name="XDS" <menu name="XDS"
label="Demo XDS Tools" label="Demo XDS Tools"
......
<?xml version="1.0" encoding="UTF-8"?>
<vdt-project>
<interface name="RemoteInterface" extends="project_interface">
</interface>
<tool name = "RemotePython"
project = "FPGA_project"
label = "RemotePython"
shell = "/bin/bash"
interface = "RemoteInterface"
description = "Launching remote Python in console"
errors = "(.*):([0-9]+): [a-z ]*error: (.*)"
warnings = "(.*):([0-9]+): warning: (.*)"
info = "(.*):([0-9]+): info: (.*)"> <!--does not actually exist -->
<extensions-list>
<extension mask="v"/>
<extension mask="tf"/>
</extensions-list>
<action-menu>
<action label="Remote Python" resource="" icon="python.png" />
</action-menu>
<parameter id = "RemoteHost"
label = "Remote Host IP"
type = "String"
format = "CopyValue"
default = "192.168.0.66"
readonly = "false"
visible = "true"/>
<parameter id = "RemoteUser"
label = "Remote user name"
type = "String"
format = "CopyValue"
default = ""
readonly = "false"
visible = "true"/>
<parameter id = "PreSSH"
label = "pre-ssh shell parameters"
type = "String"
format = "CopyValue"
default = ""
readonly = "false"
visible = "true"/>
<parameter id = "ShellSwitches"
label = "Shell switches"
type = "String"
format = "CopyValue"
default = "-c"
readonly = "false"
visible = "true"/>
<parameter id = "SSHSwitches"
label = "Remote ssh switches"
type = "String"
format = "CopyValue"
default = ""
readonly = "false"
visible = "true"/>
<parameter id = "RemoteCommand"
label = "Remote ssh command"
type = "String"
format = "CopyValue"
default = "python -i -u"
readonly = "false"
visible = "true"/>
<parameter id = "SSHExtra"
label = "ssh extra parameters"
type = "String"
format = "CopyValue"
default = ""
readonly = "false"
visible = "true"/>
<input>
<group name="General">
"RemoteHost"
"RemoteUser"
"ShellSwitches"
"PreSSH"
"SSHSwitches"
"RemoteCommand"
"SSHExtra"
</group>
</input>
<output>
<line name="command_line">
"%ShellSwitches"
"%PreSSH"
"ssh"
"-l"
"%RemoteUser"
"%RemoteHost"
"%SSHSwitches"
"'"
"%RemoteCommand"
"'"
"%SSHExtra"
</line>
</output>
</tool>
<tool name = "RemotePythonCommand"
project = "FPGA_project"
label = "RemotePythonCommand"
shell = "/bin/bash"
interface = "RemoteInterface"
description = "Sending command to a ermote Python session"
errors = "(.*):([0-9]+): [a-z ]*error: (.*)"
warnings = "(.*):([0-9]+): warning: (.*)"
info = "(.*):([0-9]+): info: (.*)"> <!--does not actually exist -->
<extensions-list>
<extension mask="v"/>
<extension mask="tf"/>
</extensions-list>
<action-menu>
<action label="Remote Python Command" resource="" icon="python.png" />
</action-menu>
<parameter id = "RemoteCommand"
label = "Remote Command to send"
type = "String"
format = "CopyValue"
default = "print &quot;Hello, World!&quot;"
readonly = "false"
visible = "true"/>
<parameter id="python_console_name" default="RemotePython"
type="String" format="CopyValue" visible="false" />
<input>
<group name="General">
"RemoteCommand"
</group>
</input>
<output>
<line name="command_line">
"-c"
"echo 'Nothing to do, sleepiing 15' ;"
"sleep 15 ;"
"echo 'Nothing to do, awakening' ;"
</line>
<line name="console_line" dest="python_console_name" sep="\n">
"%RemoteCommand"
</line>
<line name="command_line">
"-c"
"echo 'Nothing to do second time, sleeping 25' ;"
"sleep 25 ;"
"echo 'Nothing to do again, awakening after sleep 25' ;"
</line>
</output>
</tool>
</vdt-project>
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