1539 lines
35 KiB
C++
1539 lines
35 KiB
C++
#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
|