fixed rediscovery memory leak
parent
0a57de310c
commit
3e50af83a3
|
|
@ -67,7 +67,6 @@ void IntegrationPluginModbusCommander::init()
|
||||||
void IntegrationPluginModbusCommander::discoverThings(ThingDiscoveryInfo *info)
|
void IntegrationPluginModbusCommander::discoverThings(ThingDiscoveryInfo *info)
|
||||||
{
|
{
|
||||||
ThingClassId thingClassId = info->thingClassId();
|
ThingClassId thingClassId = info->thingClassId();
|
||||||
|
|
||||||
if (thingClassId == modbusRTUClientThingClassId) {
|
if (thingClassId == modbusRTUClientThingClassId) {
|
||||||
Q_FOREACH(QSerialPortInfo port, QSerialPortInfo::availablePorts()) {
|
Q_FOREACH(QSerialPortInfo port, QSerialPortInfo::availablePorts()) {
|
||||||
qCDebug(dcModbusCommander()) << "Found serial port:" << port.systemLocation() << "manufacturer" << port.manufacturer() << "description" << port.description() << "serial number" << port.serialNumber();
|
qCDebug(dcModbusCommander()) << "Found serial port:" << port.systemLocation() << "manufacturer" << port.manufacturer() << "description" << port.description() << "serial number" << port.serialNumber();
|
||||||
|
|
@ -91,7 +90,7 @@ void IntegrationPluginModbusCommander::discoverThings(ThingDiscoveryInfo *info)
|
||||||
qCDebug(dcModbusCommander()) << " - Serial number" << serialnumber;
|
qCDebug(dcModbusCommander()) << " - Serial number" << serialnumber;
|
||||||
Q_FOREACH (Thing *exisingThing, myThings().filterByParam(modbusRTUClientThingClassId)) {
|
Q_FOREACH (Thing *exisingThing, myThings().filterByParam(modbusRTUClientThingClassId)) {
|
||||||
thingDescriptor.setThingId(exisingThing->id());
|
thingDescriptor.setThingId(exisingThing->id());
|
||||||
// Rediscovery is broken because of an missing unique device id
|
// Rediscovery is broken because of a missing unique device id
|
||||||
// This is a workaround and doesnt work if multiple uart converters are attached.
|
// This is a workaround and doesnt work if multiple uart converters are attached.
|
||||||
// ThingDiscoveryInfo may be extended to distinquish between discovery and rediscovery
|
// ThingDiscoveryInfo may be extended to distinquish between discovery and rediscovery
|
||||||
break;
|
break;
|
||||||
|
|
@ -183,8 +182,13 @@ void IntegrationPluginModbusCommander::setupThing(ThingSetupInfo *info)
|
||||||
uint numberOfRetries = thing->setting(modbusTCPClientSettingsNumberOfRetriesParamTypeId).toUInt();
|
uint numberOfRetries = thing->setting(modbusTCPClientSettingsNumberOfRetriesParamTypeId).toUInt();
|
||||||
uint timeout = thing->setting(modbusTCPClientSettingsTimeoutParamTypeId).toUInt();
|
uint timeout = thing->setting(modbusTCPClientSettingsTimeoutParamTypeId).toUInt();
|
||||||
|
|
||||||
|
if (m_modbusTCPMasters.contains(thing)) {
|
||||||
|
// In case of a rediscovery
|
||||||
|
m_modbusTCPMasters.take(thing)->deleteLater();
|
||||||
|
}
|
||||||
|
|
||||||
foreach (ModbusTCPMaster *modbusTCPMaster, m_modbusTCPMasters.values()) {
|
foreach (ModbusTCPMaster *modbusTCPMaster, m_modbusTCPMasters.values()) {
|
||||||
if ((modbusTCPMaster->hostAddress() == hostAddress) && (modbusTCPMaster->port() == port)){
|
if ((modbusTCPMaster->hostAddress() == hostAddress) && (modbusTCPMaster->port() == port)) {
|
||||||
m_modbusTCPMasters.insert(thing, modbusTCPMaster);
|
m_modbusTCPMasters.insert(thing, modbusTCPMaster);
|
||||||
return info->finish(Thing::ThingErrorNoError);
|
return info->finish(Thing::ThingErrorNoError);
|
||||||
}
|
}
|
||||||
|
|
@ -246,6 +250,12 @@ void IntegrationPluginModbusCommander::setupThing(ThingSetupInfo *info)
|
||||||
qCDebug(dcModbusCommander()) << " number of retries:" << numberOfRetries;
|
qCDebug(dcModbusCommander()) << " number of retries:" << numberOfRetries;
|
||||||
qCDebug(dcModbusCommander()) << " timeout:" << timeout;
|
qCDebug(dcModbusCommander()) << " timeout:" << timeout;
|
||||||
|
|
||||||
|
|
||||||
|
if (m_modbusRTUMasters.contains(thing)) {
|
||||||
|
// In case of a rediscovery
|
||||||
|
m_modbusRTUMasters.take(thing)->deleteLater();
|
||||||
|
}
|
||||||
|
|
||||||
ModbusRTUMaster *modbusRTUMaster = new ModbusRTUMaster(serialPort, baudrate, parity, dataBits, stopBits, this);
|
ModbusRTUMaster *modbusRTUMaster = new ModbusRTUMaster(serialPort, baudrate, parity, dataBits, stopBits, this);
|
||||||
modbusRTUMaster->setTimeout(timeout);
|
modbusRTUMaster->setTimeout(timeout);
|
||||||
modbusRTUMaster->setNumberOfRetries(numberOfRetries);
|
modbusRTUMaster->setNumberOfRetries(numberOfRetries);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue