/************************************************************************************************** 版本所有(C), 2020-2022, 北京普达迪泰 *************************************************************************************************** 文 件 名: StaticTaskThread.h 功能描述: IDPMS静态任务处理 版 本 号: 1.00初版 作 者: HYF 生成日期; 2021-12-20 最近修改: 函数列表: 修改历史: 1.日 期 :2021-12-20 作 者 : HYF 修改内容 : 创建文件 **************************************************************************************************/ #include "pch.h" #include "StaticTaskThread.h" #include "EquipDataManager.h" #include "EquipDataCircleManager.h" #include "EquipDataPlaneManager.h" #include "EquipDataLineManager.h" #include "EquipDataPointManager.h" #include "TaskManager.h" #include "IDPMSComm.h" #include "StaticData.h" CString g_szTaskPrjFolderName(_T("")); IMPLEMENT_DYNCREATE(StaticTaskThread, CUIThread) BEGIN_MESSAGE_MAP(StaticTaskThread, CWinThread) // {{AFX_MSG_MAP(CARTDevSearchTask) // NOTE - the ClassWizard will add and remove mapping macros here. ON_THREAD_MESSAGE(WM_STATIC, OnStatic) ON_THREAD_MESSAGE(WM_STATIC_DATA, OnStaticData) //}}AFX_MSG_MAP END_MESSAGE_MAP() StaticTaskThread::StaticTaskThread(void) { } StaticTaskThread::~StaticTaskThread(void) { } BOOL StaticTaskThread::InitInstance() { return TRUE; } /************************************************************************************************** 函 数 名 :GetPhotoPath 功能描述 :获取最新像片路径 输入参数 :略 输出参数 :无 返 回 值 :void **************************************************************************************************/ BOOL StaticTaskThread::GetPhotoPath(CString &szTargetPath) { CString szPhotoDir = AppConfig::GetString(_T("Directory"), _T("PhotoDir")); if (szPhotoDir.IsEmpty()) return FALSE; CFileFind finder; CString szSearchDir; szSearchDir.Format("%s%s",szPhotoDir, _T("\\*.*")); BOOL bFound = finder.FindFile(szSearchDir); CTime time0 = 0; CString szTargetDir; while (bFound) { bFound = finder.FindNextFile(); CString szPath = finder.GetFilePath(); if (finder.IsDirectory() && !finder.IsDots()) { CString szDirName = finder.GetFileName(); CFileStatus fileStatus; CFile::GetStatus(szPhotoDir + "\\" + szDirName, fileStatus); CTime time1 = fileStatus.m_ctime; if (time0 < time1) { szTargetDir = szDirName; time0 = time1; } } } if (szTargetDir.IsEmpty()) return FALSE; szTargetPath.Append(szPhotoDir); szTargetPath.Append(_T("\\")); szTargetPath.Append(szTargetDir); return TRUE; } /************************************************************************************************** 函 数 名 :OnStatic 功能描述 :静态零位测量 输入参数 :略 输出参数 :无 返 回 值 :void **************************************************************************************************/ BOOL StaticTaskThread::SendCommandAndAckHandle(IDPMSComm *&pComm, CString& szCommand, DMSResponse *&pRes) { int iRet = pComm->SendCommand(szCommand, pRes); if (iRet == -1) { this->PostMsg(WM_START_IDPMS, pRes); delete pComm; return FALSE; } else if (iRet == 0) { this->PostMsg(WM_FAILURE, pRes); pComm->Close(); delete pComm; pComm = NULL; return FALSE; } return TRUE; } /************************************************************************************************** 函 数 名 :OnStatic 功能描述 :静态零位测量 输入参数 :略 输出参数 :无 返 回 值 :void **************************************************************************************************/ BOOL StaticTaskThread::SendCommandAndAckHandle(IDPMSComm *&pComm, CString& szCommand, LPCTSTR szEndFlag, DMSResponse *&pRes) { int iRet = pComm->SendCommand(szCommand, pRes, szEndFlag); if (iRet == -1) { this->PostMsg(WM_START_IDPMS, pRes); delete pComm; return FALSE; } else if (iRet == 0) { this->PostMsg(WM_FAILURE, pRes); pComm->Close(); delete pComm; pComm = NULL; return FALSE; } return TRUE; } /************************************************************************************************** 函 数 名 :OnStatic 功能描述 :静态零位测量 输入参数 :略 输出参数 :无 返 回 值 :void **************************************************************************************************/ void StaticTaskThread::OnStatic(WPARAM wParam,LPARAM lParam) { CString szCommand; BOOL bRet = TRUE; DMSResponse *pRes = NULL; CString szPhotoPath; // 获取像片路径 bRet = this->GetPhotoPath(szPhotoPath); if (!bRet) { LOG::E(_T("像片路径不存在")); this->PostMsg(WM_FAILURE, pRes); return; } // IDPMS通讯器 IDPMSComm *pComm = new IDPMSComm(); bRet = pComm->Open(); if (!bRet) { this->PostMsg(WM_START_IDPMS, pRes); delete pComm; return; } // 1.删除当前工程 //szCommand.Format("idpms-cd:set0003"); //bRet = SendCommandAndAckHandle(pComm, szCommand, pRes); //bret = sendcommandandackhandle(pcomm, szcommand, pres); // if (!bRet) return ; // 2.删除之前的工程文件 CString szCameraFolder; CString szPrjFolder; szPrjFolder.Format("%s_%s_单相机", m_szEquipTypeCode, m_szEquipCode); szCameraFolder.Format("C:\\PD\\IDPMS\\工程\\%s_%s_单相机", m_szEquipTypeCode, m_szEquipCode); bRet = Utils::DeleteFolder(szCameraFolder); if (!bRet){ LOG::E(szCameraFolder, _T("删除失败")); szCameraFolder.Format("C:\\PD\\IDPMS\\工程\\%s_%s_单相机A", m_szEquipTypeCode, m_szEquipCode); szPrjFolder.Format("%s_%s_单相机A", m_szEquipTypeCode, m_szEquipCode); bRet = Utils::DeleteFolder(szCameraFolder); } g_szTaskPrjFolderName.Format("%s", szPrjFolder); //// 3.Copy相机驱动文件 //CString szSourceCam("C:\\PD\\IDPMS\\工程\\1号相机\\平差数据\\PDDT-HCCAM_CLG1.cam"); //CString szTargetCam; //szTargetCam.Format("C:\\Program Files\\PD\\IDPMS\\模板工程\\%s\\PDDT-HCCAM_CLG1.cam", m_szEquipTypeCode); //CopyFile(szSourceCam, szTargetCam, FALSE); // 3.Copy相机驱动文件 CString szSourceCam("C:\\PD\\IDPMS\\工程\\1号相机\\平差数据\\PDDT-7103FDJ-01.cam"); CString szTargetCam; szTargetCam.Format("C:\\Program Files\\PD\\IDPMS\\模板工程\\%s\\PDDT-7103FDJ-01.cam", m_szEquipTypeCode); CopyFile(szSourceCam, szTargetCam, FALSE); // 4.根据模板新建文件 szCommand.Format("IDCMD0017(PDTL=%s,PDSV=%s,PDDT= false)", m_szEquipTypeCode, szPrjFolder); bRet = SendCommandAndAckHandle(pComm, szCommand, pRes); if (!bRet) return; Sleep(2000); // // 5.读取单相机相片 // szCommand.Format("IDPMS-CD:SET0008"); // iRet = pComm->SendCommand(szCommand, pRes); // if (iRet <= 0) { // this->PostMsg(WM_FAILURE, pRes); // pComm->Close(); //delete pComm; // return ; // } // 6.读取当前路径下所有相片 szCommand.Format("IDPMS-CD:SET1701:%s", szPhotoPath); bRet = SendCommandAndAckHandle(pComm, szCommand, pRes); if (!bRet) return; // 7.开始测量 szCommand.Format("IDCMD0016(PDST=true,PDGO=true,PDCE=true,PDWN=false,PDFP=false,PDSS=true)"); bRet = SendCommandAndAckHandle(pComm, szCommand, _T("CPDSimpleBundleStats"), pRes); if (!bRet) return; // 8.轴对准 szCommand.Format("IDPMS-CD:SET3701:p1=CKO:p2=CKOY:p3=CKOZ:p1x=Y:p1y=Z:p1z=X:p2type=type:p3type=type:sys=frame"); bRet = SendCommandAndAckHandle(pComm, szCommand, pRes); if (!bRet) return; // 9.生成当前型号测量数据 //CString dataFile = AppConfig::GetString(_T("IDPMS"), _T("DataFile1")); CString newFileFind; bRet = GetFileName(szCameraFolder, _T("BDA3D"), newFileFind); if (!bRet) { this->PostMsg(WM_FAILURE, pRes); pComm->Close(); delete pComm; return; } szCommand.Format("IDPMS-CD:SET6201:SUB6201:PDSD=false:PDNM=%s", newFileFind); bRet = SendCommandAndAckHandle(pComm, szCommand, pRes); if (!bRet) return; // 10.解析报告文件 CString szFile; szFile.Format("C:\\PD\\IDPMS\\工程\\%s\\%s.txt", szPrjFolder, newFileFind); StaticData data(m_taskId, m_szEquipTypeCode, m_szEquipCode); data.LoadDataFromFile(szFile); // 11.保存到数据库 CString szMsg; BOOL isValid = data.Validate(szMsg); data.SaveToDB(); // 12.生成动态测量驱动TXT文件 data.OutputConfig(); // 13.清理内存 data.Clear(); if (!isValid) { if (pRes == NULL) pRes = (DMSResponse *)Utils::DMS_CreateMsg(); DMSResponse *pMSG = (DMSResponse *)pRes; pMSG->bRet = FALSE; pMSG->iCode = 0; memset(pMSG->szMsg, 0, DMS_MSG_SIZE); strncat_s((char *)pMSG->szMsg, DMS_MSG_SIZE, szMsg.GetBuffer(), szMsg.GetLength()); } else { if (pRes != NULL) { DMSResponse *pMSG = (DMSResponse *)pRes; memset(pMSG->szMsg, 0, DMS_MSG_SIZE); } } this->PostMsg(WM_SUCCESS, pRes); // 关闭通讯器 pComm->Close(); delete pComm; return; } /************************************************************************************************** 函 数 名 :GetPhotoPath 功能描述 :获取最新像片路径 输入参数 :略 输出参数 :无 返 回 值 :void **************************************************************************************************/ BOOL StaticTaskThread::GetFileName(CString &szPath, CString szPrefix, CString &szTargetFile) { if (szPath.IsEmpty()) return FALSE; CString szTName; CFileFind ff; CString szFilter; szFilter.Format("%s\\%s*.TDX", szPath, szPrefix); BOOL bFound = ff.FindFile(szFilter); CTime time0 = 0; CString szTargetDir; while (bFound) { bFound = ff.FindNextFile(); CString szPath = ff.GetFilePath(); if (!ff.IsDirectory() && !ff.IsDots()) { if (szTName.IsEmpty()) { szTName = ff.GetFileTitle(); } else if (szTName < ff.GetFileTitle()) { szTName = ff.GetFileTitle(); } } } if (szTName.IsEmpty()) return FALSE; szTargetFile.Empty(); szTargetFile.Append(szTName); return TRUE; } /************************************************************************************************** 函 数 名 :OnStatic 功能描述 :静态零位测量 输入参数 :略 输出参数 :无 返 回 值 :void **************************************************************************************************/ void StaticTaskThread::OnStaticData(WPARAM wParam, LPARAM lParam) { CString szCommand; BOOL bRet = TRUE; int iRet = 0; DMSResponse *pRes = NULL; // IDPMS通讯器 IDPMSComm *pComm = new IDPMSComm(); bRet = pComm->Open(); if (!bRet) { this->PostMsg(WM_START_IDPMS, pRes); delete pComm; return; } // 1.获取最新数据文件名 CString newFileFind; CString szCameraFolder; szCameraFolder.Format("C:\\PD\\IDPMS\\工程\\%s", g_szTaskPrjFolderName); bRet = GetFileName(szCameraFolder, _T("BDA3D"), newFileFind); if (!bRet) { this->PostMsg(WM_UPDATE_FAILURE, pRes); pComm->Close(); delete pComm; return; } // 2.生成最新数据 szCommand.Format("IDPMS-CD:SET6201:SUB6201:PDSD=false:PDNM=%s", newFileFind); iRet = pComm->SendCommand(szCommand, pRes); if (iRet <= 0) { this->PostMsg(WM_UPDATE_FAILURE, pRes); pComm->Close(); delete pComm; return; } // 3.解析报告文件 CString szFile; szFile.Format("C:\\PD\\IDPMS\\工程\\%s\\%s.txt", g_szTaskPrjFolderName, newFileFind); StaticData data(m_taskId, m_szEquipTypeCode, m_szEquipCode); data.LoadDataFromFile(szFile); // 4.保存到数据库 CString szMsg; BOOL isValidate = data.Validate(szMsg); data.SaveToDB(); // 5.生成动态测量驱动TXT文件 data.OutputConfig(); // 6.清理内存 data.Clear(); if (!isValidate) { 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()); LOG::D(szMsg); } else { if (pRes != NULL) { DMSResponse *pMSG = (DMSResponse *)pRes; memset(pMSG->szMsg, 0, DMS_MSG_SIZE); } } this->PostMsg(WM_UPDATE_SUCCESS, pRes); // 关闭通讯器 pComm->Close(); delete pComm; return; }