📄 cal_dll.cpp
字号:
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 + -