⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 measure.cpp

📁 这是一个手机校准程序
💻 CPP
📖 第 1 页 / 共 5 页
字号:
// measure.cpp
// (c) Mobilink Telecom Inc, 1999, 2000
//
// May 21, 2000
// Nick Steffen
//
// Contains the measurement object
//
// June 27, 2000
// Added SetCableLoss() & GetCableLoss()
//
// September 20, 2000
// Added different version of GetTxPower()
// It accepts a third parameter which determines whether,
// when the expected power is not within 3 dB of the actual power,
// the search direction is from 33 dBm to 0 dBm or the other direction.
//
// February 9, 2001
// Modified GetUpperRampStatus() to change T0 as a function of band
//
// February 15, 2001
// Modified GetUpperRampStatus() to change -0.5 dB to -0.55, and -7.0 dB to -5.7
//
// March 2, 2001
// Modified to use HP8960
//
// March 5, 2001
// Modified GetTxPower() for 8960 to correctly measure power when expected and actual are different.
//
// March 11, 2001
// Added logging to 8960 clauses.
//

#include "caltypes.h"
#include "decl-32.h"
#include "measure.h"
#include "ramp_status.h"
//#include "visa.h"
#include "age1960.h"


#define		MAX_8922_LOOP_COUNT		20
#define		HP_ERROR_CODE	(-1)
#define   IBDEV_ERROR   (-1)

// Rohde and Schwarz definitions
// secondary address - National Instruments specific
#define   SECONDARY_ADDR    96
// define offsets from that
#define SECONDARY_ADDR_OFFSET_GSM900_NS   1
#define SECONDARY_ADDR_OFFSET_GSM1800_NS  2
#define SECONDARY_ADDR_OFFSET_GSM1900_NS  3
// secondary address definitions for function groups
#define SECONDARY_ADDR_GSM900_NS  (SECONDARY_ADDR+SECONDARY_ADDR_OFFSET_GSM900_NS)
#define SECONDARY_ADDR_GSM1800_NS (SECONDARY_ADDR+SECONDARY_ADDR_OFFSET_GSM1800_NS)
#define SECONDARY_ADDR_GSM1900_NS (SECONDARY_ADDR+SECONDARY_ADDR_OFFSET_GSM1900_NS)



//*******************************************************************************
ViSession measure::GetVISASession()
  {
#if VISA
  return session;
#else
  return 0;
#endif
  }

//*******************************************************************************
ViSession measure::GetVISAInstrument()
  {
#if VISA
  return vi_instr;
#else
  return 0;
#endif
  }

//*******************************************************************************
BOOL measure::SetCableLoss(float loss)
  {
  char buf[256];
  double freq_offset[1];
  double loss_offset[1];
  int offset_items=3;
  int i;
  
  cable_loss=loss;
  loss_offset[0]=cable_loss;
  freq_offset[0]=800000000.0;
  
  if(tester_type==AGT8960)
    {
	  age1960_amplitudeOffset(vi_instr, freq_offset, loss_offset, 1);  // For latest Agilent drivers
	  //age1960_amplitudeOffset(vi_instr, loss);  // For older Agilent drivers
    }
  if(tester_type==HP8922)
    {
// Turn cable loss on
    sprintf(buf,"CONFIGURE:OFLEVEL:MODE 'ON'"); 
    GpibWrt(buf);
  // Set cable loss
    sprintf(buf,"CONFIGURE:OFLEVEL:RFINOUT %f",loss_offset[0]); 
    GpibWrt(buf);
    }


  else if(tester_type==CM200)
    {
    if(band==GSM)
      {
      sprintf(buf,"SENSE:CORRECTION:LOSS:INPUT2 %f",-1.0*cable_loss);
      GpibWrt(IdCM200_GSM900_NS,buf);
      sprintf(buf,"SENSE:CORRECTION:LOSS:OUTPUT2 %f",-1.0*cable_loss);
      GpibWrt(IdCM200_GSM900_NS,buf);
      }
    else if(band==DCS)
      {
      sprintf(buf,"SENSE:CORRECTION:LOSS:INPUT2 %f",-1.0*cable_loss);
      GpibWrt(IdCM200_GSM1800_NS,buf);
      sprintf(buf,"SENSE:CORRECTION:LOSS:OUTPUT2 %f",-1.0*cable_loss);
      GpibWrt(IdCM200_GSM1800_NS,buf);
      }
    else if(band==PCS)
      {
      sprintf(buf,"SENSE:CORRECTION:LOSS:INPUT2 %f",-1.0*cable_loss);
      GpibWrt(IdCM200_GSM1900_NS,buf);
      sprintf(buf,"SENSE:CORRECTION:LOSS:OUTPUT2 %f",-1.0*cable_loss);
      GpibWrt(IdCM200_GSM1900_NS,buf);
      }
    }

  return TRUE;
  }

//*******************************************************************************
BOOL measure::GetCableLoss(float *loss)
  {
  *loss=cable_loss;
  return TRUE;
  }

//*******************************************************************************
void measure::SetLogFilename(char *filename)
  {
  
  strcpy(log_filename,filename);
  }

//*******************************************************************************
void measure::LogGPIB(char *buf)
  {
  HANDLE hFile;
  unsigned long fp;
  unsigned long count;
  char cr[2]={0x0d,0x0a};

  if(logging)
    {
    hFile=CreateFile(log_filename,GENERIC_WRITE,FILE_SHARE_READ,NULL,
                     OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
// go to end of file
    fp=SetFilePointer (hFile,0,NULL, FILE_END); 
    WriteFile(hFile,buf,strlen(buf),&count,NULL);
    WriteFile(hFile,cr,2,&count,NULL); // append a newline
    CloseHandle(hFile);
    }
  }


//*******************************************************************************
void measure::EnableLogging(BOOL enable)
  {
  logging=enable;
  }

//***************
//----------SetGpibAddr()
//***************
BOOL measure::SetGpibAdd(Int8 addr)
  {
  GpibAdd=addr;
  return TRUE;
  }

//***************
//----------SetTesterType()
//***************
BOOL measure::SetTesterType(TesterType_t type)
  {
  if(type==AGT8960)
    {
    tester_type=AGT8960;
    return TRUE;
    }
  else if(type==HP8922)
    {
    tester_type=HP8922;
    return TRUE;
    }
  else if(type==CM200)
    {
    tester_type=CM200;
    return TRUE;
    }
  else return FALSE;
  }

//***************
//----------GetTesterType()
//***************
TesterType_t measure::GetTesterType()
  {
  return tester_type;
  }

//***************
//----------SetChannel(unsigned)
//***************
BOOL measure::SetChannel(unsigned ch)
  {
  channel=ch;
  return TRUE;
  }

//***************
//----------SetBand(BandIndex_t)
//***************
BOOL measure::SetBand(BandIndex_t b)
  {
  band=b;
  return TRUE;
  }

//***************
//----------Disconnect()
// returns FALSE on error
//***************
BOOL measure::Disconnect() 
  {
#if VISA
  viClose(vi_instr);
 // Sleep(100);
  viClose(session);
 // Sleep(100);
#endif
  return TRUE;
  }

//***************
//----------Connect()
// returns FALSE on error
//***************
BOOL measure::Connect() 
  {	
	short	result;
	double power = 0;
  char command[256];
  char buf[256];
  ViStatus viStat;
  ViSession vi;
  char log_msg[256];
   int i;
	if(tester_type==AGT8960)
    {
    sprintf(buf,"GPIB::%d::INSTR",GpibAdd);
    viStat = age1960_init(buf, VI_TRUE, VI_TRUE, &vi);
    if((viStat < VI_SUCCESS) || ( vi == VI_NULL ))
      {
      return FALSE;
      }

        vi_instr = vi;
		viClear(vi_instr);
		age1960_dcl(vi_instr);
		age1960_reset(vi_instr);
		//Sleep(10000);
		age1960_timeOut(vi_instr, 15000);
		//age1960_cmd(vi_instr, "SYST:COMM:GPIB:DEB:STAT ON");
		age1960_cmd(vi_instr, "DISP:MODE TRACK");
		age1960_operatingMode(vi_instr, age1960_TEST_MODE);
		age1960_measurementTimeout(vi_instr, age1960_PFER, 5.0, VI_TRUE);
		age1960_measurementTimeout(vi_instr, age1960_TXPOWER, 0.1, VI_TRUE);
		age1960_measurementTimeout(vi_instr, age1960_PVTIME, 1.0, VI_TRUE);
		age1960_confTXPower(vi_instr, 0, age1960_TRIG_RF_RISE, 0.0, VI_FALSE, 0.1);
		return TRUE;
    }
  else if(tester_type==HP8922)
    {
#if VISA
	//viClose(vi_instr);
    //viClose(session);
    if(viOpenDefaultRM(&session)!=VI_SUCCESS)
      {
      return FALSE;
      }
    sprintf(buf,"GPIB::%d::INSTR",GpibAdd);
    viStat=viOpen (session, buf, VI_NULL, VI_NULL, &vi_instr);
	Sleep(1000);
    if(viStat<VI_SUCCESS)
      {
      return FALSE;
      }
    viClear(vi_instr);
#else // not VISA
    IdHP8922 = ibdev(0, GpibAdd, 0, T1s, 1, 0);					// Locate the IdHP8922
	  if (IdHP8922 == HP_ERROR_CODE)
      {
	    return FALSE;
      }

//Check if HP8922 is connected
	  ibln(IdHP8922, GpibAdd, 0,&result);
	  if( result == 0 )
      {
	    return FALSE;
      }
	  ibclr(IdHP8922);
#endif
    GpibWrt("*RST");
	  Sleep(10000);
	
	  GpibWrt("DISPLAY:SCREEN CELL1");
	  GpibWrt("CELL:MODE 'TEST MODE'");

	  return TRUE;
    }
  else if(tester_type==CM200)
    {

#if VISA //weidg
	  vi_instr=1;
	 // session=256;
	 // Sleep(100);
	  viClear(vi_instr);
	  Sleep(100);
	  viClose(vi_instr);
	  Sleep(100);
   //   viClose(session);
      
		//
	   IdCM200_BASE=0;
	   i=0;
	   viStat=-1;
	  while ((viStat < VI_SUCCESS) && (i<=5))
    
	   {
		  Sleep(100);
		  viStat = viOpenDefaultRM(&session);

		  if (viStat < VI_SUCCESS)
		  { 
			viClose (session);
			Sleep(500);
		  } 
		  i++;
	   }

	   if(viStat<VI_SUCCESS)
	   { 
         return FALSE;
       }
       i=0;
       viStat=-1;
	   while ((viStat < VI_SUCCESS) && (i<=5))
	   {
	      Sleep(500);
		  sprintf(buf,"GPIB::%d::%d::INSTR",GpibAdd,IdCM200_BASE);
		  viStat=viOpen (session, buf, VI_NULL, VI_NULL, &vi_instr);
		  Sleep(1500);
		  if(viStat<VI_SUCCESS)
		  {
		    viClose (vi_instr);
		 	Sleep(500);
		  } 
		  i++;
	   }

	   if(viStat<VI_SUCCESS)
	   { 
         return FALSE;
	   } 	        
		viClear(vi_instr);
		Sleep(500);
   #else    //weidg
    // get the base handle
    IdCM200_BASE = ibdev(0, GpibAdd, SECONDARY_ADDR, 10, 1, 0);					// Locate the CMU200
    if(IdCM200_BASE==IBDEV_ERROR)
      {
      return FALSE;
      }
     // anybody there?
	  ibln(IdCM200_BASE, GpibAdd, SECONDARY_ADDR,&result);
	  if(result==0)
      {
      return FALSE;
      }
   #endif //weidg

   GpibWrt(IdCM200_BASE,"*RST");
   Sleep(4000);

   GpibWrt(IdCM200_BASE,"*OPC?");
   GpibRd(buf);

   Sleep(1000);
// set the secondary addresses
 //   added by weidg
    sprintf(command,"SYST:REM:ADDR:SEC 1,'GSM900MS_NSig'"); //\"");
    GpibWrt(IdCM200_BASE,command);
  //  GpibWrt(IdCM200_BASE,"*OPC?");
  // GpibRd(buf);
    sprintf(command,"SYST:REM:ADDR:SEC 2,'GSM1800MS_NSig'");  //\"",SECONDARY_ADDR_OFFSET_GSM1800_NS);
    GpibWrt(IdCM200_BASE,command);
//	GpibWrt(IdCM200_BASE,"*OPC?");
 //  GpibRd(buf);
    sprintf(command,"SYST:REM:ADDR:SEC 3,'GSM1900MS_NSig'"); //  ;
    GpibWrt(IdCM200_BASE,command);
//	GpibWrt(IdCM200_BASE,"*OPC?");
   // GpibRd(buf);
    sprintf(command,"SYST:REM:ADDR:SEC 4,'RF_NSig'"); //  ;weidg
    GpibWrt(IdCM200_BASE,command); 
	GpibWrt(IdCM200_BASE,"*OPC?");
    GpibRd(buf);

  // get the handles for the function groups
  #if VISA  //weidg
   IdCM200_GSM900_NS=1;
   IdCM200_GSM1800_NS=2;
   IdCM200_GSM1900_NS=3;
   IdCM200_RF_NS=4;    //weidg

  #else     //weidg 
    IdCM200_GSM900_NS=ibdev(0,GpibAdd,SECONDARY_ADDR_GSM900_NS,10,1,0);
    if(IdCM200_GSM900_NS==IBDEV_ERROR)
      {
      return FALSE;
      }
	  ibln(IdCM200_GSM900_NS, GpibAdd, SECONDARY_ADDR_GSM900_NS, &result);
	  if(result==0)
      {
      return FALSE;
      }

    IdCM200_GSM1800_NS=ibdev(0,GpibAdd,SECONDARY_ADDR_GSM1800_NS,10,1,0);
    if(IdCM200_GSM1800_NS==IBDEV_ERROR)
      {
      return FALSE;
      }
	  ibln(IdCM200_GSM1800_NS, GpibAdd, SECONDARY_ADDR_GSM1800_NS, &result);
	  if(result==0)
      {
      return FALSE;
      }


    IdCM200_GSM1900_NS=ibdev(0,GpibAdd,SECONDARY_ADDR_GSM1900_NS,10,1,0);
    if(IdCM200_GSM1900_NS==IBDEV_ERROR)
      {
      return FALSE;
      }
	  ibln(IdCM200_GSM1900_NS, GpibAdd, SECONDARY_ADDR_GSM1900_NS, &result);
	  if(result==0)
      {
      return FALSE;
      }
  #endif    //weidg  

	  }
  return TRUE;
  }



//***************
//------------- SetupInstrument()
//***************
BOOL measure::SetupInstrument()
  {
  char buf[256];
  char buf0[256];
  char buf1[256];
  double freq_offset[1];
  double loss_offset[1];
  int i;

  loss_offset[0]=cable_loss;
  freq_offset[0]=800000000.0;

	if(tester_type==AGT8960)
    {
//------------------- AGT8960

		switch(band)
      {
			case GSM:
        {
        age1960_cellBand(vi_instr, age1960_CELL_1, age1960_PGSM_BAND);
				break;
        }
			case DCS:
        {
        age1960_cellBand(vi_instr, age1960_CELL_1, age1960_DCS1800_BAND);
				break;
        }
			case PCS:
        {
        age1960_cellBand(vi_instr, age1960_CELL_1, age1960_PCS1900_BAND);
				break;
        }
			case GSM850:
		{
		age1960_cellBand(vi_instr, age1960_CELL_1, age1960_GSM850_BAND);
				break;
		}
			default: break;
      } // end switch

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -