Skip to content

Commit b859d80

Browse files
committed
Add client scanner support for FC20,21
1 parent 6884be5 commit b859d80

10 files changed

Lines changed: 349 additions & 70 deletions

src/client/core/client_global.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
#include <project/client_device.h>
44

5-
int id_mbClientMessageParams = qRegisterMetaType<mbClientMessageParamsOLD>();
5+
int id_mbClientMessageParams = qRegisterMetaType<mbClientMessageParams>();
66

77
namespace mb {
88

src/client/gui/scanner/client_dialogscannerrequest.cpp

Lines changed: 141 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ mbClientDialogScannerRequest::Strings::Strings() :
1010
offset1 (prefix+QStringLiteral("offset1")),
1111
offset2 (prefix+QStringLiteral("offset2")),
1212
count2 (prefix+QStringLiteral("count2")),
13+
fileRecords (prefix+QStringLiteral("fileRecords")),
1314
wGeometry (prefix+QStringLiteral("geometry")),
1415
wSplitterState(prefix+QStringLiteral("splitterState"))
1516
{
@@ -63,6 +64,8 @@ mbClientDialogScannerRequest::mbClientDialogScannerRequest(QWidget *parent) :
6364
m_funcNums.append(MBF_WRITE_MULTIPLE_COILS );
6465
m_funcNums.append(MBF_WRITE_MULTIPLE_REGISTERS );
6566
m_funcNums.append(MBF_REPORT_SERVER_ID );
67+
m_funcNums.append(MBF_READ_FILE_RECORD );
68+
m_funcNums.append(MBF_WRITE_FILE_RECORD );
6669
m_funcNums.append(MBF_MASK_WRITE_REGISTER );
6770
m_funcNums.append(MBF_READ_WRITE_MULTIPLE_REGISTERS);
6871
m_funcNums.append(MBF_READ_FIFO_QUEUE );
@@ -116,6 +119,13 @@ mbClientDialogScannerRequest::mbClientDialogScannerRequest(QWidget *parent) :
116119
connect(ui->btnIcoMoveUp , &QPushButton::clicked, this, &mbClientDialogScannerRequest::moveUpFunc );
117120
connect(ui->btnIcoMoveDown, &QPushButton::clicked, this, &mbClientDialogScannerRequest::moveDownFunc);
118121
connect(ui->btnIcoClear , &QPushButton::clicked, this, &mbClientDialogScannerRequest::clearFuncs );
122+
123+
connect(ui->btnAddFileRecord , &QPushButton::clicked, this, &mbClientDialogScannerRequest::addFileRecord );
124+
connect(ui->btnDeleteFileRecord , &QPushButton::clicked, this, &mbClientDialogScannerRequest::deleteFileRecord );
125+
connect(ui->btnMoveUpFileRecord , &QPushButton::clicked, this, &mbClientDialogScannerRequest::moveUpFileRecord );
126+
connect(ui->btnMoveDownFileRecord, &QPushButton::clicked, this, &mbClientDialogScannerRequest::moveDownFileRecord);
127+
connect(ui->btnClearFileRecords , &QPushButton::clicked, this, &mbClientDialogScannerRequest::clearFileRecords );
128+
119129
}
120130

121131
mbClientDialogScannerRequest::~mbClientDialogScannerRequest()
@@ -128,11 +138,15 @@ MBSETTINGS mbClientDialogScannerRequest::cachedSettings() const
128138
MBSETTINGS m;
129139
const Strings &s = Strings::instance();
130140

141+
mbClientMessageParams params;
142+
params.setFileRecords(getCurrentFileRecords());
143+
131144
m[s.func ] = getCurrentFuncNum();
132145
m[s.subfunc ] = getCurrentDiagnSubfuncNum();
133146
m[s.offset1 ] = ui->spOffset1 ->value ();
134147
m[s.offset2 ] = ui->spOffset2 ->value ();
135148
m[s.count2 ] = ui->spCount2 ->value ();
149+
m[s.fileRecords ] = params.fileRecordsAsByteArray();
136150
m[s.wGeometry ] = this->saveGeometry();
137151
m[s.wSplitterState] = ui->splitter->saveState();
138152

@@ -152,6 +166,11 @@ void mbClientDialogScannerRequest::setCachedSettings(const MBSETTINGS &m)
152166
it = m.find(s.offset1 ); if (it != end) ui->spOffset1 ->setValue (it.value().toInt() );
153167
it = m.find(s.offset2 ); if (it != end) ui->spOffset2 ->setValue (it.value().toInt() );
154168
it = m.find(s.count2 ); if (it != end) ui->spCount2 ->setValue (it.value().toInt() );
169+
it = m.find(s.fileRecords ); if (it != end) {
170+
mbClientMessageParams params;
171+
params.setFileRecords(it.value().toByteArray());
172+
setCurrentFileRecords(params.fileRecords());
173+
}
155174
it = m.find(s.wGeometry ); if (it != end) this ->restoreGeometry(it.value().toByteArray());
156175
it = m.find(s.wSplitterState); if (it != end) ui->splitter ->restoreState (it.value().toByteArray());
157176
}
@@ -172,13 +191,13 @@ bool mbClientDialogScannerRequest::getRequest(mbClientScanner::Request_t &req)
172191

173192
void mbClientDialogScannerRequest::selectionChanged(const QModelIndex &current, const QModelIndex &)
174193
{
175-
mbClientMessageParamsOLD func = m_model->func(current.row());
194+
mbClientMessageParams func = m_model->func(current.row());
176195
setCurrentFunc(func);
177196
}
178197

179198
void mbClientDialogScannerRequest::addFunc()
180199
{
181-
mbClientMessageParamsOLD func = getCurrentFunc();
200+
mbClientMessageParams func = getCurrentFunc();
182201
m_model->addFunc(func);
183202
}
184203

@@ -187,7 +206,7 @@ void mbClientDialogScannerRequest::modifyFunc()
187206
QModelIndexList ls = ui->lsRequest->selectionModel()->selectedRows();
188207
if (ls.count())
189208
{
190-
mbClientMessageParamsOLD func = getCurrentFunc();
209+
mbClientMessageParams func = getCurrentFunc();
191210
m_model->modifyFunc(ls.first().row(), func);
192211
}
193212
}
@@ -230,10 +249,64 @@ void mbClientDialogScannerRequest::setCurrentFuncIndex(int i)
230249
setCurrentFuncNum(funcNum);
231250
}
232251

233-
mbClientMessageParamsOLD mbClientDialogScannerRequest::getCurrentFunc() const
252+
void mbClientDialogScannerRequest::addFileRecord()
253+
{
254+
auto itemFile = new QTableWidgetItem(QString("0"));
255+
auto itemRecord = new QTableWidgetItem(QString("0"));
256+
auto itemLen = new QTableWidgetItem(QString("1"));
257+
int i = ui->tblFileRecord->rowCount();
258+
ui->tblFileRecord->insertRow(i);
259+
ui->tblFileRecord->setItem(i, 0, itemFile);
260+
ui->tblFileRecord->setItem(i, 1, itemRecord);
261+
ui->tblFileRecord->setItem(i, 2, itemLen);
262+
}
263+
264+
void mbClientDialogScannerRequest::deleteFileRecord()
265+
{
266+
int i = ui->tblFileRecord->currentRow();
267+
if (i >= 0)
268+
ui->tblFileRecord->removeRow(i);
269+
}
270+
271+
void mbClientDialogScannerRequest::moveUpFileRecord()
272+
{
273+
int i = ui->tblFileRecord->currentRow();
274+
if (i > 0)
275+
{
276+
ui->tblFileRecord->insertRow(i - 1);
277+
for (int j = 0; j < ui->tblFileRecord->columnCount(); ++j)
278+
{
279+
ui->tblFileRecord->setItem(i - 1, j, ui->tblFileRecord->takeItem(i + 1, j));
280+
}
281+
ui->tblFileRecord->removeRow(i + 1);
282+
ui->tblFileRecord->setCurrentCell(i - 1, 0);
283+
}
284+
}
285+
286+
void mbClientDialogScannerRequest::moveDownFileRecord()
287+
{
288+
int i = ui->tblFileRecord->currentRow();
289+
if (i >= 0 && i < ui->tblFileRecord->rowCount() - 1)
290+
{
291+
ui->tblFileRecord->insertRow(i + 2);
292+
for (int j = 0; j < ui->tblFileRecord->columnCount(); ++j)
293+
{
294+
ui->tblFileRecord->setItem(i + 2, j, ui->tblFileRecord->takeItem(i, j));
295+
}
296+
ui->tblFileRecord->removeRow(i);
297+
ui->tblFileRecord->setCurrentCell(i + 1, 0);
298+
}
299+
}
300+
301+
void mbClientDialogScannerRequest::clearFileRecords()
302+
{
303+
ui->tblFileRecord->setRowCount(0);
304+
}
305+
306+
mbClientMessageParams mbClientDialogScannerRequest::getCurrentFunc() const
234307
{
235308
uint8_t funcNum = getCurrentFuncNum();
236-
mbClientMessageParamsOLD func;
309+
mbClientMessageParams func;
237310
switch(funcNum)
238311
{
239312
case MBF_READ_COILS:
@@ -243,38 +316,45 @@ mbClientMessageParamsOLD mbClientDialogScannerRequest::getCurrentFunc() const
243316
case MBF_WRITE_MULTIPLE_COILS:
244317
case MBF_WRITE_MULTIPLE_REGISTERS:
245318
case MBF_READ_WRITE_MULTIPLE_REGISTERS:
246-
func.func = funcNum;
247-
func.offset = static_cast<uint16_t>(ui->spOffset2->value());
248-
func.count = static_cast<uint16_t>(ui->spCount2 ->value());
319+
func.setFunction(funcNum);
320+
func.setOffset(static_cast<uint16_t>(ui->spOffset2->value()));
321+
func.setCount(static_cast<uint16_t>(ui->spCount2 ->value()));
249322
break;
250323
case MBF_WRITE_SINGLE_COIL:
251324
case MBF_WRITE_SINGLE_REGISTER:
252325
case MBF_MASK_WRITE_REGISTER:
253326
case MBF_READ_FIFO_QUEUE:
254-
func.func = funcNum;
255-
func.offset = static_cast<uint16_t>(ui->spOffset1->value());
256-
func.count = 1;
327+
func.setFunction(funcNum);
328+
func.setOffset(static_cast<uint16_t>(ui->spOffset1->value()));
329+
func.setCount(1);
257330
break;
258331
case MBF_READ_EXCEPTION_STATUS:
259332
case MBF_REPORT_SERVER_ID:
260333
case MBF_GET_COMM_EVENT_COUNTER:
261334
case MBF_GET_COMM_EVENT_LOG:
262-
func.func = funcNum;
335+
func.setFunction(funcNum);
263336
break;
264337
case MBF_DIAGNOSTICS:
265-
func.func = funcNum;
266-
func.subfunc= getCurrentDiagnSubfuncNum();
338+
func.setFunction(funcNum);
339+
func.setSubfunction(getCurrentDiagnSubfuncNum());
340+
break;
341+
case MBF_READ_FILE_RECORD:
342+
case MBF_WRITE_FILE_RECORD:
343+
{
344+
func.setFunction(funcNum);
345+
func.setFileRecords(getCurrentFileRecords());
346+
}
267347
break;
268348
}
269349
return func;
270350
}
271351

272-
void mbClientDialogScannerRequest::setCurrentFunc(const mbClientMessageParamsOLD &f)
352+
void mbClientDialogScannerRequest::setCurrentFunc(const mbClientMessageParams &f)
273353
{
274-
int index = m_funcNums.indexOf(f.func);
354+
int index = m_funcNums.indexOf(f.function());
275355
if (index < 0)
276356
return;
277-
switch(f.func)
357+
switch(f.function())
278358
{
279359
case MBF_READ_COILS:
280360
case MBF_READ_DISCRETE_INPUTS:
@@ -283,22 +363,26 @@ void mbClientDialogScannerRequest::setCurrentFunc(const mbClientMessageParamsOLD
283363
case MBF_WRITE_MULTIPLE_COILS:
284364
case MBF_WRITE_MULTIPLE_REGISTERS:
285365
case MBF_READ_WRITE_MULTIPLE_REGISTERS:
286-
ui->spOffset2->setValue(f.offset);
287-
ui->spCount2 ->setValue(f.count);
366+
ui->spOffset2->setValue(f.offset());
367+
ui->spCount2 ->setValue(f.count());
288368
break;
289369
case MBF_WRITE_SINGLE_COIL:
290370
case MBF_WRITE_SINGLE_REGISTER:
291371
case MBF_MASK_WRITE_REGISTER:
292372
case MBF_READ_FIFO_QUEUE:
293-
ui->spOffset1->setValue(f.offset);
373+
ui->spOffset1->setValue(f.offset());
294374
break;
295375
case MBF_READ_EXCEPTION_STATUS:
296376
case MBF_REPORT_SERVER_ID:
297377
case MBF_GET_COMM_EVENT_COUNTER:
298378
case MBF_GET_COMM_EVENT_LOG:
299379
break;
300380
case MBF_DIAGNOSTICS:
301-
setCurrentDiagnSubfuncNum(f.subfunc);
381+
setCurrentDiagnSubfuncNum(f.subfunction());
382+
break;
383+
case MBF_READ_FILE_RECORD:
384+
case MBF_WRITE_FILE_RECORD:
385+
setCurrentFileRecords(f.fileRecords());
302386
break;
303387
default:
304388
return;
@@ -345,6 +429,10 @@ void mbClientDialogScannerRequest::setCurrentFuncNum(uint8_t funcNum)
345429
case MBF_DIAGNOSTICS:
346430
ui->swFuncParams->setCurrentWidget(ui->pgDiagn);
347431
break;
432+
case MBF_READ_FILE_RECORD:
433+
case MBF_WRITE_FILE_RECORD:
434+
ui->swFuncParams->setCurrentWidget(ui->pgFileRecord);
435+
break;
348436
default:
349437
ui->swFuncParams->setCurrentWidget(ui->pgEmpty);
350438
break;
@@ -365,6 +453,35 @@ void mbClientDialogScannerRequest::setCurrentDiagnSubfuncNum(uint16_t subfunc)
365453
}
366454
}
367455

456+
QVector<Modbus::FileRecord> mbClientDialogScannerRequest::getCurrentFileRecords() const
457+
{
458+
QVector<Modbus::FileRecord> fileRecords;
459+
fileRecords.resize(ui->tblFileRecord->rowCount());
460+
for (int i = 0; i < ui->tblFileRecord->rowCount(); ++i)
461+
{
462+
uint16_t fileNum = static_cast<uint16_t>(ui->tblFileRecord->item(i, 0)->text().toUInt());
463+
uint16_t recordNum = static_cast<uint16_t>(ui->tblFileRecord->item(i, 1)->text().toUInt());
464+
uint16_t recordLen = static_cast<uint16_t>(ui->tblFileRecord->item(i, 2)->text().toUInt());
465+
fileRecords[i] = {fileNum, recordNum, recordLen};
466+
}
467+
return fileRecords;
468+
}
469+
470+
void mbClientDialogScannerRequest::setCurrentFileRecords(const QVector<Modbus::FileRecord> &fileRecords)
471+
{
472+
ui->tblFileRecord->setRowCount(fileRecords.size());
473+
for (int i = 0; i < fileRecords.size(); ++i)
474+
{
475+
const auto &fr = fileRecords[i];
476+
auto itemFile = new QTableWidgetItem(QString::number(fr.fileNumber));
477+
auto itemRecord = new QTableWidgetItem(QString::number(fr.recordNumber));
478+
auto itemLen = new QTableWidgetItem(QString::number(fr.recordLength));
479+
ui->tblFileRecord->setItem(i, 0, itemFile);
480+
ui->tblFileRecord->setItem(i, 1, itemRecord);
481+
ui->tblFileRecord->setItem(i, 2, itemLen);
482+
}
483+
}
484+
368485
/* =============================================================
369486
* =========================== MODEL ===========================
370487
*/
@@ -387,20 +504,20 @@ void mbClientDialogScannerRequest::Model::setRequest(const mbClientScanner::Requ
387504
endResetModel();
388505
}
389506

390-
mbClientMessageParamsOLD mbClientDialogScannerRequest::Model::func(int i)
507+
mbClientMessageParams mbClientDialogScannerRequest::Model::func(int i)
391508
{
392509
return m_req.value(i);
393510
}
394511

395-
void mbClientDialogScannerRequest::Model::addFunc(const mbClientMessageParamsOLD &f)
512+
void mbClientDialogScannerRequest::Model::addFunc(const mbClientMessageParams &f)
396513
{
397514
int c = m_req.count();
398515
beginInsertRows(QModelIndex(), c, c);
399516
m_req.append(f);
400517
endInsertRows();
401518
}
402519

403-
void mbClientDialogScannerRequest::Model::modifyFunc(int i, const mbClientMessageParamsOLD &f)
520+
void mbClientDialogScannerRequest::Model::modifyFunc(int i, const mbClientMessageParams &f)
404521
{
405522
if ((0 <= i) && (i < m_req.size()))
406523
{

src/client/gui/scanner/client_dialogscannerrequest.h

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ class mbClientDialogScannerRequest : public QDialog
2525
const QString offset1 ;
2626
const QString offset2 ;
2727
const QString count2 ;
28+
const QString fileRecords ;
2829
const QString wGeometry ;
2930
const QString wSplitterState;
3031

@@ -53,13 +54,21 @@ private Q_SLOTS:
5354
void clearFuncs();
5455
void setCurrentFuncIndex(int i);
5556

57+
void addFileRecord();
58+
void deleteFileRecord();
59+
void moveUpFileRecord();
60+
void moveDownFileRecord();
61+
void clearFileRecords();
62+
5663
private:
57-
mbClientMessageParamsOLD getCurrentFunc() const;
58-
void setCurrentFunc(const mbClientMessageParamsOLD &f);
64+
mbClientMessageParams getCurrentFunc() const;
65+
void setCurrentFunc(const mbClientMessageParams &f);
5966
uint8_t getCurrentFuncNum() const;
6067
uint16_t getCurrentDiagnSubfuncNum() const;
6168
void setCurrentFuncNum(uint8_t funcNum);
6269
void setCurrentDiagnSubfuncNum(uint16_t subfunc);
70+
QVector<Modbus::FileRecord> getCurrentFileRecords() const;
71+
void setCurrentFileRecords(const QVector<Modbus::FileRecord> &fileRecords);
6372

6473
private:
6574
class Model : public QAbstractListModel
@@ -76,9 +85,9 @@ private Q_SLOTS:
7685
void setRequest(const mbClientScanner::Request_t &req);
7786

7887
public:
79-
mbClientMessageParamsOLD func(int i);
80-
void addFunc(const mbClientMessageParamsOLD &f);
81-
void modifyFunc(int i, const mbClientMessageParamsOLD &f);
88+
mbClientMessageParams func(int i);
89+
void addFunc(const mbClientMessageParams &f);
90+
void modifyFunc(int i, const mbClientMessageParams &f);
8291
void deleteFunc(int i);
8392
void moveUpFunc(int i);
8493
void moveDownFunc(int i);

0 commit comments

Comments
 (0)