You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
wheeldetect/src/tpMain/WheelNet.cpp

517 lines
13 KiB
C++

#include "WheelNet.h"
#include "InfoFile.h"
#include "..\NetWheel\net4wheel_global.h"
#include "QZkJsonParser.h"
#include <QLibrary>
#include <QHostAddress>
#include <QDebug>
#include "qipconfigdlg.h"
#include "lpGlobalData.h"
#define JSONG_MYSELF_FILE "\\user\\selfdefine.json"
#pragma execution_character_set("utf-8")
//emTypeResultChannel 结果通道 0x16
//emTypeTriger 设置触发延时相关参数
CWheelNet::CWheelNet(QString strRoot)
:// m_pNet4Wheel(NULL),
m_strRoot(strRoot)
{
connect(this, SIGNAL(sgSendData(QSharedPointer<QByteArray>)), this, SLOT(onSendData(QSharedPointer<QByteArray>)));
m_pIpConfig = new IPConfig;
loadIpConfig();
loadNet();
}
CWheelNet::~CWheelNet()
{
qDebug() << "delete CWheelNet";
if (m_pIpConfig) {
delete m_pIpConfig;
m_pIpConfig = NULL;
}
// if (m_pNet4Wheel) {
// delete m_pNet4Wheel;
// m_pNet4Wheel = NULL;
// }
if (m_pTcpServer)
{
m_pTcpServer->server_end();
delete m_pTcpServer;
m_pTcpServer = nullptr;
}
qDebug() << "delete CWheelNet end";
}
bool CWheelNet::loadIpConfig()
{
QString fileMyself = m_strRoot + JSONG_MYSELF_FILE;
QJsonObject jsMyself = QZkJsonParser::ReadJsonAuto(fileMyself);
QJsonObject TcpNetObj = jsMyself.value("TcpNetWork").toObject();
if (!TcpNetObj.isEmpty()) {
m_pIpConfig->m_TcpAddress = TcpNetObj.value("TCP_Address").toString();
m_pIpConfig->m_TcpPort = TcpNetObj.value("TCP_port").toInt();
QString serverStr = TcpNetObj.value("TCP_Type").toString();
m_pIpConfig->m_ClientAddress = TcpNetObj.value("client_IP").toString();
m_pIpConfig->m_ClientPort = TcpNetObj.value("client_port").toInt();
}
return true;
}
bool CWheelNet::saveIpConfig()
{
QString fileMyself = m_strRoot + JSONG_MYSELF_FILE;
QJsonObject jsMyself = QZkJsonParser::ReadJsonAuto(fileMyself);
QJsonObject IPConfigObj;
IPConfigObj.insert("TCP_Address", QJsonValue(m_pIpConfig->m_TcpAddress));
IPConfigObj.insert("TCP_port", QJsonValue(m_pIpConfig->m_TcpPort));
IPConfigObj.insert("TCP_Type", QJsonValue("server"));
IPConfigObj.insert("client_IP", QJsonValue(m_pIpConfig->m_ClientAddress));
IPConfigObj.insert("client_port", QJsonValue(m_pIpConfig->m_ClientPort));
jsMyself.insert("TcpNetWork", IPConfigObj);
return QZkJsonParser::WriteJsonObject(fileMyself, jsMyself);
}
Q_SLOT void CWheelNet::onOpenServer(QString IPAddr, int port)
{
// if (m_pNet4Wheel) {
// m_pNet4Wheel->OpenServer(IPAddr, port);
// emit sgServerState(IPAddr, port, true);
// }
if (m_pTcpServer)
{
m_pTcpServer->server_begin(IPAddr, port);
emit sgServerState(IPAddr, port, true);
}
}
Q_SLOT void CWheelNet::onOpenServer()
{
// if (m_pNet4Wheel) {
// m_pNet4Wheel->OpenServer(m_pIpConfig->m_TcpAddress, m_pIpConfig->m_TcpPort);
// emit sgServerState(m_pIpConfig->m_TcpAddress, m_pIpConfig->m_TcpPort, true);
// }
if (m_pTcpServer)
{
m_pTcpServer->server_begin(m_pIpConfig->m_TcpAddress, m_pIpConfig->m_TcpPort);
emit sgServerState(m_pIpConfig->m_TcpAddress, m_pIpConfig->m_TcpPort, true);
}
}
Q_SLOT void CWheelNet::onCloseServer()
{
// if (m_pNet4Wheel) {
// m_pNet4Wheel->CloseServer();
// emit sgServerState(m_pIpConfig->m_TcpAddress, m_pIpConfig->m_TcpPort, false);
// }
if (m_pTcpServer)
{
m_pTcpServer->server_end();
emit sgServerState(m_pIpConfig->m_TcpAddress, m_pIpConfig->m_TcpPort, false);
}
}
bool CWheelNet::loadNet()
{
/*
#ifdef _DEBUG
QLibrary lib("Net4Wheeld");
#else
QLibrary lib("Net4Wheel");
#endif
if (lib.load()){
_Net4WheelCreate func = (_Net4WheelCreate)lib.resolve("Net4WheelCreate");
QHostAddress pAdd;
pAdd.setAddress(m_pIpConfig->m_TcpAddress);
m_pNet4Wheel = func(pAdd, m_pIpConfig->m_TcpPort);
connect(m_pNet4Wheel, SIGNAL(RecvDatas(QByteArray)), this, SLOT(DataRecvByte(QByteArray)));
connect(m_pNet4Wheel, SIGNAL(SignalConnect(QVariantMap)), this, SLOT(onConnect(QVariantMap)));
connect(this, SIGNAL(sgSendData2Dv(QString, QByteArray)), m_pNet4Wheel, SLOT(sendDatas(QString, QByteArray)));
}
*/
m_pTcpServer = new lptkRawTcpServer();
connect(m_pTcpServer, SIGNAL(data_received(int, QSharedPointer<QByteArray>)), this, SLOT(onDataRecv(int, QSharedPointer<QByteArray>)));
connect(m_pTcpServer, SIGNAL(sgConnect(QVariantMap)), this, SLOT(onConnect(QVariantMap)));
return true;
}
void CWheelNet::sendData(QString strData)
{
// if (!m_pNet4Wheel) {
// return ;
// }
// QByteArray arr;
// arr.append(strData);
// if (m_pIpConfig){
// QString strTarget = genAddressPort(m_pIpConfig->m_ClientAddress, QString::number(m_pIpConfig->m_ClientPort));
// emit sgSendData2Dv(strTarget, arr);
// }
QSharedPointer<QByteArray> pData = QSharedPointer<QByteArray>(new QByteArray);
pData->append(strData);
emit sgSendData(pData);
}
bool CWheelNet::sendDataFrame(QString strData)
{
/*调用框架接口 发送网络数据*/
return true;
}
void CWheelNet::onShowIpDlg(QWidget* parent)
{
QIPConfigDlg ipdlg(parent);
ipdlg.setWindowFlags(Qt::Dialog | Qt::WindowCloseButtonHint);
ipdlg.setWindowModality(Qt::ApplicationModal);
ipdlg.setAttribute(Qt::WA_ShowModal, true);
ipdlg.setWindowTitle(tr("IP参数设置"));
ipdlg.setWindowIcon(QIcon(":/image/leaper"));
ipdlg.SetIPData(m_pIpConfig);
connect(&ipdlg, SIGNAL(SignalCloseServer()), this, SLOT(onCloseServer()));
connect(&ipdlg, SIGNAL(SignalOpenServer(QString, int)), this, SLOT(onOpenServer(QString, int)));
if (ipdlg.exec() == QDialog::Accepted)
{
ipdlg.GetIPData(m_pIpConfig);
saveIpConfig();
}
}
QString CWheelNet::getIp(EM_NET_TYPE type) const
{
if (!m_pIpConfig) {
return QString();
}
if (type == emNetClient)
{
return m_pIpConfig->m_ClientAddress;
}
return m_pIpConfig->m_TcpAddress;
}
QString CWheelNet::getPort(EM_NET_TYPE type) const
{
if (!m_pIpConfig) {
return QString();
}
if (type == emNetClient )
{
return QString::number(m_pIpConfig->m_ClientPort);
}
return QString::number(m_pIpConfig->m_TcpPort);
}
/*心跳包*/
void CWheelNet::sendPulse(int nInterval, int nState, int nOnline)
{
QList<int> lstData = genList();
lstData[0] = nInterval;
lstData[1] = nState;
lstData[2] = nOnline;
QString strDst = packData(emTypePulse, lstData);
sendData(strDst);
}
/*模板数据*/
/*
strModel 型号名
dialeter 直径
dHeight 厚度
*/
void CWheelNet::sendModelList(int nIndex, QString strModel, double dDiameter, double dHeight)
{
QList<int> lstData = genList();
lstData[0] = nIndex;
lstData[1] = dDiameter;
lstData[2] = dHeight;
QString strDst = packData(emTypeLib, lstData, strModel);
sendData(strDst);
}
void CWheelNet::sendDetectResult(QString strModel, double dDiameter, double dHeight)
{
QList<int> lstData = genList();
lstData[0] = dDiameter;
lstData[1] = dHeight;
QString strDst = packData(emTypeResult, lstData, strModel);
sendData(strDst);
}
void CWheelNet::sendThickness()
{
QString strDst = packData(emTypeThickness);
sendData(strDst);
}
void CWheelNet::sendTrig()
{
QString strDst = packData(emTypeTrig);
sendData(strDst);
}
void CWheelNet::sendClearLib()
{
QString strDst = packData(emTypeClear);
sendData(strDst);
}
void CWheelNet::sendLight(int nLightType, int nTimes, int nUpTimes, int nDownTimes)
{
QList<int> lstData = genList();
lstData[0] = nLightType;
lstData[1] = nTimes;
lstData[2] = nUpTimes;
lstData[3] = nDownTimes;
QString strDst = packData(emTypeLight, lstData);
sendData(strDst);
}
void CWheelNet::sendDeteStateList(int nIndex, int nIsDetect, QString strModel)
{
QList<int> lstData = genList();
lstData[0] = nIndex;
lstData[1] = nIsDetect;
//lstData[2] = dHeight;
QString strDst = packData(emTypeDetState, lstData, strModel);
sendData(strDst);
}
void CWheelNet::sendCheckDeteStateList(int nIndex, int nIsDetect, QString strModel)
{
QList<int> lstData = genList();
lstData[0] = nIndex;
//lstData[1] = nIsDetect;
//lstData[2] = dHeight;
QString strDst = packData(emTypeCheckDete, lstData, strModel);
sendData(strDst);
}
void CWheelNet::sendModelInitDone()
{
QString strDst = packData(emTypeInitDone);
sendData(strDst);
}
void CWheelNet::sendModelNum(int nCount)
{
QList<int> lstData = genList();
lstData[0] = nCount;
QString strDst = packData(emTypeModelnum, lstData);
sendData(strDst);
}
void CWheelNet::sendClearDisLibs()
{
QList<int> lstData = genList();
lstData[0] = 1;
QString strDst = packData(emTypeWriteDisOnlineModels, lstData);
sendData(strDst);
}
void CWheelNet::sendDisLibs(int nIndex, QString strModel)
{
QList<int> lstData = genList();
lstData[0] = 0;
lstData[1] = nIndex;
QString strDst = packData(emTypeWriteDisOnlineModels, lstData, strModel);
sendData(strDst);
}
void CWheelNet::sendDisLibsDone()
{
QList<int> lstData = genList();
lstData[0] = 2;
QString strDst = packData(emTypeWriteDisOnlineModels, lstData);
sendData(strDst);
}
void CWheelNet::sendCheckAllModelState()/*查询在线检测状态*/
{
QString strDst = packData(emTypeReadOnlineModels);
sendData(strDst);
}
Q_SLOT void CWheelNet::onConnect(QVariantMap vMap)
{
//
QString m_type = vMap.value("type").toString();
QString address, port, peerName, client_State;
QString strPre = m_type + "_";
address = vMap.value(strPre + "address").toString();
port = vMap.value(strPre + "port").toString();
peerName = vMap.value(strPre + "name").toString();
client_State = vMap.value(strPre + "state").toString();
bool bConnect = true;
if (client_State == "Disconnect" || client_State == "close listen ") {
bConnect = false;
}
if (m_type == "client")
{
QString state = vMap.value("client_state").toString();
if (state == "connect")
{
lpGlobalData::instance()->m_plcConnect = true;
}
else {
lpGlobalData::instance()->m_plcConnect = false;
}
}
QString str = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");
str.append(":\n");
str.append("type=" + m_type + " " + "address:" + address + " sourcePort:" + port + " is " + client_State);
str.append("\n");
QString Clientobj = genAddressPort(address, port);
emit sgShow2UI(str, bConnect);
emit sgClientConnect(Clientobj, bConnect);
}
Q_SLOT void CWheelNet::DataRecvByte(QByteArray m_data)
{
if (m_data.size() <= 0) {
return;
}
while (m_data.size() != 0) {
int nCmd = -1;
QList<int> lstData;
QString strModel;
m_data = parseData(m_data, nCmd, lstData, strModel);
switch (nCmd) {
case emTypePulse://心跳包应答
emit(sgPulseRev());
break;
case emTypeLib://模板库应答
emit(sgLibRev(true));
break;
case emTypeResult://检测结果发送应答
emit(sgResultRev());
break;
case emTypeThickness:
{
int height = lstData.at(0);
emit sgThickness((double)height);
break;
}
case emTypeTrig:
{
//PLC触发相机 主动上报
qWarning() << "recv a camera triger time:" << QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss zzz") << ";";
int hData = lstData.at(1);
int lData = lstData.at(2);
double dRatio = hData + lData * 1.0 / 1000;
emit sgCameraTrig(lstData.at(0), dRatio);// 第几个 索引
}
break;
case emTypeClear:
emit(sgClearRev(true));
break;
case emTypeDetState:
emit sgDeteState(true);
//发送1000个勾的应答
break;
case emTypeCheckDete:
//查询
emit sgDeteState(true);
emit(sgRecvDetectState(lstData.at(0), lstData.at(1)));
break;
case emTypeInitDone:
break;
case emTypePLCUpdate://11 在线时勾选表主动上报
emit(sgRecvDetectState(lstData.at(0), lstData.at(1)));
break;
case emTypeModelnum:
break;
case emTypeChangeOnline:
emit(sgChangeOnlineState(lstData.at(0)));
break;
case emTypeWriteDisOnlineModels:
if (lstData.at(0) == 1){
emit(sgClearDisLibASK());
}
else if (lstData.at(0) == 0){
emit(sgSendDisLibASK(true));
}
break;
case emTypeReadOnlineModels:
if (lstData.at(0) == 0)
{
strModel.remove("#");
emit(sgReadDetectState(lstData.at(1), strModel));
}
else if (lstData.at(0) == 1){
emit(sgReadDetectStateASK());
}
break;
case emTypeTriger:
emit(sgRecvTrigPara());
break;
case emShutDown:
emit(sgShutDownComputer());
default:
break;
}
}
}
//发送结果通道
void CWheelNet::sendResultChannel(int nChannelValue, double dHeight, double dDiameter, QString str /*QString()*/)
{
QList<int> lstData = genList();
lstData[0] = dHeight;
lstData[1] = dDiameter;
lstData[2] = nChannelValue;
QString strDst = packData(emTypeResult, lstData, str);
sendData(strDst);
}
/*
nSignal 传感触发滤波
nCamTriger 相机触发延时
nCamPulse 相机触发脉冲宽度
nLight 光源熄灭延时
nTrigerType 传感器触发边缘 0-下降沿 1-上升沿
*/
void CWheelNet::sendTrigerPara(int nSignal,int nCamTriger,int nCamPulse,int nLight,int nTrigerType,int nResHoldTime)
{
QList<int> lstData = genList();
lstData[0] = nSignal;
lstData[1] = nCamTriger;
lstData[2] = nCamPulse;
lstData[3] = nLight;
lstData[4] = nTrigerType;
lstData[5] = nResHoldTime;
QString strDst = packData(emTypeTriger, lstData);
sendData(strDst);
}
Q_SLOT void CWheelNet::onSendDataByType(int nType, QVariantMap nMap)
{
switch (nType){
case emTypePulse:
sendPulse(nMap.value("time").toInt(), nMap.value("detestate").toInt(),nMap.value("onlineStatie").toInt());
break;
}
}
Q_SLOT void CWheelNet::onDataRecv(int id, QSharedPointer<QByteArray> pData)
{
DataRecvByte(*pData);
}
Q_SLOT void CWheelNet::onSendData(QSharedPointer<QByteArray> pData)
{
if (m_pTcpServer)
{
m_pTcpServer->broadcast_send_data(pData);
}
}