almost ready to merge into master
[avrdudequi:avrdudequi.git] / lockbit.cpp
1 #include <QDebug>
2 #include <QHeaderView>
3 #include "lockbit.h"
4
5
6 /*!
7     Gestisce il tab widget lock bit presente nella gui caricata a run-time
8     Oggetti richiesti nella gui:
9
10     - tableLBmode   Un table widget che mostra le impostazioni generali del lock bit
11     - tableBLBmode  Un table widget che mostra le impostazioni del Boot lock bit
12     - tableBLB1mode Un table widget che mostra le impostazioni del Boot lock bit
13
14     Se sono necessari più table widget è necessario modificare il codice
15
16 */
17 LockBit::LockBit(QObject *parent) :
18     QObject(parent), mcuWidget(0), tableLBmode(0),
19     tableBLBmode(0), tableBLB1mode(0), currentLockBitValue(0)
20 {
21 }
22
23
24 LockBit::~LockBit()
25 {
26     qDebug() << "dtor LockBit";
27 }
28
29 /*!
30     ricava tutti i widget necessari tramite findChild, imposta il loro comportamento
31     e realizza le connessioni
32 */
33 void LockBit::widgetInit(QWidget *w)
34 {
35     mcuWidget = w;
36     currentLockBitValue = 0;
37
38     tableLBmode = w->findChild<QTableWidget *>("tableLBmode");
39     if (tableLBmode) {
40         // imposta la modalità di ridimensionamento in base al contenuto
41         QHeaderView *header = tableLBmode->horizontalHeader();
42         header->setResizeMode(QHeaderView::ResizeToContents);
43         header = tableLBmode->verticalHeader();
44         header->setResizeMode(QHeaderView::ResizeToContents);
45
46         // ricava la QStringList di valori
47         LBValues = tableLBmode->property("LBValues").toStringList();
48         // ricava la maschera per LB
49         maskLB = tableLBmode->property("Mask").toString().toUInt(0,16);
50         LBDefault = tableLBmode->property("default").toString().toUInt(0,16);
51         currentLockBitValue += LBDefault;
52         tableLBmode->selectRow(LBValues.indexOf(QString::number(LBDefault,16).prepend("0x")));
53         connect(tableLBmode, SIGNAL(itemSelectionChanged()), this, SLOT(selectionChanged()));
54         QPushButton *btnLB = w->findChild<QPushButton *>("btnLB");
55         connect(btnLB, SIGNAL(clicked()), this, SLOT(resetValue()));
56
57     }
58
59
60     tableBLBmode = w->findChild<QTableWidget *>("tableBLBmode");
61     if (tableBLBmode) {
62         // imposta la modalità di ridimensionamento in base al contenuto
63         QHeaderView *header = tableBLBmode->horizontalHeader();
64         header->setResizeMode(QHeaderView::ResizeToContents);
65         header = tableBLBmode->verticalHeader();
66         header->setResizeMode(QHeaderView::ResizeToContents);
67
68         // ricava la QStringList di valori
69         BLBValues = tableBLBmode->property("LBValues").toStringList();
70         // ricava la maschera per LB
71         maskBLB = tableBLBmode->property("Mask").toString().toUInt(0,16);
72         BLBDefault = tableBLBmode->property("default").toString().toUInt(0,16);
73         currentLockBitValue += BLBDefault;
74         tableBLBmode->selectRow(BLBValues.indexOf(QString::number(BLBDefault,16).prepend("0x")));
75
76         connect(tableBLBmode, SIGNAL(itemSelectionChanged()), this, SLOT(selectionChanged()));
77         QPushButton *btnBLB = w->findChild<QPushButton *>("btnBLB");
78         connect(btnBLB, SIGNAL(clicked()), this, SLOT(resetValue()));
79
80     }
81
82     tableBLB1mode = w->findChild<QTableWidget *>("tableBLB1mode");
83     if (tableBLB1mode) {
84         // imposta la modalità di ridimensionamento in base al contenuto
85         QHeaderView *header = tableBLB1mode->horizontalHeader();
86         header->setResizeMode(QHeaderView::ResizeToContents);
87         header = tableBLB1mode->verticalHeader();
88         header->setResizeMode(QHeaderView::ResizeToContents);
89
90         // ricava la QStringList di valori
91         BLB1Values = tableBLB1mode->property("LBValues").toStringList();
92         // ricava la maschera per LB
93         maskBLB1 = tableBLB1mode->property("Mask").toString().toUInt(0,16);
94
95         BLB1Default = tableBLB1mode->property("default").toString().toUInt(0,16);
96         currentLockBitValue += BLB1Default;
97         tableBLB1mode->selectRow(BLB1Values.indexOf(QString::number(BLB1Default,16).prepend("0x")));
98         connect(tableBLB1mode, SIGNAL(itemSelectionChanged()), this, SLOT(selectionChanged()));
99         QPushButton *btnBLB1 = w->findChild<QPushButton *>("btnBLB1");
100         connect(btnBLB1, SIGNAL(clicked()), this, SLOT(resetValue()));
101
102     }
103 }
104
105 void LockBit::resetValue()
106 {
107     QPushButton *btnReset = qobject_cast<QPushButton *>(sender());
108     if (btnReset->objectName() == "btnLB")
109         tableLBmode->selectRow(LBValues.indexOf(tableLBmode->property("default").toString()));
110     else
111     if (btnReset->objectName() == "btnBLB")
112         tableBLBmode->selectRow(BLBValues.indexOf(tableBLBmode->property("default").toString()));
113     else
114     if (btnReset->objectName() == "btnBLB1")
115         tableBLB1mode->selectRow(BLB1Values.indexOf(tableBLB1mode->property("default").toString()));
116 }
117
118
119 // un solo slot per tutti i QTableWidget
120 void LockBit::selectionChanged()
121 {
122     // tw è il l'oggetto table ricavato dal sender tramite qobject_cast
123     QTableWidget *tw = qobject_cast<QTableWidget *>(sender());
124     // ricava la maschera Mask
125     uint mask = tw->property("Mask").toString().toUInt(0,16);
126     // ricava il valore del lock bit dalla proprietà lista di stringhe
127     uint value = tw->property("LBValues").toStringList().at(tw->currentRow()).toUInt(0, 16);
128     // calcola il lock bit
129     currentLockBitValue = (uchar)currentLockBitValue - (currentLockBitValue & mask) + value;
130 }
131
132
133 void LockBit::setLockBit(uchar lb)
134 {
135     // ricava i valori delle tre coppie di bit, converte ognuno in stringa
136     // cerca questa nella lista di stringhe LBValues se la trova ritorna l'indice
137     // allora l'indice viene usato per selezionare la riga con selectRow.
138     // Se la ricerca non è andata a buon fine indexOf() ritorna -1
139
140     if (lb != currentLockBitValue) {
141
142         if (LBValues.count()) {
143
144             uchar lbvalue = maskLB & lb;
145             QString str_lbvalue = QString::number(lbvalue, 16).prepend("0x");
146             int idx = LBValues.indexOf(str_lbvalue);
147             if (idx != -1)
148                tableLBmode->selectRow(idx);
149
150         }
151
152         if (BLBValues.count()) {
153
154             uchar lbvalue = maskBLB & lb;
155             QString str_lbvalue = QString::number(lbvalue, 16).prepend("0x");
156             int idx = BLBValues.indexOf(str_lbvalue);
157             if (idx != -1)
158                 tableBLBmode->selectRow(idx);
159
160         }
161
162         if (BLB1Values.count()) {
163
164             uchar lbvalue = maskBLB1 & lb;
165             QString str_lbvalue = QString::number(lbvalue, 16).prepend("0x");
166             int idx = BLB1Values.indexOf(str_lbvalue);
167             if (idx != -1)
168                 tableBLB1mode->selectRow(idx);
169
170         }
171     }
172 }