From c1d190c0367ea9ca96d8bef1d4dc14b268b11df5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20St=C3=BCrz?= Date: Mon, 1 Aug 2022 13:23:31 +0200 Subject: [PATCH] Update test reachability mechanism and fix init return if not reachable --- .../tools/connectiontool/modbusrtu.py | 31 +++++++++++------- .../tools/connectiontool/modbustcp.py | 32 ++++++++++++------- libnymea-modbus/tools/generate-connection.py | 14 ++++---- 3 files changed, 49 insertions(+), 28 deletions(-) diff --git a/libnymea-modbus/tools/connectiontool/modbusrtu.py b/libnymea-modbus/tools/connectiontool/modbusrtu.py index 8783185..030cb6b 100644 --- a/libnymea-modbus/tools/connectiontool/modbusrtu.py +++ b/libnymea-modbus/tools/connectiontool/modbusrtu.py @@ -267,32 +267,37 @@ def writeInternalBlockReadMethodImplementationsRtu(fileDescriptor, className, bl ############################################################## -def writeVerifyReachabilityImplementationsRtu(fileDescriptor, className, registerDefinitions, checkReachableRegister): +def writeTestReachabilityImplementationsRtu(fileDescriptor, className, registerDefinitions, checkReachableRegister): propertyName = checkReachableRegister['id'] propertyTyp = getCppDataType(checkReachableRegister) - writeLine(fileDescriptor, 'void %s::verifyReachability()' % (className)) + writeLine(fileDescriptor, 'void %s::testReachability()' % (className)) writeLine(fileDescriptor, '{') + writeLine(fileDescriptor, ' if (m_testRechableReply)') + writeLine(fileDescriptor, ' return;') + writeLine(fileDescriptor) writeLine(fileDescriptor, ' // Try to read the check reachability register %s in order to verify if the communication is working or not.' % checkReachableRegister['id']) - writeLine(fileDescriptor, ' qCDebug(dc%s()) << "--> Verify reachability by reading \\"%s\\" register:" << %s << "size:" << %s;' % (className, checkReachableRegister['description'], checkReachableRegister['address'], checkReachableRegister['size'])) - writeLine(fileDescriptor, ' ModbusRtuReply *reply = read%s();' % (propertyName[0].upper() + propertyName[1:])) - writeLine(fileDescriptor, ' if (!reply) {') + writeLine(fileDescriptor, ' qCDebug(dc%s()) << "--> Test reachability by reading \\"%s\\" register:" << %s << "size:" << %s;' % (className, checkReachableRegister['description'], checkReachableRegister['address'], checkReachableRegister['size'])) + writeLine(fileDescriptor, ' m_testRechableReply = read%s();' % (propertyName[0].upper() + propertyName[1:])) + writeLine(fileDescriptor, ' if (!m_testRechableReply) {') writeLine(fileDescriptor, ' qCDebug(dc%s()) << "Error occurred verifying reachability by reading \\"%s\\" register";' % (className, checkReachableRegister['description'])) writeLine(fileDescriptor, ' return;') writeLine(fileDescriptor, ' }') writeLine(fileDescriptor) - writeLine(fileDescriptor, ' if (reply->isFinished()) {') + writeLine(fileDescriptor, ' if (m_testRechableReply->isFinished()) {') + writeLine(fileDescriptor, ' m_testRechableReply = nullptr;') writeLine(fileDescriptor, ' return;') writeLine(fileDescriptor, ' }') writeLine(fileDescriptor) - writeLine(fileDescriptor, ' connect(reply, &ModbusRtuReply::finished, this, [this, reply](){') + writeLine(fileDescriptor, ' connect(m_testRechableReply, &ModbusRtuReply::finished, this, [this, m_testRechableReply](){') writeLine(fileDescriptor, ' // Note: we don\'t care about the result here, only the error') - writeLine(fileDescriptor, ' handleModbusError(reply->error());') + writeLine(fileDescriptor, ' handleModbusError(m_testRechableReply->error());') + writeLine(fileDescriptor, ' m_testRechableReply = nullptr;') writeLine(fileDescriptor, ' });') writeLine(fileDescriptor) - writeLine(fileDescriptor, ' connect(reply, &ModbusRtuReply::errorOccurred, this, [reply] (ModbusRtuReply::Error error){') - writeLine(fileDescriptor, ' qCDebug(dc%s()) << "ModbusRtu reply error occurred while verifying reachability by reading \\"%s\\" register" << error << reply->errorString();' % (className, checkReachableRegister['description'])) + writeLine(fileDescriptor, ' connect(m_testRechableReply, &ModbusRtuReply::errorOccurred, this, [this] (ModbusRtuReply::Error error){') + writeLine(fileDescriptor, ' qCDebug(dc%s()) << "ModbusRtu reply error occurred while verifying reachability by reading \\"%s\\" register" << error << m_testRechableReply->errorString();' % (className, checkReachableRegister['description'])) writeLine(fileDescriptor, ' });') writeLine(fileDescriptor, '}') writeLine(fileDescriptor) @@ -302,6 +307,10 @@ def writeVerifyReachabilityImplementationsRtu(fileDescriptor, className, registe def writeInitMethodImplementationRtu(fileDescriptor, className, registerDefinitions, blockDefinitions): writeLine(fileDescriptor, 'bool %s::initialize()' % (className)) writeLine(fileDescriptor, '{') + writeLine(fileDescriptor, ' if (!m_reachable) {') + writeLine(fileDescriptor, ' qCWarning(dc%s()) << "Tried to initialize but the device is not to be reachable.";' % className) + writeLine(fileDescriptor, ' return false;') + writeLine(fileDescriptor, ' }') # First check if there are any init registers initRequired = False @@ -470,7 +479,7 @@ def writeUpdateMethodRtu(fileDescriptor, className, registerDefinitions, blockDe writeLine(fileDescriptor, ' // Hardware resource available but communication not working. ') writeLine(fileDescriptor, ' // Try to read the check reachability register to re-evaluatoe the communication... ') writeLine(fileDescriptor, ' if (m_modbusRtuMaster->connected() && !m_communicationWorking) {') - writeLine(fileDescriptor, ' verifyReachability();') + writeLine(fileDescriptor, ' testReachability();') writeLine(fileDescriptor, ' return false;') writeLine(fileDescriptor, ' }') writeLine(fileDescriptor) diff --git a/libnymea-modbus/tools/connectiontool/modbustcp.py b/libnymea-modbus/tools/connectiontool/modbustcp.py index 35e117c..8cc8ab2 100644 --- a/libnymea-modbus/tools/connectiontool/modbustcp.py +++ b/libnymea-modbus/tools/connectiontool/modbustcp.py @@ -269,33 +269,39 @@ def writeInternalBlockReadMethodImplementationsTcp(fileDescriptor, className, bl ############################################################## -def writeVerifyReachabilityImplementationsTcp(fileDescriptor, className, registerDefinitions, checkReachableRegister): +def writeTestReachabilityImplementationsTcp(fileDescriptor, className, registerDefinitions, checkReachableRegister): propertyName = checkReachableRegister['id'] propertyTyp = getCppDataType(checkReachableRegister) - writeLine(fileDescriptor, 'void %s::verifyReachability()' % (className)) + writeLine(fileDescriptor, 'void %s::testReachability()' % (className)) writeLine(fileDescriptor, '{') + writeLine(fileDescriptor, ' if (m_testRechableReply)') + writeLine(fileDescriptor, ' return;') + writeLine(fileDescriptor) writeLine(fileDescriptor, ' // Try to read the check reachability register %s in order to verify if the communication is working or not.' % checkReachableRegister['id']) - writeLine(fileDescriptor, ' qCDebug(dc%s()) << "--> Verify reachability by reading \\"%s\\" register:" << %s << "size:" << %s;' % (className, checkReachableRegister['description'], checkReachableRegister['address'], checkReachableRegister['size'])) - writeLine(fileDescriptor, ' QModbusReply *reply = read%s();' % (propertyName[0].upper() + propertyName[1:])) - writeLine(fileDescriptor, ' if (!reply) {') + writeLine(fileDescriptor, ' qCDebug(dc%s()) << "--> Test reachability by reading \\"%s\\" register:" << %s << "size:" << %s;' % (className, checkReachableRegister['description'], checkReachableRegister['address'], checkReachableRegister['size'])) + writeLine(fileDescriptor, ' m_testRechableReply = read%s();' % (propertyName[0].upper() + propertyName[1:])) + writeLine(fileDescriptor, ' if (!m_testRechableReply) {') writeLine(fileDescriptor, ' qCDebug(dc%s()) << "Error occurred verifying reachability by reading \\"%s\\" register";' % (className, checkReachableRegister['description'])) writeLine(fileDescriptor, ' return;') writeLine(fileDescriptor, ' }') writeLine(fileDescriptor) - writeLine(fileDescriptor, ' if (reply->isFinished()) {') - writeLine(fileDescriptor, ' reply->deleteLater(); // Broadcast reply returns immediatly') + writeLine(fileDescriptor, ' if (m_testRechableReply->isFinished()) {') + writeLine(fileDescriptor, ' m_testRechableReply->deleteLater(); // Broadcast reply returns immediatly') + writeLine(fileDescriptor, ' m_testRechableReply = nullptr;') writeLine(fileDescriptor, ' return;') writeLine(fileDescriptor, ' }') writeLine(fileDescriptor) - writeLine(fileDescriptor, ' connect(reply, &QModbusReply::finished, this, [this, reply](){') + writeLine(fileDescriptor, ' connect(m_testRechableReply, &QModbusReply::finished, this, [this](){') writeLine(fileDescriptor, ' // Note: we don\'t care about the result here, only the error') - writeLine(fileDescriptor, ' handleModbusError(reply->error());') + writeLine(fileDescriptor, ' handleModbusError(m_testRechableReply->error());') + writeLine(fileDescriptor, ' m_testRechableReply->deleteLater();') + writeLine(fileDescriptor, ' m_testRechableReply = nullptr;') writeLine(fileDescriptor, ' });') writeLine(fileDescriptor) - writeLine(fileDescriptor, ' connect(reply, &QModbusReply::errorOccurred, this, [reply] (QModbusDevice::Error error){') - writeLine(fileDescriptor, ' qCDebug(dc%s()) << "ModbusRtu reply error occurred while verifying reachability by reading \\"%s\\" register" << error << reply->errorString();' % (className, checkReachableRegister['description'])) + writeLine(fileDescriptor, ' connect(m_testRechableReply, &QModbusReply::errorOccurred, this, [this] (QModbusDevice::Error error){') + writeLine(fileDescriptor, ' qCDebug(dc%s()) << "Modbus reply error occurred while verifying reachability by reading \\"%s\\" register" << error << m_testRechableReply->errorString();' % (className, checkReachableRegister['description'])) writeLine(fileDescriptor, ' });') writeLine(fileDescriptor, '}') writeLine(fileDescriptor) @@ -305,6 +311,10 @@ def writeVerifyReachabilityImplementationsTcp(fileDescriptor, className, registe def writeInitMethodImplementationTcp(fileDescriptor, className, registerDefinitions, blockDefinitions): writeLine(fileDescriptor, 'bool %s::initialize()' % (className)) writeLine(fileDescriptor, '{') + writeLine(fileDescriptor, ' if (!m_reachable) {') + writeLine(fileDescriptor, ' qCWarning(dc%s()) << "Tried to initialize but the device is not to be reachable.";' % className) + writeLine(fileDescriptor, ' return false;') + writeLine(fileDescriptor, ' }') # First check if there are any init registers initRequired = False diff --git a/libnymea-modbus/tools/generate-connection.py b/libnymea-modbus/tools/generate-connection.py index 255032a..0156fad 100644 --- a/libnymea-modbus/tools/generate-connection.py +++ b/libnymea-modbus/tools/generate-connection.py @@ -153,9 +153,10 @@ def writeTcpHeaderFile(): writeLine(headerFile) writeLine(headerFile, ' void verifyUpdateFinished();') writeLine(headerFile) + writeLine(headerFile, ' QModbusReply *m_testRechableReply = nullptr;') writeLine(headerFile, ' void handleModbusError(QModbusDevice::Error error);') writeLine(headerFile, ' void evaluateReachableState();') - writeLine(headerFile, ' void verifyReachability();') + writeLine(headerFile, ' void testReachability();') # End of class writeLine(headerFile) @@ -192,7 +193,7 @@ def writeTcpSourceFile(): writeLine(sourceFile, ' m_pendingUpdateReplies.clear();') writeLine(sourceFile, ' m_communicationWorking = false;') writeLine(sourceFile, ' m_communicationFailedCounter = 0;') - writeLine(sourceFile, ' verifyReachability();') + writeLine(sourceFile, ' testReachability();') writeLine(sourceFile, ' } else {') writeLine(sourceFile, ' qCWarning(dc%s()) << "Modbus TCP connection diconnected from" << m_hostAddress.toString() << ". The connection is not reachable any more.";' % (className)) writeLine(sourceFile, ' m_communicationWorking = false;') @@ -328,7 +329,7 @@ def writeTcpSourceFile(): writeLine(sourceFile, '}') writeLine(sourceFile) - writeVerifyReachabilityImplementationsTcp(sourceFile, className, registerJson['registers'], checkReachableRegister) + writeTestReachabilityImplementationsTcp(sourceFile, className, registerJson['registers'], checkReachableRegister) # Write the debug print @@ -474,9 +475,10 @@ def writeRtuHeaderFile(): writeLine(headerFile) writeLine(headerFile, ' void verifyUpdateFinished();') writeLine(headerFile) + writeLine(headerFile, ' ModbusRtuReply *m_testRechableReply = nullptr;') writeLine(headerFile, ' void handleModbusError(ModbusRtuReply::Error error);') writeLine(headerFile, ' void evaluateReachableState();') - writeLine(headerFile, ' void verifyReachability();') + writeLine(headerFile, ' void testReachability();') # End of class @@ -515,7 +517,7 @@ def writeRtuSourceFile(): writeLine(sourceFile, ' m_pendingUpdateReplies.clear();') writeLine(sourceFile, ' m_communicationWorking = false;') writeLine(sourceFile, ' m_communicationFailedCounter = 0;') - writeLine(sourceFile, ' verifyReachability();') + writeLine(sourceFile, ' testReachability();') writeLine(sourceFile, ' } else {') writeLine(sourceFile, ' qCWarning(dc%s()) << "Modbus RTU resource" << m_modbusRtuMaster->serialPort() << "disconnected. The connection is not reachable any more.";' % (className)) writeLine(sourceFile, ' m_communicationWorking = false;') @@ -662,7 +664,7 @@ def writeRtuSourceFile(): writeLine(sourceFile, '}') writeLine(sourceFile) - writeVerifyReachabilityImplementationsRtu(sourceFile, className, registerJson['registers'], checkReachableRegister) + writeTestReachabilityImplementationsRtu(sourceFile, className, registerJson['registers'], checkReachableRegister) # Write the debug print debugObjectParamName = className[0].lower() + className[1:]