Add support and fix modbus rtu storage cleanup

This commit is contained in:
Simon Stürz 2021-02-16 20:42:16 +01:00
parent 1f247b30be
commit abcfd32feb
4 changed files with 60 additions and 10 deletions

View File

@ -79,7 +79,8 @@ ModbusRtuHandler::ModbusRtuHandler(ModbusRtuManager *modbusRtuManager, QObject *
// GetModbusRtuMasters // GetModbusRtuMasters
params.clear(); returns.clear(); params.clear(); returns.clear();
description = "Get the list of configured modbus RTU masters."; description = "Get the list of configured modbus RTU masters.";
returns.insert("modbusRtuMasters", QVariantList() << objectRef("ModbusRtuMaster")); returns.insert("o:modbusRtuMasters", QVariantList() << objectRef("ModbusRtuMaster"));
returns.insert("modbusError", enumRef<ModbusRtuManager::ModbusRtuError>());
registerMethod("GetModbusRtuMasters", description, params, returns); registerMethod("GetModbusRtuMasters", description, params, returns);
// ModbusRtuMasterAdded notification // ModbusRtuMasterAdded notification
@ -144,7 +145,6 @@ ModbusRtuHandler::ModbusRtuHandler(ModbusRtuManager *modbusRtuManager, QObject *
emit SerialPortRemoved(params); emit SerialPortRemoved(params);
}); });
// Modbus manager // Modbus manager
connect(modbusRtuManager, &ModbusRtuManager::modbusRtuMasterAdded, this, [=](ModbusRtuMaster *modbusRtuMaster){ connect(modbusRtuManager, &ModbusRtuManager::modbusRtuMasterAdded, this, [=](ModbusRtuMaster *modbusRtuMaster){
QVariantMap params; QVariantMap params;
@ -188,11 +188,19 @@ JsonReply *ModbusRtuHandler::GetModbusRtuMasters(const QVariantMap &params)
Q_UNUSED(params) Q_UNUSED(params)
QVariantMap returnMap; QVariantMap returnMap;
QVariantList modbusList;
foreach (ModbusRtuMaster *modbusMaster, m_modbusRtuManager->modbusRtuMasters()) { if (m_modbusRtuManager->supported()) {
modbusList << packModbusRtuMaster(modbusMaster); QVariantList modbusList;
foreach (ModbusRtuMaster *modbusMaster, m_modbusRtuManager->modbusRtuMasters()) {
modbusList << packModbusRtuMaster(modbusMaster);
}
returnMap.insert("modbusRtuMasters", modbusList);
returnMap.insert("modbusError", enumValueName<ModbusRtuManager::ModbusRtuError>(ModbusRtuManager::ModbusRtuErrorNoError));
} else {
returnMap.insert("modbusError", enumValueName<ModbusRtuManager::ModbusRtuError>(ModbusRtuManager::ModbusRtuErrorNotSupported));
} }
returnMap.insert("modbusRtuMasters", modbusList);
return createReply(returnMap); return createReply(returnMap);
} }
@ -211,7 +219,6 @@ JsonReply *ModbusRtuHandler::AddModbusRtuMaster(const QVariantMap &params)
if (result.first == ModbusRtuManager::ModbusRtuErrorNoError) { if (result.first == ModbusRtuManager::ModbusRtuErrorNoError) {
returnMap.insert("modbusUuid", result.second); returnMap.insert("modbusUuid", result.second);
} }
return createReply(returnMap); return createReply(returnMap);
} }

View File

@ -70,6 +70,15 @@ SerialPortMonitor *ModbusRtuManager::serialPortMonitor() const
return m_serialPortMonitor; return m_serialPortMonitor;
} }
bool ModbusRtuManager::supported() const
{
#ifdef WITH_QTSERIALBUS
return true;
#else
return false;
#endif
}
QList<ModbusRtuMaster *> ModbusRtuManager::modbusRtuMasters() const QList<ModbusRtuMaster *> ModbusRtuManager::modbusRtuMasters() const
{ {
return m_modbusRtuMasters.values(); return m_modbusRtuMasters.values();
@ -91,6 +100,11 @@ ModbusRtuMaster *ModbusRtuManager::getModbusRtuMaster(const QUuid &modbusUuid)
QPair<ModbusRtuManager::ModbusRtuError, QUuid> ModbusRtuManager::addNewModbusRtuMaster(const QString &serialPort, qint32 baudrate, QSerialPort::Parity parity, QSerialPort::DataBits dataBits, QSerialPort::StopBits stopBits) QPair<ModbusRtuManager::ModbusRtuError, QUuid> ModbusRtuManager::addNewModbusRtuMaster(const QString &serialPort, qint32 baudrate, QSerialPort::Parity parity, QSerialPort::DataBits dataBits, QSerialPort::StopBits stopBits)
{ {
if (!supported()) {
qCWarning(dcModbusRtu()) << "Cannot add new modbus RTU master because serialbus is not suppoerted on this platform.";
return QPair<ModbusRtuManager::ModbusRtuError, QUuid>(ModbusRtuErrorNotSupported, QUuid());
}
// Check if the serial port exists // Check if the serial port exists
if (!m_serialPortMonitor->serialPortAvailable(serialPort)) { if (!m_serialPortMonitor->serialPortAvailable(serialPort)) {
qCWarning(dcModbusRtu()) << "Cannot add new modbus RTU master because the serial port" << serialPort << "is not available any more"; qCWarning(dcModbusRtu()) << "Cannot add new modbus RTU master because the serial port" << serialPort << "is not available any more";
@ -105,6 +119,7 @@ QPair<ModbusRtuManager::ModbusRtuError, QUuid> ModbusRtuManager::addNewModbusRt
// Note: We could add the modbus master event if a connection is currently not possible...not sure yet // Note: We could add the modbus master event if a connection is currently not possible...not sure yet
if (!modbusMaster->connectDevice()) { if (!modbusMaster->connectDevice()) {
qCWarning(dcModbusRtu()) << "Failed to add new modbus RTU master. Could not connect to" << modbus << parity << dataBits << stopBits; qCWarning(dcModbusRtu()) << "Failed to add new modbus RTU master. Could not connect to" << modbus << parity << dataBits << stopBits;
modbusMaster->deleteLater(); modbusMaster->deleteLater();
return QPair<ModbusRtuError, QUuid>(ModbusRtuErrorConnectionFailed, QUuid()); return QPair<ModbusRtuError, QUuid>(ModbusRtuErrorConnectionFailed, QUuid());
} }
@ -117,6 +132,11 @@ QPair<ModbusRtuManager::ModbusRtuError, QUuid> ModbusRtuManager::addNewModbusRt
ModbusRtuManager::ModbusRtuError ModbusRtuManager::reconfigureModbusRtuMaster(const QUuid &modbusUuid, const QString &serialPort, qint32 baudrate, QSerialPort::Parity parity, QSerialPort::DataBits dataBits, QSerialPort::StopBits stopBits) ModbusRtuManager::ModbusRtuError ModbusRtuManager::reconfigureModbusRtuMaster(const QUuid &modbusUuid, const QString &serialPort, qint32 baudrate, QSerialPort::Parity parity, QSerialPort::DataBits dataBits, QSerialPort::StopBits stopBits)
{ {
if (!supported()) {
qCWarning(dcModbusRtu()) << "Cannot reconfigure modbus RTU master because serialbus is not suppoerted on this platform.";
return ModbusRtuErrorNotSupported;
}
if (!m_modbusRtuMasters.contains(modbusUuid)) { if (!m_modbusRtuMasters.contains(modbusUuid)) {
qCWarning(dcModbusRtu()) << "Could not reconfigure modbus RTU master because no resource could be found with uuid" << modbusUuid.toString(); qCWarning(dcModbusRtu()) << "Could not reconfigure modbus RTU master because no resource could be found with uuid" << modbusUuid.toString();
return ModbusRtuErrorUuidNotFound; return ModbusRtuErrorUuidNotFound;
@ -137,6 +157,7 @@ ModbusRtuManager::ModbusRtuError ModbusRtuManager::reconfigureModbusRtuMaster(co
// Connect again // Connect again
if (!modbusMaster->connectDevice()) { if (!modbusMaster->connectDevice()) {
qCWarning(dcModbusRtu()) << "Failed to connect to" << m_modbusRtuMasters.value(modbusUuid); qCWarning(dcModbusRtu()) << "Failed to connect to" << m_modbusRtuMasters.value(modbusUuid);
// FIXME: check if we should reload the old configuration
emit modbusRtuMasterChanged(m_modbusRtuMasters.value(modbusUuid)); emit modbusRtuMasterChanged(m_modbusRtuMasters.value(modbusUuid));
return ModbusRtuErrorConnectionFailed; return ModbusRtuErrorConnectionFailed;
} }
@ -144,11 +165,17 @@ ModbusRtuManager::ModbusRtuError ModbusRtuManager::reconfigureModbusRtuMaster(co
emit modbusRtuMasterChanged(m_modbusRtuMasters.value(modbusUuid)); emit modbusRtuMasterChanged(m_modbusRtuMasters.value(modbusUuid));
qCDebug(dcModbusRtu()) << "Reconfigured successfully" << m_modbusRtuMasters.value(modbusUuid); qCDebug(dcModbusRtu()) << "Reconfigured successfully" << m_modbusRtuMasters.value(modbusUuid);
saveModbusRtuMaster(modbusMaster);
return ModbusRtuErrorNoError; return ModbusRtuErrorNoError;
} }
ModbusRtuManager::ModbusRtuError ModbusRtuManager::removeModbusRtuMaster(const QUuid &modbusUuid) ModbusRtuManager::ModbusRtuError ModbusRtuManager::removeModbusRtuMaster(const QUuid &modbusUuid)
{ {
if (!supported()) {
qCWarning(dcModbusRtu()) << "Cannot remove modbus RTU master because serialbus is not suppoerted on this platform.";
return ModbusRtuErrorNotSupported;
}
if (!m_modbusRtuMasters.contains(modbusUuid)) { if (!m_modbusRtuMasters.contains(modbusUuid)) {
qCWarning(dcModbusRtu()) << "Could not remove modbus RTU master because no resource could be found with uuid" << modbusUuid.toString(); qCWarning(dcModbusRtu()) << "Could not remove modbus RTU master because no resource could be found with uuid" << modbusUuid.toString();
return ModbusRtuErrorUuidNotFound; return ModbusRtuErrorUuidNotFound;
@ -159,6 +186,14 @@ ModbusRtuManager::ModbusRtuError ModbusRtuManager::removeModbusRtuMaster(const Q
modbusMaster->disconnectDevice(); modbusMaster->disconnectDevice();
modbusMaster->deleteLater(); modbusMaster->deleteLater();
// Remove from settings
NymeaSettings settings(NymeaSettings::SettingsRoleModbusRtu);
settings.beginGroup("ModbusRtuMasters");
settings.beginGroup(modbusUuid.toString());
settings.remove("");
settings.endGroup(); // modbusUuid
settings.endGroup(); // ModbusRtuMasters
emit modbusRtuMasterRemoved(modbusMaster); emit modbusRtuMasterRemoved(modbusMaster);
return ModbusRtuErrorNoError; return ModbusRtuErrorNoError;
@ -166,9 +201,11 @@ ModbusRtuManager::ModbusRtuError ModbusRtuManager::removeModbusRtuMaster(const Q
void ModbusRtuManager::loadRtuMasters() void ModbusRtuManager::loadRtuMasters()
{ {
if (!supported())
return;
NymeaSettings settings(NymeaSettings::SettingsRoleModbusRtu); NymeaSettings settings(NymeaSettings::SettingsRoleModbusRtu);
qCDebug(dcModbusRtu()) << "Loading modbus RTU resources from" << settings.fileName(); qCDebug(dcModbusRtu()) << "Loading modbus RTU resources from" << settings.fileName();
settings.beginGroup("ModbusRtuMasters"); settings.beginGroup("ModbusRtuMasters");
foreach (const QString &uuidString, settings.childGroups()) { foreach (const QString &uuidString, settings.childGroups()) {
settings.beginGroup(uuidString); settings.beginGroup(uuidString);

View File

@ -52,6 +52,8 @@ public:
ModbusRtuErrorNotAvailable, ModbusRtuErrorNotAvailable,
ModbusRtuErrorUuidNotFound, ModbusRtuErrorUuidNotFound,
ModbusRtuErrorHardwareNotFound, ModbusRtuErrorHardwareNotFound,
ModbusRtuErrorResourceBusy,
ModbusRtuErrorNotSupported,
ModbusRtuErrorConnectionFailed ModbusRtuErrorConnectionFailed
}; };
Q_ENUM(ModbusRtuError) Q_ENUM(ModbusRtuError)
@ -61,6 +63,8 @@ public:
SerialPortMonitor *serialPortMonitor() const; SerialPortMonitor *serialPortMonitor() const;
bool supported() const;
QList<ModbusRtuMaster *> modbusRtuMasters() const; QList<ModbusRtuMaster *> modbusRtuMasters() const;
bool hasModbusRtuMaster(const QUuid &modbusUuid) const; bool hasModbusRtuMaster(const QUuid &modbusUuid) const;
ModbusRtuMaster *getModbusRtuMaster(const QUuid &modbusUuid); ModbusRtuMaster *getModbusRtuMaster(const QUuid &modbusUuid);

View File

@ -69,8 +69,10 @@ ModbusRtuMasterImpl::ModbusRtuMasterImpl(const QUuid &modbusUuid, const QString
}); });
connect(m_modbus, &QModbusRtuSerialMaster::errorOccurred, this, [=](QModbusDevice::Error error){ connect(m_modbus, &QModbusRtuSerialMaster::errorOccurred, this, [=](QModbusDevice::Error error){
qCDebug(dcModbusRtu()) << "Error occured for modbus RTU master" << m_modbusUuid.toString() << m_serialPort << error << m_modbus->errorString(); qCWarning(dcModbusRtu()) << "Error occured for modbus RTU master" << m_modbusUuid.toString() << m_serialPort << error << m_modbus->errorString();
// TODO: check if disconnected... if (error != QModbusDevice::NoError) {
disconnectDevice();
}
}); });
#endif #endif
} }