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