Initial version.
[opentx.git] / companion / src / burnconfigdialog.cpp
blob0fe22be03a97ef8b50b77dc1f0c0dbbdc2d23c1d
1 /*
2 * Copyright (C) OpenTX
4 * Based on code named
5 * th9x - http://code.google.com/p/th9x
6 * er9x - http://code.google.com/p/er9x
7 * gruvin9x - http://code.google.com/p/gruvin9x
9 * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License version 2 as
13 * published by the Free Software Foundation.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
21 #include "burnconfigdialog.h"
22 #include "ui_burnconfigdialog.h"
23 #include "eeprominterface.h"
24 #include "helpers.h"
25 #include "appdata.h"
26 #include "progressdialog.h"
27 #include "process_flash.h"
29 #if !defined _MSC_VER && defined __GNUC__
30 #include <unistd.h>
31 #endif
33 burnConfigDialog::burnConfigDialog(QWidget *parent) :
34 QDialog(parent),
35 ui(new Ui::burnConfigDialog)
37 ui->setupUi(this);
38 setWindowIcon(CompanionIcon("configure.png"));
39 ui->avrdude_programmer->model()->sort(0);
41 getSettings();
42 populateProgrammers();
43 Board::Type board = getCurrentBoard();
44 if (IS_STM32(board)) {
45 setWindowTitle(tr("DFU-UTIL Configuration"));
46 ui->avrArgs->hide();
47 ui->avrdude_location->hide();
48 ui->avrdude_port->hide();
49 ui->avrdude_programmer->hide();
50 ui->label_av1->hide();
51 ui->label_av2->hide();
52 ui->label_av4->hide();
53 ui->label_av5->hide();
54 ui->pushButton->hide();
55 ui->pushButton_3->hide();
56 ui->pushButton_4->hide();
57 ui->label_sb1->hide();
58 ui->label_sb3->hide();
59 ui->samba_location->hide();
60 ui->samba_port->hide();
61 ui->sb_browse->hide();
63 else if (IS_SKY9X(board)) {
64 setWindowTitle(tr("SAM-BA Configuration"));
65 ui->avrArgs->hide();
66 ui->avrdude_location->hide();
67 ui->avrdude_port->hide();
68 ui->avrdude_programmer->hide();
69 ui->label_av1->hide();
70 ui->label_av2->hide();
71 ui->label_av4->hide();
72 ui->label_av5->hide();
73 ui->pushButton->hide();
74 ui->pushButton_3->hide();
75 ui->pushButton_4->hide();
76 ui->label_dfu1->hide();
77 ui->dfu_location->hide();
78 ui->dfu_browse->hide();
80 else {
81 setWindowTitle(tr("AVRDUDE Configuration"));
82 ui->label_sb1->hide();
83 ui->label_sb3->hide();
84 ui->samba_location->hide();
85 ui->samba_port->hide();
86 ui->sb_browse->hide();
87 ui->label_dfu1->hide();
88 ui->label_dfu2->hide();
89 ui->dfu_location->hide();
90 ui->dfu_browse->hide();
92 ui->label_av3->hide();
93 ui->avrdude_mcu->hide();
94 ui->label_sb2->hide();
95 ui->arm_mcu->hide();
96 ui->label_dfu2->hide();
97 ui->dfuArgs->hide();
99 QTimer::singleShot(0, this, SLOT(shrink()));
100 connect(this, SIGNAL(accepted()), this, SLOT(putSettings()));
103 burnConfigDialog::~burnConfigDialog()
105 delete ui;
108 QStringList burnConfigDialog::getAvrdudeArgs()
110 QStringList args = avrArgs;
111 if (!avrPort.isEmpty())
112 args << "-P" << avrPort;
114 #if defined(__APPLE__)
115 args << "-C" << QFileInfo(QApplication::applicationDirPath() + "/../Resources/avrdude.conf").absoluteFilePath();
116 #endif
117 return args;
120 void burnConfigDialog::getSettings()
122 avrLoc = g.avrdudeLocation();
123 sambaLoc = g.sambaLocation();
124 dfuLoc = g.dfuLocation();
126 #if defined WIN32 || !defined __GNUC__
127 if ( avrLoc.isEmpty())
128 avrLoc = QFileInfo("avrdude.exe").absoluteFilePath();
129 if ( sambaLoc.isEmpty())
130 sambaLoc = QFileInfo("sam-ba.exe").absoluteFilePath();
131 if ( dfuLoc.isEmpty())
132 dfuLoc = QFileInfo("dfu-util.exe").absoluteFilePath();
133 #elif defined __APPLE__
134 if ( avrLoc.isEmpty())
135 avrLoc = QFileInfo(QApplication::applicationDirPath() + "/../Resources/avrdude").absoluteFilePath();
136 if ( sambaLoc.isEmpty())
137 sambaLoc = "/usr/local/bin/sam-ba";
138 if ( dfuLoc.isEmpty())
139 dfuLoc = QFileInfo(QApplication::applicationDirPath() + "/../Resources/dfu-util").absoluteFilePath();
140 #elif defined __FreeBSD__
141 if (avrLoc.isEmpty())
142 avrLoc = "/usr/local/bin/avrdude";
143 if (dfuLoc.isEmpty())
144 dfuLoc = "/usr/local/bin/dfu-util";
145 #else
146 if ( avrLoc.isEmpty())
147 avrLoc = "/usr/bin/avrdude";
148 if ( sambaLoc.isEmpty())
149 sambaLoc = "/usr/bin/sam-ba";
150 if ( dfuLoc.isEmpty())
151 dfuLoc = QFileInfo("/usr/bin/dfu-util").absoluteFilePath();
152 #endif
154 dfuArgs = g.dfuArguments().split(" ", QString::SkipEmptyParts);
155 avrArgs = g.avrArguments().split(" ", QString::SkipEmptyParts);
156 avrProgrammer = g.programmer();
157 avrPort = g.avrPort();
158 avrMCU = g.mcu();
159 armMCU = g.armMcu();
160 sambaPort = g.sambaPort();
162 ui->avrdude_location->setText(getAVRDUDE());
163 ui->avrArgs->setText(avrArgs.join(" "));
165 ui->samba_location->setText(getSAMBA());
166 ui->samba_port->setText(getSambaPort());
168 ui->dfu_location->setText(getDFU());
169 ui->dfuArgs->setText(getDFUArgs().join(" "));
171 int idx1 = ui->avrdude_programmer->findText(getProgrammer());
172 int idx2 = ui->avrdude_port->findText(getPort());
173 int idx3 = ui->avrdude_mcu->findText(getMCU());
174 int idx4 = ui->arm_mcu->findText(getArmMCU());
175 if(idx1>=0) ui->avrdude_programmer->setCurrentIndex(idx1);
176 if(idx2>=0) ui->avrdude_port->setCurrentIndex(idx2);
177 if(idx3>=0) ui->avrdude_mcu->setCurrentIndex(idx3);
178 if(idx4>=0) ui->arm_mcu->setCurrentIndex(idx4);
179 QFile file;
180 if (file.exists(avrLoc)) {
181 ui->pushButton_3->setEnabled(true);
182 } else {
183 ui->pushButton_3->setDisabled(true);
187 void burnConfigDialog::putSettings()
189 g.avrdudeLocation( avrLoc );
190 g.programmer( avrProgrammer);
191 g.mcu( avrMCU );
192 g.avrPort( avrPort );
193 g.avrArguments( avrArgs.join(" ") );
194 g.sambaLocation( sambaLoc );
195 g.sambaPort( sambaPort );
196 g.armMcu( armMCU );
197 g.dfuLocation( dfuLoc );
198 g.dfuArguments( dfuArgs.join(" ") );
201 void burnConfigDialog::populateProgrammers()
203 QString fileName = QFileInfo(avrLoc).canonicalPath() + "/avrdude.conf"; //for windows
204 if(!QFileInfo(fileName).exists()) fileName = "/etc/avrdude.conf"; //for linux
205 if(!QFileInfo(fileName).exists()) fileName = "/etc/avrdude/avrdude.conf"; //for linux
206 if(!QFileInfo(fileName).exists()) return; // not found avrdude.conf - returning
208 QFile file(fileName);
210 if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) return;
212 QStringList items;
213 QString line = "";
214 QString prevline = "";
215 QTextStream in(&file);
216 while (!in.atEnd())
218 prevline = line;
219 line = in.readLine();
221 if(prevline.left(10).toLower()=="programmer")
222 items << line.section('"',1,1);
224 file.close();
226 items.sort();
228 QString avrProgrammer_temp = avrProgrammer;
229 ui->avrdude_programmer->clear();
230 ui->avrdude_programmer->addItems(items);
231 int idx1 = ui->avrdude_programmer->findText(avrProgrammer_temp);
232 if(idx1>=0) ui->avrdude_programmer->setCurrentIndex(idx1);
235 void burnConfigDialog::on_avrdude_programmer_currentIndexChanged(QString )
237 avrProgrammer = ui->avrdude_programmer->currentText();
240 void burnConfigDialog::on_avrdude_mcu_currentIndexChanged(QString )
242 avrMCU = ui->avrdude_mcu->currentText();
245 void burnConfigDialog::on_avrdude_location_editingFinished()
247 avrLoc = ui->avrdude_location->text();
248 if (avrLoc.isEmpty()) {
249 ui->pushButton_3->setDisabled(true);
250 } else {
251 QFile file;
252 if (file.exists(avrLoc)) {
253 ui->pushButton_3->setEnabled(true);
258 void burnConfigDialog::on_avrArgs_editingFinished()
260 avrArgs = ui->avrArgs->text().split(" ", QString::SkipEmptyParts);
263 void burnConfigDialog::on_avrdude_port_currentIndexChanged(QString )
265 avrPort = ui->avrdude_port->currentText();
268 void burnConfigDialog::on_samba_location_editingFinished()
270 sambaLoc = ui->samba_location->text();
273 void burnConfigDialog::on_samba_port_editingFinished()
275 sambaPort = ui->samba_port->text();
278 void burnConfigDialog::on_arm_mcu_currentIndexChanged(QString )
280 armMCU = ui->arm_mcu->currentText();
283 void burnConfigDialog::on_pushButton_clicked()
285 QString fileName = QFileDialog::getOpenFileName(this, tr("Select Location"),ui->avrdude_location->text());
287 if(!fileName.isEmpty())
289 ui->avrdude_location->setText(fileName);
290 avrLoc = fileName;
294 void burnConfigDialog::on_sb_browse_clicked()
296 QString fileName = QFileDialog::getOpenFileName(this, tr("Select Location"),ui->samba_location->text());
297 if(!fileName.isEmpty())
299 ui->samba_location->setText(fileName);
300 sambaLoc = fileName;
304 void burnConfigDialog::on_dfu_browse_clicked()
306 QString fileName = QFileDialog::getOpenFileName(this, tr("Select Location"),ui->dfu_location->text());
308 if(!fileName.isEmpty())
310 ui->dfu_location->setText(fileName);
311 dfuLoc = fileName;
315 void burnConfigDialog::on_dfu_location_editingFinished()
317 dfuLoc = ui->dfu_location->text();
320 void burnConfigDialog::on_dfuArgs_editingFinished()
322 dfuArgs = ui->dfuArgs->text().split(" ", QString::SkipEmptyParts);
325 void burnConfigDialog::listAvrdudeProgrammers()
327 ProgressDialog progressDialog(this, tr("List available programmers"), CompanionIcon("list.png"), true);
328 FlashProcess flashProcess(ui->avrdude_location->text(), QStringList() << "-c?", progressDialog.progress());
329 flashProcess.run();
332 // TODO choose better name when no merge in progress....
333 void burnConfigDialog::on_pushButton_3_clicked()
335 listAvrdudeProgrammers();
338 // TODO choose better name when no merge in progress....
339 void burnConfigDialog::on_pushButton_4_clicked()
341 ProgressDialog progressDialog(this, tr("Avrdude help"), CompanionIcon("configure.png"), true);
342 FlashProcess flashProcess(ui->avrdude_location->text(), QStringList() << "-?", progressDialog.progress());
343 flashProcess.run();
346 void burnConfigDialog::on_advCtrChkB_toggled(bool checked)
348 Board::Type board = getCurrentBoard();
349 if (checked) {
350 if (IS_STM32(board)) {
351 ui->label_dfu2->show();
352 ui->dfuArgs->show();
354 else if (IS_SKY9X(board)) {
355 ui->label_sb2->show();
356 ui->arm_mcu->show();
358 else {
359 ui->label_av3->show();
360 ui->avrdude_mcu->show();
361 QMessageBox::warning(this, CPN_STR_APP_NAME,
362 tr("<b><u>WARNING!</u></b><br>Normally CPU type is automatically selected according to the chosen firmware.<br>If you change the CPU type the resulting eeprom could be inconsistent."),
363 QMessageBox::Ok);
366 else {
367 if (IS_STM32(board)) {
368 ui->label_dfu2->hide();
369 ui->dfuArgs->hide();
371 else if (IS_SKY9X(board)) {
372 ui->label_sb2->hide();
373 ui->arm_mcu->hide();
375 else {
376 ui->label_av3->hide();
377 ui->avrdude_mcu->hide();
380 QTimer::singleShot(0, this, SLOT(shrink()));
384 void burnConfigDialog::shrink()
386 resize(0, 0);