Skip to content

Commit 9cd9d76

Browse files
committed
Correct script running with device id
1 parent 9d627a9 commit 9cd9d76

6 files changed

Lines changed: 77 additions & 7 deletions

File tree

omodsim/controls/scriptcontrol.ui

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,10 @@
4747
</property>
4848
<property name="plainText">
4949
<string>Script.onInit(()=&gt;{
50+
let deviceId = 1;
51+
let address = 1;
5052
Server.addressBase = AddressBase.Base1;
51-
Server.onChange(1/* deviceId */, Register.Holding, 1, (value)=&gt;
53+
Server.onChange(deviceId, Register.Holding, address, (value)=&gt;
5254
{
5355
/* write your code on register value change */
5456
});

omodsim/jsobjects/server.cpp

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ Server::Server(ModbusMultiServer* server, const ByteOrder* order, AddressBase ba
3030
Q_ASSERT(_mbMultiServer != nullptr);
3131

3232
connect(_mbMultiServer, &ModbusMultiServer::dataChanged, this, &Server::on_dataChanged);
33+
connect(_mbMultiServer, &ModbusMultiServer::errorOccured, this, &Server::on_errorOccured);
3334
}
3435

3536
///
@@ -367,6 +368,19 @@ void Server::onChange(quint8 deviceId, Register::Type reg, quint16 address, cons
367368
_mapOnChange[{deviceId, reg, address}] = func;
368369
}
369370

371+
///
372+
/// \brief Server::onError
373+
/// \param deviceId
374+
/// \param func
375+
///
376+
void Server::onError(quint8 deviceId, const QJSValue& func)
377+
{
378+
if(!func.isCallable())
379+
return;
380+
381+
_mapOnError[deviceId] = func;
382+
}
383+
370384
///
371385
/// \brief Server::on_dataChanged
372386
/// \param data
@@ -383,3 +397,16 @@ void Server::on_dataChanged(quint8 deviceId, const QModbusDataUnit& data)
383397
}
384398
}
385399
}
400+
401+
///
402+
/// \brief Server::on_errorOccured
403+
/// \param deviceId
404+
/// \param error
405+
///
406+
void Server::on_errorOccured(quint8 deviceId, const QString& error)
407+
{
408+
if(error.isEmpty())
409+
return;
410+
411+
_mapOnError[deviceId].call(QJSValueList() << error);
412+
}

omodsim/jsobjects/server.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,12 +80,17 @@ class Server : public QObject
8080
Q_INVOKABLE void writeDouble(Register::Type reg, quint16 address, double value, bool swapped, quint8 deviceId = 1);
8181

8282
Q_INVOKABLE void onChange(quint8 deviceId, Register::Type reg, quint16 address, const QJSValue& func);
83+
Q_INVOKABLE void onError(quint8 deviceId, const QJSValue& func);
84+
85+
signals:
86+
void errorOccured(quint8 deviceId, const QString& error);
8387

8488
public slots:
8589
void setAddressBase(Address::Base base);
8690
void setUseGlobalUnitMap(bool value);
8791

8892
private slots:
93+
void on_errorOccured(quint8 deviceId, const QString& error);
8994
void on_dataChanged(quint8 deviceId, const QModbusDataUnit& data);
9095

9196
private:
@@ -101,6 +106,8 @@ private slots:
101106
Address::Base _addressBase;
102107
const ByteOrder* _byteOrder;
103108
ModbusMultiServer* _mbMultiServer;
109+
110+
QHash<int, QJSValue> _mapOnError;
104111
QHash<KeyOnChange, QJSValue> _mapOnChange;
105112

106113
friend uint qHash(const KeyOnChange &key, uint seed);

omodsim/mainwindow.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1501,6 +1501,15 @@ void MainWindow::loadSettings()
15011501

15021502
QSettings m(filepath, QSettings::IniFormat, this);
15031503

1504+
const bool isMaximized = m.value("WindowMaximized").toBool();
1505+
if(isMaximized) {
1506+
showMaximized();
1507+
}
1508+
else {
1509+
const auto geometry = m.value("WindowGeometry", this->geometry()).toRect();
1510+
setGeometry(geometry);
1511+
}
1512+
15041513
const auto displaybarArea = (Qt::ToolBarArea)qBound(0, m.value("DisplayBarArea", 0x4).toInt(), 0xf);
15051514
const auto displaybarBreak = m.value("DisplayBarBreak").toBool();
15061515
if(displaybarBreak) addToolBarBreak(displaybarArea);
@@ -1567,6 +1576,14 @@ void MainWindow::saveSettings()
15671576
m.clear();
15681577
m.sync();
15691578

1579+
if(isMaximized()) {
1580+
m.setValue("WindowMaximized", true);
1581+
}
1582+
else {
1583+
m.setValue("WindowMaximized", false);
1584+
m.setValue("WindowGeometry", geometry());
1585+
}
1586+
15701587
m.setValue("DisplayBarArea", toolBarArea(ui->toolBarDisplay));
15711588
m.setValue("DisplayBarBreak", toolBarBreak(ui->toolBarDisplay));
15721589
m.setValue("ScriptBarArea", toolBarArea(ui->toolBarScript));

omodsim/modbusmultiserver.cpp

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -470,14 +470,28 @@ void ModbusMultiServer::setData(quint8 deviceId, const QModbusDataUnit& data)
470470
return;
471471
}
472472

473+
if(!_modbusDataUnitMaps.contains(deviceId)) {
474+
emit errorOccured(deviceId, tr("An incorrect device id was specified (%1)").arg(deviceId));
475+
return;
476+
}
477+
473478
_modbusDataUnitMaps[deviceId].setData(data);
479+
480+
QString error;
474481
for(auto&& s : _modbusServerList)
475482
{
476483
s->blockSignals(true);
477-
s->setData(data, deviceId);
484+
485+
if(!s->setData(data, deviceId))
486+
error = s->errorString(deviceId);
487+
478488
s->blockSignals(false);
479489
}
480-
emit dataChanged(deviceId, data);
490+
491+
if(error.isEmpty())
492+
emit dataChanged(deviceId, data);
493+
else
494+
emit errorOccured(deviceId, error);
481495
}
482496

483497
///
@@ -929,14 +943,16 @@ void ModbusMultiServer::on_stateChanged(QModbusDevice::State state)
929943
///
930944
void ModbusMultiServer::on_errorOccurred(QModbusDevice::Error error, int deviceId)
931945
{
932-
if(error == QModbusDevice::ConnectionError)
933-
{
934-
auto server = qobject_cast<ModbusServer*>(sender());
935-
const auto errorString = server->errorString(deviceId);
946+
auto server = qobject_cast<ModbusServer*>(sender());
947+
const auto errorString = server->errorString(deviceId);
936948

949+
if(error == QModbusDevice::ConnectionError) {
937950
server->disconnectDevice();
938951
emit connectionError(QString(tr("Connection error. %1")).arg(errorString));
939952
}
953+
else {
954+
emit errorOccured(deviceId, errorString);
955+
}
940956
}
941957

942958
///

omodsim/modbusmultiserver.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ class ModbusMultiServer final : public QObject
7171
void request(quint8 deviceId, const QModbusRequest& req, ModbusMessage::ProtocolType protocol, int transactionId);
7272
void response(quint8 deviceId, const QModbusRequest& req, const QModbusResponse& resp, ModbusMessage::ProtocolType protocol, int transactionId);
7373
void connectionError(const QString& error);
74+
void errorOccured(quint8 deviceId, const QString& error);
7475
void dataChanged(quint8 deviceId, const QModbusDataUnit& data);
7576

7677
private slots:

0 commit comments

Comments
 (0)