Skip to content

Commit a2d062a

Browse files
author
Ананьев Александр
committed
Correct DataSimulator to save current value
1 parent e3d57e4 commit a2d062a

7 files changed

Lines changed: 137 additions & 145 deletions

File tree

omodsim/datasimulator.cpp

Lines changed: 69 additions & 126 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,11 @@
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
///
3532
void 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
///
6768
void 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

149144
template<typename T>
150145
T generateRandom(double from, double to)
@@ -166,12 +161,12 @@ T generateRandom(const QRange<double>& range)
166161
///
167162
void 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

222203
template<typename T>
@@ -235,52 +216,32 @@ T incrementValue(T value, T step, const QRange<double>& range)
235216
///
236217
void 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

286247
template<typename T>
@@ -299,52 +260,32 @@ T decrementValue(T value, T step, const QRange<double>& range)
299260
///
300261
void 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
///
355296
void 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
}

omodsim/datasimulator.h

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,29 +11,40 @@ class DataSimulator : public QObject
1111
{
1212
Q_OBJECT
1313
public:
14-
explicit DataSimulator(ModbusMultiServer* server);
14+
explicit DataSimulator(QObject* parent = nullptr);
1515
~DataSimulator() override;
1616

1717
void startSimulation(DataDisplayMode mode, QModbusDataUnit::RegisterType type, quint16 addr, const ModbusSimulationParams& params);
1818
void stopSimulation(QModbusDataUnit::RegisterType type, quint16 addr);
1919
void stopSimulations();
2020

21+
void pauseSimulations();
22+
void resumeSimulations();
23+
void restartSimulations();
24+
25+
signals:
26+
void dataSimulated(DataDisplayMode mode, QModbusDataUnit::RegisterType type, quint16 addr, QVariant value);
27+
2128
private slots:
2229
void on_timeout();
2330

2431
private:
25-
void initializeValue(DataDisplayMode mode, QModbusDataUnit::RegisterType type, quint16 addr, double value);
2632
void randomSimulation(DataDisplayMode mode, QModbusDataUnit::RegisterType type, quint16 addr, const RandomSimulationParams& params);
2733
void incrementSimulation(DataDisplayMode mode, QModbusDataUnit::RegisterType type, quint16 addr, const IncrementSimulationParams& params);
2834
void decrementSimailation(DataDisplayMode mode, QModbusDataUnit::RegisterType type, quint16 addr, const DecrementSimulationParams& params);
2935
void toggleSimulation(QModbusDataUnit::RegisterType type, quint16 addr);
3036

3137
private:
32-
ModbusMultiServer* _mbMultiServer;
3338
QTimer _timer;
3439
quint32 _elapsed;
35-
QMap<QPair<QModbusDataUnit::RegisterType, quint16>,
36-
QPair<DataDisplayMode, ModbusSimulationParams>> _simulationMap;
40+
const int _interval = 1000;
41+
42+
struct SimulationParams {
43+
DataDisplayMode Mode;
44+
ModbusSimulationParams Params;
45+
QVariant CurrentValue;
46+
};
47+
QMap<QPair<QModbusDataUnit::RegisterType, quint16>, SimulationParams> _simulationMap;
3748
};
3849

3950
#endif // DATASIMULATOR_H

0 commit comments

Comments
 (0)