@@ -69,8 +69,8 @@ mbServerDialogAction::mbServerDialogAction(QWidget *parent) :
6969
7070 // Offset
7171 sp = ui->spOffset ;
72- sp->setMinimum (0 );
73- sp->setMaximum (USHRT_MAX);
72+ sp->setMinimum (1 );
73+ sp->setMaximum (USHRT_MAX+ 1 );
7474
7575 // Data type
7676 cmb = ui->cmbDataType ;
@@ -90,7 +90,7 @@ mbServerDialogAction::mbServerDialogAction(QWidget *parent) :
9090 sp->setMinimum (0 );
9191 sp->setMaximum (INT_MAX);
9292
93- // Simulation type
93+ // Action type
9494 cmb = ui->cmbActionType ;
9595 e = mb::metaEnum<mbServerAction::ActionType>();
9696 for (int i = 0 ; i < e.keyCount (); i++)
@@ -99,19 +99,35 @@ mbServerDialogAction::mbServerDialogAction(QWidget *parent) :
9999 cmb->setCurrentIndex (mbServerAction::Defaults::instance ().actionType );
100100 setActionType (cmb->currentIndex ());
101101
102- // Simulation Increment
102+ // Action Increment
103103 ui->lnActionIncrement ->setText (QString::number (d.incrementValue ));
104104
105- // Simulation Sine
105+ // Action Sine
106106 ui->lnActionSinePeriod ->setText (QString::number (d.sinePeriod ));
107107 ui->lnActionSinePhaseShift ->setText (QString::number (d.sinePhaseShift ));
108108 ui->lnActionSineAmplitude ->setText (QString::number (d.sineAmplitude ));
109109 ui->lnActionSineVerticalShift ->setText (QString::number (d.sineVerticalShift ));
110110
111- // Simulation Random
111+ // Action Random
112112 ui->lnActionRandomMin ->setText (QString::number (d.randomMin ));
113113 ui->lnActionRandomMax ->setText (QString::number (d.randomMax ));
114114
115+ // Action Copy
116+ cmb = ui->cmbCopySourceAdrType ;
117+ cmb->addItem (mb::toModbusMemoryTypeString (Modbus::Memory_0x));
118+ cmb->addItem (mb::toModbusMemoryTypeString (Modbus::Memory_1x));
119+ cmb->addItem (mb::toModbusMemoryTypeString (Modbus::Memory_3x));
120+ cmb->addItem (mb::toModbusMemoryTypeString (Modbus::Memory_4x));
121+ cmb->setCurrentIndex (2 );
122+
123+ sp = ui->spCopySourceOffset ;
124+ sp->setMinimum (1 );
125+ sp->setMaximum (USHRT_MAX+1 );
126+
127+ sp = ui->spCopySize ;
128+ sp->setMinimum (0 );
129+ sp->setMaximum (USHRT_MAX);
130+
115131 // --------------------- ADVANCED ---------------------
116132 // Byte Order
117133 cmb = ui->cmbByteOrder ;
@@ -149,6 +165,10 @@ MBSETTINGS mbServerDialogAction::cachedSettings() const
149165 adr.type = mb::toModbusMemoryType (ui->cmbAdrType ->currentText ());
150166 adr.offset = static_cast <quint16>(ui->spOffset ->value ()-1 );
151167
168+ mb::Address adrCopy;
169+ adrCopy.type = mb::toModbusMemoryType (ui->cmbCopySourceAdrType ->currentText ());
170+ adrCopy.offset = static_cast <quint16>(ui->spCopySourceOffset ->value ()-1 );
171+
152172 m[prefix+vs.device ] = ui->cmbDevice ->currentText ();
153173 m[prefix+vs.address ] = mb::toInt (adr);
154174 m[prefix+vs.dataType ] = ui->cmbDataType ->currentText ();
@@ -160,6 +180,8 @@ MBSETTINGS mbServerDialogAction::cachedSettings() const
160180 m[prefix+vs.sineVerticalShift ] = ui->lnActionSineVerticalShift ->text ();
161181 m[prefix+vs.randomMin ] = ui->lnActionRandomMin ->text ();
162182 m[prefix+vs.randomMax ] = ui->lnActionRandomMax ->text ();
183+ m[prefix+vs.copySourceAddress ] = mb::toInt (adrCopy);
184+ m[prefix+vs.copySize ] = ui->spCopySize ->value ();
163185 m[prefix+vs.actionType ] = ui->cmbActionType ->currentText ();
164186 m[prefix+vs.byteOrder ] = ui->cmbByteOrder ->currentText ();
165187 m[prefix+vs.registerOrder ] = ui->cmbRegisterOrder ->currentText ();
@@ -186,6 +208,14 @@ void mbServerDialogAction::setCachedSettings(const MBSETTINGS &m)
186208 ui->spOffset ->setValue (adr.offset +1 );
187209 }
188210
211+ it = m.find (prefix+vs.copySourceAddress );
212+ if (it != end)
213+ {
214+ mb::Address adr = mb::toAddress (it.value ().toInt ());
215+ ui->cmbCopySourceAdrType ->setCurrentText (mb::toModbusMemoryTypeString (adr.type ));
216+ ui->spCopySourceOffset ->setValue (adr.offset +1 );
217+ }
218+
189219 it = m.find (prefix+vs.device ); if (it != end) ui->cmbDevice ->setCurrentText (it.value ().toString ());
190220 it = m.find (prefix+vs.dataType ); if (it != end) ui->cmbDataType ->setCurrentText (it.value ().toString ());
191221 it = m.find (prefix+vs.period ); if (it != end) ui->spPeriod ->setValue (it.value ().toInt () );
@@ -196,6 +226,7 @@ void mbServerDialogAction::setCachedSettings(const MBSETTINGS &m)
196226 it = m.find (prefix+vs.sineVerticalShift ); if (it != end) ui->lnActionSineVerticalShift ->setText (it.value ().toString ());
197227 it = m.find (prefix+vs.randomMin ); if (it != end) ui->lnActionRandomMin ->setText (it.value ().toString ());
198228 it = m.find (prefix+vs.randomMax ); if (it != end) ui->lnActionRandomMax ->setText (it.value ().toString ());
229+ it = m.find (prefix+vs.copySize ); if (it != end) ui->spCopySize ->setValue (it.value ().toInt ());
199230 it = m.find (prefix+vs.actionType ); if (it != end) ui->cmbActionType ->setCurrentText (mb::enumKey (mb::enumValue<mbServerAction::ActionType>(it.value ())));
200231 it = m.find (prefix+vs.byteOrder ); if (it != end) fillFormByteOrder (mb::enumDataOrderValue (it.value ()));
201232 it = m.find (prefix+vs.registerOrder ); if (it != end) fillFormRegisterOrder (mb::enumDataOrderValue (it.value ()));
@@ -287,6 +318,14 @@ void mbServerDialogAction::fillFormActionType(const MBSETTINGS &settings)
287318 ui->lnActionRandomMin ->setText (settings.value (sAction .randomMin ).toString ());
288319 ui->lnActionRandomMax ->setText (settings.value (sAction .randomMax ).toString ());
289320 break ;
321+ case mbServerAction::Copy:
322+ {
323+ mb::Address adr = mb::toAddress (settings.value (sAction .copySourceAddress ).toInt ());
324+ ui->cmbCopySourceAdrType ->setCurrentText (mb::toModbusMemoryTypeString (adr.type ));
325+ ui->spCopySourceOffset ->setValue (adr.offset +1 );
326+ ui->spCopySize ->setValue (settings.value (sAction .copySize ).toInt ());
327+ }
328+ break ;
290329 }
291330 ui->cmbActionType ->setCurrentText (mb::enumKey<mbServerAction::ActionType>(t));
292331}
@@ -350,6 +389,15 @@ void mbServerDialogAction::fillDataActionType(MBSETTINGS &settings)
350389 settings[sAction .randomMin ] = ui->lnActionRandomMin ->text ();
351390 settings[sAction .randomMax ] = ui->lnActionRandomMax ->text ();
352391 break ;
392+ case mbServerAction::Copy:
393+ {
394+ mb::Address adr;
395+ adr.type = mb::toModbusMemoryType (ui->cmbCopySourceAdrType ->currentText ());
396+ adr.offset = static_cast <quint16>(ui->spCopySourceOffset ->value ()-1 );
397+ settings[sAction .copySourceAddress ] = mb::toInt (adr);
398+ settings[sAction .copySize ] = ui->spCopySize ->value ();
399+ }
400+ break ;
353401 }
354402 settings[sAction .actionType ] = t;
355403}
0 commit comments