#include "StdAfx.h" #include #include "WinBase.h" #include "GeoMative.h" #include "Constant.h" #include "SComPort.h" #include "DevLinkRecord.h" #include "DetcGD10Dev.h" #include #include #ifndef GLOBAL_PUB_H #define GLOBAL_PUB_H //#define _WIN32_WINNT 0x0501 #include #include #pragma comment(lib, "kernel32.lib") void SplitterString(CStringArray &szArray,const CString& szSource, const CString& szSplitter); ////////////////////////////////object///////////////////////////////////////////////// class CGeoMativeApp; CGeoMativeApp theApp; CDevLinkRecord* aDevLinkTable[256] = {NULL}; ////////////////////////////////variable/////////////////////////////////////////////// int g_iLanguage = (int)LANG_ENUS; int g_iCurrListColIndex = (int)VAL_ZERO; int g_iCurrListColOrder = (int)VAL_ZERO; int g_iTransMode = (int)0; //0---USB;1---BLUETOOTH int g_iUILanguage = (int)LANG_ENUS; int g_UIOffset = OFFSET_ENGLISH; ///////////////////////added by lsq 20161102//////////////////////////////// //增加对脚本文件的 int g_iCurSptListColIndex = (int)VAL_ZERO; int g_iCurSptListColOrder = (int)VAL_ZERO; char *g_chRecMode[30]={"GPS", "Manual", "Continuousmeasurement"}; char *g_chCurPoleDepoly[35]={"Front of moving direction", "Behind of moving direction"}; ////////////////////////////////////////////////////////////////////////// CString g_szMacAddress = _T(""); CString g_strUSBDevSN = _T(""); BOOL g_bScanFun = FALSE; CRITICAL_SECTION g_ScanTabSection; SYSTEMTIME g_sysCurTime; bool g_bSysTimeRun = false; CString g_strSaveFilePath = _T(""); BOOL g_bCancelCopyFile = TRUE; CString g_strGD10DevAddr = _T(""); DWORD g_dwDeviceSN = 0; DWORD g_dwPLCID = 0; int g_iTransFileMode = EN_TRANSFER_FILE_BY_COM; int g_iOnLineVersion = EN_ON_LIEN_VERSION_1; //1--V1.0 2--V2.0二期版本 int g_iTimeZone = 8; //time zone 时区用于客户设置 BOOL g_bIsOnlineTransfer = TRUE; //默认在线需要转发real time wnd show data,用于二期 CString g_strSaveTestingTaskID = _T("");//保存正在测试中的任务,用于实时窗口全部测量,如果不等于当前任务则不能,理论上同一时刻只有一个任务正在测试 CString g_strSaveSuspendedTaskID = _T(""); EN_TASK_TESTING_METHOD g_eTestingMethod = EN_TASK_NOT_TESTTING; time_t g_i64SaveQueryTaskStartTime = 0;//保存查询任务开始时间,用于一维、二维、三维共用 time_t g_i64SaveQueryTaskEndTime = 0;//保存查询任务结束时间,用于一维、二维、三维共用 ///////////////////////////////function//////////////////////////////////////////////// int CALLBACK ListStrCompare(LPARAM lParam1, LPARAM lParam2, LPARAM lSortObject) { CListCtrl* listCtrl = (CListCtrl*)lSortObject; CString strItem1; CString strItem2; LVFINDINFO lvFindInfo1; LVFINDINFO lvFindInfo2; int iIndex1 = (int)VAL_ZERO; int iIndex2 = (int)VAL_ZERO; lvFindInfo1.flags = LVFI_PARAM; lvFindInfo1.lParam = lParam1; lvFindInfo2.flags = LVFI_PARAM; lvFindInfo2.lParam = lParam2; iIndex1 = listCtrl->FindItem(&lvFindInfo1); iIndex2 = listCtrl->FindItem(&lvFindInfo2); strItem1 = listCtrl->GetItemText(iIndex1, g_iCurrListColIndex); strItem2 = listCtrl->GetItemText(iIndex2, g_iCurrListColIndex); // TCHAR lpBuffer[256]; memset(lpBuffer, 0, sizeof(lpBuffer)); HDITEM hdItem; hdItem.mask = HDI_TEXT; hdItem.pszText = lpBuffer; hdItem.cchTextMax = 256; listCtrl->GetHeaderCtrl()->GetItem(g_iCurrListColIndex, &hdItem); CString strColName = _T(""); strColName.Format(_T("%s"),hdItem.pszText); //如果是V,I,R0的话,则进行排序 if (-1 != strColName.Find(_T("I(mA)")) || -1 != strColName.Find(_T("V(mV)")) || -1 != strColName.Find(_T("R0")) || -1 != strColName.Find(_T("K")) || -1 != strColName.Find(_T("SP(mV)")) || -1 != strColName.Find(_T("R"))) { float fVal1 = 0, fVal2 = 0; if ((int)VAL_ZERO != g_iCurrListColOrder) { fVal1 = atof(strItem1); fVal2 = atof(strItem2); } else { fVal1 = atof(strItem2); fVal2 = atof(strItem1); } if (fVal1 < fVal2) return -1; else if (fVal1 == fVal2) return 0; else return 1; } //如果是ABMN则进行排序 if (-1 != strColName.Find(_T("A(C1)")) || -1 != strColName.Find(_T("B(C2)")) || -1 != strColName.Find(_T("M(P1)")) || -1 != strColName.Find(_T("N(P2)"))) { UINT uiVal1 = 0, uiVal2 = 0; if ((int)VAL_ZERO != g_iCurrListColOrder) { uiVal1 = atof(strItem1); uiVal2 = atof(strItem2); } else { uiVal1 = atof(strItem2); uiVal2 = atof(strItem1); } if (uiVal1 < uiVal2) return -1; else if (uiVal1 == uiVal2) return 0; else return 1; } if ((int)VAL_ZERO == g_iCurrListColOrder) { return strcmp((LPCTSTR)strItem1, (LPCTSTR)strItem2); } else { return strcmp((LPCTSTR)strItem2, (LPCTSTR)strItem1); } return (int)VAL_ZERO; } //////////////////////////added by lsq 20161102/////////////////////////// //增加对显示脚本的排序 int CALLBACK SptListStrCompare(LPARAM lParam1, LPARAM lParam2, LPARAM lSortObject) { CListCtrl* listCtrl = (CListCtrl*)lSortObject; CString strItem1; CString strItem2; LVFINDINFO lvFindInfo1; LVFINDINFO lvFindInfo2; int iIndex1 = (int)VAL_ZERO; int iIndex2 = (int)VAL_ZERO; lvFindInfo1.flags = LVFI_PARAM; lvFindInfo1.lParam = lParam1; lvFindInfo2.flags = LVFI_PARAM; lvFindInfo2.lParam = lParam2; iIndex1 = listCtrl->FindItem(&lvFindInfo1); iIndex2 = listCtrl->FindItem(&lvFindInfo2); strItem1 = listCtrl->GetItemText(iIndex1, g_iCurSptListColIndex); strItem2 = listCtrl->GetItemText(iIndex2, g_iCurSptListColIndex); // TCHAR lpBuffer[256]; memset(lpBuffer, 0, sizeof(lpBuffer)); HDITEM hdItem; hdItem.mask = HDI_TEXT; hdItem.pszText = lpBuffer; hdItem.cchTextMax = 256; listCtrl->GetHeaderCtrl()->GetItem(g_iCurSptListColIndex, &hdItem); CString strColName = _T(""); strColName.Format(_T("%s"),hdItem.pszText); //如果是A,B,M,N的话,则进行排序 if (_T("A") == strColName || _T("B") == strColName || _T("M") == strColName || _T("N") == strColName) { float fVal1 = 0, fVal2 = 0; if ((int)VAL_ZERO != g_iCurSptListColOrder) { fVal1 = atof(strItem1); fVal2 = atof(strItem2); } else { fVal1 = atof(strItem2); fVal2 = atof(strItem1); } if (fVal1 < fVal2) return -1; else if (fVal1 == fVal2) return 0; else return 1; } return (int)VAL_ZERO; } ////////////////////////////////////////////////////////////////////////// BOOL DoEvent(HWND hWnd) { MSG msg = {0}; if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE | PM_NOYIELD)) { if (!IsDialogMessage(hWnd, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } else { return FALSE; } return TRUE; } void TransDelay(int iTransMode, int iDS0, int iDS1, HWND hWnd = NULL) { int iTime = (int)VAL_ZERO; switch (iTransMode) { case 0: while (iTime <= iDS0) { Sleep(1); if (NULL != hWnd) { DoEvent(hWnd); } iTime++; } break; case 1: while (iTime <= iDS1) { Sleep(1); if (NULL != hWnd) { DoEvent(hWnd); } iTime++; } break; default: break; } } int StatStringCount(const CString& szSource, const CString& szMember) //统计子串的个数 { CString szScr = szSource; CString szMem = szMember; int iCount = (int)VAL_ZERO; int iIndex = (int)VAL_ZERO; while (-1 != iIndex) { iIndex = szScr.Find(szMem, ++iIndex); if (-1 != iIndex) { iCount++; } } return iCount; } void SplitterString(CStringArray &szArray,const CString& szSource, const CString& szSplitter) //用分割字符串对原字符串进行分割 { CString szScr = szSource; CString szSpl = szSplitter; int iPos1 = 0; int iPos2 = 0; szArray.RemoveAll(); if (szScr.GetLength() == (int)VAL_ZERO) { return; } if (szScr.Find(szSpl, iPos1) == -1) { szArray.Add(szSource); return; } szScr.TrimLeft(szSplitter); szScr.TrimRight(szSplitter); while (-1 != iPos2) { iPos2 = szScr.Find(szSpl, iPos1); if (-1 != iPos2) { szArray.Add(szScr.Mid(iPos1, iPos2 - iPos1)); } else { szArray.Add(szScr.Mid(iPos1, szScr.GetLength())); } iPos1 = iPos2 + szSpl.GetLength(); } } bool bIsInteger(CString strTxt) { strTxt.TrimLeft(); strTxt.TrimRight(); for (int i = 0; i < strTxt.GetLength(); i++) { if ((_T('-') == strTxt.GetAt(0)) && strTxt.GetLength() > 1) { continue; } if (strTxt.GetAt(i) > _T('9') || strTxt.GetAt(i) < _T('0')) { return false; } } return true; } bool bIsPostiveInteger(CString strTxt) { strTxt.TrimLeft(); strTxt.TrimRight(); if (strTxt.IsEmpty()) { return false; } for (int i = 0; i < strTxt.GetLength(); i++) { if (strTxt.GetAt(i) > _T('9') || strTxt.GetAt(i) < _T('0')) { return false; } } return true; } //获得EXCEL的表头序号,其中chIndex表示从表头的开始字符(从'A'开始),index表示第几行 //获取的结果则为真实的某一单元格的真实位置 CString GetExcelHeaderIndex(char chIndex, int index) { BYTE ucAIndexCnt = 0, ucCharIndex = 0; CString strRow = _T(""); ucAIndexCnt = (chIndex - 'A')/26; ucCharIndex = (chIndex - 'A')%26; char chFlag; if (ucAIndexCnt > 0) { chFlag = 'A'+ucAIndexCnt-1; strRow.Format(_T("%c%c%d"),chFlag,'A'+ucCharIndex, index); } else strRow.Format(_T("%c%d"), chIndex, index); return strRow; } bool bIsFloat(CString strTxt) { strTxt.TrimLeft(); strTxt.TrimRight(); if (strTxt.IsEmpty()) { return false; } int k = 0, iIndex =0; while(-1!=(iIndex= strTxt.Find(_T('.'), iIndex))) { k++; iIndex++; if (k>1) { return false; } if (iIndex>=strTxt.GetLength()) { break; } } for (int i = 0; i < strTxt.GetLength(); i++) { if ( (0 == i) && (_T('-') == strTxt.GetAt(i))) { continue; } if ((strTxt.GetAt(i) > _T('9') || strTxt.GetAt(i) < _T('0')) && (_T('.') != strTxt.GetAt(i))) { return false; } } return true; } bool IsExistSpecialChar(const CString &strFileName) { //特殊字符为\ / : * ? " < > | CString str = _T("\\/:*?\"<>|"); if (-1 == strFileName.FindOneOf(str)) { return false; } return true; } BOOL GetSubStringInHeadAndTail(const CString& szSource, CString& szSub, const CString& szHead, const CString& szTail) { int iHeadPos = (int)VAL_ZERO; int iTailPos = (int)VAL_ZERO; /* [GD-10;Geo-electrical workstation;SN190010021;] 这个字符串是Gd10 20返回,长度大致48直接*/ if (szSource.GetLength() < 40) return FALSE; szSub.Empty(); iHeadPos = szSource.Find(szHead); if (-1 == iHeadPos) { return FALSE; } iTailPos = szSource.Find(szTail, iHeadPos+szHead.GetLength()); if (-1 == iTailPos) { return FALSE; } if (iTailPos < iHeadPos) { return FALSE; } szSub = szSource.Mid(iHeadPos+szHead.GetLength(), iTailPos-(iHeadPos+szHead.GetLength())); return TRUE; } bool GetSysTimeFunction(LPVOID pParam) { g_bSysTimeRun = true; while(g_bSysTimeRun) { GetLocalTime( &g_sysCurTime); //获取系统时间 Sleep(20); } return true; } void get_fit_equation(double x[],double y[],int n,double a[],int m,double dt[]) { int i=0,j=0,k=0; double z=0.0,p=0.0,c=0.0,g=0.0,q=0.0,d1=0.0,d2=0.0,s[20],t[20],b[20]; for (i=0;i<20;i++) { s[i]=0.0;t[i]=0.0;b[i]=0.0; } for (i=0; i<=m-1; i++) { a[i]=0.0; } if (m>n) { m=n; } if (m>20) { m=20; } z=0.0; for (i=0; i<=n-1; i++) { z=z+x[i]/(n*1.0); } b[0]=1.0; d1=n*1.0; p=0.0; c=0.0; for (i=0; i<=n-1; i++) { p=p+(x[i]-z); c=c+y[i]; } c=c/d1; p=p/d1; a[0]=c*b[0]; if (m>1) { t[1]=1.0; t[0]=-p; d2=0.0; c=0.0; g=0.0; for (i=0; i<=n-1; i++) { q=x[i]-z-p; d2=d2+q*q; c=c+y[i]*q; g=g+(x[i]-z)*q*q; } c=c/d2; p=g/d2; q=d2/d1; d1=d2; a[1]=c*t[1]; a[0]=c*t[0]+a[0]; } for (j=2; j<=m-1; j++) { s[j]=t[j-1]; s[j-1]=-p*t[j-1]+t[j-2]; if (j>=3) for (k=j-2; k>=1; k--) { s[k]=-p*t[k]+t[k-1]-q*b[k]; } s[0]=-p*t[0]-q*b[0]; s[0]=-p*t[0]-q*b[0]; d2=0.0; c=0.0; g=0.0; for (i=0; i<=n-1; i++) { q=s[j]; for (k=j-1; k>=0; k--) { q=q*(x[i]-z)+s[k]; } d2=d2+q*q; c=c+y[i]*q; g=g+(x[i]-z)*q*q; } c=c/d2; p=g/d2; q=d2/d1; d1=d2; a[j]=c*s[j]; t[j]=s[j]; for (k=j-1; k>=0; k--) { a[k]=c*s[k]+a[k]; b[k]=t[k]; t[k]=s[k]; } } dt[0]=0.0; dt[1]=0.0; dt[2]=0.0; for (i=0; i<=n-1; i++) { q=a[m-1]; for (k=m-2; k>=0; k--) { q=a[k]+q*(x[i]-z); } p=q-y[i]; if (fabs(p)>dt[2]) { dt[2]=fabs(p); } dt[0]=dt[0]+p*p; dt[1]=dt[1]+fabs(p); } return; } //get_integral_area : 用于得到曲线内的一段时间的微分面积 //Input: //x1,x2分别代表积分区域的两个点,其中x2>x1, //double a[] : 多项式的m个系数的数组 //int m : 多项式的项数,即此时多项式的的最高次数为m-1 //OutPut: void get_integral_area(double x1, double x2, double a[],int m,double &dRes) { dRes = 0; if (m < 1) { return; } for (int i = 0; i < m; i++) { dRes += a[i]*(pow(x2, i+1) - pow(x1, i+1))/(i+1); } return ; } double get_fit_equation_value(double x, double a[], int m) { double dRes = 0; if (m < 1) { return dRes; } for (int i = 0; i < m; i++) { dRes += a[i]* pow(x, i); } return dRes; } bool get_hl_by_bisection(double dLeft, double dRight, double dCoffient[], double dAverage,double dVdata,int m, double &dRes) { if (dLeft > dRight || dLeft <0 || dRight < 0) { if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("输入参数错误")); else MessageBoxEx(NULL, _T("Input param error in bisection function"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return false; } if (0 == dVdata) { dRes = 0; return true; } double dMidVal = 0, dLVal = 0, dRVal =0, dMid; while(1) { if (dRight - dLeft <= 2) { break; } dLVal = fabs(get_fit_equation_value(dLeft-dAverage, dCoffient, m)); dRVal = fabs(get_fit_equation_value(dRight-dAverage,dCoffient, m)); if (dLVal == dVdata) { dRes = dLeft; return true; } if (dRVal == dVdata) { dRes = dRight; return true; } // if (dLVal > dVdata && dVdata > dRVal) // { double dTmp = (dLeft + dRight)/2; dMidVal = fabs(get_fit_equation_value(dTmp-dAverage, dCoffient,m)); if (dMidVal==dVdata) { dRes = dTmp; return true; } else if (dVdata < dMidVal) dLeft = dTmp; else dRight = dTmp; // } } dRes = dLeft; return true; } CString GetGRStatus(int iStatus) { switch (iStatus) { case 0: if (LANG_ZHCN == g_iUILanguage) { return _T("正常"); } return _T("OK"); case 1: if (LANG_ZHCN== g_iUILanguage) { return _T("短路"); } return _T("Short circuit"); case 2: if (LANG_ZHCN == g_iUILanguage) { return _T("开路"); } return _T("Open circuit"); case 3: if (LANG_ZHCN == g_iUILanguage) { return _T("大电阻"); } return _T("Too large"); default: if (LANG_ZHCN == g_iUILanguage) { return _T("未知错误"); } return _T("Unknow"); } } //进行CRC异或校验计算 BYTE BBCCalculate(const char *pData, int iSize, BYTE ucOrgRes) { BYTE ucRes = ucOrgRes; const BYTE *pAddr = (BYTE*)pData; for (int i = 0; i < iSize; i++) { ucRes ^= pAddr[i]; } return ucRes; } int GetSigTxPeriod(int iTestType, int iTestPeriod) { CString strErr = _T(""); switch (iTestType) { case 0: if (iTestPeriod < 1 || iTestPeriod > 7) { if (LANG_ZHCN == g_iUILanguage) { strErr.Format(_T("未知测试周期(%d)"), iTestPeriod); AfxMessageBox(strErr); } else { strErr.Format(_T("Unkonw TestPeriod(%d) in IP"), iTestPeriod); MessageBoxEx(NULL, strErr, STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); } return 0; } if (iTestPeriod == 1) { return 1200; } return 1000 * pow(2, iTestPeriod - 1); //return 2000; case 1: if (iTestPeriod < 1 || iTestPeriod > 7) { if (LANG_ZHCN == g_iUILanguage) { strErr.Format(_T("未知测试周期(%d)"), iTestPeriod); AfxMessageBox(strErr); } else { strErr.Format(_T("Unkonw TestPeriod(%d) in IP"), iTestPeriod); MessageBoxEx(NULL, strErr, STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); } return 0; } return 1000*pow(2, iTestPeriod-1); case 2: return 1000; default: if (LANG_ZHCN == g_iUILanguage) { strErr.Format(_T("未知测试类型(%d)"), iTestType); AfxMessageBox(strErr); } else { strErr.Format(_T("Unkonw iTestType(%d)"), iTestType); MessageBoxEx(NULL, strErr, STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); } return 0; } } //获取接地电阻的状态码 CString GetGrCodeText(int iCode) { switch (iCode) { case 0: if (LANG_ZHCN == g_iUILanguage) { return _T("正常"); } return _T("OK"); case 1: case 8: if (LANG_ZHCN== g_iUILanguage) { return _T("短路"); } return _T("Short circuit"); case 2: case 4: if (LANG_ZHCN == g_iUILanguage) { return _T("开路"); } return _T("Open circuit"); case 3: case 16: if (LANG_ZHCN == g_iUILanguage) { return _T("阻值太大"); } return _T("Too large"); default: if (LANG_ZHCN == g_iUILanguage) { return _T("未知错误"); } return _T("Unknow"); } /* CString strText = _T(""); if (0 == iCode) { strText = _T("OK"); } else if (0 != (iCode & (int)0x07)) { strText = _T("Open circuit"); } else if (0 != (iCode & (int)0x08)) { strText = _T("Short circuit"); } else if (0 != (iCode & (int)0x10)) { strText = _T("Too large"); } else { strText=_T("Unknow error"); } return strText; */ } //枚举设备管理器中的端口(COM和LPT)中的设备信息 unsigned char DeviceEnumCommPort() { HDEVINFO hDevInfo; SP_DEVINFO_DATA DeviceInfoData; DWORD DeviceIndex; // Create a HDEVINFO with all present devices. hDevInfo=SetupDiGetClassDevs((LPGUID) &GUID_DEVCLASS_PORTS,0,0,DIGCF_PRESENT); /* 9 GUID_DEVCLASS_FDC软盘控制器 10 GUID_DEVCLASS_DISPLAY显示卡 11 GUID_DEVCLASS_CDROM光驱 12 GUID_DEVCLASS_KEYBOARD键盘 13 GUID_DEVCLASS_COMPUTER计算机 14 GUID_DEVCLASS_SYSTEM系统 15 GUID_DEVCLASS_DISKDRIVE磁盘驱动器 16 GUID_DEVCLASS_MEDIA声音、视频和游戏控制器 17 GUID_DEVCLASS_MODEMMODEM 18 GUID_DEVCLASS_MOUSE鼠标和其他指针设备 19 GUID_DEVCLASS_NET网络设备器 20 GUID_DEVCLASS_USB通用串行总线控制器 21 GUID_DEVCLASS_FLOPPYDISK软盘驱动器 22 GUID_DEVCLASS_UNKNOWN未知设备 23 GUID_DEVCLASS_SCSIADAPTERSCSI 和 RAID 控制器 24 GUID_DEVCLASS_HDCIDE ATA/ATAPI 控制器 25 GUID_DEVCLASS_PORTS端口(COM 和 LPT) 26 GUID_DEVCLASS_MONITOR监视器 27 */ if (hDevInfo == INVALID_HANDLE_VALUE) { DWORD ErrorCode = GetLastError(); // Insert error handling here. return 1; } // Enumerate through all devices in Set. DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA); for (DeviceIndex=0;SetupDiEnumDeviceInfo(hDevInfo,DeviceIndex,&DeviceInfoData);DeviceIndex++) { DWORD DataPropertyType; LPTSTR buffer = NULL; DWORD buffersize = 0; // // Call function with null to begin with, // then use the returned buffer size // to Alloc the buffer. Keep calling until // success or an unknown failure. // while (!SetupDiGetDeviceRegistryProperty( hDevInfo, &DeviceInfoData, SPDRP_FRIENDLYNAME, &DataPropertyType, (PBYTE)buffer, buffersize, &buffersize)) { DWORD ErrorCode=GetLastError(); if (ErrorCode== ERROR_INSUFFICIENT_BUFFER) { // Change the buffer size. if (buffer) LocalFree(buffer); buffer = (LPTSTR)LocalAlloc(LPTR,buffersize); } else { // Insert error handling here. break; } } CString FriendlyPortName=buffer; /*Extract Serial Port Name*/ int pos=FriendlyPortName.Find('('); CString SerialPortName=FriendlyPortName.Right(FriendlyPortName.GetLength()-pos-1); SerialPortName.TrimRight(')'); //此时的SerialPortName就是COM口的信息 if(buffer) { LocalFree(buffer); } } if (GetLastError()!=NO_ERROR && GetLastError()!=ERROR_NO_MORE_ITEMS ) { return 1; } // Cleanup SetupDiDestroyDeviceInfoList(hDevInfo); return 0; } BOOL DevLinkScanThreadFunction(LPVOID pParam) { CSComPort sComPort; CStringArray aComName; CStringArray aRes; // CStringArray aRes2; CString szReceive = _T(""); CString szIden = _T(""); // CString szComName = _T(""); char aSend[2048] = {0}; char aReceive[2048]; int iReceive = (int)VAL_ZERO; int iComIndex = (int)VAL_ZERO; int iTabIndex = (int)VAL_ZERO; int iPollingTime = (int)VAL_ZERO; memset(aDevLinkTable, 0, sizeof(aDevLinkTable)); g_strUSBDevSN.Empty(); while (!g_bScanFun) { ////////////////////////////////////////////////////////////////////////// /////////////////////////////added by lsq 20160427///////////////////////////////////////////// //在这里加这段代码主要是为了防止发现串口和USB时间不同步引起的问题,所以在发现串口之后, //最多再等30秒来USB连接上来 //如果是USB的模式的话,则先检测模拟的U盘,只有当U盘被检测到的时候,才进行COM口的检测 //这样来保证2者之间的同步,否则的话,检测COM口会比U盘快很多 if (EN_TRANSFER_FILE_BY_USB == g_iTransFileMode) { if (false == CDetcGD10Dev::GetInstance()->IsGD10DevConnect()) { Sleep(20); continue; } } ////////////////////////////////////////////////////////////////////////// aComName.RemoveAll(); iComIndex = (int)VAL_ZERO; iReceive = (int)VAL_ZERO; CSComPort::FindComName(&aComName); while (iComIndex < aComName.GetSize()) { iTabIndex = atoi(aComName.GetAt(iComIndex).Mid(3)); // TRACE("%d\n", iTabIndex); EnterCriticalSection(&g_ScanTabSection); if (NULL == aDevLinkTable[iTabIndex]) { sComPort.SetScanBreakSign(FALSE); if (TRUE == sComPort.OpenComm(aComName.GetAt(iComIndex))) { /* memset(aSend, 0, 2048); memset(aReceive, 0, 2048); strcpy(aSend, "\r\n"); sComPort.SendDataDirectly(aSend, strlen(aSend)); TransDelay(g_iTransMode, 5, 50, NULL); sComPort.ReceiveDataDirectly(aReceive, &iReceive); */ // sComPort.ClearCommReceiveBuff(); TransDelay(g_iTransMode, 10, 50, NULL); sComPort.ClearCommReceiveBuff(); sComPort.ClearCommSendBuff(); CString szOrder = _T(""); szOrder.Empty(); szOrder.Format(_T("\r\n")); sComPort.SendDataDirectly(szOrder.GetBuffer(szOrder.GetLength()), szOrder.GetLength()); Sleep(500); szOrder.ReleaseBuffer(); szOrder.Empty(); sComPort.ClearCommSendBuff(); sComPort.ClearCommReceiveBuff(); memset(aSend, 0, 2048); memset(aReceive, 0, 2048); strcpy(aSend, "device_info()\r\n"); // Sleep(100); sComPort.SendDataDirectly(aSend, strlen(aSend)); // Sleep(50); iPollingTime = 0; szReceive.Empty(); while ((szReceive.Find(_T("]")) == -1) && (szReceive.Find(_T(">")) == -1) && (iPollingTime < 10)) { /* [GD-10;Geo-electrical workstation;SN190010021;] 这个字符串是Gd10 20返回,长度大致48直接*/ Sleep(5); while (sComPort.ReceiveDataDirectly(aReceive, &iReceive) == TRUE) { szReceive.Insert(szReceive.GetLength(), aReceive); iReceive = (int)VAL_ZERO; memset(aReceive, 0, sizeof(aReceive)); } int s = szReceive.Find(_T("[")); int e = szReceive.Find(_T("]")); if (s != -1 && e != -1 && e > (s+40)) { break; } iPollingTime++; } //if (TRUE == GetSubStringInHeadAndTail(szReceive, szIden, _T("["), _T("]")) && (iPollingTime < 5)) if ((iPollingTime < 10) && TRUE == GetSubStringInHeadAndTail(szReceive, szIden, _T("["), _T("]")) ) { aRes.RemoveAll(); SplitterString(aRes, szIden, _T(";")); CString strDstDevName = (EN_MULTI_CHANNEL == theApp.m_ucIsMultiChannel) ? _T("GD-20") : _T("GD-10"); CString strDstDevNameGD10 = _T("GD-10"); CString strDstDevNameGD20 = _T("GD-20"); if ((aRes.GetSize() >= 3) && (aRes.GetAt(0) == strDstDevName)) //对设备进行鉴别 { TRACE("iReceive = %d\n", iReceive); TRACE("aReceive = %s\n", aRes.GetAt(1)); aDevLinkTable[iTabIndex] = new CDevLinkRecord; strcpy(aDevLinkTable[iTabIndex]->aDevCom, aComName.GetAt(iComIndex)); strcpy(aDevLinkTable[iTabIndex]->aDevModelNO, aRes.GetAt(0)); strcpy(aDevLinkTable[iTabIndex]->aDevName, aRes.GetAt(1)); strcpy(aDevLinkTable[iTabIndex]->aDevSN, aRes.GetAt(2)); g_strUSBDevSN = aRes.GetAt(2); TRACE("aDevCom = %s\n", aDevLinkTable[iTabIndex]->aDevCom); TRACE("aDevSN = %s\n", aDevLinkTable[iTabIndex]->aDevSN); sComPort.CloseComm(); // AfxGetMainWnd()->PostMessage(WM_NEWLINK, (WPARAM)aDevLinkTable[iTabIndex], (LPARAM)iTabIndex); AfxGetApp()->GetMainWnd()->SendMessage(WM_NEWLINK, (WPARAM)aDevLinkTable[iTabIndex], (LPARAM)iTabIndex); AfxGetApp()->GetMainWnd()->SendMessage(WM_DETECT_LINE, (WPARAM)aDevLinkTable[iTabIndex], (LPARAM)iTabIndex); LeaveCriticalSection(&g_ScanTabSection); break; } else if ((aRes.GetSize() >= 3) && (aRes.GetAt(0) == strDstDevNameGD10)) //对设备进行鉴别 { theApp.m_ucIsMultiChannel = EN_SINGLE_CHANNEL; TRACE("iReceive = %d\n", iReceive); TRACE("aReceive = %s\n", aRes.GetAt(1)); aDevLinkTable[iTabIndex] = new CDevLinkRecord; strcpy(aDevLinkTable[iTabIndex]->aDevCom, aComName.GetAt(iComIndex)); strcpy(aDevLinkTable[iTabIndex]->aDevModelNO, aRes.GetAt(0)); strcpy(aDevLinkTable[iTabIndex]->aDevName, aRes.GetAt(1)); strcpy(aDevLinkTable[iTabIndex]->aDevSN, aRes.GetAt(2)); TRACE("aDevCom = %s\n", aDevLinkTable[iTabIndex]->aDevCom); TRACE("aDevSN = %s\n", aDevLinkTable[iTabIndex]->aDevSN); sComPort.CloseComm(); // AfxGetMainWnd()->PostMessage(WM_NEWLINK, (WPARAM)aDevLinkTable[iTabIndex], (LPARAM)iTabIndex); AfxGetApp()->GetMainWnd()->SendMessage(WM_NEWLINK, (WPARAM)aDevLinkTable[iTabIndex], (LPARAM)iTabIndex); AfxGetApp()->GetMainWnd()->SendMessage(WM_DETECT_LINE, (WPARAM)aDevLinkTable[iTabIndex], (LPARAM)iTabIndex); LeaveCriticalSection(&g_ScanTabSection); break; } else if ((aRes.GetSize() >= 3) && (aRes.GetAt(0) == strDstDevNameGD20)) //对设备进行鉴别 { theApp.m_ucIsMultiChannel = EN_MULTI_CHANNEL; TRACE("iReceive = %d\n", iReceive); TRACE("aReceive = %s\n", aRes.GetAt(1)); aDevLinkTable[iTabIndex] = new CDevLinkRecord; strcpy(aDevLinkTable[iTabIndex]->aDevCom, aComName.GetAt(iComIndex)); strcpy(aDevLinkTable[iTabIndex]->aDevModelNO, aRes.GetAt(0)); strcpy(aDevLinkTable[iTabIndex]->aDevName, aRes.GetAt(1)); strcpy(aDevLinkTable[iTabIndex]->aDevSN, aRes.GetAt(2)); TRACE("aDevCom = %s\n", aDevLinkTable[iTabIndex]->aDevCom); TRACE("aDevSN = %s\n", aDevLinkTable[iTabIndex]->aDevSN); sComPort.CloseComm(); // AfxGetMainWnd()->PostMessage(WM_NEWLINK, (WPARAM)aDevLinkTable[iTabIndex], (LPARAM)iTabIndex); AfxGetApp()->GetMainWnd()->SendMessage(WM_NEWLINK, (WPARAM)aDevLinkTable[iTabIndex], (LPARAM)iTabIndex); AfxGetApp()->GetMainWnd()->SendMessage(WM_DETECT_LINE, (WPARAM)aDevLinkTable[iTabIndex], (LPARAM)iTabIndex); LeaveCriticalSection(&g_ScanTabSection); break; } } } sComPort.CloseComm(); // Sleep(30); } LeaveCriticalSection(&g_ScanTabSection); iComIndex++; } } return TRUE; } HHOOK hHook; LRESULT __stdcall CBTHookProc( long nCode,WPARAM wParam,LPARAM lParam) { if (nCode==HCBT_ACTIVATE) { SetDlgItemText((HWND)wParam,IDYES,"&Yes"); SetDlgItemText((HWND)wParam,IDNO ,"&No"); SetDlgItemText((HWND)wParam,IDOK,"&OK"); SetDlgItemText((HWND)wParam,IDCANCEL,"&Cancel"); UnhookWindowsHookEx(hHook); } return 0; } //float型转网络序 float tcp_htonf(float f) { unsigned char *p, p0, p1; if (htons(1) == 1) return f; p = (unsigned char *)&f; p0 = p[0]; p1 = p[1]; p[0] = p[3]; p[3] = p0; p[1] = p[2]; p[2] = p1; return f; } //float型转主机序 float tcp_ntohf(float f) { unsigned char *p, p0, p1; if (ntohs(1) == 1) return f; p = (unsigned char *)&f; p0 = p[0]; p1 = p[1]; p[0] = p[3]; p[3] = p0; p[1] = p[2]; p[2] = p1; return f; } CString OnLineLocalTaskState(BYTE ucTaskStats) { CString szStatus; switch (ucTaskStats) { case EN_TASK_YES_SYN: if (LANG_ZHCN == g_iUILanguage) szStatus = _T("已同步"); else szStatus = _T("Synchronized"); break; case EN_TASK_NO_DOWNLOAD: if (LANG_ZHCN == g_iUILanguage) szStatus = _T("未下载"); else szStatus = _T("[No Download]"); break; case EN_TASK_NO_UPLOAD: if (LANG_ZHCN == g_iUILanguage) szStatus = _T("未上传"); else szStatus = _T("[Not Uploaded]"); break; default: szStatus = _T(" "); break; } return szStatus; } CString OnLineTask(BYTE ucTaskStats) { CString szStatus; if (0<= ucTaskStats && ucTaskStats <10) { if (LANG_ZHCN == g_iUILanguage) szStatus = _T("未测试"); else szStatus = _T("[No Test]"); } else if (10 <= ucTaskStats && ucTaskStats < 20) { if (LANG_ZHCN == g_iUILanguage) szStatus = _T("测试中"); else szStatus = _T("[Testing]"); } else if (30 <= ucTaskStats && ucTaskStats < 40) { if (LANG_ZHCN == g_iUILanguage) szStatus = _T("测试失败"); else szStatus = _T("[Test Failed]"); } else if (40 == ucTaskStats) { if (LANG_ZHCN == g_iUILanguage) szStatus = _T("测试完成"); else szStatus = _T("[Test Completed]"); } else if (20 == ucTaskStats) { if (LANG_ZHCN == g_iUILanguage) szStatus = _T("暂停测试"); else szStatus = _T("[Pause Test]"); } else { szStatus = _T(" "); } return szStatus; } char ReturnTaskType(BYTE ucTaskType) { char cType; switch (ucTaskType) { case 2: cType = 'S'; break; case 1: cType = 'I'; break; case 0: cType = 'R'; break; default: cType = 'R'; break; } return cType; } CString Tm2GmtStr(time_t t) { tm* gmt; //格林威治时间 char buf[60] = { 0 }; gmt = gmtime(&t);//转为格林威治时间 strftime(buf, 25, "%Y-%m-%d %H:%M:%S", gmt); CString szTime; szTime.Format("%s",buf); return szTime; } CString Tm2LocalStr(time_t t) { tm* local; //本地时间 char buf[60] = { 0 }; //t = time(NULL); //获取目前秒时间 local = localtime(&t); //转为本地时间 strftime(buf, 25, "%Y-%m-%d %H:%M:%S", local); CString szTime; szTime.Format("%s", buf); return szTime; } time_t Str2GmtTm(CString szTime) { tm tm_; char *str = (char*)szTime.GetBuffer(0); int year, month, day, hour, minute, second; sscanf(str, "%d-%d-%d %d:%d:%d", &year, &month, &day, &hour, &minute, &second); tm_.tm_year = year - 1900; tm_.tm_mon = month - 1; tm_.tm_mday = day; tm_.tm_hour = hour;//-8;//格林威治时间转换 tm_.tm_min = minute; tm_.tm_sec = second; tm_.tm_isdst = -1; szTime.ReleaseBuffer(); time_t t_ = mktime(&tm_); //已经减了8个时区 return t_; //秒时间 } time_t Str2LocalTm(CString szTime) { tm tm_; char *str = (char*)szTime.GetBuffer(0); int year, month, day, hour, minute, second; sscanf(str, "%d-%d-%d %d:%d:%d", &year, &month, &day, &hour, &minute, &second); tm_.tm_year = year - 1900; tm_.tm_mon = month - 1; tm_.tm_mday = day; tm_.tm_hour = hour; tm_.tm_min = minute; tm_.tm_sec = second; tm_.tm_isdst = -1; szTime.ReleaseBuffer(); time_t t_ = mktime(&tm_); //已经减了8个时区 return t_; //秒时间 } CString GetMeasuStatusByAlarm(BYTE ucAlarm) { switch (ucAlarm) { case 0: return _T("OK"); case 1: if (LANG_ZHCN == g_iUILanguage) return _T("短路"); return "short circuit"; case 2: return _T("过压保护"); case 3: if (LANG_ZHCN == g_iUILanguage) return _T("AB开路"); return "AB circuit open"; case 4: return _T("过流2A保护"); case 5: return _T("过流4A保护"); case 6: return _T("过流6A保护"); case 7: return _T("电压超量程"); default: return _T("未知"); } } //UTF-8到GB2312的转换 char* U2G(const char* utf8) { int len = MultiByteToWideChar(CP_UTF8, 0, utf8, -1, NULL, 0); wchar_t* wstr = new wchar_t[len + 1]; memset(wstr, 0, len + 1); MultiByteToWideChar(CP_UTF8, 0, utf8, -1, wstr, len); len = WideCharToMultiByte(CP_ACP, 0, wstr, -1, NULL, 0, NULL, NULL); char* str = new char[len + 1]; memset(str, 0, len + 1); WideCharToMultiByte(CP_ACP, 0, wstr, -1, str, len, NULL, NULL); if (wstr) delete[] wstr; return str; } //GB2312到UTF-8的转换 char* G2U(const char* gb2312) { int len = MultiByteToWideChar(CP_ACP, 0, gb2312, -1, NULL, 0); wchar_t* wstr = new wchar_t[len + 1]; memset(wstr, 0, len + 1); MultiByteToWideChar(CP_ACP, 0, gb2312, -1, wstr, len); len = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, NULL, 0, NULL, NULL); char* str = new char[len + 1]; memset(str, 0, len + 1); WideCharToMultiByte(CP_UTF8, 0, wstr, -1, str, len, NULL, NULL); if (wstr) delete[] wstr; return str; } enum EN_TaskFailedReason { EN_NoFailed = 0, EN_InitFailed = 10, EN_InitSendOpen = 11, EN_InitCallLine = 12, EN_InitCheckResistance = 13, EN_FailedOtherTaskRunning = 14, EN_ArriveMaxFailedCount = 15, EN_ResponseAlarm = 16 }; CString GetTestFailedReason(UINT32 uiTestFailedReason) { CString strReason; if (LANG_ZHCN == g_iUILanguage) { switch (uiTestFailedReason) { case EN_NoFailed: { strReason = _T(""); } break; case EN_InitFailed: { strReason = _T("初始化失败"); } break; case EN_InitSendOpen: { strReason = _T("发送开机失败"); } break; case EN_InitCallLine: { strReason = _T("点名失败"); } break; case EN_InitCheckResistance: { strReason = _T("测量接地电阻失败"); } break; case EN_FailedOtherTaskRunning: { strReason = _T("其他任务正在运行"); } break; case EN_ArriveMaxFailedCount: { strReason = _T("达到最大失败次数"); } break; case EN_ResponseAlarm: { strReason = _T("测量回应告警"); } break; default: { } break; } } else { switch (uiTestFailedReason) { case EN_NoFailed: { strReason = _T(""); } break; case EN_InitFailed: { strReason = _T("Init Failed"); } break; case EN_InitSendOpen: { strReason = _T("Init Send Open"); } break; case EN_InitCallLine: { strReason = _T("Init CallLine"); } break; case EN_InitCheckResistance: { strReason = _T("Init Check Resistance"); } break; case EN_FailedOtherTaskRunning: { strReason = _T("Failed Other TaskRunning"); } break; case EN_ArriveMaxFailedCount: { strReason = _T("Arrive Max Failed Count"); } break; case EN_ResponseAlarm: { strReason = _T("Response Alarm"); } break; default: { } break; } } return strReason; } #endif