Correct bit change

This commit is contained in:
2025-07-04 02:14:02 +07:00
parent 63cc2ac448
commit b03730d3c9
3 changed files with 25 additions and 12 deletions

View File

@@ -58,13 +58,17 @@ void Mainwindows::loadConfiguration() {
m_buttonRegisters.clear();
m_indicatorRegisters.clear();
m_buttonBits.clear();
// Load button registers
// Load button registers and bits
for(int i = 1; i <= m_buttonCount; ++i) {
QString buttonKey = QString("button_reg%1").arg(i);
int buttonReg = settings.value(buttonKey, 0).toInt();
if(buttonReg > 0) {
QString buttonRegKey = QString("button_reg%1").arg(i);
QString buttonBitKey = QString("button_bit%1").arg(i);
int buttonReg = settings.value(buttonRegKey, 0).toInt();
int buttonBit = settings.value(buttonBitKey, 0).toInt();
if(buttonReg > 0 && buttonBit >= 0 && buttonBit < 16) {
m_buttonRegisters.append(buttonReg);
m_buttonBits.append(buttonBit);
}
}
@@ -72,7 +76,7 @@ void Mainwindows::loadConfiguration() {
for(int i = 1; i <= m_indicatorCount; ++i) {
QString indicatorKey = QString("indicator_reg%1").arg(i);
int indicatorReg = settings.value(indicatorKey, 0).toInt();
if(indicatorReg > 0) {
if (indicatorReg > 0) {
m_indicatorRegisters.append(indicatorReg);
}
}
@@ -193,9 +197,12 @@ void Mainwindows::onReadReady() {
// Handle buttons
for (int i = 0; i < m_buttonRegisters.size(); ++i) {
if (address == m_buttonRegisters[i]) {
m_buttonValues[i] = value & 1; // Update stored button value
QStringList bName = {"Открыть", "Закрыть"};
m_buttons[i]->setText(bName[m_buttonValues[i]]);
m_buttonValues[i] = value;
bool bitState = (value >> m_buttonBits[i]) & 1;
m_buttons[i]->setText(QString("Reg %1 Bit %2: %3")
.arg(m_buttonRegisters[i])
.arg(m_buttonBits[i])
.arg(bitState ? "1" : "0"));
break;
}
}
@@ -225,14 +232,16 @@ void Mainwindows::createUIElements() {
// Create UI elements
for(int i = 0; i < rowCount; ++i) {
if (i < m_buttonCount) {
auto* button = new QPushButton(QString("Register %1").arg(m_buttonRegisters[i]), this);
auto* button = new QPushButton(QString("Register %1 Bit %2").arg(m_buttonRegisters[i]).arg(m_buttonBits[i]), this);
m_buttons.append(button);
m_buttonValues.append(0); // Initialize button values
m_buttonValues.append(0);
m_table->setCellWidget(i, 0, button);
connect(button, &QPushButton::clicked, [this, i]() {
m_buttonValues[i] = !m_buttonValues[i]; // Toggle value
QModbusDataUnit writeUnit(QModbusDataUnit::HoldingRegisters, m_buttonRegisters[i], 1);
writeUnit.setValue(0, m_buttonValues[i]);
int currentValue = m_buttonValues[i];
int newValue = currentValue ^ (1 << m_buttonBits[i]); // Toggle specific bit
m_buttonValues[i] = newValue;
writeUnit.setValue(0, newValue);
if (auto *reply = m_modbusClient->sendWriteRequest(writeUnit, 1)) {
if (!reply->isFinished())
connect(reply, &QModbusReply::finished, reply, &QModbusReply::deleteLater);