Add qmodmaster and move udp app to applications
This commit is contained in:
216
Applications/qModMaster/forms/tools.cpp
Normal file
216
Applications/qModMaster/forms/tools.cpp
Normal file
@@ -0,0 +1,216 @@
|
||||
#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
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user