// 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"]); }*/