📄 calapi.cpp
字号:
// calapi.cpp
// Copyright Mobilink Telecom 1999,2000
//
// June 27, 2000
// Version 6.02
// Added cable loss
//
#include <stdio.h>
#include <stdlib.h>
#include <io.h>
#include <math.h>
#include <time.h>
#include "caltypes.h"
#include "error.h"
#include "HS.h" // headers for handset comm routines
#include "measure.h" // headers for measurement routines
#include "cal_class.h" // headers for cal algorithm
#include "decl-32.h"
#include "calapi.h"
#include "assert.h"
#include "UIapi.h"
//#include "user_params.h"
#include "property.h"
#define GSM_RAMP_START 66
#define GSM_RAMP_END 68
#define DCS_RAMP_START 66
#define DCS_RAMP_END 73
#define PCS_RAMP_START 66
#define PCS_RAMP_END 73
#define PI 3.14159
#define IS_DCS_1800( f ) ( (f >= 512) && (f <= 885))
#define HP_ERROR_CODE (-1)
#define HP_GPIB_ADD 7
#define IBDEV_ERROR (-1)
#define BAND_NUM 2
#define RAMP_TABLE_SIZE 19
#define FULL_GSM_RAMP_STEPS 15
#define FULL_DCS_RAMP_STEPS 16
#define FULL_PCS_RAMP_STEPS 16
#define TWO_STEPS 2
#define NORM_DB 110
#define INVALID_NUM 0xffff
#define NO_POWER_THRESH 9
#define RAMP_LENGTH 32 // entries in 1 ramp
#define GSYS_SIZE 64
#define MIN_GSYS_34 -2000
#define MAX_GSYS_34 2000
UserDefParm_t CurParm;
unsigned report_error(Error_t error);
// these are the power levels as a function of the tx ramp index, NOT the tx power level
// gsm ramp index 0 maps to GSM power levels 0-2
// gsm ramp index 1 maps to GSM power level 3
// gsm ramp index 2 maps to GSM power level 4
// gsm ramp index 3 maps to GSM power level 5 - the first "real" level
// ...
// gsm ramp index 16 maps to GSM power level 18
// gsm ramp index 17 maps to GSM power levels 19-31 - 19 is the last "real" level
//
// dcs ramp index 0 maps to
// dcs ramp index 1 maps to
// dcs ramp index 2 maps to
// dcs ramp index 3 maps to DCS power level 0 (29.5 dBm)
// dcs ramp index 4 maps to DCS power level 1 (28 dBm)
// ...
// dcs ramp index 17 maps to DCS power level 14 (2 dBm)
// dcs ramp index 18 maps to DCS power level 15 (0 dBm)
// PCS will use the DCS entries
static const float TargetTxPwrValue[4][RAMP_TABLE_SIZE]=
{ //0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
{32.5, 32.5, 32.5, 32.5, 31, 29, 27, 25, 23, 21, 19, 17, 15, 13, 11, 9, 7, 5, 5}, //GSM
{29.5, 29.5, 29.5, 29.5, 28, 26, 24, 22, 20, 18, 16, 14, 12, 10, 8, 6, 4, 2, 0}, //DCS
{29.5, 29.5, 29.5, 29.5, 28, 26, 24, 22, 20, 18, 16, 14, 12, 10, 8, 6, 4, 2, 0},
{32.5, 32.5, 32.5, 32.5, 31, 29, 27, 25, 23, 21, 19, 17, 15, 13, 11, 9, 7, 5, 5}
};
static Error_t PerRunInit(void);
// instantiate a cal_object
// this encapsulates all the resources required to calibrate
// a single phone, including handset communications and
// instruments
static cal cal_object;
//******************************************************************************
//
// Function Name:
//
// Description:
//
// Notes:
//
//*******************************************************************************
void CAL_Exec(void)
{
char OutputFilename[1024];
char ParamTemplateFilename[1024];
Error_t error;
FILE *DefaultSysgainFileP;
if(UI_IsAbort())
{
if(UI_Error("User abort.")==IDNO)
{
cal_object.cal_hs.HS_CloseComPort();
cal_object.cal_measure.Disconnect();
return;
}
}
//Initialization
CurParm.com_port=INVALID_NUM;
// CurParm.gpib_address=INVALID_NUM;
error=PerRunInit();
if(error==COMM_INIT_ERROR)
{
UI_ErrorQuit("Couldn't open comm port - can't continue.");
cal_object.cal_hs.HS_CloseComPort();
cal_object.cal_measure.Disconnect();
return;
}
else if(error==GPIB_INIT_ERROR)
{
UI_ErrorQuit("Couldn't communicate with GPIB instrument - check its address and cabling.\nCan't continue.");
cal_object.cal_hs.HS_CloseComPort();
cal_object.cal_measure.Disconnect();
return;
}
// initialize and enable SIO logging
cal_object.InitializeLogFile(); // use default (c:log.txt)
cal_object.EnableLogging(TRUE);
// if rx cal is disabled, make sure that default file can be opened
if(CurParm.cal_rx==0)
{
if((DefaultSysgainFileP = fopen(DEFAULT_SYSGAIN_FILE, "r")) == NULL )
{
UI_ErrorQuit("Couldn't open sysgain default file.");
cal_object.cal_hs.HS_CloseComPort();
cal_object.cal_measure.Disconnect();
return;
}
fclose(DefaultSysgainFileP);
}
//-------------- set up instrument for GSM
if(CurParm.cal_gsm)
{
cal_object.SetBand(DCS); //weidg
cal_object.cal_measure.SetBand(DCS);
cal_object.cal_measure.Cmu_band_connect();
cal_object.cal_measure.Cmu_band_abort();
cal_object.SetBand(PCS);
cal_object.cal_measure.SetBand(PCS);
cal_object.cal_measure.Cmu_band_connect();
cal_object.cal_measure.Cmu_band_abort(); //weidg
cal_object.SetBand(GSM);
cal_object.cal_measure.SetBand(GSM);
cal_object.cal_measure.Cmu_band_connect(); //weidg
cal_object.cal_measure.Cmu_band_abort(); //weidg
cal_object.cal_measure.Cmu_band_connect();
cal_object.cal_measure.SetCableLoss(-1.0*CurParm.gsm_tx_cable_loss);
cal_object.cal_measure.SetChannel((unsigned int)CurParm.gsm_test_channel);
cal_object.cal_measure.SetupInstrument();
// set up phone for GSM
cal_object.cal_hs.HS_SetBand(GSM);
cal_object.cal_hs.HS_SetArfcn(CurParm.gsm_test_channel);
// check phone output to make sure it's alive
{
float tx_power;
UI_SetStatusBarText("Checking gross Tx functionality in GSM");
cal_object.cal_hs.HS_SetTxLev(10);
cal_object.cal_hs.HS_SetStart();
if(cal_object.cal_measure.GetTxPower(18,&tx_power)==FALSE) //was 10 weidg
{
if(report_error(POWER_ERROR)==IDNO)
{
cal_object.cal_hs.HS_CloseComPort();
cal_object.cal_measure.Disconnect();
return;
}
}
}
// calibrate the AFC
UI_SetStatusBarText("Calibrating AFC");
error=cal_object.CalFreqDac();
if(report_error(error)==IDNO)
{
cal_object.cal_hs.HS_CloseComPort();
cal_object.cal_measure.Disconnect();
return;
}
if(UI_IsAbort())
{
if(UI_Error("User abort.")==IDNO)
{
cal_object.cal_hs.HS_CloseComPort();
cal_object.cal_measure.Disconnect();
return;
}
}
// check frequency and phase error
UI_SetStatusBarText("Testing phase & freq error");
error=cal_object.TestFreqPhase();
if(report_error(error)==IDNO)
{
cal_object.cal_hs.HS_CloseComPort();
cal_object.cal_measure.Disconnect();
return;
}
// calibrate Tx for GSM
UI_SetStatusBarText("Calibrating GSM Tx");
error=cal_object.CalTxGsm(CurParm);
if(report_error(error)==IDNO)
{
cal_object.cal_hs.HS_CloseComPort();
cal_object.cal_measure.Disconnect();
return;
}
if(UI_IsAbort())
{
if(UI_Error("User abort.")==IDNO)
{
cal_object.cal_hs.HS_CloseComPort();
cal_object.cal_measure.Disconnect();
return;
}
}
// calibrate Rx for GSM
if(CurParm.cal_rx)
{
UI_SetStatusBarText("Calibrating GSM Rx");
// switch cable loss to Rx value
cal_object.cal_measure.SetCableLoss(-1.0*CurParm.gsm_rx_cable_loss);
error=cal_object.CalRxGsm();
cal_object.cal_measure.Cmu_band_abort(); //weidg
if(report_error(error)==IDNO)
{
cal_object.cal_hs.HS_CloseComPort();
cal_object.cal_measure.Disconnect();
return;
}
} // end if user choose to run Rx calibration
if(UI_IsAbort())
{
if(UI_Error("User abort.")==IDNO)
{
cal_object.cal_hs.HS_CloseComPort();
cal_object.cal_measure.Disconnect();
return;
}
}
} // end if GSM calibration is enabled
if(CurParm.cal_gsm850)
{
cal_object.SetBand(DCS); //weidg
cal_object.cal_measure.SetBand(DCS);
cal_object.cal_measure.Cmu_band_connect();
cal_object.cal_measure.Cmu_band_abort();
cal_object.SetBand(PCS);
cal_object.cal_measure.SetBand(PCS);
cal_object.cal_measure.Cmu_band_connect();
cal_object.cal_measure.Cmu_band_abort(); //weidg
cal_object.SetBand(GSM850);
cal_object.cal_measure.SetBand(GSM850);
cal_object.cal_measure.Cmu_band_connect(); //weidg
cal_object.cal_measure.Cmu_band_abort(); //weidg
cal_object.cal_measure.Cmu_band_connect();
cal_object.cal_measure.SetCableLoss(-1.0*CurParm.gsm850_tx_cable_loss);
cal_object.cal_measure.SetChannel((unsigned int)CurParm.gsm850_test_channel);
cal_object.cal_measure.SetupInstrument();
// set up phone for GSM
cal_object.cal_hs.HS_SetBand(GSM850);
cal_object.cal_hs.HS_SetArfcn(CurParm.gsm850_test_channel);
// check phone output to make sure it's alive
{
float tx_power;
UI_SetStatusBarText("Checking gross Tx functionality in GSM850");
cal_object.cal_hs.HS_SetTxLev(10);
cal_object.cal_hs.HS_SetStart();
if(cal_object.cal_measure.GetTxPower(18,&tx_power)==FALSE) //was 10 weidg
{
if(report_error(POWER_ERROR)==IDNO)
{
cal_object.cal_hs.HS_CloseComPort();
cal_object.cal_measure.Disconnect();
return;
}
}
}
// calibrate the AFC
UI_SetStatusBarText("Calibrating AFC");
error=cal_object.CalFreqDac();
if(report_error(error)==IDNO)
{
cal_object.cal_hs.HS_CloseComPort();
cal_object.cal_measure.Disconnect();
return;
}
if(UI_IsAbort())
{
if(UI_Error("User abort.")==IDNO)
{
cal_object.cal_hs.HS_CloseComPort();
cal_object.cal_measure.Disconnect();
return;
}
}
// check frequency and phase error
UI_SetStatusBarText("Testing phase & freq error");
error=cal_object.TestFreqPhase();
if(report_error(error)==IDNO)
{
cal_object.cal_hs.HS_CloseComPort();
cal_object.cal_measure.Disconnect();
return;
}
// calibrate Tx for GSM
UI_SetStatusBarText("Calibrating GSM850 Tx");
error=cal_object.CalTxGsm850(CurParm);
if(report_error(error)==IDNO)
{
cal_object.cal_hs.HS_CloseComPort();
cal_object.cal_measure.Disconnect();
return;
}
if(UI_IsAbort())
{
if(UI_Error("User abort.")==IDNO)
{
cal_object.cal_hs.HS_CloseComPort();
cal_object.cal_measure.Disconnect();
return;
}
}
// calibrate Rx for GSM
if(CurParm.cal_rx)
{
UI_SetStatusBarText("Calibrating GSM850 Rx");
// switch cable loss to Rx value
cal_object.cal_measure.SetCableLoss(-1.0*CurParm.gsm850_rx_cable_loss);
error=cal_object.CalRxGsm850();
cal_object.cal_measure.Cmu_band_abort(); //weidg
if(report_error(error)==IDNO)
{
cal_object.cal_hs.HS_CloseComPort();
cal_object.cal_measure.Disconnect();
return;
}
} // end if user choose to run Rx calibration
if(UI_IsAbort())
{
if(UI_Error("User abort.")==IDNO)
{
cal_object.cal_hs.HS_CloseComPort();
cal_object.cal_measure.Disconnect();
return;
}
}
} // end if GSM850 calibration is enabled
//-------------- set up for DCS
if(CurParm.cal_dcs)
{
UI_SetStatusBarText("Switching to DCS");
cal_object.SetBand(DCS);
cal_object.cal_measure.SetBand(DCS);
cal_object.cal_measure.Cmu_band_connect(); //weidg
cal_object.cal_measure.SetCableLoss(-1.0*CurParm.dcs_tx_cable_loss);
cal_object.cal_measure.SetChannel((unsigned int)CurParm.dcs_test_channel);
cal_object.cal_measure.SetupInstrument();
// set up phone for DCS
cal_object.cal_hs.HS_SetStop();
cal_object.cal_hs.HS_SetBand(DCS);
cal_object.cal_hs.HS_SetArfcn(CurParm.dcs_test_channel);
// check phone output to make sure it's alive
{
float tx_power;
UI_SetStatusBarText("Checking gross Tx functionality in DCS");
cal_object.cal_hs.HS_SetTxLev(5);
cal_object.cal_hs.HS_SetStart();
if(cal_object.cal_measure.GetTxPower(18,&tx_power)==FALSE)
{
if(report_error(POWER_ERROR)==IDNO)
{
cal_object.cal_hs.HS_CloseComPort();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -