1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-25 09:55:29 +02:00

Bug 483729 - Make Arduino upload a proper launch.

Creates and ArduinoLaunch object to manage the pause and resume of the
serial port on launch and terminate. Registers the uploader process
with the debug framework so that it's connected properly to the launch
and the console.

Change-Id: If14cf8ddf2c1b6ceda19bce8d37e07ebce9700f2
This commit is contained in:
Doug Schaefer 2015-12-06 20:23:26 -05:00
parent 207d2e1006
commit ae02a50dba
2 changed files with 80 additions and 60 deletions

View file

@ -0,0 +1,47 @@
/*******************************************************************************
* Copyright (c) 2015 QNX Software Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*******************************************************************************/
package org.eclipse.cdt.arduino.core.internal.launch;
import org.eclipse.cdt.arduino.core.internal.remote.ArduinoRemoteConnection;
import org.eclipse.debug.core.DebugEvent;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.Launch;
import org.eclipse.debug.core.model.ISourceLocator;
import org.eclipse.remote.core.IRemoteConnection;
public class ArduinoLaunch extends Launch {
private final ArduinoRemoteConnection target;
private boolean wasOpen;
public ArduinoLaunch(ILaunchConfiguration launchConfiguration, String mode, ISourceLocator locator,
IRemoteConnection target) {
super(launchConfiguration, mode, locator);
this.target = target.getService(ArduinoRemoteConnection.class);
DebugPlugin.getDefault().addDebugEventListener(this);
}
public void start() {
this.wasOpen = target.getRemoteConnection().isOpen();
if (wasOpen) {
target.pause();
}
}
@Override
public void handleDebugEvents(DebugEvent[] events) {
super.handleDebugEvents(events);
if (isTerminated() && wasOpen) {
target.resume();
wasOpen = false;
}
}
}

View file

@ -15,14 +15,12 @@ import java.io.IOException;
import org.eclipse.cdt.arduino.core.internal.Activator;
import org.eclipse.cdt.arduino.core.internal.Messages;
import org.eclipse.cdt.arduino.core.internal.build.ArduinoBuildConfiguration;
import org.eclipse.cdt.arduino.core.internal.console.ArduinoConsoleService;
import org.eclipse.cdt.arduino.core.internal.remote.ArduinoRemoteConnection;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.ILaunch;
import org.eclipse.debug.core.ILaunchConfiguration;
@ -43,6 +41,11 @@ public class ArduinoLaunchConfigurationDelegate extends LaunchConfigurationDeleg
return connectionType.getConnection(connectionName);
}
@Override
public ILaunch getLaunch(ILaunchConfiguration configuration, String mode) throws CoreException {
return new ArduinoLaunch(configuration, mode, null, getTarget(configuration));
}
@Override
public boolean buildForLaunch(ILaunchConfiguration configuration, String mode, IProgressMonitor monitor)
throws CoreException {
@ -71,69 +74,39 @@ public class ArduinoLaunchConfigurationDelegate extends LaunchConfigurationDeleg
@Override
public void launch(final ILaunchConfiguration configuration, String mode, final ILaunch launch,
IProgressMonitor monitor) throws CoreException {
new Job(Messages.ArduinoLaunchConfigurationDelegate_0) {
protected IStatus run(IProgressMonitor monitor) {
try {
ArduinoConsoleService consoleService = Activator.getConsoleService();
IRemoteConnection target = getTarget(configuration);
if (target == null) {
return new Status(IStatus.ERROR, Activator.getId(),
Messages.ArduinoLaunchConfigurationDelegate_2);
}
ArduinoRemoteConnection arduinoTarget = target.getService(ArduinoRemoteConnection.class);
try {
IRemoteConnection target = getTarget(configuration);
if (target == null) {
throw new CoreException(
new Status(IStatus.ERROR, Activator.getId(), Messages.ArduinoLaunchConfigurationDelegate_2));
}
ArduinoRemoteConnection arduinoTarget = target.getService(ArduinoRemoteConnection.class);
// The project
IProject project = (IProject) configuration.getMappedResources()[0];
// The project
IProject project = (IProject) configuration.getMappedResources()[0];
// The build config
ArduinoBuildConfiguration arduinoConfig = ArduinoBuildConfiguration.getConfig(project,
arduinoTarget, monitor);
String[] uploadCmd = arduinoConfig.getUploadCommand(arduinoTarget.getPortName());
// The build config
ArduinoBuildConfiguration arduinoConfig = ArduinoBuildConfiguration.getConfig(project, arduinoTarget,
monitor);
String[] uploadCmd = arduinoConfig.getUploadCommand(arduinoTarget.getPortName());
// If opened, temporarily close the connection so we can use
// it to download the firmware.
boolean wasOpened = target.isOpen();
if (wasOpened) {
arduinoTarget.pause();
}
StringBuffer cmdStr = new StringBuffer(uploadCmd[0]);
for (int i = 1; i < uploadCmd.length; ++i) {
cmdStr.append(' ');
cmdStr.append(uploadCmd[i]);
}
// Start the launch
((ArduinoLaunch) launch).start();
StringBuffer cmdStr = new StringBuffer(uploadCmd[0]);
for (int i = 1; i < uploadCmd.length; ++i) {
cmdStr.append(' ');
cmdStr.append(uploadCmd[i]);
}
cmdStr.append('\n');
consoleService.writeOutput(cmdStr.toString());
// Run the process and capture the results in the console
ProcessBuilder processBuilder = new ProcessBuilder(uploadCmd).directory(arduinoConfig.getBuildDirectory());
arduinoConfig.setEnvironment(processBuilder.environment());
Process process = processBuilder.start();
DebugPlugin.newProcess(launch, process, cmdStr.toString());
} catch (IOException e) {
throw new CoreException(new Status(IStatus.ERROR, Activator.getId(), e.getLocalizedMessage(), e));
}
// Run the process and capture the results in the console
ProcessBuilder processBuilder = new ProcessBuilder(uploadCmd)
.directory(arduinoConfig.getBuildDirectory());
arduinoConfig.setEnvironment(processBuilder.environment());
Process process = processBuilder.start();
consoleService.monitor(process, null, null);
try {
process.waitFor();
} catch (InterruptedException e) {
}
consoleService.writeOutput("Upload complete\n");
// Reopen the connection
if (wasOpened) {
arduinoTarget.resume();
}
} catch (CoreException e) {
return e.getStatus();
} catch (IOException e) {
return new Status(IStatus.ERROR, Activator.getId(), e.getLocalizedMessage(), e);
} finally {
DebugPlugin.getDefault().getLaunchManager().removeLaunch(launch);
}
return Status.OK_STATUS;
};
}.schedule();
}
}