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


// CommandMeter.cpp: implementation of the CommandMeter class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "stdafx.h" 
#include "CommandMeter.h" 
#include "Decl-32.h" 
#include ".\commandmeter.h" 
 
 
#ifdef _DEBUG 
#undef THIS_FILE 
static char THIS_FILE[]=__FILE__; 
#define new DEBUG_NEW 
#endif 
 
 
#define WM_RADIOALERT (WM_USER+301) 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
 
CommandMeter::CommandMeter() 
{ 
	m_gsm_loss="0.5"; 
	m_dcs_loss="0.7"; 
	m_TestSet = ibdev(0,m_padd_TestSet,m_sadd_TestSet,11,1,1); 
} 
 
CommandMeter::~CommandMeter() 
{ 
	 
} 
 
int CommandMeter::InitMeter() 
{ 
	m_TestSet = ibdev(0,m_padd_TestSet,m_sadd_TestSet,11,1,1); 
	Sleep(200); 
	WriteCommand(m_TestSet,"SYST:REM:ADDR:SEC 2,'GSM900MS_Sig'"); 
	WriteCommand(m_TestSet,"SYST:REM:ADDR:SEC 4,'GSM1800MS_Sig'"); 
	m_gsm = ibdev(0,m_padd_TestSet,98,13,1,1); 
	if(m_gsm<0) 
	{ 
		return false; 
	} 
	m_dcs = ibdev(0,m_padd_TestSet,100,13,1,1); 
	if(m_dcs<0) 
	{ 
		return false; 
	} 
	WriteCommand(m_TestSet,"SYST:PRES:ALL"); 
	WriteCommand(m_TestSet,"*cls"); 
	WriteCommand(m_TestSet,"CONF:SYNC:FREQ:REF 10MHZ"); 
	WriteCommand(m_TestSet,"CONF:SYNC:FREQ:REF:MODE INT"); 
	////////GSM SET////////////////////////////////////////////////////////////////////////// 
	WriteCommand(m_gsm,"ABOR:SENS:SSH"); 
	WriteCommand(m_gsm,"ABOR:POW:MPR"); 
//	WriteCommand(m_gsm,"PROC:SIGN:ACT SOFF"); 
	WriteCommand(m_gsm,"INP:STAT RF2"); 
	WriteCommand(m_gsm,"OUTP:STAT RF2"); 
	WriteCommand(m_gsm,"conf:bss:lev:utim -80"); 
	WriteCommand(m_gsm,"conf:bss:lev:unt -20"); 
	WriteCommand(m_gsm,"conf:bss:timeslot 4"); 
	WriteCommand(m_gsm,"SENS:LEV:ATT LNO"); 
	WriteCommand(m_gsm,"CONF:POW:CONT SCAL,5"); 
	WriteCommand(m_gsm,"CONF:POW:MPR:CONT:REP SING,NONE,NONE"); 
	WriteCommand(m_gsm,"CONF:POW:TIME:MODE GSM"); 
	WriteCommand(m_gsm,"CONF:POW:MPR:CONT SCAL,5"); 
	WriteCommand(m_gsm,"CONF:BSS:SPE HAND"); 
	WriteCommand(m_gsm,"CONF:RXQ:BER1:CONT:LEV:UTIM -104"); 
	WriteCommand(m_gsm,"CONF:RXQ:BER1:CONT:LEV:UNT -20.0"); 
	WriteCommand(m_gsm,"CONF:RXQ:CONT:HTIM 0.1,0.1"); 
	WriteCommand(m_gsm,"CONF:RXQ:BER1:CONT:REP NONE,NONE"); 
	WriteCommand(m_gsm,"CONF:RXQ:BER1:CONT BBB,88"); 
	WriteCommand(m_gsm,"CONF:SENS:SSH:TSET AP1"); 
	WriteCommand(m_gsm,"LEV:MODE PCL"); 
	WriteCommand(m_gsm,"CONF:ARR:SPEC:MOD:RANG -0.6,11"); 
	WriteCommand(m_gsm,"CONF:ARR:SPEC:SWIT:RANG -1.8,9"); 
	WriteCommand(m_gsm,"CONF:SPEC:MOD:CONT SCAL,20"); 
	WriteCommand(m_gsm,"CONF:SPEC:SWIT:CONT SCAL,20"); 
	WriteCommand(m_gsm,"CONF:MOD:CONT SCAL,10"); 
	////////DCS Set////////////////////////////////////////////////////////////////////////// 
	WriteCommand(m_dcs,"ABOR:SENS:SSH"); 
	WriteCommand(m_dcs,"ABOR:POW:MPR"); 
//		WriteCommand(m_dcs,"PROC:SIGN:ACT SOFF"); 
	WriteCommand(m_dcs,"INP:STAT RF2"); 
	WriteCommand(m_dcs,"OUTP:STAT RF2"); 
	WriteCommand(m_dcs,"conf:bss:lev:utim -80"); 
	WriteCommand(m_dcs,"conf:bss:lev:unt -20"); 
	WriteCommand(m_dcs,"conf:bss:timeslot 4"); 
	WriteCommand(m_dcs,"SENS:LEV:ATT LNO"); 
	WriteCommand(m_dcs,"CONF:POW:CONT SCAL,5"); 
	WriteCommand(m_dcs,"CONF:POW:MPR:CONT:REP SING,NONE,NONE"); 
	WriteCommand(m_dcs,"CONF:POW:TIME:MODE GSM"); 
	WriteCommand(m_dcs,"CONF:POW:MPR:CONT SCAL,5"); 
	WriteCommand(m_dcs,"CONF:BSS:SPE HAND"); 
	WriteCommand(m_dcs,"CONF:RXQ:BER1:CONT:LEV:UTIM -104"); 
	WriteCommand(m_dcs,"CONF:RXQ:BER1:CONT:LEV:UNT -20.0"); 
	WriteCommand(m_dcs,"CONF:RXQ:CONT:HTIM 0.1,0.1"); 
	WriteCommand(m_dcs,"CONF:RXQ:BER1:CONT:REP NONE,NONE"); 
	WriteCommand(m_dcs,"CONF:RXQ:BER1:CONT BBB,88"); 
	WriteCommand(m_dcs,"CONF:SENS:SSH:TSET AP1"); 
	WriteCommand(m_dcs,"LEV:MODE PCL"); 
	WriteCommand(m_dcs,"CONF:ARR:SPEC:MOD:RANG -0.6,11"); 
	WriteCommand(m_dcs,"CONF:ARR:SPEC:SWIT:RANG -1.8,9"); 
	WriteCommand(m_dcs,"CONF:SPEC:MOD:CONT SCAL,20"); 
	WriteCommand(m_dcs,"CONF:SPEC:SWIT:CONT SCAL,20"); 
	WriteCommand(m_dcs,"CONF:MOD:CONT SCAL,10"); 
//	m_str = "SENS:CORR:LOSS:INP2 "+m_dcs_loss; 
//	WriteCommand(m_dcs,m_str); 
//	m_str = "SENS:CORR:LOSS:OUTP2 "+m_dcs_loss; 
//	WriteCommand(m_dcs,m_str); 
	////////////////////////////////////////////////////////////////////////// 
	WriteCommand(m_gsm,"CONF:BSS:CHAN 2"); 
	WriteCommand(m_gsm,"CONF:NETW:POW 5"); 
	WriteCommand(m_gsm,"proc:sign:act son"); 
	return true; 
} 
 
int CommandMeter::WriteCommand(int m_dev, CString command) 
{ 
	ibwrt(m_dev,command.GetBuffer(command.GetLength()),command.GetLength()); 
	if(iberr) 
	{ 
		ibclr(m_dev); 
		return false; 
	} 
	return true; 
} 
 
CString CommandMeter::QueryResult(int m_dev) 
{ 
	char buf[300]="",get_buf[300]=""; 
 	int i=0,j=0;	 
	////////////////////////////////// 
	ibrd(m_dev,buf,300); 
	 
	if(iberr||strcmp(buf,get_buf)==0) 
	{ 
		//		AfxMessageBox("some error occured during reading data!!!"); 
		ibclr(m_dev); 
		return "999999"; 
	} 
	//////////////////////////////////////////////////////////////////////////// 
	while(i<299) 
	{ 
		if(buf[i]!='\n')                 //此循环用于将有时返回数据中 
		{                                   //的双引号去掉,以便返回正确数据 
			if(buf[i]!='"')                 //并取得数组中的有用信息 
			{ 
				get_buf[j] = buf[i]; 
				j++; 
			} 
		} 
		else 
			break; 
		i++; 
	} 
	get_buf[j] = '\0'; 
	//	AfxMessageBox(get_buf);    
	///////////////////////////////////以下的动态数组是否可以不用? 
//	if((str = new char[j])==NULL)                 //apply dynamic for memory 
//		AfxMessageBox("can't allocate more memory\n"); 
//	for(i=0;iGetMainWnd()->PostMessage(WM_RADIOALERT); 
			str = QueryResult(m_dev); 
			if(str.Compare("CEST")==0) 
			{ 
				return true; 
			} 
		} 
		if(str.Compare("SOFF")==0) 
			WriteCommand(m_dev,"proc:sign:act son"); 
		Sleep(350); 
	} 
	return false; 
} 
 
int CommandMeter::PickData(CString m_result) 
{ 
	/* 
 
	*/ 
	int i = 0,j = 0,k,m_last_pot; 
 
	for(i=0;i<30;i++) 
	{ 
		pot[i] = 0; 
	} 
	for(i=0;i<31;i++) 
	{ 
		m_pot_data[i] = ""; 
	} 
	i = 0; 
	m_last_pot = m_result.GetLength()-1; 
 
	do { 
		k = m_result.Find(",",i); 
		if(k !=-1) 
		{ 
			pot[j] = k; 
			j++; 
			i = k+1; 
		} 
		else 
		{ 
			break; 
		} 
	} while(im_pot_data[0] = m_result; 
	} 
	else 
	{ 
		for(i=0;i<=j;i++) 
		{ 
			if(i==0) 
			{ 
				this->m_pot_data[i] = m_result.Mid(0,pot[0]); 
			} 
			else if(i==j) 
			{ 
				this->m_pot_data[i] = m_result.Mid(pot[i-1]+1,m_last_pot-pot[i-1]); 
			} 
			else 
			{ 
				this->m_pot_data[i] = m_result.Mid(pot[i-1]+1,pot[i]-pot[i-1]-1); 
			} 
		} 
	} 
	for(i=0;i<=j;i++) 
	{ 
		if(atof(m_pot_data[i])!=0.0) 
		{ 
			m_pot_data[i] = this->ConvertData(m_pot_data[i]); 
		} 
	} 
	return true; 
} 
 
CString CommandMeter::ConvertData(CString str) 
{ 
	double m_float_data; 
	CString m_str_data; 
	m_float_data = atof(str); 
	m_str_data.Format("%0.2f",m_float_data); 
	return m_str_data; 
} 
 
int CommandMeter::TestRSSI(int m_dev) 
{ 
	CString m_command,m_count; 
	int m_first,m_last,i = 0; 
	WriteCommand(m_dev,"rrep:count?"); 
	m_count = QueryResult(m_dev); 
	m_first = atoi(m_count); 
	do 
	{ 
		WriteCommand(m_dev,"rrep:count?"); 
		m_count = QueryResult(m_dev); 
		m_last = atoi(m_count); 
		if(m_last-m_first>3) 
			break; 
		i++; 
		Sleep(20); 
	}while(i<200); 
 
	m_command = "rrep:rxl?"; 
	WriteCommand(m_dev,m_command); 
	CString m_RSSI = QueryResult(m_dev); 
	PickData(m_RSSI); 
	return true; 
} 
 
int CommandMeter::TestBitErr(int m_dev) 
{ 
	CString m_result;	 
	WriteCommand(m_dev,"init:rxq:ber"); 
	WriteCommand(m_dev,"fetc:rxq:ber?"); 
	m_result = QueryResult(m_dev); 
	/////// 
	this->PickData(m_result); 
	//////// 
	return true; 
} 
 
int CommandMeter::EndCall() 
{ 
//	WriteCommand(m_dcs,"PROC:SIGN:ACT CREL"); 
//	WriteCommand(m_dcs,"proc:sign:act soff"); 
//	WriteCommand(m_gsm,"proc:sign:act soff"); 
	WriteCommand(m_gsm,"PROC:SIGN:ACT SON"); 
	Sleep(200); 
	return true; 
} 
 
int CommandMeter::MeasureSpectrum(int m_dev) 
{ 
	WriteCommand(m_dev,"INIT:SPEC"); 
	CString str; 
	WriteCommand(m_dev,"READ:ARR:SPEC:CURRE?"); 
	str=QueryResult(m_dev); 
	WriteCommand(m_dev,"READ:ARR:SPEC:AVER?"); 
	WriteCommand(m_dev,"READ:ARR:SPEC:MAXI?"); 
	WriteCommand(m_dev,"READ:ARR:SPEC:MINI?"); 
	return true; 
} 
 
int CommandMeter::Init850Band(void) 
{ 
	return 0; 
} 
 
int CommandMeter::Init900Band(void) 
{ 
	return 0; 
} 
 
int CommandMeter::Init1800Band(void) 
{ 
	return 0; 
} 
 
int CommandMeter::Init1900Band(void) 
{ 
	return 0; 
} 
 
int CommandMeter::Handover900To1800(void) 
{ 
	WriteCommand(m_dcs,"CONF:BSS:CHAN 517"); 
	WriteCommand(m_dcs,"CONF:NETW:POW 0"); 
	WriteCommand(m_dcs,"CONF:BSS:TCH:LEV:UTIM -80"); 
	//////handover////////////////////////////////////////////////////////////////////////// 
	WriteCommand(m_gsm,"CONF:HAND:TARG 'GSM1800MsDualBand'"); 
	WriteCommand(m_gsm,"PROC:SIGN:ACT HAND"); 
	for(int i=0;i<10;i++) 
	{ 
		WriteCommand(m_dcs,"SENS:SIGN:STAT?"); 
		if(QueryResult(m_dcs).Compare("CED")==0) 
		{ 
			return true; 
		} 
		Sleep(100); 
	} 
	return false; 
} 
 
int CommandMeter::Handover1800To850(void) 
{ 
	return 0; 
} 
 
int CommandMeter::Handover1800To1900(void) 
{ 
	return 0; 
} 
 
int CommandMeter::Handover850To1900(void) 
{ 
	return 0; 
}