diff --git a/3part/lp_libtcp/include/libTcp.h b/3part/lp_libtcp/include/libTcp.h new file mode 100644 index 0000000..40c3c55 --- /dev/null +++ b/3part/lp_libtcp/include/libTcp.h @@ -0,0 +1,85 @@ +#ifndef __LIBTCP_H__ +#define __LIBTCP_H__ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +typedef struct tagTP_TCP_CLIENT_PARAM{ + QString user_; // 用户名 + QString host_ip_; // 服务器地址 + quint16 port_{6677}; // 服务器端口 + bool enable_ssl_{false}; // 是否启用SSL + bool auto_reconnect_{false}; // 是否自动重连 +}TP_TCP_CLIENT_PARAM; + +typedef struct tagTP_TCP_SERVER_PARAM{ + QString host_ip_; // 监听地址, *为所有可用地址 + quint16 port_{6677}; // 监听端口 + bool enable_ssl_{false}; // 是否启用SSL + QList user_list_; // 允许的用户列表。空代表无用户验证 +}TP_TCP_SERVER_PARAM; + +typedef enum TpServerStatus +{ + ON_RUNNING = 0, + ON_SHUTDOWN = 1, +}TpServerStatus; + +typedef struct tagTP_CLIENT_STATUS +{ + QString client_name_; + QString client_ip_; + QString host_ip_; + QAbstractSocket::SocketState status; + int session_id_; + QDateTime last_active_time_; +}TP_CLIENT_STATUS; +typedef QMap ClientsStatusMap; + + +typedef enum TpProtoParserStatus +{ + ON_PARSER_INIT = 0, + ON_PARSER_HAED = 1, + ON_PARSER_BODY = 2, +}TpProtoParserStatus; + + +typedef struct tagTP_PROTOCOL_HEAD +{ + quint8 version_; + quint8 magic_; + quint16 server_; + quint32 length_; +}TP_PROTOCOL_HEAD; + +class TP_PROTOCOL_MESSAGE +{ +public: + TP_PROTOCOL_MESSAGE(){} + ~TP_PROTOCOL_MESSAGE(){} + +public: + TP_PROTOCOL_HEAD head; + QJsonObject body; +}; + +Q_DECLARE_METATYPE(QSharedPointer) +#ifndef LPQSHAREDPOINTERQBYTEARRAY +#define LPQSHAREDPOINTERQBYTEARRAY +Q_DECLARE_METATYPE(QSharedPointer) +#endif +Q_DECLARE_METATYPE(QSharedPointer) +#endif //__TP_PROTOCOL_H__ diff --git a/3part/lp_libtcp/include/libTcpClient.h b/3part/lp_libtcp/include/libTcpClient.h new file mode 100644 index 0000000..6f95bdb --- /dev/null +++ b/3part/lp_libtcp/include/libTcpClient.h @@ -0,0 +1,42 @@ +#ifndef LIBTCPCLIENT_H +#define LIBTCPCLIENT_H + +#include + +#include "libTcp.h" +#include + +class TPTcpClient; +class lpTcpClient : public QObject +{ + Q_OBJECT + +public: + lpTcpClient(const TP_TCP_CLIENT_PARAM& init_param, + QObject *parent = 0); + ~lpTcpClient(); + + void IGetVersion(QString &version); + void IGetClientStatus(TP_CLIENT_STATUS& clistatus); + void ISendMessage(TP_PROTOCOL_MESSAGE& msg); + void ISendBinaryData(TP_PROTOCOL_MESSAGE& msg, QByteArray& binaryData); + + void onStartDevice(); + void onStopDevice(); +signals: + void signal_connected(); + void signal_disconnected(); + + void signal_message_receive(QSharedPointer); + void signal_data_send_completed(QSharedPointer); + void signal_data_recv_completed(QSharedPointer, + QSharedPointer ); + + void signal_device_start(); + void signal_send_binary_data(QSharedPointer,QSharedPointer); + void signal_send_package(QSharedPointer); + +private: + QThread tcp_thread_; +}; +#endif // LIBTCPCLIENT_GLOBAL_H diff --git a/3part/lp_libtcp/include/libTcpServer.h b/3part/lp_libtcp/include/libTcpServer.h new file mode 100644 index 0000000..988e6d8 --- /dev/null +++ b/3part/lp_libtcp/include/libTcpServer.h @@ -0,0 +1,48 @@ +#ifndef LIBTCPSERVER_H +#define LIBTCPSERVER_H + +#include + +//#if defined(LIBTCPSERVER_LIBRARY) +//# define LIBTCPSERVERSHARED_EXPORT Q_DECL_EXPORT +//#else +# define LIBTCPSERVERSHARED_EXPORT Q_DECL_IMPORT +//#endif + +#include "libTcp.h" +#include + +class TPTcpServer; + +class lpTcpServer : public QObject +{ + Q_OBJECT + +public: + lpTcpServer(const TP_TCP_SERVER_PARAM& init_param, + QObject *parent = 0); + ~lpTcpServer(); + + ClientsStatusMap IGetClientsStatus(); + const TpServerStatus IGetServerStatus() { return server_status_; } + + void IGetVersion(QString& version); + bool IStartServer(); + void IStopServer(); + void ISendMessage(const QString& strClient, TP_PROTOCOL_MESSAGE& msg); + void ISendBinaryData(const QString& strClient, TP_PROTOCOL_MESSAGE& msg, QByteArray& binaryData); +signals: + void signal_client_connected(const QString&); + void signal_client_disconnected(const QString&); + + void signal_message_received(const QString&, QSharedPointer); + void signal_data_send_completed(QSharedPointer); + void signal_data_recv_completed(const QString& , QSharedPointer, QSharedPointer ); + void signal_data_recv_completed_client(QSharedPointer, QSharedPointer); +private: + QSharedPointer tcp_server_{nullptr}; + QHostAddress listen_addr_; + quint16 listen_port_; + TpServerStatus server_status_; +}; +#endif // LIBTCPSERVER_H diff --git a/3part/lp_libtcp/lib/libTcpClient.lib b/3part/lp_libtcp/lib/libTcpClient.lib new file mode 100644 index 0000000..b620bf3 Binary files /dev/null and b/3part/lp_libtcp/lib/libTcpClient.lib differ diff --git a/3part/lp_libtcp/lib/libTcpClientd.lib b/3part/lp_libtcp/lib/libTcpClientd.lib new file mode 100644 index 0000000..208376e Binary files /dev/null and b/3part/lp_libtcp/lib/libTcpClientd.lib differ diff --git a/3part/lp_libtcp/lib/libTcpServer.lib b/3part/lp_libtcp/lib/libTcpServer.lib new file mode 100644 index 0000000..72638fa Binary files /dev/null and b/3part/lp_libtcp/lib/libTcpServer.lib differ diff --git a/3part/lp_libtcp/lib/libTcpServerd.lib b/3part/lp_libtcp/lib/libTcpServerd.lib new file mode 100644 index 0000000..1cb6c52 Binary files /dev/null and b/3part/lp_libtcp/lib/libTcpServerd.lib differ diff --git a/src/tpMain/Result2Ui.h b/src/tpMain/Result2Ui.h index 8aecf0f..affb8e5 100644 --- a/src/tpMain/Result2Ui.h +++ b/src/tpMain/Result2Ui.h @@ -27,6 +27,9 @@ public: double m_dMinDis;//匹配特征值 int m_channel;//通道 }; +//enum ResultType { +// EM_DETECT +// }; /*定位检测结果*/ struct ValueResult { QString strModel{ "NG" };//型号名 @@ -39,6 +42,7 @@ struct ValueResult { double runtime{ 0 };//定位算法运行时间 QPixmap pixmap; QString strRunState;//运行状态 字符串 + int resultType{-1};// 0 识别OK,定位OK, 1 识别OK,定位异常, 2识别OK,定位未标定 3 识别OK,但没有相关task 4识别NG }; #endif diff --git a/tpvs17/tpMain/QAlgParamDlg.cpp b/tpvs17/tpMain/QAlgParamDlg.cpp new file mode 100644 index 0000000..cb13c41 --- /dev/null +++ b/tpvs17/tpMain/QAlgParamDlg.cpp @@ -0,0 +1,132 @@ +#include "QAlgParamDlg.h" +#include "qshowimg.h" +#include +#include +#include "lpGlobalConfig.h" +#pragma execution_character_set("utf-8") +QAlgParamDlg::QAlgParamDlg(QWidget *parent) + : QWidget(parent) +{ + ui.setupUi(this); + + connect(ui.m_pbShowBackImage, SIGNAL(clicked()), this, SLOT(onButtonClicked())); + connect(ui.m_pbApply, SIGNAL(clicked()), this, SLOT(onButtonClicked())); + connect(ui.m_pbExit, SIGNAL(clicked()), this, SLOT(onButtonClicked())); + ui.label->setVisible(false); +} + +QAlgParamDlg::~QAlgParamDlg() +{ +} + +Q_SLOT void QAlgParamDlg::onButtonClicked() +{ + QString strObj = sender()->objectName(); + if (strObj == "m_pbShowBackImage") + { + QShowImg m_showImgDlg(this); + m_showImgDlg.setWindowFlags(Qt::Dialog | Qt::WindowCloseButtonHint); + m_showImgDlg.setWindowModality(Qt::ApplicationModal); + m_showImgDlg.setAttribute(Qt::WA_ShowModal, true); + m_showImgDlg.setWindowIcon(QIcon(":/image/leaper")); + QString DstPath = ".\\user\\background.png"; + connect(&m_showImgDlg, SIGNAL(sgChangeImg()), this, SLOT(onChangeBG())); + connect(this, SIGNAL(sgChangeBG(QString)), &m_showImgDlg, SLOT(setPicPath(QString))); + m_showImgDlg.setPicPath(DstPath); + m_showImgDlg.exec(); + } + else if (strObj == "m_pbApply") + { + getParam(); + ui.label->setVisible(true); + m_timeID = startTimer(1000); + emit sgParamChange(); + } + else if (strObj == "m_pbExit") + { + close(); + } +} + + +void QAlgParamDlg::showEvent(QShowEvent *event) +{ + setParam(); +} + +void QAlgParamDlg::timerEvent(QTimerEvent *event) +{ + if (m_timeID == event->timerId()) + { + killTimer(m_timeID); + m_timeID = 0; + ui.label->setVisible(false); + } +} + +void QAlgParamDlg::setParam() +{ + ui.checkBox->setChecked(lpGlobalConfig::instance()->algParam.m_UseBackground == 0 ? false : true); + ui.checkBox_equal->setChecked(lpGlobalConfig::instance()->algParam.m_bUseEqual); + ui.spinBox_filterSize->setValue(lpGlobalConfig::instance()->algParam.m_filterSize); + + ui.spinBox_circle_ACThres->setValue(lpGlobalConfig::instance()->algParam.m_Circle_ACThres); + ui.spinBox_circle_EdgeWidth->setValue(lpGlobalConfig::instance()->algParam.m_Circle_EdgeWidth); + ui.comboBox_transform->setCurrentIndex(lpGlobalConfig::instance()->algParam.m_Circle_Polarity); + //ui.checkBox_ratio->setChecked(lpGlobalConfig::instance()->algParam.m_RatioDetectType==0?false:true); + +} + +void QAlgParamDlg::getParam() +{ + lpGlobalConfig::instance()->algParam.m_UseBackground = ui.checkBox->isChecked(); + lpGlobalConfig::instance()->algParam.m_bUseEqual = ui.checkBox_equal->isChecked(); + lpGlobalConfig::instance()->algParam.m_filterSize = ui.spinBox_filterSize->value(); + + lpGlobalConfig::instance()->algParam.m_Circle_ACThres = ui.spinBox_circle_ACThres->value(); + lpGlobalConfig::instance()->algParam.m_Circle_EdgeWidth = ui.spinBox_circle_EdgeWidth->value(); + lpGlobalConfig::instance()->algParam.m_Circle_Polarity = ui.comboBox_transform->currentIndex(); + //lpGlobalConfig::instance()->algParam.m_RatioDetectType = ui.checkBox_ratio->isChecked(); + + lpGlobalConfig::instance()->save(); +} + +Q_SLOT void QAlgParamDlg::onChangeBG() +{ + QFileDialog fileDialog; + fileDialog.setWindowTitle(tr("ѡıͼ")); + fileDialog.setNameFilter("Picture(*.bmp *.jpg *.png)"); + fileDialog.setFileMode(QFileDialog::ExistingFiles); + if (fileDialog.exec() == QDialog::Accepted) + { + QStringList backgroundFile = fileDialog.selectedFiles(); + if (backgroundFile.size() > 0) + { + QString DstPath = QApplication::applicationDirPath() + "\\user\\background.png"; + QString sourcePath = backgroundFile.at(0); + DstPath.replace("\\", "/"); + if (sourcePath == DstPath) { + // //return; + // //return true; + } + if (!QFile::exists(sourcePath)) { + //return false; + } + QDir *createfile = new QDir; + bool exist = createfile->exists(DstPath); + if (exist) { + //if (converFileIfExist){ + createfile->remove(DstPath); + //} + } + if (!QFile::copy(sourcePath, DstPath)) { + //return false; + } + //emit sgChangeBG(DstPath); + QMessageBox infobox(QMessageBox::Information, tr("ʾ"), tr("ͼɣ."), QMessageBox::Yes, NULL); + infobox.setWindowIcon(QIcon(":/image/leaper")); + infobox.setButtonText(QMessageBox::Yes, tr("ȷ")); + infobox.exec(); + } + } +} \ No newline at end of file diff --git a/tpvs17/tpMain/QAlgParamDlg.h b/tpvs17/tpMain/QAlgParamDlg.h new file mode 100644 index 0000000..9f75a2c --- /dev/null +++ b/tpvs17/tpMain/QAlgParamDlg.h @@ -0,0 +1,28 @@ +#ifndef _QALGPARAMDLG_H_ +#define _QALGPARAMDLG_H_ + +#include +#include "ui_QAlgParamDlg.h" + +class QAlgParamDlg : public QWidget +{ + Q_OBJECT + +public: + QAlgParamDlg(QWidget *parent = Q_NULLPTR); + ~QAlgParamDlg(); + Q_SLOT void onButtonClicked(); +signals: + void sgParamChange(); +protected: + virtual void showEvent(QShowEvent *event); + virtual void timerEvent(QTimerEvent *event); + void setParam(); + void getParam(); + Q_SLOT void onChangeBG(); +private: + Ui::QAlgParamDlg ui; + int m_timeID{ 0 }; +}; + +#endif diff --git a/tpvs17/tpMain/QAlgParamDlg.ui b/tpvs17/tpMain/QAlgParamDlg.ui new file mode 100644 index 0000000..afff53d --- /dev/null +++ b/tpvs17/tpMain/QAlgParamDlg.ui @@ -0,0 +1,294 @@ + + + QAlgParamDlg + + + + 0 + 0 + 331 + 286 + + + + 算法参数设置 + + + + + + + + + + + 12 + + + + 圆半径大小过滤: + + + + + + + + 100 + 0 + + + + + 12 + + + + QAbstractSpinBox::NoButtons + + + 999 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + 12 + + + + 检测背景图更换: + + + + + + + + 12 + + + + 查看检测背景 + + + + + + + + + + 12 + + + + 二级圆定位: + + + + + + + 12 + + + + QAbstractSpinBox::NoButtons + + + + + + + + 12 + + + + 边缘宽度: + + + + + + + + 12 + + + + QAbstractSpinBox::NoButtons + + + + + + + + 12 + + + + + 从深到浅 + + + + + 从浅到深 + + + + + + + + + 12 + + + + 边缘对比度: + + + + + + + + 12 + + + + 边缘转换: + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + 12 + + + + 是否使用图像增强 + + + + + + + + 12 + + + + 是否使用背景图找圆算法 + + + + + + + + + + + 参数已生效!!! + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 0 + 30 + + + + + 12 + + + + 应用 + + + + + + + + 0 + 30 + + + + + 12 + + + + 退出 + + + + + + + + + + + diff --git a/tpvs17/tpMain/lpMainWin.cpp b/tpvs17/tpMain/lpMainWin.cpp index 9e2c0cd..ae19783 100644 --- a/tpvs17/tpMain/lpMainWin.cpp +++ b/tpvs17/tpMain/lpMainWin.cpp @@ -614,6 +614,7 @@ void lpMainWin::IVariantMapToUI(const QString& camKey, const QVariantMap& vMap) if(!srcImg.isNull()) valueRlt.pixmap = QPixmap::fromImage(srcImg); valueRlt.strRunState = "no task"; + valueRlt.resultType = 4;//识别出型号 但未标定 onSaveValveResult(valueRlt); } emit(sgShowImgState(tr("显示识别结果"))); @@ -687,6 +688,7 @@ void lpMainWin::IEngineResult(QVariantMap vMap) valueRlt.score = 0; valueRlt.strRunState = "no Cali"; valueRlt.pixmap = QPixmap::fromImage(srcImg); + valueRlt.resultType = 2;//识别出型号 但未标定 onSaveValveResult(valueRlt); return; } @@ -707,6 +709,7 @@ void lpMainWin::IEngineResult(QVariantMap vMap) valueRlt.score = 0; valueRlt.strRunState = "no task"; valueRlt.pixmap = QPixmap::fromImage(srcImg); + valueRlt.resultType = 3;//识别出型号 但未标定 onSaveValveResult(valueRlt); } else { @@ -745,12 +748,14 @@ void lpMainWin::IEngineResult(QVariantMap vMap) ui.main_value_Center_point->setText("-"); ui.main_value_Score->setText(QString("%1").arg(matchScore)); valueRlt.strModel = "NG"; + valueRlt.resultType = 1;//识别出型号 但未标定 } else {//OK ui.main_value_Result->setStyleSheet("background-color: rgb(0, 250, 0);"); ui.main_value_Result->setText("定位成功"); ui.main_value_Center_point->setText(QString("(%1,%2)").arg(centerPoint.x()).arg(centerPoint.y())); ui.main_value_Score->setText(QString("%1").arg(matchScore)); + valueRlt.resultType = 0;//识别出型号 但未标定 } onSaveValveResult(valueRlt); /*展示结果*/ @@ -773,6 +778,8 @@ void lpMainWin::showWidget() else { setMainWindowVisibility(false); } + if(m_trayIcon) + m_trayIcon->show(); } Q_SLOT void lpMainWin::onLogInOut(QString strName, int level, int state) @@ -1691,6 +1698,7 @@ Q_SLOT void lpMainWin::onWebSocketRecvData(QWebSocket* p, QByteArray data) } else if (strcmd == "showWidget") { + this->setWindowFlags(Qt::WindowStaysOnTopHint); this->show(); } else if (strcmd == "hideWidget") @@ -1728,7 +1736,7 @@ void lpMainWin::sendWebAlgRlt(const ValueResult& rlt) sAlgRltObj.insert("center_x", rlt.center.x()); sAlgRltObj.insert("center_y", rlt.center.y()); sAlgRltObj.insert("imagePath", rlt.strImagePath); - + sAlgRltObj.insert("resultType", rlt.resultType); QByteArray imgBuf; QBuffer buf(&imgBuf); rlt.pixmap.save(&buf, "jpeg"); @@ -1770,13 +1778,13 @@ void lpMainWin::setupTrayIcon() QIcon icon(":/image/leaper"); m_trayIcon->setIcon(icon); m_trayIcon->setContextMenu(m_trayIconMenu); - m_trayIcon->show(); + //m_trayIcon->show(); connect(m_trayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(onActivated(QSystemTrayIcon::ActivationReason))); connect(m_restoreAction, &QAction::triggered, this, [this]() { - setMainWindowVisibility(isHidden() - || windowState() == Qt::WindowMinimized - || (qApp->applicationState() == Qt::ApplicationInactive)); + setMainWindowVisibility(isHidden()); +// || windowState() == Qt::WindowMinimized +// || (qApp->applicationState() == Qt::ApplicationInactive)); }); connect(m_quitAction, &QAction::triggered, this, &lpMainWin::onQuitApplication); } @@ -1792,11 +1800,10 @@ Q_SLOT void lpMainWin::onActivated(QSystemTrayIcon::ActivationReason reason) void lpMainWin::setMainWindowVisibility(bool state) { if (state) { - show(); - //showMaximized(); - qApp->processEvents(); - qApp->setActiveWindow(this); - qApp->processEvents(); + onShowMainWindow(); +// qApp->processEvents(); +// qApp->setActiveWindow(this); +// qApp->processEvents(); m_restoreAction->setText(tr("后台运行")); } else { @@ -1923,7 +1930,7 @@ void lpMainWin::paraJson(const QJsonObject& json) } else if (strcmd == "showWidget") { - this->show(); + onShowMainWindow(); } else if (strcmd == "hideWidget") { @@ -1934,4 +1941,48 @@ void lpMainWin::paraJson(const QJsonObject& json) onQuitApplication(); } } -} \ No newline at end of file +} + +void lpMainWin::onShowMainWindow() +{ + if (this->isMinimized() == true) + { + Qt::WindowStates winStatus = Qt::WindowNoState; + if (this->windowState() & Qt::WindowMaximized) + { + winStatus = Qt::WindowMaximized; + } + this->setWindowState(Qt::WindowMinimized); + this->setWindowState(Qt::WindowActive | winStatus); + this->activateWindow(); + this->showNormal(); + } + if (this->isHidden()) + { + Qt::WindowStates winStatus = Qt::WindowNoState; + if (this->windowState() & Qt::WindowMaximized) + { + winStatus = Qt::WindowMaximized; + } + this->setWindowState(Qt::WindowMinimized); + this->setWindowState(Qt::WindowActive | winStatus); + this->activateWindow(); + this->raise(); + this->show(); + } + else { + QRect curGemRect = this->geometry(); + + //激活mpWindow窗体为桌面的顶层窗体 + Qt::WindowStates winStatus = Qt::WindowNoState; + if (this->windowState() & Qt::WindowMaximized) + { + winStatus = Qt::WindowMaximized; + } + this->setWindowState(Qt::WindowMinimized); + this->setWindowState(Qt::WindowActive | winStatus); + this->setGeometry(curGemRect); + this->activateWindow(); + this->raise(); + } +} diff --git a/tpvs17/tpMain/lpMainWin.h b/tpvs17/tpMain/lpMainWin.h index c36bb19..6e0cdbd 100644 --- a/tpvs17/tpMain/lpMainWin.h +++ b/tpvs17/tpMain/lpMainWin.h @@ -117,7 +117,7 @@ protected: Q_SLOT void onPLCTrigerCam(int camID); Q_SLOT void onWebSocketRecvData(QWebSocket* p, QByteArray data); - void onWebHeartBit();//websocket 通讯心跳 + void onTcpHeartBit();//websocket 通讯心跳 void sendWebAlgRlt(const ValueResult& rlt); QJsonObject byte2Json(QByteArray data); QByteArray Json2byte(QJsonObject obj); @@ -146,6 +146,7 @@ private: Q_SLOT void on_data_send_completed(QSharedPointer pmsg); Q_SLOT void on_data_recv_completed(const QString &client_name, QSharedPointer msg_ptr, QSharedPointer pData); void paraJson(const QJsonObject& obj); + void onShowMainWindow(); protected: virtual void timerEvent(QTimerEvent *event); virtual void closeEvent(QCloseEvent *event); diff --git a/tpvs17/valueMainUI/lpDebugUI.cpp b/tpvs17/valueMainUI/lpDebugUI.cpp index 36b0b0b..5567105 100644 --- a/tpvs17/valueMainUI/lpDebugUI.cpp +++ b/tpvs17/valueMainUI/lpDebugUI.cpp @@ -4,7 +4,10 @@ lpDebugUI::lpDebugUI(QWidget *parent) : QWidget(parent) { ui.setupUi(this); - connect(ui.pushButton, SIGNAL(clicked()), this, SLOT(onButtonClicked())); + connect(ui.m_pbTrigerA, SIGNAL(clicked()), this, SLOT(onButtonClicked())); + connect(ui.m_pbTrigerB, SIGNAL(clicked()), this, SLOT(onButtonClicked())); + connect(ui.m_pbTimerA, SIGNAL(clicked()), this, SLOT(onButtonClicked())); + connect(ui.m_pbTimerB, SIGNAL(clicked()), this, SLOT(onButtonClicked())); setWindowIcon(QIcon(":/Resources/icon.png")); } @@ -15,7 +18,19 @@ lpDebugUI::~lpDebugUI() Q_SLOT void lpDebugUI::onButtonClicked() { QString strObj = sender()->objectName(); - if (strObj == "pushButton") { + if (strObj == "m_pbTrigerA") { emit sgButtonClicked(1); } + else if (strObj == "m_pbTrigerB") + { + emit sgButtonClicked(2); + } + else if (strObj == "m_pbTimerA") + { + emit sgButtonClicked(3); + } + else if (strObj == "m_pbTimerB") + { + emit sgButtonClicked(4); + } } diff --git a/tpvs17/valueMainUI/lpDebugUI.ui b/tpvs17/valueMainUI/lpDebugUI.ui index 9349583..d6fdc7f 100644 --- a/tpvs17/valueMainUI/lpDebugUI.ui +++ b/tpvs17/valueMainUI/lpDebugUI.ui @@ -6,31 +6,87 @@ 0 0 - 400 - 300 + 257 + 134 lpDebugUI - - - - 90 - 40 - 101 - 51 - - - - - 12 - - - - 定时触发 - - + + + + + + 0 + 0 + + + + + 12 + + + + A侧触发一次 + + + + + + + + 0 + 0 + + + + + 12 + + + + B侧触发一次 + + + + + + + + 0 + 0 + + + + + 12 + + + + A侧定时触发 + + + + + + + + 0 + 0 + + + + + 12 + + + + B侧定时触发 + + + + diff --git a/tpvs17/valueMainUI/valueMainUI.cpp b/tpvs17/valueMainUI/valueMainUI.cpp index 55ac04f..27d1250 100644 --- a/tpvs17/valueMainUI/valueMainUI.cpp +++ b/tpvs17/valueMainUI/valueMainUI.cpp @@ -143,6 +143,7 @@ Q_SLOT void valueMainUI::onRecvDataStr_A(const QJsonObject& json) double angle = json.value("angle").toDouble(); double cnt_x = json.value("center_x").toDouble(); double cnt_y = json.value("center_y").toDouble(); + int resultType = json.value("resultType").toInt(-1); QString strPath = json.value("imagePath").toString(); QString strBase64 = json.value("imageData_base64").toString(); QByteArray imgbase64 = strBase64.toUtf8(); @@ -155,6 +156,43 @@ Q_SLOT void valueMainUI::onRecvDataStr_A(const QJsonObject& json) .arg(QDateTime::currentDateTime().toString("hh:mm:ss")) .arg(strName).arg(score).arg(angle).arg(cnt_x).arg(cnt_y); ui.textEdit->append(sMsg); + switch (resultType) + { + case 0://识别OK,定位OK + { + ui.label_A->setText(tr("型号 %1,定位角度 %2°").arg(strName).arg(angle)); + ui.label_A->setStyleSheet("font: bold 14px;background-color: rgb(0, 170, 0);"); + + } + break; + case 1://识别OK,定位异常 + { + ui.label_A->setText(tr("型号 %1,定位异常").arg(strName)); + ui.label_A->setStyleSheet("font: bold 14px;background-color: rgb(255, 0, 0);"); + } + break; + case 2://识别OK,定位未标定 + { + ui.label_A->setText(tr("型号 %1,定位模板未标定").arg(strName)); + ui.label_A->setStyleSheet("font: bold 14px;background-color: rgb(255, 170, 0);"); + } + break; + case 3://识别OK,但没有相关task + { + ui.label_A->setText(tr("型号 %1,没有相关定位模板").arg(strName)); + ui.label_A->setStyleSheet("font: bold 14px;background-color: rgb(255, 0, 0);"); + } + break; + case 4: + { + ui.label_A->setText(tr("型号识别失败")); + ui.label_A->setStyleSheet("font: bold 14px;background-color: rgb(255, 0, 0);"); + } + break; + + default: + break; + } } else if (strcmd == "heartbit") { @@ -176,6 +214,7 @@ Q_SLOT void valueMainUI::onRecvDataStr_B(const QJsonObject& json) double angle = json.value("angle").toDouble(); double cnt_x = json.value("center_x").toDouble(); double cnt_y = json.value("center_y").toDouble(); + int resultType = json.value("resultType").toInt(-1); QString strPath = json.value("imagePath").toString(); QString strBase64 = json.value("imageData_base64").toString(); QByteArray imgbase64 = strBase64.toUtf8(); @@ -188,6 +227,43 @@ Q_SLOT void valueMainUI::onRecvDataStr_B(const QJsonObject& json) .arg(QDateTime::currentDateTime().toString("hh:mm:ss")) .arg(strName).arg(score).arg(angle).arg(cnt_x).arg(cnt_y); ui.textEdit_2->append(sMsg); + + switch (resultType) + { + case 0://识别OK,定位OK + { + ui.label_B->setText(tr("型号 %1,定位角度 %2°").arg(strName).arg(angle)); + ui.label_B->setStyleSheet("font: bold 14px;background-color: rgb(0, 170, 0);"); + } + break; + case 1://识别OK,定位异常 + { + ui.label_B->setText(tr("型号 %1,定位异常").arg(strName)); + ui.label_B->setStyleSheet("font: bold 14px;background-color: rgb(255, 0, 0);"); + } + break; + case 2://识别OK,定位未标定 + { + ui.label_B->setText(tr("型号 %1,定位模板未标定").arg(strName)); + ui.label_B->setStyleSheet("font: bold 14px;background-color: rgb(255, 170, 0);"); + } + break; + case 3://识别OK,但没有相关task + { + ui.label_B->setText(tr("型号 %1,没有相关定位模板").arg(strName)); + ui.label_B->setStyleSheet("font: bold 14px;background-color: rgb(255, 0, 0);"); + } + break; + case 4: + { + ui.label_B->setText(tr("型号识别失败")); + ui.label_B->setStyleSheet("font: bold 14px;background-color: rgb(255, 0, 0);"); + } + break; + + default: + break; + } } else if (strcmd == "heartbit") { @@ -256,6 +332,17 @@ Q_SLOT void valueMainUI::onButtonClicked() QString strObj = sender()->objectName(); if (strObj == "actionsettingA") { + if (m_bServerA == false) + { + QMessageBox info(this); + info.setWindowIcon(QIcon(WINDOWICON)); + info.setWindowTitle(QObject::tr("警告")); + info.setText(QObject::tr("A侧检测程序未连接,请检查配置或通讯")); + info.setStandardButtons(QMessageBox::Ok); + info.setButtonText(QMessageBox::Ok, QObject::tr("关闭")); + info.exec(); + return; + } if (tcp_client_ptr_A) { TP_PROTOCOL_MESSAGE msg; @@ -267,6 +354,17 @@ Q_SLOT void valueMainUI::onButtonClicked() } else if (strObj == "actionsettingB") { + if (m_bServerB == false) + { + QMessageBox info(this); + info.setWindowIcon(QIcon(WINDOWICON)); + info.setWindowTitle(QObject::tr("警告")); + info.setText(QObject::tr("B侧检测程序未连接,请检查配置或通讯")); + info.setStandardButtons(QMessageBox::Ok); + info.setButtonText(QMessageBox::Ok, QObject::tr("关闭")); + info.exec(); + return; + } if (tcp_client_ptr_B) { TP_PROTOCOL_MESSAGE msg; @@ -281,7 +379,7 @@ Q_SLOT void valueMainUI::onButtonClicked() m_pDebugUI->setParent(this); m_pDebugUI->setWindowTitle(tr("调试页面")); m_pDebugUI->setWindowFlags(Qt::Dialog | Qt::WindowCloseButtonHint); - m_pDebugUI->setWindowIcon(QIcon(":/image/leaper")); + m_pDebugUI->setWindowIcon(QIcon(WINDOWICON)); m_pDebugUI->setWindowModality(Qt::ApplicationModal); m_pDebugUI->setAttribute(Qt::WA_ShowModal, true); m_pDebugUI->show(); @@ -292,7 +390,7 @@ Q_SLOT void valueMainUI::onButtonClicked() m_pConfigUI->setParent(this); m_pConfigUI->setWindowTitle(tr("系统参数配置页面")); m_pConfigUI->setWindowFlags(Qt::Dialog | Qt::WindowCloseButtonHint); - m_pConfigUI->setWindowIcon(QIcon(":/image/leaper")); + m_pConfigUI->setWindowIcon(QIcon(WINDOWICON)); m_pConfigUI->setWindowModality(Qt::ApplicationModal); m_pConfigUI->setAttribute(Qt::WA_ShowModal, true); m_pConfigUI->show(); @@ -314,14 +412,23 @@ QByteArray valueMainUI::Json2byte(QJsonObject obj) void valueMainUI::timerEvent(QTimerEvent *event) { - if (m_timer == event->timerId()) + if (m_timerA == event->timerId()) { TP_PROTOCOL_MESSAGE msg; QJsonObject sObj; sObj.insert("cmd", "trigerCam"); msg.body = sObj; - tcp_client_ptr_A->ISendMessage(msg); - tcp_client_ptr_B->ISendMessage(msg); + if(tcp_client_ptr_A) + tcp_client_ptr_A->ISendMessage(msg); + } + else if (m_timerB == event->timerId()) + { + TP_PROTOCOL_MESSAGE msg; + QJsonObject sObj; + sObj.insert("cmd", "trigerCam"); + msg.body = sObj; + if (tcp_client_ptr_B) + tcp_client_ptr_B->ISendMessage(msg); } else if (m_SysTimerID == event->timerId()) { @@ -418,13 +525,42 @@ Q_SLOT void valueMainUI::onDebugClicked(int nID) { if (nID == 1) { - if (m_timer != 0) + TP_PROTOCOL_MESSAGE msg; + QJsonObject sObj; + sObj.insert("cmd", "trigerCam"); + msg.body = sObj; + if (tcp_client_ptr_A) + tcp_client_ptr_A->ISendMessage(msg); + } + else if (nID == 2) + { + TP_PROTOCOL_MESSAGE msg; + QJsonObject sObj; + sObj.insert("cmd", "trigerCam"); + msg.body = sObj; + if (tcp_client_ptr_B) + tcp_client_ptr_B->ISendMessage(msg); + } + else if (nID == 3) + { + if (m_timerA != 0) { - killTimer(m_timer); - m_timer = 0; + killTimer(m_timerA); + m_timerA = 0; } else { - m_timer = startTimer(5000); + m_timerA = startTimer(5000); + } + } + else if (nID == 4) + { + if (m_timerB != 0) + { + killTimer(m_timerB); + m_timerB = 0; + } + else { + m_timerB = startTimer(5000); } } } @@ -537,9 +673,7 @@ void valueMainUI::setupTrayIcon() connect(m_trayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(onActivated(QSystemTrayIcon::ActivationReason))); connect(m_restoreAction, &QAction::triggered, this, [this]() { - setMainWindowVisibility(isHidden() - || windowState() == Qt::WindowMinimized - || (qApp->applicationState() == Qt::ApplicationInactive)); + setMainWindowVisibility(isHidden()); }); connect(m_quitAction, &QAction::triggered, this, &valueMainUI::onQuitApplication); } @@ -555,10 +689,7 @@ Q_SLOT void valueMainUI::onActivated(QSystemTrayIcon::ActivationReason reason) void valueMainUI::setMainWindowVisibility(bool state) { if (state) { - show(); - qApp->processEvents(); - qApp->setActiveWindow(this); - qApp->processEvents(); + onShowMainWindow(); m_restoreAction->setText(tr("后台运行")); } else { @@ -593,9 +724,11 @@ Q_SLOT void valueMainUI::onShowUI(bool bDouble) if (bDouble == true) { ui.groupBox_2->setVisible(true); + ui.actionsettingB->setVisible(true); } else { ui.groupBox_2->setVisible(false); + ui.actionsettingB->setVisible(false); } } @@ -655,4 +788,38 @@ Q_SLOT void valueMainUI::on_disconnected_B() onConnected_B(false); } +void valueMainUI::onShowMainWindow() +{ + if (this->isMinimized() == true) + { + this->showNormal(); + } + if (this->isHidden()) + { + Qt::WindowStates winStatus = Qt::WindowNoState; + if (this->windowState() & Qt::WindowMaximized) + { + winStatus = Qt::WindowMaximized; + } + this->setWindowState(Qt::WindowMinimized); + this->setWindowState(Qt::WindowActive | winStatus); + this->activateWindow(); + this->raise(); + this->show(); + } + else { + QRect curGemRect = this->geometry(); + //激活mpWindow窗体为桌面的顶层窗体 + Qt::WindowStates winStatus = Qt::WindowNoState; + if (this->windowState() & Qt::WindowMaximized) + { + winStatus = Qt::WindowMaximized; + } + this->setWindowState(Qt::WindowMinimized); + this->setWindowState(Qt::WindowActive | winStatus); + this->setGeometry(curGemRect); + this->activateWindow(); + this->raise(); + } +} diff --git a/tpvs17/valueMainUI/valueMainUI.h b/tpvs17/valueMainUI/valueMainUI.h index ac509b2..a9f8501 100644 --- a/tpvs17/valueMainUI/valueMainUI.h +++ b/tpvs17/valueMainUI/valueMainUI.h @@ -57,6 +57,7 @@ private://trayIcon Q_SLOT void on_data_recv_completed_B(QSharedPointer msg_ptr, QSharedPointer pData); Q_SLOT void on_connected_B(); Q_SLOT void on_disconnected_B(); + void onShowMainWindow(); protected: virtual void timerEvent(QTimerEvent *event); virtual void closeEvent(QCloseEvent *event); @@ -70,7 +71,8 @@ private: QLabel* m_pLabelB{ nullptr }; QLabel* m_pLabelSystem{ nullptr }; private: - int m_timer{ 0 }; + int m_timerA{ 0 }; + int m_timerB{ 0 }; int m_timerStartID{ 0 }; lpConfigUI *m_pConfigUI{ nullptr }; diff --git a/tpvs17/valueMainUI/valueMainUI.ui b/tpvs17/valueMainUI/valueMainUI.ui index 23179fd..4ea1e96 100644 --- a/tpvs17/valueMainUI/valueMainUI.ui +++ b/tpvs17/valueMainUI/valueMainUI.ui @@ -6,8 +6,8 @@ 0 0 - 918 - 617 + 1043 + 682 @@ -15,8 +15,8 @@ - - + + 5 @@ -29,27 +29,69 @@ - A侧检测工位 + B侧检测工位 - + - + Qt::Vertical - + 0 - 8 + 7 + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + + 0 + 0 + + + + + + + + + + + + 0 + 30 + + + + + 14 + + + + 检测结果 + + + Qt::AlignCenter + + + + - + - + 0 - 1 + 0 @@ -58,8 +100,8 @@ - - + + 5 @@ -72,27 +114,69 @@ - B侧检测工位 + A侧检测工位 - + - + Qt::Vertical - + 0 - 8 + 7 + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + + 0 + 0 + + + + + + + + + + + + 0 + 30 + + + + + 14 + + + + 检测结果 + + + Qt::AlignCenter + + + + - + - + 0 - 1 + 0 @@ -171,6 +255,10 @@ + + + :/Resources/Setting.png:/Resources/Setting.png + 调试