serialTransferTool/mutilSerialConfigWidget.cpp

153 lines
4.7 KiB
C++

#include "mutilSerialConfigWidget.h"
#include "ui_mutilSerialConfigWidget.h"
#include "serialConnection.h"
#include <QDateTime>
#include <QMenu>
#include <QAction>
#include <QScrollBar>
#include <QDebug>
MutilSerialConfigWidget::MutilSerialConfigWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::MutilSerialConfigWidget)
{
ui->setupUi(this);
on_toolBtnAddLeft_clicked();
on_toolBtnAddRight_clicked();
}
MutilSerialConfigWidget::~MutilSerialConfigWidget()
{
delete ui;
}
void MutilSerialConfigWidget::receiverDataHandle(const QByteArray &data)
{
QDateTime current = QDateTime::currentDateTime();
SerialConnection *conn = qobject_cast<SerialConnection *>(sender());
bool left=false,right=false;
for(ConnectionSettingWidget* wdg:wdgLeftMap.keys()){
if(wdg->getConnection().get()==conn){
left = true;
break;
}
}
if(!left){
for(ConnectionSettingWidget* wdg:wdgRightMap.keys()){
if(wdg->getConnection().get()==conn){
right = true;
break;
}
}
}
if(left){
for(ConnectionSettingWidget* wdg:wdgRightMap.keys()){
SerialConnection *serial = qobject_cast<SerialConnection *>(wdg->getConnection().get());
serial->sendData(data);
}
}else if(right){
for(ConnectionSettingWidget* wdg:wdgLeftMap.keys()){
SerialConnection *serial = qobject_cast<SerialConnection *>(wdg->getConnection().get());
serial->sendData(data);
}
}
if(bStop){
return;
}
QString txt;
if(!bdisplayHex){
txt = QString::fromLocal8Bit(data);
}else{
foreach (const unsigned char byte, data) {
txt += QString("%1").arg(byte,2,16,QChar('0')).toUpper() + " ";
}
}
ui->plainTextEdit->appendPlainText(QString("[%1]%2:%3").arg(current.toString("hh:mm:ss.zzz")).arg(conn->getConnectionName()).arg(txt));
}
void MutilSerialConfigWidget::displayHexHandle()
{
bdisplayHex = true;
}
void MutilSerialConfigWidget::displayAsciiHandle()
{
bdisplayHex = false;
}
void MutilSerialConfigWidget::displayClearHandle()
{
ui->plainTextEdit->clear();
}
void MutilSerialConfigWidget::displayStopHandle()
{
bStop = !bStop;
if(!bStop){
QScrollBar *vScrollBar = ui->plainTextEdit->verticalScrollBar();
vScrollBar->setValue(vScrollBar->maximum());
}
}
void MutilSerialConfigWidget::on_toolBtnAddLeft_clicked()
{
QString protocol = "SERIAL";;
ConnectionSettingWidget *wdg = new ConnectionSettingWidget(protocol);
int row = ui->gridLayoutSerialLeft->rowCount();
ui->gridLayoutSerialLeft->addWidget(wdg,row,0);
wdgLeftMap[wdg] = QPair<int,int>(row,0);
connect(wdg->getConnection().get(),SIGNAL(recvDataSignal(QByteArray)),this,SLOT(receiverDataHandle(QByteArray)),Qt::QueuedConnection);
}
void MutilSerialConfigWidget::on_toolBtnAddRight_clicked()
{
QString protocol = "SERIAL";;
ConnectionSettingWidget *wdg = new ConnectionSettingWidget(protocol);
int row = ui->gridLayoutSerialRight->rowCount();
ui->gridLayoutSerialRight->addWidget(wdg,row,0);
wdgRightMap[wdg] = QPair<int,int>(row,0);
connect(wdg->getConnection().get(),SIGNAL(recvDataSignal(QByteArray)),this,SLOT(receiverDataHandle(QByteArray)),Qt::QueuedConnection);
}
void MutilSerialConfigWidget::on_plainTextEdit_customContextMenuRequested(const QPoint &pos)
{
//Q_UNUSED(pos);
QMenu *menu = new QMenu(this);
QAction *displayHex = new QAction(tr("HEX显示"),this);
QAction *displayAscii = new QAction(tr("ASCII显示"),this);
QAction *displayStop = nullptr;
QAction *displayClear = new QAction(tr("清空"),this);
if(bdisplayHex){
displayHex->setCheckable(true);
displayHex->setChecked(true);
}else{
displayAscii->setCheckable(true);
displayAscii->setChecked(true);
}
if(bStop){
displayStop = new QAction(tr("继续"),this);
}else{
displayStop = new QAction(tr("暂停"),this);
}
menu->addAction(displayHex);
menu->addAction(displayAscii);
menu->addAction(displayStop);
menu->addAction(displayClear);
connect(displayHex,SIGNAL(triggered(bool)),this,SLOT(displayHexHandle()));
connect(displayAscii,SIGNAL(triggered(bool)),this,SLOT(displayAsciiHandle()));
connect(displayClear,SIGNAL(triggered(bool)),this,SLOT(displayClearHandle()));
connect(displayStop,SIGNAL(triggered(bool)),this,SLOT(displayStopHandle()));
//让菜单移动鼠标位置并显示
//menu->exec(QCursor::pos());
menu->exec(ui->plainTextEdit->mapToGlobal(pos));
}