/*******************************************************************************
* Copyright (c) 2016 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.build;
import java.util.Collection;
import org.eclipse.cdt.arduino.core.internal.Activator;
import org.eclipse.cdt.arduino.core.internal.board.ArduinoBoard;
import org.eclipse.cdt.arduino.core.internal.board.ArduinoManager;
import org.eclipse.cdt.arduino.core.internal.remote.ArduinoRemoteConnection;
import org.eclipse.cdt.core.build.ICBuildConfiguration;
import org.eclipse.cdt.core.build.ICBuildConfigurationManager;
import org.eclipse.cdt.core.build.ICBuildConfigurationProvider;
import org.eclipse.cdt.core.build.IToolChain;
import org.eclipse.cdt.core.build.IToolChainManager;
import org.eclipse.cdt.core.build.IToolChainProvider;
import org.eclipse.core.resources.IBuildConfiguration;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.remote.core.IRemoteConnection;
import org.eclipse.remote.core.IRemoteConnectionType;
import org.eclipse.remote.core.IRemoteServicesManager;
public class ArduinoBuildConfigurationProvider implements ICBuildConfigurationProvider {
public static final String ID = "org.eclipse.cdt.arduino.core.provider"; //$NON-NLS-1$
private static final ICBuildConfigurationManager configManager = Activator
.getService(ICBuildConfigurationManager.class);
private static final ArduinoManager arduinoManager = Activator.getService(ArduinoManager.class);
@Override
public String getId() {
return ID;
}
@Override
public ICBuildConfiguration getCBuildConfiguration(IBuildConfiguration config, String name) throws CoreException {
if (config.getName().equals(IBuildConfiguration.DEFAULT_CONFIG_NAME)) {
// Use the good ol' Uno as the default
ArduinoBoard board = arduinoManager.getBoard("arduino", "avr", "uno"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
if (board == null) {
Collection<ArduinoBoard> boards = arduinoManager.getInstalledBoards();
if (!boards.isEmpty()) {
board = boards.iterator().next();
}
}
if (board != null) {
IToolChain toolChain = createToolChain(config);
return new ArduinoBuildConfiguration(config, name, "run", board, toolChain); //$NON-NLS-1$
}
} else {
IRemoteServicesManager remoteManager = Activator.getService(IRemoteServicesManager.class);
IRemoteConnectionType connectionType = remoteManager.getConnectionType(ArduinoRemoteConnection.TYPE_ID);
IRemoteConnection connection = connectionType.getConnection(name);
if (connection == null) {
throw Activator.coreException(String.format("Unknown connection: %s", name), null);
}
ArduinoRemoteConnection target = connection.getService(ArduinoRemoteConnection.class);
if (target != null) {
IToolChain toolChain = createToolChain(config);
return new ArduinoBuildConfiguration(config, name, "run", target, toolChain); //$NON-NLS-1$
}
}
return null;
}
public ArduinoBuildConfiguration getConfiguration(IProject project, ArduinoRemoteConnection target,
String launchMode, IProgressMonitor monitor) throws CoreException {
for (IBuildConfiguration config : project.getBuildConfigs()) {
ICBuildConfiguration cconfig = config.getAdapter(ICBuildConfiguration.class);
if (cconfig != null) {
ArduinoBuildConfiguration arduinoConfig = cconfig.getAdapter(ArduinoBuildConfiguration.class);
if (arduinoConfig != null && target.equals(arduinoConfig.getTarget())
&& arduinoConfig.getLaunchMode().equals(launchMode)) {
return arduinoConfig;
}
}
}
// Make a new one
String configName = target.getRemoteConnection().getName();
IBuildConfiguration config = configManager.createBuildConfiguration(this, project, configName, monitor);
IToolChain toolChain = createToolChain(config);
ArduinoBuildConfiguration arduinoConfig = new ArduinoBuildConfiguration(config, configName, "run", target, //$NON-NLS-1$
toolChain);
configManager.addBuildConfiguration(config, arduinoConfig);
return arduinoConfig;
}
private IToolChain createToolChain(IBuildConfiguration config) throws CoreException {
IToolChainManager toolChainManager = Activator.getService(IToolChainManager.class);
IToolChainProvider provider = toolChainManager.getProvider(ArduinoToolChainProvider.ID);
IToolChain toolChain = new ArduinoToolChain(provider, config);
toolChainManager.addToolChain(toolChain);
return toolChain;
}
}