189 lines
5.0 KiB
C++
189 lines
5.0 KiB
C++
// DetcGD10Dev.cpp: implementation of the CDetcGD10Dev class.
|
|
//
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
#include "geomative.h"
|
|
#include "DetcGD10Dev.h"
|
|
#include <sys/stat.h>
|
|
#include "GD10OperCmd.h"
|
|
#ifdef _DEBUG
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[]=__FILE__;
|
|
#define new DEBUG_NEW
|
|
#endif
|
|
|
|
#define GD10DEVICE _T("GD20")
|
|
extern SYSTEMTIME g_sysCurTime;
|
|
extern int g_iUILanguage;
|
|
extern CGeoMativeApp theApp;
|
|
//////////////////////////////////////////////////////////////////////
|
|
// Construction/Destruction
|
|
//////////////////////////////////////////////////////////////////////
|
|
CDetcGD10Dev* CDetcGD10Dev::m_pDetcDev = NULL;
|
|
CDetcGD10Dev::CDetcGD10Dev()
|
|
{
|
|
m_bGD10DevIsCon = false;
|
|
m_strDevAddr = _T("");
|
|
m_pLogFile = NULL;
|
|
m_pLogFile = fopen("LOG\\detect_gd20_log.txt","ab+");
|
|
if (NULL == m_pLogFile)
|
|
{
|
|
if (LANG_ZHCN == g_iUILanguage)
|
|
AfxMessageBox(_T("打开 detect_gd20_log.txt 失败."));
|
|
else
|
|
MessageBoxEx(NULL, _T("Open detect_gd20_log.txt failed!!!"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US));
|
|
}
|
|
|
|
|
|
}
|
|
|
|
CDetcGD10Dev::~CDetcGD10Dev()
|
|
{
|
|
fclose(m_pLogFile);
|
|
m_pLogFile = NULL;
|
|
|
|
}
|
|
|
|
CDetcGD10Dev* CDetcGD10Dev::GetInstance()
|
|
{
|
|
if (NULL == m_pDetcDev)
|
|
{
|
|
m_pDetcDev = new CDetcGD10Dev();
|
|
}
|
|
return m_pDetcDev;
|
|
}
|
|
|
|
CString CDetcGD10Dev::GetGD10DevAddr()
|
|
{
|
|
return m_strDevAddr;
|
|
}
|
|
|
|
void CDetcGD10Dev::DetectGD10Dev()
|
|
{
|
|
m_strDevAddr.Empty();
|
|
PrintLog(_T("Now is ready to find gd20-device!"));
|
|
CString strDevName = (EN_MULTI_CHANNEL == theApp.m_ucIsMultiChannel) ? GD10DEVICE : _T("GD10");
|
|
m_strDevAddr = FindUsbDevice(strDevName);
|
|
m_bGD10DevIsCon = m_strDevAddr.IsEmpty() ? false : true;
|
|
}
|
|
|
|
bool CDetcGD10Dev::CompareDriverName(CString strDriName,CString strDriverAddr)
|
|
{
|
|
bool bRes = false;
|
|
if (strDriverAddr.IsEmpty())
|
|
{
|
|
PrintLog(_T("Driver address can not be empty!"));
|
|
return bRes;
|
|
}
|
|
|
|
TCHAR chVolName[MAX_PATH+1];
|
|
TCHAR chFileSys[MAX_PATH+1];
|
|
memset(chVolName, 0, sizeof(TCHAR)*(MAX_PATH+1));
|
|
memset(chFileSys, 0, sizeof(TCHAR)*(MAX_PATH+1));
|
|
CString strText = _T("");
|
|
if (0 == GetVolumeInformation(strDriverAddr,chVolName,MAX_PATH+1,NULL,NULL,NULL,chFileSys,MAX_PATH+1))
|
|
{
|
|
strText.Format(_T("Get Volume Information failed, errorno = %d"),GetLastError());
|
|
PrintLog(strText);
|
|
}
|
|
else
|
|
{
|
|
CString strVal = chVolName;
|
|
strText.Empty();
|
|
strText.Format(_T("Get Volume Information success, volume_name = %s"),strVal);
|
|
bRes = (0 == strVal.Compare(strDriName)) ? true : false;
|
|
}
|
|
return bRes;
|
|
}
|
|
|
|
|
|
CString CDetcGD10Dev::FindUsbDevice(CString strDevName)
|
|
{
|
|
UINT DiskType;
|
|
CString strLog;
|
|
CString strText = _T("");
|
|
CString strDir = _T("");
|
|
size_t szAllDriveStrings = GetLogicalDriveStrings(0,NULL);
|
|
if (0 == szAllDriveStrings)
|
|
{
|
|
ASSERT(0 == szAllDriveStrings);
|
|
return strDir;
|
|
}
|
|
|
|
char *pDriveStrings = new char[szAllDriveStrings + sizeof(_T( " "))];
|
|
char *pAddr = pDriveStrings;
|
|
GetLogicalDriveStrings(szAllDriveStrings,pDriveStrings);
|
|
size_t szDriveString = strlen(pDriveStrings);
|
|
while(szDriveString > 0)
|
|
{
|
|
DiskType=GetDriveType(pDriveStrings);
|
|
switch(DiskType)
|
|
{
|
|
case DRIVE_REMOVABLE:
|
|
{
|
|
strDir.Empty();
|
|
strDir.Format(_T("%s"),pDriveStrings);
|
|
strText.Empty();
|
|
strText.Format(_T("detect removable drive(%s), ready to parser device"),strDir);
|
|
PrintLog(strText);
|
|
//如果名字相等则认为匹配成功
|
|
if (CompareDriverName(strDevName, strDir))
|
|
{
|
|
delete[]pAddr;
|
|
return strDir;
|
|
}
|
|
else
|
|
{
|
|
//规避有的电脑怎么改,u盘都不是GD10/GD20的问题 by quyx 20180517 //"\SD\equipment\equipment.xml"
|
|
struct _stat fileStat;
|
|
CString str = "\SD\\equipment";
|
|
CString strPath = strDir + str;
|
|
if ((_stat(strPath.GetBuffer(0), &fileStat) == 0) && (fileStat.st_mode & _S_IFDIR))
|
|
{
|
|
delete[]pAddr;
|
|
return strDir;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
|
|
case DRIVE_FIXED:
|
|
break;
|
|
case DRIVE_REMOTE:
|
|
break;
|
|
case DRIVE_CDROM:
|
|
break;
|
|
case DRIVE_NO_ROOT_DIR:
|
|
{
|
|
strText.Empty();
|
|
strText.Format(_T("Unknow driver string (%s)"),pDriveStrings);
|
|
MessageBoxEx(NULL, strText, STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US));
|
|
break;
|
|
// return _T("");
|
|
}
|
|
default:
|
|
break;
|
|
|
|
}
|
|
|
|
pDriveStrings += szDriveString + 1;
|
|
szDriveString = strlen(pDriveStrings);
|
|
}
|
|
delete []pAddr;
|
|
return _T("");
|
|
|
|
}
|
|
|
|
void CDetcGD10Dev::PrintLog(CString strLog)
|
|
{
|
|
if (NULL == m_pLogFile)
|
|
{
|
|
MessageBox(NULL, "can't write device_log, log File point is NULL", "LOG_ERROR", MB_OK);
|
|
return;
|
|
}
|
|
CString strOutPut = _T("");
|
|
strOutPut.Format(_T("%04d-%02d-%02d %02d:%02d:%02d.%03d %s \r\n"),g_sysCurTime.wYear, g_sysCurTime.wMonth, g_sysCurTime.wDay,
|
|
g_sysCurTime.wHour, g_sysCurTime.wMinute, g_sysCurTime.wSecond, g_sysCurTime.wMilliseconds, strLog.GetBuffer(0));
|
|
fwrite(strOutPut.GetBuffer(0), 1, strOutPut.GetLength(), m_pLogFile);
|
|
fflush(m_pLogFile);
|
|
} |