77// / \brief DataSimulator::DataSimulator
88// / \param server
99// /
10- DataSimulator::DataSimulator (ModbusMultiServer* server)
11- : QObject{server}
12- ,_mbMultiServer(server)
10+ DataSimulator::DataSimulator (QObject* parent)
11+ : QObject{parent}
1312 ,_elapsed(0 )
1413{
15- Q_ASSERT (_mbMultiServer != nullptr );
1614 connect (&_timer, &QTimer::timeout, this , &DataSimulator::on_timeout);
17- _timer.start (1000 );
1815}
1916
2017// /
@@ -34,21 +31,25 @@ DataSimulator::~DataSimulator()
3431// /
3532void DataSimulator::startSimulation (DataDisplayMode mode, QModbusDataUnit::RegisterType type, quint16 addr, const ModbusSimulationParams& params)
3633{
34+ QVariant value;
3735 switch (params.Mode )
3836 {
3937 case SimulationMode::Increment:
40- initializeValue (mode, type, addr, params.IncrementParams .Range .from ());
38+ value = params.IncrementParams .Range .from ();
39+ emit dataSimulated (mode, type, addr, value);
4140 break ;
4241
4342 case SimulationMode::Decrement:
44- initializeValue (mode, type, addr, params.IncrementParams .Range .to ());
43+ value = params.IncrementParams .Range .to ();
44+ emit dataSimulated (mode, type, addr, value);
4545 break ;
4646
4747 default :
4848 break ;
4949 }
5050
5151 _simulationMap[{ type, addr}] = { mode, params };
52+ resumeSimulations ();
5253}
5354
5455// /
@@ -66,9 +67,41 @@ void DataSimulator::stopSimulation(QModbusDataUnit::RegisterType type, quint16 a
6667// /
6768void DataSimulator::stopSimulations ()
6869{
70+ pauseSimulations ();
6971 _simulationMap.clear ();
7072}
7173
74+ // /
75+ // / \brief DataSimulator::pauseSimulations
76+ // /
77+ void DataSimulator::pauseSimulations ()
78+ {
79+ _timer.stop ();
80+ }
81+
82+ // /
83+ // / \brief DataSimulator::resumeSimulations
84+ // /
85+ void DataSimulator::resumeSimulations ()
86+ {
87+ if (!_timer.isActive ())
88+ _timer.start (_interval);
89+ }
90+
91+ // /
92+ // / \brief DataSimulator::restartSimulations
93+ // /
94+ void DataSimulator::restartSimulations ()
95+ {
96+ pauseSimulations ();
97+ for (auto && key : _simulationMap.keys ())
98+ {
99+ const auto mode = _simulationMap[key].Mode ;
100+ const auto params = _simulationMap[key].Params ;
101+ startSimulation (mode, key.first , key.second , params);
102+ }
103+ }
104+
72105// /
73106// / \brief DataSimulator::on_timeout
74107// /
@@ -77,8 +110,8 @@ void DataSimulator::on_timeout()
77110 _elapsed++;
78111 for (auto && key : _simulationMap.keys ())
79112 {
80- const auto mode = _simulationMap[key].first ;
81- const auto params = _simulationMap[key].second ;
113+ const auto mode = _simulationMap[key].Mode ;
114+ const auto params = _simulationMap[key].Params ;
82115 const auto interval = params.Interval ;
83116
84117 if (_elapsed % interval) continue ;
@@ -107,44 +140,6 @@ void DataSimulator::on_timeout()
107140 }
108141}
109142
110- // /
111- // / \brief DataSimulator::initializeValue
112- // / \param mode
113- // / \param type
114- // / \param addr
115- // / \param value
116- // /
117- void DataSimulator::initializeValue (DataDisplayMode mode, QModbusDataUnit::RegisterType type, quint16 addr, double value)
118- {
119- switch (mode)
120- {
121- case DataDisplayMode::Integer:
122- _mbMultiServer->writeValue (type, addr, static_cast <qint16>(value));
123- break ;
124-
125- case DataDisplayMode::Binary:
126- case DataDisplayMode::Decimal:
127- case DataDisplayMode::Hex:
128- _mbMultiServer->writeValue (type, addr, static_cast <quint16>(value));
129- break ;
130-
131- case DataDisplayMode::FloatingPt:
132- _mbMultiServer->writeFloat (type, addr, static_cast <float >(value), false );
133- break ;
134-
135- case DataDisplayMode::SwappedFP:
136- _mbMultiServer->writeFloat (type, addr, static_cast <float >(value), true );
137- break ;
138-
139- case DataDisplayMode::DblFloat:
140- _mbMultiServer->writeDouble (type, addr, value, false );
141- break ;
142-
143- case DataDisplayMode::SwappedDbl:
144- _mbMultiServer->writeDouble (type, addr, value, true );
145- break ;
146- }
147- }
148143
149144template <typename T>
150145T generateRandom (double from, double to)
@@ -166,12 +161,12 @@ T generateRandom(const QRange<double>& range)
166161// /
167162void DataSimulator::randomSimulation (DataDisplayMode mode, QModbusDataUnit::RegisterType type, quint16 addr, const RandomSimulationParams& params)
168163{
169- QVector<quint16> values ;
164+ auto && value = _simulationMap[{ type, addr}]. CurrentValue ;
170165 switch (type)
171166 {
172167 case QModbusDataUnit::Coils:
173168 case QModbusDataUnit::DiscreteInputs:
174- values. push_back ( generateRandom<quint16>(params.Range .from (), params.Range .to () + 1 ) );
169+ value = generateRandom<quint16>(params.Range .from (), params.Range .to () + 1 );
175170 break ;
176171
177172 case QModbusDataUnit::HoldingRegisters:
@@ -182,27 +177,17 @@ void DataSimulator::randomSimulation(DataDisplayMode mode, QModbusDataUnit::Regi
182177 case DataDisplayMode::Integer:
183178 case DataDisplayMode::Decimal:
184179 case DataDisplayMode::Hex:
185- values. push_back ( generateRandom<quint16>(params.Range .from (), params.Range .to () + 1 ) );
180+ value = generateRandom<quint16>(params.Range .from (), params.Range .to () + 1 );
186181 break ;
187182
188183 case DataDisplayMode::FloatingPt:
189- values.resize (2 );
190- breakFloat (generateRandom<float >(params.Range ), values[0 ], values[1 ]);
191- break ;
192-
193184 case DataDisplayMode::SwappedFP:
194- values.resize (2 );
195- breakFloat (generateRandom<float >(params.Range ), values[1 ], values[0 ]);
185+ value = generateRandom<float >(params.Range );
196186 break ;
197187
198188 case DataDisplayMode::DblFloat:
199- values.resize (4 );
200- breakDouble (generateRandom<double >(params.Range ), values[0 ], values[1 ], values[2 ], values[3 ]);
201- break ;
202-
203189 case DataDisplayMode::SwappedDbl:
204- values.resize (4 );
205- breakDouble (generateRandom<double >(params.Range ), values[3 ], values[2 ], values[1 ], values[0 ]);
190+ value = generateRandom<double >(params.Range );
206191 break ;
207192 }
208193 break ;
@@ -211,12 +196,8 @@ void DataSimulator::randomSimulation(DataDisplayMode mode, QModbusDataUnit::Regi
211196 break ;
212197 }
213198
214- if (!values.isEmpty ())
215- {
216- auto data = QModbusDataUnit (type, addr, values.size ());
217- data.setValues (values);
218- _mbMultiServer->setData (data);
219- }
199+ if (value.isValid ())
200+ emit dataSimulated (mode, type, addr, value);
220201}
221202
222203template <typename T>
@@ -235,52 +216,32 @@ T incrementValue(T value, T step, const QRange<double>& range)
235216// /
236217void DataSimulator::incrementSimulation (DataDisplayMode mode, QModbusDataUnit::RegisterType type, quint16 addr, const IncrementSimulationParams& params)
237218{
219+ auto && value = _simulationMap[{ type, addr}].CurrentValue ;
238220 switch (mode)
239221 {
240222 case DataDisplayMode::Integer:
241- {
242- const auto data = _mbMultiServer->data (type, addr, 1 );
243- _mbMultiServer->writeValue (type, addr, incrementValue<qint16>(data.value (0 ), params.Step , params.Range ));
244- }
223+ value = incrementValue<qint16>(value.toInt (), params.Step , params.Range );
245224 break ;
246225
247226 case DataDisplayMode::Binary:
248227 case DataDisplayMode::Decimal:
249228 case DataDisplayMode::Hex:
250- {
251- const auto data = _mbMultiServer->data (type, addr, 1 );
252- _mbMultiServer->writeValue (type, addr, incrementValue<quint16>(data.value (0 ), params.Step , params.Range ));
253- }
229+ value = incrementValue<quint16>(value.toUInt (), params.Step , params.Range );
254230 break ;
255231
256232 case DataDisplayMode::FloatingPt:
257- {
258- const auto value = _mbMultiServer->readFloat (type, addr, false );
259- _mbMultiServer->writeFloat (type, addr, incrementValue<float >(value, params.Step , params.Range ), false );
260- }
261- break ;
262-
263233 case DataDisplayMode::SwappedFP:
264- {
265- const auto value = _mbMultiServer->readFloat (type, addr, true );
266- _mbMultiServer->writeFloat (type, addr, incrementValue<float >(value, params.Step , params.Range ), true );
267- }
234+ value = incrementValue<float >(value.toFloat (), params.Step , params.Range );
268235 break ;
269236
270237 case DataDisplayMode::DblFloat:
271- {
272- const auto value = _mbMultiServer->readDouble (type, addr, false );
273- _mbMultiServer->writeDouble (type, addr, incrementValue<double >(value, params.Step , params.Range ), false );
274- }
275- break ;
276-
277238 case DataDisplayMode::SwappedDbl:
278- {
279- const auto value = _mbMultiServer->readDouble (type, addr, true );
280- _mbMultiServer->writeDouble (type, addr, incrementValue<double >(value, params.Step , params.Range ), true );
281- }
239+ value = incrementValue<double >(value.toDouble (), params.Step , params.Range );
282240 break ;
283241 }
242+
243+ if (value.isValid ())
244+ emit dataSimulated (mode, type, addr, value);
284245}
285246
286247template <typename T>
@@ -299,52 +260,32 @@ T decrementValue(T value, T step, const QRange<double>& range)
299260// /
300261void DataSimulator::decrementSimailation (DataDisplayMode mode, QModbusDataUnit::RegisterType type, quint16 addr, const DecrementSimulationParams& params)
301262{
263+ auto && value = _simulationMap[{ type, addr}].CurrentValue ;
302264 switch (mode)
303265 {
304266 case DataDisplayMode::Integer:
305- {
306- const auto data = _mbMultiServer->data (type, addr, 1 );
307- _mbMultiServer->writeValue (type, addr, decrementValue<qint16>(data.value (0 ), params.Step , params.Range ));
308- }
267+ value = decrementValue<qint16>(value.toInt (), params.Step , params.Range );
309268 break ;
310269
311270 case DataDisplayMode::Binary:
312271 case DataDisplayMode::Decimal:
313272 case DataDisplayMode::Hex:
314- {
315- const auto data = _mbMultiServer->data (type, addr, 1 );
316- _mbMultiServer->writeValue (type, addr, decrementValue<quint16>(data.value (0 ), params.Step , params.Range ));
317- }
273+ value = decrementValue<quint16>(value.toUInt (), params.Step , params.Range );
318274 break ;
319275
320276 case DataDisplayMode::FloatingPt:
321- {
322- const auto value = _mbMultiServer->readFloat (type, addr, false );
323- _mbMultiServer->writeFloat (type, addr, decrementValue<float >(value, params.Step , params.Range ), false );
324- }
325- break ;
326-
327277 case DataDisplayMode::SwappedFP:
328- {
329- const auto value = _mbMultiServer->readFloat (type, addr, true );
330- _mbMultiServer->writeFloat (type, addr, decrementValue<float >(value, params.Step , params.Range ), true );
331- }
278+ value = decrementValue<float >(value.toFloat (), params.Step , params.Range );
332279 break ;
333280
334281 case DataDisplayMode::DblFloat:
335- {
336- const auto value = _mbMultiServer->readDouble (type, addr, false );
337- _mbMultiServer->writeDouble (type, addr, decrementValue<double >(value, params.Step , params.Range ), false );
338- }
339- break ;
340-
341282 case DataDisplayMode::SwappedDbl:
342- {
343- const auto value = _mbMultiServer->readDouble (type, addr, true );
344- _mbMultiServer->writeDouble (type, addr, decrementValue<double >(value, params.Step , params.Range ), true );
345- }
283+ value = decrementValue<double >(value.toDouble (), params.Step , params.Range );
346284 break ;
347285 }
286+
287+ if (value.isValid ())
288+ emit dataSimulated (mode, type, addr, value);
348289}
349290
350291// /
@@ -354,6 +295,8 @@ void DataSimulator::decrementSimailation(DataDisplayMode mode, QModbusDataUnit::
354295// /
355296void DataSimulator::toggleSimulation (QModbusDataUnit::RegisterType type, quint16 addr)
356297{
357- const auto data = _mbMultiServer->data (type, addr, 1 );
358- _mbMultiServer->writeValue (type, addr, !data.value (0 ));
298+ auto && value = _simulationMap[{ type, addr}].CurrentValue ;
299+ value = !value.toBool ();
300+
301+ emit dataSimulated (DataDisplayMode::Binary, type, addr, value);
359302}
0 commit comments