@@ -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
121131mbClientDialogScannerRequest::~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
173192void mbClientDialogScannerRequest::selectionChanged (const QModelIndex ¤t, const QModelIndex &)
174193{
175- mbClientMessageParamsOLD func = m_model->func (current.row ());
194+ mbClientMessageParams func = m_model->func (current.row ());
176195 setCurrentFunc (func);
177196}
178197
179198void 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 {
0 commit comments