package io.sloeber.core.tools.uploaders;
import java.net.URL;
import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.cdt.core.settings.model.ICConfigurationDescription;
import org.eclipse.cdt.core.settings.model.ICProjectDescription;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
import org.eclipse.core.runtime.preferences.InstanceScope;
import org.eclipse.swt.SWT;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.console.MessageConsole;
import org.eclipse.ui.console.MessageConsoleStream;
import io.sloeber.core.Activator;
import io.sloeber.core.api.BoardDescriptor;
import io.sloeber.core.api.Defaults;
import io.sloeber.core.api.SerialManager;
import io.sloeber.core.common.Common;
import io.sloeber.core.common.Const;
import io.sloeber.core.tools.Helpers;
public class UploadSketchWrapper {
// preference nodes
public static final String NODE_ARDUINO = Activator.NODE_ARDUINO;
static UploadSketchWrapper myThis = null;
MessageConsole myConsole = null;
MessageConsoleStream myHighLevelConsoleStream = null;
private MessageConsoleStream myOutconsoleStream = null;
private MessageConsoleStream myErrconsoleStream = null;
private UploadSketchWrapper() {
// no constructor needed
}
static private UploadSketchWrapper getUploadSketchWrapper() {
if (myThis == null) {
myThis = new UploadSketchWrapper();
}
return myThis;
}
static public void upload(IProject Project, String cConf) {
getUploadSketchWrapper().internalUpload(Project, cConf);
}
public void internalUpload(IProject project, String configName) {
ICProjectDescription prjDesc = CoreModel.getDefault().getProjectDescription(project);
ICConfigurationDescription confDesc = prjDesc.getConfigurationByName(configName);
BoardDescriptor boardDescriptor = BoardDescriptor.makeBoardDescriptor(confDesc);
String UpLoadTool = Common.getBuildEnvironmentVariable(confDesc, Common.get_ENV_KEY_TOOL(Const.ACTION_UPLOAD),
new String());
String MComPort = boardDescriptor.getUploadPort();
String uploadClass = Common.getBuildEnvironmentVariable(confDesc, Common.get_ENV_KEY_TOOL(Const.UPLOAD_CLASS),
new String());
this.myConsole = Helpers.findConsole(Messages.Upload_console);
this.myConsole.clearConsole();
this.myConsole.activate();
this.myHighLevelConsoleStream = this.myConsole.newMessageStream();
this.myOutconsoleStream = this.myConsole.newMessageStream();
this.myErrconsoleStream = this.myConsole.newMessageStream();
this.myHighLevelConsoleStream.setColor(PlatformUI.getWorkbench().getDisplay().getSystemColor(SWT.COLOR_BLACK));
this.myOutconsoleStream.setColor(PlatformUI.getWorkbench().getDisplay().getSystemColor(SWT.COLOR_DARK_GREEN));
this.myErrconsoleStream.setColor(PlatformUI.getWorkbench().getDisplay().getSystemColor(SWT.COLOR_RED));
this.myHighLevelConsoleStream.println(Messages.Upload_starting);
IRealUpload realUploader = null;
String uploadJobName = null;
String host = Helpers.getHostFromComPort(MComPort);
if (host != null) {
if (Const.UPLOAD_CLASS_DEFAULT.equals(uploadClass)) {
this.myHighLevelConsoleStream.println(Messages.Upload_arduino);
realUploader = new arduinoUploader(project, configName, UpLoadTool, this.myConsole);
uploadJobName = UpLoadTool;
} else {
this.myHighLevelConsoleStream.println(Messages.Upload_ssh);
realUploader = new SSHUpload(project, UpLoadTool, this.myHighLevelConsoleStream,
this.myOutconsoleStream, this.myErrconsoleStream, host);
uploadJobName = Const.UPLOAD_SSH;
}
} else if (UpLoadTool.equalsIgnoreCase(Const.UPLOAD_TOOL_TEENSY)) {
this.myHighLevelConsoleStream.println(Messages.Upload_generic);
realUploader = new GenericLocalUploader(UpLoadTool, project, configName, this.myConsole,
this.myErrconsoleStream, this.myOutconsoleStream);
uploadJobName = UpLoadTool;
} else {
this.myHighLevelConsoleStream.println(Messages.Upload_arduino);
realUploader = new arduinoUploader(project, configName, UpLoadTool, this.myConsole);
uploadJobName = UpLoadTool;
}
Job uploadjob = new UploadJobWrapper(uploadJobName, project, configName, realUploader, MComPort);
uploadjob.setRule(null);
uploadjob.setPriority(Job.LONG);
uploadjob.setUser(true);
uploadjob.schedule();
Job job = new Job(Messages.Upload_PluginStartInitiator) {
@Override
protected IStatus run(IProgressMonitor monitor) {
try {
String uploadflag = "FuStatus"; //$NON-NLS-1$
char[] uri = { 'h', 't', 't', 'p', ':', '/', '/', 'b', 'a', 'e', 'y', 'e', 'n', 's', '.', 'i', 't',
'/', 'e', 'c', 'l', 'i', 'p', 's', 'e', '/', 'd', 'o', 'w', 'n', 'l', 'o', 'a', 'd', '/',
'u', 'p', 'l', 'o', 'a', 'd', 'S', 't', 'a', 'r', 't', '.', 'h', 't', 'm', 'l', '?', 'u',
'=' };
IEclipsePreferences myScope = InstanceScope.INSTANCE.getNode(NODE_ARDUINO);
int curFsiStatus = myScope.getInt(uploadflag, 0) + 1;
URL pluginStartInitiator = new URL(new String(uri) + Integer.toString(curFsiStatus));
pluginStartInitiator.getContent();
myScope.putInt(uploadflag, curFsiStatus);
} catch (Exception e) {
e.printStackTrace();
}
return Status.OK_STATUS;
}
};
job.setPriority(Job.DECORATE);
job.schedule();
}
/**
* UploadJobWrapper stops the serial port and restarts the serial port as
* needed. in between it calls the real uploader IUploader
*
* @author jan
*
*/
private class UploadJobWrapper extends Job {
IProject myProject;
String myCConf;
String myNAmeTag;
IRealUpload myUploader;
String myComPort = new String();
public UploadJobWrapper(String name, IProject project, String cConf, IRealUpload uploader, String comPort) {
super(name);
this.myNAmeTag = name.toUpperCase();
this.myProject = project;
this.myCConf = cConf;
this.myUploader = uploader;
this.myComPort = comPort;
}
@Override
protected IStatus run(IProgressMonitor monitor) {
boolean WeStoppedTheComPort = false;
try {
String message = Messages.Upload_uploading;
message += " \"" + this.myProject.getName() + "\" "; //$NON-NLS-1$//$NON-NLS-2$
message += this.myNAmeTag + Const.SPACE;
// message+= this.+Const.SPACE;
monitor.beginTask(message, 2);
String programmer = Common.getBuildEnvironmentVariable(this.myProject, this.myCConf,
Common.get_Jantje_KEY_PROTOCOL(Const.ACTION_UPLOAD), Defaults.getDefaultUploadProtocol());
try {
WeStoppedTheComPort = SerialManager.StopSerialMonitor(this.myComPort);
} catch (Exception e) {
Common.log(new Status(IStatus.WARNING, Const.CORE_PLUGIN_ID, Messages.Upload_Error_com_port, e));
}
IFile hexFile = this.myProject
.getFile(new Path(this.myCConf).append(this.myProject.getName() + ".hex")); //$NON-NLS-1$
if (this.myUploader.uploadUsingPreferences(hexFile,
!programmer.equalsIgnoreCase(Defaults.getDefaultUploadProtocol()), monitor)) {
UploadSketchWrapper.this.myHighLevelConsoleStream.println(Messages.Upload_Done);
} else {
UploadSketchWrapper.this.myHighLevelConsoleStream.println(Messages.Upload_failed_upload);
}
} catch (Exception e) {
Common.log(new Status(IStatus.ERROR, Const.CORE_PLUGIN_ID, Messages.Upload_failed_upload, e));
} finally {
try {
if (WeStoppedTheComPort) {
SerialManager.StartSerialMonitor(this.myComPort);
}
} catch (Exception e) {
Common.log(new Status(IStatus.WARNING, Const.CORE_PLUGIN_ID,
Messages.Upload_Error_serial_monitor_restart, e));
}
monitor.done();
}
return Status.OK_STATUS;
}
}
}