Files
2023-Webservices_And_Applic…/Applications/qModMaster/forms/tools.cpp

217 lines
6.2 KiB
C++

#include "tools.h"
#include "ui_tools.h"
#include "QsLog.h"
Tools::Tools(QWidget *parent, ModbusAdapter *adapter, ModbusCommSettings *settings) :
QMainWindow(parent),
m_modbusAdapter(adapter), m_modbusCommSettings(settings),
ui(new Ui::Tools)
{
//setup UI
ui->setupUi(this);
cmbModbusMode = new QComboBox(this);
cmbModbusMode->setMinimumWidth(96);
cmbModbusMode->addItem("RTU/TCP");cmbModbusMode->addItem("TCP");
cmbCmd = new QComboBox(this);
cmbCmd->setMinimumWidth(96);
cmbCmd->addItem("Report Slave ID");
ui->toolBar->addWidget(cmbModbusMode);
ui->toolBar->addWidget(cmbCmd);
ui->toolBar->addSeparator();
ui->toolBar->addAction(ui->actionExec);
ui->toolBar->addAction(ui->actionClear);
ui->toolBar->addAction(ui->actionExit);
//UI - connections
connect(cmbModbusMode,SIGNAL(currentIndexChanged(int)),this,SLOT(changedModbusMode(int)));
connect(ui->actionExec,SIGNAL(triggered(bool)),this,SLOT(execCmd()));
connect(ui->actionClear,SIGNAL(triggered(bool)),this,SLOT(clear()));
connect(ui->actionExit,SIGNAL(triggered()),this,SLOT(exit()));
connect(&m_pingProc,SIGNAL(readyReadStandardOutput()),this,SLOT(pingData()));
connect(&m_pingProc,SIGNAL(readyReadStandardError()),this,SLOT(pingData()));
}
Tools::~Tools()
{
delete ui;
}
void Tools::exit()
{
this->close();
}
QString Tools::ipConv(QString ip)
{
/* convert ip - remove leding 0's */
QStringList m_ip;
QStringList m_ip_conv;
QString m_ip_byte;
m_ip = ip.split(".");
for (int i = 0; i < m_ip.size(); i++){
m_ip_byte = m_ip.at(i);
if (m_ip_byte.at(0)=='0')
m_ip_conv << m_ip_byte.remove(0,1);
else
m_ip_conv << m_ip_byte;
}
return (m_ip_conv.at(0) + "." + m_ip_conv.at(1) + "." + m_ip_conv.at(2) + "." + m_ip_conv.at(3));
}
void Tools::changedModbusMode(int currIndex)
{
QLOG_TRACE()<< "Modbus Mode changed. Index = " << currIndex;
cmbCmd->clear();
if (currIndex == 0) { //RTU/TCP
cmbCmd->addItem("Report Slave ID");
}
else { //TCP
cmbCmd->addItem("Report Slave ID");cmbCmd->addItem("Ping");cmbCmd->addItem("Port Status");
}
}
void Tools::execCmd()
{
ui->txtOutput->moveCursor(QTextCursor::End);
QLOG_TRACE()<< "Tools Execute Cmd " << cmbCmd->currentText();
switch (cmbCmd->currentIndex()){
case 0:
ui->txtOutput->appendPlainText(QString("------- Modbus Diagnotics : Report Slave ID %1 -------\n").arg(m_modbusCommSettings->slaveID()));
diagnosticsProc();
break;
case 1:
ui->txtOutput->appendPlainText(QString("------- Modbus TCP : Ping IP %1 -------\n").arg(m_modbusCommSettings->slaveIP()));
pingProc();
break;
case 2:
ui->txtOutput->appendPlainText(QString("------- Modbus TCP : Check Port %1:%2 Status -------\n").arg(m_modbusCommSettings->slaveIP(),m_modbusCommSettings->TCPPort()));
portProc();
break;
default:
ui->txtOutput->appendPlainText("------- No Valid Selection -------\n");
break;
}
}
void Tools::clear()
{
QLOG_TRACE()<< "Tools Clear Ouput";
ui->txtOutput->clear();
}
void Tools::diagnosticsProc()
{
qApp->processEvents();
ui->txtOutput->moveCursor(QTextCursor::End);
if(m_modbusAdapter->m_modbus != NULL){
modbusDiagnostics();
}
else{
ui->txtOutput->insertPlainText("Not Connected.\n");
}
}
void Tools::pingProc()
{
qApp->processEvents();
m_pingProc.start("ping", QStringList() << ipConv(m_modbusCommSettings->slaveIP()));
if (m_pingProc.waitForFinished(5000)){
//just wait -> execute button is pressed
}
}
void Tools::pingData()
{
qApp->processEvents();
ui->txtOutput->moveCursor(QTextCursor::End);
ui->txtOutput->insertPlainText(m_pingProc.readAll());
}
void Tools::portProc()
{
qApp->processEvents();
ui->txtOutput->moveCursor(QTextCursor::End);
m_portProc.connectToHost(ipConv(m_modbusCommSettings->slaveIP()),m_modbusCommSettings->TCPPort().toInt());
if (m_portProc.waitForConnected(5000)){//wait -> execute button is pressed
ui->txtOutput->insertPlainText("Connected.Port is opened\n");
m_portProc.close();
}
else{
ui->txtOutput->insertPlainText("Not connected.Port is closed\n");
}
}
void Tools::modbusDiagnostics()
{
//Modbus diagnostics - RTU/TCP
QLOG_TRACE()<< "Modbus diagnostics.";
//Modbus data
m_modbusAdapter->setFunctionCode(0x11);
uint8_t dest[1024]; //setup memory for data
memset(dest, 0, 1024);
int ret = -1; //return value from read functions
modbus_set_slave(m_modbusAdapter->m_modbus, m_modbusCommSettings->slaveID());
//request data from modbus
ret = modbus_report_slave_id(m_modbusAdapter->m_modbus, MODBUS_MAX_PDU_LENGTH, dest);
QLOG_TRACE() << "Modbus Read Data return value = " << ret << ", errno = " << errno;
//update data model
if(ret > 1)
{
QString line;
line = dest[1]?"ON":"OFF";
ui->txtOutput->insertPlainText("Run Status : " + line + "\n");
QString id = QString::fromUtf8((char*)dest);
ui->txtOutput->insertPlainText("ID : " + id.right(id.size()-2) + "\n");;
}
else
{
QString line = "";
if(ret < 0) {
line = QString("Error : ") + EUtils::libmodbus_strerror(errno);
QLOG_ERROR() << "Read diagnostics data failed. " << line;
line = QString(tr("Read diagnostics data failed.\nError : ")) + EUtils::libmodbus_strerror(errno);
ui->txtOutput->insertPlainText(line);
}
else {
line = QString("Unknown Error : ") + EUtils::libmodbus_strerror(errno);
QLOG_ERROR() << "Read diagnostics data failed. " << line;
line = QString(tr("Read diagnostics data failed.\nUnknown Error : ")) + EUtils::libmodbus_strerror(errno);
ui->txtOutput->insertPlainText(line);
}
modbus_flush(m_modbusAdapter->m_modbus); //flush data
}
}