Skip to content

Commit a15fca5

Browse files
committed
Added 32 bit integers to display
1 parent 1fe9723 commit a15fca5

15 files changed

Lines changed: 344 additions & 24 deletions

omodsim/controls/numericlineedit.cpp

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,11 @@ void NumericLineEdit::setInputMode(InputMode mode)
8383
_maxValue = INT_MAX;
8484
break;
8585

86+
case UnsignedMode:
87+
_minValue = 0U;
88+
_maxValue = UINT_MAX;
89+
break;
90+
8691
case FloatMode:
8792
_minValue = -FLT_MAX;
8893
_maxValue = FLT_MAX;
@@ -129,9 +134,23 @@ void NumericLineEdit::internalSetValue(QVariant value)
129134
}
130135
break;
131136

132-
case HexMode:
137+
case UnsignedMode:
133138
value = qBound(_minValue.toUInt(), value.toUInt(), _maxValue.toUInt());
134139
if(_paddingZeroes)
140+
{
141+
const auto text = QStringLiteral("%1").arg(value.toUInt(), _paddingZeroWidth, 10, QLatin1Char('0'));
142+
QLineEdit::setText(text);
143+
}
144+
else
145+
{
146+
const auto text = QString::number(value.toUInt());
147+
QLineEdit::setText(text);
148+
}
149+
break;
150+
151+
case HexMode:
152+
value = qBound(_minValue.toInt() > 0 ? _minValue.toUInt() : 0, value.toUInt(), _maxValue.toUInt());
153+
if(_paddingZeroes)
135154
{
136155
const auto text = QStringLiteral("%1").arg(value.toUInt(), _paddingZeroWidth, 16, QLatin1Char('0'));
137156
QLineEdit::setText(text.toUpper());
@@ -177,6 +196,15 @@ void NumericLineEdit::updateValue()
177196
}
178197
break;
179198

199+
case UnsignedMode:
200+
{
201+
bool ok;
202+
const auto value = text().toUInt(&ok);
203+
if(ok) internalSetValue(value);
204+
else internalSetValue(_value);
205+
}
206+
break;
207+
180208
case HexMode:
181209
{
182210
bool ok;
@@ -240,6 +268,14 @@ void NumericLineEdit::on_textChanged(const QString& text)
240268
}
241269
break;
242270

271+
case UnsignedMode:
272+
{
273+
bool ok;
274+
const auto valueInt = text.toUInt(&ok);
275+
if(ok) value = qBound(_minValue.toUInt(), valueInt, _maxValue.toUInt());
276+
}
277+
break;
278+
243279
case HexMode:
244280
{
245281
bool ok;
@@ -293,6 +329,15 @@ void NumericLineEdit::on_rangeChanged(const QVariant& bottom, const QVariant& to
293329
}
294330
break;
295331

332+
case UnsignedMode:
333+
{
334+
const int nums = QString::number(top.toUInt()).length();
335+
_paddingZeroWidth = qMax(1, nums);
336+
setMaxLength(qMax(1, nums));
337+
setValidator(new QIntValidator(bottom.toUInt(), top.toUInt(), this));
338+
}
339+
break;
340+
296341
case HexMode:
297342
{
298343
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

0 commit comments

Comments
 (0)