Skip to content

Commit 094a85c

Browse files
author
Ананьев Александр
committed
Correct auto simulation
1 parent 7525843 commit 094a85c

7 files changed

Lines changed: 79 additions & 44 deletions

File tree

omodsim/datasimulator.cpp

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ void DataSimulator::startSimulation(DataDisplayMode mode, QModbusDataUnit::Regis
4747
}
4848

4949
_simulationMap[{ type, addr}] = { mode, params };
50+
emit dataSimulationStarted(type, addr, params);
51+
5052
resumeSimulations();
5153
}
5254

@@ -58,6 +60,7 @@ void DataSimulator::startSimulation(DataDisplayMode mode, QModbusDataUnit::Regis
5860
void DataSimulator::stopSimulation(QModbusDataUnit::RegisterType type, quint16 addr)
5961
{
6062
_simulationMap.remove({ type, addr});
63+
emit dataSimulationStopped(type, addr);
6164
}
6265

6366
///
@@ -100,6 +103,31 @@ void DataSimulator::restartSimulations()
100103
}
101104
}
102105

106+
///
107+
/// \brief DataSimulator::simulationParams
108+
/// \param type
109+
/// \param addr
110+
/// \return
111+
///
112+
ModbusSimulationParams DataSimulator::simulationParams(QModbusDataUnit::RegisterType type, quint16 addr) const
113+
{
114+
const auto it = _simulationMap.find({type, addr});
115+
return (it != _simulationMap.end()) ? it->Params : ModbusSimulationParams();
116+
}
117+
118+
///
119+
/// \brief DataSimulator::simulationMap
120+
/// \return
121+
///
122+
ModbusSimulationMap DataSimulator::simulationMap() const
123+
{
124+
ModbusSimulationMap map;
125+
for(auto&& key : _simulationMap.keys())
126+
map[key] = _simulationMap[key].Params;
127+
128+
return map;
129+
}
130+
103131
///
104132
/// \brief DataSimulator::on_timeout
105133
///

omodsim/datasimulator.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,11 @@
55
#include <QModbusDataUnit>
66
#include "modbussimulationparams.h"
77

8-
class ModbusMultiServer;
8+
typedef QMap<QPair<QModbusDataUnit::RegisterType, quint16>, ModbusSimulationParams> ModbusSimulationMap;
99

10+
///
11+
/// \brief The DataSimulator class
12+
///
1013
class DataSimulator : public QObject
1114
{
1215
Q_OBJECT
@@ -22,7 +25,12 @@ class DataSimulator : public QObject
2225
void resumeSimulations();
2326
void restartSimulations();
2427

28+
ModbusSimulationParams simulationParams(QModbusDataUnit::RegisterType type, quint16 addr) const;
29+
ModbusSimulationMap simulationMap() const;
30+
2531
signals:
32+
void dataSimulationStarted(QModbusDataUnit::RegisterType type, quint16 addr, const ModbusSimulationParams& params);
33+
void dataSimulationStopped(QModbusDataUnit::RegisterType type, quint16 addr);
2634
void dataSimulated(DataDisplayMode mode, QModbusDataUnit::RegisterType type, quint16 addr, QVariant value);
2735

2836
private slots:

omodsim/formmodsim.cpp

Lines changed: 27 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,12 @@ QVersionNumber FormModSim::VERSION = QVersionNumber(1, 1);
1717
/// \param num
1818
/// \param parent
1919
///
20-
FormModSim::FormModSim(int id, ModbusMultiServer& server, MainWindow* parent) :
20+
FormModSim::FormModSim(int id, ModbusMultiServer& server, QSharedPointer<DataSimulator> simulator, MainWindow* parent) :
2121
QWidget(parent)
2222
, ui(new Ui::FormModSim)
2323
,_formId(id)
2424
,_mbMultiServer(server)
25-
,_dataSimulator(new DataSimulator(this))
25+
,_dataSimulator(simulator)
2626
{
2727
Q_ASSERT(parent != nullptr);
2828

@@ -344,29 +344,38 @@ void FormModSim::print(QPrinter* printer)
344344
}
345345

346346
///
347-
/// \brief FormModSim::resumeSimulations
347+
/// \brief FormModSim::simulationMap
348+
/// \return
348349
///
349-
void FormModSim::resumeSimulations()
350+
ModbusSimulationMap FormModSim::simulationMap() const
350351
{
351-
_dataSimulator->resumeSimulations();
352-
}
352+
const auto dd = displayDefinition();
353+
const auto startAddr = dd.PointAddress - 1;
354+
const auto endAddr = startAddr + dd.Length;
353355

354-
///
355-
/// \brief FormModSim::pauseSimulations
356-
///
357-
void FormModSim::pauseSimulations()
358-
{
359-
_dataSimulator->pauseSimulations();
356+
ModbusSimulationMap result;
357+
const auto simulationMap = _dataSimulator->simulationMap();
358+
for(auto&& key : _dataSimulator->simulationMap().keys())
359+
{
360+
if(key.first == dd.PointType &&
361+
key.second >= startAddr && key.second < endAddr)
362+
{
363+
result[key] = simulationMap[key];
364+
}
365+
}
366+
367+
return result;
360368
}
361369

362370
///
363-
/// \brief FormModSca::restartSimulations
371+
/// \brief FormModSim::startSimulation
372+
/// \param type
373+
/// \param addr
374+
/// \param params
364375
///
365-
void FormModSim::restartSimulations()
376+
void FormModSim::startSimulation(QModbusDataUnit::RegisterType type, quint16 addr, const ModbusSimulationParams& params)
366377
{
367-
_dataSimulator->stopSimulations();
368-
for(auto&& k : _simulationMap.keys())
369-
_dataSimulator->startSimulation(dataDisplayMode(), k.first, k.second, _simulationMap[k]);
378+
_dataSimulator->startSimulation(dataDisplayMode(), type, addr, params);
370379
}
371380

372381
///
@@ -449,12 +458,9 @@ void FormModSim::onDefinitionChanged()
449458
///
450459
void FormModSim::on_outputWidget_itemDoubleClicked(quint16 addr, const QVariant& value)
451460
{
452-
if(!_mbMultiServer.isConnected())
453-
return;
454-
455461
const auto mode = dataDisplayMode();
456462
const auto pointType = ui->comboBoxModbusPointType->currentPointType();
457-
auto& simParams = _simulationMap[{pointType, addr}];
463+
auto simParams = _dataSimulator->simulationParams(pointType, addr);
458464

459465
switch(pointType)
460466
{
@@ -526,7 +532,6 @@ void FormModSim::on_mbDeviceIdChanged(quint8 deviceId)
526532
///
527533
void FormModSim::on_mbConnected(const ConnectionDetails&)
528534
{
529-
_dataSimulator->resumeSimulations();
530535
updateStatus();
531536
}
532537

@@ -535,9 +540,6 @@ void FormModSim::on_mbConnected(const ConnectionDetails&)
535540
///
536541
void FormModSim::on_mbDisconnected(const ConnectionDetails&)
537542
{
538-
if(!_mbMultiServer.isConnected())
539-
_dataSimulator->pauseSimulations();
540-
541543
updateStatus();
542544
}
543545

@@ -579,8 +581,5 @@ void FormModSim::on_mbDataChanged(const QModbusDataUnit&)
579581
///
580582
void FormModSim::on_dataSimulated(DataDisplayMode mode, QModbusDataUnit::RegisterType type, quint16 addr, QVariant value)
581583
{
582-
if(!_mbMultiServer.isConnected())
583-
return;
584-
585584
_mbMultiServer.writeRegister(type, { addr, value, mode, byteOrder() });
586585
}

omodsim/formmodsim.h

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include <QTimer>
66
#include <QPrinter>
77
#include <QVersionNumber>
8+
#include "datasimulator.h"
89
#include "modbusmultiserver.h"
910
#include "displaydefinition.h"
1011

@@ -27,7 +28,7 @@ class FormModSim : public QWidget
2728
public:
2829
static QVersionNumber VERSION;
2930

30-
explicit FormModSim(int id, ModbusMultiServer& server, MainWindow* parent);
31+
explicit FormModSim(int id, ModbusMultiServer& server, QSharedPointer<DataSimulator> simulator, MainWindow* parent);
3132
~FormModSim();
3233

3334
int formId() const { return _formId; }
@@ -66,9 +67,8 @@ class FormModSim : public QWidget
6667

6768
void print(QPrinter* painter);
6869

69-
void resumeSimulations();
70-
void pauseSimulations();
71-
void restartSimulations();
70+
ModbusSimulationMap simulationMap() const;
71+
void startSimulation(QModbusDataUnit::RegisterType type, quint16 addr, const ModbusSimulationParams& params);
7272

7373
protected:
7474
void changeEvent(QEvent* event) override;
@@ -106,7 +106,6 @@ private slots:
106106
QString _filename;
107107
ModbusMultiServer& _mbMultiServer;
108108
QSharedPointer<DataSimulator> _dataSimulator;
109-
QMap<QPair<QModbusDataUnit::RegisterType, quint16>, ModbusSimulationParams> _simulationMap;
110109
};
111110

112111
///
@@ -220,7 +219,7 @@ inline QDataStream& operator <<(QDataStream& out, const FormModSim* frm)
220219
out << dd.Length;
221220

222221
out << frm->byteOrder();
223-
out << frm->_simulationMap;
222+
out << frm->simulationMap();
224223

225224
return out;
226225
}
@@ -270,11 +269,13 @@ inline QDataStream& operator >>(QDataStream& in, FormModSim* frm)
270269
in >> dd.Length;
271270

272271
ByteOrder byteOrder = ByteOrder::LittleEndian;
272+
ModbusSimulationMap simulationMap;
273+
273274
const auto ver = frm->property("Version").value<QVersionNumber>();
274275
if(ver >= QVersionNumber(1, 1))
275276
{
276277
in >> byteOrder;
277-
in >> frm->_simulationMap;
278+
in >> simulationMap;
278279
}
279280

280281
if(in.status() != QDataStream::Ok)
@@ -294,7 +295,9 @@ inline QDataStream& operator >>(QDataStream& in, FormModSim* frm)
294295
frm->setFont(font);
295296
frm->setDisplayDefinition(dd);
296297
frm->setByteOrder(byteOrder);
297-
frm->restartSimulations();
298+
299+
for(auto&& k : simulationMap.keys())
300+
frm->startSimulation(k.first, k.second, simulationMap[k]);
298301

299302
return in;
300303
}

omodsim/mainwindow.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ MainWindow::MainWindow(QWidget *parent)
2727
,_icoBigEndian(":/res/actionBigEndian.png")
2828
,_icoLittleEndian(":/res/actionLittleEndian.png")
2929
,_windowCounter(0)
30+
,_dataSimulator(new DataSimulator(this))
3031
{
3132
ui->setupUi(this);
3233

@@ -816,7 +817,7 @@ void MainWindow::presetRegs(QModbusDataUnit::RegisterType type)
816817
///
817818
FormModSim* MainWindow::createMdiChild(int id)
818819
{
819-
auto frm = new FormModSim(id, _mbMultiServer, this);
820+
auto frm = new FormModSim(id, _mbMultiServer, _dataSimulator, this);
820821
auto wnd = ui->mdiArea->addSubWindow(frm);
821822
wnd->installEventFilter(this);
822823
wnd->setAttribute(Qt::WA_DeleteOnClose, true);

omodsim/mainwindow.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@ private slots:
131131
WindowActionList* _windowActionList;
132132
RecentFileActionList* _recentFileActionList;
133133
QSharedPointer<QPrinter> _selectedPrinter;
134+
QSharedPointer<DataSimulator> _dataSimulator;
134135
};
135136

136137
#endif // MAINWINDOW_H

omodsim/modbusmultiserver.h

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
#include <QObject>
55
#include <QModbusServer>
66
#include <QModbusTcpServer>
7-
#include "datasimulator.h"
87
#include "modbusdataunitmap.h"
98
#include "modbuswriteparams.h"
109
#include "connectiondetails.h"
@@ -113,18 +112,14 @@ class ModbusMultiServer final : public QObject
113112
void setData(const QModbusDataUnit& data);
114113

115114
void writeValue(QModbusDataUnit::RegisterType pointType, quint16 pointAddress, quint16 value, ByteOrder order);
115+
void writeRegister(QModbusDataUnit::RegisterType pointType, const ModbusWriteParams& params);
116116

117117
float readFloat(QModbusDataUnit::RegisterType pointType, quint16 pointAddress, ByteOrder order, bool swapped);
118118
void writeFloat(QModbusDataUnit::RegisterType pointType, quint16 pointAddress, float value, ByteOrder order, bool swapped);
119119

120120
double readDouble(QModbusDataUnit::RegisterType pointType, quint16 pointAddress, ByteOrder order, bool swapped);
121121
void writeDouble(QModbusDataUnit::RegisterType pointType, quint16 pointAddress, double value, ByteOrder order, bool swapped);
122122

123-
void writeRegister(QModbusDataUnit::RegisterType pointType, const ModbusWriteParams& params);
124-
void simulateRegister(DataDisplayMode mode, QModbusDataUnit::RegisterType pointType, quint16 pointAddress, const ModbusSimulationParams& params);
125-
void stopSimulation(QModbusDataUnit::RegisterType pointType, quint16 pointAddress);
126-
void stopSimulations();
127-
128123
signals:
129124
void connected(const ConnectionDetails& cd);
130125
void disconnected(const ConnectionDetails& cd);

0 commit comments

Comments
 (0)