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

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_TXPCL_Axiom502.cpp
  40.  *
  41.  * Project:
  42.  * --------
  43.  *   Maui META APP
  44.  *
  45.  * Description:
  46.  * ------------
  47.  *  TX PCL calibration for Axiom AX502 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 _APCCAL_COMMON_H_
  72. #include "apccal_common.h"
  73. #endif
  74. #ifndef  _RF_APC_H_
  75. #include "rf_apc.h"
  76. #endif
  77. #ifndef _META_FACTORY_RF_CB_H_
  78. #include "meta_factory_rf_cb.h"
  79. #endif
  80. // form
  81. #ifndef _META_FACTORY_H_
  82. #include "META_Factory.h"
  83. #endif
  84. // equipment
  85. #ifndef _AGE1968A_H_
  86. #include "age1968a.h"
  87. #endif
  88. // callback
  89. #ifndef _META_FACTORY_NVRAM_CB_H_
  90. #include "meta_factory_nvram_cb.h"
  91. #endif
  92. // misc
  93. #ifndef  _BAND_UTILS_H_
  94. #include "band_utils.h"
  95. #endif
  96. #ifndef  _TIME_UTILS_H_
  97. #include "time_utils.h"
  98. #endif
  99. #ifndef  _FT_UTILS_H_
  100. #include "ft_utils.h"
  101. #endif
  102. //----------------------------------------------------------------------------
  103. extern CRFAPC*  MF_rf_apc_ptr;
  104. extern RfNbtx_Req *MF_rf_tx_level_req;
  105. extern bool MF_rf_tx_level_cnf;
  106. extern bool  is_suspend_cal; // in T_META_factory_calibration.cpp
  107. // equipment
  108. //extern CMU_VAR cmu;
  109. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  110. /////////////////////////////     Axiom AX502           /////////////////////
  111. //---------------------------------------------------------------------------
  112. bool __fastcall T_META_factory_calibration::TXPCLCal_Axiom502_3PCLEvalDac(void)
  113. {
  114.     short s_ARFCN;
  115.     short s_first_pcl;
  116.     AnsiString  as_wanted_p;
  117.     AnsiString  as_correction;
  118.     AnsiString  as_tx_pcl;
  119.     AnsiString  as_tx_6cal_pcl;
  120.     AnsiString  as_switch_pcl;
  121.     char c_total_pcl_num;
  122.     unsigned short us_weight;
  123.     double d_weight;
  124.     unsigned short us_ramp_value;
  125.     unsigned short us_battery_compensate;
  126.     double  d_battery_compensate;
  127.     short s_tx_6cal_pcl[RF_TX_LEVEL_6_CAL_COUNT];
  128.     short s_tx_pcl[TOTAL_DCS_PCL_NUM];
  129.     short s_switch_pcl[RF_TX_LEVEL_2_CAL_COUNT];
  130.     double d_wanted_p[TOTAL_DCS_PCL_NUM];
  131.     double d_correction[TOTAL_DCS_PCL_NUM];
  132.     double d_Vout_cal[RF_TX_LEVEL_6_CAL_COUNT];
  133.     double d_Vramp_cal[RF_TX_LEVEL_6_CAL_COUNT];
  134.     double d_slope[RF_TX_LEVEL_3_CAL_COUNT];
  135.     double d_Vout_eval[TOTAL_DCS_PCL_NUM];
  136.     double d_Vramp_eval[TOTAL_DCS_PCL_NUM];
  137.     unsigned short us_ApcDac_cal[RF_TX_LEVEL_6_CAL_COUNT];
  138.     unsigned short us_ApcDac_eval[TOTAL_DCS_PCL_NUM];
  139.     int i_ApcDcOffset;
  140.     log->Add("n" +DateToStr(Date()) +  " " + CurrentTimeStr() +
  141.                   " =================== Evaluate PCL DAC value begin =================== "
  142.                 );
  143.     // calculate Vset DAC value
  144.     FrequencyBand eFreqBand = FrequencyBand850;
  145.     while (eFreqBand < FrequencyBandCount)
  146.     {
  147.         switch (eFreqBand)
  148.         {
  149.             case FrequencyBand850:
  150.             {
  151.                 if (!IsFreqBankSupported(m_asFreqBank, eFreqBand))
  152.                 {
  153.                     eFreqBand++;
  154.                     continue;
  155.                 }
  156.                 s_ARFCN         = m_sARFCN_C0_GSM850;
  157.                 s_first_pcl     = GSM850_FIRST_PCL;
  158.                 c_total_pcl_num = TOTAL_GSM850_PCL_NUM;
  159.                 as_tx_pcl       = m_as_gsm850_tx_pcl;
  160.                 as_tx_6cal_pcl  = m_as_gsm850_tx_6cal_pcl;
  161.                 as_switch_pcl   = m_asAXIOM502_GSM850_SWITCH_PCL;
  162.                 as_wanted_p     = m_as_gsm850_wanted_p;
  163.                 as_correction   = m_as_gsm850_correction;
  164.             }
  165.             break;
  166.             case FrequencyBand900:
  167.             {
  168.                 if (!IsFreqBankSupported(m_asFreqBank, eFreqBand))
  169.                 {
  170.                     eFreqBand++;
  171.                     continue;
  172.                 }
  173.                 s_ARFCN         = m_sARFCN_C0_GSM;
  174.                 s_first_pcl     = GSM900_FIRST_PCL;
  175.                 c_total_pcl_num = TOTAL_GSM_PCL_NUM;
  176.                 as_tx_pcl       = m_as_gsm900_tx_pcl;
  177.                 as_tx_6cal_pcl  = m_as_gsm900_tx_6cal_pcl;
  178.                 as_switch_pcl   = m_asAXIOM502_GSM900_SWITCH_PCL;
  179.                 as_wanted_p     = m_as_gsm900_wanted_p;
  180.                 as_correction   = m_as_gsm900_correction;
  181.             }
  182.             break;
  183.             case FrequencyBand1800:
  184.             {
  185.                 if (!IsFreqBankSupported(m_asFreqBank, eFreqBand))
  186.                 {
  187.                     eFreqBand++;
  188.                     continue;
  189.                 }
  190.                 s_ARFCN         = m_sARFCN_C0_DCS;
  191.                 s_first_pcl     = DCS1800_FIRST_PCL;
  192.                 c_total_pcl_num = TOTAL_DCS_PCL_NUM;
  193.                 as_tx_pcl       = m_as_dcs1800_tx_pcl;
  194.                 as_tx_6cal_pcl  = m_as_dcs1800_tx_6cal_pcl;
  195.                 as_switch_pcl   = m_asAXIOM502_DCS1800_SWITCH_PCL;
  196.                 as_wanted_p     = m_as_dcs1800_wanted_p;
  197.                 as_correction   = m_as_dcs1800_correction;
  198.             }
  199.             break;
  200.             case FrequencyBand1900:
  201.             {
  202.                 if (!IsFreqBankSupported(m_asFreqBank, eFreqBand))
  203.                 {
  204.                     eFreqBand++;
  205.                     continue;
  206.                 }
  207.                 s_ARFCN         = m_sARFCN_C0_PCS;
  208.                 s_first_pcl     = PCS1900_FIRST_PCL;
  209.                 c_total_pcl_num = TOTAL_PCS_PCL_NUM;
  210.                 as_tx_pcl       = m_as_pcs1900_tx_pcl;
  211.                 as_tx_6cal_pcl  = m_as_pcs1900_tx_6cal_pcl;
  212.                 as_switch_pcl   = m_asAXIOM502_PCS1900_SWITCH_PCL;
  213.                 as_wanted_p     = m_as_pcs1900_wanted_p;
  214.                 as_correction   = m_as_pcs1900_correction;
  215.             }
  216.             break;
  217.             default:
  218.             {
  219.                 assert(false);
  220.             }
  221.             break;
  222.         } // switch
  223.         E_BANDSEL band_index = FreqBand_To_BandIdx(eFreqBand);
  224.         log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() + " " +
  225.                               "---------------------------------------------"
  226.                 );
  227.         log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() + " " +
  228.                               BandIdx_To_String(band_index)
  229.                 );
  230.         String_To_Array_short(as_tx_6cal_pcl.c_str(), s_tx_6cal_pcl, RF_TX_LEVEL_6_CAL_COUNT);
  231.         String_To_Array_short(as_tx_pcl.c_str(), s_tx_pcl, c_total_pcl_num);
  232.         String_To_Array_short(as_switch_pcl.c_str(), s_switch_pcl, RF_TX_LEVEL_2_CAL_COUNT);
  233.         String_To_Array_double(as_wanted_p.c_str(), d_wanted_p, c_total_pcl_num);
  234.         String_To_Array_double(as_correction.c_str(), d_correction, c_total_pcl_num);
  235.         l1cal_rampTable_T* p_ramp_table = MF_rf_apc_ptr->Get_ApcProfile(band_index);
  236.         for (int i=0; i<RF_TX_LEVEL_6_CAL_COUNT; i++)
  237.         {
  238.             d_Vout_cal[i] = sqrt(0.05 * pow(10.0, m_dPCL_dBm[band_index][i]/10.0));
  239.         }
  240.         for (int i=0; i<RF_TX_LEVEL_6_CAL_COUNT; i++)
  241.         {
  242.             // get subband weighting
  243.             if (!MF_rf_apc_ptr->Get_SubBandWeighting(*p_ramp_table, s_ARFCN, s_tx_6cal_pcl[i], us_weight) )
  244.             {
  245.                 CalErrorHandler( WM_MF_RF_TX_LEVEL_EVALDAC_FAIL );
  246.                 log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  247.                               " FAIL: get sub-band weighting."
  248.                         );
  249.                 return false;
  250.             }
  251.             d_weight = 1.0 * us_weight / WEIGHT_SCALE;
  252.             // get ramp up value
  253.             if (! MF_rf_apc_ptr->Get_RightTopRampUpValue(*p_ramp_table, band_index, s_first_pcl-s_tx_6cal_pcl[i], us_ramp_value))
  254.             {
  255.                 CalErrorHandler(WM_MF_RF_TX_LEVEL_EVALDAC_FAIL);
  256.                 log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  257.                               " FAIL: get ramp up value, index = " + IntToStr(s_first_pcl-s_tx_6cal_pcl[i])
  258.                         );
  259.                 return false;
  260.             }
  261.             // get battery compensation
  262.             if (!MF_rf_apc_ptr->Get_BatteryCompensate(*p_ramp_table, MID_VOLTAGE_INDEX, MID_TEMPERATURE_INDEX, us_battery_compensate))
  263.             {
  264.                 CalErrorHandler(WM_MF_RF_TX_LEVEL_EVALDAC_FAIL);
  265.                 log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  266.                               " FAIL: get battery_compensate value."
  267.                         );
  268.                 return false;
  269.             }
  270.             d_battery_compensate = 1.0* us_battery_compensate / BATTERY_COMPENSATE_SCALE;
  271.             us_ApcDac_cal[i] = m_usPCLDacValue[band_index][i] * d_weight * d_battery_compensate * us_ramp_value / MAX_RAMP_VALUE;
  272.             if (!MF_rf_apc_ptr->Get_RealApcDcOffset(m_pCal->b_TADOSupport, band_index, s_tx_6cal_pcl[i], i_ApcDcOffset))
  273.             {
  274.                 CalErrorHandler( WM_MF_RF_TX_LEVEL_EVALDAC_FAIL );
  275.                 log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  276.                               " FAIL: Get APC DC offset " +
  277.                               " TADO support = " + IntToStr( m_pCal->b_TADOSupport ) +
  278.                               " eFreqBand = " + IntToStr( eFreqBand ) +
  279.                               " pcl = " + IntToStr(s_tx_6cal_pcl[i] )
  280.                         );
  281.                 return false;
  282.             }
  283.             d_Vramp_cal[i] = (i_ApcDcOffset + us_ApcDac_cal[i])/pow(2.0, 10.0) * 2.8;
  284.             log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  285.                      " Vout_Cal[" + IntToStr(i) + "] = " +
  286.                              Double_To_AnsiString(d_Vout_cal[i]) +
  287.                            " Vramp_Cal[" + IntToStr(i) + "] = " +
  288.                              Double_To_AnsiString(d_Vramp_cal[i])
  289.                         );
  290.         }
  291.         for (int i=0; i<RF_TX_LEVEL_3_CAL_COUNT; i++)
  292.         {
  293.             d_slope[i] = (d_Vout_cal[2*i+1] - d_Vout_cal[2*i])/(d_Vramp_cal[2*i+1]-d_Vramp_cal[2*i]);
  294.             log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  295.                            " slope[" + IntToStr(i) + "] = " +
  296.                              Double_To_AnsiString(d_slope[i]) + "n"
  297.                         );
  298.         }
  299.         // evalue DAC of each PCL
  300.         for (int i=0; i<c_total_pcl_num; i++)
  301.         {
  302.             // get subband weighting
  303.             if (!MF_rf_apc_ptr->Get_SubBandWeighting(*p_ramp_table, s_ARFCN, s_tx_pcl[i], us_weight) )
  304.             {
  305.                 CalErrorHandler( WM_MF_RF_TX_LEVEL_EVALDAC_FAIL );
  306.                 log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  307.                               " FAIL: get sub-band weighting."
  308.                         );
  309.                 return false;
  310.             }
  311.             d_weight = 1.0 * us_weight / WEIGHT_SCALE;
  312.             // get ramp up value
  313.             if (!MF_rf_apc_ptr->Get_RightTopRampUpValue(*p_ramp_table, band_index, s_first_pcl-s_tx_pcl[i], us_ramp_value))
  314.             {
  315.                 CalErrorHandler(WM_MF_RF_TX_LEVEL_EVALDAC_FAIL);
  316.                 log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  317.                               " FAIL: get ramp up value, index = " + IntToStr(s_first_pcl-s_tx_pcl[i])
  318.                         );
  319.                 return false;
  320.             }
  321.             // get battery compensation
  322.             if (!MF_rf_apc_ptr->Get_BatteryCompensate(*p_ramp_table, MID_VOLTAGE_INDEX, MID_TEMPERATURE_INDEX, us_battery_compensate))
  323.             {
  324.                 CalErrorHandler(WM_MF_RF_TX_LEVEL_EVALDAC_FAIL);
  325.                 log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  326.                               " FAIL: get battery_compensate value."
  327.                         );
  328.                 return false;
  329.             }
  330.             d_battery_compensate = 1.0* us_battery_compensate / BATTERY_COMPENSATE_SCALE;
  331.             // APC DC offset
  332.             if (!MF_rf_apc_ptr->Get_RealApcDcOffset(m_pCal->b_TADOSupport, band_index, s_tx_pcl[i], i_ApcDcOffset))
  333.             {
  334.                 CalErrorHandler(WM_MF_RF_TX_LEVEL_EVALDAC_FAIL);
  335.                 log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  336.                          " FAIL: Get APC DC offset " +
  337.                          " TADO support = " + IntToStr(m_pCal->b_TADOSupport) +
  338.                          " eFreqBand = " + IntToStr(eFreqBand) +
  339.                          " pcl = " + IntToStr(s_tx_pcl[i])
  340.                         );
  341.                 return false;
  342.             }
  343.             d_Vout_eval[i] = sqrt(0.05 * pow(10.0, (d_wanted_p[i] + d_correction[i])/10.0));
  344.             if (s_tx_pcl[i] >= s_switch_pcl[0])
  345.             {
  346.                 d_Vramp_eval[i] = d_Vramp_cal[0] + (d_Vout_eval[i] - d_Vout_cal[0])/d_slope[0];
  347.             }
  348.             else if ((s_tx_pcl[i] < s_switch_pcl[0]) && (s_tx_pcl[i] >= s_switch_pcl[1]))
  349.             {
  350.                 d_Vramp_eval[i] = d_Vramp_cal[2] + (d_Vout_eval[i] - d_Vout_cal[2])/d_slope[1];
  351.             }
  352.             else
  353.             {
  354.                 d_Vramp_eval[i] = d_Vramp_cal[4] + (d_Vout_eval[i] - d_Vout_cal[4])/d_slope[2];
  355.             }
  356.             log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  357.                            " Vramp_eval[" + IntToStr(i) + "] = " +
  358.                              Double_To_AnsiString(d_Vramp_eval[i]) + "n"
  359.                         );
  360.             // evaluate APC DAC
  361.             us_ApcDac_eval[i] = (d_Vramp_eval[i]*pow(2.0,10.0))/2.8 - i_ApcDcOffset;
  362.             if (d_weight*d_battery_compensate*us_ramp_value == 0)
  363.             {
  364.                 CalErrorHandler(WM_MF_RF_TX_LEVEL_EVALDAC_FAIL);
  365.                 log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  366.                          " FAIL: weight*battery_compensate*ramp_value = 0."
  367.                         );
  368.                 return false;
  369.             }
  370.             us_ApcDac_eval[i] = us_ApcDac_eval[i] * MAX_RAMP_VALUE / (d_weight * d_battery_compensate * us_ramp_value);
  371.             MF_rf_apc_ptr->Set_ApcProfilePower(band_index, i, us_ApcDac_eval[i]);
  372.             log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  373.                      " us_ApcDac_eval[" + IntToStr(i) + "] = " +
  374.                      IntToStr(us_ApcDac_eval[i]) + "n"
  375.                     );
  376.         }
  377.         MF_rf_apc_ptr->ConfirmCallback = ::ccb_write_apc_to_nvram;
  378.         MF_rf_apc_ptr->REQ_Write_APC_To_NVRAM_Single_Band_Start(m_pCal->ui_rf_id, band_index, m_pCal->b_TADOSupport );
  379.         log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  380.                  " Write to NVRAM band_index = " + IntToStr(band_index)
  381.                  );
  382.         RestartTimerCal(WM_MF_NVRAM_LEVEL_RAMP_WRITE_FAIL);
  383.         CHECK_TERMINATE_BY_USER
  384.         SUSPEND_CAL_THREAD
  385.         E_METAAPP_RESULT_T state = MF_rf_apc_ptr->Get_ConfirmState();
  386.         if (state != METAAPP_SUCCESS)
  387.         {
  388.             if (METAAPP_NVRAM_LID_VER_NOT_SUPPORT == state)
  389.             {
  390.                 CalErrorHandler(WM_MF_NVRAM_EF_L1_RAMPTABLE_xxx_LID_VERNO_FAIL);
  391.                 log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  392.                              " FAIL : NVRAM_EF_L1_RAMPTABLE_xxx_LID version is not support, please update META to latest version. "
  393.                              );
  394.             }
  395.             else
  396.             {
  397.                 CalErrorHandler(WM_MF_NVRAM_LEVEL_RAMP_WRITE_FAIL);
  398.                 log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  399.                                       " FAIL: Target < write APC to NVRAM "
  400.                                     );
  401.             }
  402.             return false;
  403.         }
  404.         WriteAPCCalResultToFile(as_ID+".cal",Application->ExeName, m_pCal->b_CalResultPath, FreqBand_To_BandIdx(eFreqBand) );
  405.         eFreqBand++;
  406.     } // while
  407.     log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  408.              " ===================== Evaluate other PCL DAC value end =========== n "
  409.              );
  410.     return true;
  411. }