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"
26 #include "progressdialog.h"
27 #include "process_flash.h"
29 #if !defined _MSC_VER && defined __GNUC__
33 burnConfigDialog::burnConfigDialog(QWidget
*parent
) :
35 ui(new Ui::burnConfigDialog
)
38 setWindowIcon(CompanionIcon("configure.png"));
39 ui
->avrdude_programmer
->model()->sort(0);
42 populateProgrammers();
43 Board::Type board
= getCurrentBoard();
44 if (IS_STM32(board
)) {
45 setWindowTitle(tr("DFU-UTIL Configuration"));
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"));
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();
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();
96 ui
->label_dfu2
->hide();
99 QTimer::singleShot(0, this, SLOT(shrink()));
100 connect(this, SIGNAL(accepted()), this, SLOT(putSettings()));
103 burnConfigDialog::~burnConfigDialog()
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();
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";
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();
154 dfuArgs
= g
.dfuArguments().split(" ", QString::SkipEmptyParts
);
155 avrArgs
= g
.avrArguments().split(" ", QString::SkipEmptyParts
);
156 avrProgrammer
= g
.programmer();
157 avrPort
= g
.avrPort();
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
);
180 if (file
.exists(avrLoc
)) {
181 ui
->pushButton_3
->setEnabled(true);
183 ui
->pushButton_3
->setDisabled(true);
187 void burnConfigDialog::putSettings()
189 g
.avrdudeLocation( avrLoc
);
190 g
.programmer( avrProgrammer
);
192 g
.avrPort( avrPort
);
193 g
.avrArguments( avrArgs
.join(" ") );
194 g
.sambaLocation( sambaLoc
);
195 g
.sambaPort( sambaPort
);
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;
214 QString prevline
= "";
215 QTextStream
in(&file
);
219 line
= in
.readLine();
221 if(prevline
.left(10).toLower()=="programmer")
222 items
<< line
.section('"',1,1);
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);
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
);
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
);
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
);
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());
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());
346 void burnConfigDialog::on_advCtrChkB_toggled(bool checked
)
348 Board::Type board
= getCurrentBoard();
350 if (IS_STM32(board
)) {
351 ui
->label_dfu2
->show();
354 else if (IS_SKY9X(board
)) {
355 ui
->label_sb2
->show();
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."),
367 if (IS_STM32(board
)) {
368 ui
->label_dfu2
->hide();
371 else if (IS_SKY9X(board
)) {
372 ui
->label_sb2
->hide();
376 ui
->label_av3
->hide();
377 ui
->avrdude_mcu
->hide();
380 QTimer::singleShot(0, this, SLOT(shrink()));
384 void burnConfigDialog::shrink()