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

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) 2001
  8. *
  9. *****************************************************************************/
  10. /*****************************************************************************
  11.  *
  12.  * Filename:
  13.  * ---------
  14.  *   T_TxIq.cpp
  15.  *
  16.  * Project:
  17.  * --------
  18.  *   Maui META APP
  19.  *
  20.  * Description:
  21.  * ------------
  22.  *  TX IQ calibration source
  23.  *
  24.  * Author:
  25.  * -------
  26.  *  Andy Ueng (mtk00490)
  27.  *
  28.  *============================================================================
  29.  *             HISTORY
  30.  * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
  31.  *------------------------------------------------------------------------------
  32.  * $Revision$
  33.  * $Modtime$
  34.  * $Log$
  35.  *
  36.  *------------------------------------------------------------------------------
  37.  * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
  38.  *============================================================================
  39. ****************************************************************************/
  40. #include <assert.h>
  41. #include <math.h>
  42. #pragma hdrstop
  43. #ifndef _T_TXIQ_COMMON_H_
  44. #include "T_TxIq_common.h"
  45. #endif
  46. #ifndef _CAL_COMMON_H_
  47. #include "cal_common.h"
  48. #endif
  49. // misc
  50. #ifndef  _FT_UTILS_H_
  51. #include "ft_utils.h"
  52. #endif
  53. #ifndef  _BAND_UTILS_H_
  54. #include "band_utils.h"
  55. #endif
  56. #ifndef  _MATH_UTILS_H_
  57. #include "math_utils.h"
  58. #endif
  59. #ifndef  _AGE_MISC_H_
  60. #include "age_misc.h"
  61. #endif
  62. #ifndef  _GSM_UTILS_H_
  63. #include "gsm_utils.h"
  64. #endif
  65. #ifndef  _TIME_UTILS_H_
  66. #include "time_utils.h"
  67. #endif
  68. // equipment
  69. #ifndef _AGECOMMON_H_
  70. #include "agecommon.h"
  71. #endif
  72. #ifndef _AGE1968A_H_
  73. #include "age1968a.h"
  74. #endif
  75. // TX phase error calibration
  76. #ifndef _RF_OFFSET_IQ_SWEEP_INIT_AGE8960_H_
  77. #include "rf_offset_iq_sweep_init_age8960.h"
  78. #endif
  79. #ifndef  _RF_TXIQ_H_
  80. #include "rf_txiq.h"
  81. #endif
  82. // form
  83. #ifndef _META_FACTORY_H_
  84. #include "META_Factory.h"
  85. #endif
  86. // call back
  87. #ifndef _META_FACTORY_NVRAM_CB_H_
  88. #include "meta_factory_nvram_cb.h"
  89. #endif
  90. #ifndef _META_FACTORY_RF_CB_H_
  91. #include "meta_factory_rf_cb.h"
  92. #endif
  93. //----------------------------------------------------------------------------
  94. // phase error
  95. extern RfNbtx_Req *MF_rf_tx_level_req;
  96. extern CRFTXIQ*  MF_rf_txiq_ptr;
  97. // Tthread
  98. extern T_META_factory_calibration* pt_calibration;
  99. extern bool  is_suspend_cal; // in T_META_factory_calibration.cpp
  100. //---------------------------------------------------------------------------
  101. bool __fastcall T_META_factory_calibration::TXIqCal( void )
  102. {
  103.     ViReal64  d_OOS[4];
  104.     ViReal64  d_POOS[4];
  105.     ViReal64  d_SBS[4];
  106.     ViReal64  d_PSBS[4];
  107.     RfBBTXCfg4   rf_bb_tx_cfg_req;
  108.     BBTXParameters_T l1cal_txiq;
  109.     S_IQ  OffsetIQ[] =
  110.     {
  111.         {  0,   0},
  112.         {  0,  30},
  113.         { 30, -30},
  114.         {-30, -30}
  115.     };
  116.     S_IQ  TrimIQ[] =
  117.     {
  118.         {  0,   0},
  119.         {  7,  -7},
  120.         { -7,   7},
  121.     };
  122.     S_IQ  offset_IQt;
  123.     S_IQ  trim_IQt;
  124.     S_IQ  offset_IQt_h;
  125.     S_IQ  trim_IQt_h;
  126.     double d_OOS_Check_h;
  127.     double d_SBS_Check_h;
  128.     PostMessage(
  129.                      ctrl.hPostMsgDestHandle,
  130.                      WM_MF_RF_TX_IQ_BEGIN,
  131.                      0,
  132.                      0
  133.                     );
  134.     log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  135.              " ================ TX IQ calibration begin ================== "
  136.            );
  137.     if (!m_rct_ctrl.RCT_operatingMode(m_pRct, OPERATING_MODE_GSM_BCH_TCH))
  138.     {
  139.         CalErrorHandler(WM_MF_AGE8960_SET_OPERATION_MODE_FAIL);
  140.         log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  141.                               " FAIL :" +
  142.                               m_pRct->as_RCT + " < Operation mode = GSM BCH+TCH"
  143.                             );
  144.         return false;
  145.     }
  146.     m_viTX_IQ_BAND = Get_AgeBand(m_asTX_IQ_BAND);
  147.     if (!m_rct_ctrl.RCT_cellBand(m_pRct, m_viTX_IQ_BAND))
  148.     {
  149.         CalErrorHandler(WM_MF_AGE8960_SET_BAND_FAIL);
  150.         log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  151.                  " FAIL : " +
  152.                  m_pRct->as_RCT + " < Band = " + ViBand_To_Str(m_viTX_IQ_BAND)
  153.                 );
  154.         return false;
  155.     }
  156.     log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  157.                       m_pRct->as_RCT + " < Band = "+
  158.                       ViBand_To_Str( m_viTX_IQ_BAND )
  159.                     );
  160.     if (age1960_PCS1900_BAND == m_viTX_IQ_BAND)
  161.     {
  162.         if (META_Rf_SelectFrequencyBand1900_r(m_pCal->i_MainMETAHandle, 1, MF_SelectBand_cnf_cb, &MF_SelectBand_token, NULL) !=  META_SUCCESS)
  163.         {
  164.             CalErrorHandler(WM_MF_RF_AFC_SELECT_BAND_FAIL);
  165.             log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  166.                       " FAIL : Target < set Band1900 flag = 1"
  167.                     );
  168.             return false;
  169.         }
  170.     }
  171.     else
  172.     {
  173.         if (META_Rf_SelectFrequencyBand1900_r(m_pCal->i_MainMETAHandle, 0, MF_SelectBand_cnf_cb, &MF_SelectBand_token, NULL) !=  META_SUCCESS)
  174.         {
  175.             CalErrorHandler(WM_MF_RF_AFC_SELECT_BAND_FAIL);
  176.             log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  177.                       " FAIL : Target < set Band1900 flag = 0"
  178.                     );
  179.             return false;
  180.         }
  181.     }
  182.     is_suspend_cal = true;
  183.     this->Suspend();
  184.     is_suspend_cal = false;
  185.     short bch_arfcn = ::Get_SeperateChannel(m_viTX_IQ_BAND, m_sTX_IQ_ARFCN);
  186.     if (!m_rct_ctrl.RCT_BCHARFCN(m_pRct, bch_arfcn))
  187.     {
  188.         CalErrorHandler(WM_MF_AGE8960_SET_TCH_ARFCN_FAIL);
  189.         log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  190.                               " FAIL : "+
  191.                               m_pRct->as_RCT + " < BCH ARFCN = " + IntToStr(bch_arfcn)
  192.                     );
  193.         return false;
  194.     }
  195.     if (!m_rct_ctrl.RCT_TCHARFCN(m_pRct, m_sTX_IQ_ARFCN))
  196.     {
  197.         CalErrorHandler(WM_MF_AGE8960_SET_TCH_ARFCN_FAIL);
  198.         log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  199.                  " FAIL : " +
  200.                  m_pRct->as_RCT + " < TCH ARFCN = " + IntToStr(m_sTX_IQ_ARFCN)
  201.                 );
  202.         return false;
  203.     }
  204.     log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  205.              m_pRct->as_RCT + " < TCH ARFCN = " + IntToStr(m_sTX_IQ_ARFCN)
  206.             );
  207.     if (!m_rct_ctrl.RCT_MSTXLevel(m_pRct, m_sTX_IQ_PCL))
  208.     {
  209.         CalErrorHandler(WM_MF_AGE8960_SET_MS_TX_LEVEL_FAIL);
  210.         log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  211.                  " FAIL : " +
  212.                  m_pRct->as_RCT + " < MS TX level = " + IntToStr(m_sTX_IQ_PCL)
  213.                 );
  214.         return false;
  215.     }
  216.     log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  217.              m_pRct->as_RCT + " < MS TX level = " + IntToStr( m_sTX_IQ_PCL )
  218.             );
  219.     if (!m_rct_ctrl.RCT_ConfigTSC(m_pRct, m_cTSC))
  220.     {
  221.         CalErrorHandler(WM_MF_AGE8960_SET_TSC_FAIL);
  222.         log->Add(DateToStr(Date()) + " " + CurrentTimeStr() +
  223.                  "FAIL : " + m_pRct->as_RCT + " set TSC fail."
  224.                 );
  225.         return false;
  226.     }
  227.     log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  228.              m_pRct->as_RCT + " < TSC = " + IntToStr( m_cTSC)
  229.             );
  230.     if (!m_rct_ctrl.RCT_confIQTuning(m_pRct, m_uiTX_IQ_MEASUREMENT_COUNT))
  231.     {
  232.         CalErrorHandler(WM_MF_AGE8960_CONFIG_IQ_TUNNING_FAIL);
  233.         log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  234.                  "FAIL : " + m_pRct->as_RCT + " < config IQ tunning fail."
  235.                 );
  236.         return false;
  237.     }
  238.     // BB TX auto calibration
  239.   //  if( META_Rf_BBTXAutoCal_r( 1500 ) != META_SUCCESS )
  240.   //  {
  241.   //      CalErrorHandler( WM_MF_RF_TX_GAIN_AUTO_CAL_FAIL );
  242.   //      log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  243.    //               " FAIL: RF TX gain auto calibration."
  244.    //             );
  245.    //     return false;
  246.    // }
  247.     // get BBTxCfg
  248.     //if (META_Rf_GetBBTxCfg2_r(m_pCal->i_MainMETAHandle, 1500, &rf_bb_tx_cfg_req) != META_SUCCESS )
  249.     //{
  250.     //    CalErrorHandler( WM_MF_RF_GET_BB_TX_CFG_FAIL );
  251.     //    log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  252.     //              " FAIL: RF get BB TX CFG fail."
  253.     //            );
  254.     //    return false;
  255.     //}
  256.     m_cTXIQ_RUN_Obj.ConfirmCallback = ::CNF_MF;
  257.     m_cTXIQ_RUN_Obj.REQ_GetBBTxCfg_Start(m_pCal->e_bbtxcfg_ver);
  258.     RestartTimerCal(WM_MF_RF_GET_BB_TX_CFG_FAIL);
  259.     SUSPEND_CAL_THREAD
  260.     if (m_cTXIQ_RUN_Obj.Get_ConfirmState() != METAAPP_SUCCESS)
  261.     {
  262.         CalErrorHandler(WM_MF_RF_GET_BB_TX_CFG_FAIL);
  263.         log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  264.                   " FAIL: Target > RF get BB TX CFG fail."
  265.                 );
  266.         return false;
  267.     }
  268.     RfBBTXCfg4* p_bbtx_cfg = m_cTXIQ_RUN_Obj.Get_BbTxCfg();
  269.     rf_bb_tx_cfg_req = *p_bbtx_cfg;
  270.     // read TXIQ from NVRAM
  271.     MF_rf_txiq_ptr->ConfirmCallback = ::ccb_read_txiq_from_nvram;
  272.     MF_rf_txiq_ptr->REQ_Read_From_NVRAM_Start(m_pCal->ui_rf_id, m_pCal->e_bbtxcfg_ver);
  273.     RestartTimerCal(WM_MF_NVRAM_TXIQ_READ_FAIL);
  274.     SUSPEND_CAL_THREAD
  275.     if (MF_rf_txiq_ptr->Get_ConfirmState() != METAAPP_SUCCESS)
  276.     {
  277.         CalErrorHandler(WM_MF_NVRAM_TXIQ_READ_FAIL );
  278.         log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  279.                  " FAIL:  Target > Read txiq value from NVRAM fail "
  280.                 );
  281.         return false;
  282.     }
  283.     BBTXParameters_T* p_txiq = MF_rf_txiq_ptr->Get_BBTXParameters();
  284.     l1cal_txiq = *p_txiq;
  285.    // MF_rf_txiq_ptr->Set_BBTxParametersFromAutoK( &rf_bb_tx_cfg_req );
  286.     // low band
  287.     l1cal_txiq.bbtx_gain                = rf_bb_tx_cfg_req.TxGain;
  288.     l1cal_txiq.bbtx_calrcsel            = rf_bb_tx_cfg_req.TxCalrcsel;
  289.     l1cal_txiq.bbtx_common_mode_voltage = rf_bb_tx_cfg_req.TxCMV;
  290.     // high band
  291.     l1cal_txiq.bbtx_gain_h                = rf_bb_tx_cfg_req.TxGain;
  292.     l1cal_txiq.bbtx_calrcsel_h            = rf_bb_tx_cfg_req.TxCalrcsel; // new
  293.     l1cal_txiq.bbtx_common_mode_voltage_h = rf_bb_tx_cfg_req.TxCMV; // new
  294.     // get OOS
  295.     for (int i=0; i<4; i++)
  296.     {
  297.         if (i<=2)
  298.         {
  299.             rf_bb_tx_cfg_req.TxTrimI   = TrimIQ[i].I;
  300.             rf_bb_tx_cfg_req.TxTrimQ   = TrimIQ[i].Q;
  301.         }
  302.         rf_bb_tx_cfg_req.TxOffsetI = OffsetIQ[i].I;
  303.         rf_bb_tx_cfg_req.TxOffsetQ = OffsetIQ[i].Q;
  304.         //if (META_Rf_SetBBTxCfg2_r(m_pCal->i_MainMETAHandle, 5000, &rf_bb_tx_cfg_req, &rf_bb_tx_cfg2_cnf) != META_SUCCESS )
  305.         //{
  306.         //    CalErrorHandler( WM_MF_RF_SET_BB_TX_CFG_FAIL );
  307.         //    log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  308.         //                  " FAIL: RF set BB TX config fail."
  309.         //                );
  310.         //    return false;
  311.         //}
  312.         m_cTXIQ_RUN_Obj.ConfirmCallback = ::CNF_MF;
  313.         m_cTXIQ_RUN_Obj.REQ_SetBBTxCfg_Start(m_pCal->e_bbtxcfg_ver, rf_bb_tx_cfg_req);
  314.         RestartTimerCal(WM_MF_RF_SET_BB_TX_CFG_FAIL);
  315.         SUSPEND_CAL_THREAD
  316.         if (m_cTXIQ_RUN_Obj.Get_ConfirmState() != METAAPP_SUCCESS)
  317.         {
  318.             CalErrorHandler(WM_MF_RF_SET_BB_TX_CFG_FAIL);
  319.             log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  320.                   " FAIL: Target < RF set BB TX CFG fail."
  321.                 );
  322.             return false;
  323.         }
  324.         CHECK_TERMINATE_BY_USER
  325.         RestartTimerCal(WM_MF_RF_TX_IQ_FAIL);
  326.         MF_rf_tx_level_req->arfcn    = m_sTX_IQ_ARFCN;
  327.         MF_rf_tx_level_req->bsic     =  m_cTSC;
  328.         MF_rf_tx_level_req->power    = m_sTX_IQ_PCL;
  329.         MF_rf_tx_level_req->frames   = -99;
  330.         MF_rf_tx_level_req->dacValue = m_sDefault_value;
  331.         if (frmFatcory->rbAgilent8960->Checked)
  332.         {
  333.             MF_rf_tx_level_req->burstTypeNB = NB_TX_ALL_ONES_WITHOUT_TSC;
  334.         }
  335.         else
  336.         {   MF_rf_tx_level_req->burstTypeNB = NB_TX_RANDOM_WITH_TSC;
  337.         }
  338.         if (META_Rf_NB_TX_r(m_pCal->i_MainMETAHandle,
  339.                             MF_rf_tx_level_req,
  340.                             ::ccb_MF_rf_tx_level_TrOff,
  341.                             &MF_rf_tx_level_token,
  342.                             NULL
  343.                           ) != META_SUCCESS)
  344.         {
  345.             CalErrorHandler(WM_MF_RF_TX_LEVEL_FAIL);
  346.             log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  347.                       " FAIL : Target< ARFCN = " + IntToStr(m_sTX_IQ_ARFCN) +
  348.                       ", TSC = " + IntToStr(m_cTSC) +
  349.                       ", power = " + m_sTX_IQ_PCL +
  350.                       ", frames = " + IntToStr(i_N_TX) +
  351.                       ", dac value = " + IntToStr(m_sDefault_value)
  352.                     );
  353.             return false;
  354.         }
  355.         SUSPEND_CAL_THREAD
  356.         Sleep(100);
  357.         // TX IQ gain imbalance & original offset
  358.        // if( i<=2 )
  359.         {
  360.             if (!m_rct_ctrl.RCT_readTxIq(m_pRct, d_SBS[i], d_OOS[i]))
  361.             {
  362.                 CalErrorHandler(WM_MF_AGE8960_READ_IQ_TUNNING_FAIL);
  363.                 log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  364.                          " FAIL : " + m_pRct->as_RCT + " > read TX IQ tunning fail."
  365.                         );
  366.                 return false;
  367.             }
  368.             if (i<=2)
  369.             {
  370.                 if (NAN == d_SBS[i])
  371.                 {
  372.                     CalErrorHandler(WM_MF_RF_TX_IQ_FAIL);
  373.                     log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  374.                              " FAIL :  Get TX IQ imbalance fail."
  375.                             );
  376.                     return false;
  377.                 }
  378.                 d_PSBS[i] = exp(d_SBS[i]/10.0*logl(10.0));
  379.                 log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  380.                          " TrimI = " + IntToStr( TrimIQ[i].I ) +
  381.                          ", TrimQ = " + IntToStr( TrimIQ[i].Q ) +
  382.                          ", SBS = " + Double_To_AnsiString( d_SBS[i] ) +
  383.                          ", PSBS = " + Double_To_AnsiString( d_PSBS[i] )
  384.                        );
  385.             }
  386.         }
  387.         if (NAN == d_OOS[i])
  388.         {
  389.             CalErrorHandler(WM_MF_RF_TX_IQ_FAIL);
  390.             log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  391.                       " FAIL :  Get TX original offset fail."
  392.                     );
  393.             return false;
  394.         }
  395.         d_POOS[i] = exp(d_OOS[i]/10.0*logl(10.0));
  396.         log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  397.                  " OffsetI = " + IntToStr(OffsetIQ[i].I) +
  398.                  ", OffsetQ = " + IntToStr(OffsetIQ[i].Q) +
  399.                  ", OOS = " + Double_To_AnsiString(d_OOS[i]) +
  400.                  ", POOS = " + Double_To_AnsiString(d_POOS[i])
  401.                 );
  402.         Sleep(50);
  403.         RestartTimerCal(WM_MF_RF_TX_IQ_FAIL);
  404.         STOP_RF
  405.     }
  406.     // TX IQ gain imbalance
  407.     ViReal64 Xt;
  408.     Xt = 14*(d_PSBS[2]-d_PSBS[1]) / (2*(d_PSBS[2]+d_PSBS[1]-2*d_PSBS[0]));
  409.     float fdata = Xt/2.0;
  410.     fdata += (fdata>=0) ? 0.5 : -0.5 ;
  411.     trim_IQt.I = fdata;
  412.     fdata = -1.0*(Xt - trim_IQt.I);
  413.     fdata += (fdata>=0) ? 0.5 : -0.5 ;
  414.     trim_IQt.Q = fdata;
  415.     if (trim_IQt.I > MAX_TRIM_IQ)
  416.     {
  417.         trim_IQt.I = MAX_TRIM_IQ;
  418.     }
  419.     else if (trim_IQt.I < MIN_TRIM_IQ)
  420.     {
  421.         trim_IQt.I = MIN_TRIM_IQ;
  422.     }
  423.     if (trim_IQt.Q > MAX_TRIM_IQ)
  424.     {
  425.         trim_IQt.Q = MAX_TRIM_IQ;
  426.     }
  427.     else if (trim_IQt.Q < MIN_TRIM_IQ)
  428.     {
  429.         trim_IQt.Q = MIN_TRIM_IQ;
  430.     }
  431.     log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  432.                       " Evaluate Xt = " + Double_To_AnsiString(Xt) + ", TrimI = " + IntToStr( trim_IQt.I ) +
  433.                       ", TrimQ = " + IntToStr( trim_IQt.Q )
  434.                     );
  435.     // TX DC offset
  436.     fdata = 30*3*(d_POOS[3]-d_POOS[2]) / (2*(d_POOS[3]+d_POOS[2]+2*d_POOS[1]-4*d_POOS[0]));
  437.     fdata += (fdata>=0) ? 0.5 : -0.5 ;
  438.     offset_IQt.I = fdata;
  439.     fdata= 30*(d_POOS[3]+d_POOS[2]-4*d_POOS[1]+2*d_POOS[0]) / (2*(d_POOS[3]+d_POOS[2]+2*d_POOS[1]-4*d_POOS[0]));
  440.     fdata += (fdata>=0) ? 0.5 : -0.5 ;
  441.     offset_IQt.Q = fdata;
  442.     char MAX_OFFSET_IQ;
  443.     char MIN_OFFSET_IQ;
  444.     if (m_pCal->e_bbtxcfg_ver < BBTXCFG_VER4)
  445.     {
  446.         MIN_OFFSET_IQ = MIN_OFFSET_IQ_OLD;
  447.         MAX_OFFSET_IQ = MAX_OFFSET_IQ_OLD;
  448.     }
  449.     else
  450.     {
  451.         MIN_OFFSET_IQ = MIN_OFFSET_IQ_NEW;
  452.         MAX_OFFSET_IQ = MAX_OFFSET_IQ_NEW;
  453.     }
  454.     if (offset_IQt.I > MAX_OFFSET_IQ)
  455.     {
  456.         offset_IQt.I = MAX_OFFSET_IQ;
  457.     }
  458.     else if (offset_IQt.I < MIN_OFFSET_IQ)
  459.     {
  460.         offset_IQt.I = MIN_OFFSET_IQ;
  461.     }
  462.     if (offset_IQt.Q > MAX_OFFSET_IQ)
  463.     {
  464.         offset_IQt.Q = MAX_OFFSET_IQ;
  465.     }
  466.     else if (offset_IQt.Q < MIN_OFFSET_IQ)
  467.     {
  468.         offset_IQt.Q = MIN_OFFSET_IQ;
  469.     }
  470.     log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  471.              " Evaluate OffsetI = " + IntToStr(offset_IQt.I) +
  472.              ", OffsetQ = " + IntToStr(offset_IQt.Q)
  473.             );
  474.     l1cal_txiq.bbtx_trimI   = trim_IQt.I;
  475.     l1cal_txiq.bbtx_trimQ   = trim_IQt.Q;
  476.     l1cal_txiq.bbtx_offsetI = offset_IQt.I;
  477.     l1cal_txiq.bbtx_offsetQ = offset_IQt.Q;
  478.     rf_bb_tx_cfg_req.TxTrimI   = trim_IQt.I;
  479.     rf_bb_tx_cfg_req.TxTrimQ   = trim_IQt.Q;
  480.     rf_bb_tx_cfg_req.TxOffsetI = offset_IQt.I;
  481.     rf_bb_tx_cfg_req.TxOffsetQ = offset_IQt.Q;
  482.     m_cTXIQ_RUN_Obj.ConfirmCallback = ::CNF_MF;
  483.     m_cTXIQ_RUN_Obj.REQ_SetBBTxCfg_Start(m_pCal->e_bbtxcfg_ver, rf_bb_tx_cfg_req);
  484.     RestartTimerCal(WM_MF_RF_SET_BB_TX_CFG_FAIL);
  485.     SUSPEND_CAL_THREAD
  486.     if (m_cTXIQ_RUN_Obj.Get_ConfirmState() != METAAPP_SUCCESS)
  487.     {
  488.         CalErrorHandler(WM_MF_RF_SET_BB_TX_CFG_FAIL);
  489.         log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  490.                   " FAIL: Target < RF set BB TX CFG fail."
  491.                 );
  492.         return false;
  493.     }
  494. #if 0
  495.     // phase calibration
  496.     if (m_pCal->e_bbtxcfg_ver >= BBTXCFG_VER3)
  497.     {
  498.         char TxPhasesel[2] = {0, 3};
  499.         double d_SBS_phase[2];
  500.         double d_PSBS_phase[2];
  501.         char TxPhasesel_min;
  502.         for (int i=0; i<2; i++)
  503.         {
  504.             rf_bb_tx_cfg_req.TxPhasesel = TxPhasesel[i];
  505.             m_cTXIQ_RUN_Obj.ConfirmCallback = ::CNF_MF;
  506.             m_cTXIQ_RUN_Obj.REQ_SetBBTxCfg_Start(m_pCal->e_bbtxcfg_ver, rf_bb_tx_cfg_req);
  507.             RestartTimerCal(WM_MF_RF_SET_BB_TX_CFG_FAIL);
  508.             SUSPEND_CAL_THREAD
  509.             if (m_cTXIQ_RUN_Obj.Get_ConfirmState() != METAAPP_SUCCESS)
  510.             {
  511.                 CalErrorHandler(WM_MF_RF_SET_BB_TX_CFG_FAIL);
  512.                 log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  513.                          " FAIL: Target < RF set BB TX CFG fail."
  514.                         );
  515.                 return false;
  516.             }
  517.             CHECK_TERMINATE_BY_USER
  518.             RestartTimerCal(WM_MF_RF_TX_IQ_FAIL);
  519.         MF_rf_tx_level_req->arfcn    = m_sTX_IQ_ARFCN;
  520.         MF_rf_tx_level_req->bsic     =  m_cTSC;
  521.         MF_rf_tx_level_req->power    = m_sTX_IQ_PCL;
  522.         MF_rf_tx_level_req->frames   = -99;
  523.         MF_rf_tx_level_req->dacValue = m_sDefault_value;
  524.             if (frmFatcory->rbAgilent8960->Checked)
  525.             {
  526.                 MF_rf_tx_level_req->burstTypeNB = NB_TX_ALL_ONES_WITHOUT_TSC;
  527.             }
  528.             else
  529.             {
  530.                 MF_rf_tx_level_req->burstTypeNB = NB_TX_RANDOM_WITH_TSC;
  531.             }
  532.             if (META_Rf_NB_TX_r(m_pCal->i_MainMETAHandle,
  533.                                 MF_rf_tx_level_req,
  534.                                 ::ccb_MF_rf_tx_level_TrOff,
  535.                                 &MF_rf_tx_level_token,
  536.                                 NULL
  537.                                ) != META_SUCCESS)
  538.             {
  539.                 CalErrorHandler(WM_MF_RF_TX_LEVEL_FAIL);
  540.                 log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  541.                           " FAIL : Target< ARFCN = " + IntToStr(m_sTX_IQ_ARFCN) +
  542.                           ", TSC = " + IntToStr(m_cTSC) +
  543.                           ", power = " + m_sTX_IQ_PCL +
  544.                           ", frames = " + IntToStr(i_N_TX) +
  545.                           ", dac value = " + IntToStr(m_sDefault_value)
  546.                         );
  547.                 return false;
  548.             }
  549.             SUSPEND_CAL_THREAD
  550.         Sleep(100);
  551.             if (!m_rct_ctrl.RCT_readTxIqImbalance(m_pRct, d_SBS_phase[i]))
  552.             {
  553.                 CalErrorHandler(WM_MF_AGE8960_READ_IQ_TUNNING_FAIL);
  554.                 log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  555.                           " FAIL : " + m_pRct->as_RCT + " > read TX IQ tunning fail."
  556.                     );
  557.                 return false;
  558.             }
  559.             if (NAN == d_SBS_phase[i])
  560.             {
  561.                 CalErrorHandler(WM_MF_RF_TX_IQ_FAIL);
  562.                 log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  563.                          " FAIL :  Get TX IQ imbalance fail."
  564.                         );
  565.                 return false;
  566.             }
  567.             d_PSBS_phase[i] = exp(d_SBS_phase[i]/10.0*logl(10.0));
  568.             log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  569.                      " TxPhasesel = " + IntToStr(TxPhasesel[i]) +
  570.                      ", SBS = " + Double_To_AnsiString(d_SBS_phase[i]) +
  571.                      ", PSBS = " + Double_To_AnsiString(d_PSBS_phase[i])
  572.                     );
  573.             Sleep(50);
  574.             RestartTimerCal(WM_MF_RF_TX_IQ_FAIL);
  575.             STOP_RF
  576.         }
  577.         fdata = (TxPhasesel[1]*TxPhasesel[1] + 4*d_PSBS_phase[0] - 4*d_PSBS_phase[1])/(2*TxPhasesel[1]);
  578.         fdata += (fdata>=0) ? 0.5 : -0.5 ;
  579.         TxPhasesel_min = (char) fdata;
  580.         if (TxPhasesel_min > MAX_PHASESEL)
  581.         {
  582.             TxPhasesel_min = MAX_PHASESEL;
  583.         }
  584.         else if (TxPhasesel_min < MIN_PHASESEL)
  585.         {
  586.             TxPhasesel_min = MIN_PHASESEL;
  587.         }
  588.         l1cal_txiq.bbtx_phsel = (unsigned char) TxPhasesel_min;
  589.         log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  590.                  " Evaluate TxPhasesel = " + IntToStr(TxPhasesel_min)
  591.                 );
  592.     }
  593. #endif
  594.     //------------------------------------------------------------------------
  595.     // high band calibration
  596.     if ((RF_ID_A60111A == m_pCal->ui_rf_id) ||
  597.         (RF_ID_AERO2E  == m_pCal->ui_rf_id) ||
  598.         (RF_ID_MT6140A == m_pCal->ui_rf_id) ||
  599.         (RF_ID_MT6140B == m_pCal->ui_rf_id) ||
  600.         (RF_ID_MT6140C == m_pCal->ui_rf_id) ||
  601.         (RF_ID_MT6140D == m_pCal->ui_rf_id)
  602.        )
  603.     {
  604.         m_viTX_IQ_BAND_HIGH = Get_AgeBand(m_asTX_IQ_BAND_HIGH);
  605.         if (!m_rct_ctrl.RCT_cellBand(m_pRct, m_viTX_IQ_BAND_HIGH))
  606.         {
  607.             CalErrorHandler(WM_MF_AGE8960_SET_BAND_FAIL);
  608.             log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  609.                               " FAIL : " +
  610.                               m_pRct->as_RCT + " < Band = " + ViBand_To_Str(m_viTX_IQ_BAND_HIGH)
  611.                             );
  612.             return false;
  613.         }
  614.         log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  615.                  m_pRct->as_RCT + " < Band = "+
  616.                  ViBand_To_Str(m_viTX_IQ_BAND_HIGH)
  617.                  );
  618.         if (age1960_PCS1900_BAND == m_viTX_IQ_BAND_HIGH)
  619.         {
  620.             if (META_Rf_SelectFrequencyBand1900_r(m_pCal->i_MainMETAHandle, 1, MF_SelectBand_cnf_cb, &MF_SelectBand_token, NULL) !=  META_SUCCESS)
  621.             {
  622.                 CalErrorHandler(WM_MF_RF_AFC_SELECT_BAND_FAIL);
  623.                 log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  624.                          " FAIL : Target < set Band1900 flag = 1"
  625.                         );
  626.                 return false;
  627.             }
  628.         }
  629.         else
  630.         {
  631.             if (META_Rf_SelectFrequencyBand1900_r(m_pCal->i_MainMETAHandle, 0, MF_SelectBand_cnf_cb, &MF_SelectBand_token, NULL) !=  META_SUCCESS)
  632.             {
  633.                 CalErrorHandler(WM_MF_RF_AFC_SELECT_BAND_FAIL);
  634.                 log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  635.                          " FAIL : Target < set Band1900 flag = 0"
  636.                         );
  637.                 return false;
  638.             }
  639.         }
  640.         is_suspend_cal = true;
  641.         this->Suspend();
  642.         is_suspend_cal = false;
  643.         short bch_arfcn = ::Get_SeperateChannel(m_viTX_IQ_BAND_HIGH, m_sTX_IQ_ARFCN_HIGH);
  644.         if (!m_rct_ctrl.RCT_BCHARFCN(m_pRct, bch_arfcn))
  645.         {
  646.             CalErrorHandler(WM_MF_AGE8960_SET_TCH_ARFCN_FAIL);
  647.             log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  648.                      " FAIL : " +
  649.                      m_pRct->as_RCT + " < BCH ARFCN = " + IntToStr(bch_arfcn)
  650.                     );
  651.             return false;
  652.         }
  653.         if (!m_rct_ctrl.RCT_TCHARFCN(m_pRct, m_sTX_IQ_ARFCN_HIGH))
  654.         {
  655.             CalErrorHandler(WM_MF_AGE8960_SET_TCH_ARFCN_FAIL);
  656.             log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  657.                      " FAIL : " +
  658.                      m_pRct->as_RCT + " < TCH ARFCN = " + IntToStr(m_sTX_IQ_ARFCN_HIGH)
  659.                     );
  660.             return false;
  661.         }
  662.         log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  663.                  m_pRct->as_RCT + " < TCH ARFCN = " + IntToStr(m_sTX_IQ_ARFCN_HIGH)
  664.                 );
  665.         if (!m_rct_ctrl.RCT_MSTXLevel(m_pRct, m_sTX_IQ_PCL_HIGH))
  666.         {
  667.             CalErrorHandler(WM_MF_AGE8960_SET_MS_TX_LEVEL_FAIL);
  668.             log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  669.                                   " FAIL : " + m_pRct->as_RCT + " < MS TX level = " + IntToStr(m_sTX_IQ_PCL_HIGH)
  670.                                 );
  671.             return false;
  672.         }
  673.         log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  674.                  m_pRct->as_RCT + " < MS TX level = " + IntToStr(m_sTX_IQ_PCL_HIGH)
  675.                  );
  676.         if (!m_rct_ctrl.RCT_ConfigTSC(m_pRct, m_cTSC))
  677.         {
  678.             CalErrorHandler(WM_MF_AGE8960_SET_TSC_FAIL);
  679.             log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  680.                      "FAIL : " + m_pRct->as_RCT + " < set TSC fail."
  681.                     );
  682.             return false;
  683.         }
  684.         log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  685.                  m_pRct->as_RCT + " < TSC = " + IntToStr(m_cTSC)
  686.                  );
  687.         if (!m_rct_ctrl.RCT_confIQTuning(m_pRct, m_uiTX_IQ_MEASUREMENT_COUNT))
  688.         {
  689.             CalErrorHandler(WM_MF_AGE8960_CONFIG_IQ_TUNNING_FAIL);
  690.             log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  691.                      "FAIL : " + m_pRct->as_RCT + " < config IQ tunning fail."
  692.                      );
  693.             return false;
  694.         }
  695.        // get OOS
  696.         for (int i=0; i<4; i++)
  697.         {
  698.             if (i <= 2)
  699.             {
  700.                 rf_bb_tx_cfg_req.TxTrimI   = TrimIQ[i].I;
  701.                 rf_bb_tx_cfg_req.TxTrimQ   = TrimIQ[i].Q;
  702.             }
  703.             rf_bb_tx_cfg_req.TxOffsetI = OffsetIQ[i].I;
  704.             rf_bb_tx_cfg_req.TxOffsetQ = OffsetIQ[i].Q;
  705.             m_cTXIQ_RUN_Obj.ConfirmCallback = ::CNF_MF;
  706.             m_cTXIQ_RUN_Obj.REQ_SetBBTxCfg_Start(m_pCal->e_bbtxcfg_ver, rf_bb_tx_cfg_req);
  707.             RestartTimerCal(WM_MF_RF_SET_BB_TX_CFG_FAIL);
  708.             SUSPEND_CAL_THREAD
  709.             if (m_cTXIQ_RUN_Obj.Get_ConfirmState() != METAAPP_SUCCESS)
  710.             {
  711.                 CalErrorHandler(WM_MF_RF_SET_BB_TX_CFG_FAIL);
  712.                 log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  713.                          " FAIL: Target < RF set BB TX CFG fail."
  714.                         );
  715.                 return false;
  716.             }
  717.             CHECK_TERMINATE_BY_USER
  718.             MF_rf_tx_level_req->arfcn    = m_sTX_IQ_ARFCN_HIGH;
  719.             MF_rf_tx_level_req->bsic     = m_cTSC;
  720.             MF_rf_tx_level_req->power    = m_sTX_IQ_PCL_HIGH;
  721.             MF_rf_tx_level_req->frames   = -99;
  722.             MF_rf_tx_level_req->dacValue = m_sDefault_value;
  723.             if( frmFatcory->rbAgilent8960->Checked )
  724.             {
  725.                 MF_rf_tx_level_req->burstTypeNB = NB_TX_ALL_ONES_WITHOUT_TSC;
  726.             }
  727.             else
  728.             {   MF_rf_tx_level_req->burstTypeNB = NB_TX_RANDOM_WITH_TSC;
  729.             }
  730.             if (META_Rf_NB_TX_r(m_pCal->i_MainMETAHandle,
  731.                     MF_rf_tx_level_req,
  732.                     ::ccb_MF_rf_tx_level_TrOff,
  733.                     &MF_rf_tx_level_token,
  734.                                     NULL
  735.                           ) != META_SUCCESS)
  736.             {
  737.                 CalErrorHandler(WM_MF_RF_TX_LEVEL_FAIL);
  738.                 log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  739.                       " FAIL : Target< ARFCN = " + IntToStr(m_sTX_IQ_ARFCN_HIGH) +
  740.                       ", TSC = " + IntToStr(m_cTSC) +
  741.                       ", power = " + m_sTX_IQ_PCL +
  742.                       ", frames = " + IntToStr(i_N_TX) +
  743.                       ", dac value = " + IntToStr(m_sDefault_value)
  744.                     );
  745.                 return false;
  746.             }
  747.             SUSPEND_CAL_THREAD
  748.             Sleep(100);
  749.         // TX IQ gain imbalance
  750.                 if (!m_rct_ctrl.RCT_readTxIq(m_pRct, d_SBS[i], d_OOS[i]))
  751.                 {
  752.                     CalErrorHandler(WM_MF_AGE8960_READ_IQ_TUNNING_FAIL);
  753.                     log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  754.                                   " FAIL : " + m_pRct->as_RCT + " > read TX IQ tunning fail."
  755.                                 );
  756.                     return false;
  757.                 }
  758.                 if (i<=2)
  759.                 {
  760.                     if (NAN == d_SBS[i])
  761.                     {
  762.                         CalErrorHandler(WM_MF_RF_TX_IQ_FAIL);
  763.                         log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  764.                                  " FAIL :  Get TX IQ imbalance fail."
  765.                                 );
  766.                         return false;
  767.                     }
  768.                     d_PSBS[i] = exp(d_SBS[i]/10.0*logl(10.0));
  769.                     log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  770.                              " TrimI = " + IntToStr( TrimIQ[i].I ) +
  771.                              ", TrimQ = " + IntToStr( TrimIQ[i].Q ) +
  772.                              ", SBS = " + Double_To_AnsiString( d_SBS[i] ) +
  773.                              ", PSBS = " + Double_To_AnsiString( d_PSBS[i] )
  774.                             );
  775.                 }
  776.                 if (NAN == d_OOS[i])
  777.                 {
  778.                     CalErrorHandler(WM_MF_RF_TX_IQ_FAIL);
  779.                     log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  780.                                " FAIL :  Get TX original offset fail."
  781.                             );
  782.                     return false;
  783.                 }
  784.                d_POOS[i] = exp(d_OOS[i]/10.0*logl(10.0));
  785.             log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  786.                       " OffsetI = " + IntToStr(OffsetIQ[i].I) +
  787.                       ", OffsetQ = " + IntToStr(OffsetIQ[i].Q) +
  788.                       ", OOS = " + Double_To_AnsiString(d_OOS[i]) +
  789.                       ", POOS = " + Double_To_AnsiString(d_POOS[i])
  790.                     );
  791.             Sleep(50);
  792.             STOP_RF
  793.         }
  794.         // TX IQ gain imbalance
  795.         ViReal64 Xt;
  796.         Xt = 14*(d_PSBS[2]-d_PSBS[1]) / (2*(d_PSBS[2]+d_PSBS[1]-2*d_PSBS[0]));
  797.         float fdata = Xt/2.0;
  798.         fdata += (fdata>=0) ? 0.5 : -0.5 ;
  799.         trim_IQt_h.I = fdata;
  800.         fdata = -1.0*(Xt - trim_IQt_h.I);
  801.         fdata += (fdata>=0) ? 0.5 : -0.5 ;
  802.         trim_IQt_h.Q = fdata;
  803.         if (trim_IQt_h.I > MAX_TRIM_IQ)
  804.         {
  805.             trim_IQt_h.I = MAX_TRIM_IQ;
  806.         }
  807.         else if (trim_IQt_h.I < MIN_TRIM_IQ)
  808.         {
  809.             trim_IQt_h.I = MIN_TRIM_IQ;
  810.         }
  811.         if (trim_IQt_h.Q > MAX_TRIM_IQ)
  812.         {
  813.             trim_IQt_h.Q = MAX_TRIM_IQ;
  814.         }
  815.         else if (trim_IQt_h.Q < MIN_TRIM_IQ)
  816.         {
  817.             trim_IQt_h.Q = MIN_TRIM_IQ;
  818.         }
  819.         log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  820.                  " Evaluate Xt = " + Double_To_AnsiString(Xt) + ", TrimI = " + IntToStr(trim_IQt_h.I) +
  821.                  ", TrimQ = " + IntToStr(trim_IQt_h.Q)
  822.                  );
  823.         // TX DC offset
  824.         fdata = 30*3*(d_POOS[3]-d_POOS[2]) / (2*(d_POOS[3]+d_POOS[2]+2*d_POOS[1]-4*d_POOS[0]));
  825.         fdata += (fdata>=0) ? 0.5 : -0.5 ;
  826.         offset_IQt_h.I = fdata;
  827.         fdata= 30*(d_POOS[3]+d_POOS[2]-4*d_POOS[1]+2*d_POOS[0]) / (2*(d_POOS[3]+d_POOS[2]+2*d_POOS[1]-4*d_POOS[0]));
  828.         fdata += (fdata>=0) ? 0.5 : -0.5 ;
  829.         offset_IQt_h.Q = fdata;
  830.         if (offset_IQt_h.I > MAX_OFFSET_IQ)
  831.         {
  832.             offset_IQt_h.I = MAX_OFFSET_IQ;
  833.         }
  834.         else if (offset_IQt_h.I < MIN_OFFSET_IQ)
  835.         {
  836.             offset_IQt_h.I = MIN_OFFSET_IQ;
  837.         }
  838.         if (offset_IQt_h.Q > MAX_OFFSET_IQ)
  839.         {
  840.             offset_IQt_h.Q = MAX_OFFSET_IQ;
  841.         }
  842.         else if (offset_IQt_h.Q < MIN_OFFSET_IQ)
  843.         {
  844.             offset_IQt_h.Q = MIN_OFFSET_IQ;
  845.         }
  846.         log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  847.                  " Evaluate OffsetI = " + IntToStr(offset_IQt_h.I) +
  848.                  ", OffsetQ = " + IntToStr(offset_IQt_h.Q)
  849.                  );
  850.         l1cal_txiq.bbtx_trimI_h   = trim_IQt_h.I;
  851.         l1cal_txiq.bbtx_trimQ_h   = trim_IQt_h.Q;
  852.         l1cal_txiq.bbtx_offsetI_h = offset_IQt_h.I;
  853.         l1cal_txiq.bbtx_offsetQ_h = offset_IQt_h.Q;
  854.         rf_bb_tx_cfg_req.TxTrimI   = trim_IQt_h.I;
  855.         rf_bb_tx_cfg_req.TxTrimQ   = trim_IQt_h.Q;
  856.         rf_bb_tx_cfg_req.TxOffsetI = offset_IQt_h.I;
  857.         rf_bb_tx_cfg_req.TxOffsetQ = offset_IQt_h.Q;
  858.         m_cTXIQ_RUN_Obj.ConfirmCallback = ::CNF_MF;
  859.         m_cTXIQ_RUN_Obj.REQ_SetBBTxCfg_Start(m_pCal->e_bbtxcfg_ver, rf_bb_tx_cfg_req);
  860.         RestartTimerCal(WM_MF_RF_SET_BB_TX_CFG_FAIL);
  861.         SUSPEND_CAL_THREAD
  862.         if (m_cTXIQ_RUN_Obj.Get_ConfirmState() != METAAPP_SUCCESS)
  863.         {
  864.             CalErrorHandler(WM_MF_RF_SET_BB_TX_CFG_FAIL);
  865.             log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  866.                   " FAIL: Target < RF set BB TX CFG fail."
  867.                 );
  868.             return false;
  869.         }
  870. #if 0
  871.         // phase calibration
  872.         if (m_pCal->e_bbtxcfg_ver >= BBTXCFG_VER3)
  873.         {
  874.             char TxPhasesel[2] = {0, 3};
  875.             double d_SBS_phase[2];
  876.             double d_PSBS_phase[2];
  877.             char TxPhasesel_min;
  878.             for (int i=0; i<2; i++)
  879.             {
  880.                 rf_bb_tx_cfg_req.TxPhasesel = TxPhasesel[i];
  881.                 m_cTXIQ_RUN_Obj.ConfirmCallback = ::CNF_MF;
  882.                 m_cTXIQ_RUN_Obj.REQ_SetBBTxCfg_Start(m_pCal->e_bbtxcfg_ver, rf_bb_tx_cfg_req);
  883.                 RestartTimerCal(WM_MF_RF_SET_BB_TX_CFG_FAIL);
  884.                 SUSPEND_CAL_THREAD
  885.                 if (m_cTXIQ_RUN_Obj.Get_ConfirmState() != METAAPP_SUCCESS)
  886.                 {
  887.                     CalErrorHandler(WM_MF_RF_SET_BB_TX_CFG_FAIL);
  888.                     log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  889.                              " FAIL: Target < RF set BB TX CFG fail."
  890.                             );
  891.                     return false;
  892.                 }
  893.                 CHECK_TERMINATE_BY_USER
  894.                 RestartTimerCal(WM_MF_RF_TX_IQ_FAIL);
  895.             MF_rf_tx_level_req->arfcn    = m_sTX_IQ_ARFCN_HIGH;
  896.             MF_rf_tx_level_req->bsic     = m_cTSC;
  897.             MF_rf_tx_level_req->power    = m_sTX_IQ_PCL_HIGH;
  898.             MF_rf_tx_level_req->frames   = -99;
  899.                 MF_rf_tx_level_req->dacValue = m_sDefault_value;
  900.                 if (frmFatcory->rbAgilent8960->Checked)
  901.                 {
  902.                     MF_rf_tx_level_req->burstTypeNB = NB_TX_ALL_ONES_WITHOUT_TSC;
  903.                 }
  904.                 else
  905.                 {
  906.                     MF_rf_tx_level_req->burstTypeNB = NB_TX_RANDOM_WITH_TSC;
  907.                 }
  908.                 if (META_Rf_NB_TX_r(m_pCal->i_MainMETAHandle,
  909.                                     MF_rf_tx_level_req,
  910.                                     ::ccb_MF_rf_tx_level_TrOff,
  911.                                     &MF_rf_tx_level_token,
  912.                                     NULL
  913.                                    ) != META_SUCCESS)
  914.                 {
  915.                     CalErrorHandler(WM_MF_RF_TX_LEVEL_FAIL);
  916.                     log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  917.                              " FAIL : Target< ARFCN = " + IntToStr(m_sTX_IQ_ARFCN) +
  918.                              ", TSC = " + IntToStr(m_cTSC) +
  919.                              ", power = " + m_sTX_IQ_PCL +
  920.                              ", frames = " + IntToStr(i_N_TX) +
  921.                              ", dac value = " + IntToStr(m_sDefault_value)
  922.                             );
  923.                     return false;
  924.                 }
  925.                 SUSPEND_CAL_THREAD
  926.            Sleep(100);
  927.                 if (!m_rct_ctrl.RCT_readTxIqImbalance(m_pRct, d_SBS_phase[i]))
  928.                 {
  929.                     CalErrorHandler(WM_MF_AGE8960_READ_IQ_TUNNING_FAIL);
  930.                     log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  931.                              " FAIL : " + m_pRct->as_RCT + " > read TX IQ tunning fail."
  932.                              );
  933.                     return false;
  934.                 }
  935.                 if (NAN == d_SBS_phase[i])
  936.                 {
  937.                     CalErrorHandler(WM_MF_RF_TX_IQ_FAIL);
  938.                     log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  939.                              " FAIL :  Get TX IQ imbalance fail."
  940.                             );
  941.                     return false;
  942.                 }
  943.                 d_PSBS_phase[i] = exp(d_SBS_phase[i]/10.0*logl(10.0));
  944.                 log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  945.                          " TxPhasesel = " + IntToStr(TxPhasesel[i]) +
  946.                          ", SBS = " + Double_To_AnsiString(d_SBS_phase[i]) +
  947.                          ", PSBS = " + Double_To_AnsiString(d_PSBS_phase[i])
  948.                         );
  949.                 Sleep(50);
  950.                 RestartTimerCal(WM_MF_RF_TX_IQ_FAIL);
  951.                 STOP_RF
  952.             }
  953.             fdata = (TxPhasesel[1]*TxPhasesel[1] + 4*d_PSBS_phase[0] - 4*d_PSBS_phase[1])/(2*TxPhasesel[1]);
  954.             fdata += (fdata>=0) ? 0.5 : -0.5 ;
  955.             TxPhasesel_min = (char) fdata;
  956.             if (TxPhasesel_min > MAX_PHASESEL)
  957.             {
  958.                 TxPhasesel_min = MAX_PHASESEL;
  959.             }
  960.             else if (TxPhasesel_min < MIN_PHASESEL)
  961.             {
  962.                 TxPhasesel_min = MIN_PHASESEL;
  963.             }
  964.             l1cal_txiq.bbtx_phsel_h = (unsigned char) TxPhasesel_min;
  965.             log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  966.                      " Evaluate TxPhasesel = " + IntToStr(TxPhasesel_min)
  967.                     );
  968.         }
  969. #endif        
  970.     } // MT6140
  971.     log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  972.              " ================== TX IQ calibration end ================== "
  973.            );
  974.     log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  975.              " ===================== TX IQ check begin =================== "
  976.            );
  977.     m_viTX_IQ_BAND = Get_AgeBand(m_asTX_IQ_BAND);
  978.     if (!m_rct_ctrl.RCT_cellBand(m_pRct, m_viTX_IQ_BAND))
  979.     {
  980.         CalErrorHandler(WM_MF_AGE8960_SET_BAND_FAIL);
  981.         log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  982.                  " FAIL : " +
  983.                  m_pRct->as_RCT + " < Band = " + ViBand_To_Str(m_viTX_IQ_BAND)
  984.                  );
  985.         return false;
  986.     }
  987.     log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  988.              m_pRct->as_RCT + " < Band = " + ViBand_To_Str(m_viTX_IQ_BAND)
  989.             );
  990.     if (age1960_PCS1900_BAND == m_viTX_IQ_BAND)
  991.     {
  992.         if (META_Rf_SelectFrequencyBand1900_r(m_pCal->i_MainMETAHandle, 1, MF_SelectBand_cnf_cb, &MF_SelectBand_token, NULL) !=  META_SUCCESS)
  993.         {
  994.             CalErrorHandler(WM_MF_RF_AFC_SELECT_BAND_FAIL);
  995.             log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  996.                       " FAIL : Target < set Band1900 flag = 1"
  997.                     );
  998.             return false;
  999.         }
  1000.     }
  1001.     else
  1002.     {
  1003.         if (META_Rf_SelectFrequencyBand1900_r(m_pCal->i_MainMETAHandle, 0, MF_SelectBand_cnf_cb, &MF_SelectBand_token, NULL) !=  META_SUCCESS)
  1004.         {
  1005.             CalErrorHandler(WM_MF_RF_AFC_SELECT_BAND_FAIL);
  1006.             log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  1007.                      " FAIL : Target < set Band1900 flag = 0"
  1008.                     );
  1009.             return false;
  1010.         }
  1011.     }
  1012.     is_suspend_cal = true;
  1013.     this->Suspend();
  1014.     is_suspend_cal = false;
  1015.     bch_arfcn = ::Get_SeperateChannel(m_viTX_IQ_BAND, m_sTX_IQ_ARFCN);
  1016.     if (!m_rct_ctrl.RCT_BCHARFCN(m_pRct, bch_arfcn))
  1017.     {
  1018.         CalErrorHandler(WM_MF_AGE8960_SET_TCH_ARFCN_FAIL);
  1019.         log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  1020.                  " FAIL : " +
  1021.                  m_pRct->as_RCT + " < BCH ARFCN = " + IntToStr( bch_arfcn )
  1022.                  );
  1023.         return false;
  1024.     }
  1025.     if (!m_rct_ctrl.RCT_TCHARFCN(m_pRct, m_sTX_IQ_ARFCN))
  1026.     {
  1027.         CalErrorHandler(WM_MF_AGE8960_SET_TCH_ARFCN_FAIL);
  1028.         log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  1029.                  " FAIL : " +
  1030.                  m_pRct->as_RCT + " < TCH ARFCN = " + IntToStr(m_sTX_IQ_ARFCN)
  1031.                  );
  1032.         return false;
  1033.     }
  1034.     log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  1035.              m_pRct->as_RCT + " < TCH ARFCN = " + IntToStr(m_sTX_IQ_ARFCN)
  1036.              );
  1037.     if (!m_rct_ctrl.RCT_MSTXLevel(m_pRct, m_sTX_IQ_PCL))
  1038.     {
  1039.         CalErrorHandler(WM_MF_AGE8960_SET_MS_TX_LEVEL_FAIL);
  1040.         log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  1041.                  " FAIL : " + m_pRct->as_RCT + " < MS TX level = " + IntToStr(m_sTX_IQ_PCL)
  1042.                  );
  1043.         return false;
  1044.     }
  1045.     log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  1046.              m_pRct->as_RCT + " < MS TX level = " + IntToStr(m_sTX_IQ_PCL)
  1047.              );
  1048.     // set BBTxCfg
  1049.     rf_bb_tx_cfg_req.TxTrimI   = trim_IQt.I;
  1050.     rf_bb_tx_cfg_req.TxTrimQ   = trim_IQt.Q;
  1051.     rf_bb_tx_cfg_req.TxOffsetI = offset_IQt.I;
  1052.     rf_bb_tx_cfg_req.TxOffsetQ = offset_IQt.Q;
  1053.     m_cTXIQ_RUN_Obj.ConfirmCallback = ::CNF_MF;
  1054.     m_cTXIQ_RUN_Obj.REQ_SetBBTxCfg_Start(m_pCal->e_bbtxcfg_ver, rf_bb_tx_cfg_req);
  1055.     RestartTimerCal(WM_MF_RF_SET_BB_TX_CFG_FAIL);
  1056.     SUSPEND_CAL_THREAD
  1057.     if (m_cTXIQ_RUN_Obj.Get_ConfirmState() != METAAPP_SUCCESS)
  1058.     {
  1059.         CalErrorHandler(WM_MF_RF_SET_BB_TX_CFG_FAIL);
  1060.         log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  1061.                  " FAIL: Target < RF set BB TX CFG fail."
  1062.                  );
  1063.         return false;
  1064.     }
  1065.     STOP_RF
  1066.     MF_rf_tx_level_req->arfcn    = m_sTX_IQ_ARFCN;
  1067.     MF_rf_tx_level_req->bsic     = m_cTSC;
  1068.     MF_rf_tx_level_req->power    = m_sTX_IQ_PCL;
  1069.     MF_rf_tx_level_req->frames   = -99;
  1070.     MF_rf_tx_level_req->dacValue = m_sDefault_value;
  1071.     if( frmFatcory->rbAgilent8960->Checked )
  1072.         {
  1073.             MF_rf_tx_level_req->burstTypeNB = NB_TX_ALL_ONES_WITHOUT_TSC;
  1074.         }
  1075.         else
  1076.         {   MF_rf_tx_level_req->burstTypeNB = NB_TX_RANDOM_WITH_TSC;
  1077.         }
  1078.         if (META_Rf_NB_TX_r(m_pCal->i_MainMETAHandle,
  1079.                             MF_rf_tx_level_req,
  1080.                             ::ccb_MF_rf_tx_level_TrOff,
  1081.                             &MF_rf_tx_level_token,
  1082.                             NULL
  1083.                            ) != META_SUCCESS
  1084.             )
  1085.         {
  1086.             CalErrorHandler(WM_MF_RF_TX_LEVEL_FAIL);
  1087.             log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  1088.                       " FAIL : Target< ARFCN = " + IntToStr(m_sTX_IQ_ARFCN) +
  1089.                       ", TSC = " + IntToStr(m_cTSC) +
  1090.                       ", power = " + IntToStr(m_sTX_IQ_PCL) +
  1091.                       ", frames = " + IntToStr(i_N_TX) +
  1092.                       ", dac value = " + IntToStr(m_sDefault_value)
  1093.                     );
  1094.             return false;
  1095.         }
  1096.         SUSPEND_CAL_THREAD
  1097.         // TX IQ gain imbalance check
  1098.         double d_SBS_Check;
  1099.         double d_OOS_Check;
  1100.         Sleep(100);
  1101.         if (!m_rct_ctrl.RCT_readTxIq(m_pRct, d_SBS_Check, d_OOS_Check))
  1102.         {
  1103.             CalErrorHandler(WM_MF_AGE8960_READ_IQ_TUNNING_FAIL);
  1104.             log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  1105.                       " FAIL : " + m_pRct->as_RCT + " > read TX IQ tunning fail."
  1106.                     );
  1107.             return false;
  1108.         }
  1109.     if (d_OOS_Check > m_dTX_IQ_DC_OFFSET_MAX      ||
  1110.         d_SBS_Check > m_dTX_IQ_GAIN_IMBALANCE_MAX
  1111.        )
  1112.     {
  1113.         l1cal_txiq.bbtx_isCalibrated = 0;
  1114.     }
  1115.     else
  1116.     {
  1117.         l1cal_txiq.bbtx_isCalibrated = BBTX_CALIBRATED_SCALE;
  1118.     }
  1119.     if ((RF_ID_A60111A == m_pCal->ui_rf_id) ||
  1120.         (RF_ID_AERO2E  == m_pCal->ui_rf_id) ||
  1121.         (RF_ID_MT6140A == m_pCal->ui_rf_id) ||
  1122.         (RF_ID_MT6140B == m_pCal->ui_rf_id) ||
  1123.         (RF_ID_MT6140C == m_pCal->ui_rf_id) ||
  1124.         (RF_ID_MT6140D == m_pCal->ui_rf_id)
  1125.        )
  1126.     {
  1127.         m_viTX_IQ_BAND_HIGH = Get_AgeBand(m_asTX_IQ_BAND_HIGH);
  1128.         if (!m_rct_ctrl.RCT_cellBand(m_pRct, m_viTX_IQ_BAND_HIGH))
  1129.         {
  1130.             CalErrorHandler(WM_MF_AGE8960_SET_BAND_FAIL);
  1131.             log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  1132.                      " FAIL : " +
  1133.                      m_pRct->as_RCT + " < Band = " + ViBand_To_Str(m_viTX_IQ_BAND_HIGH)
  1134.                      );
  1135.             return false;
  1136.         }
  1137.         log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  1138.                  m_pRct->as_RCT + " < Band = "+
  1139.                  ViBand_To_Str(m_viTX_IQ_BAND_HIGH)
  1140.                  );
  1141.         if (age1960_PCS1900_BAND == m_viTX_IQ_BAND_HIGH)
  1142.         {
  1143.             if (META_Rf_SelectFrequencyBand1900_r(m_pCal->i_MainMETAHandle, 1, MF_SelectBand_cnf_cb, &MF_SelectBand_token, NULL) !=  META_SUCCESS)
  1144.             {
  1145.                 CalErrorHandler(WM_MF_RF_AFC_SELECT_BAND_FAIL);
  1146.                 log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  1147.                       " FAIL : Target < set Band1900 flag = 1"
  1148.                     );
  1149.                 return false;
  1150.             }
  1151.         }
  1152.         else
  1153.         {
  1154.             if (META_Rf_SelectFrequencyBand1900_r(m_pCal->i_MainMETAHandle, 0, MF_SelectBand_cnf_cb, &MF_SelectBand_token, NULL) !=  META_SUCCESS)
  1155.             {
  1156.                 CalErrorHandler(WM_MF_RF_AFC_SELECT_BAND_FAIL);
  1157.                 log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  1158.                          " FAIL : Target < set Band1900 flag = 0"
  1159.                         );
  1160.                 return false;
  1161.             }
  1162.         }
  1163.         is_suspend_cal = true;
  1164.         this->Suspend();
  1165.         is_suspend_cal = false;
  1166.         short bch_arfcn = ::Get_SeperateChannel(m_viTX_IQ_BAND_HIGH, m_sTX_IQ_ARFCN_HIGH);
  1167.         if (!m_rct_ctrl.RCT_BCHARFCN( m_pRct, bch_arfcn) )
  1168.         {
  1169.             CalErrorHandler(WM_MF_AGE8960_SET_TCH_ARFCN_FAIL);
  1170.             log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  1171.                      " FAIL : "+
  1172.                      m_pRct->as_RCT + " < BCH ARFCN = " + IntToStr(bch_arfcn)
  1173.                     );
  1174.             return false;
  1175.         }
  1176.         if (!m_rct_ctrl.RCT_TCHARFCN(m_pRct, m_sTX_IQ_ARFCN_HIGH))
  1177.         {
  1178.             CalErrorHandler(WM_MF_AGE8960_SET_TCH_ARFCN_FAIL);
  1179.             log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  1180.                      " FAIL : " +
  1181.                      m_pRct->as_RCT + " < TCH ARFCN = " + IntToStr(m_sTX_IQ_ARFCN_HIGH)
  1182.                      );
  1183.             return false;
  1184.         }
  1185.         log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  1186.                  m_pRct->as_RCT + " < TCH ARFCN = " + IntToStr(m_sTX_IQ_ARFCN_HIGH)
  1187.                  );
  1188.         if (!m_rct_ctrl.RCT_MSTXLevel(m_pRct, m_sTX_IQ_PCL_HIGH))
  1189.         {
  1190.             CalErrorHandler(WM_MF_AGE8960_SET_MS_TX_LEVEL_FAIL);
  1191.             log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  1192.                      " FAIL : " + m_pRct->as_RCT + " < MS TX level = " + IntToStr(m_sTX_IQ_PCL_HIGH)
  1193.                      );
  1194.             return false;
  1195.         }
  1196.         log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  1197.                  m_pRct->as_RCT + " < MS TX level = " + IntToStr(m_sTX_IQ_PCL_HIGH)
  1198.                  );
  1199.         // set BBTxCfg
  1200.         rf_bb_tx_cfg_req.TxTrimI   = trim_IQt_h.I;
  1201.         rf_bb_tx_cfg_req.TxTrimQ   = trim_IQt_h.Q;
  1202.         rf_bb_tx_cfg_req.TxOffsetI = offset_IQt_h.I;
  1203.         rf_bb_tx_cfg_req.TxOffsetQ = offset_IQt_h.Q;
  1204.         m_cTXIQ_RUN_Obj.ConfirmCallback = ::CNF_MF;
  1205.         m_cTXIQ_RUN_Obj.REQ_SetBBTxCfg_Start(m_pCal->e_bbtxcfg_ver, rf_bb_tx_cfg_req);
  1206.         RestartTimerCal(WM_MF_RF_SET_BB_TX_CFG_FAIL);
  1207.         SUSPEND_CAL_THREAD
  1208.         if (m_cTXIQ_RUN_Obj.Get_ConfirmState() != METAAPP_SUCCESS)
  1209.         {
  1210.             CalErrorHandler(WM_MF_RF_SET_BB_TX_CFG_FAIL);
  1211.             log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  1212.                      " FAIL: Target < RF set BB TX CFG fail."
  1213.                     );
  1214.             return false;
  1215.         }
  1216.         STOP_RF
  1217.         MF_rf_tx_level_req->arfcn    = m_sTX_IQ_ARFCN_HIGH;
  1218.         MF_rf_tx_level_req->bsic     = m_cTSC;
  1219.         MF_rf_tx_level_req->power    = m_sTX_IQ_PCL_HIGH;
  1220.         MF_rf_tx_level_req->frames   = -99;
  1221.         MF_rf_tx_level_req->dacValue = m_sDefault_value;
  1222.         if (frmFatcory->rbAgilent8960->Checked)
  1223.         {
  1224.             MF_rf_tx_level_req->burstTypeNB = NB_TX_ALL_ONES_WITHOUT_TSC;
  1225.         }
  1226.         else
  1227.         {   MF_rf_tx_level_req->burstTypeNB = NB_TX_RANDOM_WITH_TSC;
  1228.         }
  1229.         if (META_Rf_NB_TX_r(m_pCal->i_MainMETAHandle,
  1230.                             MF_rf_tx_level_req,
  1231.                             ::ccb_MF_rf_tx_level_TrOff,
  1232.                             &MF_rf_tx_level_token,
  1233.                             NULL
  1234.                            ) != META_SUCCESS
  1235.            )
  1236.         {
  1237.             CalErrorHandler(WM_MF_RF_TX_LEVEL_FAIL);
  1238.             log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  1239.                      " FAIL : Target< ARFCN = " + IntToStr(m_sTX_IQ_ARFCN_HIGH) +
  1240.                      ", TSC = " + IntToStr(m_cTSC) +
  1241.                      ", power = " + IntToStr(m_sTX_IQ_PCL_HIGH) +
  1242.                      ", frames = " + IntToStr(i_N_TX) +
  1243.                      ", dac value = " + IntToStr(m_sDefault_value)
  1244.                     );
  1245.             return false;
  1246.         }
  1247.         SUSPEND_CAL_THREAD
  1248.         Sleep(100);
  1249.         // TX IQ gain imbalance & OOS check
  1250.         if (!m_rct_ctrl.RCT_readTxIq(m_pRct, d_SBS_Check_h, d_OOS_Check_h))
  1251.         {
  1252.             CalErrorHandler(WM_MF_AGE8960_READ_IQ_TUNNING_FAIL);
  1253.                 if( frmFatcory->rbAgilent8960->Checked )
  1254.                 {
  1255.                     log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  1256.                       " FAIL : Agilent 8960 > read TX IQ tunning fail."
  1257.                     );
  1258.                 }
  1259.                 else
  1260.                 {
  1261.                     log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  1262.                       " FAIL : CMU 200 > read TX IQ tunning fail."
  1263.                     );
  1264.                 }
  1265.                 return false;
  1266.             }
  1267.        if( d_OOS_Check   > m_dTX_IQ_DC_OFFSET_MAX      ||
  1268.            d_SBS_Check   > m_dTX_IQ_GAIN_IMBALANCE_MAX ||
  1269.            d_OOS_Check_h > m_dTX_IQ_DC_OFFSET_MAX      ||
  1270.            d_SBS_Check_h > m_dTX_IQ_GAIN_IMBALANCE_MAX
  1271.           )
  1272.        {
  1273.             l1cal_txiq.bbtx_isCalibrated = 0;
  1274.        }
  1275.        else
  1276.        {
  1277.             l1cal_txiq.bbtx_isCalibrated = BBTX_CALIBRATED_SCALE;
  1278.        }
  1279.     }
  1280.     S_BBTXPARA_CHANGE_FLAG_T flag;
  1281.     flag.b_bbtx_common_mode_voltage = true;
  1282.     flag.b_bbtx_gain = true;
  1283.     flag.b_bbtx_calrcsel = true;
  1284.     flag.b_bbtx_trimI = true;
  1285.     flag.b_bbtx_trimQ = true;
  1286.     flag.b_bbtx_offsetI = true;
  1287.     flag.b_bbtx_offsetQ = true;
  1288.     flag.b_bbtx_isCalibrated = true;
  1289.     flag.b_apc_bat_low_voltage = true;
  1290.     flag.b_apc_bat_high_voltage = true;
  1291.     flag.b_apc_bat_low_temperature = true;
  1292.     flag.b_apc_bat_high_temperature = true;
  1293.     flag.b_bbtx_common_mode_voltage_h = true;
  1294.     flag.b_bbtx_gain_h = true;
  1295.     flag.b_bbtx_calrcsel_h = true;
  1296.     flag.b_bbtx_trimI_h = true;
  1297.     flag.b_bbtx_trimQ_h = true;
  1298.     flag.b_bbtx_offsetI_h = true;
  1299.     flag.b_bbtx_offsetQ_h = true;
  1300.     flag.b_bbtx_phsel = true;
  1301.     flag.b_bbtx_phsel_h = true;
  1302.     MF_rf_txiq_ptr->Set_BBTXChangeFlag(flag);
  1303.     MF_rf_txiq_ptr->Set_BBTXParameters(l1cal_txiq);
  1304.     WriteTxDcOffsetCalResultToFile(as_ID+".cal",Application->ExeName, m_pCal->b_CalResultPath );
  1305.     MF_rf_txiq_ptr->ConfirmCallback = ::ccb_write_txiq_to_nvram;
  1306.     MF_rf_txiq_ptr->REQ_Write_To_NVRAM_Start(m_pCal->ui_rf_id, m_pCal->e_bbtxcfg_ver);
  1307.     RestartTimerCal (WM_MF_NVRAM_TXIQ_WRITE_FAIL);
  1308.     SUSPEND_CAL_THREAD
  1309.     E_METAAPP_RESULT_T state = MF_rf_txiq_ptr->Get_ConfirmState();
  1310.     if (state != METAAPP_SUCCESS)
  1311.     {
  1312.         if (METAAPP_NVRAM_LID_VER_NOT_SUPPORT == state)
  1313.         {
  1314.             CalErrorHandler(WM_MF_NVRAM_EF_L1_TXIQ_LID_VERNO_FAIL);
  1315.             log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  1316.                      " FAIL : NVRAM_EF_L1_TXIQ_LID version is not support, please update META to latest version. "
  1317.                      );
  1318.         }
  1319.         else
  1320.         {
  1321.             CalErrorHandler(WM_MF_NVRAM_TXIQ_READ_FAIL);
  1322.             log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  1323.                      " FAIL:  Target< Write txiq value to NVRAM fail "
  1324.                      );
  1325.         }
  1326.         return false;
  1327.     }
  1328.     log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  1329.                   " Target< Write TXIQ value to NVRAM"
  1330.                 );
  1331.     if (d_OOS_Check > m_dTX_IQ_DC_OFFSET_MAX)
  1332.     {
  1333.         CalErrorHandler(WM_MF_RF_TX_IQ_CHECK_FAIL);
  1334.         log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  1335.                  " FAIL: TX IQ calibration."  +
  1336.                  " , Check TX DC offset = " + Double_To_AnsiString(d_OOS_Check) +
  1337.                  ", Max TX DC offset = " + Double_To_AnsiString(m_dTX_IQ_DC_OFFSET_MAX)
  1338.                 );
  1339.         return false;
  1340.     }
  1341.     log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  1342.              " PASS: TX IQ calibration." +
  1343.              " , Check TX DC offset = " + Double_To_AnsiString(d_OOS_Check) +
  1344.              ", Max TX DC offset = " + Double_To_AnsiString(m_dTX_IQ_DC_OFFSET_MAX)
  1345.             );
  1346.     // TX IQ gain imbalnce check
  1347.     if (d_SBS_Check > m_dTX_IQ_GAIN_IMBALANCE_MAX)
  1348.     {
  1349.         CalErrorHandler(WM_MF_RF_TX_IQ_CHECK_FAIL);
  1350.         log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  1351.                  " FAIL: TX IQ calibration."  +
  1352.                  " , Check TX IQ gain imbalance = " + Double_To_AnsiString(d_SBS_Check) +
  1353.                  ", Max TX IQ gain imbalance = " + Double_To_AnsiString(m_dTX_IQ_GAIN_IMBALANCE_MAX)
  1354.                 );
  1355.         return false;
  1356.     }
  1357.     log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  1358.              " PASS: TX IQ calibration." +
  1359.              " , Check TX IQ gain imbalance = " + Double_To_AnsiString(d_SBS_Check) +
  1360.              ", Max TX IQ gain imbalance = " + Double_To_AnsiString(m_dTX_IQ_GAIN_IMBALANCE_MAX)
  1361.              );
  1362.     if ((RF_ID_A60111A == m_pCal->ui_rf_id) ||
  1363.         (RF_ID_AERO2E  == m_pCal->ui_rf_id) ||
  1364.         (RF_ID_MT6140A == m_pCal->ui_rf_id) ||
  1365.         (RF_ID_MT6140B == m_pCal->ui_rf_id) ||
  1366.         (RF_ID_MT6140C == m_pCal->ui_rf_id) ||
  1367.         (RF_ID_MT6140D == m_pCal->ui_rf_id)
  1368.        )
  1369.     {
  1370.         if (d_OOS_Check_h > m_dTX_IQ_DC_OFFSET_MAX_HIGH)
  1371.         {
  1372.             CalErrorHandler(WM_MF_RF_TX_IQ_CHECK_FAIL);
  1373.             log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  1374.                      " FAIL: TX IQ calibration."  +
  1375.                      " , Check high band TX DC offset = " + Double_To_AnsiString(d_OOS_Check_h) +
  1376.                      ", Max TX DC offset = " + Double_To_AnsiString( m_dTX_IQ_DC_OFFSET_MAX_HIGH )
  1377.                     );
  1378.             return false;
  1379.         }
  1380.         log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  1381.                  " PASS: TX IQ calibration." +
  1382.                  " , Check high band TX DC offset = " + Double_To_AnsiString(d_OOS_Check_h) +
  1383.                  ", Max TX DC offset = " + Double_To_AnsiString(m_dTX_IQ_DC_OFFSET_MAX_HIGH )
  1384.                 );
  1385.     // TX IQ gain imbalnce check
  1386.         if( d_SBS_Check_h > m_dTX_IQ_GAIN_IMBALANCE_MAX )
  1387.         {
  1388.             CalErrorHandler( WM_MF_RF_TX_IQ_CHECK_FAIL );
  1389.             log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  1390.                               " FAIL: TX IQ calibration."  +
  1391.                               " , Check high band TX IQ gain imbalance = " + Double_To_AnsiString(d_SBS_Check_h) +
  1392.                               ", Max TX IQ gain imbalance = " + Double_To_AnsiString(m_dTX_IQ_GAIN_IMBALANCE_MAX_HIGH)
  1393.                 );
  1394.             return false;
  1395.         }
  1396.         log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  1397.                               " PASS: TX IQ calibration." +
  1398.                               " , Check high band TX IQ gain imbalance = " + Double_To_AnsiString(d_SBS_Check_h) +
  1399.                               ", Max TX IQ gain imbalance = " + Double_To_AnsiString(m_dTX_IQ_GAIN_IMBALANCE_MAX_HIGH)
  1400.                 );
  1401.     }
  1402.     frmFatcory->DisableAllCalTimer();
  1403.     PostMessage(
  1404.                      ctrl.hPostMsgDestHandle,
  1405.                      WM_MF_RF_TX_IQ_CALIBRATION_DONE,
  1406.                      0,
  1407.                      0
  1408.                     );
  1409.     log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  1410.              " ===================== TX IQ check end ===================== "
  1411.            );
  1412.     return true;
  1413. }
  1414. //------------------------------------------------------------------------------
  1415. ViReal64 __fastcall T_META_factory_calibration::get_TX_Original_Offset(ViReal64  *p_IQTFreqs, ViReal64 *p_IQTResults, ViInt32   IQTTuningCount)
  1416. {
  1417.     for(int i=0; i<IQTTuningCount; i++)
  1418.     {
  1419.         if( *(p_IQTFreqs+i) == IQT_ORIGINAL_OFFSET_FREQ )
  1420.         {
  1421.             return *(p_IQTResults+i);
  1422.         }
  1423.     }
  1424.     return NAN;
  1425. }