Files
handleaiuinew/HanddleAI/HandleAiUi-new/back/triggerManager.h
T

212 lines
5.6 KiB
C++
Raw Normal View History

2024-08-07 09:16:35 +00:00
#ifndef TRIGGERManager_H
2024-05-21 23:54:22 +08:00
#define TRIGGERManager_H
#include <qdebug.h>
2024-05-19 15:43:10 +08:00
#include <qthread.h>
#include <base.h>
#include <qlibrary.h>
#include <globalStruct.h>
#include <backStruct.h>
2024-08-07 09:16:35 +00:00
#include <functional>
#include <appConfig/appConfig.h>
2024-08-13 18:07:24 +08:00
#include <serviceModule.hpp>
2024-08-07 09:16:35 +00:00
using triggerCallback = std::function<void(QByteArray& byte)>;
2024-05-22 01:32:43 +08:00
class cameraManager;
2024-08-07 09:16:35 +00:00
class detThreadManager;
2024-05-22 01:32:43 +08:00
class detDataManager;
2024-08-07 09:16:35 +00:00
class lightSourceManager;
class detProcess;
2024-05-19 15:43:10 +08:00
//防止重复触发
class triggerLockerT
{
public:
triggerLockerT()
{
}
~triggerLockerT()
{
lockerList.clear();
}
bool checkLocker(int input)
{
for (int i = 0; i < lockerList.size(); i++)
{
if (input == lockerList[i].pos)
{
return false;
}
}
return true;
}
void reFreshLocker(QByteArray byte)
{
for (int i = 0; i < lockerList.size(); i++)
{
if (byte.at(lockerList[i].pos) != lockerList[i].value)
{
lockerList.removeAt(i);
}
}
}
void adddLocker(int inputPos, int posValue)
{
lockerList.push_back(lockerStruct({ inputPos, posValue }));
}
struct lockerStruct
{
int pos;
int value;
};
QList<lockerStruct>lockerList;
private:
2024-08-07 09:16:35 +00:00
};
2024-05-19 15:43:10 +08:00
//触发器类 fins触发 tcp触发等 替代myiothread
2024-08-13 18:07:24 +08:00
class triggerManager : public serviceModule
2024-05-19 15:43:10 +08:00
{
public:
2024-08-13 18:07:24 +08:00
2024-08-07 09:16:35 +00:00
QByteArray readAllCmd;
2024-08-13 18:07:24 +08:00
QString triggerFileName;
2024-05-23 15:06:03 +08:00
QString IpAndPort;
QString triggerInitStr;
2024-05-21 23:54:22 +08:00
~triggerManager()
2024-05-19 15:43:10 +08:00
{
runFlag = false;
2024-05-23 15:06:03 +08:00
this->stop();
this->terminate();
2024-05-20 18:13:21 +08:00
delete trigger;
2024-05-19 15:43:10 +08:00
}
2024-08-07 09:16:35 +00:00
void initialization(detProcess*);
2024-08-13 18:07:24 +08:00
bool connectHost();
void run();
2024-05-22 16:47:14 +08:00
void stop()
{
runFlag = false;
this->terminate();
}
2024-05-19 15:43:10 +08:00
2024-08-07 09:16:35 +00:00
void reciveCommond();
2024-05-19 15:43:10 +08:00
//发送数据到
bool sendFinsMsg(QString cmdx)
{
if (!trigger->reciveData(vec_mat, cmdx.toUtf8()))
{
qCritical() << "[TCP Error] " << QString::fromUtf8("Fins数据发送失败!") << cmdx;
return false;
}
return true;
}
bool sendFinsMsg(const char* cmdx)
{
QString str = cmdx;
if (!trigger->reciveData(vec_mat, str.toUtf8()))
{
qCritical() << "[TCP Error] " << QString::fromUtf8("Fins数据发送失败!") << cmdx;
return false;
}
return true;
}
bool sendFinsMsg(QByteArray write_byte)
{
if (!trigger->reciveData(vec_mat, write_byte))
{
qCritical() << "[TCP Error] " << QString::fromUtf8("Fins数据发送失败!") << write_byte;
return false;
}
return true;
}
2024-05-22 01:32:43 +08:00
int getValue(int dmPos, QByteArray byte);
2024-08-07 09:16:35 +00:00
//CALL BACK
struct triggerCallbackStruct
{
int triggerAddress;
int triggerValue;
triggerCallback func;
std::string funcName;
};
std::vector<triggerCallbackStruct> triggerCallbackFunc;
bool registerCallback(int triggerAddress, int triggerValue, triggerCallback func, std::string funcName ="")
{
triggerCallbackStruct _triggerCallbackStruct;
_triggerCallbackStruct.triggerAddress = triggerAddress;
_triggerCallbackStruct.triggerValue = triggerValue;
_triggerCallbackStruct.func = func;
_triggerCallbackStruct.funcName = funcName;
triggerCallbackFunc.push_back(_triggerCallbackStruct);
return true;
}
void checkCallbackAndTrigger(QByteArray &byte)//检查是否符合回调函数的触发条件
{
for (auto callback : triggerCallbackFunc)
{
if (checkTrigger(callback.triggerAddress, callback.triggerValue, byte) == true)
{
callback.func(byte);
std::cout << "func:" << callback.funcName << "->triggered" << std::endl;
}
}
}
2024-05-19 15:43:10 +08:00
private:
2024-08-07 09:16:35 +00:00
std::string writeType;
bool libLoadedflag = false;
QLibrary* m_lib = nullptr;
detProcess* _detProcess;
lightSourceManager* _lightSourceManager;
detThreadManager* _threadManager;
2024-05-22 01:32:43 +08:00
detDataManager* dManager;
cameraManager* _cameraManager;
2024-05-19 15:43:10 +08:00
triggerLockerT tLocker;//防止重复触发,每次收到数据时检查数据是否与上次相同,如果相同checkTrigger会返回false
/// <summary>
/// 检测QByteArray中某位置的值是否和输入一样,使用了绝对位置
/// </summary>
/// <param name="dmPos">绝对位置</param>
/// <param name="value">值</param>
/// <param name="byte">QByteArray</param>
/// <returns></returns>
bool checkTrigger(int dmPos, int value, QByteArray byte, bool lockerDisable = false)
{
int triggerPos = (dmPos - startPos) * 2 + 1;
if (byte.size() < triggerPos)
return false;
if (byte.at(triggerPos) == value)
{
if (tLocker.checkLocker(triggerPos) == false)
return false;
if (lockerDisable == false)
tLocker.adddLocker(triggerPos, value);
return true;
}
else
return false;
}
//接受数据
bool reciveFinsMsg(QByteArray& readByte)
{
if (!trigger->sendData(vec_mat, readByte))
{
qCritical() << "[TCP] " << " finstcp_ptr sendData error!";
return false;
}
return true;
}
//解析并触发
void decodeCameraCMD(QByteArray byte);
2024-05-19 15:43:10 +08:00
//触发器的配置
2024-08-07 09:16:35 +00:00
int startPos=-1;//数据读取的起始位
int sleepTime = -1;//间隔
int readNum = -1;//范围
2024-05-20 18:13:21 +08:00
int interval = 50;//间隔
2024-05-19 15:43:10 +08:00
ReleaseFunction destory_finstcp; //释放
Base* trigger = nullptr;
bool runFlag = true;
2024-08-07 09:16:35 +00:00
bool init = false;
2024-05-19 15:43:10 +08:00
std::vector<cv::Mat> vec_mat;//没啥用,一直保持为空就好
};
#endif