You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
PayloadAPP/Src/GDDC/gddcdlg.cpp

536 lines
15 KiB
C++

#include "gddcdlg.h"
#include "ui_gddcdlg.h"
#include <QDateTime>
#include <QNetworkInterface>
#include <QTabBar>
#include <QTabWidget>
#include <windows.h>
#include <QDir>
#define CONFIG_PATH "config.ini"
#define CMDPAGEHIGHT 250
#define STATEPAGEWIDTH 250
GDDCdlg::GDDCdlg(QWidget *parent)
: QWidget(parent)
, ui(new Ui::GDDCdlg)
{
ui->setupUi(this);
initWindow();
initParam();
initSignalSlot();
}
GDDCdlg::~GDDCdlg()
{
//停止所有通信
stopConnectURL1();
stopConnectURL2();
stopConnectSerialCtrl();
stopConnectUDPCtrl();
stopConnectTCPCtrl();
delete m_DlgGDDCSet;
delete m_GDDCCmdDlg;
delete m_GDDCStateDlg;
delete ui;
}
//初始化window
void GDDCdlg::initWindow()
{
QPalette palette;
//设置主窗口背景颜色
8 months ago
palette.setColor(QPalette::Window,QColor(50, 50, 50));
this->setPalette(palette);
//嵌入到主窗口
setWindowFlags(Qt::CustomizeWindowHint|Qt::FramelessWindowHint);
hide();
m_DlgGDDCSet = new GDDCSet();
m_GDDCCmdDlg = new GDDCCmdDlg(this);
m_GDDCStateDlg = new GDDCStateInfo(this);
}
//初始化参数
void GDDCdlg::initParam()
{
pointSelectionTracking = false;
Is_openVideo = false;
isCmdPageShow = true;
isStatePageShow = true;
m_DCcmdBuffer.resize(cmdLength);
detectionAreaSetting = false;
connectFlag.resize(10,false);
ui->pushButShowCmdPage->setIcon(QIcon(":/res/down.png"));
ui->pushButShowStatePage->setIcon(QIcon(":/res/right.png"));
}
//初始化信号与槽
void GDDCdlg::initSignalSlot()
{
/*******有四种方式*******/
//方式一
connect(ui->pushButtonSet,SIGNAL(clicked()),this,SLOT(pushButtonSet_clicked()));
//方式二
//connect(ui->pushButtonSet,&QPushButton::clicked,this,&::GDDCdlg::pushButtonSet_clicked);
//方式三
//connect(ui->pushButtonSet, QOverload<bool>::of(&QPushButton::clicked),this,&::GDDCdlg::pushButtonSet_clicked);
//方式四
//connect(ui->pushButtonSet,&QPushButton::clicked,[=](bool check){pushButtonSet_clicked();});
connect(ui->pushButShowCmdPage,SIGNAL(clicked()),this,SLOT(pushButShowCmdPage_clicked())); //控制页面隐藏显示按钮
connect(ui->pushButShowStatePage,SIGNAL(clicked()),this,SLOT(pushButShowStatePage_clicked())); //状态页面隐藏显示按钮
connect(m_DlgGDDCSet,SIGNAL(SignalStartConnect(int)),this,SLOT(startConnect(int))); //开始连接
connect(m_DlgGDDCSet,SIGNAL(SignalStopConnect(int)),this,SLOT(stopConnect(int))); //停止连接
}
//槽函数开始连接
void GDDCdlg::startConnect(int type)
{
switch(type)
{
case 1://播放视频1
stopConnectURL2();
startConnectURL1();
break;
case 2://播放视频2
stopConnectURL1();
startConnectURL2();
break;
case 3://串口控制
startConnectSerialCtrl();
break;
case 4://UDP控制
stopConnectTCPCtrl();
startConnectUDPCtrl();
break;
case 5://TCP控制
stopConnectUDPCtrl();
startConnectTCPCtrl();
break;
default:
break;
}
}
//槽函数停止连接
void GDDCdlg::stopConnect(int type)
{
switch(type)
{
case 1:
stopConnectURL1();
break;
case 2:
stopConnectURL2();
break;
case 3:
stopConnectSerialCtrl();
break;
case 4:
stopConnectUDPCtrl();
break;
case 5:
stopConnectTCPCtrl();
break;
default :
break;
}
}
// bool GDDCdlg::eventFilter(QObject *watched, QEvent *event)
// {
// qDebug() << this->geometry().x();
// qDebug() << this->geometry().y();
// QPoint sPoint2=QCursor::pos();
// qDebug()<<"相对于屏幕坐标2:"<<"("<<sPoint2.rx()<<","<<sPoint2.ry()<<")";
// QPoint windowPoint=this->mapFromGlobal(sPoint2);
// qDebug()<<"相对于窗口坐标:"<<"("<<windowPoint.rx()<<","<<windowPoint.ry()<<")";
// return true;
// }
//鼠标左键
void GDDCdlg::mousePressEvent(QMouseEvent *event)
{
//如果鼠标左键按下
if (event->type() == QEvent::MouseButtonPress) {
//AI检测区域设置
if(m_GDDCCmdDlg->detectionAreaSetting==true)
{
QPointF sPoint1 = event->globalPosition();
sPoint1 = QCursor::pos();
QPointF widgetPoint = ui->WgtffmpegVideo->mapFromGlobal(sPoint1);
double a = ui->WgtffmpegVideo->width();
double b = ui->WgtffmpegVideo->height();
double dir = 1920/a*widgetPoint.rx()-960;
double pitch = -(1080/b*widgetPoint.ry()-540);
m_GDDCCmdDlg->ui->lineEdit_6_1->setText(QString::number((int)dir));
m_GDDCCmdDlg->ui->lineEdit_6_2->setText(QString::number((int)pitch));
}
//目标跟踪
if(m_GDDCCmdDlg->pointSelectionTracking == true)
{
QPointF sPoint1 = event->globalPosition();
QPointF widgetPoint = ui->WgtffmpegVideo->mapFromGlobal(sPoint1);
double a = ui->WgtffmpegVideo->width();
double b = ui->WgtffmpegVideo->height();
double dir = 1920/a*widgetPoint.rx()-960;
double pitch = -(1080/b*widgetPoint.ry()-540);
std::byte buffer[10];
buffer[0] = (std::byte)0x3A;
buffer[1] = (std::byte)(dir);
buffer[2] = (std::byte)((int)dir>>8);
buffer[3] = (std::byte)pitch;
buffer[4] = (std::byte)((int)pitch>>8);
buffer[5] = (std::byte)0x00;
buffer[6] = (std::byte)0x00;
buffer[7] = (std::byte)0x00;
buffer[8] = (std::byte)0x00;
buffer[9] = (std::byte)0x00;
//发送5次
sendCurDate(buffer,3);
}
}
}
//鼠标移动
void GDDCdlg::mouseMoveEvent(QMouseEvent *event)
{
if(m_GDDCCmdDlg->detectionAreaSetting==true)
{
qDebug() << this->geometry().x();
qDebug() << this->geometry().y();
QPointF sPoint1=event->globalPosition();
//qDebug()<<"相对于屏幕坐标1:"<<"("<<sPoint1.rx()<<","<<sPoint1.ry()<<")";
QPointF sPoint2=QCursor::pos();
//qDebug()<<"相对于屏幕坐标2:"<<"("<<sPoint2.rx()<<","<<sPoint2.ry()<<")";
QPointF windowPoint=this->mapFromGlobal(sPoint2);
//qDebug()<<"相对于窗口坐标:"<<"("<<windowPoint.rx()<<","<<windowPoint.ry()<<")";
QPointF widgetPoint=ui->WgtffmpegVideo->mapFromGlobal(sPoint1);
//qDebug()<<"相对于控件坐标:"<<"("<<widgetPoint.rx()<<","<<widgetPoint.ry()<<")";
//更新LineEdit信息
double a = ui->WgtffmpegVideo->width();
double b = ui->WgtffmpegVideo->height();
double dir = 1920/a*widgetPoint.rx()-960;
double pitch = -(1080/b*widgetPoint.ry()-540);
m_GDDCCmdDlg->ui->lineEdit_6_1->setText(QString::number((int)dir));
m_GDDCCmdDlg->ui->lineEdit_6_2->setText(QString::number((int)pitch));
}
}
//区域重绘
void GDDCdlg::resizeEvent(QResizeEvent *event)
{
resizeUI(); //重新设置布局
}
//重新设置布局
void GDDCdlg::resizeUI()
{
/* -------------->x
* | (0,0)
* |
* |
* |
* |
* y
*/
double GDDCPageHeight = (double)(this->height());
double GDDCPageWidth = (double)(this->width());
//qDebug()<<"宽度,高度:"<<GDDCPageHeight<<GDDCPageWidth;
/******控制区位置和大小设置*****/
double cmdAreaHeight;
double cmdAreaWidth;
if(m_GDDCStateDlg->isVisible()){cmdAreaWidth = GDDCPageWidth-STATEPAGEWIDTH;}
else{cmdAreaWidth = GDDCPageWidth;}
if(m_GDDCCmdDlg->isVisible()){cmdAreaHeight = CMDPAGEHIGHT;}
else{cmdAreaHeight = 0;}
m_GDDCCmdDlg->setGeometry(0,GDDCPageHeight-cmdAreaHeight,(int)cmdAreaWidth,(int)cmdAreaHeight);
m_GDDCCmdDlg->ui->tabWidget->setGeometry(0,0,(int)cmdAreaWidth,(int)cmdAreaHeight);
/*********状态区位置和大小设置***********/
double stateAreaHeight = GDDCPageHeight;
double stateAreaWidth;
if(m_GDDCStateDlg->isVisible()){stateAreaWidth = STATEPAGEWIDTH;}
else{stateAreaWidth = 0;}
m_GDDCStateDlg->setGeometry(GDDCPageWidth-stateAreaWidth,0,stateAreaWidth,stateAreaHeight);
m_GDDCStateDlg->ui->tableViewShowIState->setGeometry(0,0,stateAreaWidth,stateAreaHeight);
/*******视频区位置和大小设置********/
double VideoAreaHeight = GDDCPageHeight-cmdAreaHeight; //视频区高度
double VideoAreaWidth = GDDCPageWidth-stateAreaWidth; //视频区宽度
//高度值相对比较大
if(VideoAreaHeight*16>VideoAreaWidth*9)
{
double setVideoAreaWidth = VideoAreaWidth;//等于吊舱页面宽度-状态区高度
double setVideoAreaHeight = VideoAreaWidth*9/16;
ui->WgtffmpegVideo->setGeometry(0,0.5*(VideoAreaHeight-setVideoAreaHeight),(int)setVideoAreaWidth,(int)setVideoAreaHeight);
}
//宽度值相对比较大
else
{
double setVideoAreaHeight = VideoAreaHeight;//等于吊舱页面高度-控制区高度
double setVideoAreaWidth = VideoAreaHeight*16/9;
ui->WgtffmpegVideo->setGeometry(0.5*(VideoAreaWidth-setVideoAreaWidth),0,(int)setVideoAreaWidth,(int)setVideoAreaHeight);
}
/**************设置按钮****************/
ui->pushButtonSet->setGeometry(GDDCPageWidth-stateAreaWidth-45,0,40,40);
/**********控制页显示隐藏按钮********/
ui->pushButShowCmdPage->setGeometry(cmdAreaWidth*0.5,GDDCPageHeight-cmdAreaHeight-20,50,20);
ui->pushButShowCmdPage->raise();
/**********状态页显示隐藏按钮********/
ui->pushButShowStatePage->setGeometry(GDDCPageWidth-stateAreaWidth-20,(stateAreaHeight-cmdAreaHeight)*0.5,20,50);
ui->pushButShowStatePage->raise();
}
//定时器处理
void GDDCdlg::GDDCControlTimeOut()
{
if(sendTimes>0)
{
sendTimes-=1;
//UDP控制
if(connectFlag[3])
{
udpSocket->writeDatagram(m_DCcmdBuffer,m_DlgGDDCSet->m_myPairNetwork.getRemoteAddr(),m_DlgGDDCSet->m_myPairNetwork.getRemotePort());
}
//TCP控制
//串口控制
if(sendTimes==0)
{
clearTJDCCmdBuffer();
}
}
else
{
UpdateDataTJDC();
//UDP控制
if(connectFlag[3])
{
udpSocket->writeDatagram(m_DCcmdBuffer,m_DlgGDDCSet->m_myPairNetwork.getRemoteAddr(),m_DlgGDDCSet->m_myPairNetwork.getRemotePort());
}
//TCP控制
//串口控制
}
}
//更新m_DCcmdBuffer
void GDDCdlg::UpdateDataTJDC()
{
m_GDDCCmdDlg->UpdateDataTJDC();
m_DCcmdBuffer = m_GDDCCmdDlg->m_DCcmdBuffer;
}
//赋值后清空TJDCCmdBuffer
void GDDCdlg::clearTJDCCmdBuffer()
{
m_GDDCCmdDlg->clearTJDCCmdBuffer();
}
//设置发送数据和次数
void GDDCdlg::sendCurDate(std::byte *buffer, int num)
{
sendTimes = num;
for(int i=0;i<10;++i)
{
m_GDDCCmdDlg->TJDCCmdBuffer[i] = buffer[i];
}
UpdateDataTJDC();
}
//播放视频1
void GDDCdlg::startConnectURL1()
{
if(!connectFlag[0])
{
connectFlag[0] = true ;
//ui->WgtffmpegVideo->Isplay(Is_openVideo);
ui->WgtffmpegVideo->play();
ui->WgtffmpegVideo->setUrl(m_DlgGDDCSet->m_playURL1);
ui->WgtffmpegVideo->m_PlayStatus =Is_openVideo;
}
}
//关闭视频1
void GDDCdlg::stopConnectURL1()
{
if(connectFlag[0])
{
connectFlag[0] = false ;
ui->WgtffmpegVideo->m_PlayStatus = Is_openVideo;
ui->WgtffmpegVideo->stop();
}
}
//播放视频2
void GDDCdlg::startConnectURL2()
{
if(!connectFlag[1])
{
connectFlag[1] = true ;
}
}
//关闭视频2
void GDDCdlg::stopConnectURL2()
{
if(connectFlag[1])
{
connectFlag[1] = false ;
}
}
void GDDCdlg::startConnectSerialCtrl()
{
if(!connectFlag[2])
{
connectFlag[2] = true ;
}
}
void GDDCdlg::stopConnectSerialCtrl()
{
if(connectFlag[2])
{
connectFlag[2] = false ;
}
}
//开始UDP控制通信
void GDDCdlg::startConnectUDPCtrl()
{
if(!connectFlag[3])
{
/*启动定时器*/
GDDCControlTimer = new QTimer();
GDDCControlTimer->setInterval(100);
connect(GDDCControlTimer,&QTimer::timeout,this,[=](){
GDDCControlTimeOut();
});
GDDCControlTimer->start();
//创建udp socket对象
udpSocket = new QUdpSocket(this);
/*接收*/
//QList<QHostAddress> ipAddressesList = QNetworkInterface::allAddresses();//获取本机ip
udpSocket->bind(m_DlgGDDCSet->m_myPairNetwork.getLocalPort());
connect(udpSocket,SIGNAL(readyRead()),this,SLOT(UDPMessageReceive()));
connectFlag[3] = true;
}
}
//停止UDP控制通信
void GDDCdlg::stopConnectUDPCtrl()
{
if(connectFlag[3])
{
//关闭定时器
GDDCControlTimer->stop();
delete GDDCControlTimer;
udpSocket->abort();//关闭套接字,并丢缓冲区中的所有待处理数据
delete udpSocket;
connectFlag[3] = false;
}
}
//开始TCP控制通信
void GDDCdlg::startConnectTCPCtrl()
{
if(!connectFlag[4])
{
connectFlag[4] = true;
}
}
//停止TCP控制通信
void GDDCdlg::stopConnectTCPCtrl()
{
if(connectFlag[4])
{
connectFlag[4] = false;
}
}
//设置页面弹出
void GDDCdlg::pushButtonSet_clicked()
{
m_DlgGDDCSet->show();
m_DlgGDDCSet->activateWindow();
}
//udp数据接收
void GDDCdlg::UDPMessageReceive()
{
QByteArray data;
data.resize(udpSocket->pendingDatagramSize());
QHostAddress addr;
quint16 port;
udpSocket->readDatagram(data.data(),data.size(),&addr,&port);
//吊舱状态数据更新
m_GDDCStateDlg->UDPMessageReceive(data,data.size());
}
//控制页面隐藏与显示
void GDDCdlg::pushButShowCmdPage_clicked()
{
if(isCmdPageShow)
{
m_GDDCCmdDlg->setVisible(false);
isCmdPageShow = false;
resizeUI();
ui->pushButShowCmdPage->setIcon(QIcon(":/res/up.png"));
//ui->pushButton->setGeometry(this->width()/2,this->height()-50,50,50);
}
else
{
m_GDDCCmdDlg->setVisible(true);
isCmdPageShow = true;
resizeUI();
ui->pushButShowCmdPage->setIcon(QIcon(":/res/down.png"));
//ui->pushButton->setGeometry(this->width()/2,ui->tabWidget->height(),50,50);
}
}
//状态页面隐藏与显示
void GDDCdlg::pushButShowStatePage_clicked()
{
if(isStatePageShow)
{
m_GDDCStateDlg->setVisible(false);
isStatePageShow = false;
resizeUI();
ui->pushButShowStatePage->setIcon(QIcon(":/res/left.png"));
}
else
{
m_GDDCStateDlg->setVisible(true);
isStatePageShow = true;
resizeUI();
ui->pushButShowStatePage->setIcon(QIcon(":/res/right.png"));
//ui->pushButton->setGeometry(this->width()/2,ui->tabWidget->height(),50,50);
}
}