fixed on modbus RTU master removed lambda

master
Boernsman 2021-04-21 19:49:51 +02:00 committed by Michael Zanetti
parent ce9a98b91e
commit 7dded817c9
4 changed files with 18 additions and 17 deletions

View File

@ -47,6 +47,11 @@ bool EnergyMeter::init()
return true;
}
QUuid EnergyMeter::modbusRtuMasterUuid()
{
return m_modbusRtuMaster->modbusUuid();
}
bool EnergyMeter::connected()
{
return m_connected;

View File

@ -32,6 +32,7 @@
#define ENERGYMETER_H
#include <QObject>
#include <QUuid>
#include "registerdescriptor.h"
#include "hardware/modbus/modbusrtumaster.h"
@ -43,6 +44,7 @@ public:
explicit EnergyMeter(ModbusRtuMaster *modbusMaster, int slaveAddress, const QHash<ModbusRegisterType, ModbusRegisterDescriptor> &modbusRegisters, QObject *parent = nullptr);
bool init();
QUuid modbusRtuMasterUuid();
bool connected();
bool getVoltage();
bool getCurrent();

View File

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

View File

@ -70,12 +70,10 @@ private:
QHash<ThingClassId, ParamTypeId> m_slaveIdParamTypeIds;
QHash<ThingClassId, ParamTypeId> m_modbusUuidParamTypeIds;
QHash<ThingClassId, const QHash<ModbusRegisterType, ModbusRegisterDescriptor> *> m_registerMaps;
QHash<ThingClassId, QHash<ModbusRegisterType, ModbusRegisterDescriptor>> m_registerMaps;
QHash<Thing *, EnergyMeter *> m_energyMeters;
QHash<Thing *, ModbusRtuMaster *> m_modbusRtuMasters;
PluginTimer *m_pluginTimer = nullptr;
QHash<QUuid, ThingActionInfo *> m_asyncActions;
private slots:
void onConnectionStateChanged(bool status);