Files
coco df489d5640 a
2026-07-03 16:05:30 +08:00

1539 lines
35 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.
#include "StdAfx.h"
#include <basetsd.h>
#include "WinBase.h"
#include "GeoMative.h"
#include "Constant.h"
#include "SComPort.h"
#include "DevLinkRecord.h"
#include "DetcGD10Dev.h"
#include <SetupAPI.h>
#include <devguid.h>
#ifndef GLOBAL_PUB_H
#define GLOBAL_PUB_H
//#define _WIN32_WINNT 0x0501
#include <winbase.h>
#include <windows.h>
#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