Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/dev'
Browse files Browse the repository at this point in the history
  • Loading branch information
sanny32 committed Oct 4, 2024
2 parents a92d341 + 8e87312 commit e3671bf
Show file tree
Hide file tree
Showing 11 changed files with 247 additions and 184 deletions.
3 changes: 1 addition & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,7 @@ Open ModScan is a free implimentation of modbus master (client) utility for modb
![image](https://github.com/sanny32/OpenModScan/assets/13627951/c2df0ea1-0f27-4d4b-8cc0-b6268caf8f11)



![image](https://github.com/sanny32/OpenModScan/assets/13627951/2e24982e-3b32-4434-928e-6518505e48ae)
![image](https://github.com/user-attachments/assets/aeae5869-b0a1-469f-9e30-3e68a85b23e1)



Expand Down
2 changes: 1 addition & 1 deletion omodscan/connectiondetails.h
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ struct SerialConnectionParams

void normalize()
{
BaudRate = qBound(QSerialPort::Baud1200, BaudRate, QSerialPort::Baud115200);
BaudRate = qMax(QSerialPort::Baud1200, BaudRate);
WordLength = qBound(QSerialPort::Data5, WordLength, QSerialPort::Data8);
Parity = qBound(QSerialPort::NoParity, Parity, QSerialPort::MarkParity);
FlowControl = qBound(QSerialPort::NoFlowControl, FlowControl, QSerialPort::SoftwareControl);
Expand Down
65 changes: 33 additions & 32 deletions omodscan/controls/modbusmessagewidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -176,7 +176,7 @@ void ModbusMessageWidget::update()
addItem(tr("<b>Protocol ID:</b> %1").arg(protocolId));
addItem(tr("<b>Length:</b> %1").arg(length));
}

addItem(tr("<b>Device ID:</b> %1").arg(formatUInt8Value(_dataDisplayMode, _mm->deviceId())));

if(_mm->isException())
Expand All @@ -193,16 +193,17 @@ void ModbusMessageWidget::update()
QString("%1 (%2)").arg(formatUInt8Value(_dataDisplayMode, func), func) :
formatUInt8Value(_dataDisplayMode, func);
addItem(tr("<b>Function Code:</b> %1").arg(function));
const auto addrBase = tr("(0-based)");

switch(_mm->function())
{
case QModbusPdu::ReadCoils:
if(_mm->isRequest())
{
auto req = reinterpret_cast<const ReadCoilsRequest*>(_mm);
const auto startAddress = req->isValid() ? formatUInt16Value(_dataDisplayMode, req->startAddress()) : "??";
const auto startAddress = req->isValid() ? formatUInt16Value(_dataDisplayMode, req->startAddress()) : "??";
const auto length = req->isValid() ? formatUInt16Value(_dataDisplayMode, req->length()): "??";
addItem(tr("<b>Start Address:</b> %1").arg(startAddress));
addItem(tr("<b>Start Address:</b> %1 %2").arg(startAddress, addrBase));
addItem(tr("<b>Length:</b> %1").arg(length));
}
else
Expand All @@ -219,9 +220,9 @@ void ModbusMessageWidget::update()
if(_mm->isRequest())
{
auto req = reinterpret_cast<const ReadDiscreteInputsRequest*>(_mm);
const auto startAddress = req->isValid() ? formatUInt16Value(_dataDisplayMode, req->startAddress()) : "??";
const auto startAddress = req->isValid() ? formatUInt16Value(_dataDisplayMode, req->startAddress()) : "??";
const auto length = req->isValid() ? formatUInt16Value(_dataDisplayMode, req->length()): "??";
addItem(tr("<b>Start Address:</b> %1").arg(startAddress));
addItem(tr("<b>Start Address:</b> %1 %2").arg(startAddress, addrBase));
addItem(tr("<b>Length:</b> %1").arg(length));
}
else
Expand All @@ -238,9 +239,9 @@ void ModbusMessageWidget::update()
if(_mm->isRequest())
{
auto req = reinterpret_cast<const ReadHoldingRegistersRequest*>(_mm);
const auto startAddress = req->isValid() ? formatUInt16Value(_dataDisplayMode, req->startAddress()) : "??";
const auto startAddress = req->isValid() ? formatUInt16Value(_dataDisplayMode, req->startAddress()) : "??";
const auto length = req->isValid() ? formatUInt16Value(_dataDisplayMode, req->length()): "??";
addItem(tr("<b>Start Address:</b> %1").arg(startAddress));
addItem(tr("<b>Start Address:</b> %1 %2").arg(startAddress, addrBase));
addItem(tr("<b>Length:</b> %1").arg(length));
}
else
Expand All @@ -257,9 +258,9 @@ void ModbusMessageWidget::update()
if(_mm->isRequest())
{
auto req = reinterpret_cast<const ReadInputRegistersRequest*>(_mm);
const auto startAddress = req->isValid() ? formatUInt16Value(_dataDisplayMode, req->startAddress()) : "??";
const auto startAddress = req->isValid() ? formatUInt16Value(_dataDisplayMode, req->startAddress()) : "??";
const auto length = req->isValid() ? formatUInt16Value(_dataDisplayMode, req->length()): "??";
addItem(tr("<b>Start Address:</b> %1").arg(startAddress));
addItem(tr("<b>Start Address:</b> %1 %2").arg(startAddress, addrBase));
addItem(tr("<b>Length:</b> %1").arg(length));
}
else
Expand All @@ -276,17 +277,17 @@ void ModbusMessageWidget::update()
if(_mm->isRequest())
{
auto req = reinterpret_cast<const WriteSingleCoilRequest*>(_mm);
const auto outputAddress = req->isValid() ? formatUInt16Value(_dataDisplayMode, req->address()) : "??";
const auto outputAddress = req->isValid() ? formatUInt16Value(_dataDisplayMode, req->address()) : "??";
const auto outputValue = req->isValid() ? formatUInt16Value(_dataDisplayMode, req->value()) : "??";
addItem(tr("<b>Output Address:</b> %1").arg(outputAddress));
addItem(tr("<b>Output Address:</b> %1 %2").arg(outputAddress, addrBase));
addItem(tr("<b>Output Value:</b> %1").arg(outputValue));
}
else
{
auto resp = reinterpret_cast<const WriteSingleCoilResponse*>(_mm);
const auto outputAddress = resp->isValid() ? formatUInt16Value(_dataDisplayMode, resp->address()) : "??";
const auto outputValue = resp->isValid() ? formatUInt16Value(_dataDisplayMode, resp->value()) : "??";
addItem(tr("<b>Output Address:</b> %1").arg(outputAddress));
addItem(tr("<b>Output Address:</b> %1 %2").arg(outputAddress, addrBase));
addItem(tr("<b>Output Value:</b> %1").arg(outputValue));
}
break;
Expand All @@ -295,17 +296,17 @@ void ModbusMessageWidget::update()
if(_mm->isRequest())
{
auto req = reinterpret_cast<const WriteSingleRegisterRequest*>(_mm);
const auto registerAddress = req->isValid() ? formatUInt16Value(_dataDisplayMode, req->address()) : "??";
const auto registerAddress = req->isValid() ? formatUInt16Value(_dataDisplayMode, req->address()) : "??";
const auto registerValue = req->isValid() ? formatUInt16Value(_dataDisplayMode, req->value()) : "??";
addItem(tr("<b>Register Address:</b> %1").arg(registerAddress));
addItem(tr("<b>Register Address:</b> %1 %2").arg(registerAddress, addrBase));
addItem(tr("<b>Register Value:</b> %1").arg(registerValue));
}
else
{
auto resp = reinterpret_cast<const WriteSingleRegisterResponse*>(_mm);
const auto registerAddress = resp->isValid() ? formatUInt16Value(_dataDisplayMode, resp->address()) : "??";
const auto registerValue = resp->isValid() ? formatUInt16Value(_dataDisplayMode, resp->value()) : "??";
addItem(tr("<b>Register Address:</b> %1").arg(registerAddress));
addItem(tr("<b>Register Address:</b> %1 %2").arg(registerAddress, addrBase));
addItem(tr("<b>Register Value:</b> %1").arg(registerValue));
}
break;
Expand Down Expand Up @@ -374,7 +375,7 @@ void ModbusMessageWidget::update()
const auto quantity = req->isValid() ? formatUInt16Value(_dataDisplayMode, req->quantity()) : "??";
const auto byteCount = req->isValid() ? formatUInt8Value(_dataDisplayMode, req->byteCount()) : "?";
const auto values = req->isValid() ? formatUInt8Array(_dataDisplayMode, req->values()) : "???";
addItem(tr("<b>Starting Address:</b> %1").arg(startAddr));
addItem(tr("<b>Starting Address:</b> %1 %2").arg(startAddr, addrBase));
addItem(tr("<b>Quantity of Outputs:</b> %1").arg(quantity));
addItem(tr("<b>Byte Count:</b> %1").arg(byteCount));
addItem(tr("<b>Output Value:</b> %1").arg(values));
Expand All @@ -384,7 +385,7 @@ void ModbusMessageWidget::update()
auto resp = reinterpret_cast<const WriteMultipleCoilsResponse*>(_mm);
const auto startAddr = resp->isValid() ? formatUInt16Value(_dataDisplayMode, resp->startAddress()) : "??";
const auto quantity = resp->isValid() ? formatUInt16Value(_dataDisplayMode, resp->quantity()) : "??";
addItem(tr("<b>Starting Address:</b> %1").arg(startAddr));
addItem(tr("<b>Starting Address:</b> %1 %2").arg(startAddr, addrBase));
addItem(tr("<b>Quantity of Outputs:</b> %1").arg(quantity));
}
break;
Expand All @@ -397,7 +398,7 @@ void ModbusMessageWidget::update()
const auto quantity = req->isValid() ? formatUInt16Value(_dataDisplayMode, req->quantity()) : "??";
const auto byteCount = req->isValid() ? formatUInt8Value(_dataDisplayMode, req->byteCount()) : "?";
const auto values = req->isValid() ? formatUInt16Array(_dataDisplayMode, req->values(), _byteOrder) : "???";
addItem(tr("<b>Starting Address:</b> %1").arg(startAddr));
addItem(tr("<b>Starting Address:</b> %1 %2").arg(startAddr, addrBase));
addItem(tr("<b>Quantity of Registers:</b> %1").arg(quantity));
addItem(tr("<b>Byte Count:</b> %1").arg(byteCount));
addItem(tr("<b>Registers Value:</b> %1").arg(values));
Expand All @@ -407,7 +408,7 @@ void ModbusMessageWidget::update()
auto resp = reinterpret_cast<const WriteMultipleRegistersResponse*>(_mm);
const auto startAddr = resp->isValid() ? formatUInt16Value(_dataDisplayMode, resp->startAddress()) : "??";
const auto quantity = resp->isValid() ? formatUInt16Value(_dataDisplayMode, resp->quantity()) : "??";
addItem(tr("<b>Starting Address:</b> %1").arg(startAddr));
addItem(tr("<b>Starting Address:</b> %1 %2").arg(startAddr, addrBase));
addItem(tr("<b>Quantity of Registers:</b> %1").arg(quantity));
}
break;
Expand All @@ -416,7 +417,7 @@ void ModbusMessageWidget::update()
if(!_mm->isRequest())
{
auto resp = reinterpret_cast<const ReportServerIdResponse*>(_mm);
const auto byteCount = resp->isValid() ? formatUInt8Value(_dataDisplayMode, resp->byteCount()) : "?";
const auto byteCount = resp->isValid() ? formatUInt8Value(_dataDisplayMode, resp->byteCount()) : "?";
const auto data = resp->isValid() ? formatUInt8Array(_dataDisplayMode, resp->data()) : "?";
addItem(tr("<b>Byte Count:</b> %1").arg(byteCount));
addItem(tr("<b>Data:</b> %1").arg(data));
Expand All @@ -427,7 +428,7 @@ void ModbusMessageWidget::update()
if(_mm->isRequest())
{
auto req = reinterpret_cast<const ReadFileRecordRequest*>(_mm);
const auto byteCount = req->isValid() ? formatUInt8Value(_dataDisplayMode, req->byteCount()) : "?";
const auto byteCount = req->isValid() ? formatUInt8Value(_dataDisplayMode, req->byteCount()) : "?";
const auto data = req->isValid() ? formatUInt8Array(_dataDisplayMode, req->data()) : "?";
addItem(tr("<b>Byte Count:</b> %1").arg(byteCount));
addItem(tr("<b>Data:</b> %1").arg(data));
Expand All @@ -446,7 +447,7 @@ void ModbusMessageWidget::update()
if(_mm->isRequest())
{
auto req = reinterpret_cast<const WriteFileRecordRequest*>(_mm);
const auto length = req->isValid() ? formatUInt8Value(_dataDisplayMode, req->length()) : "?";
const auto length = req->isValid() ? formatUInt8Value(_dataDisplayMode, req->length()) : "?";
const auto data = req->isValid() ? formatUInt8Array(_dataDisplayMode, req->data()) : "???";
addItem(tr("<b>Request Data Length:</b> %1").arg(length));
addItem(tr("<b>Data:</b> %1").arg(data));
Expand All @@ -465,10 +466,10 @@ void ModbusMessageWidget::update()
if(_mm->isRequest())
{
auto req = reinterpret_cast<const MaskWriteRegisterRequest*>(_mm);
const auto address = req->isValid() ? formatUInt16Value(_dataDisplayMode, req->address()) : "??";
const auto address = req->isValid() ? formatUInt16Value(_dataDisplayMode, req->address()) : "??";
const auto andMask = req->isValid() ? formatUInt16Value(_dataDisplayMode, req->andMask()) : "??";
const auto orMask = req->isValid() ? formatUInt16Value(_dataDisplayMode, req->orMask()) : "??";
addItem(tr("<b>Address:</b> %1").arg(address));
const auto orMask = req->isValid() ? formatUInt16Value(_dataDisplayMode, req->orMask()) : "??";
addItem(tr("<b>Address:</b> %1 %2").arg(address, addrBase));
addItem(tr("<b>And Mask:</b> %1").arg(andMask));
addItem(tr("<b>Or Mask:</b> %1").arg(orMask));
}
Expand All @@ -478,7 +479,7 @@ void ModbusMessageWidget::update()
const auto address = resp->isValid() ? formatUInt16Value(_dataDisplayMode, resp->address()) : "??";
const auto andMask = resp->isValid() ? formatUInt16Value(_dataDisplayMode, resp->andMask()) : "??";
const auto orMask = resp->isValid() ? formatUInt16Value(_dataDisplayMode, resp->orMask()) : "??";
addItem(tr("<b>Address:</b> %1").arg(address));
addItem(tr("<b>Address:</b> %1 %2").arg(address, addrBase));
addItem(tr("<b>And Mask:</b> %1").arg(andMask));
addItem(tr("<b>Or Mask:</b> %1").arg(orMask));
}
Expand All @@ -488,15 +489,15 @@ void ModbusMessageWidget::update()
if(_mm->isRequest())
{
auto req = reinterpret_cast<const ReadWriteMultipleRegistersRequest*>(_mm);
const auto readStartAddr = req->isValid() ? formatUInt16Value(_dataDisplayMode, req->readStartAddress()) : "??";
const auto readStartAddr = req->isValid() ? formatUInt16Value(_dataDisplayMode, req->readStartAddress()) : "??";
const auto readLength = req->isValid() ? formatUInt16Value(_dataDisplayMode, req->readLength()) : "??";
const auto writeStartAddr = req->isValid() ? formatUInt16Value(_dataDisplayMode, req->writeStartAddress()) : "??";
const auto writeStartAddr = req->isValid() ? formatUInt16Value(_dataDisplayMode, req->writeStartAddress()) : "??";
const auto writeLength = req->isValid() ? formatUInt16Value(_dataDisplayMode, req->writeLength()) : "??";
const auto writeByteCount = req->isValid() ? formatUInt8Value(_dataDisplayMode, req->writeByteCount()) : "?";
const auto writeValues = req->isValid() ? formatUInt16Array(_dataDisplayMode, req->writeValues(), _byteOrder) : "???";
addItem(tr("<b>Read Starting Address:</b> %1").arg(readStartAddr));
addItem(tr("<b>Read Starting Address:</b> %1 %2").arg(readStartAddr, addrBase));
addItem(tr("<b>Quantity to Read:</b> %1").arg(readLength));
addItem(tr("<b>Write Starting Address:</b> %1").arg(writeStartAddr));
addItem(tr("<b>Write Starting Address:</b> %1 %2").arg(writeStartAddr, addrBase));
addItem(tr("<b>Quantity to Write:</b> %1").arg(writeLength));
addItem(tr("<b>Write Byte Count:</b> %1").arg(writeByteCount));
addItem(tr("<b>Write Registers Value:</b> %1").arg(writeValues));
Expand All @@ -515,8 +516,8 @@ void ModbusMessageWidget::update()
if(_mm->isRequest())
{
auto req = reinterpret_cast<const ReadFifoQueueRequest*>(_mm);
const auto fifoAddr = req->isValid() ? formatUInt16Value(_dataDisplayMode, req->fifoAddress()) : "??";
addItem(tr("<b>FIFO Point Address:</b> %1").arg(fifoAddr));
const auto fifoAddr = req->isValid() ? formatUInt16Value(_dataDisplayMode, req->fifoAddress()) : "??";
addItem(tr("<b>FIFO Point Address:</b> %1 %2").arg(fifoAddr, addrBase));
}
else
{
Expand Down
9 changes: 8 additions & 1 deletion omodscan/controls/numericcombobox.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,5 +34,12 @@ int NumericComboBox::currentValue() const
void NumericComboBox::setCurrentValue(int value)
{
const auto idx = findText(QString::number(value));
setCurrentIndex(idx);
if(idx != -1)
{
setCurrentIndex(idx);
}
else if(isEditable())
{
setCurrentText(QString::number(value));
}
}
4 changes: 2 additions & 2 deletions omodscan/dialogs/dialogabout.ui
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,7 @@
<item>
<widget class="QLabel" name="labelCopyright">
<property name="text">
<string>© Alexandr Ananev, 2024</string>
<string notr="true">© Alexandr Ananev, 2024</string>
</property>
</widget>
</item>
Expand All @@ -161,7 +161,7 @@
<item>
<widget class="QLabel" name="labelLink">
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/sanny32/OpenModScan&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;https://github.com/sanny32/OpenModScan&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
<string notr="true">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/sanny32/OpenModScan&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;https://github.com/sanny32/OpenModScan&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="openExternalLinks">
<bool>true</bool>
Expand Down
2 changes: 1 addition & 1 deletion omodscan/dialogs/dialogconnectiondetails.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ void DialogConnectionDetails::accept()
else
{
_connectionDetails.SerialParams.PortName = ui->comboBoxConnectUsing->currentPortName();
_connectionDetails.SerialParams.BaudRate = (QSerialPort::BaudRate)ui->comboBoxBaudRate->currentValue();
_connectionDetails.SerialParams.BaudRate = qMax(QSerialPort::Baud1200, (QSerialPort::BaudRate)ui->comboBoxBaudRate->currentValue());
_connectionDetails.SerialParams.WordLength = (QSerialPort::DataBits)ui->comboBoxWordLength->currentValue();
_connectionDetails.SerialParams.Parity = ui->comboBoxParity->currentParity();
_connectionDetails.SerialParams.StopBits = (QSerialPort::StopBits)ui->comboBoxStopBits->currentValue();
Expand Down
Loading

0 comments on commit e3671bf

Please sign in to comment.