?? dataprocjob.cpp
字號:
// DataProcJob.cpp: implementation of the CDataProcJob class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "RTMS.h"
#include "DataProcJob.h"
#include "CIniFile.h"
#include "RTMSDlg.h"
//#define LOCALCONNSTR "Provider=SQLOLEDB.1;Presist Security Info=TRUE;User ID=%s;Password=%s;Initial Catalog=RTMS;Data Source=%s;"
#define LOCALCONNSTR "Provider=MSDASQL;Driver={Microsoft Access Driver (*.mdb)};Dbq=%s\\RTMS.mdb;Uid=Admin;Pwd=;"
#define mErrLog "DataError.log"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
CRTMSDlg* m_mainwnd;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
UINT CDataProcJob::DoWork()
{
m_mainwnd=(CRTMSDlg*) AfxGetMainWnd();
GetDBPara(strUser,strPass,strDBIP);
while (strUser.IsEmpty ())
{
GetDBPara(strUser,strPass,strDBIP);
}
bDataError=true;
CString strConn;
//strConn.Format (LOCALCONNSTR,strUser,strPass,strDBIP);
char PathName[255];
strcpy((char*) PathName,GetAppPath());
strConn.Format(LOCALCONNSTR,PathName);
CoInitialize(NULL);
DWORD dwResult;
while( !m_bAbort )
{
if(bDataError) //數據服務器需要連接
{
bDataError = !OpenConnection(m_pDataConn,strConn.GetBuffer (strConn.GetLength ()));
if(bDataError)
{
m_mainwnd->Log ("數據庫連接失敗");
}
}
dwResult=WaitForSingleObject(hExitEvent,10000);
if( WAIT_OBJECT_0 == dwResult ) m_bAbort=TRUE;
}
::CoUninitialize();
return 1;
}
BOOL CDataProcJob::GetDBPara(CString &strUser, CString &strPass, CString &strDB)
{
CIniFile mfile;
mfile.Create ("RTMS.ini");
mfile.GetVarStr("OPTION","User",strUser);
mfile.GetVarStr("OPTION","Pass",strPass);
mfile.GetVarStr("OPTION","DBIP",strDB);
int Sen;
mfile.GetVarInt ("OPTION","SensorID",Sen);
SensorID=Sen;
mfile.CloseIniFile();
return true;
}
BOOL CDataProcJob::OpenConnection(_ConnectionPtr& pConn,const char* strConn)
{
HRESULT hr;
try {
if( pConn )
{
if( pConn->State == adStateOpen ) pConn->Close();
pConn.Release();
}
}
catch(...){};
hr = pConn.CreateInstance(__uuidof(Connection));
if( FAILED(hr) ) return FALSE;
try
{
pConn->ConnectionTimeout = 10;
hr = pConn->Open(strConn,"","",-1);
}catch(...){hr=-1;}
if(FAILED(hr))
{
pConn.Release();
return FALSE;
}
return TRUE;
}
BOOL CDataProcJob::ProcData(const unsigned char *pBuf,DWORD retLen)
{
int iLen=(int)strlen((char*)pBuf);
for(int i=0;i<=(int)retLen;i++)
{
if(pBuf[i]==0xFF)
{
switch(pBuf[i+1])
{
case 0x1B:
memcpy((char*)ConBuf,pBuf+i,pBuf[i+2]+4);
ConBuf[pBuf[i+2]+4]='\0';
ProcVolLongModel();
i+=pBuf[i+2]+3;
m_mainwnd->Log ("Proc Volume Long Model");
break;
case 0x10:
memcpy((char*)ConBuf,pBuf+i,pBuf[i+2]+4);
ConBuf[pBuf[i+2]+4]='\0';
ProcVolumeModel();
i+=pBuf[i+2]+3;
m_mainwnd->Log ("Proc Volume Model");
break;
case 0x11:
memcpy((char*)ConBuf,pBuf+i,pBuf[i+2]+4);
ConBuf[pBuf[i+2]+4]='\0';
ProcOccupancey();
i+=pBuf[i+2]+3;
m_mainwnd->Log ("Proc Occupancy Model");
break;
case 0x12:
memcpy((char*)ConBuf,pBuf+i,pBuf[i+2]+4);
ConBuf[pBuf[i+2]+4]='\0';
ProcSpeedModel();
i+=pBuf[i+2]+3;
m_mainwnd->Log ("Proc Speed Model");
break;
case 0x18:
memcpy((char*)ConBuf,pBuf+i,pBuf[i+2]+4);
ConBuf[pBuf[i+2]+4]='\0';
i+=pBuf[i+2]+3;
break;
case 0x19:
memcpy((char*)ConBuf,pBuf+i,pBuf[i+2]+4);
ConBuf[pBuf[i+2]+4]='\0';
i+=pBuf[i+2]+3;
m_mainwnd->Log ("Proc 0x19");
break;
case 0x2D:
memcpy((char*)ConBuf,pBuf+i,pBuf[i+2]+4);
ConBuf[pBuf[i+2]+4]='\0';
i+=pBuf[i+2]+3;
m_mainwnd->Log ("Proc 0x2D");
break;
case 0x08:
memcpy((char*)ConBuf,pBuf+i,pBuf[i+2]+4);
ConBuf[pBuf[i+2]+4]='\0';
i+=pBuf[i+2]+3;
m_mainwnd->Log ("Proc 0x08");
break;
case 0x1D:
memcpy((char*)ConBuf,pBuf+i,pBuf[i+2]+4);
ConBuf[pBuf[i+2]+4]='\0';
i+=pBuf[i+2]+3;
m_mainwnd->Log ("Proc 0x1D");
break;
case 0xAA:
memcpy((char*)ConBuf,pBuf+i,pBuf[i+2]+4);
ConBuf[pBuf[i+2]+4]='\0';
i+=pBuf[i+2]+3;
m_mainwnd->Log ("Proc 0xAA");
break;
default:
break;
}
}
}
return true;
}
BOOL CDataProcJob::ProcVolLongModel()
{
BYTE mChkSum;
mChkSum=0x00;
for(int i=3;i<ConBuf[2]+3;i++)
{
mChkSum+=ConBuf[i];
}
if(mChkSum!=ConBuf[ConBuf[2]+3]) //校驗錯
return false;
CString strSQL;
strSQL.Format("insert into VolLong (SensorID,VolLong1,VolLong2,VolLong3,VolLong4,VolLong5,VolLong6,VolLong7,VolLong8,PowerVoltage,SynDate) values(%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,'%s')",SensorID,ConBuf[3],ConBuf[4],ConBuf[5],ConBuf[6],ConBuf[7],ConBuf[8],ConBuf[9],ConBuf[10],ConBuf[11],CTime::GetCurrentTime ().Format ("%Y-%m-%d %H:%M:%S"));
AppendDB(strSQL);
return true;
}
BOOL CDataProcJob::ProcVolumeModel()
{
BYTE mChkSum;
mChkSum=0x00;
for(int i=3;i<ConBuf[2]+3;i++)
{
mChkSum+=ConBuf[i];
}
if(mChkSum!=ConBuf[ConBuf[2]+3]) //校驗錯
return false;
CString strSQL;
strSQL.Format("insert into Volume (SensorID,Volume1,Volume2,Volume3,Volume4,Volume5,Volume6,Volume7,Volume8,MsgNum,SynDate) values(%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,'%s')",SensorID,ConBuf[3],ConBuf[4],ConBuf[5],ConBuf[6],ConBuf[7],ConBuf[8],ConBuf[9],ConBuf[10],ConBuf[11],CTime::GetCurrentTime ().Format ("%Y-%m-%d %H:%M:%S"));
AppendDB(strSQL);
return true;
}
BOOL CDataProcJob::ProcOccupancey()
{
BYTE mChkSum;
mChkSum=0x00;
for(int i=3;i<ConBuf[2]+3;i++)
{
mChkSum+=ConBuf[i];
}
if(mChkSum!=ConBuf[ConBuf[2]+3]) //校驗錯
return false;
if(ConBuf[2]==9)
{
float fOcc[8];
int iTmp;
for (int m=0;m<8;m++)
{
iTmp=ConBuf[3+m];
fOcc[m]=(float)iTmp;
}
CString strSQL;
strSQL.Format("insert into Occupancy (SensorID,Occupancy1,Occupancy2,Occupancy3,Occupancy4,Occupancy5,Occupancy6,Occupancy7,Occupancy8,SensorIDR,SynDate) values(%d,%4.2f,%4.2f,%4.2f,%4.2f,%4.2f,%4.2f,%4.2f,%4.2f,%d,'%s')",SensorID,fOcc[0],fOcc[1],fOcc[2],fOcc[3],fOcc[4],fOcc[5],fOcc[6],fOcc[7],ConBuf[11],CTime::GetCurrentTime ().Format ("%Y-%m-%d %H:%M:%S"));
AppendDB(strSQL);
/* CString strSQL;
strSQL.Format("insert Occupancy (SensorID,Occupancy1,Occupancy2,Occupancy3,Occupancy4,Occupancy5,Occupancy6,Occupancy7,Occupancy8,SensorIDR) values(%d,%4.2f,%4.2f,%4.2f,%4.2f,%4.2f,%4.2f,%4.2f,%4.2f,%d)",SensorID,ConBuf[3],ConBuf[4],ConBuf[5],ConBuf[6],ConBuf[7],ConBuf[8],ConBuf[9],ConBuf[10],ConBuf[11]);
AppendDB(strSQL);
*/
}
else if(ConBuf[2]==11)
{
float fOcc[8];
int iTmp;
for (int m=0;m<8;m++)
{
iTmp=ConBuf[3+2*m]*100+ConBuf[3+2*m+1];
fOcc[m]=(float)iTmp/100;
}
CString strSQL;
strSQL.Format("insert into Occupancy (SensorID,Occupancy1,Occupancy2,Occupancy3,Occupancy4,Occupancy5,Occupancy6,Occupancy7,Occupancy8,SensorIDR,SynDate) values(%d,%4.2f,%4.2f,%4.2f,%4.2f,%4.2f,%4.2f,%4.2f,%4.2f,%d,'%s')",SensorID,fOcc[0],fOcc[1],fOcc[2],fOcc[3],fOcc[4],fOcc[5],fOcc[6],fOcc[7],ConBuf[19],CTime::GetCurrentTime ().Format ("%Y-%m-%d %H:%M:%S"));
AppendDB(strSQL);
}
return true;
}
BOOL CDataProcJob::ProcSpeedModel()
{
BYTE mChkSum;
mChkSum=0x00;
for(int i=3;i<ConBuf[2]+3;i++)
{
mChkSum+=ConBuf[i];
}
if(mChkSum!=ConBuf[ConBuf[2]+3]) //校驗錯
return false;
CString strSQL;
BYTE mSpeed[8];
for(int j=0;j<8;j++)
{
if(ConBuf[3+j]==0xf0)
mSpeed[j]=0;
else
mSpeed[j]=ConBuf[3+j];
}
strSQL.Format("insert into Speed(SensorID,Speed1,Speed2,Speed3,Speed4,Speed5,Speed6,Speed7,Speed8,Average,Direction,Health,SynDate) values(%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,'%s')",SensorID,mSpeed[0],mSpeed[1],mSpeed[2],mSpeed[3],mSpeed[4],mSpeed[5],mSpeed[6],mSpeed[7],ConBuf[11],ConBuf[12],ConBuf[13],CTime::GetCurrentTime ().Format ("%Y-%m-%d %H:%M:%S"));
AppendDB(strSQL);
return true;
}
BOOL CDataProcJob::AppendDB(CString strSQL)
{
if((m_pDataConn==NULL)||(m_pDataConn->State==adStateClosed))
{
m_mainwnd->Log ("Append DataBase Error,Connection Invalidate.");
CStdioFile file;
CString filename;
filename=mErrLog;
if(!file.Open(filename, CFile::modeWrite))
file.Open(filename, CFile::modeCreate|CFile::modeWrite);
{
file.SeekToEnd();
strSQL+="\n";
file.WriteString(strSQL);
file.Close();
}
return false;
}
try{
m_pDataConn->Execute((LPCSTR)strSQL,NULL,adCmdText|adExecuteNoRecords);
}
catch(...)
{
m_mainwnd->Log ("Append DataBase Error ,Insert Error.");
CStdioFile file;
CString filename;
filename=mErrLog;
if(!file.Open(filename, CFile::modeWrite))
file.Open(filename, CFile::modeCreate|CFile::modeWrite);
{
file.SeekToEnd();
strSQL+="\n";
file.WriteString(strSQL);
file.Close();
}
if( m_pDataConn )
{
if( m_pDataConn->State == adStateOpen ) m_pDataConn->Close();
m_pDataConn.Release();
bDataError=true;
}
return false;
}
return true;
}
CString CDataProcJob::GetAppPath()
{
char PathName[255];
GetModuleFileName( AfxGetInstanceHandle(), PathName,sizeof( PathName ) );
char *a,*b;
a = b = PathName;
while(b)
{
b=strchr(a+1,'\\');
if(b) a=b;
}
*a='\0';
return PathName;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -