Skip to content

Commit b726d8d

Browse files
committed
Disabling input length to get incorrect address #91
1 parent cc06ed8 commit b726d8d

10 files changed

Lines changed: 769 additions & 515 deletions

src/dialogs/dialogdisplaydefinition.cpp

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ DialogDisplayDefinition::DialogDisplayDefinition(DisplayDefinition dd, QWidget*
2424

2525
ui->lineEditPointAddress->setInputMode(dd.HexAddress ? NumericLineEdit::HexMode : NumericLineEdit::Int32Mode);
2626
ui->lineEditPointAddress->setInputRange(ModbusLimits::addressRange(dd.AddrSpace, dd.ZeroBasedAddress));
27-
ui->lineEditLength->setInputRange(ModbusLimits::lengthRange());
27+
ui->lineEditLength->setInputRange(ModbusLimits::lengthRange(dd.PointAddress, dd.ZeroBasedAddress, dd.AddrSpace));
2828
ui->lineEditSlaveAddress->setInputRange(ModbusLimits::slaveRange());
2929
ui->lineEditLogLimit->setInputRange(4, 1000);
3030
ui->checkBoxAutoscrollLog->setChecked(dd.AutoscrollLog);
@@ -72,10 +72,42 @@ void DialogDisplayDefinition::accept()
7272
/// \brief DialogDisplayDefinition::on_comboBoxAddressBase_currentIndexChanged
7373
/// \param index
7474
///
75+
void DialogDisplayDefinition::on_lineEditPointAddress_valueChanged(const QVariant&)
76+
{
77+
const auto addrSpace = _displayDefinition.AddrSpace;
78+
const bool zeroBased = (ui->comboBoxAddressBase->currentAddressBase() == AddressBase::Base0);
79+
const int address = ui->lineEditPointAddress->value<int>();
80+
const auto lenRange = ModbusLimits::lengthRange(address, zeroBased, addrSpace);
81+
82+
ui->lineEditLength->setInputRange(lenRange);
83+
if(ui->lineEditLength->value<int>() > lenRange.to()) {
84+
ui->lineEditLength->setValue(lenRange.to());
85+
ui->lineEditLength->update();
86+
}
87+
}
88+
89+
///
90+
/// \brief DialogDisplayDefinition::on_lineEditLength_valueChanged
91+
///
92+
void DialogDisplayDefinition::on_lineEditLength_valueChanged(const QVariant&)
93+
{
94+
}
95+
96+
///
97+
/// \brief DialogDisplayDefinition::on_comboBoxAddressBase_addressBaseChanged
98+
/// \param base
99+
///
75100
void DialogDisplayDefinition::on_comboBoxAddressBase_addressBaseChanged(AddressBase base)
76101
{
102+
const auto addrSpace = _displayDefinition.AddrSpace;
103+
const bool zeroBased = (base == AddressBase::Base0);
77104
const auto addr = ui->lineEditPointAddress->value<int>();
78105

79-
ui->lineEditPointAddress->setInputRange(ModbusLimits::addressRange(_displayDefinition.AddrSpace, base == AddressBase::Base0));
106+
ui->lineEditPointAddress->setInputRange(ModbusLimits::addressRange(addrSpace, zeroBased));
80107
ui->lineEditPointAddress->setValue(base == AddressBase::Base1 ? qMax(1, addr + 1) : qMax(0, addr - 1));
108+
const int newAddr = ui->lineEditPointAddress->value<int>();
109+
const auto lenRange = ModbusLimits::lengthRange(newAddr, zeroBased, addrSpace);
110+
ui->lineEditLength->setInputRange(lenRange);
111+
if(ui->lineEditLength->value<int>() > lenRange.to())
112+
ui->lineEditLength->setValue(lenRange.to());
81113
}

src/dialogs/dialogdisplaydefinition.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ class DialogDisplayDefinition : public QFixedSizeDialog
2727
void accept() override;
2828

2929
private slots:
30+
void on_lineEditPointAddress_valueChanged(const QVariant&);
31+
void on_lineEditLength_valueChanged(const QVariant&);
3032
void on_comboBoxAddressBase_addressBaseChanged(AddressBase base);
3133

3234
private:

src/dialogs/dialogsetuppresetdata.cpp

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,9 @@ DialogSetupPresetData::DialogSetupPresetData(SetupPresetParams& params, QModbus
1717
ui->setupUi(this);
1818
ui->lineEditAddress->setInputMode(hexAddress ? NumericLineEdit::HexMode : NumericLineEdit::Int32Mode);
1919
ui->lineEditAddress->setInputRange(ModbusLimits::addressRange(params.AddrSpace, params.ZeroBasedAddress));
20-
ui->lineEditNumberOfPoints->setInputRange(ModbusLimits::lengthRange());
2120
ui->lineEditAddress->setValue(params.PointAddress);
21+
22+
ui->lineEditNumberOfPoints->setInputRange(ModbusLimits::lengthRange(params.PointAddress, params.ZeroBasedAddress, params.AddrSpace));
2223
ui->lineEditNumberOfPoints->setValue(params.Length);
2324

2425
switch(pointType)
@@ -51,6 +52,20 @@ DialogSetupPresetData::~DialogSetupPresetData()
5152
}
5253

5354

55+
///
56+
/// \brief DialogSetupPresetData::on_lineEditAddress_valueChanged
57+
///
58+
void DialogSetupPresetData::on_lineEditAddress_valueChanged(const QVariant&)
59+
{
60+
const int address = ui->lineEditAddress->value<int>();
61+
const auto lenRange = ModbusLimits::lengthRange(address, _params.ZeroBasedAddress, _params.AddrSpace);
62+
63+
ui->lineEditNumberOfPoints->setInputRange(lenRange);
64+
if(ui->lineEditNumberOfPoints->value<int>() > lenRange.to()) {
65+
ui->lineEditNumberOfPoints->setValue(lenRange.to());
66+
}
67+
}
68+
5469
///
5570
/// \brief DialogSetupPresetData::accept
5671
///

src/dialogs/dialogsetuppresetdata.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ class DialogSetupPresetData : public QFixedSizeDialog
3030

3131
void accept() override;
3232

33+
private slots:
34+
void on_lineEditAddress_valueChanged(const QVariant&);
35+
3336
private:
3437
Ui::DialogSetupPresetData *ui;
3538
SetupPresetParams& _params;

src/displaydefinition.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ struct DisplayDefinition
3030
DeviceId = qMax<quint8>(ModbusLimits::slaveRange().from(), DeviceId);
3131
PointAddress = qMax<quint16>(ModbusLimits::addressRange(AddrSpace, ZeroBasedAddress).from(), PointAddress);
3232
PointType = qBound(QModbusDataUnit::DiscreteInputs, PointType, QModbusDataUnit::HoldingRegisters);
33-
Length = qBound<quint16>(ModbusLimits::lengthRange().from(), Length, ModbusLimits::lengthRange().to());
33+
Length = qBound<quint16>(ModbusLimits::lengthRange().from(), Length,
34+
(quint16)ModbusLimits::lengthRange(PointAddress, ZeroBasedAddress, AddrSpace).to());
3435
LogViewLimit = qBound<quint16>(4, LogViewLimit, 1000);
3536
DataViewColumnsDistance = qBound<quint16>(1, DataViewColumnsDistance, 32);
3637
}

src/formmodsim.cpp

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ FormModSim::FormModSim(int id, ModbusMultiServer& server, QSharedPointer<DataSim
4949
ui->lineEditAddress->setInputRange(ModbusLimits::addressRange(mbDefs.AddrSpace, true));
5050
ui->lineEditAddress->setValue(0);
5151

52-
ui->lineEditLength->setInputRange(ModbusLimits::lengthRange());
52+
ui->lineEditLength->setInputRange(ModbusLimits::lengthRange(0, true, mbDefs.AddrSpace));
5353
ui->lineEditLength->setValue(100);
5454

5555
ui->comboBoxAddressBase->setCurrentAddressBase(AddressBase::Base1);
@@ -203,6 +203,7 @@ void FormModSim::setDisplayDefinition(const DisplayDefinition& dd)
203203

204204
ui->lineEditLength->blockSignals(true);
205205
ui->lineEditLength->setLeadingZeroes(dd.LeadingZeros);
206+
ui->lineEditLength->setInputRange(ModbusLimits::lengthRange(dd.PointAddress, dd.ZeroBasedAddress, defs.AddrSpace));
206207
ui->lineEditLength->setValue(dd.Length);
207208
ui->lineEditLength->blockSignals(false);
208209

@@ -816,7 +817,18 @@ void FormModSim::show()
816817
///
817818
void FormModSim::on_lineEditAddress_valueChanged(const QVariant&)
818819
{
819-
onDefinitionChanged();
820+
const auto defs = _mbMultiServer.getModbusDefinitions();
821+
const bool zeroBased = (ui->comboBoxAddressBase->currentAddressBase() == AddressBase::Base0);
822+
const int address = ui->lineEditAddress->value<int>();
823+
const auto lenRange = ModbusLimits::lengthRange(address, zeroBased, defs.AddrSpace);
824+
825+
ui->lineEditLength->setInputRange(lenRange);
826+
if(ui->lineEditLength->value<int>() > lenRange.to()) {
827+
ui->lineEditLength->setValue(lenRange.to());
828+
ui->lineEditLength->update();
829+
}
830+
831+
onDefinitionChanged();
820832
}
821833

822834
///
@@ -1110,6 +1122,7 @@ void FormModSim::on_mbDefinitionsChanged(const ModbusDefinitions& defs)
11101122
const auto dd = displayDefinition();
11111123
const auto addr = dd.PointAddress - (dd.ZeroBasedAddress ? 0 : 1);
11121124
ui->lineEditAddress->setInputRange(ModbusLimits::addressRange(defs.AddrSpace, dd.ZeroBasedAddress));
1125+
ui->lineEditLength->setInputRange(ModbusLimits::lengthRange(dd.PointAddress, dd.ZeroBasedAddress, defs.AddrSpace));
11131126
ui->outputWidget->setup(dd, _dataSimulator->simulationMap(), _mbMultiServer.data(dd.DeviceId, dd.PointType, addr, dd.Length));
11141127
}
11151128

src/modbuslimits.h

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77
class ModbusLimits final
88
{
99
public:
10+
static int addressSpaceSize(AddressSpace space) {
11+
return (space == AddressSpace::Addr5Digits) ? 9999 : 65536;
12+
}
1013
static QRange<int> addressRange(AddressSpace space, bool zeroBased = false) {
1114
switch(space) {
1215
case AddressSpace::Addr5Digits:
@@ -16,8 +19,13 @@ class ModbusLimits final
1619
}
1720
return zeroBased ? QRange<int>(0, 65535) : QRange<int>(1, 65536);
1821
}
19-
static QRange<int> lengthRange() { return { 1, 200 }; }
20-
static QRange<int> slaveRange() { return { 1, 255 }; }
22+
static QRange<int> lengthRange() { return { 1, 200 }; }
23+
static QRange<int> lengthRange(int address, bool zeroBased, AddressSpace space) {
24+
const int offset = address - (zeroBased ? 0 : 1);
25+
const int maxLen = qMin(lengthRange().to(), addressSpaceSize(space) - offset);
26+
return { 1, qMax(1, maxLen) };
27+
}
28+
static QRange<int> slaveRange() { return { 1, 255 }; }
2129
};
2230

2331
#endif // MODBUSLIMITS_H

0 commit comments

Comments
 (0)