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

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_PhaseError.cpp
  40.  *
  41.  * Project:
  42.  * --------
  43.  *   Maui META APP
  44.  *
  45.  * Description:
  46.  * ------------
  47.  *  Phase error 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. // misc
  75. #ifndef  _BAND_UTILS_H_
  76. #include "band_utils.h"
  77. #endif
  78. #ifndef  _MATH_UTILS_H_
  79. #include "math_utils.h"
  80. #endif
  81. #ifndef  _AGE_MISC_H_
  82. #include "age_misc.h"
  83. #endif
  84. #ifndef  _GSM_UTILS_H_
  85. #include "gsm_utils.h"
  86. #endif
  87. #ifndef  _TIME_UTILS_H_
  88. #include "time_utils.h"
  89. #endif
  90. // equipment
  91. #ifndef _AGECOMMON_H_
  92. #include "agecommon.h"
  93. #endif
  94. // TX phase error calibration
  95. #ifndef _RF_OFFSET_IQ_SWEEP_INIT_AGE8960_H_
  96. #include "rf_offset_iq_sweep_init_age8960.h"
  97. #endif
  98. #ifndef  _RF_TXIQ_H_
  99. #include "rf_txiq.h"
  100. #endif
  101. // form
  102. #ifndef _META_FACTORY_H_
  103. #include "META_Factory.h"
  104. #endif
  105. // call back
  106. #ifndef _META_FACTORY_NVRAM_CB_H_
  107. #include "meta_factory_nvram_cb.h"
  108. #endif
  109. #ifndef _META_FACTORY_RF_CB_H_
  110. #include "meta_factory_rf_cb.h"
  111. #endif
  112. //----------------------------------------------------------------------------
  113. // phase error
  114. extern RfNbtx_Req *MF_rf_tx_level_req;
  115. extern CRFTXIQ*  MF_rf_txiq_ptr;
  116. // Tthread
  117. extern T_META_factory_calibration* pt_calibration;
  118. extern bool  is_suspend_cal; // in T_META_factory_calibration.cpp
  119. //==============================================================================
  120. bool __fastcall T_META_factory_calibration::TxPhaseErrorCal( void )
  121. {
  122.      char tempbuf[256];
  123.      PostMessage(
  124.                      ctrl.hPostMsgDestHandle,
  125.                      WM_MF_RF_TX_PHASE_ERR_BEGIN,
  126.                      0,
  127.                      0
  128.                     );
  129.     if( ! TrimOffIQCalCommon() )
  130.     {
  131.         return false;
  132.     }
  133.     log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  134.                       " ============== TX phase error calibration precheck begin ================== "
  135.                     );
  136.     MF_rf_tx_level_req->arfcn = m_sPHASE_ERROR_ARFCN;
  137.     MF_rf_tx_level_req->bsic  =  m_cTSC;
  138.     MF_rf_tx_level_req->power    = i_PHASE_ERROR_PCL;
  139.     MF_rf_tx_level_req->frames   = 1000;
  140.     MF_rf_tx_level_req->dacValue = m_sDefault_value;
  141.     MF_rf_tx_level_req->burstTypeNB = NB_TX_RANDOM_WITH_TSC;
  142.     if ( META_Rf_NB_TX_r(
  143.                     MF_rf_tx_level_req,
  144.                     ::ccb_MF_rf_tx_level_TrOff,
  145.                     &MF_rf_tx_level_token,
  146.                                     NULL
  147.                        ) != META_SUCCESS)
  148.     {
  149.          CalErrorHandler( WM_MF_RF_TX_LEVEL_FAIL );
  150.          log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  151.                       " FAIL : Target < ARFCN = " + IntToStr( s_ARFCN ) +
  152.                       ", TSC = " + IntToStr( m_cTSC ) +
  153.                       ", power = " + IntToStr( i_PHASE_ERROR_PCL ) +
  154.                       ", frames = " + IntToStr(i_N_TX) +
  155.                       ", dac value = " + IntToStr( m_sDefault_value )
  156.                     );
  157.          return false;
  158.     }
  159.     is_suspend_cal = true;
  160.     this->Suspend();
  161.     is_suspend_cal = false;
  162.     if( ! FetchRMSPhaseErr( &PFERRMSError ) )
  163.     {
  164.         return false;
  165.     }
  166.     #if 0
  167.     if (! cfg->get_PHASE_ERROR_RMS_ERROR( d_PHASE_ERROR_RMS_ERROR ))
  168.     {
  169.         CalErrorHandler( WM_MF_CFG_READ_FAIL );
  170.         log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  171.                               " FAIL: Read config file fail(PHASE_ERROR_RMS_ERROR)."
  172.                 );
  173.         return false;
  174.     }
  175.     #endif
  176.     
  177.     
  178.     if( d_PHASE_ERROR_RMS_ERROR < PFERRMSError )
  179.     {
  180.         log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  181.                   " FAIL: TX phase error calibration. Precheck RMS phase error = " + Double_To_AnsiString(PFERRMSError) +
  182.                     ", Max RMS phase error = " + Double_To_AnsiString( d_PHASE_ERROR_RMS_ERROR )
  183.                 );
  184.     }
  185.     else
  186.     {
  187.         log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  188.                               " PASS: TX phase error calibration. Precheck RMS phase error = " + Double_To_AnsiString(PFERRMSError) +
  189.                               ", Max RMS phase error = " + Double_To_AnsiString( d_PHASE_ERROR_RMS_ERROR )
  190.                 );
  191.         PostMessage(
  192.                      ctrl.hPostMsgDestHandle,
  193.                      WM_MF_RF_TX_PHASE_ERR_CALIBRATION_DONE,
  194.                      0,
  195.                      0
  196.                     );
  197.         return true;
  198.     }
  199.    // Sleep(50);
  200.     STOP_RF
  201.     log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  202.                       " ============== TX phase error calibration precheck end ================== "
  203.                     );
  204.     log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  205.              " ============== TX phase error calibration begin ================== "
  206.            );
  207.     // calibrate Offset I
  208.     bool iscalibrated[64];
  209.     int i;
  210.     for(i=0; i<sizeof(iscalibrated); i++)
  211.     {
  212.        iscalibrated[i] = false;
  213.     }
  214.     min_OffIPhErr.Off_IQ = 0;
  215.     min_OffIPhErr.PhaseErr = 100000.0;
  216.     begin_Offset_IQ = MIN_OFFSET_IQ;
  217.     end_Offset_IQ = MAX_OFFSET_IQ;
  218.     //last_Off_IQ[0] = 0;
  219.     //last_Off_IQ[1] = 0;
  220.     cal_OffIQPhErr[0].Off_IQ = MIN_OFFSET_IQ;
  221.     cal_OffIQPhErr[1].Off_IQ = MAX_OFFSET_IQ;
  222.     while( min_OffIPhErr.PhaseErr !=0.0 && cal_OffIQPhErr[0].Off_IQ < cal_OffIQPhErr[1].Off_IQ &&
  223.            begin_Offset_IQ < end_Offset_IQ &&
  224.            MIN_OFFSET_IQ<=cal_OffIQPhErr[0].Off_IQ && cal_OffIQPhErr[0].Off_IQ<=MAX_OFFSET_IQ  &&
  225.            MIN_OFFSET_IQ<=cal_OffIQPhErr[1].Off_IQ && cal_OffIQPhErr[1].Off_IQ<=MAX_OFFSET_IQ &&
  226.            !( cal_OffIQPhErr[0].Off_IQ == last_Off_IQ[0] && cal_OffIQPhErr[1].Off_IQ == last_Off_IQ[1])
  227.          )
  228.     {
  229.         last_Off_IQ[0] = cal_OffIQPhErr[0].Off_IQ;
  230.         last_Off_IQ[1] = cal_OffIQPhErr[1].Off_IQ;
  231.         cal_OffIQPhErr[0].Off_IQ = (begin_Offset_IQ + (begin_Offset_IQ+end_Offset_IQ)/2)/2;
  232.         cal_OffIQPhErr[1].Off_IQ = (end_Offset_IQ + (begin_Offset_IQ+end_Offset_IQ)/2)/2;
  233.        // log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  234.        //           " begin = " + IntToStr( begin_Offset_IQ ) +
  235.        //           ", end = " + IntToStr( end_Offset_IQ ) +
  236.        //           ", Off0 = " + IntToStr( cal_OffIQPhErr[0].Off_IQ ) +
  237.        //           ", Off1 = " + IntToStr( cal_OffIQPhErr[1].Off_IQ )
  238.        //                 );
  239.         for(i=0; i<2; i++)
  240.         {
  241.             if( iscalibrated[cal_OffIQPhErr[i].Off_IQ-MIN_OFFSET_IQ] )  continue;
  242.            // log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  243.            //           " begin = " + IntToStr( begin_Offset_IQ ) +
  244.            ///           ", end = " + IntToStr( end_Offset_IQ ) +
  245.            //           ", OffI = " + IntToStr( cal_OffIQPhErr[i].Off_IQ )
  246.            //             );
  247.             
  248.             // set BBTxCfg2
  249.             rf_bb_tx_cfg2_req.TxOffsetI = cal_OffIQPhErr[i].Off_IQ;
  250.             if( META_Rf_SetBBTxCfg2_r(500, &rf_bb_tx_cfg2_req, &rf_bb_tx_cfg2_cnf) != META_SUCCESS )
  251.             {
  252.                 CalErrorHandler( WM_MF_RF_SET_BB_TX_CFG_FAIL );
  253.                 log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  254.                           " FAIL: RF set BB TX config fail."
  255.                         );
  256.                 return false;
  257.             }
  258.             MF_rf_tx_level_req->arfcn = m_sPHASE_ERROR_ARFCN;
  259.             MF_rf_tx_level_req->bsic  =  m_cTSC;
  260.             MF_rf_tx_level_req->power    = i_PHASE_ERROR_PCL;
  261.             MF_rf_tx_level_req->frames   = 1000;
  262.             MF_rf_tx_level_req->dacValue = m_sDefault_value;
  263.             //MF_rf_tx_level_req->burstTypeNB = NB_TX_ALL_ONES_WITHOUT_TSC;
  264.             MF_rf_tx_level_req->burstTypeNB = NB_TX_RANDOM_WITH_TSC;
  265.             if ( META_Rf_NB_TX_r(
  266.                     MF_rf_tx_level_req,
  267.                     ::ccb_MF_rf_tx_level_TrOff,
  268.                     &MF_rf_tx_level_token,
  269.                                     NULL
  270.                        ) != META_SUCCESS)
  271.             {
  272.                 CalErrorHandler( WM_MF_RF_TX_LEVEL_FAIL );
  273.                 log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  274.                       " FAIL : Target < ARFCN = " + IntToStr( s_ARFCN ) +
  275.                       ", TSC = " + IntToStr( m_cTSC ) +
  276.                       ", power = " + i_PHASE_ERROR_PCL +
  277.                       ", frames = " + IntToStr(i_N_TX) +
  278.                       ", dac value = " + IntToStr( m_sDefault_value )
  279.                     );
  280.                 return false;
  281.             }
  282.             SUSPEND_CAL_THREAD
  283.             if( ! FetchRMSPhaseErr( &PFERRMSError ) )
  284.             {
  285.                 return false;
  286.             }
  287.             cal_OffIQPhErr[i].PhaseErr = PFERRMSError;
  288.            // Sleep(50);
  289.             STOP_RF
  290.         }  // for
  291.         iscalibrated[cal_OffIQPhErr[0].Off_IQ-MIN_OFFSET_IQ] = 1;
  292.         iscalibrated[cal_OffIQPhErr[1].Off_IQ-MIN_OFFSET_IQ] = 1;
  293.         if( Abs_double(cal_OffIQPhErr[0].PhaseErr) < Abs_double(cal_OffIQPhErr[1].PhaseErr) )
  294.         {
  295.             if( Abs_double(cal_OffIQPhErr[0].PhaseErr) < min_OffIPhErr.PhaseErr )
  296.             {
  297.                 min_OffIPhErr.Off_IQ = cal_OffIQPhErr[0].Off_IQ;
  298.                 min_OffIPhErr.PhaseErr = Abs_double(cal_OffIQPhErr[0].PhaseErr);
  299.                 log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  300.                       " OffsetI = " + IntToStr( min_OffIPhErr.Off_IQ ) +
  301.                       ", cal phase error = " + Double_To_AnsiString( min_OffIPhErr.PhaseErr )
  302.                     );
  303.                 //log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  304.                 //     " cal phase error = " + Double_To_AnsiString( min_OffIPhErr.PhaseErr )
  305.                 //    );
  306.             }
  307.            // if( (begin_Offset_IQ+end_Offset_IQ)%2 == 0 )
  308.           //  {
  309.           //      end_Offset_IQ = (begin_Offset_IQ+end_Offset_IQ)/2;
  310.           //  }
  311.           //  else
  312.            // {
  313.             //    end_Offset_IQ = (begin_Offset_IQ+end_Offset_IQ)/2 + 1;
  314.             //}
  315.                 end_Offset_IQ = (begin_Offset_IQ+end_Offset_IQ)/2;
  316.         }
  317.         else
  318.         {
  319.             if( Abs_double(cal_OffIQPhErr[1].PhaseErr) < min_OffIPhErr.PhaseErr )
  320.             {
  321.                 min_OffIPhErr.Off_IQ = cal_OffIQPhErr[1].Off_IQ;
  322.                 min_OffIPhErr.PhaseErr = Abs_double(cal_OffIQPhErr[1].PhaseErr);
  323.                 log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  324.                       " OffsetI = " + IntToStr( min_OffIPhErr.Off_IQ ) +
  325.                       ", cal phase error = " + Double_To_AnsiString( min_OffIPhErr.PhaseErr )
  326.                     );
  327.                // log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  328.                //       " cal phase error = " + Double_To_AnsiString( min_OffIPhErr.PhaseErr )
  329.                //    );
  330.             }
  331.            // if( (begin_Offset_IQ+end_Offset_IQ)%2 == 0 )
  332.           //  {
  333.           //      begin_Offset_IQ = (begin_Offset_IQ+end_Offset_IQ)/2;
  334.           //  }
  335.           //  else
  336.           //  {
  337.           //      begin_Offset_IQ = (begin_Offset_IQ+end_Offset_IQ)/2 - 1;
  338.            // }
  339.            begin_Offset_IQ = (begin_Offset_IQ+end_Offset_IQ)/2;
  340.         }
  341.     }//while
  342.     // set BBTxCfg2
  343.     rf_bb_tx_cfg2_req.TxOffsetI = min_OffIPhErr.Off_IQ;
  344.     if( META_Rf_SetBBTxCfg2_r(500, &rf_bb_tx_cfg2_req, &rf_bb_tx_cfg2_cnf) != META_SUCCESS )
  345.     {
  346.         CalErrorHandler( WM_MF_RF_SET_BB_TX_CFG_FAIL );
  347.         log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  348.                   " FAIL: RF set BB TX config fail."
  349.         );
  350.         return false;
  351.     }
  352.     MF_rf_txiq_ptr->Set_BBTx_OffsetI( rf_bb_tx_cfg2_req.TxOffsetI );
  353.     // calibrate Offset Q
  354.     for(i=0; i<sizeof(iscalibrated); i++)
  355.     {
  356.        iscalibrated[i] = false;
  357.     }
  358.     min_OffQPhErr.Off_IQ = 0;
  359.     min_OffQPhErr.PhaseErr = 100000.0;
  360.     begin_Offset_IQ = MIN_OFFSET_IQ;
  361.     end_Offset_IQ = MAX_OFFSET_IQ;
  362.     last_Off_IQ[0] = 0;
  363.     last_Off_IQ[1] = 0;
  364.     cal_OffIQPhErr[0].Off_IQ = MIN_OFFSET_IQ;
  365.     cal_OffIQPhErr[1].Off_IQ = MAX_OFFSET_IQ;
  366.     while( min_OffQPhErr.PhaseErr !=0.0 && cal_OffIQPhErr[0].Off_IQ < cal_OffIQPhErr[1].Off_IQ &&
  367.            begin_Offset_IQ < end_Offset_IQ &&
  368.            MIN_OFFSET_IQ<=cal_OffIQPhErr[0].Off_IQ && cal_OffIQPhErr[0].Off_IQ<=MAX_OFFSET_IQ  &&
  369.            MIN_OFFSET_IQ<=cal_OffIQPhErr[1].Off_IQ && cal_OffIQPhErr[1].Off_IQ<=MAX_OFFSET_IQ  &&
  370.            !( cal_OffIQPhErr[0].Off_IQ == last_Off_IQ[0] && cal_OffIQPhErr[1].Off_IQ == last_Off_IQ[1])
  371.          )
  372.     {
  373.         last_Off_IQ[0] = cal_OffIQPhErr[0].Off_IQ;
  374.         last_Off_IQ[1] = cal_OffIQPhErr[1].Off_IQ;
  375.         cal_OffIQPhErr[0].Off_IQ = (begin_Offset_IQ + (begin_Offset_IQ+end_Offset_IQ)/2)/2;
  376.         cal_OffIQPhErr[1].Off_IQ = (end_Offset_IQ + (begin_Offset_IQ+end_Offset_IQ)/2)/2;
  377.         //log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  378.         //          " begin = " + IntToStr( begin_Offset_IQ ) +
  379.         //          ", end = " + IntToStr( end_Offset_IQ ) +
  380.         //          ", Off0 = " + IntToStr( cal_OffIQPhErr[0].Off_IQ ) +
  381.         //          ", Off1 = " + IntToStr( cal_OffIQPhErr[1].Off_IQ )
  382.         //                );
  383.         for(int i=0; i<2; i++)
  384.         {
  385.             if( iscalibrated[cal_OffIQPhErr[i].Off_IQ-MIN_OFFSET_IQ] )  continue;
  386.             //log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  387.             //          " begin = " + IntToStr( begin_Offset_IQ ) +
  388.             ///          ", end = " + IntToStr( end_Offset_IQ ) +
  389.             //          ", OffQ = " + IntToStr( cal_OffIQPhErr[i].Off_IQ )
  390.             //            );
  391.             // set BBTxCfg2
  392.             rf_bb_tx_cfg2_req.TxOffsetQ = cal_OffIQPhErr[i].Off_IQ;
  393.             if( META_Rf_SetBBTxCfg2_r(500, &rf_bb_tx_cfg2_req, &rf_bb_tx_cfg2_cnf) != META_SUCCESS )
  394.             {
  395.                 CalErrorHandler( WM_MF_RF_SET_BB_TX_CFG_FAIL );
  396.                 log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  397.                           " FAIL: RF set BB TX config fail."
  398.                         );
  399.                 return false;
  400.             }
  401.             MF_rf_tx_level_req->arfcn = m_sPHASE_ERROR_ARFCN;
  402.             MF_rf_tx_level_req->bsic  =  m_cTSC;
  403.             MF_rf_tx_level_req->power    = i_PHASE_ERROR_PCL;
  404.             MF_rf_tx_level_req->frames   = 1000;
  405.             MF_rf_tx_level_req->dacValue = m_sDefault_value;
  406.             //MF_rf_tx_level_req->burstTypeNB = NB_TX_ALL_ONES_WITHOUT_TSC;
  407.             MF_rf_tx_level_req->burstTypeNB = NB_TX_RANDOM_WITH_TSC;
  408.             if ( META_Rf_NB_TX_r(
  409.                     MF_rf_tx_level_req,
  410.                     ::ccb_MF_rf_tx_level_TrOff,
  411.                     &MF_rf_tx_level_token,
  412.                                     NULL
  413.                        ) != META_SUCCESS)
  414.             {
  415.                 CalErrorHandler( WM_MF_RF_TX_LEVEL_FAIL );
  416.                 log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  417.                       " FAIL : Target < ARFCN = " + IntToStr( s_ARFCN ) +
  418.                       ", TSC = " + IntToStr( m_cTSC ) +
  419.                       ", power = " + IntToStr( i_PHASE_ERROR_PCL ) +
  420.                       ", frames = " + IntToStr(i_N_TX) +
  421.                       ", dac value = " + IntToStr( m_sDefault_value )
  422.                     );
  423.                 return false;
  424.             }
  425.             is_suspend_cal = true;
  426.             this->Suspend();
  427.             is_suspend_cal = false;
  428.             if( ! FetchRMSPhaseErr( &PFERRMSError ) )
  429.             {
  430.                 return false;
  431.             }
  432.             cal_OffIQPhErr[i].PhaseErr = PFERRMSError;
  433.             //Sleep(50);
  434.             STOP_RF
  435.         }  // for
  436.         iscalibrated[cal_OffIQPhErr[0].Off_IQ-MIN_OFFSET_IQ] = 1;
  437.         iscalibrated[cal_OffIQPhErr[1].Off_IQ-MIN_OFFSET_IQ] = 1;
  438.         if( Abs_double(cal_OffIQPhErr[0].PhaseErr) < Abs_double(cal_OffIQPhErr[1].PhaseErr) )
  439.         {
  440.             if( Abs_double(cal_OffIQPhErr[0].PhaseErr) < min_OffQPhErr.PhaseErr )
  441.             {
  442.                 min_OffQPhErr.Off_IQ = cal_OffIQPhErr[0].Off_IQ;
  443.                 min_OffQPhErr.PhaseErr = Abs_double(cal_OffIQPhErr[0].PhaseErr);
  444.                 log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  445.                       "  OffsetQ = " + IntToStr( min_OffQPhErr.Off_IQ ) +
  446.                       ", cal phase error = " + Double_To_AnsiString( min_OffQPhErr.PhaseErr )
  447.                    );
  448.             }
  449.             //if( (begin_Offset_IQ+end_Offset_IQ)%2 == 0 )
  450.             //{
  451.            //     end_Offset_IQ = (begin_Offset_IQ+end_Offset_IQ)/2;
  452.             //}
  453.             //else
  454.             //{
  455.             //    end_Offset_IQ = (begin_Offset_IQ+end_Offset_IQ)/2 + 1;
  456.             //}
  457.               end_Offset_IQ = (begin_Offset_IQ+end_Offset_IQ)/2;
  458.         }
  459.         else
  460.         {
  461.             if( Abs_double(cal_OffIQPhErr[1].PhaseErr) < min_OffQPhErr.PhaseErr )
  462.             {
  463.                 min_OffQPhErr.Off_IQ = cal_OffIQPhErr[1].Off_IQ;
  464.                 min_OffQPhErr.PhaseErr = Abs_double(cal_OffIQPhErr[1].PhaseErr);
  465.                 log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  466.                       " Offset Q = " + IntToStr( min_OffQPhErr.Off_IQ ) +
  467.                       ", cal phase error = " + Double_To_AnsiString( min_OffQPhErr.PhaseErr )
  468.                    );
  469.             }
  470.            // if( (begin_Offset_IQ+end_Offset_IQ)%2 == 0 )
  471.            // {
  472.            //     begin_Offset_IQ = (begin_Offset_IQ+end_Offset_IQ)/2;
  473.            // }
  474.            // else
  475.            // {
  476.            //     begin_Offset_IQ = (begin_Offset_IQ+end_Offset_IQ)/2 - 1;
  477.            // }
  478.               begin_Offset_IQ = (begin_Offset_IQ+end_Offset_IQ)/2+1;
  479.         }
  480.     }//while
  481.     log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  482.                       " Offset I = " + IntToStr( min_OffIPhErr.Off_IQ ) +
  483.                       ", Offset Q = " + IntToStr( min_OffQPhErr.Off_IQ ) +
  484.                       ", calibrated phase error = " + Double_To_AnsiString( min_OffQPhErr.PhaseErr )
  485.                     );
  486.     // set BBTxCfg2
  487.     rf_bb_tx_cfg2_req.TxOffsetQ = min_OffQPhErr.Off_IQ;
  488.     if( META_Rf_SetBBTxCfg2_r(500, &rf_bb_tx_cfg2_req, &rf_bb_tx_cfg2_cnf) != META_SUCCESS )
  489.     {
  490.         CalErrorHandler( WM_MF_RF_SET_BB_TX_CFG_FAIL );
  491.         log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  492.                   " FAIL: RF set BB TX config fail."
  493.         );
  494.         return false;
  495.     }
  496.     MF_rf_txiq_ptr->Set_BBTx_OffsetQ( rf_bb_tx_cfg2_req.TxOffsetQ );
  497.     log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  498.                       " ============== TX phase error calibration end ================== "
  499.                     );
  500.     log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  501.                       " ============== TX phase error calibration check begin ================== "
  502.                     );
  503.     if ( META_Rf_NB_TX_r(
  504.                     MF_rf_tx_level_req,
  505.                     ::ccb_MF_rf_tx_level_TrOff,
  506.                     &MF_rf_tx_level_token,
  507.                                     NULL
  508.                        ) != META_SUCCESS)
  509.     {
  510.          CalErrorHandler( WM_MF_RF_TX_LEVEL_FAIL );
  511.          log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  512.                       " FAIL : Target < ARFCN = " + IntToStr( s_ARFCN ) +
  513.                       ", TSC = " + IntToStr( m_cTSC ) +
  514.                       ", power = " + IntToStr( i_PHASE_ERROR_PCL ) +
  515.                       ", frames = " + IntToStr(i_N_TX) +
  516.                       ", dac value = " + IntToStr( m_sDefault_value )
  517.                     );
  518.          return false;
  519.     }
  520.     is_suspend_cal = true;
  521.     this->Suspend();
  522.     is_suspend_cal = false;
  523.     if(! FetchRMSPhaseErr( &PFERRMSError ) )
  524.     {
  525.         return false;
  526.     }
  527.    // Sleep(50);
  528.     STOP_RF
  529.     if( d_PHASE_ERROR_RMS_ERROR < PFERRMSError )
  530.     {
  531.         MF_rf_txiq_ptr->Set_BBTx_isCalibrated(0);
  532.     }
  533.     else
  534.     {
  535.         MF_rf_txiq_ptr->Set_BBTx_isCalibrated(191);
  536.     }
  537.     MF_rf_txiq_ptr->ConfirmCallback = ::ccb_write_txiq_to_nvram;
  538.     MF_rf_txiq_ptr->REQ_Write_To_NVRAM_Start(m_pCal->rf_id);
  539.     RestartTimerCal ( WM_MF_FDM_TXIQ_WRITE_FAIL );
  540.     SUSPEND_CAL_THREAD
  541.     if (MF_rf_txiq_ptr->Get_ConfirmState() != STATE_TXIQ_OK)
  542.     {
  543.             CalErrorHandler( WM_MF_FDM_TXIQ_WRITE_FAIL );
  544.             log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  545.                                       " FAIL:  Target < Write txiq value to NVRAM fail "
  546.                                      );
  547.             return false;
  548.     }
  549.     log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  550.                   " Target < Write TXIQ value to NVRAM"
  551.                 );
  552.     sprintf(tempbuf, "%11d", MF_rf_txiq_ptr->Get_BBTx_OffsetI() );
  553.     m_pCal->as_ResultBuf = m_pCal->as_ResultBuf + tempbuf + ", ";
  554.     sprintf(tempbuf, "%11d", MF_rf_txiq_ptr->Get_BBTx_OffsetQ());
  555.     m_pCal->as_ResultBuf = m_pCal->as_ResultBuf + tempbuf + ", ";
  556.     if( ! Form_META_Factory->WriteTxPhaseErrCalResultToFile(as_ID+".cal",Application->ExeName, m_pCal->b_CalResultPath ) )
  557.     {
  558.         CalErrorHandler( WM_MF_RF_TX_PHASE_ERR_WRITE_CAL_RESULT_FAIL );
  559.         log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  560.                 " FAIL : write TX phase error parameter to cal file "
  561.               );
  562.         return false;
  563.     }
  564.     if( d_PHASE_ERROR_RMS_ERROR < PFERRMSError )
  565.     {
  566.         CalErrorHandler( WM_MF_RF_TX_PHASE_ERR_CHECK_FAIL );
  567.         log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  568.                   " FAIL: TX phase error calibration. Check RMS phase error = " + Double_To_AnsiString(PFERRMSError) +
  569.                     ", Max RMS phase error = " + Double_To_AnsiString( d_PHASE_ERROR_RMS_ERROR )
  570.                 );
  571.         return false;
  572.     }
  573.     log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  574.                               " PASS: TX phase error calibration. Check RMS phase error = " + Double_To_AnsiString(PFERRMSError) +
  575.                               ", Max RMS phase error = " + Double_To_AnsiString( d_PHASE_ERROR_RMS_ERROR )
  576.                 );
  577.     PostMessage(
  578.                      ctrl.hPostMsgDestHandle,
  579.                      WM_MF_RF_TX_PHASE_ERR_CALIBRATION_DONE,
  580.                      0,
  581.                      0
  582.                     );
  583.     log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  584.                       " ============== TX phase error calibration check end ================== "
  585.                     );
  586.     Form_META_Factory->DisableAllCalTimer();                
  587.     return true;
  588.     
  589. }
  590. //------------------------------------------------------------------------------
  591. bool __fastcall T_META_factory_calibration::TrimOffIQCalCommon( void )
  592. {
  593.     if( ! rct_ctrl.RCT_operatingMode( m_pRct, OPERATING_MODE_GSM_BCH_TCH ) )
  594.     {
  595.         CalErrorHandler( WM_MF_AGE8960_SET_OPERATION_MODE_FAIL );
  596.         if ( Form_META_Factory->rbAgilent8960->Checked )
  597.         {
  598.             log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  599.                               " FAIL :"+
  600.                               " Agilent 8960< Operation mode = GSM BCH+TCH"
  601.                             );
  602.         }
  603.         else
  604.         {
  605.                 log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  606.                               " FAIL :"+
  607.                               " cmu200 < Band = Operation mode = GSM BCH+TCH"
  608.                             );
  609.         }
  610.         return false;
  611.     }
  612.     vi_PHASE_ERROR_BAND = Get_AgeBand( as_PHASE_ERROR_BAND );
  613.     if( ! rct_ctrl.RCT_cellBand( m_pRct, vi_PHASE_ERROR_BAND) )
  614.     {
  615.             CalErrorHandler( WM_MF_AGE8960_SET_BAND_FAIL );
  616.             if ( Form_META_Factory->rbAgilent8960->Checked )
  617.             {
  618.                 log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  619.                               " FAIL :"+
  620.                               " Agilent 8960< Band = " + ViBand_To_Str( vi_PHASE_ERROR_BAND )
  621.                             );
  622.             }
  623.             else
  624.             {
  625.                 log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  626.                               " FAIL :"+
  627.                               " cmu200 < Band = " + ViBand_To_Str( vi_PHASE_ERROR_BAND )
  628.                             );
  629.             }
  630.             return false;
  631.     }
  632.     #if 0
  633.     if ( Form_META_Factory->rbAgilent8960->Checked )
  634.     {
  635.         if ( age1960_cellBand(
  636.                                ctrl.vi,
  637.                                age1960_CELL_1,
  638.                                i_PHASE_ERROR_BAND
  639.                              ) != VI_SUCCESS )
  640.         {
  641.             CalErrorHandler( WM_MF_AGE8960_SET_BAND_FAIL );
  642.             log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  643.                       " FAIL:  Agilent 8960< Band = "+
  644.                       ViBand_To_Str( vi_PHASE_ERROR_BAND )
  645.                     );
  646.             return false;
  647.         }
  648.         else
  649.         {
  650.             log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  651.                       " Agilent 8960< Band = "+
  652.                       ViBand_To_Str( vi_PHASE_ERROR_BAND )
  653.                     );
  654.         }
  655.     }
  656.     else
  657.     {
  658.         if( !cmu_cellband(vi_PHASE_ERROR_BAND, &cmu) )
  659.         {
  660.             CalErrorHandler( WM_MF_AGE8960_SET_BAND_FAIL );
  661.             log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  662.                      " FAIL:  cmu200 > Band = "+
  663.                      ViBand_To_Str( vi_PHASE_ERROR_BAND  )
  664.                    );
  665.             return false;
  666.         }
  667.         else
  668.         {
  669.             log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  670.                      " cmu200 > Band = "+
  671.                      ViBand_To_Str( vi_PHASE_ERROR_BAND  )
  672.                    );
  673.         }
  674.     }
  675.     #endif
  676.     if ( Form_META_Factory->rbAgilent8960->Checked )
  677.     {
  678.         log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  679.                       " Agilent 8960< Band = "+
  680.                       ViBand_To_Str( vi_PHASE_ERROR_BAND )
  681.                     );
  682.     }
  683.     else
  684.     {
  685.         log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  686.                      " cmu200 > Band = "+
  687.                      ViBand_To_Str( vi_PHASE_ERROR_BAND  )
  688.                    );
  689.     }
  690.     short bch_arfcn = ::Get_SeperateChannel( vi_PHASE_ERROR_BAND, m_sPHASE_ERROR_ARFCN );
  691.     if( ! rct_ctrl.RCT_BCHARFCN( m_pRct, bch_arfcn) )
  692.     {
  693.         CalErrorHandler( WM_MF_AGE8960_SET_TCH_ARFCN_FAIL );
  694.         if ( Form_META_Factory->rbAgilent8960->Checked )
  695.         {
  696.             log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  697.                               " FAIL :"+
  698.                               " Agilent 8960< BCH ARFCN = " + IntToStr( bch_arfcn )
  699.                     );
  700.         }
  701.         else
  702.         {
  703.             log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  704.                               " FAIL :"+
  705.                               " CMU 200< BCH ARFCN = " + IntToStr( bch_arfcn )
  706.                     );
  707.         }
  708.         return false;
  709.     }
  710.     if( ! rct_ctrl.RCT_TCHARFCN( m_pRct, m_sPHASE_ERROR_ARFCN ) )
  711.     {
  712.         CalErrorHandler( WM_MF_AGE8960_SET_TCH_ARFCN_FAIL );
  713.         if ( Form_META_Factory->rbAgilent8960->Checked )
  714.         {
  715.                     log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  716.                               " FAIL :"+
  717.                               " Agilent 8960< TCH ARFCN = " + IntToStr( m_sPHASE_ERROR_ARFCN )
  718.                             );
  719.         }
  720.         else
  721.         {
  722.                     log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  723.                               " FAIL :"+
  724.                               " CMU 200< TCH ARFCN = " + IntToStr( m_sPHASE_ERROR_ARFCN )
  725.                             );
  726.         }
  727.         return false;
  728.     }
  729.     #if 0
  730.     if ( Form_META_Factory->rbAgilent8960->Checked )
  731.     {
  732.         if ( age1960_TCHARFCN(
  733.                                    ctrl.vi,
  734.                                    m_sPHASE_ERROR_ARFCN,
  735.                                    (short) 0, // current band
  736.                                    VI_TRUE
  737.                                  )!= VI_SUCCESS)
  738.         {
  739.                 CalErrorHandler( WM_MF_AGE8960_SET_TCH_ARFCN_FAIL );
  740.                 log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  741.                           " FAIL :"+
  742.                           " Agilent 8960< TCH ARFCN = " + IntToStr( m_sPHASE_ERROR_ARFCN )
  743.                         );
  744.                 return false;
  745.         }
  746.         else
  747.         {
  748.                 log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  749.                           " Agilent 8960< TCH ARFCN = " + IntToStr( m_sPHASE_ERROR_ARFCN )
  750.                         );
  751.         }
  752.     }
  753.     else
  754.     {
  755.             if( !cmu_tcharfcn(m_sPHASE_ERROR_ARFCN, &cmu) )
  756.             {
  757.                 CalErrorHandler( WM_MF_AGE8960_SET_TCH_ARFCN_FAIL );
  758.                 log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  759.                           " FAIL :"+
  760.                           " cmu200 > TCH ARFCN = " + IntToStr( m_sPHASE_ERROR_ARFCN )
  761.                         );
  762.                 return false;
  763.             }
  764.             else
  765.             {
  766.                 log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  767.                           " cmu200 > TCH ARFCN = " + IntToStr( m_sPHASE_ERROR_ARFCN )
  768.                         );
  769.             }
  770.     }
  771.     #endif
  772.     if ( Form_META_Factory->rbAgilent8960->Checked )
  773.     {
  774.         log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  775.                           " Agilent 8960< TCH ARFCN = " + IntToStr( m_sPHASE_ERROR_ARFCN )
  776.                         );
  777.     }
  778.     else
  779.     {
  780.         log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  781.                           " cmu200 > TCH ARFCN = " + IntToStr( m_sPHASE_ERROR_ARFCN )
  782.                         );
  783.     }
  784.     #if 0
  785.     if (! cfg->get_PHASE_ERROR_PCL( i_PHASE_ERROR_PCL ))
  786.     {
  787.         CalErrorHandler( WM_MF_CFG_READ_FAIL );
  788.         log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  789.                               " FAIL: Read config file fail(PHASE_ERROR_PCL)."
  790.                 );
  791.         return false;
  792.     }
  793.     #endif
  794.     if( ! rct_ctrl.RCT_MSTXLevel( m_pRct, i_PHASE_ERROR_PCL ) )
  795.     {
  796.                     CalErrorHandler( WM_MF_AGE8960_SET_MS_TX_LEVEL_FAIL );
  797.                     if ( Form_META_Factory->rbAgilent8960->Checked )
  798.                     {
  799.                         log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  800.                                   " FAIL : Agilent 8960< MS TX level = " + IntToStr( i_PHASE_ERROR_PCL)
  801.                                 );
  802.                     }
  803.                     else
  804.                     {
  805.                         log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  806.                                   " FAIL : cmu200 > MS TX level = " + IntToStr( i_PHASE_ERROR_PCL )
  807.                                 );
  808.                     }
  809.                     return false;
  810.     }
  811.     #if 0
  812.     if ( Form_META_Factory->rbAgilent8960->Checked )
  813.     {
  814.         if ( age1960_MSTXLevel(
  815.                                  ctrl.vi,
  816.                                  i_PHASE_ERROR_PCL,
  817.                                  (short) 0,  // current band
  818.                                  VI_TRUE
  819.                               )!= VI_SUCCESS)
  820.         {
  821.             CalErrorHandler( WM_MF_AGE8960_SET_MS_TX_LEVEL_FAIL );
  822.             log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  823.                       " FAIL : Agilent 8960< MS TX level = " + IntToStr( i_PHASE_ERROR_PCL )
  824.                      );
  825.             return false;
  826.         }
  827.         else
  828.         {
  829.             log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  830.                       " Agilent 8960< MS TX level = " + IntToStr( i_PHASE_ERROR_PCL )
  831.                      );
  832.         }
  833.     }
  834.     else
  835.     {
  836.         if( !cmu_mxtxlevel(i_PHASE_ERROR_PCL, &cmu) )
  837.         {
  838.             CalErrorHandler( WM_MF_AGE8960_SET_MS_TX_LEVEL_FAIL );
  839.             log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  840.                       " FAIL : cmu200 > MS TX level = " + IntToStr( i_PHASE_ERROR_PCL)
  841.                     );
  842.             return false;
  843.         }
  844.         else
  845.         {
  846.             log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  847.                       " cmu200 > MS TX level = " + IntToStr( i_PHASE_ERROR_PCL)
  848.                     );
  849.         }
  850.     }
  851.     #endif
  852.     if ( Form_META_Factory->rbAgilent8960->Checked )
  853.     {
  854.         log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  855.                       " Agilent 8960< MS TX level = " + IntToStr( i_PHASE_ERROR_PCL )
  856.                      );
  857.     }
  858.     else
  859.     {
  860.         log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  861.                       " cmu200 > MS TX level = " + IntToStr( i_PHASE_ERROR_PCL)
  862.                     );
  863.     }
  864.     #if 0
  865.     if (! cfg->getTSC( m_cTSC ))
  866.     {
  867.         CalErrorHandler( WM_MF_CFG_READ_FAIL );
  868.         log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  869.                   " FAIL: Read config file fail(TSC)."
  870.                 );
  871.         return false;
  872.     }
  873.     #endif
  874.     if( ! rct_ctrl.RCT_ConfigTSC( m_pRct, m_cTSC ) )
  875.     {
  876.                 CalErrorHandler( WM_MF_AGE8960_SET_TSC_FAIL );
  877.                 if( Form_META_Factory->rbAgilent8960->Checked )
  878.                 {
  879.                     log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  880.                               "FAIL : Agilent 8960 set TSC fail."
  881.                             );
  882.                 }
  883.                 else
  884.                 {
  885.                     log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  886.                           " FAIL : cmu200 > TSC = " + IntToStr( m_cTSC)
  887.                         );
  888.                 }
  889.                 return false;
  890.     }
  891.     #if 0
  892.     if ( Form_META_Factory->rbAgilent8960->Checked )
  893.     {
  894.         if( age1968A_ConfigTSC(ctrl.vi, m_cTSC, log) != VI_SUCCESS )
  895.         {
  896.             CalErrorHandler( WM_MF_AGE8960_SET_TSC_FAIL );
  897.             log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  898.                          "FAIL : Agilent 8960 > TSC = " + IntToStr( m_cTSC)
  899.                       );
  900.             return false;
  901.         }
  902.         else
  903.         {
  904.             log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  905.                          " Agilent 8960 > TSC = " + IntToStr( m_cTSC)
  906.                       );
  907.         }
  908.     }
  909.     else
  910.     {
  911.         if( !cmu_tsc(m_cTSC, &cmu) )
  912.         {
  913.             CalErrorHandler( WM_MF_AGE8960_SET_TSC_FAIL );
  914.             log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  915.                           " FAIL : cmu200 > TSC = " + IntToStr( m_cTSC)
  916.                         );
  917.             return false;
  918.         }
  919.         else
  920.         {
  921.             log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  922.                           " cmu200 > TSC = " + IntToStr( m_cTSC)
  923.                         );
  924.         }
  925.     }
  926.     #endif
  927.     if( Form_META_Factory->rbAgilent8960->Checked )
  928.     {
  929.         log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  930.                          " Agilent 8960 > TSC = " + IntToStr( m_cTSC)
  931.                       );
  932.     }
  933.     else
  934.     {
  935.         log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  936.                           " cmu200 > TSC = " + IntToStr( m_cTSC)
  937.                         );
  938.     }
  939.     EquConfigPFER();
  940.   //  // read BB TX parameter from NVRAM
  941.  //   MF_rf_txiq_ptr->ConfirmCallback = ::ccb_read_txiq_from_nvram;
  942.  //   MF_rf_txiq_ptr->REQ_Read_From_NVRAM_Start();
  943.  //
  944.  //   RestartTimerCal ( WM_MF_FDM_TXIQ_READ_FAIL );
  945.  //
  946.  //   SUSPEND_CAL_THREAD
  947.  //
  948.  //   if (MF_rf_txiq_ptr->Get_ConfirmState() != STATE_TXIQ_OK)
  949.  //   {
  950.  //           CalErrorHandler( WM_MF_FDM_TXIQ_READ_FAIL );
  951.  //           log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  952.  //                                     " FAIL:  Target < Read txiq value from NVRAM fail "
  953.  //                                    );
  954.  //           return false;
  955.  //   }
  956.  //
  957.  //   log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  958.  //                 " Target < Read txiq value from NVRAM"
  959.  //               );
  960.  //
  961.     // BB TX auto calibration            
  962.     if( META_Rf_BBTXAutoCal_r( 500 ) != META_SUCCESS )
  963.     {
  964.         CalErrorHandler( WM_MF_RF_TX_GAIN_AUTO_CAL_FAIL );
  965.         log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  966.                   " FAIL: RF TX gain auto calibration."
  967.                 );
  968.         return false;
  969.     }
  970.     // get BBTxCfg2
  971.     if( META_Rf_GetBBTxCfg2_r(500, &rf_bb_tx_cfg2_req) != META_SUCCESS )
  972.     {
  973.         CalErrorHandler( WM_MF_RF_GET_BB_TX_CFG_FAIL );
  974.         log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  975.                   " FAIL: RF get BB TX CFG fail."
  976.                 );
  977.         return false;
  978.     }
  979.     MF_rf_txiq_ptr->Set_BBTxParametersFromAutoK( &rf_bb_tx_cfg2_req );
  980.     Form_META_Factory->DisableAllCalTimer();
  981.     return true;
  982. }
  983. //-----------------------------------------------------------------------------
  984. bool __fastcall T_META_factory_calibration::FetchRMSPhaseErr( ViReal64*  RMSPhaseErr )
  985. {
  986.    // if(! rct_ctrl.RCT_initMeasFcn_PFER( m_pRct ) )
  987.    // {
  988.    //     return  false;
  989.    // }
  990.     if(! rct_ctrl.RCT_FetchAvgPhErr( m_pRct, *RMSPhaseErr ) )
  991.     {
  992.         return  false;
  993.     }
  994.     #if 0
  995.     if ( Form_META_Factory->rbAgilent8960->Checked )
  996.     {
  997.         if( age1960_initMeasFcn(
  998.                                      ctrl.vi,
  999.                                      age1960_PFER
  1000.                                    ) != VI_SUCCESS)
  1001.         {
  1002.                 CalErrorHandler( WM_MF_AGE8960_SET_MESA_FUNC_PFER_FAIL );
  1003.                 log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  1004.                       " FAIL : Agilent 8960< set phase, frquency error mesaurement function fail."
  1005.                 );
  1006.                 return false;
  1007.         }
  1008.         Sleep(50);
  1009.         if ( age1960_fetchPFER_Q(
  1010.                                       ctrl.vi,
  1011.                                       &PFERIntegrity,
  1012.                                       &PFERRMSError,
  1013.                                       &PFERPeakError,
  1014.                                       &PFERFreqError
  1015.                                      )!= VI_SUCCESS)
  1016.         {
  1017.             CalErrorHandler( WM_MF_AGE8960_READ_PFER_FAIL );
  1018.             log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  1019.                             " FAIL : Agilent 8960< fetch phase error."
  1020.                     );
  1021.             return false;
  1022.         }
  1023.     }
  1024.     else
  1025.     {
  1026.         if( ! cmu_mod_init( &cmu ) )
  1027.         {
  1028.             CalErrorHandler( WM_MF_AGE8960_READ_PFER_FAIL );
  1029.             log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  1030.                             " FAIL : Agilent 8960< fetch phase error."
  1031.                     );
  1032.             return false;
  1033.         }
  1034.         if( ! cmu_mod_sample(&cmu, PH_ERR_RMS_AVERAGE, &PFERRMSError) )
  1035.        // if( !cmu_readmod(PH_ERR_RMS_AVERAGE, &cmu, &PFERFreqError) )
  1036.         {
  1037.             CalErrorHandler( WM_MF_AGE8960_READ_PFER_FAIL );
  1038.             log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  1039.                             " FAIL : Agilent 8960< fetch phase error."
  1040.                     );
  1041.             return false;
  1042.         }
  1043.         if( ! cmu_mod_abort( &cmu ) )
  1044.         {
  1045.             CalErrorHandler( WM_MF_AGE8960_READ_PFER_FAIL );
  1046.             log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  1047.                             " FAIL : Agilent 8960< fetch phase error."
  1048.                     );
  1049.             return false;
  1050.         }
  1051.     }
  1052.       *RMSPhaseErr = PFERRMSError;
  1053.      // log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  1054.      //           " RMS phase error = " + Double_To_AnsiString(PFERRMSError)
  1055.      //               );
  1056.       return true;
  1057.     #endif
  1058. }