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

📄 calapi.cpp

📁 这是一个手机校准程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -