Add support and fix modbus rtu storage cleanup
This commit is contained in:
parent
1f247b30be
commit
abcfd32feb
@ -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 ¶ms)
|
|||||||
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 ¶ms)
|
|||||||
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user