Finished modbus write values implementation
This commit is contained in:
@ -1,11 +1,15 @@
|
|||||||
#include "changevaluesdialog.h"
|
#include "changevaluesdialog.h"
|
||||||
#include "ui_changevaluesdialog.h"
|
#include "ui_changevaluesdialog.h"
|
||||||
|
|
||||||
|
// system includes
|
||||||
|
#include <utility>
|
||||||
|
|
||||||
// Qt includes
|
// Qt includes
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
#include <QModbusTcpClient>
|
#include <QModbusTcpClient>
|
||||||
|
#include <QMessageBox>
|
||||||
|
|
||||||
ChangeValuesDialog::ChangeValuesDialog(QModbusTcpClient &modbus, QWidget *parent) :
|
ChangeValuesDialog::ChangeValuesDialog(QModbusTcpClient &modbus, int serverAddress, QModbusDataUnit::RegisterType registerType, QWidget *parent) :
|
||||||
QDialog{parent},
|
QDialog{parent},
|
||||||
m_ui{std::make_unique<Ui::ChangeValuesDialog>()},
|
m_ui{std::make_unique<Ui::ChangeValuesDialog>()},
|
||||||
m_modbus{modbus}
|
m_modbus{modbus}
|
||||||
@ -24,6 +28,7 @@ ChangeValuesDialog::ChangeValuesDialog(QModbusTcpClient &modbus, QWidget *parent
|
|||||||
|
|
||||||
connect(m_ui->buttonBox, &QDialogButtonBox::accepted, this, &ChangeValuesDialog::sendRequest);
|
connect(m_ui->buttonBox, &QDialogButtonBox::accepted, this, &ChangeValuesDialog::sendRequest);
|
||||||
|
|
||||||
|
m_ui->spinBoxSlave->setValue(serverAddress);
|
||||||
|
|
||||||
{
|
{
|
||||||
const auto addItem = [&](const auto &text, const auto &value){
|
const auto addItem = [&](const auto &text, const auto &value){
|
||||||
@ -34,6 +39,11 @@ ChangeValuesDialog::ChangeValuesDialog(QModbusTcpClient &modbus, QWidget *parent
|
|||||||
addItem(tr("Input Registers"), QModbusDataUnit::InputRegisters);
|
addItem(tr("Input Registers"), QModbusDataUnit::InputRegisters);
|
||||||
addItem(tr("Holding Registers"), QModbusDataUnit::HoldingRegisters);
|
addItem(tr("Holding Registers"), QModbusDataUnit::HoldingRegisters);
|
||||||
}
|
}
|
||||||
|
m_ui->comboBoxType->setCurrentIndex(
|
||||||
|
m_ui->comboBoxType->findData(
|
||||||
|
QVariant::fromValue<QModbusDataUnit::RegisterType>(registerType)
|
||||||
|
)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
ChangeValuesDialog::~ChangeValuesDialog()
|
ChangeValuesDialog::~ChangeValuesDialog()
|
||||||
@ -43,5 +53,57 @@ ChangeValuesDialog::~ChangeValuesDialog()
|
|||||||
|
|
||||||
void ChangeValuesDialog::sendRequest()
|
void ChangeValuesDialog::sendRequest()
|
||||||
{
|
{
|
||||||
accept();
|
const auto registerType = m_ui->comboBoxType->currentData();
|
||||||
|
if (!registerType.isValid() || !registerType.canConvert<QModbusDataUnit::RegisterType>())
|
||||||
|
{
|
||||||
|
qDebug() << registerType << registerType.typeName() << registerType.canConvert<int>() << registerType.canConvert<QModbusDataUnit::RegisterType>();
|
||||||
|
QMessageBox::warning(this,
|
||||||
|
tr("Invalid register type selected!"),
|
||||||
|
tr("Invalid register type selected!"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
QModbusDataUnit dataUnit{registerType.value<QModbusDataUnit::RegisterType>(), m_ui->spinBoxFirstRegister->value(), m_model.values()};
|
||||||
|
if (m_reply = std::unique_ptr<QModbusReply>(m_modbus.sendWriteRequest(std::move(dataUnit), m_ui->spinBoxSlave->value())))
|
||||||
|
{
|
||||||
|
if (m_reply->isFinished())
|
||||||
|
replyFinished();
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_ui->buttonBox->setEnabled(false);
|
||||||
|
connect(m_reply.get(), &QModbusReply::finished, this, &ChangeValuesDialog::replyFinished);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
QMessageBox::warning(this,
|
||||||
|
tr("Request sending failed!"),
|
||||||
|
tr("Request sending failed:\n\n%0").arg(m_modbus.errorString()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ChangeValuesDialog::replyFinished()
|
||||||
|
{
|
||||||
|
Q_ASSERT(m_reply);
|
||||||
|
|
||||||
|
if (!m_reply->isFinished())
|
||||||
|
{
|
||||||
|
qWarning() << "not yet finished?!";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_ui->buttonBox->setEnabled(true);
|
||||||
|
|
||||||
|
if (const QModbusDevice::Error error = m_reply->error(); error == QModbusDevice::NoError)
|
||||||
|
{
|
||||||
|
//accept();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
QMessageBox::warning(this,
|
||||||
|
tr("Request failed!"),
|
||||||
|
tr("Request failed with %0: %1")
|
||||||
|
.arg(error)
|
||||||
|
.arg(m_reply->errorString()));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,12 +5,14 @@
|
|||||||
|
|
||||||
// Qt includes
|
// Qt includes
|
||||||
#include <QDialog>
|
#include <QDialog>
|
||||||
|
#include <QModbusDataUnit>
|
||||||
|
|
||||||
// local includes
|
// local includes
|
||||||
#include "changevaluesmodel.h"
|
#include "changevaluesmodel.h"
|
||||||
|
|
||||||
// forward declares
|
// forward declares
|
||||||
class QModbusTcpClient;
|
class QModbusTcpClient;
|
||||||
|
class QModbusReply;
|
||||||
namespace Ui {class ChangeValuesDialog; }
|
namespace Ui {class ChangeValuesDialog; }
|
||||||
|
|
||||||
class ChangeValuesDialog : public QDialog
|
class ChangeValuesDialog : public QDialog
|
||||||
@ -18,14 +20,16 @@ class ChangeValuesDialog : public QDialog
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit ChangeValuesDialog(QModbusTcpClient &modbus, QWidget *parent = nullptr);
|
explicit ChangeValuesDialog(QModbusTcpClient &modbus, int serverAddress, QModbusDataUnit::RegisterType registerType, QWidget *parent = nullptr);
|
||||||
~ChangeValuesDialog() override;
|
~ChangeValuesDialog() override;
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void sendRequest();
|
void sendRequest();
|
||||||
|
void replyFinished();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const std::unique_ptr<Ui::ChangeValuesDialog> m_ui;
|
const std::unique_ptr<Ui::ChangeValuesDialog> m_ui;
|
||||||
QModbusTcpClient &m_modbus;
|
QModbusTcpClient &m_modbus;
|
||||||
ChangeValuesModel m_model;
|
ChangeValuesModel m_model;
|
||||||
|
std::unique_ptr<QModbusReply> m_reply;
|
||||||
};
|
};
|
||||||
|
@ -16,44 +16,70 @@
|
|||||||
<layout class="QVBoxLayout" name="verticalLayout" stretch="0,1,0">
|
<layout class="QVBoxLayout" name="verticalLayout" stretch="0,1,0">
|
||||||
<item>
|
<item>
|
||||||
<layout class="QFormLayout" name="formLayout">
|
<layout class="QFormLayout" name="formLayout">
|
||||||
<item row="0" column="0">
|
|
||||||
<widget class="QLabel" name="label">
|
|
||||||
<property name="text">
|
|
||||||
<string>TextLabel</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="0" column="1">
|
|
||||||
<widget class="QComboBox" name="comboBoxType"/>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="0">
|
<item row="1" column="0">
|
||||||
<widget class="QLabel" name="labelFirstRegister">
|
<widget class="QLabel" name="labelType">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>First reister:</string>
|
<string>Type:</string>
|
||||||
|
</property>
|
||||||
|
<property name="buddy">
|
||||||
|
<cstring>comboBoxType</cstring>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="1" column="1">
|
<item row="1" column="1">
|
||||||
|
<widget class="QComboBox" name="comboBoxType"/>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="0">
|
||||||
|
<widget class="QLabel" name="labelFirstRegister">
|
||||||
|
<property name="text">
|
||||||
|
<string>First reister:</string>
|
||||||
|
</property>
|
||||||
|
<property name="buddy">
|
||||||
|
<cstring>spinBoxFirstRegister</cstring>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="1">
|
||||||
<widget class="QSpinBox" name="spinBoxFirstRegister">
|
<widget class="QSpinBox" name="spinBoxFirstRegister">
|
||||||
<property name="maximum">
|
<property name="maximum">
|
||||||
<number>9999</number>
|
<number>9999</number>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="2" column="0">
|
<item row="3" column="0">
|
||||||
<widget class="QLabel" name="labelCount">
|
<widget class="QLabel" name="labelCount">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Count:</string>
|
<string>Count:</string>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="buddy">
|
||||||
|
<cstring>spinBoxCount</cstring>
|
||||||
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="2" column="1">
|
<item row="3" column="1">
|
||||||
<widget class="QSpinBox" name="spinBoxCount">
|
<widget class="QSpinBox" name="spinBoxCount">
|
||||||
<property name="maximum">
|
<property name="maximum">
|
||||||
<number>9999</number>
|
<number>9999</number>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item row="0" column="0">
|
||||||
|
<widget class="QLabel" name="labelSlave">
|
||||||
|
<property name="text">
|
||||||
|
<string>Slave:</string>
|
||||||
|
</property>
|
||||||
|
<property name="buddy">
|
||||||
|
<cstring>spinBoxSlave</cstring>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="1">
|
||||||
|
<widget class="QSpinBox" name="spinBoxSlave">
|
||||||
|
<property name="maximum">
|
||||||
|
<number>65535</number>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
|
@ -115,6 +115,11 @@ bool ChangeValuesModel::setData(const QModelIndex &index, const QVariant &value,
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QVector<quint16> ChangeValuesModel::values() const
|
||||||
|
{
|
||||||
|
return m_registers.mid(m_firstRegister, m_count);
|
||||||
|
}
|
||||||
|
|
||||||
void ChangeValuesModel::setFirstRegister(uint16_t firstRegister)
|
void ChangeValuesModel::setFirstRegister(uint16_t firstRegister)
|
||||||
{
|
{
|
||||||
beginResetModel();
|
beginResetModel();
|
||||||
|
@ -22,6 +22,8 @@ public:
|
|||||||
Qt::ItemFlags flags(const QModelIndex &index) const override;
|
Qt::ItemFlags flags(const QModelIndex &index) const override;
|
||||||
bool setData(const QModelIndex &index, const QVariant &value, int role) override;
|
bool setData(const QModelIndex &index, const QVariant &value, int role) override;
|
||||||
|
|
||||||
|
QVector<quint16> values() const;
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void setFirstRegister(uint16_t firstRegister);
|
void setFirstRegister(uint16_t firstRegister);
|
||||||
void setCount(uint16_t count);
|
void setCount(uint16_t count);
|
||||||
|
@ -154,13 +154,19 @@ void MainWindow::requestPressed()
|
|||||||
m_model->setResult({});
|
m_model->setResult({});
|
||||||
QMessageBox::warning(this,
|
QMessageBox::warning(this,
|
||||||
tr("Request sending failed!"),
|
tr("Request sending failed!"),
|
||||||
tr("Request sending failed:\n\n%s").arg(m_modbus->errorString()));
|
tr("Request sending failed:\n\n%0").arg(m_modbus->errorString()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::writePressed()
|
void MainWindow::writePressed()
|
||||||
{
|
{
|
||||||
ChangeValuesDialog dialog{*m_modbus, this};
|
QModbusDataUnit::RegisterType registerType{QModbusDataUnit::RegisterType::Invalid};
|
||||||
|
|
||||||
|
if (const auto registerTypeData = m_ui->comboBoxType->currentData();
|
||||||
|
registerTypeData.isValid() && registerTypeData.canConvert<QModbusDataUnit::RegisterType>())
|
||||||
|
registerType = registerTypeData.value<QModbusDataUnit::RegisterType>();
|
||||||
|
|
||||||
|
ChangeValuesDialog dialog{*m_modbus, m_ui->spinBoxSlave->value(), registerType, this};
|
||||||
dialog.exec();
|
dialog.exec();
|
||||||
qDebug() << "called";
|
qDebug() << "called";
|
||||||
}
|
}
|
||||||
@ -268,9 +274,9 @@ void MainWindow::replyFinished()
|
|||||||
m_ui->labelRequestStatus->setText(tr("Failed!"));
|
m_ui->labelRequestStatus->setText(tr("Failed!"));
|
||||||
|
|
||||||
const auto msg = tr("Request failed with %0: %1 (took %2ms)")
|
const auto msg = tr("Request failed with %0: %1 (took %2ms)")
|
||||||
.arg(error)
|
.arg(error)
|
||||||
.arg(m_reply->errorString())
|
.arg(m_reply->errorString())
|
||||||
.arg(elapsed);
|
.arg(elapsed);
|
||||||
|
|
||||||
statusBar()->showMessage(msg, 5000);
|
statusBar()->showMessage(msg, 5000);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user