1 #include "platformarduino.h"
2 #include "programtab.h"
3
4 #include <QDir>
5 #include <QFileInfo>
6 #include <QProcess>
7
PlatformArduino()8 PlatformArduino::PlatformArduino() : Platform(QString("Arduino"))
9 {
10 setReferenceUrl(QUrl(QString("http://arduino.cc/en/Reference/")));
11 setIdeName("Arduino IDE");
12 setDownloadUrl(QUrl("http://arduino.cc/en/Main/Software"));
13 setMinVersion("1.5.2");
14 setCanProgram(true);
15 setExtensions(QStringList() << ".ino" << ".pde");
16
17 QMap<QString, QString> boards;
18 // https://github.com/arduino/Arduino/blob/ide-1.5.x/hardware/arduino/avr/boards.txt
19 boards.insert("Arduino UNO", "arduino:avr:uno");
20 boards.insert("Arduino Yún", "arduino:avr:yun");
21 boards.insert("Arduino Mega/2560", "arduino:avr:mega");
22 boards.insert("Arduino Duemilanove/Diecemila", "arduino:avr:diecimila");
23 boards.insert("Arduino Nano", "arduino:avr:nano");
24 boards.insert("Arduino Mega ADK", "arduino:avr:megaADK");
25 boards.insert("Arduino Leonardo", "arduino:avr:leonardo");
26 boards.insert("Arduino Micro", "arduino:avr:micro");
27 boards.insert("Arduino Esplora", "arduino:avr:Esplora");
28 boards.insert("Arduino Mini", "arduino:avr:mini");
29 boards.insert("Arduino Ethernet", "arduino:avr:ethernet");
30 boards.insert("Arduino Fio", "arduino:avr:fio");
31 boards.insert("Arduino BT", "arduino:avr:bt");
32 boards.insert("Lilypad Arduino USB", "arduino:avr:LilyPadUSB");
33 boards.insert("LilyPad Arduino ", "arduino:avr:lilypad");
34 boards.insert("Arduino Pro/Pro Mini", "arduino:avr:pro");
35 boards.insert("Arduino NG or older", "arduino:avr:atmegang");
36 boards.insert("Arduino Robot Control", "arduino:avr:robotControl");
37 boards.insert("Arduino Robot Motor", "arduino:avr:robotMotor");
38 // https://github.com/arduino/Arduino/blob/ide-1.5.x/hardware/arduino/sam/boards.txt
39 boards.insert("Arduino Due (Programming Port)", "arduino:sam:arduino_due_x_dbg");
40 boards.insert("Arduino Due (Native USB Port)", "arduino:sam:arduino_due_x");
41 setBoards(boards);
42
43 setDefaultBoardName("Arduino UNO");
44 }
45
upload(QWidget * source,const QString & port,const QString & board,const QString & fileLocation)46 void PlatformArduino::upload(QWidget *source, const QString &port, const QString &board, const QString &fileLocation)
47 {
48 QProcess * process = new QProcess(this);
49 process->setProcessChannelMode(QProcess::MergedChannels);
50 process->setReadChannel(QProcess::StandardOutput);
51 connect(process, SIGNAL(finished(int, QProcess::ExitStatus)), source, SLOT(programProcessFinished(int, QProcess::ExitStatus)));
52 connect(process, SIGNAL(readyReadStandardOutput()), source, SLOT(programProcessReadyRead()));
53
54 // Make sure .ino is in its own folder with same name (as required by Arduino compiler),
55 // otherwise create a subfolder and copy the file there.
56 QFileInfo fileInfo(fileLocation);
57 QString tmpFilePath = fileInfo.absoluteFilePath();
58 QString dirName = fileInfo.dir().dirName();
59 QString sketchName = fileInfo.baseName();
60 if (dirName.compare(sketchName, Qt::CaseInsensitive) != 0) {
61 QString tmpSketchName(sketchName.append("_TMP"));
62 fileInfo.dir().mkdir(tmpSketchName);
63 tmpFilePath = fileInfo.absolutePath().append("/").append(tmpSketchName).append("/")
64 .append(fileInfo.baseName().append("_TMP.").append(fileInfo.suffix()));
65 if (QFile::exists(tmpFilePath)) QFile::remove(tmpFilePath);
66 QFile::copy(fileInfo.absoluteFilePath(), tmpFilePath);
67 }
68
69 QStringList args;
70 // see https://github.com/arduino/Arduino/blob/ide-1.5.x/build/shared/manpage.adoc
71 //args.append(QString("--verbose"));
72 args.append(QString("--board"));
73 args.append(getBoards().value(board));
74 args.append(QString("--port"));
75 args.append(port);
76 args.append(QString("--upload"));
77 args.append(QDir::toNativeSeparators(tmpFilePath));
78
79 ProgramTab *tab = qobject_cast<ProgramTab *>(source);
80 if (tab)
81 tab->appendToConsole(tr("Running %1 %2").arg(getCommandLocation()).arg(args.join(" ")));
82 process->start(getCommandLocation(), args);
83 }
84