Update test reachability mechanism and fix init return if not reachable

master
Simon Stürz 2022-08-01 13:23:31 +02:00
parent f32b62ff77
commit c1d190c036
3 changed files with 49 additions and 28 deletions

View File

@ -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)

View File

@ -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

View File

@ -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:]