/************************************************************************************************** 版本所有(C), 2020-2022, 北京普达迪泰 *************************************************************************************************** 文 件 名: IDCMParser.cpp 功能描述: 通讯命令 版 本 号: 1.00初版 作 者: HYF 生成日期; 2021-12-20 最近修改: 函数列表: 使用说明: 1.添加引用LOG.h和LOG.cpp文件 2.需要输出日志时用以下代码: 修改历史: 1.日 期 :2021-12-20 作 者 : HYF 修改内容 : 创建文件 **************************************************************************************************/ #include "pch.h" #include "IDCMParser.h" #include "EquipTypeManager.h" #include "EquipTypePlaceManager.h" #include "EquipDataManager.h" #include "EquipDataCircleManager.h" #include "EquipDataPlaneManager.h" #include "EquipDataLineManager.h" #include "EquipDataPointManager.h" #include "TaskManager.h" #include "PostureDataPointManager.h" #include "PostureDataAngleManager.h" #include "LOG.h" #include "DynamicData.h" #include "PostureDataPoint.h" #include "PostureDataAngle.h" ULONG g_ulTest = 0; IDCMParser::IDCMParser() { } IDCMParser::~IDCMParser(void) { } /************************************************************************************************** 函 数 名 :Parser 功能描述 :解析IDPMS返回结果 输出参数 :略 返 回 值 :-1错误, 0未完成, 1最终结束 **************************************************************************************************/ int IDCMParser::Parser(char *pszBuf, DMSResponse *&pRes, LPCTSTR szEndFlag) { CString szLog; szLog.Format("接收:%s", pszBuf); LOG::D(CString(szLog)); if (strncmp(pszBuf, "IDPMS-CR", 8) == 0) return CR(pszBuf, pRes, szEndFlag); if (strncmp(pszBuf, "CIDPMSResponce", 14) == 0) return Responce(pszBuf, pRes, szEndFlag); if (strncmp(pszBuf, "CIDPMSError", 11) == 0) return Error(pszBuf, pRes, szEndFlag); if (strncmp(pszBuf, "CPDSimpleBundleStats", 20) == 0) return SimpleBundleStats(pszBuf, pRes, szEndFlag); return -1; } /************************************************************************************************** 函 数 名 :CR 功能描述 :解析IDPMS返回结果CR 输出参数 :略 返 回 值 :-1错误, 0未完成, 1最终结束 **************************************************************************************************/ int IDCMParser::CR(char *pszBuf, DMSResponse *&pRes, LPCTSTR szEndFlag) { if (strncmp(pszBuf, "IDPMS-CR:CDME-E0001:CDME-E0015", 30) == 0) { CString szMsg("当前坐标点不存在!\r\n"); if (pRes == NULL) pRes = (DMSResponse *)Utils::DMS_CreateMsg(); DMSResponse *pMSG = (DMSResponse *)pRes; pMSG->bRet = FALSE; pMSG->iCode = 0; strncat_s((char *)pMSG->szMsg, DMS_MSG_SIZE, szMsg.GetBuffer(), szMsg.GetLength()); return 0; } if ((strncmp(pszBuf, "IDPMS-CR:RPD", 12) != 0) && (strncmp(pszBuf, "IDPMS-CR:CDME-E0001:CDME-E0003", 30)!= 0) && (strncmp(pszBuf, "IDPMS-CR:CDME-E0001:CDME-E0005", 30) != 0) && (strncmp(pszBuf, "IDPMS-CR:CDMEOK", 30)!= 0)) { return -1; } // CString szEnd(szEndFlag); int iEndFlagSize = szEnd.GetLength(); if (iEndFlagSize > 0) { if (strncmp(pszBuf, szEnd.GetBuffer(), iEndFlagSize) == 0) { return 1; } } return 0; } /************************************************************************************************** 函 数 名 :Responce 功能描述 :解析IDPMS返回结果Responce 输出参数 :略 返 回 值 :-1错误, 0未完成, 1最终结束 **************************************************************************************************/ int IDCMParser::Responce(char *pszBuf, DMSResponse *&pRes, LPCTSTR szEndFlag) { CString szEnd(szEndFlag); int iEndFlagSize = szEnd.GetLength(); if (iEndFlagSize > 0) { if (strncmp(pszBuf, szEnd.GetBuffer(), iEndFlagSize) == 0) { return 1; } } return 0; } /************************************************************************************************** 函 数 名 :Error 功能描述 :解析IDPMS返回结果Responce 输出参数 :略 返 回 值 :-1错误, 0未完成, 1最终结束 **************************************************************************************************/ int IDCMParser::Error(char *pszBuf, DMSResponse *&pRes, LPCTSTR szEndFlag) { // 解析并返回结果 int nSize = (int)_tcslen(pszBuf); if (pRes == NULL) pRes = (DMSResponse *)Utils::DMS_CreateMsg(); DMSResponse *pMSG = (DMSResponse *)pRes; pMSG->bRet = FALSE; pMSG->iCode = 0; strncat_s((char *)pRes, DMS_MSG_SIZE, pszBuf, nSize); strncat_s((char *)pRes, DMS_MSG_SIZE, "\r\n", 2); CString szEnd(szEndFlag); int iEndFlagSize = szEnd.GetLength(); if (iEndFlagSize > 0) { if (strncmp(pszBuf, szEnd.GetBuffer(), iEndFlagSize) == 0) { return 1; } } return 0; } /************************************************************************************************** 函 数 名 :SimpleBundleStats 功能描述 :解析IDPMS返回结果Responce 输出参数 :略 返 回 值 :-1错误, 0未完成, 1最终结束 **************************************************************************************************/ int IDCMParser::SimpleBundleStats(char *pszBuf, DMSResponse *&pRes, LPCTSTR szEndFlag) { // 解析并返回结果 int nSize = (int)_tcslen(pszBuf); if (pRes == NULL) pRes = (DMSResponse *)Utils::DMS_CreateMsg(); DMSResponse *pMSG = (DMSResponse *)(pRes); pMSG->bRet = FALSE; pMSG->iCode = 0; CStringArray arrParams; CString szRMSX, szRMSY, szRMSZ; Utils::StrSplit(pszBuf, ';', arrParams); for (int i = 0; i < arrParams.GetCount(); i++) { CString szParam = arrParams.GetAt(i); int iLen = szParam.GetLength(); if (szParam.Left(15).Compare("bundleTotalRMSX") == 0) { szRMSX = szParam.Right(iLen - 16); } if (szParam.Left(15).Compare("bundleTotalRMSY") == 0) { szRMSY = szParam.Right(iLen - 16); } if (szParam.Left(15).Compare("bundleTotalRMSZ") == 0) { szRMSZ = szParam.Right(iLen - 16); } } DOUBLE rmsx = 0.0; DOUBLE rmsy = 0.0; DOUBLE rmsz = 0.0; if (!szRMSX.IsEmpty()) rmsx = atof(szRMSX.GetBuffer()); if (!szRMSY.IsEmpty()) rmsy = atof(szRMSY.GetBuffer()); if (!szRMSZ.IsEmpty()) rmsz = atof(szRMSZ.GetBuffer()); CString szMsg; szMsg.Format("RMSx = %.3f RMSy = %.3f RMSz = %.3f", rmsx, rmsy, rmsz); strncat_s((char *)pMSG->szMsg, DMS_MSG_SIZE, szMsg.GetBuffer(), szMsg.GetLength()); strncat_s((char *)pMSG->szMsg, DMS_MSG_SIZE, "\r\n", 2); // 比对结束标识,返回执行结果 CString szEnd(szEndFlag); int iEndFlagSize = szEnd.GetLength(); if (iEndFlagSize > 0) { if (strncmp(pszBuf, szEnd.GetBuffer(), iEndFlagSize) == 0) { return 1; } } return 0; } /************************************************************************************************** 函 数 名 :ParseData 功能描述 :动态数据报文 输出参数 :略 返 回 值 :-1错误, 0未完成, 1最终结束 **************************************************************************************************/ int IDCMParser::ParseData(char *pszBuf, DMSResponse *&pRes, void *pData) { CString dataLeft("IDPMS-CR:点发送开始"); int iLeft = dataLeft.GetLength(); CStringArray arrData; CStringArray szArray; // 处理接收数据 CString szLine(pszBuf); CString szLineLeft = szLine.Left(iLeft); if (szLineLeft.CompareNoCase(dataLeft) != 0) return 0; Utils::StrSplit(pszBuf, "\r\n", arrData); DynamicData *pDynamicData = (DynamicData *)pData; pDynamicData->Lock(); for (int i = 1; i < arrData.GetSize(); i++) { CString szLine = arrData.GetAt(i); if (!szLine.IsEmpty()) { // 分割字符串成数组 int iNum = Utils::StrSplit(szLine, ' ', szArray); if (iNum < 5) break; CString szPointTitle(szArray.GetAt(0)); CString szPointCode(szArray.GetAt(0)); CString szPointAX = szArray.GetAt(1); CString szPointAY = szArray.GetAt(2); CString szPointAZ = szArray.GetAt(3); DOUBLE pointAX = atof(szPointAX.GetBuffer()); DOUBLE pointAY = atof(szPointAY.GetBuffer()); DOUBLE pointAZ = atof(szPointAZ.GetBuffer()); // 添加推力线的关联点 PostureDataPoint *pPoint = new PostureDataPoint(); pPoint->SetTaskId(pDynamicData->GetTaskId()); pPoint->SetEquipPlace(pDynamicData->GetEquipPlace()); pPoint->SetPointTitle(szPointTitle); pPoint->SetPointCode(szPointCode); pPoint->SetPointAX(pointAX); pPoint->SetPointAY(pointAY); pPoint->SetPointAZ(pointAZ); // 新增 pDynamicData->AddPoint(pPoint); } } pDynamicData->CalcAngle(); pDynamicData->Unlock(); return 1; } /************************************************************************************************** 函 数 名 :ParseData 功能描述 :动态数据报文 输出参数 :略 返 回 值 :-1错误, 0未完成, 1最终结束 **************************************************************************************************/ int IDCMParser::ParseData(CStringArray& arrRecData, DMSResponse *&pRes, void *pResData) { CString dataLeft("IDPMS-CR:点发送开始"); int iLeft = dataLeft.GetLength(); // 处理接收数据 CString szLine; BOOL bExist = FALSE; for (int i=0; i< arrRecData.GetCount(); i++) { szLine = arrRecData.GetAt(i); CString szLineLeft = szLine.Left(iLeft); if (szLineLeft.CompareNoCase(dataLeft) == 0) { bExist = TRUE; break; } } if (!bExist) return 0; CStringArray arrData; CStringArray szArray; Utils::StrSplit(szLine, "\r\n", arrData); DWORD iPointId = 0; DynamicData *pDynamicData = (DynamicData *)pResData; pDynamicData->Lock(); pDynamicData->Clear(); for (int i = 1; i < arrData.GetSize(); i++) { CString szLine = arrData.GetAt(i); if (!szLine.IsEmpty()) { // 分割字符串成数组 int iNum = Utils::StrSplit(szLine, ' ', szArray); if (iNum < 5) break; CString szPointTitle(szArray.GetAt(0)); CString szPointCode(szArray.GetAt(0)); CString szPointAX = szArray.GetAt(1); CString szPointAY = szArray.GetAt(2); CString szPointAZ = szArray.GetAt(3); DOUBLE pointAX = atof(szPointAX.GetBuffer()); DOUBLE pointAY = atof(szPointAY.GetBuffer()); DOUBLE pointAZ = atof(szPointAZ.GetBuffer()); // 添加推力线的关联点 PostureDataPoint *pPoint = new PostureDataPoint(); iPointId++; pPoint->SetTaskId(pDynamicData->GetTaskId()); pPoint->SetPointId(iPointId); pPoint->SetEquipCode(pDynamicData->GetEquipCode()); pPoint->SetEquipPlace(pDynamicData->GetEquipPlace()); pPoint->SetPointTitle(szPointTitle); pPoint->SetPointCode(szPointCode); pPoint->SetPointAX(pointAX); pPoint->SetPointAY(pointAY); pPoint->SetPointAZ(pointAZ); // 新增 pDynamicData->AddPoint(pPoint); } } pDynamicData->CalcAngle(); pDynamicData->Unlock(); return 1; } /************************************************************************************************** 函 数 名 :ParseData 功能描述 :动态数据报文 输出参数 :略 返 回 值 :-1错误, 0未完成, 1最终结束 **************************************************************************************************/ int IDCMParser::ParseTestData(CStringArray& arrRecData, DMSResponse *&pRes, void *pResData) { DWORD iPointId = 0; DynamicData *pDynamicData = (DynamicData *)pResData; pDynamicData->Lock(); pDynamicData->Clear(); // 1 DOUBLE pointAX = 0.4; DOUBLE pointAY = 1345.90; DOUBLE pointAZ = -345.70; // 添加推力线的关联点 PostureDataPoint *pPoint = new PostureDataPoint(); iPointId++; pPoint->SetTaskId(pDynamicData->GetTaskId()); pPoint->SetPointId(iPointId); pPoint->SetEquipCode(pDynamicData->GetEquipCode()); pPoint->SetEquipPlace(pDynamicData->GetEquipPlace()); pPoint->SetPointTitle("CODE1"); pPoint->SetPointCode("CODE1"); pPoint->SetPointAX(pointAX); pPoint->SetPointAY(pointAY); pPoint->SetPointAZ(pointAZ); pDynamicData->AddPoint(pPoint); // 2 g_ulTest++; pointAX = -616.5+g_ulTest*5 ; pointAY = 1337.9; pointAZ = -2132.7; pPoint = new PostureDataPoint(); iPointId++; pPoint->SetTaskId(pDynamicData->GetTaskId()); pPoint->SetPointId(iPointId); pPoint->SetEquipCode(pDynamicData->GetEquipCode()); pPoint->SetEquipPlace(pDynamicData->GetEquipPlace()); pPoint->SetPointTitle("CODE2"); pPoint->SetPointCode("CODE2"); pPoint->SetPointAX(pointAX); pPoint->SetPointAY(pointAY); pPoint->SetPointAZ(pointAZ); pDynamicData->AddPoint(pPoint); pDynamicData->CalcTestAngle(); pDynamicData->Unlock(); return 1; }