#include "gddcStateInfo.h" #include "ui_gddcStateInfo.h" GDDCStateInfo::GDDCStateInfo(QWidget *parent) : QWidget(parent), ui(new Ui::GDDCStateInfo) { ui->setupUi(this); initParam(); } GDDCStateInfo::~GDDCStateInfo() { delete m_tableModel; delete ui; } // 初始化参数 void GDDCStateInfo::initParam() { 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->setEditTriggers( QAbstractItemView::NoEditTriggers); // 不可编辑 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;}"); } // 设置tabwidget的几何位置 void GDDCStateInfo::setTableViewGeometry(int ax, int ay, int aw, int ah) { ui->tableViewShowIState->setGeometry(ax, ay, aw, ah); } /** * @brief udp数据接收 * @param da 数据 * @param size 数据大小 */ void GDDCStateInfo::UDPMessageReceive(QByteArray &da, int size) { QByteArray data = da; // data.resize(size); // 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 GDDCStateInfo::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; }