agv-control/Plugin/KcCtrl/KcMainDlg.cpp
2025-06-09 09:09:25 +08:00

355 lines
7.6 KiB
C++
Raw Permalink 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.

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