Skip to content

Commit 2fe893f

Browse files
committed
qt: replaced regular buffer table to model-view
1 parent f088186 commit 2fe893f

File tree

6 files changed

+189
-171
lines changed

6 files changed

+189
-171
lines changed

qt/buffer_table_model.cpp

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
/* Copyright (C) 2017 Bogdan Bogush <[email protected]>
2+
* This program is free software; you can redistribute it and/or modify
3+
* it under the terms of the GNU General Public License version 3.
4+
*/
5+
6+
#include "buffer_table_model.h"
7+
8+
BufferTableModel::BufferTableModel(QObject *parent):
9+
QAbstractTableModel(parent)
10+
{
11+
buf = nullptr;
12+
bufSize = 0;
13+
}
14+
15+
int BufferTableModel::rowCount(const QModelIndex & /*parent*/) const
16+
{
17+
return (bufSize + ROW_DATA_SIZE - 1) / ROW_DATA_SIZE;
18+
}
19+
20+
int BufferTableModel::columnCount(const QModelIndex & /*parent*/) const
21+
{
22+
return 3;
23+
}
24+
25+
QVariant BufferTableModel::data(const QModelIndex &index, int role) const
26+
{
27+
if (role == Qt::DisplayRole)
28+
{
29+
switch (index.column())
30+
{
31+
case HEADER_ADDRESS_COL:
32+
return QString("%1").arg(index.row() * ROW_DATA_SIZE, 8, 16,
33+
QChar('0'));
34+
break;
35+
case HEADER_HEX_COL:
36+
{
37+
QString hexString;
38+
uint32_t start = index.row() * ROW_DATA_SIZE,
39+
end = start + ROW_DATA_SIZE;
40+
41+
for (uint32_t i = start; i < end && i < bufSize; i++)
42+
hexString.append(QString("%1 ").arg(buf[i], 2, 16, QChar('0')));
43+
return hexString;
44+
}
45+
case HEADER_ANCII_COL:
46+
return QString("................");
47+
}
48+
}
49+
50+
return QVariant();
51+
}
52+
53+
QVariant BufferTableModel::headerData(int section, Qt::Orientation orientation,
54+
int role) const
55+
{
56+
if (role == Qt::DisplayRole)
57+
{
58+
if (orientation == Qt::Horizontal)
59+
{
60+
switch (section)
61+
{
62+
case HEADER_ADDRESS_COL:
63+
return QString("ADDRESS");
64+
case HEADER_HEX_COL:
65+
return QString("HEX");
66+
case HEADER_ANCII_COL:
67+
return QString("ANCII");
68+
}
69+
}
70+
}
71+
72+
return QVariant();
73+
}
74+
75+
void BufferTableModel::setBuffer(uint8_t *buffer, uint32_t size)
76+
{
77+
beginResetModel();
78+
buf = buffer;
79+
bufSize = size;
80+
endResetModel();
81+
}

qt/buffer_table_model.h

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/* Copyright (C) 2017 Bogdan Bogush <[email protected]>
2+
* This program is free software; you can redistribute it and/or modify
3+
* it under the terms of the GNU General Public License version 3.
4+
*/
5+
6+
#ifndef BUFFER_TABLE_MODEL_H
7+
#define BUFFER_TABLE_MODEL_H
8+
9+
#include <QAbstractTableModel>
10+
11+
#define HEADER_ADDRESS_COL 0
12+
#define HEADER_HEX_COL 1
13+
#define HEADER_ANCII_COL 2
14+
15+
#define ROW_DATA_SIZE 16
16+
17+
class BufferTableModel: public QAbstractTableModel
18+
{
19+
Q_OBJECT
20+
21+
uint8_t *buf;
22+
uint32_t bufSize;
23+
24+
public:
25+
BufferTableModel(QObject *parent = 0);
26+
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
27+
int columnCount(const QModelIndex &parent = QModelIndex()) const
28+
override;
29+
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole)
30+
const override;
31+
QVariant headerData(int section, Qt::Orientation orientation, int role)
32+
const override;
33+
void setBuffer(uint8_t *buffer, uint32_t size);
34+
};
35+
36+
#endif // BUFFER_TABLE_MODEL_H

qt/main_window.cpp

Lines changed: 59 additions & 110 deletions
Original file line numberDiff line numberDiff line change
@@ -13,39 +13,12 @@
1313
#include <QStringList>
1414
#include <memory>
1515

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-
2416
#define HEADER_ADDRESS_WIDTH 80
2517
#define HEADER_HEX_WIDTH 340
18+
#define BUFFER_ROW_HEIGHT 20
2619

2720
#define START_ADDRESS 0x00000000
2821

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-
4922
static void addChipDB(QComboBox *chipSelectComboBox)
5023
{
5124
ChipInfo *db;
@@ -55,6 +28,27 @@ static void addChipDB(QComboBox *chipSelectComboBox)
5528
chipSelectComboBox->addItem(db[i].name);
5629
}
5730

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+
5852
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent),
5953
ui(new Ui::MainWindow)
6054
{
@@ -64,7 +58,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent),
6458

6559
logger->setTextEdit(ui->logTextEdit);
6660

67-
initBufferTable(ui->bufferTableWidget);
61+
initBufTable();
6862

6963
prog = new Programmer(this);
7064

@@ -88,35 +82,14 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent),
8882

8983
MainWindow::~MainWindow()
9084
{
85+
delete buffer;
9186
Logger::putInstance();
9287
delete ui;
9388
}
9489

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-
11590
void MainWindow::slotFileOpen()
11691
{
117-
qint64 ret;
118-
quint8 readBuf[ROW_DATA_SIZE] = {};
119-
quint32 rowNum = HEADER_ROW_NUM, address = START_ADDRESS;
92+
qint64 ret, fileSize;
12093
QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), ".",
12194
tr("Binary Files (*)"));
12295

@@ -131,22 +104,33 @@ void MainWindow::slotFileOpen()
131104
return;
132105
}
133106

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)
138111
{
139-
insertBufferRow(readBuf, ret, rowNum, address);
140-
address += ret;
141-
rowNum++;
112+
qCritical() << "Failed to allocate memory for read buffer";
113+
goto Exit;
142114
}
143115

116+
ret = file.read((char *)buffer, fileSize);
144117
if (ret < 0)
145118
{
146119
qCritical() << "Failed to read file:" << fileName << ", error:" <<
147120
file.errorString();
121+
goto Exit;
122+
}
123+
124+
if (ret != fileSize)
125+
{
126+
qCritical() << "File was partially read, length" << ret;
127+
goto Exit;
148128
}
149129

130+
bufferSize = fileSize;
131+
bufferTableModel.setBuffer(buffer, fileSize);
132+
133+
Exit:
150134
file.close();
151135
}
152136

@@ -200,89 +184,54 @@ void MainWindow::slotProgErase()
200184

201185
void MainWindow::readChipCb(int status)
202186
{
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;
204190

205-
if (!status)
191+
if (status)
206192
{
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;
218195
}
219196

220-
delete readBuf;
197+
qInfo() << "Data has been successfully read";
198+
bufferTableModel.setBuffer(buffer, readSize);
221199
}
222200

223201
void MainWindow::slotProgRead()
224202
{
225203
QByteArray ba = ui->chipSelectComboBox->currentText().toLatin1();
226204
ChipInfo *chipInfo = getChipInfoByName(ba.data());
205+
uint32_t readSize = chipInfo->size;
227206

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)
231210
{
232211
qCritical() << "Failed to allocate memory for read buffer";
233212
return;
234213
}
235214

236215
prog->readChip(std::bind(&MainWindow::readChipCb, this,
237-
std::placeholders::_1), readBuf, START_ADDRESS, readBufSize);
216+
std::placeholders::_1), buffer, START_ADDRESS, readSize);
238217
}
239218

240219
void MainWindow::writeChipCb(int status)
241220
{
242221
if (!status)
243222
qInfo() << "Data has been successfully written";
244-
delete writeBuf;
245223
}
246224

247225
void MainWindow::slotProgWrite()
248226
{
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)
263228
{
264-
qCritical() << "Failed to allocate memory for write buffer";
229+
qInfo() << "Write buffer is empty";
265230
return;
266231
}
267232

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-
284233
prog->writeChip(std::bind(&MainWindow::writeChipCb, this,
285-
std::placeholders::_1), writeBuf, START_ADDRESS, bufIter);
234+
std::placeholders::_1), buffer, START_ADDRESS, bufferSize);
286235
}
287236

288237
void MainWindow::selectChipCb()

0 commit comments

Comments
 (0)