355 lines
7.6 KiB
C++
355 lines
7.6 KiB
C++
// CanDeviceDlg.cpp : 实现文件
|
||
//
|
||
|
||
#include "stdafx.h"
|
||
#include "KcMainDlg.h"
|
||
#include "resource.h"
|
||
#include "afxdialogex.h"
|
||
#include "KcCtrl.h"
|
||
#include "KcStruct.h"
|
||
#include "KcOperDlg.h"
|
||
#include "KcConfigDlg.h"
|
||
#include "KcProtocol.h"
|
||
|
||
|
||
int StopFlag = 0;
|
||
unsigned long nextrow;
|
||
#define TIMER_QUERY_AGV_STATE 1
|
||
|
||
// CCanDeviceDlg 对话框
|
||
//控件ID只需要在当前窗口中唯一,这里随便写一个就好
|
||
#define ID_VIRTUAL_LIST_CTRL (20000)
|
||
#define TIMER_ID_ADD_TEST_DATA (2024)
|
||
IMPLEMENT_DYNAMIC(CKcMainDlg, CDialogEx)
|
||
|
||
CKcMainDlg::CKcMainDlg(CWnd* pParent /*=NULL*/)
|
||
: CDialogEx(IDD_CK_CTRL_DLG, pParent)
|
||
{
|
||
|
||
}
|
||
|
||
CKcMainDlg::~CKcMainDlg()
|
||
{
|
||
}
|
||
|
||
void CKcMainDlg::DoDataExchange(CDataExchange* pDX)
|
||
{
|
||
CDialogEx::DoDataExchange(pDX);
|
||
|
||
}
|
||
|
||
|
||
BEGIN_MESSAGE_MAP(CKcMainDlg, CDialogEx)
|
||
|
||
ON_COMMAND(IDR_MENU_DEV_OPT, &CKcMainDlg::OnMenuDevOpt)
|
||
ON_COMMAND(IDR_MENU_SETTING, &CKcMainDlg::OnMenuSetting)
|
||
ON_WM_TIMER()
|
||
END_MESSAGE_MAP()
|
||
|
||
|
||
|
||
|
||
//和模块进程通讯的管道回调函数:
|
||
void g_PipeCallBack(void* pObj, int lMsgId, WPARAM wparam, LPARAM lparam)
|
||
{
|
||
CKcMainDlg* pModule = (CKcMainDlg*)pObj;
|
||
if (CEXPIPE_CONNECT_OK == lMsgId)
|
||
{
|
||
//连接成功
|
||
//if (FALSE == pModule->PostMessage(WM_PLATFORM_CONNECT_OK, NULL, NULL)) { LogOutToFile("g_PipeCallBack PostMessage error[%d]", lMsgId); }
|
||
LogOutToFile("已连接父进程管道");
|
||
|
||
//向WMS服务器请求设备配置信息
|
||
//theApp.SendMsg2Platform("WMS", DEVICE_CONFIG_REQ);
|
||
}
|
||
else if (CEXPIPE_DIS_CLIENT == lMsgId)
|
||
{
|
||
//管道断开,结束
|
||
#ifndef _DEBUG
|
||
LogOutToFile("父进程连接管道断开,本模块自动退出");
|
||
//if (FALSE == pModule->PostMessage(WM_CLOSE, NULL, NULL)) { LogOutToFile("g_PipeCallBack PostMessage error[%d]", lMsgId); }
|
||
pModule->PostMessage(WM_COMMAND, MAKEWPARAM(ID_TRAY_EXIT, 0), 0);
|
||
#endif
|
||
exit(0);
|
||
}
|
||
else if (CEXPIPE_NEW_DATA == lMsgId)
|
||
{
|
||
pModule->ProcessPipeMsg(lMsgId, (char*)wparam, (int)lparam);
|
||
}
|
||
else
|
||
{
|
||
;
|
||
}
|
||
}
|
||
|
||
|
||
void CKcMainDlg::ProcessPipeMsg(int lMsgId, char* pData, int lLen)
|
||
{
|
||
if (lLen == 0)
|
||
{
|
||
return;
|
||
}
|
||
|
||
PIPE_DATA_STRUCT* pstData = (PIPE_DATA_STRUCT*)pData;
|
||
|
||
//平台转发给插件的消息
|
||
if (pstData->lMsgId == MAIN_2_MODULE_WMS && pstData->lDataLen > 0)
|
||
{
|
||
Json::Reader reader;
|
||
Json::Value root;
|
||
if (reader.parse((char*)pstData->acData, root))
|
||
{
|
||
CString strReceiver = root["receiver"].asString().c_str();
|
||
CString strSender = root["sender"].asString().c_str();
|
||
int nType = root["type"].asInt();
|
||
UINT32 nSerialNum = root["serial_num"].asUInt(); //通信序列号
|
||
CString strTime = root["time"].asString().c_str(); //时间戳
|
||
|
||
if (AGV_GUIDE == nType)
|
||
{
|
||
Build0xAEMessage(root["data"]);
|
||
}
|
||
else if (AGV_ACTION == nType)
|
||
{
|
||
Build0xB2Message(root["data"]);
|
||
}
|
||
|
||
}
|
||
}
|
||
else if (pstData->lMsgId == MAIN_2_MODULE_SHOWWINDOW)
|
||
{
|
||
//PostMessage(WM_COMMAND, MAKEWPARAM(ID_TRAY_SHOW, 0), 0);
|
||
AfxGetApp()->m_pMainWnd->ShowWindow(SW_SHOWNORMAL);
|
||
SetForegroundWindow();
|
||
}
|
||
|
||
LogOutToFile("HttpServiceListener::OnRecvRequest End");
|
||
}
|
||
|
||
|
||
// CCanDeviceDlg 消息处理程序
|
||
BOOL CKcMainDlg::OnInitDialog()
|
||
{
|
||
|
||
CString strPipe;
|
||
for (int i = 0; i < __argc; i++)
|
||
{
|
||
if (0 == strcmp(__argv[i], "-pipe") && i + 1 < __argc)
|
||
{
|
||
strPipe = __argv[i + 1];
|
||
}
|
||
}
|
||
|
||
if (strPipe.IsEmpty())
|
||
{
|
||
char acPipe[256] = "";
|
||
|
||
CString iniPath = theApp.m_strModulePath.Left(theApp.m_strModulePath.ReverseFind('\\') + 1);
|
||
//m_strModulePath = theApp.m_strModulePath.ReverseFind("\\");
|
||
iniPath = iniPath + "pipe.ini";
|
||
//中文名称,仅显示用
|
||
GetPrivateProfileString("AGV-MODULE", "PIPE_KC-CTRL", "", acPipe, 256, iniPath);
|
||
strPipe = acPipe;
|
||
}
|
||
g_pstPipeClient->RegisterCall(g_PipeCallBack, this);
|
||
g_pstPipeClient->Connect(strPipe.GetBuffer());
|
||
|
||
|
||
SetTimer(TIMER_QUERY_AGV_STATE, 500, NULL);
|
||
|
||
CDialogEx::OnInitDialog();
|
||
return TRUE;
|
||
|
||
}
|
||
|
||
|
||
void CKcMainDlg::OnMenuDevOpt()
|
||
{
|
||
CKcOperDlg dlg;
|
||
dlg.DoModal();
|
||
}
|
||
|
||
|
||
void CKcMainDlg::OnMenuSetting()
|
||
{
|
||
CKcConfigDlg dlg;
|
||
dlg.DoModal();
|
||
}
|
||
|
||
|
||
void CKcMainDlg::OnTimer(UINT_PTR nIDEvent)
|
||
{
|
||
// TODO: 在此添加消息处理程序代码和/或调用默认值
|
||
switch (nIDEvent)
|
||
{
|
||
case TIMER_QUERY_AGV_STATE: //定时轮询AGV状态
|
||
Build0xAFMessage();
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
CDialogEx::OnTimer(nIDEvent);
|
||
}
|
||
|
||
|
||
|
||
void CKcMainDlg::Build0xAEMessage(Json::Value param)
|
||
{
|
||
|
||
unsigned char acMsgContent[1024] = { 0 };
|
||
int nMsgLength = 0;
|
||
CKcProtocol protocol;
|
||
|
||
protocol.BuildRequestMessage(0xAE, acMsgContent, nMsgLength, param);
|
||
|
||
if (!m_udpClent.Connect(theApp.m_strControllerIp.GetBuffer(), theApp.m_nControllerPort))
|
||
{
|
||
std::cout << "Connect error." << std::endl;
|
||
return;
|
||
}
|
||
|
||
int lRto = 3000;//重传时间,单位毫秒
|
||
int lRtoCnt = 3;//最大重传次数
|
||
unsigned char acRecv[1024] = { 0 };//接收数据缓冲区
|
||
int lRecvbufSize = sizeof(acRecv);//接收缓冲区大小
|
||
|
||
int recvSize = m_udpClent.SendAndRecv((const char *)acMsgContent, nMsgLength, (char *)acRecv, lRecvbufSize, lRto, lRtoCnt);
|
||
if (recvSize == 28)
|
||
{
|
||
//std::cout << "Received: " << acRecv << std::endl;
|
||
Json::Value ret;
|
||
ret["state"] = 1;
|
||
theApp.SendMsg2Platform("OPENTCS", AGV_GUIDE, ret); //下发成功
|
||
}
|
||
else
|
||
{
|
||
Json::Value ret;
|
||
ret["state"] = 0;
|
||
theApp.SendMsg2Platform("OPENTCS", AGV_GUIDE, ret); //下发失败
|
||
}
|
||
}
|
||
|
||
void CKcMainDlg::Build0xB2Message(Json::Value param)
|
||
{
|
||
|
||
unsigned char acMsgContent[1024] = { 0 };
|
||
int nMsgLength = 0;
|
||
CKcProtocol protocol;
|
||
|
||
protocol.BuildRequestMessage(0xB2, acMsgContent, nMsgLength, param);
|
||
|
||
if (!m_udpClent.Connect(theApp.m_strControllerIp.GetBuffer(), theApp.m_nControllerPort))
|
||
{
|
||
std::cout << "Connect error." << std::endl;
|
||
return;
|
||
}
|
||
|
||
int lRto = 3000;//重传时间,单位毫秒
|
||
int lRtoCnt = 3;//最大重传次数
|
||
unsigned char acRecv[1024] = { 0 };//接收数据缓冲区
|
||
int lRecvbufSize = sizeof(acRecv);//接收缓冲区大小
|
||
|
||
int recvSize = m_udpClent.SendAndRecv((const char *)acMsgContent, nMsgLength, (char *)acRecv, lRecvbufSize, lRto, lRtoCnt);
|
||
if (recvSize == 28)
|
||
{
|
||
//std::cout << "Received: " << acRecv << std::endl;
|
||
Json::Value ret;
|
||
ret["state"] = 1;
|
||
theApp.SendMsg2Platform("OPENTCS", AGV_ACTION, ret); //下发成功
|
||
}
|
||
else
|
||
{
|
||
Json::Value ret;
|
||
ret["state"] = 0;
|
||
theApp.SendMsg2Platform("OPENTCS", AGV_ACTION, ret); //下发失败
|
||
}
|
||
}
|
||
|
||
|
||
void CKcMainDlg::Build0xAFMessage()
|
||
{
|
||
//构造请求报文
|
||
CKcProtocol protocol;
|
||
unsigned char acMsgContent[1024];
|
||
int nMsgLength;
|
||
protocol.BuildRequestMessage(0xAF, acMsgContent, nMsgLength);
|
||
|
||
if (!m_udpClent.Connect(theApp.m_strControllerIp.GetBuffer(), theApp.m_nControllerPort))
|
||
{
|
||
std::cout << "Connect error." << std::endl;
|
||
return;
|
||
}
|
||
|
||
int lRto = 3000;//重传时间,单位毫秒
|
||
int lRtoCnt = 3;//最大重传次数
|
||
unsigned char acRecv[1024] = { 0 };//接收数据缓冲区
|
||
int lRecvbufSize = sizeof(acRecv);//接收缓冲区大小
|
||
|
||
int recvSize = m_udpClent.SendAndRecv((const char *)acMsgContent, nMsgLength, (char *)acRecv, lRecvbufSize, lRto, lRtoCnt);
|
||
if (recvSize > 0)
|
||
{
|
||
//std::cout << "Received: " << acRecv << std::endl;
|
||
Json::Value ret = protocol.Analysis0xAFMessage(acRecv, recvSize);
|
||
theApp.SendMsg2Platform("OPENTCS", AGV_STATUS_RPT, ret);
|
||
}
|
||
else
|
||
{
|
||
//std::cout << "Received: failed." << recvSize << std::endl;
|
||
}
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
/*int nMsgType = root["type"].asInt();
|
||
|
||
CKcOperDlg dlg;
|
||
//向科聪控制器发送0xAF消息
|
||
if (nMsgType == 0xAF)
|
||
{
|
||
dlg.OnBnClickedBtn0xaf();
|
||
}
|
||
else if (nMsgType == 0xB0)
|
||
{
|
||
dlg.OnBnClickedBtn0xb0();
|
||
}
|
||
else if (nMsgType == 0x17)
|
||
{
|
||
dlg.OnBnClickedBtn0x17();
|
||
}
|
||
else if (nMsgType == 0x1F )
|
||
{
|
||
dlg.OnBnClickedBtn0x1f();
|
||
}
|
||
else if (nMsgType == 0xAE)
|
||
{
|
||
dlg.Build0xAEMessage(root["data"]);
|
||
|
||
}
|
||
else if (nMsgType == 0x14)
|
||
{
|
||
dlg.Build0x14Message(root["data"]);
|
||
|
||
}
|
||
else if (nMsgType == 0x03)
|
||
{
|
||
dlg.Build0x03Message(root["data"]);
|
||
|
||
}
|
||
else if (nMsgType == 0x02)
|
||
{
|
||
dlg.Build0x02Message(root["data"]);
|
||
|
||
}
|
||
else if (nMsgType == 0xb2)
|
||
{
|
||
dlg.Build0xB2Message(root["data"]);
|
||
|
||
}*/
|
||
|
||
|