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

1105 lines
33 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#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"
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_tableModel;
delete ui;
}
//初始化window
void GDDCdlg::initWindow()
{
QPalette palette;
//设置主窗口背景颜色
palette.setColor(QPalette::Window,QColor(50, 50, 50));
this->setPalette(palette);
//嵌入到主窗口
//int m_height=this->size().rheight();
//int m_width = (m_height*16)/9;
//ui->WgtffmpegVideo->resize(m_width,m_height);
// ui->WgtffmpegVideo->move();
setWindowFlags(Qt::CustomizeWindowHint|Qt::FramelessWindowHint);
hide();
m_DlgGDDCSet = new GDDCSet();
m_GDDCCmdDlg = new GDDCCmdDlg(this);
}
//初始化参数
void GDDCdlg::initParam()
{
m_DCcmdBuffer.resize(cmdLength);
detectionAreaSetting = false;
connectFlag.resize(10,false);
ui->pushButShowCmdArea->setIcon(QIcon(":/res/down.png"));
m_tableModel = new QStandardItemModel();
m_tableModel->setHorizontalHeaderItem(0,new QStandardItem("类型"));
m_tableModel->setHorizontalHeaderItem(1,new QStandardItem("详细信息"));
// m_tableModel->setVerticalHeaderItem(0,new QStandardItem("序号"));
ui->tableViewShowIState->setModel(m_tableModel);
//栅格显示或隐藏
ui->tableViewShowIState->setShowGrid(true);
// 固定表格宽度不可扩展,不可手动调整宽度
ui->tableViewShowIState->horizontalHeader()->setSectionResizeMode(QHeaderView::Fixed);
// 表格宽度随内容自动扩展
//ui->tableViewShowIState->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
// 表格宽度自动根据UI进行计算不可手动调整宽度
//ui->tableViewShowIState->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
// 固定表格高度不可扩展,不可手动调整高度
ui->tableViewShowIState->verticalHeader()->setSectionResizeMode(QHeaderView::Fixed);
// 表格高度随内容自动扩展
//ui->tableViewShowIState->verticalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
// 表格高度自动根据UI进行计算不可手动调整高度
//ui->tableViewShowIState->verticalHeader()->setSectionResizeMode(QHeaderView::Stretch);
ui->tableViewShowIState->setColumnWidth(0,100);
ui->tableViewShowIState->setColumnWidth(1,100);
m_tableModel->setItem(0,0,new QStandardItem("跟踪源类型"));
m_tableModel->setItem(1,0,new QStandardItem("姿态方位角"));
m_tableModel->setItem(2,0,new QStandardItem("姿态俯仰角"));
m_tableModel->setItem(3,0,new QStandardItem("姿态横滚角"));
m_tableModel->setItem(4,0,new QStandardItem("中心点宽坐标"));
m_tableModel->setItem(5,0,new QStandardItem("中心点高坐标"));
m_tableModel->setItem(6,0,new QStandardItem("可见光焦距"));
m_tableModel->setItem(7,0,new QStandardItem("可见光视场角"));
m_tableModel->setItem(8,0,new QStandardItem("红外焦距"));
m_tableModel->setItem(9,0,new QStandardItem("红外视场角"));
m_tableModel->setItem(10,0,new QStandardItem("激光测距值"));
m_tableModel->setItem(11,0,new QStandardItem("命令反馈"));
m_tableModel->setItem(12,0,new QStandardItem("视频输出类型"));
m_tableModel->setItem(13,0,new QStandardItem("红外电子变倍"));
m_tableModel->setItem(14,0,new QStandardItem("可见光电子放大"));
m_tableModel->setItem(15,0,new QStandardItem("吊舱框架方位角"));
m_tableModel->setItem(16,0,new QStandardItem("吊舱框架俯仰角"));
m_tableModel->setItem(17,0,new QStandardItem("吊舱框架横滚角"));
m_tableModel->setItem(18,0,new QStandardItem("TF剩余百分比"));
m_tableModel->setItem(19,0,new QStandardItem("TF卡总容量"));
m_tableModel->setItem(20,0,new QStandardItem("TF插卡状态"));
m_tableModel->setItem(21,0,new QStandardItem("拍照"));
m_tableModel->setItem(22,0,new QStandardItem("视频抓图"));
m_tableModel->setItem(23,0,new QStandardItem("连拍"));
m_tableModel->setItem(24,0,new QStandardItem("视频连续抓图"));
m_tableModel->setItem(25,0,new QStandardItem("录像状态"));
m_tableModel->setItem(26,0,new QStandardItem("文件命名"));
m_tableModel->setItem(27,0,new QStandardItem("当前图像反馈"));
m_tableModel->setItem(28,0,new QStandardItem("载荷类型"));
m_tableModel->setItem(29,0,new QStandardItem("红外机芯"));
m_tableModel->setItem(30,0,new QStandardItem("可见光机芯"));
m_tableModel->setItem(31,0,new QStandardItem("陀螺仪"));
m_tableModel->setItem(32,0,new QStandardItem("角度传感器"));
m_tableModel->setItem(33,0,new QStandardItem("电机"));
m_tableModel->setItem(34,0,new QStandardItem("压缩"));
m_tableModel->setItem(35,0,new QStandardItem("综合控制"));
m_tableModel->setItem(36,0,new QStandardItem("吊舱准备状态"));
m_tableModel->setItem(37,0,new QStandardItem("红外伪彩"));
m_tableModel->setItem(38,0,new QStandardItem("红外图像增强"));
m_tableModel->setItem(39,0,new QStandardItem("当前载荷版本"));
m_tableModel->setItem(40,0,new QStandardItem("目标定位经度"));
m_tableModel->setItem(41,0,new QStandardItem("目标定位纬度"));
m_tableModel->setItem(42,0,new QStandardItem("目标海拔高度"));
m_tableModel->setItem(43,0,new QStandardItem("姿态指示完成反馈"));
m_tableModel->setItem(44,0,new QStandardItem("目标宽"));
m_tableModel->setItem(45,0,new QStandardItem("目标高"));
m_tableModel->setItem(46,0,new QStandardItem("目标类型"));
m_tableModel->setItem(47,0,new QStandardItem("跟踪状态"));
m_tableModel->setItem(48,0,new QStandardItem("最高温"));
m_tableModel->setItem(49,0,new QStandardItem("配置保存"));
m_tableModel->setItem(50,0,new QStandardItem("伺服状态"));
m_tableModel->setItem(51,0,new QStandardItem("超温报警"));
m_tableModel->setItem(52,0,new QStandardItem("红点指示"));
//ui->tableViewShowIState->horizontalHeader()->setStyleSheet("QHeaderView::section{background:rgb(255,228,225);color: black;}");
}
//初始化信号与槽
void GDDCdlg::initSignalSlot()
{
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 = GDDCPageWidth-250;
// if(ui->tabWidget->isVisible()){cmdAreaHeight = 250;}
// else{cmdAreaHeight = 0;}
// ui->tabWidget->setGeometry(0,GDDCPageHeight-cmdAreaHeight,(int)cmdAreaWidth,(int)cmdAreaHeight);
if(m_GDDCCmdDlg->isVisible()){
cmdAreaHeight = 250;
}
else{cmdAreaHeight = 0;}
m_GDDCCmdDlg->setGeometry(0,GDDCPageHeight-cmdAreaHeight,(int)cmdAreaWidth,(int)cmdAreaHeight);
/*********状态区位置和大小设置***********/
double stateAreaHeight = GDDCPageHeight;
double stateAreaWidth;
if(ui->tableViewShowIState->isVisible()){stateAreaWidth = 250;}
else{stateAreaWidth = 0;}
ui->tableViewShowIState->setGeometry(GDDCPageWidth-stateAreaWidth,0,stateAreaWidth,stateAreaHeight);
//ui->listViewShowCmdArea->lower();
/*******视频区位置和大小设置********/
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->pushButShowCmdArea->setGeometry((GDDCPageWidth-200)*0.5,GDDCPageHeight-cmdAreaHeight-20,40,20);
ui->pushButShowCmdArea->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::on_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);
//const char* chardata= data.constData();
qDebug()<<data.data();
if(checkdata(data,data.size(),1))
{
QString str;
double dou;
float flo;
//载荷类型
switch(data.at(2))
{
case '\x01':
str = "白光";
break;
case '\x02':
str = "红外";
break;
case '\x03':
str = "双光";
break;
case '\x04':
str = "三光";
break;
case '\x05':
str = "四光";
break;
default:
str = "未知";
break;
}
m_tableModel->setItem(28,1,new QStandardItem(str));
/*****自检结果*****/
//红外机芯
if((data.at(3)&'\x01')==0x01){
str = "正常";
}
else{
str = "异常";
}
m_tableModel->setItem(29,1,new QStandardItem(str));
//可见光机芯
if((data.at(3)>>1)&'\x01'){
str = "正常";
}
else{
str = "异常";
}
m_tableModel->setItem(30,1,new QStandardItem(str));
//陀螺仪
if((data.at(3)>>2)&'\x01'){
str = "正常";
}
else{
str = "异常";
}
m_tableModel->setItem(31,1,new QStandardItem(str));
//角度传感器
if((data.at(3)>>3)&'\x01'){
str = "正常";
}
else{
str = "异常";
}
m_tableModel->setItem(32,1,new QStandardItem(str));
//驱动板-电机
if((data.at(3)>>4)&'\x01'){
str = "正常";
}
else{
str = "异常";
}
m_tableModel->setItem(33,1,new QStandardItem(str));
//压缩存储
if((data.at(3)>>5)&'\x01'){
str = "正常";
}
else{
str = "异常";
}
m_tableModel->setItem(34,1,new QStandardItem(str));
//综合处理
if((data.at(3)>>6)&'\x01'){
str = "正常";
}
else{
str = "异常";
}
m_tableModel->setItem(35,1,new QStandardItem(str));
//吊舱准备状态
if((data.at(3)>>7)&'\x01'){
str = "已准备好";
}
else{
str = "未准备好";
}
m_tableModel->setItem(36,1,new QStandardItem(str));
/*****吊舱状态1******/
//拍照
if(data.at(4)&'\x01'){
str = "正在拍照";
}
else{
str = "未拍照";
}
m_tableModel->setItem(21,1,new QStandardItem(str));
//视频抓图
if((data.at(4)>>1)&'\x01'){
str = "正在抓图";
}
else{
str = "未抓图";
}
m_tableModel->setItem(22,1,new QStandardItem(str));
//连拍
if((data.at(4)>>2)&'\x01'){
str = "正在连拍";
}
else{
str = "未连拍";
}
m_tableModel->setItem(23,1,new QStandardItem(str));
//视频连续抓图
if((data.at(4)>>3)&'\x01'){
str = "正在连续抓图";
}
else{
str = "未连续抓图";
}
m_tableModel->setItem(24,1,new QStandardItem(str));
//录像状态
if((data.at(4)>>4)&'\x01'){
str = "正在录像";
}
else{
str = "未开始录像";
}
m_tableModel->setItem(25,1,new QStandardItem(str));
//文件命名
if((data.at(4)>>5)&'\x01'){
str = "信息导入完毕";
}
else{
str = "未成功导入";
}
m_tableModel->setItem(26,1,new QStandardItem(str));
//TF插卡状态
if((data.at(4)>>6)&'\x01'){
str = "TF卡已插入";
}
else{
str = "TF卡未插入";
}
m_tableModel->setItem(20,1,new QStandardItem(str));
//超温报警状态
if((data.at(4)>>7)&'\x01'){
str = "超温";
}
else{
str = "未超温";
}
m_tableModel->setItem(51,1,new QStandardItem(str));
//红点指示
if(data.at(5)&'\x01'){
str = "";
}
else{
str = "";
}
m_tableModel->setItem(52,1,new QStandardItem(str));
//备用
//红外图像增强
str = QString::number((data.at(5)>>3)&'\x0F');
m_tableModel->setItem(38,1,new QStandardItem(str));
//备用
//备用
/*****吊舱状态2******/
//备用
//跟踪源类型
if(data.at(6)&'\x02'){
str = "可见光";
}
else{
str = "红外";
}
m_tableModel->setItem(0,1,new QStandardItem(str));
//红外电子变倍
str = QString::number(((data.at(6)>>2)&'\x7F')*0.1,'f', 1);
m_tableModel->setItem(13,1,new QStandardItem(str));
//配置保存
if(data.at(7)&'\x01'){
str = "保存成功";
}
else{
str = "未保存";
}
m_tableModel->setItem(49,1,new QStandardItem(str));
//可见光电子变倍
switch((data.at(7)>>1)&'\x03')
{
case 0:
str = "1x";
break;
case 1:
str = "2x";
break;
case 2:
str = "4x";
break;
default:
str = "未知";
break;
}
m_tableModel->setItem(14,1,new QStandardItem(str));
//红外伪彩-色带
switch((data.at(7)>>3)&'\x1F')
{
case 0x00:
str = "白热";
break;
case 0x01:
str = "黑热";
break;
case 0x02:
str = "彩虹";
break;
case 0x03:
str = "高对比度彩虹";
break;
case 0x04:
str = "铁红";
break;
case 0x05:
str = "熔岩";
break;
case 0x06:
str = "天空";
break;
case 0x07:
str = "中灰";
break;
case 0x08:
str = "灰红";
break;
case 0x09:
str = "紫橙";
break;
case 0x0b:
str = "警示红";
break;
case 0x0c:
str = "冰火";
break;
default:
str = "未知";
break;
}
m_tableModel->setItem(37,1,new QStandardItem(str));
/*********伺服状态********/
//红外伪彩-色带
switch((data.at(7)>>3)&'\x1F')
{
case 0x00:
str = "待命";
break;
case 0x01:
str = "关伺服";
break;
case 0x02:
str = "手动";
break;
case 0x03:
str = "收藏";
break;
case 0x04:
str = "数引";
break;
case 0x05:
str = "航向锁定";
break;
case 0x06:
str = "扫描";
break;
case 0x07:
str = "跟踪";
break;
case 0x08:
str = "垂直下视";
break;
case 0x09:
str = "陀螺自动较漂";
break;
case 0xA0:
str = "陀螺温度较漂";
break;
case 0x0B:
str = "航向随动";
break;
case 0x0C:
str = "归中";
break;
case 0x0D:
str = "手动陀螺较漂";
break;
case 0x0F:
str = "姿态指引";
break;
default:
str = "";
break;
}
m_tableModel->setItem(50,1,new QStandardItem(str));
//吊舱框架方位角
dou = (data.at(9)+data.at(10)*256)*0.01;
str = QString::number(dou,'f', 2);
m_tableModel->setItem(15,1,new QStandardItem(str));
//吊舱框架俯仰角
dou = (data.at(11)+data.at(12)*256)*0.01;
str = QString::number(dou,'f', 2);
m_tableModel->setItem(16,1,new QStandardItem(str));
//吊舱框架横滚角
dou = (data.at(13)+data.at(14)*256)*0.01;
str = QString::number(dou,'f', 2);
m_tableModel->setItem(17,1,new QStandardItem(str));
//当前载荷版本号
str = QString::number(data.at(15)>>4) + "." + QString::number(data.at(15)&'\x07');
m_tableModel->setItem(39,1,new QStandardItem(str));
//红外视场角
dou = ((UINT8)data[16]+(UINT16)data[17]*256)*0.1;
str = QString::number(dou,'f', 1);
m_tableModel->setItem(9,1,new QStandardItem(str));
//TF使用容量百分比
str = QString::number((UINT8)data.at(18))+"%";
m_tableModel->setItem(18,1,new QStandardItem(str));
//可见光视场角
dou = ((UINT8)data.at(19)+(UINT16)data.at(20)*256)*0.1;
str = QString::number(dou,'f', 1);
m_tableModel->setItem(7,1,new QStandardItem(str));
//TF卡总容量
dou = ((UINT8)data.at(21)+(UINT16)data.at(22)*256)*0.1;
str = QString::number(dou,'f', 1);
m_tableModel->setItem(19,1,new QStandardItem(str));
//红外焦距
dou = ((UINT8)data.at(23)+(UINT16)data.at(24)*256)*0.1;
str = QString::number(dou,'f', 1);
m_tableModel->setItem(8,1,new QStandardItem(str));
//可见光焦距-白光
dou = ((UINT8)data.at(25)+(UINT16)data.at(26)*256)*0.1;
str = QString::number(dou,'f', 1);
m_tableModel->setItem(6,1,new QStandardItem(str));
//激光测距距离
str = QString::number((UINT8)data.at(27)+(UINT16)data.at(28)*256);
m_tableModel->setItem(10,1,new QStandardItem(str));
//目标定位经度
flo = m_uint32_to_float(data.at(29),data.at(30),data.at(31),data.at(32));
str = QString::number(flo,'f',6);
m_tableModel->setItem(40,1,new QStandardItem(str));
//目标定位纬度
flo = m_uint32_to_float(data.at(33),data.at(34),data.at(35),data.at(36));
str = QString::number(flo,'f',6);
m_tableModel->setItem(41,1,new QStandardItem(str));
//目标海拔高度
str = QString::number(data.at(37)+data.at(38)*256);
m_tableModel->setItem(42,1,new QStandardItem(str));
//最高温-温度
// dou = (data.at(39)+data.at(40)*256)*0.1;
// str = QString::number(dou,'f',1);
// m_tableModel->setItem(42,1,new QStandardItem(str));
//吊舱姿态方位角
dou = (data.at(41)+data.at(42)*256)*0.01;
str = QString::number(dou,'f',2);
m_tableModel->setItem(1,1,new QStandardItem(str));
//吊舱姿态俯仰角
dou = (data.at(43)+data.at(44)*256)*0.01;
str = QString::number(dou,'f',2);
m_tableModel->setItem(2,1,new QStandardItem(str));
//吊舱姿态横滚角
dou = (data.at(45)+data.at(46)*256)*0.01;
str = QString::number(dou,'f',2);
m_tableModel->setItem(3,1,new QStandardItem(str));
//当前显示图像反馈
switch (data.at(47)) {
case 0x00:
str = "红外";
break;
case 0x01:
str = "可见光";
break;
case 0x02:
str = "上下分屏";
break;
case 0x03:
str = "可见光画中画";
break;
case 0x04:
str = "红外画中画";
break;
case 0x05:
str = "左右分屏";
break;
default:
str = "未知";
break;
}
m_tableModel->setItem(27,1,new QStandardItem(str));
//接收到的命令字反馈
str = QString::number(data.at(48));
m_tableModel->setItem(11,1,new QStandardItem(str));
//姿态指示完成反馈
switch (data.at(49)) {
case 0x12:
str = "姿态指示中";
break;
case 0x13:
str = "姿态指示完成";
break;
default:
str = "------";
break;
}
m_tableModel->setItem(43,1,new QStandardItem(str));
//跟踪中心点宽方向坐标
str = QString::number((UINT8)data[50]+(UINT16)data[51]*256);
m_tableModel->setItem(4,1,new QStandardItem(str));
//跟踪中心点高方向坐标
str = QString::number((UINT8)data[52]+(UINT16)data[53]*256);
m_tableModel->setItem(5,1,new QStandardItem(str));
//目标宽
str = QString::number((UINT8)data.at(54)+data.at(55)*256);
m_tableModel->setItem(44,1,new QStandardItem(str));
//目标高
str = QString::number((UINT8)data.at(56)+data.at(57)*256);
m_tableModel->setItem(45,1,new QStandardItem(str));
//目标类型
switch (data.at(58)) {
case 0x00:
if(data.at(6)&'\x02'){//可见光
str = "";
}
else{//红外
str = "";
}
break;
case 0x01:
if(data.at(6)&'\x02'){//可见光
str = "小汽车";
}
else{//红外
str = "";
}
break;
case 0x02:
if(data.at(6)&'\x02'){//可见光
str = "公交车";
}
break;
case 0x03:
if(data.at(6)&'\x02'){//可见光
str = "卡车";
}
break;
default:
str = "未知";
break;
}
m_tableModel->setItem(46,1,new QStandardItem(str));
//跟踪状态
switch (data.at(59)) {
case 0x00:
str = "空闲状态";
break;
case 0x01:
str = "稳定跟踪";
break;
case 0x02:
str = "记忆跟踪";
break;
case 0x03:
str = "目标丢失";
break;
case 0x05:
str = "截获状态";
break;
default:
str = "未知";
break;
}
m_tableModel->setItem(47,1,new QStandardItem(str));
//最高温
dou = (data.at(60)+data.at(61)*256)*0.1;
str = QString::number(dou,'f',1)+"";
m_tableModel->setItem(48,1,new QStandardItem(str));
//
}
}
bool GDDCdlg::checkdata(QByteArray buffer,int length, int type)
{
if(length!=64){
return false;
}
if((buffer.at(0) != '\xFC')||(buffer.at(1) != '\x2C')||buffer.at(63) !='\xF0')
{
return false;
}
if(type==1)
{
//亦或校验
// for(int i = 2;i<62;++i)
// {
// buffer.at(i)^buffer.at(i+1);
// }
}
else if (type==2)
{
//和校验
}
return true;
}
//控制页面隐藏与显示
void GDDCdlg::on_pushButShowCmdArea_clicked()
{
if(isCmdAreaShow)
{
m_GDDCCmdDlg->setVisible(false);
ui->tableViewShowIState->setVisible(false);
isCmdAreaShow = false;
resizeUI();
ui->pushButShowCmdArea->setIcon(QIcon(":/res/up.png"));
//ui->pushButton->setGeometry(this->width()/2,this->height()-50,50,50);
}
else
{
m_GDDCCmdDlg->setVisible(true);
ui->tableViewShowIState->setVisible(true);
isCmdAreaShow = true;
resizeUI();
ui->pushButShowCmdArea->setIcon(QIcon(":/res/down.png"));
//ui->pushButton->setGeometry(this->width()/2,ui->tabWidget->height(),50,50);
}
}