Skip to content

Commit 65a7ae4

Browse files
committed
Finish 32bit-integers
2 parents 1fe9723 + 26c49c4 commit 65a7ae4

19 files changed

Lines changed: 448 additions & 24 deletions

omodsim/controls/numericlineedit.cpp

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
#include <float.h>
33
#include <QIntValidator>
44
#include "qhexvalidator.h"
5+
#include "quintvalidator.h"
56
#include "numericlineedit.h"
67

78
///
@@ -83,6 +84,11 @@ void NumericLineEdit::setInputMode(InputMode mode)
8384
_maxValue = INT_MAX;
8485
break;
8586

87+
case UnsignedMode:
88+
_minValue = 0U;
89+
_maxValue = UINT_MAX;
90+
break;
91+
8692
case FloatMode:
8793
_minValue = -FLT_MAX;
8894
_maxValue = FLT_MAX;
@@ -129,9 +135,23 @@ void NumericLineEdit::internalSetValue(QVariant value)
129135
}
130136
break;
131137

132-
case HexMode:
138+
case UnsignedMode:
133139
value = qBound(_minValue.toUInt(), value.toUInt(), _maxValue.toUInt());
134140
if(_paddingZeroes)
141+
{
142+
const auto text = QStringLiteral("%1").arg(value.toUInt(), _paddingZeroWidth, 10, QLatin1Char('0'));
143+
QLineEdit::setText(text);
144+
}
145+
else
146+
{
147+
const auto text = QString::number(value.toUInt());
148+
QLineEdit::setText(text);
149+
}
150+
break;
151+
152+
case HexMode:
153+
value = qBound(_minValue.toInt() > 0 ? _minValue.toUInt() : 0, value.toUInt(), _maxValue.toUInt());
154+
if(_paddingZeroes)
135155
{
136156
const auto text = QStringLiteral("%1").arg(value.toUInt(), _paddingZeroWidth, 16, QLatin1Char('0'));
137157
QLineEdit::setText(text.toUpper());
@@ -177,6 +197,15 @@ void NumericLineEdit::updateValue()
177197
}
178198
break;
179199

200+
case UnsignedMode:
201+
{
202+
bool ok;
203+
const auto value = text().toUInt(&ok);
204+
if(ok) internalSetValue(value);
205+
else internalSetValue(_value);
206+
}
207+
break;
208+
180209
case HexMode:
181210
{
182211
bool ok;
@@ -240,6 +269,14 @@ void NumericLineEdit::on_textChanged(const QString& text)
240269
}
241270
break;
242271

272+
case UnsignedMode:
273+
{
274+
bool ok;
275+
const auto valueInt = text.toUInt(&ok);
276+
if(ok) value = qBound(_minValue.toUInt(), valueInt, _maxValue.toUInt());
277+
}
278+
break;
279+
243280
case HexMode:
244281
{
245282
bool ok;
@@ -293,6 +330,15 @@ void NumericLineEdit::on_rangeChanged(const QVariant& bottom, const QVariant& to
293330
}
294331
break;
295332

333+
case UnsignedMode:
334+
{
335+
const int nums = QString::number(top.toUInt()).length();
336+
_paddingZeroWidth = qMax(1, nums);
337+
setMaxLength(qMax(1, nums));
338+
setValidator(new QUIntValidator(bottom.toUInt(), top.toUInt(), this));
339+
}
340+
break;
341+
296342
case HexMode:
297343
{
298344
const int nums = QString::number(top.toUInt(), 16).length();

omodsim/controls/numericlineedit.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ class NumericLineEdit : public QLineEdit
1414
enum InputMode
1515
{
1616
DecMode = 0,
17+
UnsignedMode,
1718
HexMode,
1819
FloatMode,
1920
DoubleMode

omodsim/controls/outputwidget.cpp

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,78 @@ QString formatHexValue(QModbusDataUnit::RegisterType pointType, quint16 value, B
152152
return result.toUpper();
153153
}
154154

155+
///
156+
/// \brief formatLongValue
157+
/// \param pointType
158+
/// \param value1
159+
/// \param value2
160+
/// \param order
161+
/// \param flag
162+
/// \param outValue
163+
/// \return
164+
///
165+
QString formatLongValue(QModbusDataUnit::RegisterType pointType, quint16 value1, quint16 value2, ByteOrder order, bool flag, QVariant& outValue)
166+
{
167+
QString result;
168+
switch(pointType)
169+
{
170+
case QModbusDataUnit::Coils:
171+
case QModbusDataUnit::DiscreteInputs:
172+
outValue = value1;
173+
result = QString("<%1>").arg(value1);
174+
break;
175+
case QModbusDataUnit::HoldingRegisters:
176+
case QModbusDataUnit::InputRegisters:
177+
{
178+
if(flag) break;
179+
180+
const qint32 value = makeLong(value1, value2, order);
181+
outValue = value;
182+
result = result = QString("<%1>").arg(value, 10, 10, QLatin1Char(' '));
183+
}
184+
break;
185+
default:
186+
break;
187+
}
188+
return result;
189+
}
190+
191+
///
192+
/// \brief formatUnsignedLongValue
193+
/// \param pointType
194+
/// \param value1
195+
/// \param value2
196+
/// \param order
197+
/// \param flag
198+
/// \param outValue
199+
/// \return
200+
///
201+
QString formatUnsignedLongValue(QModbusDataUnit::RegisterType pointType, quint16 value1, quint16 value2, ByteOrder order, bool flag, QVariant& outValue)
202+
{
203+
QString result;
204+
switch(pointType)
205+
{
206+
case QModbusDataUnit::Coils:
207+
case QModbusDataUnit::DiscreteInputs:
208+
outValue = value1;
209+
result = QString("<%1>").arg(value1);
210+
break;
211+
case QModbusDataUnit::HoldingRegisters:
212+
case QModbusDataUnit::InputRegisters:
213+
{
214+
if(flag) break;
215+
216+
const quint32 value = makeULong(value1, value2, order);
217+
outValue = value;
218+
result = result = QString("<%1>").arg(value, 10, 10, QLatin1Char('0'));
219+
}
220+
break;
221+
default:
222+
break;
223+
}
224+
return result;
225+
}
226+
155227
///
156228
/// \brief formatFloatValue
157229
/// \param pointType
@@ -456,6 +528,26 @@ void OutputListModel::updateData(const QModbusDataUnit& data)
456528
itemData.ValueStr = formatDoubleValue(pointType, _lastData.value(i+3), _lastData.value(i+2), _lastData.value(i+1), value,
457529
byteOrder, (i%4) || (i+3>=rowCount()), itemData.Value);
458530
break;
531+
532+
case DataDisplayMode::LongInteger:
533+
itemData.ValueStr = formatLongValue(pointType, value, _lastData.value(i+1), byteOrder,
534+
(i%2) || (i+1>=rowCount()), itemData.Value);
535+
break;
536+
537+
case DataDisplayMode::SwappedLI:
538+
itemData.ValueStr = formatLongValue(pointType, _lastData.value(i+1), value, byteOrder,
539+
(i%2) || (i+1>=rowCount()), itemData.Value);
540+
break;
541+
542+
case DataDisplayMode::UnsignedLongInteger:
543+
itemData.ValueStr = formatUnsignedLongValue(pointType, value, _lastData.value(i+1), byteOrder,
544+
(i%2) || (i+1>=rowCount()), itemData.Value);
545+
break;
546+
547+
case DataDisplayMode::SwappedUnsignedLI:
548+
itemData.ValueStr = formatUnsignedLongValue(pointType, _lastData.value(i+1), value, byteOrder,
549+
(i%2) || (i+1>=rowCount()), itemData.Value);
550+
break;
459551
}
460552
}
461553

@@ -892,6 +984,10 @@ void OutputWidget::on_listView_doubleClicked(const QModelIndex& index)
892984
{
893985
case DataDisplayMode::FloatingPt:
894986
case DataDisplayMode::SwappedFP:
987+
case DataDisplayMode::LongInteger:
988+
case DataDisplayMode::SwappedLI:
989+
case DataDisplayMode::UnsignedLongInteger:
990+
case DataDisplayMode::SwappedUnsignedLI:
895991
if(index.row() % 2)
896992
idx = _listModel->index(index.row() - 1);
897993
break;

omodsim/dialogs/dialogwriteholdingregister.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,19 @@ DialogWriteHoldingRegister::DialogWriteHoldingRegister(ModbusWriteParams& writeP
5656
ui->lineEditValue->setInputMode(NumericLineEdit::DoubleMode);
5757
ui->lineEditValue->setValue(_writeParams.Value.toDouble());
5858
break;
59+
60+
case DataDisplayMode::LongInteger:
61+
case DataDisplayMode::SwappedLI:
62+
ui->lineEditValue->setInputRange(INT_MIN, INT_MAX);
63+
ui->lineEditValue->setValue(_writeParams.Value.toInt());
64+
break;
65+
66+
case DataDisplayMode::UnsignedLongInteger:
67+
case DataDisplayMode::SwappedUnsignedLI:
68+
ui->lineEditValue->setInputRange(0U, UINT_MAX);
69+
ui->lineEditValue->setInputMode(NumericLineEdit::UnsignedMode);
70+
ui->lineEditValue->setValue(_writeParams.Value.toUInt());
71+
break;
5972
}
6073
ui->buttonBox->setFocus();
6174
}

omodsim/enums.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,11 @@ enum class DataDisplayMode
5151
FloatingPt,
5252
SwappedFP,
5353
DblFloat,
54-
SwappedDbl
54+
SwappedDbl,
55+
LongInteger,
56+
SwappedLI,
57+
UnsignedLongInteger,
58+
SwappedUnsignedLI
5559
};
5660
Q_DECLARE_METATYPE(DataDisplayMode);
5761

omodsim/floatutils.h

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,25 @@ inline void breakFloat(float value, quint16& lo, quint16& hi, ByteOrder order)
2424
hi = toByteOrderValue(v.asUint16[1], order);
2525
}
2626

27+
///
28+
/// \brief breakLong
29+
/// \param value
30+
/// \param lo
31+
/// \param hi
32+
/// \param order
33+
///
34+
inline void breakLong(qint32 value, quint16& lo, quint16& hi, ByteOrder order)
35+
{
36+
union {
37+
quint16 asUint16[2];
38+
qint32 asInt32;
39+
} v;
40+
v.asInt32 = value;
41+
42+
lo = toByteOrderValue(v.asUint16[0], order);
43+
hi = toByteOrderValue(v.asUint16[1], order);
44+
}
45+
2746
///
2847
/// \brief breakDouble
2948
/// \param value
@@ -67,6 +86,38 @@ inline float makeFloat(quint16 lo, quint16 hi, ByteOrder order)
6786
return v.asFloat;
6887
}
6988

89+
///
90+
/// \brief makeLong
91+
/// \param lo
92+
/// \param hi
93+
/// \param order
94+
/// \return
95+
///
96+
inline qint32 makeLong(quint16 lo, quint16 hi, ByteOrder order)
97+
{
98+
union {
99+
quint16 asUint16[2];
100+
qint32 asInt32;
101+
} v;
102+
103+
v.asUint16[0] = toByteOrderValue(lo, order);
104+
v.asUint16[1] = toByteOrderValue(hi, order);
105+
106+
return v.asInt32;
107+
}
108+
109+
///
110+
/// \brief makeULong
111+
/// \param lo
112+
/// \param hi
113+
/// \param order
114+
/// \return
115+
///
116+
inline quint32 makeULong(quint16 lo, quint16 hi, ByteOrder order)
117+
{
118+
return (quint32)makeLong(lo, hi, order);
119+
}
120+
70121
///
71122
/// \brief makeDouble
72123
/// \param lolo

omodsim/formmodsim.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
#include "formmodsim.h"
1313
#include "ui_formmodsim.h"
1414

15-
QVersionNumber FormModSim::VERSION = QVersionNumber(1, 3);
15+
QVersionNumber FormModSim::VERSION = QVersionNumber(1, 4);
1616

1717
///
1818
/// \brief FormModSim::FormModSim

omodsim/mainwindow.cpp

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,10 @@ void MainWindow::on_awake()
230230
ui->actionBinary->setChecked(ddm == DataDisplayMode::Binary);
231231
ui->actionUnsignedDecimal->setChecked(ddm == DataDisplayMode::Decimal);
232232
ui->actionInteger->setChecked(ddm == DataDisplayMode::Integer);
233+
ui->actionLongInteger->setChecked(ddm == DataDisplayMode::LongInteger);
234+
ui->actionSwappedLI->setChecked(ddm == DataDisplayMode::SwappedLI);
235+
ui->actionUnsignedLongInteger->setChecked(ddm == DataDisplayMode::UnsignedLongInteger);
236+
ui->actionSwappedUnsignedLI->setChecked(ddm == DataDisplayMode::SwappedUnsignedLI);
233237
ui->actionHex->setChecked(ddm == DataDisplayMode::Hex);
234238
ui->actionFloatingPt->setChecked(ddm == DataDisplayMode::FloatingPt);
235239
ui->actionSwappedFP->setChecked(ddm == DataDisplayMode::SwappedFP);
@@ -530,6 +534,35 @@ void MainWindow::on_actionInteger_triggered()
530534
updateDataDisplayMode(DataDisplayMode::Integer);
531535
}
532536

537+
///
538+
/// \brief MainWindow::on_actionLongInteger_triggered
539+
///
540+
void MainWindow::on_actionLongInteger_triggered()
541+
{
542+
updateDataDisplayMode(DataDisplayMode::LongInteger);
543+
}
544+
545+
///
546+
/// \brief MainWindow::on_actionSwappedLI_triggered
547+
///
548+
void MainWindow::on_actionSwappedLI_triggered()
549+
{
550+
updateDataDisplayMode(DataDisplayMode::SwappedLI);
551+
}
552+
553+
///
554+
/// \brief MainWindow::on_actionUnsignedLongInteger_triggered
555+
///
556+
void MainWindow::on_actionUnsignedLongInteger_triggered()
557+
{
558+
updateDataDisplayMode(DataDisplayMode::UnsignedLongInteger);
559+
}
560+
561+
void MainWindow::on_actionSwappedUnsignedLI_triggered()
562+
{
563+
updateDataDisplayMode(DataDisplayMode::SwappedUnsignedLI);
564+
}
565+
533566
///
534567
/// \brief MainWindow::on_actionHex_triggered
535568
///

omodsim/mainwindow.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,10 @@ private slots:
7272
void on_actionBinary_triggered();
7373
void on_actionUnsignedDecimal_triggered();
7474
void on_actionInteger_triggered();
75+
void on_actionLongInteger_triggered();
76+
void on_actionSwappedLI_triggered();
77+
void on_actionUnsignedLongInteger_triggered();
78+
void on_actionSwappedUnsignedLI_triggered();
7579
void on_actionHex_triggered();
7680
void on_actionFloatingPt_triggered();
7781
void on_actionSwappedFP_triggered();

0 commit comments

Comments
 (0)