diff --git a/energymeters/energymeter.cpp b/energymeters/energymeter.cpp index 8083f49..2555a71 100644 --- a/energymeters/energymeter.cpp +++ b/energymeters/energymeter.cpp @@ -47,6 +47,11 @@ bool EnergyMeter::init() return true; } +QUuid EnergyMeter::modbusRtuMasterUuid() +{ + return m_modbusRtuMaster->modbusUuid(); +} + bool EnergyMeter::connected() { return m_connected; diff --git a/energymeters/energymeter.h b/energymeters/energymeter.h index 1773d5d..67cb175 100644 --- a/energymeters/energymeter.h +++ b/energymeters/energymeter.h @@ -32,6 +32,7 @@ #define ENERGYMETER_H #include +#include #include "registerdescriptor.h" #include "hardware/modbus/modbusrtumaster.h" @@ -43,6 +44,7 @@ public: explicit EnergyMeter(ModbusRtuMaster *modbusMaster, int slaveAddress, const QHash &modbusRegisters, QObject *parent = nullptr); bool init(); + QUuid modbusRtuMasterUuid(); bool connected(); bool getVoltage(); bool getCurrent(); diff --git a/energymeters/integrationpluginenergymeters.cpp b/energymeters/integrationpluginenergymeters.cpp index 2dd79a4..8059280 100644 --- a/energymeters/integrationpluginenergymeters.cpp +++ b/energymeters/integrationpluginenergymeters.cpp @@ -68,26 +68,22 @@ IntegrationPluginEnergyMeters::IntegrationPluginEnergyMeters() m_discoverySlaveAddressParamTypeIds.insert(pro380ThingClassId, pro380DiscoverySlaveAddressParamTypeId); m_discoverySlaveAddressParamTypeIds.insert(sdm630ThingClassId, sdm630DiscoverySlaveAddressParamTypeId); - m_registerMaps.insert(pro380ThingClassId, &pro380RegisterMap); - m_registerMaps.insert(sdm630ThingClassId, &sdm630RegisterMap); + m_registerMaps.insert(pro380ThingClassId, pro380RegisterMap); + m_registerMaps.insert(sdm630ThingClassId, sdm630RegisterMap); // Modbus RTU hardware resource connect(hardwareManager()->modbusRtuResource(), &ModbusRtuHardwareResource::modbusRtuMasterRemoved, this, [=](const QUuid &modbusUuid){ qCDebug(dcEnergyMeters()) << "Modbus RTU master has been removed" << modbusUuid.toString(); // Check if there is any device using this resource - foreach (Thing *thing, m_modbusRtuMasters.keys()) { - if (m_modbusRtuMasters.value(thing)->modbusUuid() == modbusUuid) { - qCWarning(dcEnergyMeters()) << "Hardware resource removed for" << thing << ". The thing will not be functional any more until a new resource has been configured for it."; - m_modbusRtuMasters.remove(thing); - thing->setStateValue(m_connectionStateTypeIds[thing->thingClassId()], false); + foreach (EnergyMeter * meter, m_energyMeters) { + if (meter->modbusRtuMasterUuid() == modbusUuid) { + Thing *thing = m_energyMeters.key(meter); + if (!thing) + return; - // Set all child things disconnected - foreach (Thing *childThing, myThings()) { - if (childThing->parentId() == thing->id()) { - thing->setStateValue(m_connectionStateTypeIds[childThing->thingClassId()], false); - } - } + qCWarning(dcEnergyMeters()) << "Modbus RTU hardware resource removed for" << thing << ". The thing will not be functional any more until a new resource has been configured for it."; + thing->setStateValue(m_connectionStateTypeIds[thing->thingClassId()], false); } } }); @@ -152,7 +148,7 @@ void IntegrationPluginEnergyMeters::setupThing(ThingSetupInfo *info) return; } - EnergyMeter *meter = new EnergyMeter(hardwareManager()->modbusRtuResource()->getModbusRtuMaster(uuid), address, *m_registerMaps.value(thing->thingClassId()), this); + EnergyMeter *meter = new EnergyMeter(hardwareManager()->modbusRtuResource()->getModbusRtuMaster(uuid), address, m_registerMaps.value(thing->thingClassId()), this); connect(info, &ThingSetupInfo::aborted, meter, &EnergyMeter::deleteLater); connect(meter, &EnergyMeter::consumedEnergyReceived, info, [this, info, meter] { qCDebug(dcEnergyMeters()) << "Reply received, setup finished"; diff --git a/energymeters/integrationpluginenergymeters.h b/energymeters/integrationpluginenergymeters.h index 8f9dc91..16e2f95 100644 --- a/energymeters/integrationpluginenergymeters.h +++ b/energymeters/integrationpluginenergymeters.h @@ -70,12 +70,10 @@ private: QHash m_slaveIdParamTypeIds; QHash m_modbusUuidParamTypeIds; - QHash *> m_registerMaps; + QHash> m_registerMaps; QHash m_energyMeters; - QHash m_modbusRtuMasters; PluginTimer *m_pluginTimer = nullptr; - QHash m_asyncActions; private slots: void onConnectionStateChanged(bool status);