添加 初始化失败的重试功能

This commit is contained in:
2024-05-23 15:06:03 +08:00
parent 3eb8d67f3a
commit 38f8a56275
17 changed files with 250 additions and 156 deletions
@@ -1,6 +1,6 @@
#include "hd_mvcamera_module.h"
std::mutex moduleMutex;//掉线锁
unsigned int nRet;
QByteArray MV_CC_DeviceInfoListToQByteArray(const MV_CC_DEVICE_INFO_LIST& deviceInfoList) {
QByteArray byteArray;
byteArray.resize(sizeof(MV_CC_DEVICE_INFO_LIST));
@@ -235,7 +235,7 @@ bool Hd_MvCamera_module::sendData(std::vector<cv::Mat>& mat, QByteArray& data)
{
QString inputString = QString::fromUtf8(data);
if (data == "connect")
if (data == "getStatus")
{
data = mv_Status;
return true;
@@ -292,12 +292,16 @@ bool Hd_MvCamera_module::initParas(QByteArray&)
MV_CC_StopGrabbing(handle);
MV_CC_CloseDevice(handle);
MV_CC_DestroyHandle(handle);
return false;
//return false;
}
//打开相机
unsigned int nRet = MV_CC_CreateHandle(&handle, m_stDevList.pDeviceInfo[index]);
nRet = MV_CC_CreateHandle(&handle, m_stDevList.pDeviceInfo[index]);
if (nRet != 0)
mv_Status = u8"句柄创建失败MV_CC_CreateHandle"+ QByteArray::number(nRet, 16).toUpper();
nRet = MV_CC_OpenDevice(handle);
if (nRet != 0)
mv_Status = u8"打开设备失败MV_CC_OpenDevice"+ QByteArray::number(nRet, 16).toUpper();
////触发模式
nRet = MV_CC_SetEnumValue(handle, "TriggerSource", MV_TRIGGER_SOURCE_SOFTWARE);
nRet = MV_CC_SetEnumValue(handle, "TriggerMode", MV_TRIGGER_MODE_ON);
Binary file not shown.
@@ -108,21 +108,22 @@ QString Hd_SocketModule_ModbusTcp::ShortToHex(int value)
Hd_SocketModule_ModbusTcp::Hd_SocketModule_ModbusTcp()
{
m_Mutex = new QMutex;
m_Thread = new MyThread(this);
m_Thread->setMutexLock(m_Mutex);
//m_Thread = new MyThread(this);
m_Thread.setMutexLock(m_Mutex);
}
Hd_SocketModule_ModbusTcp::~Hd_SocketModule_ModbusTcp()
{
m_Thread->setRunStop();
m_Thread->wait();
m_Thread->quit();
if (m_Thread)
{
qDebug() << "[INFO] "<< "~m_Thread()";
delete m_Thread;
m_Thread = nullptr;
}
m_Thread.setRunStop();
m_Thread.wait();
m_Thread.quit();
m_Thread.terminate();
//if (m_Thread)
//{
// qDebug() << "[INFO] "<< "~m_Thread()";
// delete m_Thread;
// m_Thread = nullptr;
//}
qDebug() << "[INFO] " << "~Hd_SocketModule_ModbusTcp success!";
}
@@ -395,8 +396,8 @@ bool Hd_SocketModule_ModbusTcp::initParas(QByteArray& data)
qDebug() << "[TCP] " << "list: " << list;
setSleepTimeAndReadNum(sleepvalue.toInt(), readvalue.toInt());
m_Thread->setSocketIp(m_Station);
if (!m_Thread->setIpAndPort(m_IP, m_host))
m_Thread.setSocketIp(m_Station);
if (!m_Thread.setIpAndPort(m_IP, m_host))
{
qDebug() << "[TCP] " << "m_IP:" << m_IP << " m_host:" << m_host << " connectToHost failed!";
return false;
@@ -406,13 +407,17 @@ bool Hd_SocketModule_ModbusTcp::initParas(QByteArray& data)
//开启读PLC数据的客户端
//开启socket
//第一次运行,创建socket对象,后面发一次握手报文
m_Thread->start();
Sleep(500);
if (!m_Thread->getInitSuccessFlag())
m_Thread.start();
int cnt = 0;
while (!m_Thread.getInitSuccessFlag())
{
qCritical() << "[TCP] " << "TCP init failed!";
return false;
QThread::msleep(100);
cnt++;
if(cnt>50)
{
qCritical() << "[TCP] " << "TCP init failed!";
return false;
}
}
//// 发送握手指令
@@ -421,7 +426,7 @@ bool Hd_SocketModule_ModbusTcp::initParas(QByteArray& data)
//WritePLCPack.append(array);
// 开启线程循环
m_Thread->start();
m_Thread.start();
return true;
}
@@ -434,7 +439,7 @@ bool Hd_SocketModule_ModbusTcp::run()
void Hd_SocketModule_ModbusTcp::setSleepTimeAndReadNum(int time, int num)
{
m_sleepTime = time;
m_Thread->setReadPackValue(num);
m_Thread.setReadPackValue(num);
}
////写单个寄存器指令,封装为报文
//bool Hd_SocketModule_ModbusTcp::writeCommond(QString DM, QString Num)
@@ -923,7 +928,6 @@ MyThread::~MyThread()
delete m_mutex_lock;
m_mutex_lock = nullptr;
}
std::exit(EXIT_SUCCESS);
}
@@ -998,6 +1002,7 @@ void MyThread::run()
if (rtn == HDTcpStatus::Success)
{
qWarning() << "[TCP] " << " You have connected to the server ";
init_success = true;
}
else
{
@@ -17,8 +17,41 @@
#pragma comment(lib,"./HslComunnicationCpp.lib")
#include "base.h"
class MyThread;
class writeThread;
class MyThread : public QThread
{
Q_OBJECT
public:
MyThread() {};
~MyThread();
bool setIpAndPort(QString ip, QString port);
void run();
void readSocketData(); //读取数据
void writeSocketData(); //写入数据
void decodePack();
void setMutexLock(QMutex* lock) { m_mutex_lock = lock; }
void setRunStop() { init_flag = 2; }
void setReadPackValue(int value);
void closeSocket();
bool getInitSuccessFlag() { return init_success; }
bool disReconnects();
void setSocketIp(QString Station) { m_Station = Station; }
private:
QString m_IP;
QString m_Port;
QString m_Station;
QMutex m_Mutex;
QByteArray reciveData;
QString socketIp;
bool init_success = false; // 初始化成功 返回true;失败返回false
int init_flag = 0; // false为完整数据包,true为非完整数据包
int m_readPackValue = 122; // 接受50个数据包的长度 为 122 ,加包头一起为 130, 如果是 100的话就是 222 加包头为230
QMutex* m_mutex_lock = nullptr;
//QTcpSocket *tcpsocket = nullptr; // tcp通信的socket
HDTcpBase* tcpsocket = nullptr;
};
class Hd_SocketModule_ModbusTcp :public Base
{
Q_OBJECT
@@ -75,43 +108,7 @@ private:
//MyThread *m_Thread = nullptr;
//QTcpSocket* tcpsocket = nullptr; //tcp通信的socket
QMutex* m_Mutex = nullptr;
MyThread* m_Thread = nullptr;
};
//自己创建线程
class MyThread : public QThread
{
Q_OBJECT
public:
explicit MyThread(QObject *parent = nullptr):QThread(parent){}
~MyThread();
bool setIpAndPort(QString ip,QString port);
void run();
void readSocketData(); //读取数据
void writeSocketData(); //写入数据
void decodePack();
void setMutexLock(QMutex* lock) { m_mutex_lock = lock; }
void setRunStop(){ init_flag = 2;}
void setReadPackValue(int value);
void closeSocket();
bool getInitSuccessFlag(){return init_success;}
bool disReconnects();
void setSocketIp(QString Station) { m_Station = Station; }
private:
QString m_IP;
QString m_Port;
QString m_Station;
QMutex m_Mutex;
QByteArray reciveData;
QString socketIp;
bool init_success = true; // 初始化成功 返回true;失败返回false
int init_flag = 0; // false为完整数据包,true为非完整数据包
int m_readPackValue = 122; // 接受50个数据包的长度 为 122 ,加包头一起为 130, 如果是 100的话就是 222 加包头为230
QMutex* m_mutex_lock = nullptr;
//QTcpSocket *tcpsocket = nullptr; // tcp通信的socket
HDTcpBase* tcpsocket = nullptr;
MyThread m_Thread;
};
extern "C"
@@ -14,18 +14,34 @@ backEndManager::backEndManager()
}
void backEndManager::run()
{
if(isinit ==false)
if(isInit == ReInit)
{
if (_cameraManager != nullptr)
delete _cameraManager;
if (_triggerManager != nullptr)
delete _triggerManager;
_triggerManager = new triggerManager();
_cameraManager = new cameraManager();
isInit = NotInit;
}
if(isInit == NotInit)
{
std::vector<std::future<void>> futures;//Òì²½³õʼ»¯
futures.push_back(std::async(std::launch::async, &triggerManager::init, _triggerManager, this));
futures.push_back(std::async(std::launch::async, &cameraManager::init, _cameraManager, this));
for (auto& future : futures) {
future.wait();
}
isinit = true;
sendInitFinished(true);
if (_triggerManager->isInit == true && _cameraManager->isInit == true)
isInit = InitOK;
else
isInit = InitFailure;
sendInitFinished(isInit);
}
}
backEndManager::~backEndManager()
{
_triggerManager->stop();
+15 -7
View File
@@ -13,28 +13,36 @@ class backEndManager :public QThread
{
Q_OBJECT
public:
initStatus isInit = NotInit;
QMutex mutex;
//数据类
jsonConfiguration* _jsonConfiguration;
detDataManager* _detDataManager;
jsonConfiguration* _jsonConfiguration = nullptr;
detDataManager* _detDataManager = nullptr;
//线程类
triggerManager* _triggerManager;//触发器
cameraManager* _cameraManager;//
threadManager* _threadManager;
triggerManager* _triggerManager = nullptr;//触发器
cameraManager* _cameraManager = nullptr;//
threadManager* _threadManager = nullptr;
backEndManager();
~backEndManager();
void init()
{
isInit = NotInit;
this->start();
}
void run();
public slots:
void reInitSlot()
{
isInit = ReInit;
this->start();
}
private:
bool isinit = false;
signals:
void sendErrorToMainwindow(backEndError);
void sendPixmapImageWidget(showImgPack*);
void sendInitFinished(bool);
void sendInitFinished(int);
void sendInitString(QString);//初始化日志
};
#endif
@@ -189,10 +189,17 @@ void cameraManager::init(backEndManager* input)
camera* _camera = new camera(m_module,_backEndManager, cameras.size());
QObject::connect(_camera, &camera::S1, this, &cameraManager::R1);
cameras.insert(std::make_pair(m_module.key.toStdString(), _camera));
emit _backEndManager->sendInitString("相机"+m_module.key + "初始化成功");
qDebug() << "[INFO] " << " initParas success!";
}
else
{
QByteArray errorStr("getStatus");
m_module.module_ptr->sendData(vec_mat,errorStr);
isInit = false;
qCritical() << "[Error] " << " moduleName:" << m_module.moduleName << " initParas failed!";
emit _backEndManager->sendInitString("相机" + m_module.key + "初始化失败->"+ errorStr);
}
}
this->start();
@@ -126,7 +126,7 @@ public:
camera.second->stop();
this->terminate();
}
bool isInit = true;
private:
bool loadModule(QString keyName, QString moduleName, QByteArray initByte);
backEndManager* _backEndManager;
@@ -4,10 +4,11 @@
#include <backStruct.h>
#include <cameraManager.h>
#include <jsonParsing.h>
#define debugTesting 1
static correctionStruct* correctionData;
void triggerManager::decodeCameraCMD(QByteArray byte)
{
#if debugTesting
//if (checkTrigger(1, 2, byte) == true)
{
std::shared_ptr <detData> data = dManager->insertDetData("Camera1", "Thread3", "TEST", 0);
@@ -27,7 +28,8 @@ void triggerManager::decodeCameraCMD(QByteArray byte)
camera->second->Process(data);
}
return;
#if 0
#endif
#if debugTesting == 0
if (byte.isEmpty())
return;
double cameraData = 0;
@@ -164,11 +166,17 @@ void triggerManager::init(backEndManager* input)
dManager = _backEndManager->_detDataManager;
_cameraManager = _backEndManager->_cameraManager;
_threadManager = _backEndManager->_threadManager;
_jsonConfiguration = _backEndManager->_jsonConfiguration;
triggerFileName = _jsonConfiguration->tcp.moduleName;
IpAndPort = _jsonConfiguration->tcp.finstcp_init;
//triggerInitStr = QByteArray("sleeptime_%1_readnum_%2_writetype_ushort");
QLibrary* m_lib = new QLibrary(triggerFileName);
bool flag = m_lib->load();
if (!m_lib->isLoaded())
{
emit _backEndManager->sendErrorToMainwindow(dllNotFound);
//emit _backEndManager->sendErrorToMainwindow(dllNotFound);
emit _backEndManager->sendInitString("找不到"+triggerFileName);
return;
}
@@ -176,22 +184,28 @@ void triggerManager::init(backEndManager* input)
{
CreateFunction createFun = (CreateFunction)m_lib->resolve("create");
ReleaseFunction releaseFun = (ReleaseFunction)m_lib->resolve("destory");
bool initFailure = false;
if (createFun && releaseFun)
{
trigger = createFun();
destory_finstcp = releaseFun;
QByteArray initByte = QByteArray::fromStdString("sleeptime_20_readnum_300_writetype_ushort");
std::vector<cv::Mat> dddd;
trigger->reciveData(dddd, QByteArray::fromStdString("init_127.0.0.1_502_1"));
trigger->initParas(initByte);
trigger->reciveData(vec_mat, QByteArray(IpAndPort.toUtf8()));
emit _backEndManager->sendInitString(triggerFileName + "连接到" + IpAndPort);
initFailure=trigger->initParas(initByte);
}
else
if(initFailure==false)
{
emit _backEndManager->sendErrorToMainwindow(triggerInitFailure);
delete m_lib;
m_lib = nullptr;
isInit = false;
emit _backEndManager->sendInitString(triggerFileName + "初始化失败");
return;
}
else
emit _backEndManager->sendInitString(triggerFileName + "成功");
}
this->start();
}
@@ -65,10 +65,14 @@ private:
class triggerManager : public QThread
{
public:
QString triggerFileName = QString("Hd_SocketModule_ModbusTcp");
QString triggerFileName;
QString IpAndPort;
QString triggerInitStr;
~triggerManager()
{
runFlag = false;
this->stop();
this->terminate();
delete trigger;
}
void init(backEndManager* input);
@@ -136,11 +140,13 @@ public:
}
int getValue(int dmPos, QByteArray byte);
bool isInit = true;
private:
threadManager* _threadManager;
detDataManager* dManager;
backEndManager* _backEndManager;
cameraManager* _cameraManager;
jsonConfiguration* _jsonConfiguration;
triggerLockerT tLocker;//防止重复触发,每次收到数据时检查数据是否与上次相同,如果相同checkTrigger会返回false
/// <summary>
/// 检测QByteArray中某位置的值是否和输入一样,使用了绝对位置
+76 -55
View File
@@ -6,28 +6,30 @@
#include <qlayout.h>
#include <qtextedit.h>;
#include <globalStruct.h>
static QPixmap cvMatToQPixmap(const cv::Mat& mat) {
QImage qImg;
if (mat.channels() == 3) {
//cv::cvtColor(mat, mat, cv::COLOR_BGR2RGB);
qImg = QImage(mat.data, mat.cols, mat.rows, mat.step, QImage::Format_RGB888);
}
else {
qImg = QImage((const unsigned char*)(mat.data), mat.cols, mat.rows, mat.step, QImage::Format_Grayscale8);
}
return QPixmap::fromImage(qImg);
}
#include <uiModule/components/fancyButton.h>
class MainWindow;
class loadingWidget : public QWidget {
public:
QLabel* sign;
QMovie* movie;
QTextEdit* initLog;
bool isRunning = false;
QLabel* sign = nullptr;
QMovie* movie = nullptr;
QTextEdit* initLog = nullptr;
fancyButtonText* retryBtn = new fancyButtonText(100,50,"重试","重新进行初始化");
QGridLayout* glayout = new QGridLayout(this);
loadingWidget(QWidget* parent = nullptr) : QWidget(parent) {
glayout->setAlignment(Qt::AlignCenter);
}
void start(QWidget* widget)
QVBoxLayout* vlayout = new QVBoxLayout(this);
loadingWidget()
{
glayout->setAlignment(Qt::AlignCenter);
connect(retryBtn, &QPushButton::clicked, [=]()
{
retryBtn->setDisabled(true);
start();
});
}
void start()
{
if (isRunning == true)
stop();
QPalette palette;
palette.setColor(QPalette::WindowText, Qt::white);
sign = new QLabel(this);
@@ -48,54 +50,73 @@ public:
QFont font("微软雅黑", 8);
initLog->setFont(font);
//initLog->setPalette(palette);
//initLog->setTextColor(QString("rgb(%1)").arg(sColor_Gold)); // 设置文字颜色为蓝色
initLog->setTextColor(Qt::white);
initLog->append("测试测试");
initLog->append("正在初始化...");
vlayout->addWidget(initLog);
vlayout->addWidget(retryBtn);
retryBtn->hide();
glayout->addWidget(sign, 0, 0);
glayout->addWidget(initLog, 1, 0);
glayout->addLayout(vlayout, 1, 0);
glayout->setRowStretch(0, 5);
glayout->setRowStretch(1, 4);
screenshot_ = QPixmap::grabWindow(widget->winId());
//screenshot_ = QPixmap::grabWindow(widget->winId());
update(); // 更新widget以显示新的截图
isRunning = true;
}
void stop()
{
if (isRunning == false)
return;
isRunning = false;
delete sign;
delete movie;
if (movie != nullptr)
delete movie;
delete initLog;
sign = nullptr;
movie = nullptr;
initLog = nullptr;
}
void setError()
{
if (isRunning == true)
{
if (movie != nullptr)
delete movie;
movie = nullptr;
sign->setPixmap(QPixmap(":/topBar/icon/error.png"));
retryBtn->show();
retryBtn->setEnabled(true);
}
}
protected:
void paintEvent(QPaintEvent* event) override {
//if (screenshot_.isNull())
// return;
//QImage image = screenshot_.toImage();
//image = image.convertToFormat(QImage::Format_RGB888);
//cv::Mat originalMat = cv::Mat(
// image.height(),
// image.width(),
// CV_8UC3,
// image.bits(),
// image.bytesPerLine());
//cv::Mat blurredMat;
//cv::blur(originalMat, blurredMat, cv::Size(10, 10)); // 调整模糊半径以获得不同程度的模糊效果
//QPixmap blurredPixmap = cvMatToQPixmap(blurredMat);
//QPainter painter(this);
//painter.drawPixmap(0, 0, blurredPixmap);
QWidget::paintEvent(event); // 调用父类的 paintEvent 函数,绘制控件本身
//// 在模糊图片上绘制文字
//QPalette palette;
//palette.setColor(QPalette::WindowText, Qt::white);
//QFont font("微软雅黑", 100, QFont::Bold);
//QFont font2("微软雅黑", 90, QFont::Bold);
//painter.setFont(font);
//painter.setPen(Qt::black);
//painter.drawText(this->rect(), Qt::AlignCenter, "WAIT");
//painter.setFont(font2);
//painter.setPen(Qt::white);
//painter.drawText(this->rect(), Qt::AlignCenter, "WAIT");
}
#if 0
//void paintEvent(QPaintEvent* event) override {
// if (paintOnce == false)
// return;
// if (screenshot_.isNull())
// return;
// paintOnce = false;
// QImage image = screenshot_.toImage();
// image = image.convertToFormat(QImage::Format_RGB888);
// cv::Mat originalMat = cv::Mat(
// image.height(),
// image.width(),
// CV_8UC3,
// image.bits(),
// image.bytesPerLine());
// cv::Mat blurredMat;
// cv::blur(originalMat, blurredMat, cv::Size(10, 10)); // 调整模糊半径以获得不同程度的模糊效果
// QPixmap blurredPixmap = cvMatToQPixmap(blurredMat);
// QPainter painter(this);
// painter.drawPixmap(0, 0, blurredPixmap);
// //QWidget::paintEvent(event); // 调用父类的 paintEvent 函数,绘制控件本身
//}
#endif
private:
QPixmap screenshot_;
};
};
#pragma once
+7 -1
View File
@@ -23,7 +23,13 @@ enum backEndError
triggerConnectionError,
camerInitFailure
};
enum initStatus
{
NotInit,
InitFailure,
InitOK,
ReInit
};
enum imgWidgetShowType
{
imgWidgetOri,
+1
View File
@@ -32,5 +32,6 @@
<file>icon/waitting.png</file>
<file>icon/loading.gif</file>
<file>icon/sql.png</file>
<file>icon/error.png</file>
</qresource>
</RCC>
Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

+3
View File
@@ -18,6 +18,9 @@ void connectSignalAndSlots(MainWindow* front, backEndManager* back)
QObject::connect(back, &backEndManager::sendPixmapImageWidget, front, &MainWindow::recvPixmapImageWidget);
QObject::connect(back, &backEndManager::sendInitString, front, &MainWindow::recvInitString);
QObject::connect(back, &backEndManager::sendInitFinished, front, &MainWindow::recvInitFinished);
QObject::connect(front, &MainWindow::reInitSignal, back, &backEndManager::reInitSlot);
QObject::connect(front->_loadingWidget.retryBtn, &QPushButton::clicked, back, &backEndManager::reInitSlot);
}
int main(int argc, char* argv[])
{
+1 -5
View File
@@ -118,11 +118,6 @@ void MainWindow::topBarInit()
iconLabel->setFixedWidth(buttonWidth);
iconLabel->setFixedWidth((buttonWidth/2)* title.size());
iconLabel->setPalette(palette);
//QGraphicsDropShadowEffect* effect = new QGraphicsDropShadowEffect(iconLabel);
//effect->setColor(Qt::white);
//effect->setBlurRadius(20);
//effect->setOffset(0);
//iconLabel->setGraphicsEffect(effect);
// 右侧
//最小化
@@ -175,6 +170,7 @@ void MainWindow::topBarInit()
QObject::connect(exitButton, &QPushButton::clicked, this, &QApplication::quit); // 点击退出按钮退出应用程序
// 将菜单栏添加到MainWindow的布局中
this->setMenuWidget(menuBarWidget);
_loadingWidget.start();
}
void MainWindow::leftBarInit()
+22 -12
View File
@@ -34,8 +34,6 @@ class MainWindow : public QMainWindow
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
//主要控件
std::vector<toolBarButton*>pageBtns;
QStackedWidget stackedWidgets;//一共三层,加载界面,登录界面,主要界面
@@ -47,7 +45,8 @@ private:
displayWidget* _displayWidget;
configSettingWidget* _configSettingWidget;
logWidget* _logWidget;
private:
Ui::MainWindow* ui;
//动画效果
QGraphicsBlurEffect* blurEffect;
QPropertyAnimation* blurEffectAnimation;
@@ -111,7 +110,7 @@ public slots:
blurEffectAnimation->setStartValue(0);
blurEffectAnimation->setEndValue(20);
blurEffectAnimation->start();
_loadingWidget.start(&stackedWidgets);
//_loadingWidget.start();
stackedWidgets.setCurrentIndex(1);
blurEffectAnimation->setStartValue(0);
blurEffectAnimation->setEndValue(0);
@@ -136,17 +135,29 @@ public slots:
_displayWidget->_ImageWidgetManager.showImg(pack->img, pack->type, pack->index);
delete pack;
}
void recvInitFinished(bool input)
void recvInitFinished(int input)
{
backEndInit = true;
//loading(false);
switch (input)
{
case initStatus::InitOK:
backEndInit = true;
loading(false);
break;
default:
_loadingWidget.setError();
backEndInit = false;
}
}
void recvInitString(QString)
void recvInitString(QString strIn)
{
if (_loadingWidget.isRunning != false);
{
_loadingWidget.initLog->append(strIn);
}
}
}
signals:
void reInitSignal();
protected:
void mousePressEvent(QMouseEvent* event) override {
if (event->buttons() == Qt::LeftButton) {
@@ -158,8 +169,7 @@ protected:
}
void mouseMoveEvent(QMouseEvent* event) override {
if (event->buttons() == Qt::LeftButton && isMoving) {
QPoint delta = event->globalPos() - startPos;
move(startFrameGeometry.topLeft() + delta);
move(startFrameGeometry.topLeft() + (event->globalPos() - startPos));
}
QMainWindow::mouseMoveEvent(event);
}