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

📄 rf_agc.cpp

📁 关于MTK 的MATA开发工具的RF源码
💻 CPP
字号:
//#include "meta2.h"
#include "form_Main.h"
#include <IniFiles.hpp>
#include "rf_agc.h"
#include "man_timer.h"
#include "man_fdm.h"
#include "man_active.h"
#include "misc.h"
//===========================================================================

static CRFAGC*  rf_agc_ptr;
extern TfrmMainSel *frmMainSel;
//===========================================================================
static void  CNF_ReadFromNVRAM( void )
{
  rf_agc_ptr->CNF_ReadFromNVRAM( );
}

static  void  CNF_WriteToNVRAM( void )
{  
   rf_agc_ptr->CNF_WriteToNVRAM( );
}

static void  REQ_TimeOut( void )
{  rf_agc_ptr->REQ_TimeOut();
}

static void  REQ_Finish( void )
{  rf_agc_ptr->REQ_Finish();
}

//===========================================================================

CRFAGC::CRFAGC( void )
{
   IsRunning = false;
   ConfirmCallback = 0;

   AgcBufSize = 0;
   AgcBuf = 0;
}
//---------------------------------------------------------------------------

CRFAGC::~CRFAGC()
{
   IsRunning = false;
   ConfirmCallback = 0;
   if(AgcBuf)
   {
      delete [] AgcBuf;
      AgcBuf = NULL;
   }
}
//---------------------------------------------------------------------------

void  CRFAGC::REQ_Finish( void )
{
   if(!IsRunning)  return;

   TimerMan->CounterStop();
   Confirm( STATE_AGC_OK );
   IsRunning = false;
}
//---------------------------------------------------------------------------

void  CRFAGC::REQ_Stop( void )
{
   if(!IsRunning)  return;

   TimerMan->CounterStop();
   NVRAMMan->REQ_Stop();
   Confirm( STATE_AGC_STOP );
   IsRunning = false;
}
//---------------------------------------------------------------------------

void  CRFAGC::REQ_TimeOut( void )
{
   if(!IsRunning)  return;

   TimerMan->CounterStop();
   NVRAMMan->REQ_Stop();
   Confirm( STATE_AGC_TIMEOUT );
   IsRunning = false;
}
//---------------------------------------------------------------------------

void  CRFAGC::Confirm( int confirm_state )
{
   if(!IsRunning)  return;

   if(ConfirmCallback==0)  return;
   ConfirmState = confirm_state;
   ActiveMan->SetActiveFunction( ConfirmCallback );
}
//===========================================================================
void  CRFAGC::REQ_Read_From_NVRAM( void )
{
   rf_agc_ptr = this;
   IsRunning = true;

   if(AgcBuf==0)
   {

	  MetaResult = META_NVRAM_agcPathLoss_Len( &AgcBufSize );
      if(MetaResult!=META_SUCCESS)
      {  Confirm( STATE_AGC_FAIL );  return;  }
      AgcBuf = new  char[AgcBufSize];
   }


   NVRAMMan->ConfirmCallback = ::CNF_ReadFromNVRAM;

   NVRAMMan->REQ_ReadNVRAM_Start( "NVRAM_EF_L1_AGCPATHLOSS_LID",
                              1, // only 1 record
                              AgcBufSize,
                              AgcBuf );							  
}
//-------------------------------------

void  CRFAGC::CNF_ReadFromNVRAM( void )
{
   if(!IsRunning)  return;


int  state = NVRAMMan->ConfirmState;


if(state==STATE_NVRAM_OK)
   {


												   
		MetaResult = META_NVRAM_Decompose_agcPathLoss( &AgcPathLoss,
                                                   AgcBuf,
                                                   AgcBufSize );										   
      if(MetaResult!=META_SUCCESS)
      {  Confirm( STATE_AGC_FAIL );  return;  }

      ActiveMan->SetActiveFunction( ::REQ_Finish );
   }

else if(state==STATE_NVRAM_TIMEOUT)
   {   Confirm( STATE_AGC_TIMEOUT );
   }

else if(state==STATE_NVRAM_STOP)
   {   Confirm( STATE_AGC_STOP );
   }
   else
   {   Confirm( STATE_AGC_FAIL );
   }
}
//===========================================================================

void  CRFAGC::REQ_Write_To_NVRAM( void )
{
   rf_agc_ptr = this;
   IsRunning = true;

   if(AgcBuf==0)
   {

	  MetaResult = META_NVRAM_agcPathLoss_Len( &AgcBufSize );
      if(MetaResult!=META_SUCCESS)
      {  Confirm( STATE_AGC_FAIL );  return;  }
      AgcBuf = new  char[AgcBufSize];
   }


  
   MetaResult = META_NVRAM_Compose_agcPathLoss( &AgcPathLoss,
                                              AgcBuf,
                                              AgcBufSize );										  
											  
   if(MetaResult!=META_SUCCESS)
   {  Confirm( STATE_AGC_FAIL );  return;  }


  NVRAMMan->ConfirmCallback = ::CNF_WriteToNVRAM;

	NVRAMMan->REQ_WriteNVRAM_Start("NVRAM_EF_L1_AGCPATHLOSS_LID",
	                           1, // only 1 record
                               AgcBufSize,
                               AgcBuf );						   
}
//-------------------------------------


void  CRFAGC::CNF_WriteToNVRAM( void )
{
   if(!IsRunning)  return;


int  state = NVRAMMan->ConfirmState;


if(state==STATE_NVRAM_OK)
   {
      ActiveMan->SetActiveFunction( ::REQ_Finish );
   }

   else if(state==STATE_NVRAM_TIMEOUT)
   {  Confirm( STATE_AGC_TIMEOUT );
   }
 
  else if(state==STATE_NVRAM_STOP)
   {  Confirm( STATE_AGC_STOP );
   }
   else
   {  Confirm( STATE_AGC_FAIL );
   }
}
//===========================================================================

static const char  SUBBAND_NAME[][32] =
{
   "GSM400 Sub band, RX loss",
   "GSM850 Sub band, RX loss",
   "GSM900 Sub band, RX loss",
   "DCS1800 Sub band, RX loss",
   "PCS1900 Sub band, RX loss",
};

bool  CRFAGC::REQ_Read_From_File( char *filename )
{
   TIniFile   *ini_file;
   AnsiString  data;
   char        str[2048];
   int         idata[PLTABLE_SIZE];
   float       fdata[PLTABLE_SIZE];
   int         i, band;
   int         FrequencyBandStart;
   
   ini_file = new TIniFile( filename );
   if(ini_file != NULL) // added by Andy Ueng
   {
       if(frmMainSel->cbGSM850->Checked)
       {
           FrequencyBandStart = FrequencyBand850;
       }
       else
       {   FrequencyBandStart = FrequencyBand900;
       }
       for( band = FrequencyBandStart; band<=FrequencyBand1900; band++)
       {
           data = ini_file->ReadString( SUBBAND_NAME[band],
                                   "Max ARFCN",
                                   "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1");
           strcpy( str, data.c_str() );
           String_To_Array_int( str, idata, PLTABLE_SIZE );
           idata[ PLTABLE_SIZE-1 ] = -1;
           for(i=0; i<PLTABLE_SIZE; i++)
           {  AgcPathLoss.agcPathLoss[band][i].max_arfcn = idata[i];
           }

           data = ini_file->ReadString( SUBBAND_NAME[band],
                                   "RX loss",
                                   "0,0,0,0,0,0,0,0,0,0,0,0");
           strcpy( str, data.c_str() );
           String_To_Array_float( str, fdata, PLTABLE_SIZE );
           fdata[ PLTABLE_SIZE-1 ] = 0;
           for(i=0; i<PLTABLE_SIZE; i++)
           {  AgcPathLoss.agcPathLoss[band][i].gain_offset = (int)(fdata[i]*GAIN_SCALE);
           }
       }
       delete  ini_file;
   }
   return( true );
}
//===========================================================================

bool  CRFAGC::REQ_Write_To_File( char *filename )
{
   TIniFile   *ini_file;
   char        str[2048];
   int         idata[PLTABLE_SIZE];
   float       fdata[PLTABLE_SIZE];
   int         i, band;
   int         FrequencyBandStart;

   ini_file = new TIniFile( filename );
   if(ini_file != NULL) // added by Andy Ueng
   {
       if(frmMainSel->cbGSM850->Checked)
       {
          FrequencyBandStart = FrequencyBand850;
       }
       else
       {    FrequencyBandStart = FrequencyBand900;
       }

       for( band = FrequencyBandStart; band<=FrequencyBand1900; band++)
       {
          for(i=0; i<PLTABLE_SIZE; i++)
          {  idata[i] = AgcPathLoss.agcPathLoss[band][i].max_arfcn;
          }
          Array_To_String_int( str, idata, PLTABLE_SIZE-1, ',' );
          ini_file->WriteString( SUBBAND_NAME[band],
                                 "Max ARFCN",
                                 str );

          for(i=0; i<PLTABLE_SIZE; i++)
          {  fdata[i] = AgcPathLoss.agcPathLoss[band][i].gain_offset*1.0/GAIN_SCALE;
          }
          Array_To_String_float( str, fdata, PLTABLE_SIZE-1, ',' );
          ini_file->WriteString( SUBBAND_NAME[band],
                                 "RX loss",
                                 str);
      }

      delete  ini_file;
   }
   return( true );
}
//===========================================================================

static const char  BAND_NAME[5][12] =
{  "GSM400",
   "GSM850",
   "GSM900",
   "DCS1800",
   "PCS1900"
};

bool  CRFAGC::REQ_Write_To_M12193( char *filename )
{
   FILE *fs;
   int  arfcn, loss;
   int  band, i;

   fs = fopen( filename, "a+t" );
   if(fs==0)  return(false);

   fprintf( fs, "/*----------------------------------------*/\n");
   fprintf( fs, "/* Calibration data for path loss of gain */\n");
   fprintf( fs, "/*----------------------------------------*/\n");
   fprintf( fs, "\n");
   for(band=2; band<5; band++)
   {

      fprintf( fs, "/* %s....................................................................*/\n", BAND_NAME[band] );
      fprintf( fs, "\n");
      fprintf( fs, "sAGCGAINOFFSET  AGC_PATHLOSS_%s[ PLTABLE_SIZE ] =\n", BAND_NAME[band] );
      fprintf( fs, "{\n");
      for( i=0; i<PLTABLE_SIZE-1; i++ )
      {  arfcn = AgcPathLoss.agcPathLoss[band][i].max_arfcn;
         loss  = AgcPathLoss.agcPathLoss[band][i].gain_offset;
         if( (arfcn<0)||(arfcn>1023) )    break;
         fprintf( fs, "    {   %4d, GAINLOSS( %.3f ) },\n", arfcn , (float)loss*1.0/GAIN_SCALE );
      }
      fprintf( fs, "    /*-------------------------*/\n");
      fprintf( fs, "    { TABLE_END }\n");
      fprintf( fs, "};\n");
      fprintf( fs, "\n");
   }
   fprintf( fs, "/*...........................................................................*/\n");
   fprintf( fs, "\n");
   fprintf( fs, "sAGCGAINOFFSET*  AGC_PATHLOSS_TABLE[] =\n");
   fprintf( fs, "{  0,                                 /*#FrequencyBand400  */\n");
   fprintf( fs, "   0,                                 /*#FrequencyBand850  */\n");
   fprintf( fs, "   AGC_PATHLOSS_GSM900,               /* FrequencyBand900  */\n");
   fprintf( fs, "   AGC_PATHLOSS_DCS1800,              /* FrequencyBand1800 */\n");
   fprintf( fs, "   AGC_PATHLOSS_PCS1900,              /* FrequencyBand1900 */\n");
   fprintf( fs, "};\n");
   fprintf( fs, "\n");

   fclose(fs);

   return(true);

}
//===========================================================================

⌨️ 快捷键说明

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