T_AFC.cpp
上传用户:gelin96
上传日期:2017-01-08
资源大小:20993k
文件大小:133k
源码类别:

MTK

开发平台:

C++ Builder

  1. /*****************************************************************************
  2. *  Copyright Statement:
  3. *  --------------------
  4. *  This software is protected by Copyright and the information contained
  5. *  herein is confidential. The software may not be copied and the information
  6. *  contained herein may not be used or disclosed except with the written
  7. *  permission of MediaTek Inc. (C) 2005
  8. *
  9. *  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
  10. *  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
  11. *  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
  12. *  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
  13. *  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
  14. *  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
  15. *  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
  16. *  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
  17. *  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
  18. *  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
  19. *  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
  20. *  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
  21. *
  22. *  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
  23. *  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
  24. *  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
  25. *  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
  26. *  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
  27. *
  28. *  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
  29. *  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
  30. *  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
  31. *  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
  32. *  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
  33. *
  34. *****************************************************************************/
  35. /*****************************************************************************
  36.  *
  37.  * Filename:
  38.  * ---------
  39.  *   T_AFC.cpp
  40.  *
  41.  * Project:
  42.  * --------
  43.  *   Maui META APP
  44.  *
  45.  * Description:
  46.  * ------------
  47.  *  AFC calibration source
  48.  *
  49.  * Author:
  50.  * -------
  51.  *  Andy Ueng (mtk00490)
  52.  *
  53.  *============================================================================
  54.  *             HISTORY
  55.  * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
  56.  *------------------------------------------------------------------------------
  57.  * $Revision$
  58.  * $Modtime$
  59.  * $Log$
  60.  *
  61.  *------------------------------------------------------------------------------
  62.  * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
  63.  *============================================================================
  64. ****************************************************************************/
  65. #include <assert.h>
  66. #include <math.h>
  67. #pragma hdrstop
  68. #ifndef _T_META_FACTORY_CALIBRATION_H_
  69. #include "T_META_factory_calibration.H"
  70. #endif
  71. #ifndef _CAL_COMMON_H_
  72. #include "cal_common.h"
  73. #endif
  74. // callback
  75. #ifndef _META_FACTORY_RF_CB_H_
  76. #include "meta_factory_rf_cb.h"
  77. #endif
  78. #ifndef _META_FACTORY_NVRAM_CB_H_
  79. #include "meta_factory_nvram_cb.h"
  80. #endif
  81. #ifndef _META_FACTORY_CRYSTAL_CB_H_
  82. #include "META_factory_crystal_cb.h"
  83. #endif
  84. #ifndef _META_FACTORY_BB_CB_H_
  85. #include "meta_factory_bb_cb.h"
  86. #endif
  87. // form
  88. #ifndef _META_FACTORY_H_
  89. #include "META_Factory.h"
  90. #endif
  91. #ifndef _FORM_MAIN_H_
  92. #include "form_main.h"
  93. #endif
  94. // equipment
  95. #ifndef _AGECOMMON_H_
  96. #include "agecommon.h"
  97. #endif
  98. #ifndef  _AGE_MISC_H_
  99. #include "age_misc.h"
  100. #endif
  101. // misc
  102. #ifndef  _FT_UTILS_H_
  103. #include "ft_utils.h"
  104. #endif
  105. #ifndef  _MATH_UTILS_H_
  106. #include "math_utils.h"
  107. #endif
  108. #ifndef  _GSM_UTILS_H_
  109. #include "gsm_utils.h"
  110. #endif
  111. #ifndef  _BAND_UTILS_H_
  112. #include "band_utils.h"
  113. #endif
  114. #ifndef  _TIME_UTILS_H_
  115. #include "time_utils.h"
  116. #endif
  117. #define  TIMESLOT_0          0
  118. #define  TIMESLOT_3          3
  119. #define  ADDR_AFC_DAC        0x80250064
  120. //----------------------------------------------------------------------------
  121. // AFC
  122. extern CRFAFC*  MF_rf_afc_ptr;
  123. extern RfAfc_Req *MF_rf_afc_req;
  124. extern RfAfc_Cnf *MF_rf_afc_cnf;
  125. //extern RfSetAfcDacValue_Req *MF_rf_SetAfcDacValue;
  126. extern unsigned char RfSetAfcDacCnf;
  127. // crystal AFC
  128. extern CCRYSTALAFC* MF_crystal_afc_ptr;
  129. extern RfNbtx_Req *MF_rf_tx_level_req;
  130. extern bool MF_rf_tx_level_cnf;
  131. extern CBBREG* MF_bb_reg_ptr;
  132. // APC
  133. extern CRFAPC*  MF_rf_apc_ptr;
  134. extern bool  is_suspend_cal; // in T_META_factory_calibration.cpp
  135. //******************************************************************************
  136. //                                AFC calibration
  137. //******************************************************************************
  138. bool __fastcall T_META_factory_calibration::AFCCal( void )
  139. {
  140.     char tempbuf[256];
  141.     if (TCVCXO == m_pCal->e_AFC_type)
  142.     {
  143.         log->Add( "n" +DateToStr(Date()) +  " " + CurrentTimeStr() +
  144.               " ====================== AFC calibration begin ===================== "
  145.            );
  146.     }
  147.     else
  148.     {
  149.         log->Add( "n" +DateToStr(Date()) +  " " + CurrentTimeStr() +
  150.               " =================== AFC slope calibration begin ================== "
  151.            );
  152.     }
  153.     if (TCVCXO == m_pCal->e_AFC_type)
  154.     {
  155.         PostMessage(
  156.                      ctrl.hPostMsgDestHandle,
  157.                      WM_MF_RF_AFC_BEGIN,
  158.                      0,
  159.                      0
  160.                     );
  161.     }
  162.     if( ! m_rct_ctrl.RCT_operatingMode( m_pRct, OPERATING_MODE_GSM_BCH ) )
  163.     {
  164.         CalErrorHandler(WM_MF_AGE8960_SET_OPERATION_MODE_FAIL);
  165.         log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  166.                               " FAIL :"+
  167.                               m_pRct->as_RCT + " < Operation mode = GSM BCH"
  168.                             );
  169.         return false;
  170.     }
  171.     int vi_AFC_BAND = Get_AgeBand(m_asAFC_BAND);
  172.    // if (!(CRYSTAL == m_pCal->e_AFC_type) && (CMU_200 == m_pRct->device_type))
  173.     {
  174.         if (!m_rct_ctrl.RCT_cellBand(m_pRct, vi_AFC_BAND))
  175.         {
  176.             CalErrorHandler(WM_MF_AGE8960_SET_BAND_FAIL);
  177.             log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  178.                      " FAIL :"+
  179.                      m_pRct->as_RCT + " < Band = " + ViBand_To_Str(vi_AFC_BAND)
  180.                      );
  181.             return false;
  182.         }
  183.         if (!m_rct_ctrl.RCT_PowTranBurst(m_pRct))
  184.         {
  185.             CalErrorHandler(WM_MF_AGE8960_SET_BAND_FAIL);
  186.             log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  187.                               " FAIL :"+
  188.                               m_pRct->as_RCT + " < Band = " + ViBand_To_Str(vi_AFC_BAND)
  189.                             );
  190.             return false;
  191.         }
  192.         if (!m_rct_ctrl.RCT_GenBitMod(m_pRct, CMU200_GEN_BIT_MODU_ALL_ZERO))
  193.         {
  194.             CalErrorHandler(WM_MF_AGE8960_SET_BIT_MODULATION_FAIL );
  195.             log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  196.                      " FAIL: " + m_pRct->as_RCT + " < set bit modulation "
  197.                    );
  198.             return false;
  199.         }
  200.         if ((MT6205    == m_pCal->e_bb_chip) ||
  201.             (MT6205B   == m_pCal->e_bb_chip) ||
  202.             (MT6223    == m_pCal->e_bb_chip) ||
  203.             (MT6223P   == m_pCal->e_bb_chip) ||
  204.             (MT6225    == m_pCal->e_bb_chip) ||
  205.             (MT6229    == m_pCal->e_bb_chip) ||
  206.             (MT6230    == m_pCal->e_bb_chip) ||
  207.             (MT6235    == m_pCal->e_bb_chip) ||
  208.             (MT6238    == m_pCal->e_bb_chip) ||
  209.             (TK6516_MD    == m_pCal->e_bb_chip)
  210.            )
  211.         {
  212.             if (!m_rct_ctrl.RCT_GenTsc(m_pRct, CMU200_GEN_TSC_ALL_ZERO))
  213.             {
  214.                 CalErrorHandler(WM_MF_AGE8960_SET_GENERATOR_TSC_FAIL );
  215.                 log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  216.                               " FAIL :"+
  217.                               m_pRct->as_RCT + " < set generator TSC = all 0 "
  218.                             );
  219.                 return false;
  220.             }
  221.         }
  222.         else
  223.         {
  224.             if (!m_rct_ctrl.RCT_GenTsc(m_pRct, CMU200_GEN_TSC_GSM_5))
  225.             {
  226.                 CalErrorHandler(WM_MF_AGE8960_SET_GENERATOR_TSC_FAIL);
  227.                 log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  228.                               " FAIL : "+
  229.                               m_pRct->as_RCT + " < set generator TSC = TSC5"
  230.                             );
  231.                 return false;
  232.             }
  233.         }
  234.         if( ! m_rct_ctrl.RCT_InitRfg( m_pRct ) )
  235.         {
  236.             CalErrorHandler( WM_MF_AGE8960_SET_RF_GENERATOR_FAIL );
  237.             log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  238.                      " FAIL:  cmu200 > set RF generator "
  239.                    );
  240.             return false;
  241.         }
  242.         if ( this->Terminated )
  243.         {
  244.             this->OnTerminate = neByUser;
  245.             return false;
  246.         }
  247.     }
  248. #if 0
  249.     else // crystal at CMU200
  250.     {
  251.         if( ! m_rct_ctrl.RCT_sig_cellBand( m_pRct, vi_AFC_BAND ) )
  252.         {
  253.             CalErrorHandler( WM_MF_AGE8960_SET_BAND_FAIL );
  254.             log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  255.                               " FAIL :"+
  256.                               " cmu200 < Band = " + ViBand_To_Str( vi_AFC_BAND )
  257.                             );
  258.             return false;
  259.         }
  260.     }
  261. #endif
  262.     log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  263.                   m_pRct->as_RCT + " < Band = "+
  264.                   ViBand_To_Str(Get_AgeBand(m_asAFC_BAND))
  265.                  );
  266.    // if (!(CRYSTAL == m_pCal->e_AFC_type) && (CMU_200 == m_pRct->device_type))
  267.     {
  268.         if( ! m_rct_ctrl.RCT_BCHARFCN( m_pRct, m_sAFC_ARFCN ) )
  269.         {
  270.             CalErrorHandler(WM_MF_AGE8960_SET_BCH_ARFCN_FAIL);
  271.             log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() + " FAIL: " + m_pRct->as_RCT + " < BCH ARFCN = " +
  272.                           IntToStr(m_sAFC_ARFCN)
  273.                         );
  274.             return false;
  275.         }
  276.     }
  277. #if 0
  278.     else  // crystal af CMU200
  279.     {
  280.         if( ! m_rct_ctrl.RCT_sig_BCHARFCN( m_pRct, m_sAFC_ARFCN ) )
  281.         {
  282.             CalErrorHandler( WM_MF_AGE8960_SET_BCH_ARFCN_FAIL );
  283.             log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() + " FAIL: cmu200 < BCH ARFCN = " +
  284.                            IntToStr(m_sAFC_ARFCN)
  285.                          );
  286.             return false;
  287.         }
  288.     }
  289. #endif
  290.     if ( this->Terminated )
  291.     {
  292.         this->OnTerminate = neByUser;
  293.         return false;
  294.     }
  295.     log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  296.                   m_pRct->as_RCT + " < BCH ARFCN = "+
  297.                   IntToStr(m_sAFC_ARFCN)
  298.                 );
  299.     if ( this->Terminated )
  300.     {
  301.         this->OnTerminate = neByUser;
  302.         return false;
  303.     }
  304.     //if (!(CRYSTAL == m_pCal->e_AFC_type) && (CMU_200 == m_pRct->device_type))
  305.     {
  306.         if (!m_rct_ctrl.RCT_cellPower(m_pRct, d_P_DL))
  307.         {
  308.             CalErrorHandler(WM_MF_AGE8960_SET_POWER_FAIL);
  309.             log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() + " FAIL: " + m_pRct->as_RCT + " < Power = " +
  310.                           Double_To_AnsiString(d_P_DL)) + " dBm";
  311.             return false;
  312.         }
  313.     }
  314. #if 0
  315.     else // crystal at CMU200
  316.     {
  317.         if (!m_rct_ctrl.RCT_sig_cellPower(m_pRct, d_P_DL))
  318.         {
  319.             CalErrorHandler(WM_MF_AGE8960_SET_POWER_FAIL);
  320.             log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() + " FAIL: cmu200< Power = " +
  321.                      Double_To_AnsiString(d_P_DL)) + " dBm";
  322.             return false;
  323.         }
  324.     }
  325. #endif
  326.     if (this->Terminated)
  327.     {
  328.         this->OnTerminate = neByUser;
  329.         return false;
  330.     }
  331.     log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  332.                   m_pRct->as_RCT = " < cell power = "+
  333.                   Double_To_AnsiString( d_P_DL )
  334.                  );
  335.     if ( this->Terminated )
  336.     {
  337.         this->OnTerminate = neByUser;
  338.         return false;
  339.     }
  340. #ifdef _MYDEBUG
  341.     log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  342.              " Sleep 100 " + AnsiString(__FILE__)
  343.            );
  344. #endif
  345.     if( age1960_PCS1900_BAND == vi_AFC_BAND )
  346.     {
  347.         if(META_Rf_SelectFrequencyBand1900_r( m_pCal->i_MainMETAHandle, 1, MF_SelectBand_cnf_cb, &MF_SelectBand_token, NULL) !=  META_SUCCESS)
  348.         {
  349.             CalErrorHandler( WM_MF_RF_AFC_SELECT_BAND_FAIL );
  350.             log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  351.                       " FAIL : Target < set Band1900 flag = 1"
  352.                     );
  353.             return false;
  354.         }
  355.     }
  356.     else
  357.     {
  358.         if(META_Rf_SelectFrequencyBand1900_r( m_pCal->i_MainMETAHandle,  0, MF_SelectBand_cnf_cb, &MF_SelectBand_token, NULL) !=  META_SUCCESS)
  359.         {
  360.             CalErrorHandler( WM_MF_RF_AFC_SELECT_BAND_FAIL );
  361.             log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  362.                       " FAIL : Target < set Band1900 flag = 0"
  363.                     );
  364.             return false;
  365.         }
  366.     }
  367.     is_suspend_cal = true;
  368.     this->Suspend();
  369.     is_suspend_cal = false;
  370.    // Sleep( 23000 );  // wait Agilent 8960 ready!
  371.                   // If Agilent 8960 not ready, target will not detection FB
  372.     Sleep( 100 );
  373.     MF_rf_afc_req->arfcn      = m_sAFC_ARFCN;
  374.     MF_rf_afc_req->dacValue   = (TCVCXO == m_pCal->e_AFC_type)?m_sDAC1:m_sCRYSTAL_DAC1;
  375.     MF_rf_afc_req->gain       = (MF_RF_GAIN_TO_BE_SUB - d_P_DL) * GAIN_REQUEST_PC_SIDE_MULTIPLY;
  376.     MF_rf_afc_req->testNumber = m_sN_AFC;
  377.     if ( META_Rf_AFC_r( m_pCal->i_MainMETAHandle, MF_rf_afc_req, MF_rf_afc_cb, &MF_rf_afc_token,NULL ) != META_SUCCESS )
  378.     {
  379.         CalErrorHandler( WM_MF_RF_AFC_CONTROL_FAIL );
  380.         log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  381.                   " FAIL : Target < AFC: ARFCN = "+ IntToStr( m_sAFC_ARFCN ) +
  382.                   ", dac value = "+ IntToStr(MF_rf_afc_req->dacValue) +
  383.                   ", gain = " + Double_To_AnsiString(MF_rf_afc_req->gain/RF_RX_GAIN_SCALE) + " dB" +
  384.                   ", testing number = " + IntToStr( m_sN_AFC )
  385.                 );
  386.         return false;
  387.     }
  388.     if ( this->Terminated )
  389.     {
  390.         this->OnTerminate = neByUser;
  391.         return false;
  392.     }
  393.     log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  394.              " Target < ARFCN = "+ IntToStr( m_sAFC_ARFCN ) +
  395.              ", dac value = "+ IntToStr(MF_rf_afc_req->dacValue) +
  396.              ", gain = " + Double_To_AnsiString(MF_rf_afc_req->gain/RF_RX_GAIN_SCALE) + " dB" +
  397.              ", testing number = " + IntToStr( m_sN_AFC )
  398.            );
  399. #ifdef _MYDEBUG_
  400.     log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  401.                             " TimerCal->Enabled 2= " + IntToStr((int)frmFatcory->TimerCal->Enabled)
  402.                           );
  403. #endif
  404.     RestartTimerCal( WM_MF_RF_AFC_CONTROL_FAIL );
  405.     is_suspend_cal = true;
  406.     this->Suspend();
  407.     is_suspend_cal = false;
  408.     if ( this->Terminated )
  409.     {
  410.         log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  411.                   " Terminate at line " + AnsiString(__FILE__) + " " + AnsiString(__LINE__)
  412.                 );
  413.         this->OnTerminate = neByUser;
  414.         return false;
  415.     }
  416.     if ( MF_rf_afc_cnf->fcb_ok_number <= 0 )
  417.     {
  418.         CalErrorHandler( WM_MF_RF_AFC_CONTROL_FAIL );
  419.         log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  420.                   " FAIL : Target< AFC FB detection fail "
  421.                 );
  422.         return false;
  423.     }
  424.     if ( this->Terminated )
  425.     {
  426.         this->OnTerminate = neByUser;
  427.         return false;
  428.     }
  429.     int i_FreqOffset1 =  MF_rf_afc_cnf->freqOffset;
  430.     log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  431.              " Target > freqOffset = "+ IntToStr(i_FreqOffset1)
  432.            );
  433.    // if( i_DAC2 <= i_DAC1)
  434.    // {
  435.    //     CalErrorHandler( WM_MF_RF_AFC_CONTROL_FAIL );
  436.    //     log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  437.    //               " FAIL:  target < i_DAC2 <= i_DAC1 "
  438.    //             );
  439.    //     return false;
  440.    // }
  441.    // if ( this->Terminated )
  442.    // {
  443.    //     this->OnTerminate = neByUser;
  444.    //     return false;
  445.    // }
  446.   //  if( frmFatcory->rbAgilent8960->Checked && frmFatcory->rbCrystal->Checked )
  447.   //  {   MF_rf_afc_req->dacValue = i_DAC2 | TIMESLOT_3<<13;
  448.   //  }
  449.   //  else if( frmFatcory->rbCMU200->Checked && frmFatcory->rbCrystal->Checked )
  450.   //  {   MF_rf_afc_req->dacValue = i_DAC2 | TIMESLOT_0<<13;
  451.   //  }
  452.    // else // TVCVXO
  453.     {
  454.         MF_rf_afc_req->dacValue = (TCVCXO == m_pCal->e_AFC_type)?m_sDAC2:m_sCRYSTAL_DAC2;
  455.     }
  456.     if ( META_Rf_AFC_r( m_pCal->i_MainMETAHandle,
  457.                       MF_rf_afc_req,
  458.                       MF_rf_afc_cb,
  459.                       &MF_rf_afc_token,
  460.                       NULL
  461.                     ) != META_SUCCESS )
  462.     {
  463.         CalErrorHandler( WM_MF_RF_AFC_CONTROL_FAIL );
  464.         log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  465.                   " FAIL : Target < ARFCN = "+ IntToStr( m_sARFCN_C0_GSM ) +
  466.                   ", dac value = "+ IntToStr(MF_rf_afc_req->dacValue) +
  467.                   ", gain = " + Double_To_AnsiString(MF_rf_afc_req->gain/RF_RX_GAIN_SCALE) + " dB" +
  468.                   ", testing number = " + IntToStr(m_sN_AFC)
  469.                 );
  470.         return false;
  471.     }
  472.     log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  473.              " Target < ARFCN = "+ IntToStr( m_sAFC_ARFCN ) +
  474.              ", dac value = "+ IntToStr(MF_rf_afc_req->dacValue) +
  475.              ", gain = " + Double_To_AnsiString(MF_rf_afc_req->gain/RF_RX_GAIN_SCALE) + " dB" +
  476.              ", testing number = " + IntToStr(m_sN_AFC)
  477.            );
  478.     if ( this->Terminated )
  479.     {
  480.         this->OnTerminate = neByUser;
  481.         log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  482.                   " Terminate at line " + AnsiString(__FILE__) + " " + AnsiString(__LINE__)
  483.                 );
  484.         return false;
  485.     }
  486.    // log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  487.    //           " TimerCal->Enabled 3= " + IntToStr((int)frmFatcory->TimerCal->Enabled)
  488.    //        );
  489.     RestartTimerCal(WM_MF_RF_AFC_CONTROL_FAIL);
  490.     is_suspend_cal = true;
  491.     this->Suspend();
  492.     is_suspend_cal = false;
  493.     if ( this->Terminated )
  494.     {
  495.         log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  496.                   " Terminate at line " + AnsiString(__FILE__) + " " + AnsiString(__LINE__)
  497.                 );
  498.         this->OnTerminate = neByUser;
  499.         return false;
  500.     }
  501.     if ( MF_rf_afc_cnf->fcb_ok_number <= 0 )
  502.     {
  503.         CalErrorHandler( WM_MF_RF_AFC_CONTROL_FAIL );
  504.         log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  505.                   " FAIL : Target< FB detection fail "
  506.                 );
  507.         return false;
  508.     }
  509.     int i_FreqOffset2 =  MF_rf_afc_cnf->freqOffset;
  510.     log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  511.              " Target > freqOffset = "+ IntToStr( i_FreqOffset2 )
  512.            );
  513.     if ( this->Terminated )
  514.     {
  515.         this->OnTerminate = neByUser;
  516.         return false;
  517.     }
  518.     int i_band_index = MF_rf_afc_ptr->Get_Band_Index(  m_asAFC_BAND );
  519.     float Afc_Slope_factor = MF_rf_afc_ptr->Get_Afc_Slope_factor(i_band_index);
  520.     if (TCVCXO == m_pCal->e_AFC_type)
  521.     {
  522.         f_Slope = (double)(i_FreqOffset1 - i_FreqOffset2)/(double)(m_sDAC2 - m_sDAC1);
  523.         i_Slope_inv = (int)(RF_AFC_SLOPE_DENOMINATOR * (m_sDAC2 - m_sDAC1)) /
  524.                     (i_FreqOffset1 - i_FreqOffset2)/Afc_Slope_factor;
  525.         m_sDefault_value = (unsigned short) ((i_FreqOffset1/f_Slope)+ m_sDAC1);
  526.     }
  527.     else
  528.     {
  529.         f_Slope = (double)(i_FreqOffset1 - i_FreqOffset2)/(double)(m_sCRYSTAL_DAC2 - m_sCRYSTAL_DAC1);
  530.         i_Slope_inv = (int)(RF_AFC_SLOPE_DENOMINATOR * (m_sCRYSTAL_DAC2 - m_sCRYSTAL_DAC1)) /
  531.                     (i_FreqOffset1 - i_FreqOffset2)/Afc_Slope_factor;
  532.         m_sDefault_value = (unsigned short) ((i_FreqOffset1/f_Slope)+ m_sCRYSTAL_DAC1);
  533.     }
  534.     f_Slope = f_Slope * Afc_Slope_factor; // normalization
  535. ///// write afc to NVRAM
  536.     S_AFC_RESULT navram_afc;
  537.     navram_afc.s_InitAfcDac  = m_sDefault_value;
  538.     navram_afc.i_AfcSlopeInv = i_Slope_inv;
  539.     MF_rf_afc_ptr->Set_AfcResult(navram_afc);
  540.     MF_rf_afc_ptr->ConfirmCallback = ::ccb_write_afc_to_nvram;
  541.     MF_rf_afc_ptr->REQ_Write_To_NVRAM_Start();
  542.     RestartTimerCal (WM_MF_NVRAM_AFC_WRITE_FAIL);
  543.     SUSPEND_CAL_THREAD
  544.     E_METAAPP_RESULT_T state = MF_rf_afc_ptr->Get_ConfirmState();
  545.     if (state != METAAPP_SUCCESS)
  546.     {
  547.         if (METAAPP_NVRAM_LID_VER_NOT_SUPPORT == state)
  548.         {
  549.             CalErrorHandler(WM_MF_NVRAM_EF_L1_AFCDATA_LID_VERNO_FAIL);
  550.             log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  551.                              " FAIL : NVRAM_EF_L1_AFCDATA_LID version is not support, please update META to latest version. "
  552.                              );
  553.         }
  554.         else
  555.         {
  556.             CalErrorHandler(WM_MF_NVRAM_AFC_WRITE_FAIL);
  557.             log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  558.                                       " FAIL:  Target < Write AFC slope and offset to NVRAM fail "
  559.                                      );
  560.         }
  561.         return false;
  562.     }
  563.     log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  564.                       " Target < Write AFC slope and offset to NVRAM"
  565.                     );
  566.    //ResultHeaderBuf2 = ResultHeaderBuf2 + "Initial_DAC" + " ";
  567.     sprintf(tempbuf, "%11d", navram_afc.s_InitAfcDac);
  568.     m_pCal->as_ResultBuf = m_pCal->as_ResultBuf + tempbuf + ", ";
  569.   // ResultHeaderBuf2 = ResultHeaderBuf2 + "AFC_slope" + " ";
  570.     sprintf(tempbuf, "%8.4f", 1.0*RF_AFC_SLOPE_DENOMINATOR/navram_afc.i_AfcSlopeInv);
  571.     m_pCal->as_ResultBuf = m_pCal->as_ResultBuf + tempbuf + ", ";
  572.    // added by Andy Ueng
  573.   // WriteAFCCalResultToFile(IntToStr(i_ID)+".cal",Application->ExeName );
  574.     if (!WriteAFCCalResultToFile(as_ID+".cal",Application->ExeName, m_pCal->b_CalResultPath ) )
  575.     {
  576.         CalErrorHandler(WM_MF_RF_AFC_WRITE_CAL_RESULT_FAIL);
  577.         log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  578.                 " FAIL : write AFC parameter to cal file "
  579.               );
  580.         return false;
  581.     }
  582.     log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  583.              " ======================= AFC calibration end ====================== n "
  584.            );
  585. // ---------------- AFC calibration result check begin -------------------------
  586.     log->Add( "n" + DateToStr(Date()) +  " " + CurrentTimeStr() +
  587.              " ================== AFC calibration check begin =================== "
  588.            );
  589.     if ( this->Terminated )
  590.     {
  591.         this->OnTerminate = neByUser;
  592.         return false;
  593.     }
  594.      //  if(  as_max_AfcSlope != NULL &&  as_min_AfcSlope != NULL)
  595.          {
  596.           if( ( d_min_AfcSlope<=f_Slope && f_Slope<= d_max_AfcSlope ))
  597.           {
  598.              log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  599.                     " PASS: AFC slope check:" + " AFC = " +
  600.                     Double_To_AnsiString( f_Slope  ) +
  601.                     " min AFC slope = " +  Double_To_AnsiString( d_min_AfcSlope ) + "," +
  602.                     " max AFC slope = " +  Double_To_AnsiString( d_max_AfcSlope )
  603.                   );
  604.           }
  605.           else
  606.           {
  607.              CalErrorHandler( WM_MF_RF_AFC_CHECK_FAIL );
  608.              log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  609.                     " FAIL: AFC slope check ." + " AFC = " +
  610.                     Double_To_AnsiString(f_Slope)+
  611.                     "n" +
  612.                     " min AFC slope = " +  Double_To_AnsiString( d_min_AfcSlope ) + "n" +
  613.                     " max AFC slope = " +  Double_To_AnsiString( d_max_AfcSlope )
  614.                   );
  615.              return false;
  616.           }
  617.         }//if
  618.      if ( this->Terminated )
  619.      {
  620.         this->OnTerminate = neByUser;
  621.         return false;
  622.      }
  623.      if( (m_sMinInitAfcDac<=navram_afc.s_InitAfcDac && navram_afc.s_InitAfcDac<= m_sMaxInitAfcDac))
  624.      {
  625.          log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  626.                     " PASS: AFC initial DAC value check:" + " AFC = " +
  627.                     Double_To_AnsiString(navram_afc.s_InitAfcDac) + "," +
  628.                     " min AFC initial DAC value = " +  IntToStr( m_sMinInitAfcDac ) + "," +
  629.                     " max AFC initial DAC value = " +  IntToStr( m_sMaxInitAfcDac )
  630.                   );
  631.      }
  632.      else
  633.      {
  634.          CalErrorHandler(WM_MF_RF_AFC_CHECK_FAIL);
  635.          log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  636.                     " FAIL: AFC initial DAC value check:" + " AFC = " +
  637.                     Double_To_AnsiString(navram_afc.s_InitAfcDac)+
  638.                     "n" +
  639.                     " min AFC initial DAC value = " +  IntToStr( m_sMinInitAfcDac ) + "n" +
  640.                     " max AFC initial DAC value = " +  IntToStr( m_sMaxInitAfcDac )
  641.                   );
  642.              return false;
  643.      }
  644.      if ( this->Terminated )
  645.      {
  646.         this->OnTerminate = neByUser;
  647.         return false;
  648.      }
  649. // ---------------- AFC calibration result check end ---------------------------
  650. // end of added
  651.     log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  652.               " Target< default value = " + IntToStr(m_sDefault_value)
  653.             );
  654.     log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  655.               " Target< slope inv = " + IntToStr(i_Slope_inv)
  656.             );
  657.     MF_rf_afc_ptr->ConfirmCallback = ccb_write_afc_to_nvram;
  658.     MF_rf_afc_ptr->REQ_Write_To_NVRAM_Start();
  659.     if ( this->Terminated )
  660.     {
  661.         this->OnTerminate = neByUser;
  662.         return false;
  663.     }
  664.    // log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  665.    //           " TimerCal->Enabled 4= " + IntToStr((int)frmFatcory->TimerCal->Enabled)
  666.    //         );
  667.     RestartTimerCal(WM_MF_NVRAM_AFC_WRITE_FAIL);
  668.     SUSPEND_CAL_THREAD
  669.     state = MF_rf_afc_ptr->Get_ConfirmState();
  670.     if (state != METAAPP_SUCCESS)
  671.     {
  672.         if (METAAPP_NVRAM_LID_VER_NOT_SUPPORT == state)
  673.         {
  674.             CalErrorHandler(WM_MF_NVRAM_EF_L1_AFCDATA_LID_VERNO_FAIL);
  675.             log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  676.                              " FAIL : NVRAM_EF_L1_AFCDATA_LID version is not support, please update META to latest version. "
  677.                              );
  678.         }
  679.         else
  680.         {
  681.             CalErrorHandler(WM_MF_NVRAM_AFC_WRITE_FAIL);
  682.             log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  683.                                 " FAIL:  Target< Write AFC value to NVRAM fail "
  684.                     );
  685.             return false;
  686.         }
  687.     }
  688.     log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  689.                   " Target< Write AFC value to NVRAM"
  690.                 );
  691.     if ( this->Terminated )
  692.     {
  693.         this->OnTerminate = neByUser;
  694.         return false;
  695.     }
  696.     // set AFC initial DAC value
  697.     RfSetAfcDacValue_Req MF_rf_SetAfcDacValue;
  698.     MF_rf_SetAfcDacValue.dacValue = navram_afc.s_InitAfcDac;
  699.     if (META_Rf_SetAfcDacValue_r(m_pCal->i_MainMETAHandle, &MF_rf_SetAfcDacValue, MF_rf_SetAfcDacValue_cb, &MF_rf_afc_token, NULL)
  700.          != META_SUCCESS )
  701.     {
  702.         CalErrorHandler(WM_MF_RF_SET_AFC_DAC_FAIL);
  703.         log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  704.                 " FAIL : Target < Set AFC DAC = "+ IntToStr(MF_rf_SetAfcDacValue.dacValue)
  705.               );
  706.         return false;
  707.     }
  708.     log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  709.                 " Target < Set AFC DAC = "+ IntToStr( MF_rf_SetAfcDacValue.dacValue )
  710.               );
  711.     RestartTimerCal( WM_MF_RF_SET_AFC_DAC_CNF_FAIL );
  712.     is_suspend_cal = true;
  713.     this->Suspend();
  714.     is_suspend_cal = false;
  715.     if( RfSetAfcDacCnf == false )
  716.     {
  717.         CalErrorHandler( WM_MF_RF_SET_AFC_DAC_CNF_FAIL );
  718.         log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  719.                 " FAIL : Target < Set AFC DAC = "+ IntToStr(MF_rf_SetAfcDacValue.dacValue)
  720.               );
  721.         return false;
  722.     }
  723.     PostMessage(
  724.                      ctrl.hPostMsgDestHandle,
  725.                      WM_MF_RF_AFC_CALIBRATION_DONE,
  726.                      0,
  727.                      0
  728.                     );
  729.                     
  730.     if (TCVCXO ==  m_pCal->e_AFC_type)
  731.     {
  732.         log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  733.              " =================== AFC calibration check end ==================== n "
  734.                 );
  735.     }
  736.     else
  737.     {
  738.         log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  739.              " =================== AFC slope calibration check end ==================== n "
  740.                 );
  741.     }
  742.     frmFatcory->DisableAllCalTimer();
  743.     return true;
  744. } // AFCCalibration()
  745. //--------------------------------------------------------------------------
  746. bool __fastcall T_META_factory_calibration::AFCSlopeCal( int vi_band, short bch, float &slope, unsigned short &us_init_value  )
  747. {
  748.     char tempbuf[256];
  749. #if 0
  750.     if( ! m_rct_ctrl.RCT_operatingMode( m_pRct, OPERATING_MODE_GSM_BCH ) )
  751.     {
  752.         CalErrorHandler( WM_MF_AGE8960_SET_OPERATION_MODE_FAIL );
  753.         if ( frmFatcory->rbAgilent8960->Checked )
  754.         {
  755.             log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  756.                               " FAIL :"+
  757.                               " Agilent 8960< Operation mode = GSM BCH"
  758.                             );
  759.         }
  760.         else
  761.         {
  762.             log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  763.                               " FAIL :"+
  764.                               " cmu200 < Band = Operation mode = GSM BCH"
  765.                             );
  766.         }
  767.         return false;
  768.     }
  769.     if( ! m_rct_ctrl.RCT_sig_cellBand( m_pRct, vi_band ) )
  770.     {
  771.             CalErrorHandler( WM_MF_AGE8960_SET_BAND_FAIL );
  772.             log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  773.                               " FAIL :"+
  774.                               " cmu200 < Band = " + ViBand_To_Str( vi_band )
  775.                             );
  776.             return false;
  777.     }
  778.     log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  779.                  " CMU 200< Band = "+
  780.                  ViBand_To_Str( vi_band )
  781.             );
  782.     if( ! m_rct_ctrl.RCT_sig_BCHARFCN( m_pRct, bch ) )
  783.     {
  784.             CalErrorHandler( WM_MF_AGE8960_SET_BCH_ARFCN_FAIL );
  785.             log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() + " FAIL: cmu200 < BCH ARFCN = " +
  786.                            IntToStr(bch)
  787.                          );
  788.             return false;
  789.     }
  790.     if ( this->Terminated )
  791.     {
  792.         this->OnTerminate = neByUser;
  793.         return false;
  794.     }
  795.     log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  796.                  " CMU 200< BCH ARFCN = "+
  797.                  IntToStr( bch  )
  798.                );
  799.     if( ! m_rct_ctrl.RCT_sig_cellPower( m_pRct, d_P_DL ) )
  800.     {
  801.         CalErrorHandler( WM_MF_AGE8960_SET_POWER_FAIL );
  802.         log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() + " FAIL: cmu200< Power = " +
  803.                           Double_To_AnsiString( d_P_DL) ) + " dBm";
  804.         return false;
  805.     }
  806.     if ( this->Terminated )
  807.     {
  808.         this->OnTerminate = neByUser;
  809.         return false;
  810.     }
  811.     log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  812.                   " CMU 200< cell power = "+
  813.                   Double_To_AnsiString( d_P_DL )
  814.                  );
  815.     if( age1960_PCS1900_BAND == vi_band )
  816.     {
  817.         if(META_Rf_SelectFrequencyBand1900_r( m_META_HANDLE_Obj.Get_MainHandle(), 1, MF_SelectBand_cnf_cb, &MF_SelectBand_token, NULL) !=  META_SUCCESS)
  818.         {
  819.             CalErrorHandler( WM_MF_RF_AFC_SELECT_BAND_FAIL );
  820.             log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  821.                       " FAIL : Target < set Band1900 flag = 1"
  822.                     );
  823.             return false;
  824.         }
  825.     }
  826.     else
  827.     {
  828.         if(META_Rf_SelectFrequencyBand1900_r( m_META_HANDLE_Obj.Get_MainHandle(), 0, MF_SelectBand_cnf_cb, &MF_SelectBand_token, NULL) !=  META_SUCCESS)
  829.         {
  830.             CalErrorHandler( WM_MF_RF_AFC_SELECT_BAND_FAIL );
  831.             log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  832.                       " FAIL : Target < set Band1900 flag = 0"
  833.                     );
  834.             return false;
  835.         }
  836.     }
  837.     is_suspend_cal = true;
  838.     this->Suspend();
  839.     is_suspend_cal = false;
  840. #endif
  841.     Sleep( 100 );  // wait Agilent 8960 ready!
  842.                   // If Agilent 8960 not ready, target will not detection FB
  843.     if( m_bFirstAfcTracking )
  844.     {
  845.         m_bFirstAfcTracking = false;
  846.         if (TCVCXO == m_pCal->e_AFC_type)
  847.         {
  848.             m_sDAC1 = m_sDefault_value;
  849.         }
  850.         else
  851.         {
  852.             m_sCRYSTAL_DAC1 = m_sDefault_value;
  853.         }
  854.     }
  855.     else
  856.     {
  857.         if( META_SUCCESS != META_QueryIfFunctionSupportedByTarget_r(m_pCal->i_MainMETAHandle, 500, "META_Rf_GetAfcDacValueAtRTXOffsetCal_r") )
  858.         {
  859.             MF_bb_reg_ptr->ConfirmCallback = ::CNF_BB;
  860.             MF_bb_reg_ptr->REQ_ReadRegister_Start(ADDR_AFC_DAC);
  861.             is_suspend_cal = true;
  862.             this->Suspend();
  863.             is_suspend_cal = false;
  864.             if( MF_bb_reg_ptr->Get_ConfirmState() != METAAPP_SUCCESS )
  865.             {
  866.                 CalErrorHandler( WM_MF_NVRAM_IP2_READ_FAIL );
  867.                 log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  868.                       " FAIL: Target > read AFC DAC value from baseband register fail."
  869.                     );
  870.                 return false;
  871.             }
  872.             if (TCVCXO == m_pCal->e_AFC_type)
  873.             {
  874.                 m_sDAC1 = (int) MF_bb_reg_ptr->Get_RegValue();
  875.                 log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  876.                       " Target > read AFC DAC value from baseband register, AFC DAC = " + IntToStr(m_sDAC1)
  877.                     );
  878.             }
  879.             else
  880.             {
  881.                 m_sCRYSTAL_DAC1 = (int) MF_bb_reg_ptr->Get_RegValue();
  882.                 log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  883.                       " Target > read AFC DAC value from baseband register, AFC DAC = " + IntToStr(m_sCRYSTAL_DAC1)
  884.                     );
  885.             }
  886.          }
  887.          else
  888.          {
  889.             //  i_DAC2 = i_DAC1 - 400;
  890.             RfGetAfcDacValueAtRTXOffsetCal cnf;
  891.             if( META_SUCCESS != META_Rf_GetAfcDacValueAtRTXOffsetCal_r( m_pCal->i_MainMETAHandle, 5000, &cnf) )
  892.             {
  893.                 CalErrorHandler( WM_MF_RF_AFC_GET_AFCDAC_FAIL );
  894.                 log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  895.                          " Target > read AFC DAC value fail "
  896.                         );
  897.                 return false;
  898.             }
  899.             if (TCVCXO == m_pCal->e_AFC_type)
  900.             {
  901.                 m_sDAC1 = cnf.dacValue;
  902.                 log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  903.                       " Target > read AFC DAC value , AFC DAC = " + IntToStr(m_sDAC1)
  904.                     );
  905.             }
  906.             else
  907.             {
  908.                 m_sCRYSTAL_DAC1 = cnf.dacValue;
  909.                 log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  910.                       " Target > read AFC DAC value , AFC DAC = " + IntToStr(m_sCRYSTAL_DAC1)
  911.                     );
  912.             }
  913.     }
  914.         }
  915.     int count = 0;
  916.     long i_FreqOffset1;
  917.     do
  918.     {
  919.         count++;
  920.        // Sleep(1000);
  921.         MF_rf_afc_req->dacValue = (TCVCXO == m_pCal->e_AFC_type)?m_sDAC1:m_sCRYSTAL_DAC1;
  922.         MF_rf_afc_req->arfcn    = bch;
  923.         MF_rf_afc_req->gain     = (MF_RF_GAIN_TO_BE_SUB - d_P_DL) * GAIN_REQUEST_PC_SIDE_MULTIPLY;
  924.         MF_rf_afc_req->testNumber = m_sN_AFC;
  925.         if ( META_Rf_AFC_r( m_pCal->i_MainMETAHandle,  MF_rf_afc_req, MF_rf_afc_cb, &MF_rf_afc_token,NULL ) != META_SUCCESS )
  926.         {
  927.             CalErrorHandler( WM_MF_RF_AFC_CONTROL_FAIL );
  928.             log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  929.                   " FAIL : Target < AFC: ARFCN = "+ IntToStr( bch ) +
  930.                   ", dac value = "+ IntToStr(MF_rf_afc_req->dacValue) +
  931.                   ", gain = " + Double_To_AnsiString(MF_rf_afc_req->gain/RF_RX_GAIN_SCALE) + " dB" +
  932.                   ", testing number = " + IntToStr( m_sN_AFC )
  933.                 );
  934.             return false;
  935.        }
  936.        if ( this->Terminated )
  937.        {
  938.             this->OnTerminate = neByUser;
  939.             return false;
  940.        }
  941.        log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  942.              " Target < ARFCN = "+ IntToStr( bch ) +
  943.              ", dac value = "+ IntToStr(MF_rf_afc_req->dacValue) +
  944.              ", gain = " + Double_To_AnsiString(MF_rf_afc_req->gain/RF_RX_GAIN_SCALE) + " dB" +
  945.              ", testing number = " + IntToStr( m_sN_AFC )
  946.            );
  947.        //log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  948.        //                     " TimerCal->Enabled 2= " + IntToStr((int)frmFatcory->TimerCal->Enabled)
  949.        //                   );
  950.        RestartTimerCal( WM_MF_RF_AFC_CONTROL_FAIL );
  951.        is_suspend_cal = true;
  952.        this->Suspend();
  953.        is_suspend_cal = false;
  954.        if ( this->Terminated )
  955.        {
  956.            log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  957.                   " Terminate at line " + AnsiString(__FILE__) + " " + AnsiString(__LINE__)
  958.                 );
  959.            this->OnTerminate = neByUser;
  960.            return false;
  961.        }
  962.        if ( MF_rf_afc_cnf->fcb_ok_number <= 0 )
  963.        {
  964.             CalErrorHandler( WM_MF_RF_AFC_CONTROL_FAIL );
  965.             log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  966.                   " FAIL : Target< AFC FB detection fail "
  967.                 );
  968.             return false;
  969.        }
  970.        if ( this->Terminated )
  971.        {
  972.            this->OnTerminate = neByUser;
  973.            return false;
  974.        }
  975.        i_FreqOffset1 =  MF_rf_afc_cnf->freqOffset;
  976.        log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  977.              " Target > freqOffset = "+ IntToStr( i_FreqOffset1 )
  978.            );
  979.         int i_band_index = MF_rf_afc_ptr->Get_Band_Index(  m_asAFC_BAND );
  980.         float Afc_Slope_factor = MF_rf_afc_ptr->Get_Afc_Slope_factor(i_band_index);
  981.         slope = (float)( RF_AFC_SLOPE_DENOMINATOR * 1.0 / ( i_Slope_inv * Afc_Slope_factor ));
  982.         if (TCVCXO == m_pCal->e_AFC_type)
  983.         {
  984.             m_sDAC1 = (unsigned short) ((0.5*i_FreqOffset1/slope)+ m_sDAC1);
  985.         }
  986.         else
  987.         {
  988.             m_sCRYSTAL_DAC1 = (unsigned short) ((0.5*i_FreqOffset1/slope)+ m_sCRYSTAL_DAC1);
  989.         }
  990.     }
  991.     while( abs(i_FreqOffset1) > m_dCRYSTAL_AFC_MAX_AFC_TRACK_INIT_FREQ_ERR && count <= m_sCRYSTAL_AFC_RECURSIVE_TIMES);
  992.     if (TCVCXO == m_pCal->e_AFC_type)
  993.     {
  994.         us_init_value = m_sDAC1;
  995.     }
  996.     else
  997.     {
  998.         us_init_value = m_sCRYSTAL_DAC1;
  999.     }
  1000. #if 0
  1001.     // set AFC initial DAC value
  1002.     MF_rf_SetAfcDacValue->dacValue = us_init_value;
  1003.     if ( META_Rf_SetAfcDacValue_r( m_META_HANDLE_Obj.Get_MainHandle(), MF_rf_SetAfcDacValue, MF_rf_SetAfcDacValue_cb, &MF_rf_afc_token, NULL)
  1004.          != META_SUCCESS )
  1005.     {
  1006.         CalErrorHandler( WM_MF_RF_SET_AFC_DAC_FAIL );
  1007.         log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  1008.                 " FAIL : Target < Set AFC DAC = "+ IntToStr( MF_rf_SetAfcDacValue->dacValue )
  1009.               );
  1010.         return false;
  1011.     }
  1012. #endif    
  1013.    // if( i_DAC2 <= i_DAC1)
  1014.    // {
  1015.    //     CalErrorHandler( WM_MF_RF_AFC_CONTROL_FAIL );
  1016.    //     log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  1017.    //               " FAIL:  target < i_DAC2 <= i_DAC1 "
  1018.    //             );
  1019.    //     return false;
  1020.    // }
  1021.    //
  1022.    // if ( this->Terminated )
  1023.    // {
  1024.    //     this->OnTerminate = neByUser;
  1025.    //     return false;
  1026.    // }
  1027.    // if( frmFatcory->rbAgilent8960->Checked && frmFatcory->rbCrystal->Checked )
  1028.    // {   MF_rf_afc_req->dacValue = i_DAC2 | TIMESLOT_3<<13;
  1029.    // }
  1030.    // else if( frmFatcory->rbCMU200->Checked && frmFatcory->rbCrystal->Checked )
  1031.    // {   MF_rf_afc_req->dacValue = i_DAC2 | TIMESLOT_0<<13;
  1032.    // }
  1033.    // else // TVCVXO
  1034. #if 0
  1035.     {
  1036.         MF_rf_afc_req->dacValue = i_DAC2;
  1037.     }
  1038.     if ( META_Rf_AFC_r( m_META_HANDLE_Obj.Get_MainHandle(),
  1039.                         MF_rf_afc_req,
  1040.                       MF_rf_afc_cb,
  1041.                       &MF_rf_afc_token,
  1042.                       NULL
  1043.                     ) != META_SUCCESS )
  1044.     {
  1045.         CalErrorHandler( WM_MF_RF_AFC_CONTROL_FAIL );
  1046.         log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  1047.                   " FAIL : Target < ARFCN = "+ IntToStr( m_sARFCN_C0_GSM ) +
  1048.                   ", dac value = "+ IntToStr( i_DAC2 ) +
  1049.                   ", gain = " + IntToStr(   MF_rf_afc_req->gain ) +
  1050.                   ", testing number = " + IntToStr( m_sN_AFC )
  1051.                 );
  1052.         return false;
  1053.     }
  1054.     log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  1055.              " Target < ARFCN = "+ IntToStr( bch ) +
  1056.              ", dac value = "+ IntToStr( i_DAC2 ) +
  1057.              ", gain = " + IntToStr(   MF_rf_afc_req->gain ) +
  1058.              ", testing number = " + IntToStr( m_sN_AFC )
  1059.            );
  1060.     if ( this->Terminated )
  1061.     {
  1062.         this->OnTerminate = neByUser;
  1063.         log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  1064.                   " Terminate at line " + AnsiString(__FILE__) + " " + AnsiString(__LINE__)
  1065.                 );
  1066.         return false;
  1067.     }
  1068.     log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  1069.               " TimerCal->Enabled 3= " + IntToStr((int)frmFatcory->TimerCal->Enabled)
  1070.            );
  1071.     RestartTimerCal( WM_MF_RF_AFC_CONTROL_FAIL );
  1072.     is_suspend_cal = true;
  1073.     this->Suspend();
  1074.     is_suspend_cal = false;
  1075.     if ( this->Terminated )
  1076.     {
  1077.         log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  1078.                   " Terminate at line " + AnsiString(__FILE__) + " " + AnsiString(__LINE__)
  1079.                 );
  1080.         this->OnTerminate = neByUser;
  1081.         return false;
  1082.     }
  1083.     if ( MF_rf_afc_cnf->fcb_ok_number <= 0 )
  1084.     {
  1085.         CalErrorHandler( WM_MF_RF_AFC_CONTROL_FAIL );
  1086.         log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  1087.                   " FAIL : Target< FB detection fail "
  1088.                 );
  1089.         return false;
  1090.     }
  1091.     if ( this->Terminated )
  1092.     {
  1093.         this->OnTerminate = neByUser;
  1094.         return false;
  1095.     }
  1096.     int i_band_index = MF_rf_afc_ptr->Get_Band_Index(  m_asAFC_BAND );
  1097.     float Afc_Slope_factor = MF_rf_afc_ptr->Get_Afc_Slope_factor(i_band_index);
  1098.     i_FreqOffset2 =  MF_rf_afc_cnf->freqOffset;
  1099.     log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  1100.              " Target > freqOffset = "+ IntToStr( i_FreqOffset2 )
  1101.            );
  1102.     slope = double( i_FreqOffset1 - i_FreqOffset2 )/
  1103.                 double( i_DAC2 - i_DAC1 );
  1104.     i_Slope_inv = (int)( RF_AFC_SLOPE_DENOMINATOR * ( i_DAC2 - i_DAC1 )) /
  1105.                     ( i_FreqOffset1 - i_FreqOffset2 )/Afc_Slope_factor;
  1106. #endif
  1107. #if 0 // mark temp
  1108.     int i_band_index = MF_rf_afc_ptr->Get_Band_Index(  m_asAFC_BAND );
  1109.     float Afc_Slope_factor = MF_rf_afc_ptr->Get_Afc_Slope_factor(i_band_index);
  1110.     slope = (float)( RF_AFC_SLOPE_DENOMINATOR * 1.0 / ( i_Slope_inv * Afc_Slope_factor ));
  1111.     i_DAC2 = (unsigned short)  ((i_FreqOffset1/slope)+ i_DAC1);
  1112.     MF_rf_afc_req->dacValue = i_DAC2;
  1113.     if ( META_Rf_AFC_r(  m_META_HANDLE_Obj.Get_MainHandle(),
  1114.                          MF_rf_afc_req,
  1115.                       MF_rf_afc_cb,
  1116.                       &MF_rf_afc_token,
  1117.                       NULL
  1118.                     ) != META_SUCCESS )
  1119.     {
  1120.         CalErrorHandler( WM_MF_RF_AFC_CONTROL_FAIL );
  1121.         log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  1122.                   " FAIL : Target < ARFCN = "+ IntToStr( m_sARFCN_C0_GSM ) +
  1123.                   ", dac value = "+ IntToStr( i_DAC2 ) +
  1124.                   ", gain = " + IntToStr(   MF_rf_afc_req->gain ) +
  1125.                   ", testing number = " + IntToStr( m_sN_AFC )
  1126.                 );
  1127.         return false;
  1128.     }
  1129.     log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  1130.              " Target < ARFCN = "+ IntToStr( bch ) +
  1131.              ", dac value = "+ IntToStr( i_DAC2 ) +
  1132.              ", gain = " + IntToStr(   MF_rf_afc_req->gain ) +
  1133.              ", testing number = " + IntToStr( m_sN_AFC )
  1134.            );
  1135.     if ( this->Terminated )
  1136.     {
  1137.         this->OnTerminate = neByUser;
  1138.         log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  1139.                   " Terminate at line " + AnsiString(__FILE__) + " " + AnsiString(__LINE__)
  1140.                 );
  1141.         return false;
  1142.     }
  1143.     log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  1144.               " TimerCal->Enabled 3= " + IntToStr((int)frmFatcory->TimerCal->Enabled)
  1145.            );
  1146.     RestartTimerCal( WM_MF_RF_AFC_CONTROL_FAIL );
  1147.     is_suspend_cal = true;
  1148.     this->Suspend();
  1149.     is_suspend_cal = false;
  1150.     if ( this->Terminated )
  1151.     {
  1152.         log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  1153.                   " Terminate at line " + AnsiString(__FILE__) + " " + AnsiString(__LINE__)
  1154.                 );
  1155.         this->OnTerminate = neByUser;
  1156.         return false;
  1157.     }
  1158.     if ( MF_rf_afc_cnf->fcb_ok_number <= 0 )
  1159.     {
  1160.         CalErrorHandler( WM_MF_RF_AFC_CONTROL_FAIL );
  1161.         log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  1162.                   " FAIL : Target< FB detection fail "
  1163.                 );
  1164.         return false;
  1165.     }
  1166.     i_FreqOffset2 =  MF_rf_afc_cnf->freqOffset;
  1167.     log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  1168.              " Target > freqOffset = "+ IntToStr( i_FreqOffset2 )
  1169.            );
  1170.     //slope = (float)( RF_AFC_SLOPE_DENOMINATOR * 1.0 / ( i_Slope_inv ));
  1171.     us_init_value = (unsigned short) ((i_FreqOffset2/slope)+ i_DAC2);
  1172.    // slope = slope * Afc_Slope_factor; // normalization
  1173. ///// write afc to fdm
  1174.    // if( frmFatcory->rbAgilent8960->Checked && frmFatcory->rbCrystal->Checked )
  1175.    // {   MF_rf_afc_req->dacValue = us_init_value | TIMESLOT_3<<13;
  1176.    // }
  1177.    // else if( frmFatcory->rbCMU200->Checked && frmFatcory->rbCrystal->Checked )
  1178.    // {   MF_rf_afc_req->dacValue = us_init_value | TIMESLOT_0<<13;
  1179.    // }
  1180.    // else // TVCVXO
  1181.     {
  1182.         MF_rf_afc_req->dacValue = us_init_value;
  1183.     }
  1184.     MF_rf_afc_req->arfcn    = bch;
  1185.    // MF_rf_afc_req->dacValue = us_init_value;
  1186.     MF_rf_afc_req->gain     = (MF_RF_GAIN_TO_BE_SUB - d_P_DL) * GAIN_REQUEST_PC_SIDE_MULTIPLY;
  1187.     MF_rf_afc_req->testNumber = 1;
  1188.     if ( META_Rf_AFC_r( m_META_HANDLE_Obj.Get_MainHandle(), MF_rf_afc_req, MF_rf_afc_cb, &MF_rf_afc_token,NULL ) != META_SUCCESS )
  1189.     {
  1190.         CalErrorHandler( WM_MF_RF_AFC_CONTROL_FAIL );
  1191.         log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  1192.                   " FAIL : Target < AFC: ARFCN = "+ IntToStr( bch ) +
  1193.                   ", dac value = "+ IntToStr( us_init_value ) +
  1194.                   ", gain = " + IntToStr(   MF_rf_afc_req->gain ) +
  1195.                   ", testing number = " + IntToStr( m_sN_AFC )
  1196.                 );
  1197.         return false;
  1198.     }
  1199.     if ( this->Terminated )
  1200.     {
  1201.         this->OnTerminate = neByUser;
  1202.         return false;
  1203.     }
  1204.     log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  1205.              " Target < ARFCN = "+ IntToStr( bch ) +
  1206.              ", dac value = "+ IntToStr( us_init_value ) +
  1207.              ", gain = " + IntToStr(   MF_rf_afc_req->gain ) +
  1208.              ", testing number = " + IntToStr( m_sN_AFC )
  1209.            );
  1210.     log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  1211.                             " TimerCal->Enabled 2= " + IntToStr((int)frmFatcory->TimerCal->Enabled)
  1212.                           );
  1213.     RestartTimerCal( WM_MF_RF_AFC_CONTROL_FAIL );
  1214.     is_suspend_cal = true;
  1215.     this->Suspend();
  1216.     is_suspend_cal = false;
  1217.     if ( this->Terminated )
  1218.     {
  1219.         log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  1220.                   " Terminate at line " + AnsiString(__FILE__) + " " + AnsiString(__LINE__)
  1221.                 );
  1222.         this->OnTerminate = neByUser;
  1223.         return false;
  1224.     }
  1225.     // set AFC initial DAC value
  1226.     MF_rf_SetAfcDacValue->dacValue = us_init_value;
  1227.     if ( META_Rf_SetAfcDacValue_r( m_META_HANDLE_Obj.Get_MainHandle(), MF_rf_SetAfcDacValue, MF_rf_SetAfcDacValue_cb, &MF_rf_afc_token, NULL)
  1228.          != META_SUCCESS )
  1229.     {
  1230.         CalErrorHandler( WM_MF_RF_SET_AFC_DAC_FAIL );
  1231.         log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  1232.                 " FAIL : Target < Set AFC DAC = "+ IntToStr( MF_rf_SetAfcDacValue->dacValue )
  1233.               );
  1234.         return false;
  1235.     }
  1236.     log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  1237.                 " Target < Set AFC DAC = "+ IntToStr( MF_rf_SetAfcDacValue->dacValue )
  1238.               );
  1239.     RestartTimerCal( WM_MF_RF_SET_AFC_DAC_CNF_FAIL );
  1240.     is_suspend_cal = true;
  1241.     this->Suspend();
  1242.     is_suspend_cal = false;
  1243.     if( RfSetAfcDacCnf == false )
  1244.     {
  1245.         CalErrorHandler( WM_MF_RF_SET_AFC_DAC_CNF_FAIL );
  1246.         log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  1247.                 " FAIL : Target < Set AFC DAC = "+ IntToStr( MF_rf_SetAfcDacValue->dacValue )
  1248.               );
  1249.         return false;
  1250.     }
  1251. #endif
  1252.     return true;
  1253. } // AFCSlopeCal()
  1254. //******************************************************************************
  1255. //                         Crystal AFC calibration
  1256. //******************************************************************************
  1257. bool __fastcall T_META_factory_calibration::CrystalAFCCapIDCommon( void )
  1258. {
  1259.     //bool  isAgilent8960Seleced = frmFatcory->rbAgilent8960->Checked;
  1260.     int   vi_CRYSTAL_AFC_BAND;
  1261.     char  tempbuf[256];
  1262.     PostMessage(
  1263.                      ctrl.hPostMsgDestHandle,
  1264.                      WM_MF_RF_CRYSTAL_AFC_CAPID_BEGIN,
  1265.                      0,
  1266.                      0
  1267.                     );
  1268.     log->Add( "n" +DateToStr(Date()) +  " " + CurrentTimeStr() +
  1269.               " ================= Crystal CAPID calibration begin ================ "
  1270.            );
  1271.     //int init_cap_id = MF_crystal_afc_ptr->Get_cap_id(); // get cap_id from NVRAM
  1272.     FrequencyBand freq_band = Get_FreqBandFromAnsiString( as_CRYSTAL_AFC_BAND );
  1273.     vi_CRYSTAL_AFC_BAND = Get_AgeBand( as_CRYSTAL_AFC_BAND );
  1274.     if(  getCenterFreq(freq_band, m_sCRYSTAL_AFC_ARFCN, false, &d_CAL_Center_Freq) == false )
  1275.     {
  1276.         CalErrorHandler( WM_MF_RF_CRYSTAL_AFC_CHECK_FAIL );
  1277.         log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  1278.                             " FAIL : get center frequency error."
  1279.                         );
  1280.         return false;
  1281.     }
  1282.     if (!m_rct_ctrl.RCT_operatingMode(m_pRct, OPERATING_MODE_GSM_BCH_TCH))
  1283.     {
  1284.         CalErrorHandler(WM_MF_AGE8960_SET_OPERATION_MODE_FAIL);
  1285.         log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  1286.                  " FAIL: " +
  1287.                  m_pRct->as_RCT + " < Operation mode = GSM BCH+TCH"
  1288.                  );
  1289.         return false;
  1290.     }
  1291.     if (!m_rct_ctrl.RCT_cellBand(m_pRct, vi_CRYSTAL_AFC_BAND))
  1292.     {
  1293.         CalErrorHandler(WM_MF_AGE8960_SET_BAND_FAIL);
  1294.         log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  1295.                  " FAIL : " +
  1296.                  m_pRct->as_RCT + " < Band = " + ViBand_To_Str(vi_CRYSTAL_AFC_BAND)
  1297.                  );
  1298.         return false;
  1299.     }
  1300.     if (this->Terminated)
  1301.     {
  1302.         this->OnTerminate = neByUser;
  1303.         return false;
  1304.     }
  1305.     log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  1306.              m_pRct->as_RCT + " < Band = " +
  1307.              FreqBand_To_Str(AgeBand_To_FreqBand(vi_CRYSTAL_AFC_BAND))
  1308.              );
  1309.     if (!m_rct_ctrl.RCT_cellPower(m_pRct, d_P_DL))
  1310.     {
  1311.         CalErrorHandler(WM_MF_AGE8960_SET_POWER_FAIL);
  1312.         log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() + " FAIL: " + m_pRct->as_RCT + " < Power = " +
  1313.                  Double_To_AnsiString(d_P_DL)) + " dBm";
  1314.         return false;
  1315.     }
  1316.     if (this->Terminated)
  1317.     {
  1318.         this->OnTerminate = neByUser;
  1319.         return false;
  1320.     }
  1321.     log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() + " " +
  1322.              m_pRct->as_RCT + " < cell power = "+
  1323.              Double_To_AnsiString(d_P_DL)
  1324.              );
  1325.    // short bch_arfcn = ::Get_SeperateChannel( vi_CRYSTAL_AFC_BAND, m_sCRYSTAL_AFC_ARFCN );
  1326.     if (!m_rct_ctrl.RCT_BCHARFCN(m_pRct, m_sCRYSTAL_AFC_ARFCN))
  1327.     {
  1328.         CalErrorHandler(WM_MF_AGE8960_SET_TCH_ARFCN_FAIL);
  1329.         log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  1330.                      " FAIL : " +
  1331.                      m_pRct->as_RCT + " < BCH ARFCN = " + IntToStr( m_sCRYSTAL_AFC_ARFCN )
  1332.                     );
  1333.         return false;
  1334.     }
  1335.     if (!m_rct_ctrl.RCT_TCHARFCN(m_pRct, m_sCRYSTAL_AFC_ARFCN))
  1336.     {
  1337.         CalErrorHandler(WM_MF_AGE8960_SET_TCH_ARFCN_FAIL);
  1338.         log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  1339.                               " FAIL :"+
  1340.                               m_pRct->as_RCT + " < TCH ARFCN = " + IntToStr( m_sCRYSTAL_AFC_ARFCN )
  1341.                     );
  1342.         return false;
  1343.     }
  1344.     log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  1345.                       m_pRct->as_RCT + " < TCH ARFCN = " + IntToStr( m_sCRYSTAL_AFC_ARFCN )
  1346.                 );
  1347.     if ( this->Terminated )
  1348.     {
  1349.         this->OnTerminate = neByUser;
  1350.         return false;
  1351.     }
  1352.     if (!m_rct_ctrl.RCT_ConfigTSC(m_pRct, m_cTSC))
  1353.     {
  1354.         CalErrorHandler(WM_MF_AGE8960_SET_TSC_FAIL);
  1355.         log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  1356.                               "FAIL : " + m_pRct->as_RCT + " < set TSC fail."
  1357.                     );
  1358.         return false;
  1359.     }
  1360.     EquConfigPFER();
  1361.     if ( this->Terminated )
  1362.     {
  1363.         this->OnTerminate = neByUser;
  1364.         return false;
  1365.     }
  1366.     int i_CRYSTAL_AFC_PCL = Get_CRYSTAL_AFC_PCL( as_CRYSTAL_AFC_BAND );
  1367.     if( ! m_rct_ctrl.RCT_MSTXLevel( m_pRct, i_CRYSTAL_AFC_PCL ) )
  1368.     {
  1369.         CalErrorHandler(WM_MF_AGE8960_SET_MS_TX_LEVEL_FAIL);
  1370.         log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  1371.                       " FAIL : " + m_pRct->as_RCT + " < MS TX level = " + IntToStr(i_CRYSTAL_AFC_PCL)
  1372.                     );
  1373.         return false;
  1374.     }
  1375.     log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  1376.                       m_pRct->as_RCT + " < MS TX level = " + IntToStr(i_CRYSTAL_AFC_PCL)
  1377.                     );
  1378.     if ( this->Terminated )
  1379.     {
  1380.         this->OnTerminate = neByUser;
  1381.         return false;
  1382.     }
  1383.     if( freq_band == FrequencyBand1900 )
  1384.     {
  1385.         if(META_Rf_SelectFrequencyBand1900_r( m_pCal->i_MainMETAHandle,  1, MF_SelectBand_cnf_cb, &MF_SelectBand_token, NULL) !=  META_SUCCESS)
  1386.         {
  1387.             CalErrorHandler( WM_MF_RF_CRYSTAL_AFC_SELECT_BAND_FAIL );
  1388.             log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  1389.                   " FAIL : Target < set Band1900 flag = 1 "
  1390.                 );
  1391.             return false;
  1392.         }
  1393.         log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  1394.                   " Target < set Band1900 flag = 1 "
  1395.                 );
  1396.     }
  1397.     else
  1398.     {
  1399.         if(META_Rf_SelectFrequencyBand1900_r( m_pCal->i_MainMETAHandle, 0, MF_SelectBand_cnf_cb, &MF_SelectBand_token, NULL) !=  META_SUCCESS)
  1400.         {
  1401.             CalErrorHandler( WM_MF_RF_CRYSTAL_AFC_SELECT_BAND_FAIL );
  1402.             log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  1403.                   " FAIL : Target < set Band1900 flag = 0 "
  1404.                 );
  1405.             return false;
  1406.         }
  1407.         log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  1408.                   " Target < set Band1900 flag = 0 "
  1409.                 );
  1410.     }
  1411.     is_suspend_cal = true;
  1412.     this->Suspend();
  1413.     is_suspend_cal = false;
  1414.     return true;
  1415. }
  1416. //---------------------------------------------------------------------------
  1417. bool __fastcall T_META_factory_calibration::CrystalAFCCapIDPreCheck( void )
  1418. {
  1419.     char tempbuf[256];
  1420.     log->Add( "n" +DateToStr(Date()) +  " " + CurrentTimeStr() +
  1421.               " --------------  Crystal AFC pre-check begin --------------- "
  1422.            );
  1423.     int prechk_cap_id[2];
  1424.     double prechk_freq_err[2];
  1425.     prechk_cap_id[0] = CAP_ID_MIN;
  1426.     prechk_cap_id[1] = MF_crystal_afc_ptr->Get_max_cap_id(m_pCal->ui_rf_id);
  1427.     int i;
  1428.     for(i=0; i<2; i++)
  1429.     {
  1430.         MF_crystal_afc_ptr->Set_cap_id(prechk_cap_id[i]);
  1431.         CrystalCfg_req.cap_id = prechk_cap_id[i];
  1432.         if (WRITE_NVARM == m_pCal->s_crystal_afc_option.crystal_cap_id_update)
  1433.         {
  1434.             MF_crystal_afc_ptr->ConfirmCallback = ::ccb_write_CrystalAFC_to_nvram;
  1435.             MF_crystal_afc_ptr->REQ_Write_CAPID_To_NVRAM_Start();
  1436.             is_suspend_cal = true;
  1437.             this->Suspend();
  1438.             is_suspend_cal = false;
  1439.             E_METAAPP_RESULT_T state = MF_crystal_afc_ptr->Get_ConfirmState();
  1440.             if (state != METAAPP_SUCCESS)
  1441.             {
  1442.                 if (METAAPP_NVRAM_LID_VER_NOT_SUPPORT == state)
  1443.                 {
  1444.                     CalErrorHandler(WM_MF_NVRAM_EF_L1_CRYSTAL_CAPDATA_LID_VERNO_FAIL);
  1445.                     log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  1446.                              " FAIL : NVRAM_EF_L1_CRYSTAL_CAPDATA_LID version is not support, please update META to latest version. "
  1447.                              );
  1448.                 }
  1449.                 else
  1450.                 {
  1451.                     CalErrorHandler(WM_MF_NVRAM_CRYSTAL_AFC_CAPID_WRITE_FAIL);
  1452.                     log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  1453.                              " FAIL : Target< Write crystal AFC CAP ID to NVRAM fail "
  1454.                              );
  1455.                 }
  1456.                 return false;
  1457.             }
  1458.         }
  1459.         else
  1460.         {
  1461.             MetaResult = META_Rf_SetCrystalCapId_r( m_pCal->i_MainMETAHandle, 5000, &CrystalCfg_req );
  1462.             if( MetaResult != META_SUCCESS )
  1463.             {
  1464.                 CalErrorHandler( WM_MF_RF_CRYSTAL_AFC_SET_CAPID_FAIL );
  1465.                 log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  1466.                           " FAIL : Target< Set crystal AFC CAP ID fail "
  1467.                         );
  1468.                 return false;
  1469.             }
  1470.         }
  1471.         if ( this->Terminated )
  1472.         {
  1473.             this->OnTerminate = neByUser;
  1474.             return false;
  1475.         }
  1476.         Sleep(50);
  1477.         if (!MF_rf_stop.REQ_Start())
  1478.         {
  1479.             CalErrorHandler( WM_MF_RF_STOP_FAIL );
  1480.             log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  1481.                           " FAIL: Target < stop RF fail."
  1482.                         );
  1483.             return false;
  1484.         }
  1485.        // Sleep(50);
  1486.        int i_CRYSTAL_AFC_PCL = Get_CRYSTAL_AFC_PCL( as_CRYSTAL_AFC_BAND );
  1487.         MF_rf_tx_level_req->arfcn    = m_sCRYSTAL_AFC_ARFCN;
  1488.         MF_rf_tx_level_req->bsic     = m_cTSC;
  1489.         MF_rf_tx_level_req->power    = i_CRYSTAL_AFC_PCL;
  1490.         MF_rf_tx_level_req->frames   = 2000;
  1491.         MF_rf_tx_level_req->dacValue = m_sCRYSTAL_AFC_CAL_DAC;
  1492.         MF_rf_tx_level_req->burstTypeNB = NB_TX_RANDOM_WITH_TSC; // NB burst
  1493.         if ( META_Rf_NB_TX_r(   m_pCal->i_MainMETAHandle,
  1494.                     MF_rf_tx_level_req,
  1495.                     cb_MF_rf_tx_level_crystal,
  1496.                     &MF_rf_tx_level_token,
  1497. NULL
  1498.                            ) != META_SUCCESS)
  1499.         {
  1500.             CalErrorHandler( WM_MF_RF_TX_LEVEL_FAIL );
  1501.             log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  1502.                       " FAIL : Target< ARFCN = " + IntToStr(m_sCRYSTAL_AFC_ARFCN) +
  1503.                       ", TSC = " + IntToStr( m_cTSC ) +
  1504.                       ", power = " + IntToStr(i_CRYSTAL_AFC_PCL) +
  1505.                       ", frames = " + IntToStr(i_N_TX) +
  1506.                       ", dac value = " + IntToStr( m_sDefault_value )
  1507.                     );
  1508.             return false;
  1509.         }
  1510.         is_suspend_cal = true;
  1511.         this->Suspend();
  1512.         is_suspend_cal = false;
  1513.         if (! MF_rf_tx_level_cnf )
  1514.         {
  1515.             CalErrorHandler( WM_MF_RF_CRYSTAL_AFC_TX_LEVEL_FAIL );
  1516.             log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  1517.                       " FAIL: TX level (! MF_rf_tx_level_cnf ) ."
  1518.                     );
  1519.             return false;
  1520.         }
  1521.         if( ! FetchAverageFreqErr( prechk_freq_err[i] ) )
  1522.         {
  1523.            return false;
  1524.         }
  1525.         log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  1526.                     " CAP ID = " + IntToStr( prechk_cap_id[i] ) + "," +
  1527.                     " AFC DAC = " + IntToStr( m_sCRYSTAL_AFC_CAL_DAC ) + "," +
  1528.                     " Freq error = " + Double_To_AnsiString(prechk_freq_err[i])
  1529.                 );
  1530.         sprintf(tempbuf, "%8.3f", prechk_freq_err[i]/d_CAL_Center_Freq);
  1531.         m_pCal->as_ResultBuf = m_pCal->as_ResultBuf + tempbuf + ", ";
  1532.     }  // pre-check
  1533.     if( prechk_freq_err[0] * prechk_freq_err[1] > 0  )
  1534.     {
  1535.          m_bBypassCapIDCal = true;
  1536.          if( Abs_double(prechk_freq_err[0]) < Abs_double(prechk_freq_err[1]) )
  1537.          {
  1538.              min_CapIdFreqErr.cap_id = prechk_cap_id[0];
  1539.          }
  1540.          else
  1541.          {
  1542.              min_CapIdFreqErr.cap_id = prechk_cap_id[1];
  1543.          }
  1544.          MF_crystal_afc_ptr->Set_cap_id( min_CapIdFreqErr.cap_id );
  1545.          MF_crystal_afc_ptr->ConfirmCallback = ::ccb_write_CrystalAFC_to_nvram;
  1546.          MF_crystal_afc_ptr->REQ_Write_CAPID_To_NVRAM_Start();
  1547.          is_suspend_cal = true;
  1548.          this->Suspend();
  1549.          is_suspend_cal = false;
  1550.         E_METAAPP_RESULT_T state = MF_crystal_afc_ptr->Get_ConfirmState();
  1551.         if (state != METAAPP_SUCCESS)
  1552.         {
  1553.             if (METAAPP_NVRAM_LID_VER_NOT_SUPPORT == state)
  1554.             {
  1555.                 CalErrorHandler(WM_MF_NVRAM_EF_L1_CRYSTAL_CAPDATA_LID_VERNO_FAIL);
  1556.                 log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  1557.                          " FAIL : NVRAM_EF_L1_CRYSTAL_CAPDATA_LID version is not support, please update META to latest version. "
  1558.                          );
  1559.             }
  1560.             else
  1561.             {
  1562.                 CalErrorHandler(WM_MF_NVRAM_CRYSTAL_AFC_CAPID_WRITE_FAIL);
  1563.                 log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  1564.                              " FAIL : Target< Write crystal AFC CAP ID to NVRAM fail "
  1565.                              );
  1566.             }
  1567.             return false;
  1568.         }
  1569.     }
  1570.     else
  1571.     {
  1572.         m_bBypassCapIDCal = false;
  1573.     }
  1574.     if( prechk_freq_err[0] < prechk_freq_err[1] )
  1575.     {
  1576.         m_bFreqErrIncrease = true;
  1577.     }
  1578.     else
  1579.     {
  1580.         m_bFreqErrIncrease = false;
  1581.     }
  1582.     log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  1583.               " --------------  Crystal AFC pre-check end ----------------- "
  1584.            );
  1585.     Sleep(50);
  1586.     if (!MF_rf_stop.REQ_Start())
  1587.     {
  1588.         CalErrorHandler( WM_MF_RF_STOP_FAIL );
  1589.         log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  1590.                           " FAIL: Target < stop RF fail."
  1591.                         );
  1592.         return false;
  1593.     }
  1594.     return true;
  1595. }
  1596. //---------------------------------------------------------------------------
  1597. bool __fastcall T_META_factory_calibration::CrystalAFCCapIDCalDec(void)
  1598. {
  1599.     int init_cap_id = MF_crystal_afc_ptr->Get_cap_id();
  1600.     min_CapIdFreqErr.cap_id = init_cap_id;
  1601.     min_CapIdFreqErr.FreqErr = 1000000000.0;
  1602.     cal_CapIdFreqErr.cap_id = min_CapIdFreqErr.cap_id;
  1603.     int pre_cap_id = -1;
  1604.     int cap_id_max;
  1605.     int first_cap_id = CAP_ID_MIN;
  1606.     int last_cap_id = MF_crystal_afc_ptr->Get_max_cap_id(m_pCal->ui_rf_id);
  1607.     cap_id_max  = last_cap_id;
  1608.     int count=0;
  1609.     while( min_CapIdFreqErr.FreqErr != 0.0       &&
  1610.            first_cap_id < last_cap_id            &&
  1611.            CAP_ID_MIN <= cal_CapIdFreqErr.cap_id &&
  1612.            cal_CapIdFreqErr.cap_id <= cap_id_max &&
  1613.            count < m_sCRYSTAL_AFC_RECURSIVE_TIMES
  1614.          )
  1615.     {
  1616.         count++;
  1617.         MF_crystal_afc_ptr->Set_cap_id(cal_CapIdFreqErr.cap_id);
  1618.         CrystalCfg_req.cap_id = cal_CapIdFreqErr.cap_id;
  1619.         if (WRITE_NVARM == m_pCal->s_crystal_afc_option.crystal_cap_id_update)
  1620.         {
  1621.             MF_crystal_afc_ptr->ConfirmCallback = ::ccb_write_CrystalAFC_to_nvram;