13
13
#include < QStringList>
14
14
#include < memory>
15
15
16
- #define ROW_DATA_SIZE 16
17
- #define HEADER_ROW_NUM 1
18
-
19
- #define HEADER_ROW 0
20
- #define HEADER_ADDRESS_COL 0
21
- #define HEADER_HEX_COL 1
22
- #define HEADER_ANCII_COL 2
23
-
24
16
#define HEADER_ADDRESS_WIDTH 80
25
17
#define HEADER_HEX_WIDTH 340
18
+ #define BUFFER_ROW_HEIGHT 20
26
19
27
20
#define START_ADDRESS 0x00000000
28
21
29
- static void initBufferTable (QTableWidget *bufTable)
30
- {
31
- QTableWidgetItem *addressHeaderItem, *hexHeaderItem, *anciiHeaderItem;
32
-
33
- addressHeaderItem = new QTableWidgetItem (QObject::tr (" ADDRESS" ));
34
- bufTable->setColumnWidth (HEADER_ADDRESS_COL, HEADER_ADDRESS_WIDTH);
35
- bufTable->setItem (HEADER_ROW, HEADER_ADDRESS_COL, addressHeaderItem);
36
- addressHeaderItem->setTextAlignment (Qt::AlignCenter);
37
-
38
- hexHeaderItem = new QTableWidgetItem (QObject::tr (" HEX" ));
39
- bufTable->setColumnWidth (HEADER_HEX_COL, HEADER_HEX_WIDTH);
40
- bufTable->setItem (HEADER_ROW, HEADER_HEX_COL, hexHeaderItem);
41
- hexHeaderItem->setTextAlignment (Qt::AlignCenter);
42
-
43
- anciiHeaderItem = new QTableWidgetItem (QObject::tr (" ANCII" ));
44
- bufTable->horizontalHeader ()->setStretchLastSection (true );
45
- bufTable->setItem (HEADER_ROW, HEADER_ANCII_COL, anciiHeaderItem);
46
- anciiHeaderItem->setTextAlignment (Qt::AlignCenter);
47
- }
48
-
49
22
static void addChipDB (QComboBox *chipSelectComboBox)
50
23
{
51
24
ChipInfo *db;
@@ -55,6 +28,27 @@ static void addChipDB(QComboBox *chipSelectComboBox)
55
28
chipSelectComboBox->addItem (db[i].name );
56
29
}
57
30
31
+ void MainWindow::initBufTable ()
32
+ {
33
+ buffer = nullptr ;
34
+ bufferSize = 0 ;
35
+
36
+ ui->bufferTableView ->setModel (&bufferTableModel);
37
+ QHeaderView *verticalHeader = ui->bufferTableView ->verticalHeader ();
38
+ verticalHeader->setSectionResizeMode (QHeaderView::Fixed);
39
+ verticalHeader->setDefaultSectionSize (BUFFER_ROW_HEIGHT);
40
+ ui->bufferTableView ->setColumnWidth (HEADER_ADDRESS_COL,
41
+ HEADER_ADDRESS_WIDTH);
42
+ ui->bufferTableView ->setColumnWidth (HEADER_HEX_COL, HEADER_HEX_WIDTH);
43
+ }
44
+
45
+ void MainWindow::resetBufTable ()
46
+ {
47
+ bufferTableModel.setBuffer (nullptr , 0 );
48
+ bufferSize = 0 ;
49
+ delete buffer;
50
+ }
51
+
58
52
MainWindow::MainWindow (QWidget *parent) : QMainWindow(parent),
59
53
ui(new Ui::MainWindow)
60
54
{
@@ -64,7 +58,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent),
64
58
65
59
logger->setTextEdit (ui->logTextEdit );
66
60
67
- initBufferTable (ui-> bufferTableWidget );
61
+ initBufTable ( );
68
62
69
63
prog = new Programmer (this );
70
64
@@ -88,35 +82,14 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent),
88
82
89
83
MainWindow::~MainWindow ()
90
84
{
85
+ delete buffer;
91
86
Logger::putInstance ();
92
87
delete ui;
93
88
}
94
89
95
- void MainWindow::insertBufferRow (quint8 *readBuf, quint32 size, quint32 rowNum,
96
- quint32 address)
97
- {
98
- QString addressString, hexString;
99
-
100
- ui->bufferTableWidget ->insertRow (rowNum);
101
-
102
- for (uint32_t i = 0 ; i < size; i++)
103
- hexString.append (QString ().sprintf (" %02X " , readBuf[i]));
104
-
105
- addressString.sprintf (" 0x%08X" , address);
106
-
107
- ui->bufferTableWidget ->setItem (rowNum, HEADER_ADDRESS_COL,
108
- new QTableWidgetItem (addressString));
109
- ui->bufferTableWidget ->setItem (rowNum, HEADER_HEX_COL,
110
- new QTableWidgetItem (hexString));
111
- ui->bufferTableWidget ->setItem (rowNum, HEADER_ANCII_COL,
112
- new QTableWidgetItem (" ................" ));
113
- }
114
-
115
90
void MainWindow::slotFileOpen ()
116
91
{
117
- qint64 ret;
118
- quint8 readBuf[ROW_DATA_SIZE] = {};
119
- quint32 rowNum = HEADER_ROW_NUM, address = START_ADDRESS;
92
+ qint64 ret, fileSize;
120
93
QString fileName = QFileDialog::getOpenFileName (this , tr (" Open File" ), " ." ,
121
94
tr (" Binary Files (*)" ));
122
95
@@ -131,22 +104,33 @@ void MainWindow::slotFileOpen()
131
104
return ;
132
105
}
133
106
134
- /* Reset buffer table */
135
- ui-> bufferTableWidget -> setRowCount (HEADER_ROW_NUM );
136
-
137
- while ((ret = file. read (( char *)readBuf, ROW_DATA_SIZE)) > 0 )
107
+ resetBufTable ();
108
+ fileSize = file. size ( );
109
+ buffer = new (std::nothrow) uint8_t [fileSize];
110
+ if (!buffer )
138
111
{
139
- insertBufferRow (readBuf, ret, rowNum, address);
140
- address += ret;
141
- rowNum++;
112
+ qCritical () << " Failed to allocate memory for read buffer" ;
113
+ goto Exit;
142
114
}
143
115
116
+ ret = file.read ((char *)buffer, fileSize);
144
117
if (ret < 0 )
145
118
{
146
119
qCritical () << " Failed to read file:" << fileName << " , error:" <<
147
120
file.errorString ();
121
+ goto Exit;
122
+ }
123
+
124
+ if (ret != fileSize)
125
+ {
126
+ qCritical () << " File was partially read, length" << ret;
127
+ goto Exit;
148
128
}
149
129
130
+ bufferSize = fileSize;
131
+ bufferTableModel.setBuffer (buffer, fileSize);
132
+
133
+ Exit:
150
134
file.close ();
151
135
}
152
136
@@ -200,89 +184,54 @@ void MainWindow::slotProgErase()
200
184
201
185
void MainWindow::readChipCb (int status)
202
186
{
203
- uint32_t rowNum = HEADER_ROW_NUM, address = START_ADDRESS;
187
+ QByteArray ba = ui->chipSelectComboBox ->currentText ().toLatin1 ();
188
+ ChipInfo *chipInfo = getChipInfoByName (ba.data ());
189
+ uint32_t readSize = chipInfo->size ;
204
190
205
- if (! status)
191
+ if (status)
206
192
{
207
- qInfo () << " Data has been successfully read" ;
208
-
209
- /* Reset buffer table */
210
- ui->bufferTableWidget ->setRowCount (HEADER_ROW_NUM);
211
-
212
- for (uint32_t i = 0 ; i < readBufSize; i += ROW_DATA_SIZE)
213
- {
214
- insertBufferRow (readBuf + i, ROW_DATA_SIZE, rowNum, address);
215
- rowNum++;
216
- address += ROW_DATA_SIZE;
217
- }
193
+ delete buffer;
194
+ return ;
218
195
}
219
196
220
- delete readBuf;
197
+ qInfo () << " Data has been successfully read" ;
198
+ bufferTableModel.setBuffer (buffer, readSize);
221
199
}
222
200
223
201
void MainWindow::slotProgRead ()
224
202
{
225
203
QByteArray ba = ui->chipSelectComboBox ->currentText ().toLatin1 ();
226
204
ChipInfo *chipInfo = getChipInfoByName (ba.data ());
205
+ uint32_t readSize = chipInfo->size ;
227
206
228
- readBufSize = chipInfo-> size ;
229
- readBuf = new (std::nothrow) uint8_t [readBufSize ];
230
- if (!readBuf )
207
+ resetBufTable () ;
208
+ buffer = new (std::nothrow) uint8_t [readSize ];
209
+ if (!buffer )
231
210
{
232
211
qCritical () << " Failed to allocate memory for read buffer" ;
233
212
return ;
234
213
}
235
214
236
215
prog->readChip (std::bind (&MainWindow::readChipCb, this ,
237
- std::placeholders::_1), readBuf , START_ADDRESS, readBufSize );
216
+ std::placeholders::_1), buffer , START_ADDRESS, readSize );
238
217
}
239
218
240
219
void MainWindow::writeChipCb (int status)
241
220
{
242
221
if (!status)
243
222
qInfo () << " Data has been successfully written" ;
244
- delete writeBuf;
245
223
}
246
224
247
225
void MainWindow::slotProgWrite ()
248
226
{
249
- bool convIsOk;
250
- QStringList sl;
251
- uint32_t bufSize, bufIter = 0 ;
252
- uint32_t rowCount = ui->bufferTableWidget ->rowCount () - HEADER_ROW_NUM;
253
-
254
- if (!rowCount)
255
- {
256
- qInfo () << " Buffer is empty" ;
257
- return ;
258
- }
259
-
260
- bufSize = rowCount * ROW_DATA_SIZE;
261
- writeBuf = new (std::nothrow) uint8_t [bufSize];
262
- if (!writeBuf)
227
+ if (!bufferSize)
263
228
{
264
- qCritical () << " Failed to allocate memory for write buffer " ;
229
+ qInfo () << " Write buffer is empty " ;
265
230
return ;
266
231
}
267
232
268
- for (uint32_t i = HEADER_ROW_NUM; i <= rowCount; i++)
269
- {
270
- sl = ui->bufferTableWidget ->item (i, HEADER_HEX_COL)->
271
- text ().split (QChar (' ' ), QString::SkipEmptyParts);
272
-
273
- for (int j = 0 ; j < sl.size (); j++)
274
- {
275
- writeBuf[bufIter++] = sl.at (j).toUInt (&convIsOk, 16 );
276
- if (!convIsOk)
277
- {
278
- qCritical () << " Failed to convert row item to byte" ;
279
- return ;
280
- }
281
- }
282
- }
283
-
284
233
prog->writeChip (std::bind (&MainWindow::writeChipCb, this ,
285
- std::placeholders::_1), writeBuf , START_ADDRESS, bufIter );
234
+ std::placeholders::_1), buffer , START_ADDRESS, bufferSize );
286
235
}
287
236
288
237
void MainWindow::selectChipCb ()
0 commit comments