Files
geomative/GeomativeStudio/cpp/Tools/NetWorkOper.cpp
T
coco df489d5640 a
2026-07-03 16:05:30 +08:00

706 lines
23 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// NetWorkOper.cpp: implementation of the CNetWorkOper class.
//
//////////////////////////////////////////////////////////////////////
#include "StdAfx.h"
#include "GeoMative.h"
#include "NetWorkOper.h"
#include "TransferCtrl.h"
#include "TaskDataOper.h"
#include "Lock\AutoLock.h"
#include "FileOperTools.h"
#include "MainFrm.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
extern int g_iTransFileMode;
extern BOOL g_bIsOnlineTransfer;
extern int g_iUILanguage;
extern CGeoMativeApp theApp;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CNetWorkOper::CNetWorkOper()
{
InitializeCriticalSection(&m_netCs);
InitializeCriticalSection(&m_realHwndCs);
m_tcpClient = NULL;
m_bIsRunning = false;
m_pThread = NULL;
m_bIsTransfer = false;
m_pNotifyFunc = NULL;
m_bIsNeedResp = false;
m_bIsNeedSend = false;
m_ucCmd = 0;
m_pNotifyParam = NULL;
m_pDevNotifyFunc = NULL;
memset(m_chSendBuf, 0, sizeof(m_chSendBuf));
m_pDevNotfiyParam = NULL;
m_bIsSuspend = false;
m_bIsGetDevAddr = false;
}
CNetWorkOper::~CNetWorkOper()
{
ConsumerThread::StopThread();
ProducerThread::StopThread();
DeleteCriticalSection(&m_netCs);
DeleteCriticalSection(&m_realHwndCs);
if (m_tcpClient)
{
m_tcpClient->CloseConnect();
delete m_tcpClient;
}
}
bool CNetWorkOper::Initialize()
{
if (NULL != m_tcpClient)
{
return true;
}
InitializeCriticalSection(&m_MutexSec);
m_tcpClient = new CTransferCtrl();
return m_tcpClient->Initialize();
}
bool CNetWorkOper::StartConnect(CString strDstIP, int iPort)
{
if (strDstIP.IsEmpty() || iPort < 1)
{
if (LANG_ZHCN == g_iUILanguage)
AfxMessageBox(_T("输入服务器参数错误"));
else
MessageBoxEx(NULL, _T("Input server param error"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US));
return false;
}
CString strLog;
strLog.Format(_T("zm: CNetWorkOper::StartConnect connect to server ip=%s, port=%d"), strDstIP, iPort);
CFileOperTools::GetInstance()->WriteComLog(strLog);
if (NULL == m_tcpClient || !m_tcpClient->ConnectToServer(strDstIP, iPort))
{
strLog.Format(_T("zm: CNetWorkOper::StartConnect connect to server ip=%s, port=%d failed."), strDstIP, iPort);
CFileOperTools::GetInstance()->WriteComLog(strLog);
return false;
}
strLog.Format(_T("zm: CNetWorkOper::StartConnect connect to server ip=%s, port=%d success."), strDstIP, iPort);
CFileOperTools::GetInstance()->WriteComLog(strLog);
return true;
}
bool CNetWorkOper::StartWork()
{
if (NULL == m_tcpClient || !m_tcpClient->GetConnectStatus())
{
if (LANG_ZHCN == g_iUILanguage)
AfxMessageBox(_T("请先连接服务器"));
else
MessageBoxEx(NULL, _T("Please connect to server firstly."), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US));
return false;
}
if (m_pThread)
{
// AfxMessageBox(_T("Thread has been started,no need to start."));
return true;
}
ConsumerThread::StartThread();
ProducerThread::StartThread();
/*m_pThread = AfxBeginThread(StartProcFunc,(LPVOID)this);
if (NULL == m_pThread)
{
AfxMessageBox(_T("Create process data thread failed."));
return false;
}*/
//ProducerThread::StartThread();
return true;
}
bool CNetWorkOper::TransferOper(BYTE ucCmd, STSendDataInfo* pSendCtrl, bool bIsNeedResp, STRespDataInfo* pRespInfo, PNOTIFY_FUNC pNotifyFunc, LPVOID lpParam)
{
if (m_bIsTransfer)
{
if (LANG_ZHCN == g_iUILanguage)
AfxMessageBox(_T("请等待转发完成,在启动一个新的转发前"));
else
MessageBoxEx(NULL, _T("Please wait for transfer complete before start a new taransfer"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US));
return false;
}
EnterCriticalSection(&m_MutexSec);
m_ucCmd = ucCmd;
memset(m_chSendBuf, 0, sizeof(m_chSendBuf));
memcpy(m_chSendBuf, pSendCtrl->pData, pSendCtrl->wDataLen);
m_stSendCtrlInfo.pData = m_chSendBuf;
m_stSendCtrlInfo.wDataLen = pSendCtrl->wDataLen;
m_stSendCtrlInfo.ucDstType = pSendCtrl->ucDstType;
m_stSendCtrlInfo.uiDevID = pSendCtrl->uiDevID;
m_bIsNeedSend = true;
m_bIsNeedResp = bIsNeedResp;
memcpy(&m_stRespDataInfo, pRespInfo, sizeof(STRespDataInfo));
m_pNotifyFunc = pNotifyFunc;
m_pNotifyParam = lpParam;
LeaveCriticalSection(&m_MutexSec);
return true;
}
bool CNetWorkOper::ProcPlcStatus(char* pData, int iLen)
{
if (iLen != sizeof(STRemPlcDataInfo))
{
CString strErr = _T("");
if (LANG_ZHCN == g_iUILanguage)
{
strErr.Format(_T("接受PLC状态长度错误,接收长度 %d,实际长度 %d"), iLen, sizeof(STRemPlcDataInfo));
AfxMessageBox(strErr);
}
else
{
strErr.Format(_T("Recv Plc status length error,recv_value = %d,should be %d"), iLen, sizeof(STRemPlcDataInfo));
MessageBoxEx(NULL, strErr, STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US));
}
return false;
}
const char* pPlcData = pData;
//////////////////////////temp add 临时增加接收到定时任务后发送回应////////////////////////////////////////////////
SendCtrlMsgDirect(0x88, ntohl(m_tcpClient->GetPlcAddr()), 4, NULL, 0);
//////////////////////////////////////////////////////////////////////////
CTaskDataOper dataOper;
return dataOper.InsertPlcStatusData((const STRemPlcDataInfo*)pPlcData);
}
bool CNetWorkOper::SendCtrlMsgDirect(BYTE ucCmd, UINT32 uiDevID, BYTE ucDevType, const char* pData, WORD wDataLen)
{
if (NULL == m_tcpClient || !m_tcpClient->GetConnectStatus())
{
CFileOperTools::GetInstance()->WriteComLog(_T("zm: SendCtrlMsgDirect GetConnectStatus --------------------------"));
return false;
}
EnterCriticalSection(&m_MutexSec);
STTransCtrlInfo stTransCtrl;
stTransCtrl.ucCmd = ucCmd;
stTransCtrl.uiDevID = uiDevID;
stTransCtrl.ucDevType = ucDevType;
bool bRes = m_tcpClient->SendCtrlInfo((const char*)(&stTransCtrl), pData, wDataLen);
LeaveCriticalSection(&m_MutexSec);
if (bRes)
m_ucCmd = ucCmd;
return bRes;
}
int CNetWorkOper::RecvMsgDirect(char* pData, int* pRecvLen, int iMaxRecvLen, int iTimeout)
{
if (NULL == m_tcpClient || !m_tcpClient->GetConnectStatus())
{
CFileOperTools::GetInstance()->WriteComLog(_T("zm: RecvMsgDirect GetConnectStatus --------------------------"));
//AfxMessageBox(_T("Line break;"));
return EN_RECV_LINK_INTERRUPT;
}
EnterCriticalSection(&m_MutexSec);
int iRet = m_tcpClient->RecvRspMsg(pData, pRecvLen, iMaxRecvLen, iTimeout);
LeaveCriticalSection(&m_MutexSec);
return iRet;
}
void CNetWorkOper::ClearSendInfo()
{
CAutoLock clsLock(&m_MutexSec);
m_ucCmd = 0;
m_bIsNeedSend = false;
m_bIsNeedResp = false;
memset(&m_stSendCtrlInfo, 0, sizeof(m_stSendCtrlInfo));
memset(&m_stRespDataInfo, 0, sizeof(m_stRespDataInfo));
}
void CNetWorkOper::ClearNotfiyFuncInfo()
{
CAutoLock clsLock(&m_MutexSec);
m_pNotifyFunc = NULL;
m_pNotifyParam = NULL;
}
bool CNetWorkOper::SendLoginMsgBrocast()
{
BYTE ucData = 3;
UINT32 uiDevID = 0;
SendCtrlMsgDirect(0xFE, uiDevID, 3, (char*)(&ucData), 1);
return true;
}
void CNetWorkOper::PutRequestPacket(const STRequestPacket& clsRequestPacket)
{
LPEQUESTPACKET pRequestPacket = new STRequestPacket();
pRequestPacket->dwMsgID = clsRequestPacket.dwMsgID;
pRequestPacket->hWnd = clsRequestPacket.hWnd;
pRequestPacket->clsPacketBase.ucCmd = clsRequestPacket.clsPacketBase.ucCmd;
pRequestPacket->clsPacketBase.ucDevType = clsRequestPacket.clsPacketBase.ucDevType;
pRequestPacket->clsPacketBase.uiDevID = clsRequestPacket.clsPacketBase.uiDevID;
pRequestPacket->wDataLen = clsRequestPacket.wDataLen;
pRequestPacket->iMaxRecvLen = clsRequestPacket.iMaxRecvLen;
pRequestPacket->iTimeout = clsRequestPacket.iTimeout;
pRequestPacket->pData = new char[clsRequestPacket.wDataLen];
memcpy_s((void *)pRequestPacket->pData, clsRequestPacket.wDataLen, clsRequestPacket.pData, clsRequestPacket.wDataLen);
this->PutDataToQue(pRequestPacket);
}
void CNetWorkOper::ReleaseData(void* pData)
{
LPEQUESTPACKET pRequestPacket = (LPEQUESTPACKET)pData;
if (NULL == pRequestPacket)
{
return;
}
if (pRequestPacket->pData != NULL)
{
delete[] pRequestPacket->pData;
pRequestPacket->pData = NULL;
}
delete[] pRequestPacket;
pRequestPacket = NULL;
}
void CNetWorkOper::ConsumeDataFromQue(void * pData)
{
LPEQUESTPACKET pRequestPacket = (LPEQUESTPACKET)pData;
if (NULL == pRequestPacket)
{
return;
}
DWORD dwWParam = -1; //0-获取消息成功 1-发送消息失败 2-获取数据失败
char *pRecvDataBuf = NULL;
int iRet = 0;
int iLen = 0;
{
CAutoLock clsAutoLock(&m_netCs);
if (!SendCtrlMsgDirect(pRequestPacket->clsPacketBase.ucCmd, pRequestPacket->clsPacketBase.uiDevID,
pRequestPacket->clsPacketBase.ucDevType, pRequestPacket->pData, pRequestPacket->wDataLen))
{
dwWParam = 11;
}
//只有点名函数需要处理
if ((EN_CTRL_ROLLCALL_CABLE == pRequestPacket->clsPacketBase.ucCmd)
|| (EN_REQ_DOWNLOAD_CABLE_INFO == pRequestPacket->clsPacketBase.ucCmd))
{
::SendMessage(pRequestPacket->hWnd, WM_MSG_SEND_CABLE_ROLLCALL, dwWParam, pRequestPacket->clsPacketBase.ucCmd);
}
pRecvDataBuf = new char[pRequestPacket->iMaxRecvLen];
iLen = pRequestPacket->iMaxRecvLen;
iRet = RecvMsgDirect(pRecvDataBuf, &iLen, pRequestPacket->iMaxRecvLen, pRequestPacket->iTimeout);
if (EN_RECV_SUCCESS != iRet)
{
dwWParam = 22;
}
}
if (-1 != dwWParam)
{
::SendMessage(pRequestPacket->hWnd, pRequestPacket->dwMsgID, iRet, NULL);
//::SendMessage(pRequestPacket->hWnd, pRequestPacket->dwMsgID, dwWParam, NULL);
delete[] pRecvDataBuf;
return;
}
dwWParam = 0;
ST_RESPONSE_PACKET clsResponsePacket;
clsResponsePacket.clsPacketBase.ucCmd = pRequestPacket->clsPacketBase.ucCmd;
clsResponsePacket.clsPacketBase.ucDevType = pRequestPacket->clsPacketBase.ucDevType;
clsResponsePacket.clsPacketBase.uiDevID = pRequestPacket->clsPacketBase.uiDevID;
clsResponsePacket.pData = pRecvDataBuf;
clsResponsePacket.wDataLen = iLen;
::SendMessage(pRequestPacket->hWnd, pRequestPacket->dwMsgID, dwWParam, (LPARAM)&clsResponsePacket);
delete[] pRecvDataBuf;
pRecvDataBuf = NULL;
}
void CNetWorkOper::RegeditRealMsgCall(HWND hWnd)
{
CAutoLock clsLock(&m_realHwndCs);
list<HWND>::iterator iterFind = std::find(m_listRealHwnd.begin(), m_listRealHwnd.end(), hWnd);
if (iterFind != m_listRealHwnd.end())
{
return;
}
m_listRealHwnd.push_back(hWnd);
}
void CNetWorkOper::UnRegeditRealMsgCall(HWND hWnd)
{
CAutoLock clsLock(&m_realHwndCs);
list<HWND>::iterator iterFind = std::find(m_listRealHwnd.begin(), m_listRealHwnd.end(), hWnd);
if (iterFind == m_listRealHwnd.end())
{
return;
}
m_listRealHwnd.erase(iterFind);
}
void CNetWorkOper::ThreadFunction()
{
while (ProducerThread::m_bEngineRunning)
{
if (!m_tcpClient->GetConnectStatus())
{
CFileOperTools::GetInstance()->WriteComLog(_T("zm: ThreadFunction() GetConnectStatus --------------------------"));
//隔30秒进行重连操作
//m_tcpClient->CloseConnect();
//Sleep(10000);
if (!m_tcpClient->ReConnect())
{
CFileOperTools::GetInstance()->WriteComLog(_T("zm: ThreadFunction() ReConnect() --------------------------"));
Sleep(5000);
continue;
}
}
int iCtrlLen = 0;
int iRet;
int iCtrlRes;
{
CAutoLock clsAutoLock(&m_netCs);
//接收实时消息并判断是否有接受到控制类的报文
iCtrlRes = m_tcpClient->RecvCtrlMsg(m_chRcvCtrlBuf, &iCtrlLen, MAX_RCV_CTRLBUF, 100);
}
if (EN_RECV_CTRL_CMD == iCtrlRes)
{
CFileOperTools::GetInstance()->WriteComLog("zm:EN_RECV_CTRL_CMD begin..................");
BYTE ucCmd = m_tcpClient->GetCurrCtrlCmd();
if (m_pDevNotifyFunc)
{
STCtrlCmdInfo stCtrlCmd;
stCtrlCmd.iDataLen = iCtrlLen;
stCtrlCmd.pData = m_chRcvCtrlBuf;
m_pDevNotifyFunc(&stCtrlCmd, ucCmd, m_pDevNotfiyParam);
CFileOperTools::GetInstance()->WriteComLog("zm:EN_RECV_CTRL_CMD ..................");
}
CFileOperTools::GetInstance()->WriteComLog("zm:EN_RECV_CTRL_CMD end..................");
//如果是WIFI连接的话,则需要发送回应
if (EN_TRANSFER_FILE_BY_WIFI == g_iTransFileMode && 0 == ucCmd)
{
CFileOperTools::GetInstance()->WriteComLog("zm:EN_TRANSFER_FILE_BY_WIFI begin ..................");
if (iCtrlLen != 7 || ntohs(*(WORD*)(m_chRcvCtrlBuf)) != 1)
{
CString strErrTxt = _T("");
if (LANG_ZHCN == g_iUILanguage)
{
strErrTxt.Format(_T("严重错误.命令长度 = %d, 设备号 = %d"), iCtrlLen, ntohs(*(WORD*)(m_chRcvCtrlBuf)));
AfxMessageBox(strErrTxt);
}
else
{
strErrTxt.Format(_T("Serious error.ctr_data_len = %d, dev_number = %d"), iCtrlLen, ntohs(*(WORD*)(m_chRcvCtrlBuf)));
MessageBoxEx(NULL, strErrTxt, STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US));
}
continue;
}
STTransCtrlInfo stTransCtrl;
stTransCtrl.ucCmd = 0;
stTransCtrl.ucDevType = 3;
stTransCtrl.uiDevID = *((UINT*)(m_chRcvCtrlBuf + 3));
BYTE ucData = 3;
CAutoLock clsAutoLock(&m_netCs);
m_tcpClient->SendCtrlInfo((const char*)(&stTransCtrl), (char*)(&ucData), 1, 2);
CFileOperTools::GetInstance()->WriteComLog("zm:EN_TRANSFER_FILE_BY_WIFI end ..................");
}
}
else if (EN_RECV_PLC_STATUS == iCtrlRes)
{
CFileOperTools::GetInstance()->WriteComLog("zm:EN_RECV_PLC_STATUS begin...............");
CAutoLock clsAutoLock(&m_netCs);
ProcPlcStatus(m_chRcvCtrlBuf, iCtrlLen);
memset(m_chRcvCtrlBuf, 0, sizeof(m_chRcvCtrlBuf));
CFileOperTools::GetInstance()->WriteComLog("zm:EN_RECV_PLC_STATUS end...............");
continue;
}
else if (EN_REAL_TIME_TESTING_DATA == iCtrlRes)
{
CFileOperTools::GetInstance()->WriteComLog("zm:CNetWorkOper::ThreadFunction EN_REAL_TIME_TESTING_DATA begin...............");
//if (ucCmd == EN_CTRL_MEASURE_DATA)//接收到服务端正在测量的数据
{
if (m_listRealHwnd.size() <= 0)
{
continue;
}
CString str;
list<HWND>::iterator iterCur = m_listRealHwnd.begin();
list<HWND>::iterator iterEnd = m_listRealHwnd.end();
str.Format(_T("zm:wnd address iterCur=%0x, *iterCur=%0x"), iterCur, *iterCur);
CFileOperTools::GetInstance()->WriteComLog(str);
if (iCtrlLen == 0)
{
iCtrlLen = MAX_RCV_CTRLBUF;
}
for (; iterCur != iterEnd; ++iterCur)
{
if (IsWindowVisible(*iterCur))
{
::SendMessage(*iterCur, WM_NET_RECV_REAL_TIME_DATA, (WPARAM)m_chRcvCtrlBuf, iCtrlLen);
CFileOperTools::GetInstance()->WriteComLog("zm:CNetWorkOper::ThreadFunction EN_REAL_TIME_TESTING_DATA end...............");
}
}
continue;
}
}
else if (EN_RECV_SUCCESS == iCtrlRes)
{
CFileOperTools::GetInstance()->WriteComLog("zm:CNetWorkOper::ThreadFunction EN_RECV_SUCCESS == iCtrlRes...............");
memset(m_chRcvCtrlBuf, 0, sizeof(m_chRcvCtrlBuf));
}
else if (EN_RECV_NOTIFY_DEVICE_ONLINE == iCtrlRes)
{
if (NULL == m_chRcvCtrlBuf)
continue;
//数量(2bytes)1类型(1byte)1sn(4byte)2类型,2sn
u_short* pDevNum = NULL;
pDevNum = (u_short*)(&m_chRcvCtrlBuf);
u_short usDevNum = ntohs(*pDevNum);
UINT32* uiDevID = NULL;
BYTE* pByDevType = NULL;
BYTE devType = 0;
CString strDevSN,strLog;
for (int i = 0; i < usDevNum; i++)
{
pByDevType = (BYTE*)(&m_chRcvCtrlBuf[sizeof(short)]);
devType = *pByDevType;
switch (devType)
{
case EN_DEV_GD10:
{
uiDevID = (UINT32*)(&m_chRcvCtrlBuf[sizeof(short) + (i + 1)*sizeof(BYTE) + i*sizeof(UINT)]);
strDevSN.Format(_T("SN%d"), ntohl(*uiDevID));
strLog.Format(_T("zm:设备列表添加设备GD CNetWorkOper::ThreadFunction 接收到设备上线:%s"), strDevSN);
CFileOperTools::GetInstance()->WriteComLog(strLog);
STSigRemoteDev stRemoteDev;
stRemoteDev.ucDevType = EN_DEV_GD10;
stRemoteDev.uiDevID = ntohl(*uiDevID);
//开机
theApp.m_pDevManager->AddRemoteDevice(stRemoteDev);
theApp.m_pDevManager->DeleteObjInMem(strDevSN);
}
break;
case EN_DEV_PLC:
{
uiDevID = (UINT32*)(&m_chRcvCtrlBuf[sizeof(short) + (i + 1)*sizeof(BYTE) + i*sizeof(UINT)]);
strDevSN.Format(_T("PLC%d"), ntohl(*uiDevID));
strLog.Format(_T("zm:设备列表添加设备PLC CNetWorkOper::ThreadFunction 接收到设备上线:%s"), strDevSN);
CFileOperTools::GetInstance()->WriteComLog(strLog);
STSigRemoteDev stRemoteDev;
stRemoteDev.ucDevType = EN_DEV_PLC;
stRemoteDev.uiDevID = ntohl(*uiDevID);
//开机
theApp.m_pDevManager->AddRemoteDevice(stRemoteDev);
theApp.m_pDevManager->DeleteObjInMem(strDevSN);
}
break;
default:
break;
}
}
/*CString strLog;
UINT32* uiDevID = NULL;
CString strDevSN;
uiDevID = (UINT32*)(&m_chRcvCtrlBuf[3]);
strDevSN.Format(_T("SN%d"), ntohl(*uiDevID));
strLog.Format(_T("zm:设备列表添加设备CNetWorkOper::ThreadFunction 接收到设备上线:%s"), strDevSN);
CFileOperTools::GetInstance()->WriteComLog(strLog);
STSigRemoteDev stRemoteDev;
stRemoteDev.ucDevType = EN_DEV_GD10;
stRemoteDev.uiDevID = ntohl(*uiDevID);
//开机
theApp.m_pDevManager->AddRemoteDevice(stRemoteDev);
theApp.m_pDevManager->DeleteObjInMem(strDevSN);*/
CMainFrame* pMainFrm = (CMainFrame*)AfxGetApp()->GetMainWnd();
if (NULL != pMainFrm)
{
pMainFrm->SendMessage(WM_MSG_NOTIFY_DEVICE_ON_OR_OFF, (WPARAM)0, (LPARAM)0);
}
}
else if (EN_RECV_NOTIFY_DEVICE_OFFLINE == iCtrlRes)
{
if (NULL == m_chRcvCtrlBuf)
continue;
CString strLog;
UINT32* uiDevID = NULL;
CString strDevSN;
uiDevID = (UINT32*)(&m_chRcvCtrlBuf);
strDevSN.Format(_T("SN%d"), ntohl(*uiDevID));
strLog.Format(_T("zm:设备列表移除设备CNetWorkOper::ThreadFunction 接收到设备离线:%s"), strDevSN);
CFileOperTools::GetInstance()->WriteComLog(strLog);
STSigRemoteDev stRemoteDev;
stRemoteDev.ucDevType = EN_DEV_GD10;
stRemoteDev.uiDevID = ntohl(*uiDevID);
//关机
theApp.m_pDevManager->DeleteRemoteDevice(stRemoteDev);
theApp.m_pDevManager->AddOfflineObjInMem(strDevSN);
CMainFrame* pMainFrm = (CMainFrame*)AfxGetApp()->GetMainWnd();
if (NULL != pMainFrm)
{
pMainFrm->SendMessage(WM_MSG_NOTIFY_DEVICE_ON_OR_OFF, (WPARAM)0, (LPARAM)0);
}
}
if (m_bIsNeedSend)
{
OutputDebugString(_T("zm:zm is enter if (m_bIsNeedSend) \n\n"));
CString strLog;
CFileOperTools::GetInstance()->WriteComLog("zm:m_bIsNeedSend begin..............");
CAutoLock clsAutoLock(&m_netCs);
STTransCtrlInfo stTransCtrl;
stTransCtrl.ucCmd = m_ucCmd;
stTransCtrl.ucDevType = m_stSendCtrlInfo.ucDstType;
stTransCtrl.uiDevID = m_stSendCtrlInfo.uiDevID;
//如果之前的接收操作失败,则在发送数据之前清空接收缓冲区
// if (iRet!=EN_RECV_SUCCESS)
// {
// pNetOper->m_tcpClient->ClearRecvBuffer();
// }
//如果发送失败,则中断此次操作
if (false == m_tcpClient->SendCtrlInfo((const char*)&stTransCtrl, m_stSendCtrlInfo.pData, m_stSendCtrlInfo.wDataLen))
{
//如果有通知的函数接口,则进行操作结果的通知
if (m_pNotifyFunc)
{
strLog.Format(_T("zm:m_bIsNeedSend TransferOper cmd=%0x, DevType=%d, DevID=%u failed"), stTransCtrl.ucCmd, stTransCtrl.ucDevType, stTransCtrl.uiDevID);
CFileOperTools::GetInstance()->WriteComLog(strLog);
m_pNotifyFunc(EN_NETWORK_SEND, EM_SEND_FAILED, m_pNotifyParam);
}
ClearNotfiyFuncInfo();
ClearSendInfo();
// pNetOper->m_tcpClient->ClearRecvBuffer();
continue;
}
m_bIsNeedSend = false;
strLog.Format(_T("zm:m_bIsNeedSend TransferOper cmd=%0x, DevType=%d, DevID=%u success"), stTransCtrl.ucCmd, stTransCtrl.ucDevType, stTransCtrl.uiDevID);
CFileOperTools::GetInstance()->WriteComLog(strLog);
//如果需要接受数据的话,则此刻进行数据的接收操作
if (m_bIsNeedResp)
{
int iRecvLen = 0;
iRet = m_tcpClient->RecvRspMsg(m_stRespDataInfo.pData, m_stRespDataInfo.pRecvLen,
m_stRespDataInfo.iMaxRcvLen, m_stRespDataInfo.iTimeout);
while ((EN_RECV_CTRL_CMD == iRet) || (EN_RECV_PLC_STATUS == iCtrlRes))
{
if (EN_RECV_PLC_STATUS == iCtrlRes)
{
ProcPlcStatus(m_stRespDataInfo.pData, *(m_stRespDataInfo.pRecvLen));
// memset(pNetOper->m_chRcvCtrlBuf, 0, sizeof(pNetOper->m_chRcvCtrlBuf));
}
else
{
if (EN_TRANSFER_FILE_BY_WIFI == g_iTransFileMode)
{
if (LANG_ZHCN == g_iUILanguage)
AfxMessageBox(_T("在WiFi模式接收数据时控制命令不能被接收"));
else
MessageBoxEx(NULL, _T("Ctrl_cmd can not be received when rece data in wifi mode"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US));
break;
}
if (m_pDevNotifyFunc)
{
STCtrlCmdInfo stCtrlCmd;
stCtrlCmd.iDataLen = *(m_stRespDataInfo.pRecvLen);
stCtrlCmd.pData = m_stRespDataInfo.pData;
m_pDevNotifyFunc(&stCtrlCmd, m_tcpClient->GetCurrCtrlCmd(), m_pDevNotfiyParam);
}
}
iRet = m_tcpClient->RecvRspMsg(m_stRespDataInfo.pData, m_stRespDataInfo.pRecvLen,
m_stRespDataInfo.iMaxRcvLen, m_stRespDataInfo.iTimeout);
}
if (m_ucCmd == EN_CTRL_MEASURE_DATA)
{
CFileOperTools::GetInstance()->WriteComLog(_T("zm:debugging measure task wnd m_ucCmd == EN_CTRL_MEASURE_DATA is need transfer"));
//调测测量窗口,可能关闭了
if (g_bIsOnlineTransfer == FALSE)
{
CFileOperTools::GetInstance()->WriteComLog(_T("zm:debugging measure task wnd g_bIsOnlineTransfer == FALSE"));
if (m_pNotifyFunc)
{
// if (iRet != EN_RECV_SUCCESS)
// {
// pNetOper->m_tcpClient->ClearRecvBuffer();
// }
m_pNotifyFunc(EN_NETWORK_RECV, iRet, m_pNotifyParam);
}
}
}
else
{
if (m_pNotifyFunc)
{
CFileOperTools::GetInstance()->WriteComLog(_T("zm:m_ucCmd != EN_CTRL_MEASURE_DATA"));
strLog.Format(_T("zm: m_stRespDataInfo.pData="));
for (int i = 0; i < *m_stRespDataInfo.pRecvLen; i++)
{
strLog.AppendFormat(_T(" %02x"), m_stRespDataInfo.pData[i]);
}
CFileOperTools::GetInstance()->WriteComLog(strLog);
strLog.Format(_T("zm:m_stRespDataInfo.pRecvLen=%d"), *m_stRespDataInfo.pRecvLen);
CFileOperTools::GetInstance()->WriteComLog(strLog);
// if (iRet != EN_RECV_SUCCESS)
// {
// pNetOper->m_tcpClient->ClearRecvBuffer();
// }
m_pNotifyFunc(EN_NETWORK_RECV, iRet, m_pNotifyParam);
}
}
CFileOperTools::GetInstance()->WriteComLog("zm:m_bIsNeedSend end..............");
}
ClearNotfiyFuncInfo();
ClearSendInfo();
}/*else if (iCtrlRes == EN_RECV_SUCCESS)
{
//bRet = true;
list<HWND>::iterator iterCur = m_listRealHwnd.begin();
list<HWND>::iterator iterEnd = m_listRealHwnd.end();
for (; iterCur != iterEnd; ++iterCur)
{
::SendMessage(*iterCur, WM_NET_RECV_REAL_TIME_DATA, (WPARAM)m_chRcvCtrlBuf, iCtrlLen);
}
}*/
}
}
void CNetWorkOper::SetSuspendForThread(bool bIsSuspend)
{
m_bIsSuspend = bIsSuspend;
}