Add initialized property

wattsonic
Simon Stürz 2023-10-17 14:25:54 +02:00
parent 4d54c662cb
commit eae2cbe0ee
4 changed files with 45 additions and 4 deletions

View File

@ -590,6 +590,8 @@ def writeInitMethodImplementationTcp(fileDescriptor, className, registerDefiniti
writeLine(fileDescriptor, ' return false;')
writeLine(fileDescriptor, ' }')
writeLine(fileDescriptor)
writeLine(fileDescriptor, ' m_initializing = true;')
writeLine(fileDescriptor)
# Read individual registers
for registerDefinition in registerDefinitions:
@ -614,6 +616,8 @@ def writeInitMethodImplementationTcp(fileDescriptor, className, registerDefiniti
writeLine(fileDescriptor, ' return false;')
writeLine(fileDescriptor, ' }')
writeLine(fileDescriptor)
writeLine(fileDescriptor, ' m_initializing = true;')
writeLine(fileDescriptor)
writeLine(fileDescriptor, ' // Parent object for the init process')
writeLine(fileDescriptor, ' m_initObject = new QObject(this);')
writeLine(fileDescriptor)
@ -744,6 +748,7 @@ def writeInitMethodImplementationTcp(fileDescriptor, className, registerDefiniti
else:
writeLine(fileDescriptor, ' // No init registers defined. Nothing to be done and we are finished.')
writeLine(fileDescriptor, ' m_initializing = false;')
writeLine(fileDescriptor, ' emit initializationFinished(true);')
writeLine(fileDescriptor, ' return true;')

View File

@ -75,6 +75,7 @@ def writeTcpHeaderFile():
writeLine(headerFile, ' quint16 slaveId() const;')
writeLine(headerFile)
writeLine(headerFile, ' bool reachable() const;')
writeLine(headerFile, ' bool initializing() const;')
writeLine(headerFile)
# Write init and update method declarations
@ -180,6 +181,7 @@ def writeTcpHeaderFile():
writeLine(headerFile)
writeLine(headerFile, ' bool m_reachable = false;')
writeLine(headerFile, ' bool m_initializing = false;')
writeLine(headerFile, ' QModbusReply *m_checkRechableReply = nullptr;')
writeLine(headerFile, ' uint m_checkReachableRetries = 0;')
writeLine(headerFile, ' uint m_checkReachableRetriesCount = 0;')
@ -273,6 +275,12 @@ def writeTcpSourceFile():
writeLine(sourceFile, '}')
writeLine(sourceFile)
writeLine(sourceFile, 'bool %s::initializing() const' % (className))
writeLine(sourceFile, '{')
writeLine(sourceFile, ' return m_initializing;')
writeLine(sourceFile, '}')
writeLine(sourceFile)
writeLine(sourceFile, 'uint %s::checkReachableRetries() const' % (className))
writeLine(sourceFile, '{')
writeLine(sourceFile, ' return m_checkReachableRetries;')
@ -423,6 +431,7 @@ def writeTcpSourceFile():
writeLine(sourceFile, ' qCWarning(dc%s()) << "Initialization finished of %s" << m_modbusTcpMaster->hostAddress().toString() << "failed.";' % (className, className))
writeLine(sourceFile, ' }')
writeLine(sourceFile)
writeLine(sourceFile, ' m_initializing = false;')
if queuedRequests:
writeLine(sourceFile, ' m_initRequestQueue.clear();')
@ -460,6 +469,7 @@ def writeTcpSourceFile():
writeLine(sourceFile, ' m_communicationWorking = false;')
writeLine(sourceFile, ' m_communicationFailedCounter = 0;')
writeLine(sourceFile, ' m_checkReachableRetriesCount = 0;')
writeLine(sourceFile, ' m_initializing = false;')
if queuedRequests:
writeLine(sourceFile, ' m_updateRequestQueue.clear();')

View File

@ -197,7 +197,7 @@ void IntegrationPluginSolax::setupThing(ThingSetupInfo *info)
// Try once to reconnect the device
solaxConnection->reconnectDevice();
} else {
// Start update cycle
qCInfo(dcSolax()) << "Connection initialized successfully for" << thing;
solaxConnection->update();
}
});
@ -309,9 +309,6 @@ void IntegrationPluginSolax::setupThing(ThingSetupInfo *info)
batteryThing->setStateValue(solaxBatteryChargingStateStateTypeId, "charging");
}
}
// Run the next update cycle
solaxConnection->update();
});
connect(thing, &Thing::settingChanged, solaxConnection, [this, thing](const ParamTypeId &paramTypeId, const QVariant &value){
@ -410,6 +407,28 @@ void IntegrationPluginSolax::setupThing(ThingSetupInfo *info)
void IntegrationPluginSolax::postSetupThing(Thing *thing)
{
if (thing->thingClassId() == solaxInverterTcpThingClassId) {
// Create the update timer if not already set up
if (!m_refreshTimer) {
qCDebug(dcSolax()) << "Starting plugin timer...";
m_refreshTimer = hardwareManager()->pluginTimerManager()->registerTimer(2);
connect(m_refreshTimer, &PluginTimer::timeout, this, [this] {
foreach(SolaxModbusTcpConnection *connection, m_tcpConnections) {
if (connection->initializing())
continue;
//qCDebug(dcSolax()) << "Update connection" << connection->modbusTcpMaster()->hostAddress().toString();
connection->update();
}
});
m_refreshTimer->start();
}
return;
}
if (thing->thingClassId() == solaxMeterThingClassId || thing->thingClassId() == solaxBatteryThingClassId || thing->thingClassId() == solaxInverterChildThingClassId) {
Thing *connectionThing = myThings().findById(thing->parentId());
if (connectionThing) {
@ -432,6 +451,11 @@ void IntegrationPluginSolax::thingRemoved(Thing *thing)
if (m_monitors.contains(thing))
hardwareManager()->networkDeviceDiscovery()->unregisterMonitor(m_monitors.take(thing));
if (myThings().isEmpty() && m_refreshTimer) {
qCDebug(dcSolax()) << "Stopping refresh timer";
hardwareManager()->pluginTimerManager()->unregisterTimer(m_refreshTimer);
m_refreshTimer = nullptr;
}
}
Thing *IntegrationPluginSolax::getMeterThing(Thing *parentThing, uint meterId)

View File

@ -56,6 +56,8 @@ public:
void thingRemoved(Thing *thing) override;
private:
PluginTimer *m_refreshTimer = nullptr;
QHash<Thing *, NetworkDeviceMonitor *> m_monitors;
QHash<Thing *, SolaxModbusTcpConnection *> m_tcpConnections;
QHash<Thing *, SolaxModbusRtuConnection *> m_rtuConnections;