almost ready to merge into master
[avrdudequi:avrdudequi.git] / mcu.cpp
1 /***************************************************************************
2  *   Copyright (C) 2011 by Maurilio                                        *
3  *   mau_ri_tec@yahoo.it                                                   *
4  *                                                                         *
5  *   This program is free software; you can redistribute it and/or modify  *
6  *   it under the terms of the GNU General Public License as published by  *
7  *   the Free Software Foundation; either version 2 of the License, or     *
8  *   (at your option) any later version.                                   *
9  *                                                                         *
10  *   This program is distributed in the hope that it will be useful,       *
11  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
12  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
13  *   GNU General Public License for more details.                          *
14  *                                                                         *
15  *   You should have received a copy of the GNU General Public License     *
16  *   along with this program; if not, write to the                         *
17  *   Free Software Foundation, Inc.,                                       *
18  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
19  ***************************************************************************/
20
21 #include "mcu.h"
22 #include "global.h"
23 #include <QDir>
24 #include <math.h>
25 Mcu *Mcu::m_instance = 0;
26
27 Mcu::Mcu() :
28     QObject(0)
29 {
30     uiLoader = new QUiLoader;
31     thereIsMcuWidget = false;
32     resetPointer();
33 }
34
35 Mcu::~Mcu()
36 {
37
38 }
39
40 void Mcu::resetPointer()
41 {
42     tabWidget = NULL;
43
44     gBoxLFuse = gBoxHFuse = gBoxEFuse = NULL;
45     lockBit = NULL;
46     eepromSize = 0;
47 }
48
49 void Mcu::setLockBit(QMap<QString, QString> & lb)
50 {
51     uchar value = (uchar)lb.value("lockBit").toUInt(0,16);
52     lockBit->setLockBit(value);
53 }
54
55
56 void Mcu::fillMcu(QComboBox *cBoxMcu)
57 {
58     _cBoxMcu = cBoxMcu;
59     QDir programmer_dir(AvrDudeQuiPath::microcontrollers());
60     QStringList xmlFileNames = programmer_dir.entryList(QStringList("*.ui"),
61                                                        QDir::Files);
62     for (int i=0; i<xmlFileNames.size(); i++) {
63         QString item = xmlFileNames.at(i);
64         //qDebug() << item;
65         if (item != "mcuempty.ui")
66             _cBoxMcu->addItem(item.remove(".ui"));
67     }
68     connect(_cBoxMcu, SIGNAL(currentIndexChanged(int)), this, SLOT(change(int)));
69 }
70
71 void Mcu::loadEmptyWidget()
72 {
73     QString uiFile = AvrDudeQuiPath::microcontrollers()
74             + "/"+ "mcuempty.ui";
75
76     QFile file(uiFile);
77     file.open(QFile::ReadOnly);
78     uiLoader = new QUiLoader;
79     mcuWidget = uiLoader->load(&file);
80     file.close();
81     thereIsMcuWidget = true;
82     emit currentWidgetChanged(mcuWidget);
83
84 }
85
86
87 void Mcu::change(int idx)
88 {
89     if (_cBoxMcu->currentIndex() < 1) {
90         delete uiLoader;
91         delete mcuWidget;
92         //thereIsMcuWidget = false;
93         resetPointer();
94         loadEmptyWidget();
95
96         return;
97     }
98     if (thereIsMcuWidget) {
99         qDebug() << "delete uiLoader e mcuWidget";
100         delete uiLoader;
101         delete mcuWidget;
102         thereIsMcuWidget = false;
103         resetPointer();
104     }
105     QString uiFile = AvrDudeQuiPath::microcontrollers()
106             + "/"+ _cBoxMcu->currentText() + ".ui";
107
108     QFile file(uiFile);
109     file.open(QFile::ReadOnly);
110     uiLoader = new QUiLoader;
111     mcuWidget = uiLoader->load(&file);
112     file.close();
113     thereIsMcuWidget = true;
114
115     fuseByte = new FuseByte(this);
116     fuseByte->widgetInit(mcuWidget);
117
118     lockBit = new LockBit(this);
119     lockBit->widgetInit(mcuWidget);
120
121     backEnd = mcuWidget->property("backend").toString();
122
123
124     emit currentWidgetChanged(mcuWidget);
125 }
126
127 void Mcu::setFuses(QMap<QString, QString> &fuses)
128 {
129     fuseByte->setFuseValue(fuses);
130
131 }
132
133 void Mcu::setLFWidget()
134 {
135     for (int i=0; i< lowFuses.size(); i++) {
136         QString str_idx = QString::number(i);
137
138         QCheckBox *ckfuse = gBoxLFuse->findChild<QCheckBox *>("checkLF" + str_idx);
139         if (!ckfuse)
140             return;
141
142         //qDebug() << "checkfuse name =" << ckfuse->objectName() << (uint)!lowFuses.testBit(i);
143         //ckfuse->blockSignals(true);
144         ckfuse->setChecked(!lowFuses.testBit(i));
145         //ckfuse->blockSignals(false);
146     }
147
148 }
149
150 void Mcu::cBoxLowFuseIndexChanged(int idx)
151 {
152     // ricava il valore del fuse byte dalla lista di stringhe LFValues a idx corrente
153     uint value = cBoxLowFuse->property("LFValues").toStringList().at(idx).toUInt(0,16);
154     uint currLFuse = (uchar)lowFuses.toUint();
155
156     uint finalLfuse = currLFuse - (currLFuse & cBoxLFuseMask)  + value;
157     lowFuses.setValue(finalLfuse);
158
159     setLFWidget();
160 }
161
162 void Mcu::setHFWidget()
163 {
164     for (int i=0; i< highFuses.size(); i++) {
165         QString str_idx = QString::number(i);
166
167         QCheckBox *ckfuse = gBoxHFuse->findChild<QCheckBox *>("checkHF" + str_idx);
168         if (!ckfuse)
169             return;
170         //qDebug() << "checkfuse name =" << ckfuse->objectName() << (uint)!highFuses.testBit(i);
171         //ckfuse->blockSignals(true);
172         ckfuse->setChecked(!highFuses.testBit(i));
173         //ckfuse->blockSignals(false);
174
175     }
176 }
177
178 void Mcu::cBoxHighFuseIndexChanged(int idx)
179 {
180     uint value = cBoxHighFuse->property("HFValues").toStringList().at(idx).toUInt(0,16);
181     uint currHFuse = (uchar)highFuses.toUint();
182
183     uint finalHfuse = currHFuse - (currHFuse & cBoxHFuseMask)  + value;
184     highFuses.setValue(finalHfuse);
185
186     setHFWidget();
187
188 }
189
190 void Mcu::setEFWidget()
191 {
192     for (int i=0; i< extendedFuses.size(); i++) {
193         QString str_idx = QString::number(i);
194
195         QCheckBox *ckfuse = gBoxEFuse->findChild<QCheckBox *>("checkEF" + str_idx);
196         if (!ckfuse)
197             return;
198
199         //ckfuse->blockSignals(true);
200         ckfuse->setChecked(!extendedFuses.testBit(i));
201         //ckfuse->blockSignals(false);
202
203     }
204 }
205
206 void Mcu::cBoxExtendedFuseIndexChanged(int idx)
207 {
208
209     uint value = cBoxExtendedFuse->property("EFValues").toStringList().at(idx).toUInt(0,16);
210     uint currEFuse = (uchar)extendedFuses.toUint();
211
212     uint finalEfuse = currEFuse - (currEFuse & cBoxEFuseMask)  + value;
213     extendedFuses.setValue(finalEfuse);
214
215     setEFWidget();
216
217 }
218
219 void Mcu::gBoxLFuseContentsChanged(bool ck)
220 {
221     uint bit = sender()->property("bit").toUInt();
222     lowFuses.setBit(bit-1, !ck);
223
224     if (cBoxLowFuse) {
225         QStringList values = cBoxLowFuse->property("LFValues").toStringList();
226         uint currLFuse = lowFuses.toUint();
227
228         uint value = currLFuse & cBoxLFuseMask;
229
230         cBoxLowFuse->blockSignals(true);
231
232         int idx = values.indexOf(MtFuseArray::toHex(value));
233         if (idx < 0)
234             idx = 0;
235         cBoxLowFuse->setCurrentIndex(idx);
236         cBoxLowFuse->blockSignals(false);
237     }
238 }
239
240 void Mcu::gBoxHFuseContentsChanged(bool ck)
241 {
242
243     uint bit = sender()->property("bit").toUInt();
244     highFuses.setBit(bit-1, !ck);
245
246     if (cBoxHighFuse) {
247         QStringList values = cBoxHighFuse->property("HFValues").toStringList();
248         uint currHFuse = highFuses.toUint();
249
250         uint value = currHFuse & cBoxHFuseMask;
251
252         cBoxHighFuse->blockSignals(true);
253
254         int idx = values.indexOf(MtFuseArray::toHex(value));
255         if (idx < 0)
256             idx = 0;
257         cBoxHighFuse->setCurrentIndex(idx);
258         cBoxHighFuse->blockSignals(false);
259     }
260
261 }
262
263 void Mcu::gBoxEFuseContentsChanged(bool ck)
264 {
265
266     uint bit = sender()->property("bit").toUInt();
267     extendedFuses.setBit(bit-1, !ck);
268
269     if (cBoxExtendedFuse) {
270         QStringList values = cBoxExtendedFuse->property("EFValues").toStringList();
271         uint currEFuse = extendedFuses.toUint();
272
273         uint value = currEFuse & cBoxEFuseMask;
274
275         cBoxExtendedFuse->blockSignals(true);
276
277
278         int idx = values.indexOf(MtFuseArray::toHex(value));
279         if (idx < 0)
280             idx = 0;
281         cBoxExtendedFuse->setCurrentIndex(idx);
282         cBoxExtendedFuse->blockSignals(false);
283     }
284     //qDebug() << "current extended fuse =" << MtFuseArray::toHex(extendedFuses.toUint());
285 }
286
287 QString Mcu::getMcu()
288 {
289     if (thereIsMcuWidget) {
290         QString avrdude_mcu = mcuWidget->property("avrdude_mcu").toString();
291         return avrdude_mcu;
292     } else {
293         return QString();
294     }
295
296 }
297
298 QList<QMap<QString, QString> > Mcu::getAllFuse()
299 {
300     return fuseByte->getAllFuses();
301 }
302
303 QString Mcu::readAllFuse()
304 {
305     QString allFuse;
306
307     if (nBitLowFuse)
308         allFuse = "-U " + backend_arg_low + ":r:-:h";
309     if (nBitHighFuse)
310             allFuse += " -U " + backend_arg_high + ":r:-:h";
311     if (nBitExtendedFuse)
312             allFuse += " -U " + backend_arg_extended + ":r:-:h";
313     return allFuse;
314 }
315
316
317