添加 后端控制器ackEndController
添加 触发器控制器triggerController 测试 modubus能成功读取写入
This commit is contained in:
@@ -0,0 +1,12 @@
|
||||
#include <triggerController.h>
|
||||
class backEndController
|
||||
{
|
||||
public:
|
||||
triggerController _triggerController;//触发器
|
||||
|
||||
backEndController()
|
||||
{
|
||||
_triggerController.init();
|
||||
}
|
||||
};
|
||||
#pragma once
|
||||
@@ -0,0 +1,203 @@
|
||||
#include <qthread.h>
|
||||
#include <base.h>
|
||||
#include <qlibrary.h>
|
||||
|
||||
typedef Base* (*CreateFunction)();
|
||||
typedef void (*ReleaseFunction)(Base* animal);
|
||||
//防止重复触发
|
||||
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:
|
||||
|
||||
};
|
||||
//触发器类 fins触发 tcp触发等 替代myiothread
|
||||
class triggerController : public QThread
|
||||
{
|
||||
public:
|
||||
QString triggerFileName = QString("Hd_SocketModule_ModbusTcp");
|
||||
~triggerController()
|
||||
{
|
||||
runFlag = false;
|
||||
QThread::msleep(100);
|
||||
}
|
||||
void init()
|
||||
{
|
||||
QLibrary* m_lib = new QLibrary(triggerFileName);
|
||||
bool flag = m_lib->load();
|
||||
if (!m_lib->isLoaded())
|
||||
{
|
||||
|
||||
//qDebug() << "[Error] " << " Loaded error:" << m_lib->errorString();
|
||||
return ;
|
||||
}
|
||||
|
||||
if (flag)
|
||||
{
|
||||
CreateFunction createFun = (CreateFunction)m_lib->resolve("create");
|
||||
ReleaseFunction releaseFun = (ReleaseFunction)m_lib->resolve("destory");
|
||||
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);
|
||||
}
|
||||
else
|
||||
{
|
||||
delete m_lib;
|
||||
m_lib = nullptr;
|
||||
return;
|
||||
}
|
||||
}
|
||||
this->start();
|
||||
}
|
||||
void run()
|
||||
{
|
||||
while (runFlag)
|
||||
{
|
||||
reciveCommond();
|
||||
QThread::msleep(interval);
|
||||
}
|
||||
}
|
||||
|
||||
void reciveCommond()
|
||||
{
|
||||
//auto start = std::chrono::high_resolution_clock::now();
|
||||
//QByteArray byte = m_readAllCmd.toUtf8(); // 设置 从起始位开始读取的指令
|
||||
QByteArray byte = QByteArray::fromStdString("read_byte_1_500");
|
||||
if (sendFinsMsg(byte))
|
||||
qCritical() << "[TCP] " << " finstcp_ptr reciveData error!";
|
||||
QByteArray readByte;
|
||||
if (!reciveFinsMsg(readByte))
|
||||
qCritical() << "[TCP] " << " finstcp_ptr sendData error!";
|
||||
tLocker.reFreshLocker(readByte);//经过检查后再触发
|
||||
//auto end = std::chrono::high_resolution_clock::now();
|
||||
//auto duration = std::chrono::duration_cast<std::chrono::microseconds>(end - start);
|
||||
//std::cout << "cost: " << duration.count() << " mm" << std::endl;
|
||||
//decodeCameraCMD(readByte);
|
||||
//workThread->snDatas.checkSnFromWaittingVec(readByte);
|
||||
}
|
||||
|
||||
|
||||
|
||||
//发送数据到
|
||||
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;
|
||||
}
|
||||
private:
|
||||
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;
|
||||
}
|
||||
|
||||
//触发器的配置
|
||||
int startPos = 1;//数据读取的起始位
|
||||
int interval = 10;//间隔
|
||||
|
||||
ReleaseFunction destory_finstcp; //释放
|
||||
Base* trigger = nullptr;
|
||||
bool runFlag = true;
|
||||
std::vector<cv::Mat> vec_mat;//没啥用,一直保持为空就好
|
||||
};
|
||||
|
||||
|
||||
#pragma once
|
||||
@@ -9,40 +9,28 @@
|
||||
#include <qlineedit.h>
|
||||
#include <qlabel.h>
|
||||
#include <qcombobox.h>
|
||||
int main ( int argc, char *argv[] )
|
||||
#include <backEndController.h>
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
QApplication a(argc, argv);
|
||||
MainWindow w;
|
||||
#pragma region
|
||||
#if 0//登录界面
|
||||
QEventLoop loop;
|
||||
loginDialog dialog;
|
||||
QObject::connect(dialog.exitBtn, &QPushButton::clicked, [=]()
|
||||
{
|
||||
exit(0);
|
||||
});
|
||||
QObject::connect(&dialog, &QDialog::finished, &loop, &QEventLoop::quit);
|
||||
loop.exec();
|
||||
#endif
|
||||
#pragma endregion 登录界面
|
||||
|
||||
//检测是否已运行
|
||||
QSystemSemaphore sema("monkey", 1, QSystemSemaphore::Open);
|
||||
sema.acquire();
|
||||
QSharedMemory mem("DetUi");
|
||||
if (mem.create(1) == false)
|
||||
{
|
||||
//logDebug(QString::fromUtf8("本机已经运行一个实例,不能重复运行!").toStdString().c_str());
|
||||
sema.release();
|
||||
//程序直接退出
|
||||
exit(0);
|
||||
|
||||
}
|
||||
else {
|
||||
sema.release();
|
||||
|
||||
//w.initWidget();
|
||||
w.show();
|
||||
return a.exec();
|
||||
}
|
||||
sema.release();
|
||||
//////////
|
||||
backEndController _backEnd;
|
||||
MainWindow w;
|
||||
w.show();
|
||||
return a.exec();
|
||||
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user