www.pudn.com > pCom.rar > RadioCtrl.cpp


#include "StdAfx.h" 
#include ".\radioctrl.h" 
#include "E:\Mydesign\pCom\pCom\pCom\pCom.h" 
 
#pragma comment(lib,"E:\\MyDesign\\bin\\pCom.lib") 
 
HANDLE RadioCtrl::GetHandle(void) { return this->pHandle;} 
HANDLE RadioCtrl::SetHandle(HANDLE h) { return pHandle=h;} 
 
RadioCtrl::RadioCtrl(void) 
: inUse(FALSE) 
{ 
	SetHandle(INVALID_HANDLE_VALUE); 
	radio_string=new char[100]; 
	this->os_Read.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL); 
	this->os_Write.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL); 
	buffer=new char[1024]; 
	::InitializeCriticalSection(&this->busCritical); 
} 
 
RadioCtrl::~RadioCtrl(void) 
{ 
    CloseRadio(); 
	delete radio_string; 
	delete buffer; 
} 
int RadioCtrl::OpenRadio(void) 
{ 
	::GetPhoneString(radio_string,100); 
	pHandle=::OpenRadio(radio_string); 
	if(!pHandle||pHandle==INVALID_HANDLE_VALUE) 
		return TDTK_FAIL; 
	return TDTK_SUCCESS; 
} 
 
int RadioCtrl::CloseRadio(void) 
{ 
	if(pHandle&&pHandle!=INVALID_HANDLE_VALUE) 
	{ 
		CloseHandle(pHandle); 
		pHandle=INVALID_HANDLE_VALUE; 
	} 
	return TDTK_SUCCESS; 
} 
 
int RadioCtrl::WriteData(BYTE* pData, ULONG dataLen) 
{ 
	int nStatus; 
	if(!pHandle||pHandle==INVALID_HANDLE_VALUE) 
		return TDTK_FAIL; 
	nStatus=::WriteData(pHandle,pData,dataLen,os_Write); 
	return nStatus; 
} 
 
int RadioCtrl::WriteData(CString cmdStr) 
{ 
	int nStatus; 
	if(!pHandle||pHandle==INVALID_HANDLE_VALUE) 
		return TDTK_FAIL; 
	BYTE* pData=new BYTE[cmdStr.GetLength()]; 
	if(ConvertStrToByte(cmdStr,pData,cmdStr.GetLength())) 
	{ 
		nStatus=::WriteData(pHandle,pData,cmdStr.GetLength()/2,os_Write); 
 
	} 
	else 
	{ 
		nStatus=0; 
	} 
	delete pData; 
	return nStatus; 
} 
 
int RadioCtrl::ConvertStrToByte(CString cmdStr, BYTE* pData, ULONG dataLen) 
{ 
	ULONG i; 
	BYTE temp; 
	for(i=0;i='0') 
			pData[i]-='0'; 
		else if(pData[i]>='a'&&pData[i]<='f') 
			pData[i]-='a'; 
		else if(pData[i]>='A'&&pData[i]<='F') 
			pData[i]-='A'; 
		else 
			return 0; 
		temp=cmdStr.GetAt(i*2+1); 
		if(temp<='9'&&temp>='0') 
			temp-='0'; 
		else if(temp>='a'&&temp<='f') 
			temp-='a'; 
		else if(temp>='A'&&temp<='F') 
			temp-='A'; 
		else 
			return 0; 
		 
		pData[i]=pData[i]<<4|(temp&0x0f); 
         
	} 
	return 1; 
} 
CString RadioCtrl::DataToHexStr(BYTE* pData, ULONG dataLen) 
{ 
	if(dataLen*2>1024) 
	{ 
		delete buffer; 
		buffer=new char[dataLen*2+1];		 
	} 
	memset((void*)buffer,0,dataLen*2+1); 
	ULONG i; 
	for(i=0;i>4; 
		if(buffer[i<<1]<10) 
			buffer[i<<1]+='0'; 
		else 
			buffer[i<<1]+='A'-10; 
		if(buffer[(i<<1)+1]<10) 
			buffer[(i<<1)+1]+='0'; 
		else 
			buffer[(i<<1)+1]+='A'-10; 
	} 
	return CString(buffer); 
} 
 
CString RadioCtrl::DataToStr(BYTE* pData, ULONG dataLen) 
{ 
	ULONG i; 
	if(dataLen>1024) 
		return CString(); 
	for(i=0;iDataToHexStr((BYTE*)buf,returnLen); 
	return str; 
} 
 
int RadioCtrl::QueryData(BYTE* pData, ULONG dataLen, ULONG& returnLen) 
{ 
	int nStatus=::QueryData(pHandle,pData,dataLen,returnLen,os_Read); 
	return nStatus; 
} 
 
int RadioCtrl::btnClick(int num) 
{ 
	BYTE btnCmd[17]={0x41,0x02,00,00,0x08,00,0x09,00,00,0x00,0x00,0x13,00,01,00,00,0x00}; 
	btnCmd[16]=(BYTE)num; 
	DWORD pdwLen=17; 
	BYTE pData[100]; 
	ULONG len; 
	this->RequestBus(); 
	int nStatus=WriteData(btnCmd,pdwLen); 
	Sleep(100); 
	if(nStatus==TDTK_SUCCESS) 
		nStatus=this->QueryData(pData,100,len); 
	if(nStatus!=TDTK_SUCCESS||pData[0]!=1) 
		Sleep(3000); 
	Sleep(100); 
	this->ReleaseBus(); 
	return nStatus; 
} 
 
void RadioCtrl::RequestBus(void) 
{ 
	while(this->inUse==TRUE)Sleep(200); 
	::EnterCriticalSection(&busCritical); 
	inUse=TRUE; 
	::LeaveCriticalSection(&busCritical);	 
} 
 
void RadioCtrl::ReleaseBus(void) 
{ 
	::EnterCriticalSection(&busCritical); 
	inUse=FALSE; 
	::LeaveCriticalSection(&busCritical); 
} 
 
int RadioCtrl::GetVersion(CString& str) 
{ 
	//41 02 00 00 08 00 0A 00 00 00 00 39 00 02 00 00 FF FF 
	BYTE btnCmd[]={0x41,0x02,00,00,0x08,00,0x0A,00,00,0x00,0x00,0x39,00,02,00,00,0xFF,0xFF}; 
	DWORD pdwLen=sizeof(btnCmd); 
	this->RequestBus(); 
	this->ClearRadioBuf(); 
	int nStatus=WriteData(btnCmd,pdwLen); 
	Sleep(20); 
	BYTE pData[150]; 
	ULONG lenth; 
	if(nStatus==TDTK_SUCCESS) 
	{ 
		nStatus=this->QueryData(pData,150,lenth); 
		str=this->DataToStr(&pData[15],lenth-15); 
	} 
	if(nStatus!=TDTK_SUCCESS||pData[0]!=1) 
		Sleep(3000); 
	ReleaseBus(); 
	return nStatus; 
} 
 
int RadioCtrl::GetSN(CString& str) 
{ 
	//41 02 00 00 08 00 10 00 00 00 00 20 00 08 00 00 00 11 00 01 00 00 00 0A 
	BYTE btnCmd[]={0x41,0x02,00,00,0x08,00,0x10,00,00,0x00,0x00,0x20,00,0x08,00,00,0x00,0x11,0x00,0x01,0x00,0x00,0x00,0x0A}; 
	DWORD pdwLen=sizeof(btnCmd); 
	RequestBus(); 
	this->ClearRadioBuf(); 
	int nStatus=WriteData(btnCmd,pdwLen); 
	Sleep(20); 
	BYTE pData[150]; 
	ULONG lenth; 
	if(nStatus==TDTK_SUCCESS) 
	{ 
		nStatus=this->QueryData(pData,150,lenth); 
		str=this->DataToStr(&pData[15],lenth-15); 
	} 
	if(nStatus!=TDTK_SUCCESS||pData[0]!=1) 
		Sleep(3000); 
	ReleaseBus(); 
	return nStatus; 
} 
 
int RadioCtrl::btnClick(int num, BYTE* returnData, ULONG dataLen, ULONG& returnLen) 
{ 
	BYTE btnCmd[17]={0x41,0x02,00,00,0x08,00,0x09,00,00,0x00,0x00,0x13,00,01,00,00,0x00}; 
	btnCmd[16]=(BYTE)num; 
	DWORD pdwLen=17; 
	this->RequestBus(); 
	int nStatus=WriteData(btnCmd,pdwLen); 
	Sleep(100); 
	if(nStatus==TDTK_SUCCESS) 
		nStatus=this->QueryData(returnData,dataLen,returnLen); 
	if(nStatus!=TDTK_SUCCESS||returnData[0]!=1) 
		Sleep(3000); 
	Sleep(200); 
	this->ReleaseBus(); 
	return nStatus; 
} 
 
int RadioCtrl::SendCmd(BYTE* cmdData, ULONG dataLen) 
{ 
	BYTE returnData[1024]; 
	ULONG returnLen; 
	this->RequestBus(); 
	int nStatus; 
	nStatus=WriteData(cmdData,dataLen); 
	Sleep(20); 
	if(nStatus==TDTK_SUCCESS) 
		nStatus=QueryData(returnData,1024,returnLen); 
	if(nStatus!=TDTK_SUCCESS||returnData[0]!=1) 
		Sleep(3000); 
	this->ReleaseBus(); 
	return nStatus; 
} 
 
int RadioCtrl::SendCmd(CString cmdStr) 
{ 
	BYTE returnData[1024]; 
	ULONG returnLen; 
	this->RequestBus(); 
	int nStatus; 
	nStatus=WriteData(cmdStr); 
	Sleep(20); 
	if(nStatus==TDTK_SUCCESS) 
		nStatus=QueryData(returnData,1024,returnLen); 
	if(nStatus!=TDTK_SUCCESS||returnData[0]!=1) 
		Sleep(3000); 
	this->ReleaseBus(); 
	return nStatus; 
} 
 
int RadioCtrl::SendCmd(BYTE* cmdData, ULONG dataLen, BYTE* returnData,ULONG len, ULONG returnLen) 
{ 
	this->RequestBus(); 
	int nStatus; 
	nStatus=WriteData(cmdData,dataLen); 
	Sleep(20); 
	if(nStatus==TDTK_SUCCESS) 
		nStatus=QueryData(returnData,len,returnLen); 
	if(nStatus!=TDTK_SUCCESS||returnData[0]!=1) 
		Sleep(3000); 
	this->ReleaseBus(); 
	return nStatus; 
} 
 
int RadioCtrl::Suspend(void) 
{ 
	//41 02 00 00 08 00 09 00 00 00 00 36 00 01 00 00 00 
	BYTE btnCmd[]={0x41,0x02,00,00,0x08,00,0x09,00,00,0x00,0x00,0x36,00,0x01,00,00,0x00}; 
	DWORD pdwLen=sizeof(btnCmd); 
	RequestBus(); 
	int nStatus=WriteData(btnCmd,pdwLen); 
	Sleep(20); 
	BYTE pData[150]; 
	ULONG lenth; 
	if(nStatus==TDTK_SUCCESS) 
	{ 
		nStatus=this->QueryData(pData,150,lenth); 
	} 
	if(nStatus!=TDTK_SUCCESS||pData[0]!=1) 
		Sleep(3000); 
	ReleaseBus(); 
	return nStatus; 
} 
 
int RadioCtrl::Normal(void) 
{ 
	//41 02 00 00 08 00 09 00 00 00 00 36 00 01 00 00 01 
	BYTE btnCmd[]={0x41,0x02,00,00,0x08,00,0x09,00,00,0x00,0x00,0x36,00,0x01,00,00,0x01}; 
	DWORD pdwLen=sizeof(btnCmd); 
	RequestBus(); 
	int nStatus=WriteData(btnCmd,pdwLen); 
	Sleep(20); 
	BYTE pData[150]; 
	ULONG lenth; 
	if(nStatus==TDTK_SUCCESS) 
	{ 
		nStatus=this->QueryData(pData,150,lenth); 
	} 
	if(nStatus!=TDTK_SUCCESS||pData[0]!=1) 
		Sleep(3000); 
	ReleaseBus();	 
	return nStatus; 
} 
 
int RadioCtrl::GetIMEI(CString& str) 
{ 
	//410200000800100000000020000800000004000100000009 
	CString cmdStr="410200000800100000000020000800000004000100000009"; 
	BYTE returnData[1024]; 
	ULONG returnLen; 
	this->RequestBus(); 
	int nStatus; 
	nStatus=WriteData(cmdStr); 
	Sleep(20); 
	if(nStatus==TDTK_SUCCESS) 
	{ 
		nStatus=QueryData(returnData,1024,returnLen); 
		if(nStatus==TDTK_SUCCESS) 
		{ 
            str=this->DataToHexStr(returnData,returnLen); 
			QueryData(returnData,1024,returnLen); 
		} 
	} 
	if(nStatus!=TDTK_SUCCESS||returnData[0]!=1) 
		Sleep(3000); 
	this->ReleaseBus();	 
	return nStatus; 
} 
//you can  When you call this function,  
int RadioCtrl::KeyTest(WORD& key) 
{ 
	//41 02 00 00 08 00 08 00 00 00 00 3F 00 00 00 00 ---Key Test Command 
	//CString cmdStr="41020000080008000000003F00000000"; 
	OpenRadio(); 
	BYTE cmdByte[]={0x41,0x02,0x00,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x00}; 
	BYTE returnData[1024]; 
	ULONG len=sizeof(cmdByte);; 
	ULONG returnLen; 
	this->RequestBus(); 
	int nStatus;	 
	nStatus=WriteData(cmdByte,len); 
	Sleep(200); 
	if(nStatus==TDTK_SUCCESS) 
	{ 
		nStatus=QueryData(returnData,1024,returnLen); 
		if(nStatus==TDTK_SUCCESS) 
		{ 
			key=*(WORD*)(LPVOID)&returnData[returnLen-2]; 
		} 
	} 
	if(nStatus!=TDTK_SUCCESS||returnData[0]!=1) 
		Sleep(3000);	 
	this->ReleaseBus();	 
	return nStatus; 
} 
 
void RadioCtrl::ClearRadioBuf(void) 
{ 
	BYTE returnData[1024]; 
	ULONG returnLen; 
	while(QueryData(returnData,1024,returnLen)==TDTK_SUCCESS); 
}