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

📄 cal_dll.cpp

📁 这是一个手机校准程序
💻 CPP
📖 第 1 页 / 共 4 页
字号:

	for(j=0,i=gsm_gsys_rx_cal_index[0];i<GSYS_SIZE;j++,i++) // decrease values in steps of 32 from last index to 63
		cal_data.GSMRxPwr[i]=cal_data.GSMRxPwr[gsm_gsys_rx_cal_index[0]]-j*32;
	for(j=0,i=gsm_gsys_rx_cal_index[NUMBER_OF_RX_CAL_POINTS-1];i>=0;i--,j++)                 // decrease values in steps of 32 from 0 to 1st index
		cal_data.GSMRxPwr[i]=cal_data.GSMRxPwr[gsm_gsys_rx_cal_index[NUMBER_OF_RX_CAL_POINTS-1]]+j*32;

	cal_measure.SetRxPower((float)rx_cal_pwr[0]);
  return SUCCESS;
  }

//---------------- DCS Rx Calibration
Error_t cal::CalRxDcs()
  {
//	int rx_cal_pwr[NUMBER_OF_RX_CAL_POINTS]={-94,-88,-72,-56,-40,-24};
	int rx_cal_pwr[NUMBER_OF_RX_CAL_POINTS]={-82,-48};
	int gsys_rx_cal_index[NUMBER_OF_RX_CAL_POINTS];
	int gsys_delta[NUMBER_OF_RX_CAL_POINTS];
	Int16 i;
	int gsys_34;	// value of gsys[band][34]
	int x0,x1,y0,y1;
	int j;
	float slope;
	UInt16 Rxlev;
   
// do the cal at 6 points 
// power levels =-94,-88,-72,-56,-40,-24 dBm 
//
// agc setting 87 (pwr=-23 dBm) - correct rxlev=87
// agc setting 23 (pwr=-87 dBm) - correct rxlev=23
   if(cal_hs.HS_GetHSCurGsys(band,34,&gsys_34)==FALSE)
	  {
		return DCS_GSYS_34_ERROR;
	  }
	for(i=0;i<NUMBER_OF_RX_CAL_POINTS;i++)
    {
	  cal_measure.SetRxPower((float)rx_cal_pwr[i]);

	  cal_hs.HS_SetStop();
	  cal_hs.HS_SetRxAgc(110+rx_cal_pwr[i]);
	  Sleep(100);
	  cal_hs.HS_SetStart();
	  Sleep(2000);
	  cal_hs.HS_GetHSRxlev(&Rxlev);
	  gsys_delta[i]=110+rx_cal_pwr[i]-Rxlev;
	  gsys_rx_cal_index[i]=34-(16*(110+rx_cal_pwr[i])-gsys_34-1200)/32;
    }
// build the correction table
  for(i=0;i<NUMBER_OF_RX_CAL_POINTS-1;i++)
    {
		x0=gsys_rx_cal_index[i];
		x0=min(x0,GSYS_SIZE-1);

		x1=gsys_rx_cal_index[i+1];
		x1=min(x1,GSYS_SIZE-1);

		y0=gsys_delta[i];
		y1=gsys_delta[i+1];
		slope=(float)(y1-y0)/(float)(x1-x0);
		if(x0<0 || x0>GSYS_SIZE || x1 <0 || x1>GSYS_SIZE)
      {
			return DCS_RXLEV_INDEX_ERROR;
      }
		for(j=x0;j>x1;j--)
      {
			cal_data.DCSRxPwrDelta[j]=(int)(16*((float)y0+(slope*(j-x0))));
      }
    }
// fill in ends of table
	for(i=gsys_rx_cal_index[0];i<GSYS_SIZE;i++)
		cal_data.DCSRxPwrDelta[i]=16*gsys_delta[0];
	for(i=0;i<=gsys_rx_cal_index[NUMBER_OF_RX_CAL_POINTS-1];i++)
		cal_data.DCSRxPwrDelta[i]=16*gsys_delta[NUMBER_OF_RX_CAL_POINTS-1];

// although it would be nice to add the delta to each value in the existing table, it's
// too slow to read each value, add the delta to it, and write it back (don't know if that's
// because of the radio's response time, the serial i/f speed, or the logging of the operations
// to the SIO window). Instead, I'll read the system gain table at the same indices that I
// read the power at and build an interpolated table based on those readings, add the deltas
// and write the whole thing out. 
  for(i=0;i<NUMBER_OF_RX_CAL_POINTS-1;i++)
    {
		x0=gsys_rx_cal_index[i];
		x0=min(x0,GSYS_SIZE-1);

		x1=gsys_rx_cal_index[i+1];
		x1=min(x1,GSYS_SIZE-1);

		if(cal_hs.HS_GetHSCurGsys(band,x0,&y0)==FALSE)
      {
			return GSYS_ERROR;
      }
		if(cal_hs.HS_GetHSCurGsys(band,x1,&y1)==FALSE)
      {
			return GSYS_ERROR;
      }

		slope=(float)(y1-y0)/(float)(x1-x0);
		for(j=x0;j>x1;j--)
      {
			cal_data.DCSRxPwr[j]=(int)((float)y0+(slope*(float)(j-x0)));
      }
    }
// fill in ends of interpolated power table
	if(cal_hs.HS_GetHSCurGsys(band,gsys_rx_cal_index[NUMBER_OF_RX_CAL_POINTS-1],&cal_data.DCSRxPwr[gsys_rx_cal_index[NUMBER_OF_RX_CAL_POINTS-1]])==FALSE)
    {
		return GSYS_ERROR;
    }

	for(j=0,i=gsys_rx_cal_index[0];i<GSYS_SIZE;j++,i++) // decrease values in steps of 32 from last index to 63
		cal_data.DCSRxPwr[i]=cal_data.DCSRxPwr[gsys_rx_cal_index[0]]-j*32;
	for(j=0,i=gsys_rx_cal_index[NUMBER_OF_RX_CAL_POINTS-1];i>=0;i--,j++)                 // decrease values in steps of 32 from 0 to 1st index
		cal_data.DCSRxPwr[i]=cal_data.DCSRxPwr[gsys_rx_cal_index[NUMBER_OF_RX_CAL_POINTS-1]]+j*32;

	cal_measure.SetRxPower((float)rx_cal_pwr[0]);
  return SUCCESS;
  }

//---------------- PCS Rx Calibration
Error_t cal::CalRxPcs()
  {
//	int rx_cal_pwr[NUMBER_OF_RX_CAL_POINTS]={-94,-88,-72,-56,-40,-24};
	int rx_cal_pwr[NUMBER_OF_RX_CAL_POINTS]={-82,-48};
	int gsys_rx_cal_index[NUMBER_OF_RX_CAL_POINTS];
	int gsys_delta[NUMBER_OF_RX_CAL_POINTS];
	Int16 i;
	int gsys_34;	// value of gsys[band][34]
	int x0,x1,y0,y1;
	int j;
	float slope;
	UInt16 Rxlev;
   
// do the cal at 6 points 
// power levels =-94,-88,-72,-56,-40,-24 dBm 
//
// agc setting 87 (pwr=-23 dBm) - correct rxlev=87
// agc setting 23 (pwr=-87 dBm) - correct rxlev=23
   if(cal_hs.HS_GetHSCurGsys(band,34,&gsys_34)==FALSE)
	  {
		return PCS_GSYS_34_ERROR;
	  }
	for(i=0;i<NUMBER_OF_RX_CAL_POINTS;i++)
    {
	  cal_measure.SetRxPower((float)rx_cal_pwr[i]);

	  cal_hs.HS_SetStop();
	  cal_hs.HS_SetRxAgc(110+rx_cal_pwr[i]);
	  Sleep(100);
	  cal_hs.HS_SetStart();
	  Sleep(2000);
	  cal_hs.HS_GetHSRxlev(&Rxlev);
	  gsys_delta[i]=110+rx_cal_pwr[i]-Rxlev;
	  gsys_rx_cal_index[i]=34-(16*(110+rx_cal_pwr[i])-gsys_34-1200)/32;
    }
// build the correction table
  for(i=0;i<NUMBER_OF_RX_CAL_POINTS-1;i++)
    {
		x0=gsys_rx_cal_index[i];
		x0=min(x0,GSYS_SIZE-1);

		x1=gsys_rx_cal_index[i+1];
		x1=min(x1,GSYS_SIZE-1);

		y0=gsys_delta[i];
		y1=gsys_delta[i+1];
		slope=(float)(y1-y0)/(float)(x1-x0);
		if(x0<0 || x0>GSYS_SIZE || x1 <0 || x1>GSYS_SIZE)
      {
			return PCS_RXLEV_INDEX_ERROR;
      }
		for(j=x0;j>x1;j--)
      {
			cal_data.PCSRxPwrDelta[j]=(int)(16*((float)y0+(slope*(j-x0))));
      }
    }
// fill in ends of table
	for(i=gsys_rx_cal_index[0];i<GSYS_SIZE;i++)
		cal_data.PCSRxPwrDelta[i]=16*gsys_delta[0];
	for(i=0;i<=gsys_rx_cal_index[NUMBER_OF_RX_CAL_POINTS-1];i++)
		cal_data.PCSRxPwrDelta[i]=16*gsys_delta[NUMBER_OF_RX_CAL_POINTS-1];

// although it would be nice to add the delta to each value in the existing table, it's
// too slow to read each value, add the delta to it, and write it back (don't know if that's
// because of the radio's response time, the serial i/f speed, or the logging of the operations
// to the SIO window). Instead, I'll read the system gain table at the same indices that I
// read the power at and build an interpolated table based on those readings, add the deltas
// and write the whole thing out. 
  for(i=0;i<NUMBER_OF_RX_CAL_POINTS-1;i++)
    {
		x0=gsys_rx_cal_index[i];
		x0=min(x0,GSYS_SIZE-1);

		x1=gsys_rx_cal_index[i+1];
		x1=min(x1,GSYS_SIZE-1);

		if(cal_hs.HS_GetHSCurGsys(band,x0,&y0)==FALSE)
      {
			return GSYS_ERROR;
      }
		if(cal_hs.HS_GetHSCurGsys(band,x1,&y1)==FALSE)
      {
			return GSYS_ERROR;
      }

		slope=(float)(y1-y0)/(float)(x1-x0);
		for(j=x0;j>x1;j--)
      {
			cal_data.PCSRxPwr[j]=(int)((float)y0+(slope*(float)(j-x0)));
      }
    }
// fill in ends of interpolated power table
	if(cal_hs.HS_GetHSCurGsys(band,gsys_rx_cal_index[NUMBER_OF_RX_CAL_POINTS-1],&cal_data.PCSRxPwr[gsys_rx_cal_index[NUMBER_OF_RX_CAL_POINTS-1]])==FALSE)
    {
		return GSYS_ERROR;
    }

	for(j=0,i=gsys_rx_cal_index[0];i<GSYS_SIZE;j++,i++) // decrease values in steps of 32 from last index to 63
		cal_data.PCSRxPwr[i]=cal_data.PCSRxPwr[gsys_rx_cal_index[0]]-j*32;
	for(j=0,i=gsys_rx_cal_index[NUMBER_OF_RX_CAL_POINTS-1];i>=0;i--,j++)                 // decrease values in steps of 32 from 0 to 1st index
		cal_data.PCSRxPwr[i]=cal_data.PCSRxPwr[gsys_rx_cal_index[NUMBER_OF_RX_CAL_POINTS-1]]+j*32;

	cal_measure.SetRxPower((float)rx_cal_pwr[0]);
  return SUCCESS;
  }

  //---------------- GSM850 Rx Calibration
Error_t cal::CalRxGsm850()
  {
//	int rx_cal_pwr[NUMBER_OF_RX_CAL_POINTS]={-94,-88,-72,-56,-40,-24};
	int rx_cal_pwr[NUMBER_OF_RX_CAL_POINTS]={-82,-48};
	int gsm850_gsys_rx_cal_index[NUMBER_OF_RX_CAL_POINTS];
	int gsm850_gsys_delta[NUMBER_OF_RX_CAL_POINTS];
	Int16 i;
	int gsys_34;	// value of gsys[band][34]
	int x0,x1,y0,y1;
	int j;
	float slope;
	UInt16 Rxlev;
   
// do the cal at 6 points 
// power levels =-94,-88,-72,-56,-40,-24 dBm 
//
// agc setting 87 (pwr=-23 dBm) - correct rxlev=87
// agc setting 23 (pwr=-87 dBm) - correct rxlev=23
   if(cal_hs.HS_GetHSCurGsys(band,34,&gsys_34)==FALSE)
	  {
		return GSM850_GSYS_34_ERROR;
	  }
	for(i=0;i<NUMBER_OF_RX_CAL_POINTS;i++)
    {
	  cal_measure.SetRxPower((float)rx_cal_pwr[i]);

	  cal_hs.HS_SetStop();
	  cal_hs.HS_SetRxAgc(110+rx_cal_pwr[i]);
	  Sleep(100);
	  cal_hs.HS_SetStart();
	  Sleep(2000);
	  cal_hs.HS_GetHSRxlev(&Rxlev);
	  gsm850_gsys_delta[i]=110+rx_cal_pwr[i]-Rxlev;
	  gsm850_gsys_rx_cal_index[i]=34-(16*(110+rx_cal_pwr[i])-gsys_34-1200)/32;
    }
// build the correction table
  for(i=0;i<NUMBER_OF_RX_CAL_POINTS-1;i++)
    {
		x0=gsm850_gsys_rx_cal_index[i];
		x0=min(x0,GSYS_SIZE-1);

		x1=gsm850_gsys_rx_cal_index[i+1];
		x1=min(x1,GSYS_SIZE-1);

		y0=gsm850_gsys_delta[i];
		y1=gsm850_gsys_delta[i+1];
		slope=(float)(y1-y0)/(float)(x1-x0);
		if(x0<0 || x0>GSYS_SIZE || x1 <0 || x1>GSYS_SIZE)
      {
			return GSM850_RXLEV_INDEX_ERROR;
      }
		for(j=x0;j>x1;j--)
      {
			cal_data.GSM850RxPwrDelta[j]=(int)(16*((float)y0+(slope*(j-x0))));
      }
    }
// fill in ends of table
	for(i=gsm850_gsys_rx_cal_index[0];i<GSYS_SIZE;i++)
		cal_data.GSM850RxPwrDelta[i]=16*gsm850_gsys_delta[0];
	for(i=0;i<=gsm850_gsys_rx_cal_index[NUMBER_OF_RX_CAL_POINTS-1];i++)
		cal_data.GSM850RxPwrDelta[i]=16*gsm850_gsys_delta[NUMBER_OF_RX_CAL_POINTS-1];

// although it would be nice to add the delta to each value in the existing table, it's
// too slow to read each value, add the delta to it, and write it back (don't know if that's
// because of the radio's response time, the serial i/f speed, or the logging of the operations
// to the SIO window). Instead, I'll read the system gain table at the same indices that I
// read the power at and build an interpolated table based on those readings, add the deltas
// and write the whole thing out. 
  for(i=0;i<NUMBER_OF_RX_CAL_POINTS-1;i++)
    {
		x0=gsm850_gsys_rx_cal_index[i];
		x0=min(x0,GSYS_SIZE-1);

		x1=gsm850_gsys_rx_cal_index[i+1];
		x1=min(x1,GSYS_SIZE-1);

		if(cal_hs.HS_GetHSCurGsys(band,x0,&y0)==FALSE)
      {
			return GSYS_ERROR;
      }
		if(cal_hs.HS_GetHSCurGsys(band,x1,&y1)==FALSE)
      {
			return GSYS_ERROR;
      }

		slope=(float)(y1-y0)/(float)(x1-x0);
		for(j=x0;j>x1;j--)
      {
			cal_data.GSM850RxPwr[j]=(int)((float)y0+(slope*(float)(j-x0)));
      }
    }
// fill in ends of interpolated power table
	if(cal_hs.HS_GetHSCurGsys(band,gsm850_gsys_rx_cal_index[NUMBER_OF_RX_CAL_POINTS-1],&cal_data.GSM850RxPwr[gsm850_gsys_rx_cal_index[NUMBER_OF_RX_CAL_POINTS-1]])==FALSE)
    {
		return GSYS_ERROR;
    }

	for(j=0,i=gsm850_gsys_rx_cal_index[0];i<GSYS_SIZE;j++,i++) // decrease values in steps of 32 from last index to 63
		cal_data.GSM850RxPwr[i]=cal_data.GSM850RxPwr[gsm850_gsys_rx_cal_index[0]]-j*32;
	for(j=0,i=gsm850_gsys_rx_cal_index[NUMBER_OF_RX_CAL_POINTS-1];i>=0;i--,j++)                 // decrease values in steps of 32 from 0 to 1st index
		cal_data.GSM850RxPwr[i]=cal_data.GSM850RxPwr[gsm850_gsys_rx_cal_index[NUMBER_OF_RX_CAL_POINTS-1]]+j*32;

	cal_measure.SetRxPower((float)rx_cal_pwr[0]);
  return SUCCESS;
  }


//*******************************************************************************
Error_t cal::GenReport(char OutputFilename[256], char ParamTemplateFilename[256], UserDefParm_t parms)
  {
  FILE *ReportFileP, *StandFileP, *DefaultSysgainFileP;
	Int16	i,j;
	Int16	FirstGsys;
	Int16 gsys_entry;	// added 10/1
	double D26_D25;
	double D27_D25;
	double  RampPoint;
	Int16 Step;
	int stat;
  double avg_slope;


	ReportFileP = fopen(OutputFilename,"w");
  if(ReportFileP==NULL)
	  {
		return OUTPUT_FILE_ERROR;
	  }

	if((StandFileP = fopen(ParamTemplateFilename, "r")) == NULL )
	  {
		return TEMPLATE_FILE_ERROR;
	  }

//copy standFile to ReportFile

	for(;;)
	  {
		ch = fgetc(StandFileP);
		if(ch == EOF)
			break;
		if(!isascii(ch))
		  {
			return TEMPLATE_FILE_ERROR;
		  }
		if(fputc(ch, ReportFileP)==EOF)
		  {
			return OUTPUT_FILE_ERROR;
		  }
	  }

	fclose(StandFileP);

// 12/30/00 
// Version 6.29
// if user chooses not to calibrate rx, copy from default file to report file
  if(parms.cal_rx==0)
    {
    if((DefaultSysgainFileP = fopen(DEFAULT_SYSGAIN_FILE, "r")) == NULL )
      {
		  return DEFAULT_SYSGAIN_FILE_ERROR;
      }
//copy rx sysgain default file to ReportFile

	  for(;;)
      {
		  ch = fgetc(DefaultSysgainFileP);
		  if(ch == EOF)
			  break;
		  if(!isascii(ch))
        {
			  return DEFAULT_SYSGAIN_FILE_ERROR;
        }
		  if(fputc(ch, ReportFileP)==EOF)
        {
			  return OUTPUT_FILE_ERROR;
        }
      }
    } // end if no rx cal




// append 
	fprintf(ReportFileP, "//***********************************************************************************\n");
	fprintf(ReportFileP,"// Setup FREQ DAC VALUE\n");
	fprintf(ReportFileP, "//***********************************************************************************\n");
	fprintf(ReportFileP,"FREQ_DAC_ZERO	0x%x\n", cal_data.FreqDacZero);
	fprintf(ReportFileP,"FREQ_DAC_LSB	%d\n", cal_data.FreqDacLsb);
	fprintf(ReportFileP,"FREQ_DAC_MULT	%d\n", cal_data.FreqDacMulti);
	fprintf(ReportFileP,"FREQ_DAC_SHIFT	%d\n", cal_data.FreqDacShift);

⌨️ 快捷键说明

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