Skip to content

Commit 36bcbdb

Browse files
committed
Correct data simulation with multiple ids
1 parent 109f036 commit 36bcbdb

5 files changed

Lines changed: 120 additions & 57 deletions

File tree

omodsim/controls/outputwidget.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -393,7 +393,7 @@ void OutputWidget::setup(const DisplayDefinition& dd, const ModbusSimulationMap&
393393
_listModel->clear();
394394

395395
for(auto&& key : simulations.keys())
396-
_listModel->setData(_listModel->find(key.first, key.second), true, SimulationRole);
396+
_listModel->setData(_listModel->find(key.Type, key.Address), true, SimulationRole);
397397

398398
for(auto&& key : _descriptionMap.keys())
399399
setDescription(key.first, key.second, _descriptionMap[key]);

omodsim/datasimulator.cpp

Lines changed: 38 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -23,44 +23,46 @@ DataSimulator::~DataSimulator()
2323
///
2424
/// \brief DataSimulator::startSimulation
2525
/// \param mode
26+
/// \param deviceId
2627
/// \param type
2728
/// \param addr
2829
/// \param params
2930
///
30-
void DataSimulator::startSimulation(DataDisplayMode mode, QModbusDataUnit::RegisterType type, quint16 addr, const ModbusSimulationParams& params)
31+
void DataSimulator::startSimulation(DataDisplayMode mode, quint8 deviceId, QModbusDataUnit::RegisterType type, quint16 addr, const ModbusSimulationParams& params)
3132
{
3233
QVariant value;
3334
switch (params.Mode)
3435
{
3536
case SimulationMode::Increment:
3637
value = params.IncrementParams.Range.from();
37-
emit dataSimulated(mode, type, addr, value);
38+
emit dataSimulated(mode, deviceId, type, addr, value);
3839
break;
3940

4041
case SimulationMode::Decrement:
4142
value = params.DecrementParams.Range.to();
42-
emit dataSimulated(mode, type, addr, value);
43+
emit dataSimulated(mode, deviceId, type, addr, value);
4344
break;
4445

4546
default:
4647
break;
4748
}
4849

49-
_simulationMap[{ type, addr}] = { mode, params, value };
50+
_simulationMap[{ deviceId, type, addr}] = { mode, params, value };
5051
resumeSimulations();
5152

52-
emit simulationStarted(type, addr);
53+
emit simulationStarted(deviceId, type, addr);
5354
}
5455

5556
///
5657
/// \brief DataSimulator::stopSimulation
58+
/// \param deviceId
5759
/// \param type
5860
/// \param addr
5961
///
60-
void DataSimulator::stopSimulation(QModbusDataUnit::RegisterType type, quint16 addr)
62+
void DataSimulator::stopSimulation(quint8 deviceId, QModbusDataUnit::RegisterType type, quint16 addr)
6163
{
62-
_simulationMap.remove({ type, addr});
63-
emit simulationStopped(type, addr);
64+
_simulationMap.remove({ deviceId, type, addr});
65+
emit simulationStopped(deviceId, type, addr);
6466
}
6567

6668
///
@@ -99,7 +101,7 @@ void DataSimulator::restartSimulations()
99101
{
100102
const auto mode = _simulationMap[key].Mode;
101103
const auto params = _simulationMap[key].Params;
102-
startSimulation(mode, key.first, key.second, params);
104+
startSimulation(mode, key.DeviceId, key.Type, key.Address, params);
103105
}
104106
}
105107

@@ -109,9 +111,9 @@ void DataSimulator::restartSimulations()
109111
/// \param addr
110112
/// \return
111113
///
112-
ModbusSimulationParams DataSimulator::simulationParams(QModbusDataUnit::RegisterType type, quint16 addr) const
114+
ModbusSimulationParams DataSimulator::simulationParams(quint8 deviceId, QModbusDataUnit::RegisterType type, quint16 addr) const
113115
{
114-
const auto it = _simulationMap.find({type, addr});
116+
const auto it = _simulationMap.find({ deviceId, type, addr});
115117
return (it != _simulationMap.end()) ? it->Params : ModbusSimulationParams();
116118
}
117119

@@ -145,19 +147,19 @@ void DataSimulator::on_timeout()
145147
switch(params.Mode)
146148
{
147149
case SimulationMode::Random:
148-
randomSimulation(mode, key.first, key.second, params.RandomParams);
150+
randomSimulation(mode, key.DeviceId, key.Type, key.Address, params.RandomParams);
149151
break;
150152

151153
case SimulationMode::Increment:
152-
incrementSimulation(mode, key.first, key.second, params.IncrementParams);
154+
incrementSimulation(mode, key.DeviceId, key.Type, key.Address, params.IncrementParams);
153155
break;
154156

155157
case SimulationMode::Decrement:
156-
decrementSimailation(mode, key.first, key.second, params.DecrementParams);
158+
decrementSimailation(mode, key.DeviceId, key.Type, key.Address, params.DecrementParams);
157159
break;
158160

159161
case SimulationMode::Toggle:
160-
toggleSimulation(key.first, key.second);
162+
toggleSimulation(key.DeviceId, key.Type, key.Address);
161163
break;
162164

163165
default:
@@ -181,13 +183,15 @@ T generateRandom(const QRange<double>& range)
181183

182184
///
183185
/// \brief DataSimulator::randomSimulation
186+
/// \param mode
187+
/// \param deviceId
184188
/// \param type
185189
/// \param addr
186190
/// \param params
187191
///
188-
void DataSimulator::randomSimulation(DataDisplayMode mode, QModbusDataUnit::RegisterType type, quint16 addr, const RandomSimulationParams& params)
192+
void DataSimulator::randomSimulation(DataDisplayMode mode, quint8 deviceId, QModbusDataUnit::RegisterType type, quint16 addr, const RandomSimulationParams& params)
189193
{
190-
auto&& value = _simulationMap[{ type, addr}].CurrentValue;
194+
auto&& value = _simulationMap[{ deviceId, type, addr}].CurrentValue;
191195
switch(type)
192196
{
193197
case QModbusDataUnit::Coils:
@@ -244,7 +248,7 @@ void DataSimulator::randomSimulation(DataDisplayMode mode, QModbusDataUnit::Regi
244248
}
245249

246250
if(value.isValid())
247-
emit dataSimulated(mode, type, addr, value);
251+
emit dataSimulated(mode, deviceId, type, addr, value);
248252
}
249253

250254
template<typename T>
@@ -257,13 +261,15 @@ T incrementValue(T value, T step, const QRange<double>& range)
257261

258262
///
259263
/// \brief DataSimulator::incrementSimulation
264+
/// \param mode
265+
/// \param deviceId
260266
/// \param type
261267
/// \param addr
262268
/// \param params
263269
///
264-
void DataSimulator::incrementSimulation(DataDisplayMode mode, QModbusDataUnit::RegisterType type, quint16 addr, const IncrementSimulationParams& params)
270+
void DataSimulator::incrementSimulation(DataDisplayMode mode, quint8 deviceId, QModbusDataUnit::RegisterType type, quint16 addr, const IncrementSimulationParams& params)
265271
{
266-
auto&& value = _simulationMap[{ type, addr}].CurrentValue;
272+
auto&& value = _simulationMap[{ deviceId, type, addr}].CurrentValue;
267273
switch(mode)
268274
{
269275
case DataDisplayMode::Int16:
@@ -273,6 +279,7 @@ void DataSimulator::incrementSimulation(DataDisplayMode mode, QModbusDataUnit::R
273279
case DataDisplayMode::Binary:
274280
case DataDisplayMode::UInt16:
275281
case DataDisplayMode::Hex:
282+
case DataDisplayMode::Ansi:
276283
value = incrementValue<quint16>(value.toUInt(), params.Step, params.Range);
277284
break;
278285

@@ -308,7 +315,7 @@ void DataSimulator::incrementSimulation(DataDisplayMode mode, QModbusDataUnit::R
308315
}
309316

310317
if(value.isValid())
311-
emit dataSimulated(mode, type, addr, value);
318+
emit dataSimulated(mode, deviceId, type, addr, value);
312319
}
313320

314321
template<typename T>
@@ -321,13 +328,15 @@ T decrementValue(T value, T step, const QRange<double>& range)
321328

322329
///
323330
/// \brief DataSimulator::decrementSimailation
331+
/// \param mode
332+
/// \param deviceId
324333
/// \param type
325334
/// \param addr
326335
/// \param params
327336
///
328-
void DataSimulator::decrementSimailation(DataDisplayMode mode, QModbusDataUnit::RegisterType type, quint16 addr, const DecrementSimulationParams& params)
337+
void DataSimulator::decrementSimailation(DataDisplayMode mode, quint8 deviceId, QModbusDataUnit::RegisterType type, quint16 addr, const DecrementSimulationParams& params)
329338
{
330-
auto&& value = _simulationMap[{ type, addr}].CurrentValue;
339+
auto&& value = _simulationMap[{ deviceId, type, addr}].CurrentValue;
331340
switch(mode)
332341
{
333342
case DataDisplayMode::Int16:
@@ -337,6 +346,7 @@ void DataSimulator::decrementSimailation(DataDisplayMode mode, QModbusDataUnit::
337346
case DataDisplayMode::Binary:
338347
case DataDisplayMode::UInt16:
339348
case DataDisplayMode::Hex:
349+
case DataDisplayMode::Ansi:
340350
value = decrementValue<quint16>(value.toUInt(), params.Step, params.Range);
341351
break;
342352

@@ -372,18 +382,19 @@ void DataSimulator::decrementSimailation(DataDisplayMode mode, QModbusDataUnit::
372382
}
373383

374384
if(value.isValid())
375-
emit dataSimulated(mode, type, addr, value);
385+
emit dataSimulated(mode, deviceId, type, addr, value);
376386
}
377387

378388
///
379389
/// \brief DataSimulator::toggleSimulation
390+
/// \param deviceId
380391
/// \param type
381392
/// \param addr
382393
///
383-
void DataSimulator::toggleSimulation(QModbusDataUnit::RegisterType type, quint16 addr)
394+
void DataSimulator::toggleSimulation(quint8 deviceId, QModbusDataUnit::RegisterType type, quint16 addr)
384395
{
385-
auto&& value = _simulationMap[{ type, addr}].CurrentValue;
396+
auto&& value = _simulationMap[{ deviceId, type, addr}].CurrentValue;
386397
value = !value.toBool();
387398

388-
emit dataSimulated(DataDisplayMode::Binary, type, addr, value);
399+
emit dataSimulated(DataDisplayMode::Binary, deviceId, type, addr, value);
389400
}

omodsim/datasimulator.h

Lines changed: 56 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,21 @@
55
#include <QModbusDataUnit>
66
#include "modbussimulationparams.h"
77

8-
typedef QMap<QPair<QModbusDataUnit::RegisterType, quint16>, ModbusSimulationParams> ModbusSimulationMap;
8+
struct ModbusSimulationMapKey {
9+
quint8 DeviceId;
10+
QModbusDataUnit::RegisterType Type;
11+
quint16 Address;
12+
13+
bool operator<(const ModbusSimulationMapKey &other) const {
14+
if (DeviceId != other.DeviceId)
15+
return DeviceId < other.DeviceId;
16+
if (Type != other.Type)
17+
return Type < other.Type;
18+
return Address < other.Address;
19+
}
20+
};
21+
22+
typedef QMap<ModbusSimulationMapKey, ModbusSimulationParams> ModbusSimulationMap;
923

1024
///
1125
/// \brief The DataSimulator class
@@ -17,30 +31,30 @@ class DataSimulator : public QObject
1731
explicit DataSimulator(QObject* parent = nullptr);
1832
~DataSimulator() override;
1933

20-
void startSimulation(DataDisplayMode mode, QModbusDataUnit::RegisterType type, quint16 addr, const ModbusSimulationParams& params);
21-
void stopSimulation(QModbusDataUnit::RegisterType type, quint16 addr);
34+
void startSimulation(DataDisplayMode mode, quint8 deviceId, QModbusDataUnit::RegisterType type, quint16 addr, const ModbusSimulationParams& params);
35+
void stopSimulation(quint8 deviceId, QModbusDataUnit::RegisterType type, quint16 addr);
2236
void stopSimulations();
2337

2438
void pauseSimulations();
2539
void resumeSimulations();
2640
void restartSimulations();
2741

28-
ModbusSimulationParams simulationParams(QModbusDataUnit::RegisterType type, quint16 addr) const;
42+
ModbusSimulationParams simulationParams(quint8 deviceId, QModbusDataUnit::RegisterType type, quint16 addr) const;
2943
ModbusSimulationMap simulationMap() const;
3044

3145
signals:
32-
void simulationStarted(QModbusDataUnit::RegisterType type, quint16 addr);
33-
void simulationStopped(QModbusDataUnit::RegisterType type, quint16 addr);
34-
void dataSimulated(DataDisplayMode mode, QModbusDataUnit::RegisterType type, quint16 addr, QVariant value);
46+
void simulationStarted(quint8 deviceId, QModbusDataUnit::RegisterType type, quint16 addr);
47+
void simulationStopped(quint8 deviceId, QModbusDataUnit::RegisterType type, quint16 addr);
48+
void dataSimulated(DataDisplayMode mode, quint8 deviceId, QModbusDataUnit::RegisterType type, quint16 addr, QVariant value);
3549

3650
private slots:
3751
void on_timeout();
3852

3953
private:
40-
void randomSimulation(DataDisplayMode mode, QModbusDataUnit::RegisterType type, quint16 addr, const RandomSimulationParams& params);
41-
void incrementSimulation(DataDisplayMode mode, QModbusDataUnit::RegisterType type, quint16 addr, const IncrementSimulationParams& params);
42-
void decrementSimailation(DataDisplayMode mode, QModbusDataUnit::RegisterType type, quint16 addr, const DecrementSimulationParams& params);
43-
void toggleSimulation(QModbusDataUnit::RegisterType type, quint16 addr);
54+
void randomSimulation(DataDisplayMode mode, quint8 deviceId, QModbusDataUnit::RegisterType type, quint16 addr, const RandomSimulationParams& params);
55+
void incrementSimulation(DataDisplayMode mode, quint8 deviceId, QModbusDataUnit::RegisterType type, quint16 addr, const IncrementSimulationParams& params);
56+
void decrementSimailation(DataDisplayMode mode, quint8 deviceId, QModbusDataUnit::RegisterType type, quint16 addr, const DecrementSimulationParams& params);
57+
void toggleSimulation(quint8 deviceId, QModbusDataUnit::RegisterType type, quint16 addr);
4458

4559
private:
4660
QTimer _timer;
@@ -52,7 +66,37 @@ private slots:
5266
ModbusSimulationParams Params;
5367
QVariant CurrentValue;
5468
};
55-
QMap<QPair<QModbusDataUnit::RegisterType, quint16>, SimulationParams> _simulationMap;
69+
70+
QMap<ModbusSimulationMapKey, SimulationParams> _simulationMap;
5671
};
5772

73+
///
74+
/// \brief operator <<
75+
/// \param out
76+
/// \param key
77+
/// \return
78+
///
79+
inline QDataStream& operator <<(QDataStream& out, const ModbusSimulationMapKey& key)
80+
{
81+
out << key.DeviceId;
82+
out << key.Type;
83+
out << key.Address;
84+
85+
return out;
86+
}
87+
88+
///
89+
/// \brief operator >>
90+
/// \param in
91+
/// \param params
92+
/// \return
93+
///
94+
inline QDataStream& operator >>(QDataStream& in, ModbusSimulationMapKey& key)
95+
{
96+
in >> key.DeviceId;
97+
in >> key.Type;
98+
in >> key.Address;
99+
return in;
100+
}
101+
58102
#endif // DATASIMULATOR_H

0 commit comments

Comments
 (0)