Merge PR #46: Update modbus connection generate tool

pull/63/head
Jenkins nymea 2022-03-23 13:25:31 +01:00
commit c529feed12
1 changed files with 266 additions and 76 deletions

View File

@ -1,6 +1,6 @@
#!/usr/bin/env python3
# Copyright (C) 2021 nymea GmbH <developer@nymea.io>
# Copyright (C) 2021 - 2022 nymea GmbH <developer@nymea.io>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
@ -111,6 +111,54 @@ def writeLicenseHeader(fileDescriptor):
writeLine(fileDescriptor)
def writeRegistersEnum(fileDescriptor, registerJson):
print('Writing enum for all registers')
registerEnums = {}
# Read all register names and addresses
if 'blocks' in registerJson:
for blockDefinition in registerJson['blocks']:
blockRegisters = blockDefinition['registers']
for blockRegister in blockRegisters:
registerName = blockRegister['id']
registerAddress = blockRegister['address']
registerEnums[registerAddress] = registerName
for registerDefinition in registerJson['registers']:
registerName = registerDefinition['id']
registerAddress = registerDefinition['address']
registerEnums[registerAddress] = registerName
# Sort the enum map
registersKeys = registerEnums.keys()
sortedRegistersKeys = sorted(registersKeys)
sortedRegisterEnumList = []
print('Sorted registers')
for registerAddress in sortedRegistersKeys:
print('--> %s : %s' % (registerAddress, registerEnums[registerAddress]))
enumData = {}
enumData['key'] = registerEnums[registerAddress]
enumData['value'] = registerAddress
sortedRegisterEnumList.append(enumData)
enumName = 'Registers'
writeLine(fileDescriptor, ' enum %s {' % enumName)
for i in range(len(sortedRegisterEnumList)):
enumData = sortedRegisterEnumList[i]
line = (' Register%s = %s' % (enumData['key'][0].upper() + enumData['key'][1:] , enumData['value']))
if i < (len(sortedRegisterEnumList) - 1):
line += ','
writeLine(fileDescriptor, line)
writeLine(fileDescriptor, ' };')
writeLine(fileDescriptor, ' Q_ENUM(%s)' % enumName)
writeLine(fileDescriptor)
def writeEnumDefinition(fileDescriptor, enumDefinition):
print('Writing enum', enumDefinition)
enumName = enumDefinition['name']
@ -282,7 +330,7 @@ def getValueConversionMethod(registerDefinition):
return ('ModbusDataUtils::convertToString(values)')
def writePropertyGetSetMethodDeclarations(fileDescriptor, registerDefinitions):
def writePropertyGetSetMethodDeclarationsTcp(fileDescriptor, registerDefinitions):
for registerDefinition in registerDefinitions:
propertyName = registerDefinition['id']
propertyTyp = getCppDataType(registerDefinition)
@ -300,6 +348,38 @@ def writePropertyGetSetMethodDeclarations(fileDescriptor, registerDefinitions):
writeLine(fileDescriptor)
def writePropertyGetSetMethodDeclarationsRtu(fileDescriptor, registerDefinitions):
for registerDefinition in registerDefinitions:
propertyName = registerDefinition['id']
propertyTyp = getCppDataType(registerDefinition)
if 'unit' in registerDefinition and registerDefinition['unit'] != '':
writeLine(fileDescriptor, ' /* %s [%s] - Address: %s, Size: %s */' % (registerDefinition['description'], registerDefinition['unit'], registerDefinition['address'], registerDefinition['size']))
else:
writeLine(fileDescriptor, ' /* %s - Address: %s, Size: %s */' % (registerDefinition['description'], registerDefinition['address'], registerDefinition['size']))
writeLine(fileDescriptor, ' %s %s() const;' % (propertyTyp, propertyName))
# Check if we require a set method
if registerDefinition['access'] == 'RW' or registerDefinition['access'] == 'WO':
writeLine(fileDescriptor, ' ModbusRtuReply *set%s(%s %s);' % (propertyName[0].upper() + propertyName[1:], propertyTyp, propertyName))
writeLine(fileDescriptor)
def writeBlockGetMethodDeclarations(fileDescriptor, registerDefinitions):
for registerDefinition in registerDefinitions:
propertyName = registerDefinition['id']
propertyTyp = getCppDataType(registerDefinition)
if 'unit' in registerDefinition and registerDefinition['unit'] != '':
writeLine(fileDescriptor, ' /* %s [%s] - Address: %s, Size: %s */' % (registerDefinition['description'], registerDefinition['unit'], registerDefinition['address'], registerDefinition['size']))
else:
writeLine(fileDescriptor, ' /* %s - Address: %s, Size: %s */' % (registerDefinition['description'], registerDefinition['address'], registerDefinition['size']))
writeLine(fileDescriptor, ' %s %s() const;' % (propertyTyp, propertyName))
writeLine(fileDescriptor)
def writePropertyGetSetMethodImplementationsTcp(fileDescriptor, className, registerDefinitions):
for registerDefinition in registerDefinitions:
propertyName = registerDefinition['id']
@ -424,7 +504,7 @@ def writeBlocksUpdateMethodDeclarations(fileDescriptor, blockDefinitions):
blockRegisters = blockDefinition['registers']
# Write the property get / set methods for the block registers
writePropertyGetSetMethodDeclarations(fileDescriptor, blockRegisters)
writeBlockGetMethodDeclarations(fileDescriptor, blockRegisters)
blockStartAddress = 0
blockSize = 0
@ -602,7 +682,78 @@ def writeBlockUpdateMethodImplementationsRtu(fileDescriptor, className, blockDef
writeLine(fileDescriptor)
def writeBlockUpdateMethodImplementationsTcp(fileDescriptor, className, blockDefinitions):
for blockDefinition in blockDefinitions:
blockName = blockDefinition['id']
blockRegisters = blockDefinition['registers']
blockStartAddress = 0
registerCount = 0
blockSize = 0
registerType = ""
for i, blockRegister in enumerate(blockRegisters):
if i == 0:
blockStartAddress = blockRegister['address']
registerType = blockRegister['registerType']
registerCount += 1
blockSize += blockRegister['size']
writeLine(fileDescriptor, 'void %s::update%sBlock()' % (className, blockName[0].upper() + blockName[1:]))
writeLine(fileDescriptor, '{')
writeLine(fileDescriptor, ' // Update register block \"%s\"' % blockName)
writeLine(fileDescriptor, ' qCDebug(dc%s()) << "--> Read block \\"%s\\" registers from:" << %s << "size:" << %s;' % (className, blockName, blockStartAddress, blockSize))
# Build request depending on the register type
# Build request depending on the register type
if registerType == 'inputRegister':
writeLine(fileDescriptor, ' QModbusDataUnit request = QModbusDataUnit(QModbusDataUnit::RegisterType::InputRegisters, %s, %s);' % (blockStartAddress, blockSize))
elif registerType == 'discreteInputs':
writeLine(fileDescriptor, ' QModbusDataUnit request = QModbusDataUnit(QModbusDataUnit::RegisterType::DiscreteInputs, %s, %s);' % (blockStartAddress, blockSize))
elif registerType == 'coils':
writeLine(fileDescriptor, ' QModbusDataUnit request = QModbusDataUnit(QModbusDataUnit::RegisterType::Coils, %s, %s);' % (blockStartAddress, blockSize))
else:
#Default to holdingRegister
writeLine(fileDescriptor, ' QModbusDataUnit request = QModbusDataUnit(QModbusDataUnit::RegisterType::HoldingRegisters, %s, %s);' % (blockStartAddress, blockSize))
writeLine(fileDescriptor, ' QModbusReply *reply = sendReadRequest(request, m_slaveId);')
writeLine(fileDescriptor, ' if (reply) {')
writeLine(fileDescriptor, ' if (!reply->isFinished()) {')
writeLine(fileDescriptor, ' connect(reply, &QModbusReply::finished, this, [this, reply](){')
writeLine(fileDescriptor, ' if (reply->error() == QModbusDevice::NoError) {')
writeLine(fileDescriptor, ' const QModbusDataUnit unit = reply->result();')
writeLine(fileDescriptor, ' const QVector<quint16> blockValues = unit.values();')
writeLine(fileDescriptor, ' QVector<quint16> values;')
writeLine(fileDescriptor, ' qCDebug(dc%s()) << "<-- Response from reading block \\"%s\\" register" << %s << "size:" << %s << blockValues;' % (className, blockName, blockStartAddress, blockSize))
# Start parsing the registers using offsets
offset = 0
for i, blockRegister in enumerate(blockRegisters):
propertyName = blockRegister['id']
propertyTyp = getCppDataType(blockRegister)
writeLine(fileDescriptor, ' values = blockValues.mid(%s, %s);' % (offset, blockRegister['size']))
writeLine(fileDescriptor, ' %s received%s = %s;' % (propertyTyp, propertyName[0].upper() + propertyName[1:], getValueConversionMethod(blockRegister)))
writeLine(fileDescriptor, ' if (m_%s != received%s) {' % (propertyName, propertyName[0].upper() + propertyName[1:]))
writeLine(fileDescriptor, ' m_%s = received%s;' % (propertyName, propertyName[0].upper() + propertyName[1:]))
writeLine(fileDescriptor, ' emit %sChanged(m_%s);' % (propertyName, propertyName))
writeLine(fileDescriptor, ' }')
writeLine(fileDescriptor)
offset += blockRegister['size']
writeLine(fileDescriptor, ' }')
writeLine(fileDescriptor, ' });')
writeLine(fileDescriptor)
writeLine(fileDescriptor, ' connect(reply, &QModbusReply::errorOccurred, this, [reply] (QModbusDevice::Error error){')
writeLine(fileDescriptor, ' qCWarning(dc%s()) << "Modbus reply error occurred while updating block \\"%s\\" registers" << error << reply->errorString();' % (className, blockName))
writeLine(fileDescriptor, ' emit reply->finished();')
writeLine(fileDescriptor, ' });')
writeLine(fileDescriptor, ' }')
writeLine(fileDescriptor, ' } else {')
writeLine(fileDescriptor, ' qCWarning(dc%s()) << "Error occurred while reading block \\"%s\\" registers";' % (className, blockName))
writeLine(fileDescriptor, ' }')
writeLine(fileDescriptor, '}')
writeLine(fileDescriptor)
def writeInternalPropertyReadMethodDeclarationsTcp(fileDescriptor, registerDefinitions):
for registerDefinition in registerDefinitions:
@ -692,51 +843,56 @@ def writeInitializeMethod(fileDescriptor, className, registerDefinitions):
break
if initRequired:
# FIXME: distinguish between RTU and TCP
writeLine(fileDescriptor, ' QModbusReply *reply = nullptr;')
writeLine(fileDescriptor)
writeLine(fileDescriptor, ' if (!m_pendingInitReplies.isEmpty()) {')
writeLine(fileDescriptor, ' qCWarning(dc%s()) << "Tried to initialize but there are still some init replies pending.";' % className)
writeLine(fileDescriptor, ' return;')
writeLine(fileDescriptor, ' }')
if protocol == 'TCP':
# Init implementation for TCP
writeLine(fileDescriptor, ' QModbusReply *reply = nullptr;')
writeLine(fileDescriptor)
writeLine(fileDescriptor, ' if (!m_pendingInitReplies.isEmpty()) {')
writeLine(fileDescriptor, ' qCWarning(dc%s()) << "Tried to initialize but there are still some init replies pending.";' % className)
writeLine(fileDescriptor, ' return;')
writeLine(fileDescriptor, ' }')
for registerDefinition in registerDefinitions:
propertyName = registerDefinition['id']
propertyTyp = getCppDataType(registerDefinition)
for registerDefinition in registerDefinitions:
propertyName = registerDefinition['id']
propertyTyp = getCppDataType(registerDefinition)
if 'readSchedule' in registerDefinition and registerDefinition['readSchedule'] == 'init':
writeLine(fileDescriptor)
writeLine(fileDescriptor, ' // Read %s' % registerDefinition['description'])
writeLine(fileDescriptor, ' reply = read%s();' % (propertyName[0].upper() + propertyName[1:]))
writeLine(fileDescriptor, ' if (reply) {')
writeLine(fileDescriptor, ' if (!reply->isFinished()) {')
writeLine(fileDescriptor, ' m_pendingInitReplies.append(reply);')
writeLine(fileDescriptor, ' connect(reply, &QModbusReply::finished, reply, &QModbusReply::deleteLater);')
writeLine(fileDescriptor, ' connect(reply, &QModbusReply::finished, this, [this, reply](){')
writeLine(fileDescriptor, ' if (reply->error() == QModbusDevice::NoError) {')
writeLine(fileDescriptor, ' const QModbusDataUnit unit = reply->result();')
writeLine(fileDescriptor, ' %s received%s = %s;' % (propertyTyp, propertyName[0].upper() + propertyName[1:], getValueConversionMethod(registerDefinition)))
writeLine(fileDescriptor, ' if (m_%s != received%s) {' % (propertyName, propertyName[0].upper() + propertyName[1:]))
writeLine(fileDescriptor, ' m_%s = received%s;' % (propertyName, propertyName[0].upper() + propertyName[1:]))
writeLine(fileDescriptor, ' emit %sChanged(m_%s);' % (propertyName, propertyName))
writeLine(fileDescriptor, ' }')
writeLine(fileDescriptor, ' }')
writeLine(fileDescriptor)
writeLine(fileDescriptor, ' m_pendingInitReplies.removeAll(reply);')
writeLine(fileDescriptor, ' verifyInitFinished();')
writeLine(fileDescriptor, ' });')
writeLine(fileDescriptor)
writeLine(fileDescriptor, ' connect(reply, &QModbusReply::errorOccurred, this, [this, reply] (QModbusDevice::Error error){')
writeLine(fileDescriptor, ' qCWarning(dc%s()) << "Modbus reply error occurred while reading \\"%s\\" registers from" << hostAddress().toString() << error << reply->errorString();' % (className, registerDefinition['description']))
writeLine(fileDescriptor, ' emit reply->finished(); // To make sure it will be deleted')
writeLine(fileDescriptor, ' });')
writeLine(fileDescriptor, ' } else {')
writeLine(fileDescriptor, ' delete reply; // Broadcast reply returns immediatly')
writeLine(fileDescriptor, ' }')
writeLine(fileDescriptor, ' } else {')
writeLine(fileDescriptor, ' qCWarning(dc%s()) << "Error occurred while reading \\"%s\\" registers from" << hostAddress().toString() << errorString();' % (className, registerDefinition['description']))
writeLine(fileDescriptor, ' }')
if 'readSchedule' in registerDefinition and registerDefinition['readSchedule'] == 'init':
writeLine(fileDescriptor)
writeLine(fileDescriptor, ' // Read %s' % registerDefinition['description'])
writeLine(fileDescriptor, ' reply = read%s();' % (propertyName[0].upper() + propertyName[1:]))
writeLine(fileDescriptor, ' if (reply) {')
writeLine(fileDescriptor, ' if (!reply->isFinished()) {')
writeLine(fileDescriptor, ' m_pendingInitReplies.append(reply);')
writeLine(fileDescriptor, ' connect(reply, &QModbusReply::finished, reply, &QModbusReply::deleteLater);')
writeLine(fileDescriptor, ' connect(reply, &QModbusReply::finished, this, [this, reply](){')
writeLine(fileDescriptor, ' if (reply->error() == QModbusDevice::NoError) {')
writeLine(fileDescriptor, ' const QModbusDataUnit unit = reply->result();')
writeLine(fileDescriptor, ' const QVector<quint16> values = unit.values();')
writeLine(fileDescriptor, ' %s received%s = %s;' % (propertyTyp, propertyName[0].upper() + propertyName[1:], getValueConversionMethod(registerDefinition)))
writeLine(fileDescriptor, ' if (m_%s != received%s) {' % (propertyName, propertyName[0].upper() + propertyName[1:]))
writeLine(fileDescriptor, ' m_%s = received%s;' % (propertyName, propertyName[0].upper() + propertyName[1:]))
writeLine(fileDescriptor, ' emit %sChanged(m_%s);' % (propertyName, propertyName))
writeLine(fileDescriptor, ' }')
writeLine(fileDescriptor, ' }')
writeLine(fileDescriptor)
writeLine(fileDescriptor, ' m_pendingInitReplies.removeAll(reply);')
writeLine(fileDescriptor, ' verifyInitFinished();')
writeLine(fileDescriptor, ' });')
writeLine(fileDescriptor)
writeLine(fileDescriptor, ' connect(reply, &QModbusReply::errorOccurred, this, [this, reply] (QModbusDevice::Error error){')
writeLine(fileDescriptor, ' qCWarning(dc%s()) << "Modbus reply error occurred while reading \\"%s\\" registers from" << hostAddress().toString() << error << reply->errorString();' % (className, registerDefinition['description']))
writeLine(fileDescriptor, ' emit reply->finished(); // To make sure it will be deleted')
writeLine(fileDescriptor, ' });')
writeLine(fileDescriptor, ' } else {')
writeLine(fileDescriptor, ' delete reply; // Broadcast reply returns immediatly')
writeLine(fileDescriptor, ' }')
writeLine(fileDescriptor, ' } else {')
writeLine(fileDescriptor, ' qCWarning(dc%s()) << "Error occurred while reading \\"%s\\" registers from" << hostAddress().toString() << errorString();' % (className, registerDefinition['description']))
writeLine(fileDescriptor, ' }')
else:
print('TODO: this has not been implemented yet for RTU')
exit(1)
else:
writeLine(fileDescriptor, ' // No init registers defined. Nothing to be done and we are finished.')
@ -797,6 +953,9 @@ def writeTcpHeaderFile():
# Public members
writeLine(headerFile, 'public:')
# Write enum for all register values
writeRegistersEnum(headerFile, registerJson)
# Enum declarations
if 'enums' in registerJson:
for enumDefinition in registerJson['enums']:
@ -808,10 +967,11 @@ def writeTcpHeaderFile():
writeLine(headerFile)
# Write registers get method declarations
writePropertyGetSetMethodDeclarations(headerFile, registerJson['registers'])
writePropertyGetSetMethodDeclarationsTcp(headerFile, registerJson['registers'])
# Write block get/set method declarations
writeBlocksUpdateMethodDeclarations(headerFile, registerJson['blocks'])
if 'blocks' in registerJson:
writeBlocksUpdateMethodDeclarations(headerFile, registerJson['blocks'])
# Write init and update method declarations
writeLine(headerFile, ' virtual void initialize();')
@ -826,8 +986,21 @@ def writeTcpHeaderFile():
writeLine(headerFile, ' void initializationFinished();')
writeLine(headerFile)
writePropertyChangedSignals(headerFile, registerJson['registers'])
for blockDefinition in registerJson['blocks']:
writePropertyChangedSignals(headerFile, blockDefinition['registers'])
if 'blocks' in registerJson:
for blockDefinition in registerJson['blocks']:
writePropertyChangedSignals(headerFile, blockDefinition['registers'])
writeLine(headerFile)
# Protected members
writeLine(headerFile, 'protected:')
writeInternalPropertyReadMethodDeclarationsTcp(headerFile, registerJson['registers'])
writeLine(headerFile)
writePrivatePropertyMembers(headerFile, registerJson['registers'])
if 'blocks' in registerJson:
for blockDefinition in registerJson['blocks']:
writePrivatePropertyMembers(headerFile, blockDefinition['registers'])
writeLine(headerFile)
# Private members
@ -835,14 +1008,8 @@ def writeTcpHeaderFile():
writeLine(headerFile, ' quint16 m_slaveId = 1;')
writeLine(headerFile, ' QVector<QModbusReply *> m_pendingInitReplies;')
writeLine(headerFile)
writePrivatePropertyMembers(headerFile, registerJson['registers'])
for blockDefinition in registerJson['blocks']:
writePrivatePropertyMembers(headerFile, blockDefinition['registers'])
writeLine(headerFile)
writeLine(headerFile, ' void verifyInitFinished();')
writeLine(headerFile)
writeInternalPropertyReadMethodDeclarationsTcp(headerFile, registerJson['registers'])
writeLine(headerFile)
# End of class
writeLine(headerFile)
@ -878,6 +1045,11 @@ def writeTcpSourceFile():
# Property get methods
writePropertyGetSetMethodImplementationsTcp(sourceFile, className, registerJson['registers'])
# Block property get methods
if 'blocks' in registerJson:
for blockDefinition in registerJson['blocks']:
writePropertyGetSetMethodImplementationsTcp(sourceFile, className, blockDefinition['registers'])
# Write init and update method implementation
writeInitializeMethod(sourceFile, className, registerJson['registers'])
writeUpdateMethod(sourceFile, className, registerJson['registers'])
@ -885,7 +1057,11 @@ def writeTcpSourceFile():
# Write update methods
writePropertyUpdateMethodImplementationsTcp(sourceFile, className, registerJson['registers'])
# Write property read method implementations
# Write block update method
if 'blocks' in registerJson:
writeBlockUpdateMethodImplementationsTcp(sourceFile, className, registerJson['blocks'])
# Write internal protected property read method implementations
writeInternalPropertyReadMethodImplementationsTcp(sourceFile, className, registerJson['registers'])
writeLine(sourceFile, 'void %s::verifyInitFinished()' % (className))
@ -904,8 +1080,9 @@ def writeTcpSourceFile():
writeLine(sourceFile, ' debug.nospace().noquote() << "%s(" << %s->hostAddress().toString() << ":" << %s->port() << ")" << "\\n";' % (className, debugObjectParamName, debugObjectParamName))
writeRegistersDebugLine(sourceFile, debugObjectParamName, registerJson['registers'])
for blockDefinition in registerJson['blocks']:
writeRegistersDebugLine(sourceFile, debugObjectParamName, blockDefinition['registers'])
if 'blocks' in registerJson:
for blockDefinition in registerJson['blocks']:
writeRegistersDebugLine(sourceFile, debugObjectParamName, blockDefinition['registers'])
writeLine(sourceFile, ' return debug.quote().space();')
writeLine(sourceFile, '}')
@ -938,6 +1115,9 @@ def writeRtuHeaderFile():
# Public members
writeLine(headerFile, 'public:')
# Write enum for all register values
writeRegistersEnum(headerFile, registerJson)
# Enum declarations
if 'enums' in registerJson:
for enumDefinition in registerJson['enums']:
@ -953,10 +1133,11 @@ def writeRtuHeaderFile():
writeLine(headerFile)
# Write registers get/set method declarations
writePropertyGetSetMethodDeclarations(headerFile, registerJson['registers'])
writePropertyGetSetMethodDeclarationsRtu(headerFile, registerJson['registers'])
# Write block get/set method declarations
writeBlocksUpdateMethodDeclarations(headerFile, registerJson['blocks'])
if 'blocks' in registerJson:
writeBlocksUpdateMethodDeclarations(headerFile, registerJson['blocks'])
writePropertyUpdateMethodDeclarations(headerFile, registerJson['registers'])
writeLine(headerFile)
@ -971,8 +1152,20 @@ def writeRtuHeaderFile():
writeLine(headerFile, ' void initializationFinished();')
writeLine(headerFile)
writePropertyChangedSignals(headerFile, registerJson['registers'])
for blockDefinition in registerJson['blocks']:
writePropertyChangedSignals(headerFile, blockDefinition['registers'])
if 'blocks' in registerJson:
for blockDefinition in registerJson['blocks']:
writePropertyChangedSignals(headerFile, blockDefinition['registers'])
writeLine(headerFile)
# Protected members
writeLine(headerFile, 'protected:')
writeInternalPropertyReadMethodDeclarationsRtu(headerFile, registerJson['registers'])
writeLine(headerFile)
writePrivatePropertyMembers(headerFile, registerJson['registers'])
if 'blocks' in registerJson:
for blockDefinition in registerJson['blocks']:
writePrivatePropertyMembers(headerFile, blockDefinition['registers'])
writeLine(headerFile)
# Private members
@ -980,16 +1173,9 @@ def writeRtuHeaderFile():
writeLine(headerFile, ' ModbusRtuMaster *m_modbusRtuMaster = nullptr;')
writeLine(headerFile, ' quint16 m_slaveId = 1;')
writeLine(headerFile, ' QVector<ModbusRtuReply *> m_pendingInitReplies;')
writeLine(headerFile)
writePrivatePropertyMembers(headerFile, registerJson['registers'])
for blockDefinition in registerJson['blocks']:
writePrivatePropertyMembers(headerFile, blockDefinition['registers'])
writeLine(headerFile)
writeLine(headerFile, ' void verifyInitFinished();')
writeLine(headerFile)
writeInternalPropertyReadMethodDeclarationsRtu(headerFile, registerJson['registers'])
writeLine(headerFile)
# End of class
writeLine(headerFile)
@ -1038,8 +1224,9 @@ def writeRtuSourceFile():
writePropertyGetSetMethodImplementationsRtu(sourceFile, className, registerJson['registers'])
# Block property get methods
for blockDefinition in registerJson['blocks']:
writePropertyGetSetMethodImplementationsRtu(sourceFile, className, blockDefinition['registers'])
if 'blocks' in registerJson:
for blockDefinition in registerJson['blocks']:
writePropertyGetSetMethodImplementationsRtu(sourceFile, className, blockDefinition['registers'])
# Write init and update method implementation
writeInitializeMethod(sourceFile, className, registerJson['registers'])
@ -1049,9 +1236,10 @@ def writeRtuSourceFile():
writePropertyUpdateMethodImplementationsRtu(sourceFile, className, registerJson['registers'])
# Write block update method
writeBlockUpdateMethodImplementationsRtu(sourceFile, className, registerJson['blocks'])
if 'blocks' in registerJson:
writeBlockUpdateMethodImplementationsRtu(sourceFile, className, registerJson['blocks'])
# Write property read method implementations
# Write internal protected property read method implementations
writeInternalPropertyReadMethodImplementationsRtu(sourceFile, className, registerJson['registers'])
writeLine(sourceFile, 'void %s::verifyInitFinished()' % (className))
@ -1070,8 +1258,9 @@ def writeRtuSourceFile():
writeLine(sourceFile, ' debug.nospace().noquote() << "%s(" << %s->modbusRtuMaster()->modbusUuid().toString() << ", " << %s->modbusRtuMaster()->serialPort() << ", slave ID:" << %s->slaveId() << ")" << "\\n";' % (className, debugObjectParamName, debugObjectParamName, debugObjectParamName))
writeRegistersDebugLine(sourceFile, debugObjectParamName, registerJson['registers'])
for blockDefinition in registerJson['blocks']:
writeRegistersDebugLine(sourceFile, debugObjectParamName, blockDefinition['registers'])
if 'blocks' in registerJson:
for blockDefinition in registerJson['blocks']:
writeRegistersDebugLine(sourceFile, debugObjectParamName, blockDefinition['registers'])
writeLine(sourceFile, ' return debug.quote().space();')
writeLine(sourceFile, '}')
@ -1117,7 +1306,8 @@ protocol = 'TCP'
if 'protocol' in registerJson:
protocol = registerJson['protocol']
validateBlocks(registerJson['blocks'])
if 'blocks' in registerJson:
validateBlocks(registerJson['blocks'])
if protocol == 'TCP':
writeTcpHeaderFile()