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

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_ADC.cpp
  40.  *
  41.  * Project:
  42.  * --------
  43.  *   Maui META APP
  44.  *
  45.  * Description:
  46.  * ------------
  47.  *  ADC 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. // common
  69. #ifndef  _METAAPP_COMMON_H_
  70. #include "metaapp_common.h"
  71. #endif
  72. #ifndef _T_META_FACTORY_CALIBRATION_H_
  73. #include "T_META_factory_calibration.H"
  74. #endif
  75. #ifndef _CAL_COMMON_H_
  76. #include "cal_common.h"
  77. #endif
  78. // form
  79. #ifndef _META_FACTORY_H_
  80. #include "META_Factory.h"
  81. #endif
  82. #ifndef _FORM_MAIN_H_
  83. #include "form_Main.h"
  84. #endif
  85. // callback
  86. #ifndef _META_FACTORY_BB_CB_H_
  87. #include "meta_factory_bb_cb.h"
  88. #endif
  89. #ifndef _META_FACTORY_NVRAM_CB_H_
  90. #include "meta_factory_nvram_cb.h"
  91. #endif
  92. // misc
  93. #ifndef  _FT_UTILS_H_
  94. #include "ft_utils.h"
  95. #endif
  96. #ifndef  _TIME_UTILS_H_
  97. #include "time_utils.h"
  98. #endif
  99. //----------------------------------------------------------------------------
  100. extern bool  is_suspend_cal; // in T_META_factory_calibration.cpp
  101. // ADC calibration
  102. extern ADCMeaData_Cnf    *BBCnf_ADC;
  103. extern ADCMeaData_Req* MF_BB_ADC_Req;
  104. extern ADCMeaData_Req    *BBReq_ADC;
  105. extern CBBADC* MF_BB_ADC_ptr; 
  106. extern TfrmFatcory *frmFatcory;
  107. //extern TfrmMainSel *frmMainSel;;
  108. //----------------------------------------------------------------------------
  109. bool __fastcall T_META_factory_calibration::ADCCal( void )
  110. {
  111.     ViReal64 measvoltage;
  112.     char tempbuf[256];
  113.     
  114.     log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  115.              " ====================== ADC calibration begin ===================== "
  116.            );
  117.     PostMessage(
  118.                      ctrl.hPostMsgDestHandle,
  119.                      WM_MF_ADC_BEGIN,
  120.                      0,
  121.                      0
  122.                     );
  123.     if (!m_dcs_ctrl.DCS_Init(m_pDcs))
  124.     {
  125.         CalErrorHandler(WM_MF_ADC_DCS_INIT_FAIL);
  126.         log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() + " FAIL: Power supply initialize ");
  127.         return false;
  128.     }
  129.     // set output voltage = V1
  130.     if (!m_dcs_ctrl.DCS_outputVoltCurr( m_pDcs, i_ADC_V1/1000.0, i_CURRENT_LIMIT/1000.0))
  131.     {
  132.         CalErrorHandler(WM_MF_ADC_DCS_SET_VOLTAGE_CURRENT_FAIL);
  133.         log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() + " FAIL: Agilent 661x set vlotage = " +
  134.                  Double_To_AnsiString(i_ADC_V1/1000.0)
  135.                  );
  136.         return false;
  137.     }
  138.     log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() + " Set power supply vlotage = " +
  139.              Double_To_AnsiString(1.0*i_ADC_V1/1000.0)
  140.              );
  141.     /* Measure the dc voltage level at the output terminals */
  142.     Sleep (50);
  143.     if (!m_dcs_ctrl.DCS_measureVolt(m_pDcs, measvoltage))
  144.     {
  145.         return false;
  146.     }
  147.     ADC_Measure_Voltage[0] = (float)measvoltage;
  148.     log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() + " Power supply measure vlotage = " +
  149.                     Double_To_AnsiString(measvoltage)
  150.                   );
  151.     //////////////// V1 : measure ADC value of Battery channel begin ///////////
  152.     MF_BB_ADC_Req->channel  = i_BATTERY_CHANNEL;
  153.     MF_BB_ADC_Req->Meacount = i_ADC_MEASUREMENT_COUNT;
  154.     MetaResult = META_BB_ADCGetMeaSumData_r(m_pCal->i_MainMETAHandle, MF_BB_ADC_Req, ::MF_MeasureADC_cnf_cb, &BBID_ADC, NULL);
  155.     if (MetaResult != META_SUCCESS)
  156.     {
  157.         CalErrorHandler(WM_MF_ADC_MEASURE_FAIL);
  158.         log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() + " ADC measure fail (V1) "
  159.                );
  160.         return false;
  161.     }
  162.     RestartTimerADCCal(WM_MF_ADC_MEASURE_FAIL);
  163.     is_suspend_cal = true;
  164.     this->Suspend();
  165.     is_suspend_cal = false;
  166.     if (BBCnf_ADC->status != BB_STATUS_SUCCESS)
  167.     {
  168.         CalErrorHandler(WM_MF_ADC_MEASURE_CNF_FAIL);
  169.         log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() + " ADC measure cnf fail (V1) ");
  170.         return false;
  171.     }
  172.     BATTERY_ADC_Output[0] = ((float)BBCnf_ADC->value*1.0) / ((float) (MF_BB_ADC_Req->Meacount*1.0));
  173.     log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() + " BATTERY_ADC_Output[0] = " +
  174.              Double_To_AnsiString(BATTERY_ADC_Output[0])
  175.              );
  176.     ///////////////////////////// V1 : measure ADC value of Charger channel begin ///////////////////////////////////////////
  177.     MF_BB_ADC_Req->channel  = i_CHARGER_CHANNEL;
  178.     MF_BB_ADC_Req->Meacount = i_ADC_MEASUREMENT_COUNT;
  179.     MetaResult = META_BB_ADCGetMeaSumData_r(m_pCal->i_MainMETAHandle, MF_BB_ADC_Req, MF_MeasureADC_cnf_cb, &BBID_ADC, NULL);
  180.     if (MetaResult != META_SUCCESS)
  181.     {
  182.         CalErrorHandler(WM_MF_ADC_MEASURE_FAIL);
  183.         log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() + " ADC measure fail (V1) ");
  184.         return false;
  185.     }
  186.     RestartTimerADCCal(WM_MF_ADC_MEASURE_FAIL);
  187.     is_suspend_cal = true;
  188.     this->Suspend();
  189.     is_suspend_cal = false;
  190.     if (BBCnf_ADC->status != BB_STATUS_SUCCESS)
  191.     {
  192.         CalErrorHandler(WM_MF_ADC_MEASURE_CNF_FAIL);
  193.         log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() + " ADC measure cnf fail (V1) "
  194.                );
  195.         return false;
  196.     }
  197.     CHARGER_ADC_Output[0] = ((float)BBCnf_ADC->value*1.0) / ((float) (MF_BB_ADC_Req->Meacount*1.0));
  198.     log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() + " CHARGER_ADC_Output[0] = " +
  199.              Double_To_AnsiString(CHARGER_ADC_Output[0])
  200.              );
  201.     ///////////////////////////// measure ADC value end ///////////////////////////////////////////
  202.     if (this->Terminated)
  203.     {
  204.         this->OnTerminate = neByUser;
  205.         return false;
  206.     }
  207.     // set output voltage = V2
  208.     if (!m_dcs_ctrl.DCS_outputVoltCurr(m_pDcs, i_ADC_V2/1000.0, i_CURRENT_LIMIT/1000.0))
  209.     {
  210.         return false;
  211.     }
  212.     log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() + " Set power supply vlotage = " +
  213.              Double_To_AnsiString(i_ADC_V2/1000.0)
  214.              );
  215.     /* Measure the dc voltage level at the output terminals */
  216.     Sleep (50);
  217.     if (!m_dcs_ctrl.DCS_measureVolt(m_pDcs, measvoltage))
  218.     {
  219.         return false;
  220.     }
  221.     log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() + " Power supply measure vlotage = " +
  222.                     Double_To_AnsiString(measvoltage)
  223.                   );
  224.     ADC_Measure_Voltage[1] = (float)measvoltage;
  225.     ///////////////////////////// V2 : measure ADC value of Battery channel begin ///////////////////////////////////////////
  226.     MF_BB_ADC_Req->channel  = i_BATTERY_CHANNEL;
  227.     MF_BB_ADC_Req->Meacount = i_ADC_MEASUREMENT_COUNT;
  228.     MetaResult = META_BB_ADCGetMeaSumData_r( m_pCal->i_MainMETAHandle, MF_BB_ADC_Req, MF_MeasureADC_cnf_cb, &BBID_ADC, NULL );
  229.     if (MetaResult != META_SUCCESS)
  230.     {
  231.         CalErrorHandler(WM_MF_ADC_MEASURE_FAIL);
  232.         log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() + " ADC measure fail (V2) ");
  233.         return false;
  234.     }
  235.     RestartTimerADCCal(WM_MF_ADC_MEASURE_FAIL);
  236.     is_suspend_cal = true;
  237.     this->Suspend();
  238.     is_suspend_cal = false;
  239.     if (BBCnf_ADC->status != BB_STATUS_SUCCESS)
  240.     {
  241.         CalErrorHandler(WM_MF_ADC_MEASURE_CNF_FAIL);
  242.         log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() + " ADC measure cnf fail (V2) ");
  243.         return false;
  244.     }
  245.     BATTERY_ADC_Output[1] = BBCnf_ADC->value / ((float) (MF_BB_ADC_Req->Meacount*1.0));
  246.     log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() + " BATTERY_ADC_Output[1] = " +
  247.              Double_To_AnsiString(BATTERY_ADC_Output[1])
  248.              );
  249.     if (this->Terminated)
  250.     {
  251.         this->OnTerminate = neByUser;
  252.         return false;
  253.     }
  254.     ///////////////////////////// V2 : measure ADC value of CHARGER channel begin ///////////////////////////////////////////
  255.     MF_BB_ADC_Req->channel  = i_CHARGER_CHANNEL;
  256.     MF_BB_ADC_Req->Meacount = i_ADC_MEASUREMENT_COUNT;
  257.     MetaResult = META_BB_ADCGetMeaSumData_r(m_pCal->i_MainMETAHandle, MF_BB_ADC_Req, MF_MeasureADC_cnf_cb, &BBID_ADC, NULL);
  258.     if( MetaResult != META_SUCCESS )
  259.     {
  260.         CalErrorHandler(WM_MF_ADC_MEASURE_FAIL);
  261.         log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() + " ADC measure fail (V2) ");
  262.         return false;
  263.     }
  264.     RestartTimerADCCal(WM_MF_ADC_MEASURE_FAIL);
  265.     is_suspend_cal = true;
  266.     this->Suspend();
  267.     is_suspend_cal = false;
  268.     if (BBCnf_ADC->status != BB_STATUS_SUCCESS)
  269.     {
  270.         CalErrorHandler(WM_MF_ADC_MEASURE_CNF_FAIL);
  271.         log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() + " ADC measure cnf fail (V2) ");
  272.         return false;
  273.     }
  274.     CHARGER_ADC_Output[1] = BBCnf_ADC->value / ((float) (MF_BB_ADC_Req->Meacount*1.0));
  275.     log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() + " CHARGER_ADC_Output[1] = " +
  276.              Double_To_AnsiString(CHARGER_ADC_Output[1])
  277.              );
  278.     if (this->Terminated)
  279.     {
  280.         this->OnTerminate = neByUser;
  281.         return false;
  282.     }
  283.     ////////////////////////////// Calculate BATTERY ADC slope and offset /////////////////////////
  284.     bmt_adcdata  adc_data;
  285.     float  y0 = ADC_Measure_Voltage[0]*1000000.0;
  286.     float  y1 = ADC_Measure_Voltage[1]*1000000.0;
  287.     float  x0 = BATTERY_ADC_Output[0];
  288.     float  x1 = BATTERY_ADC_Output[1];
  289.     float fdata = 0.0;
  290.     if( (x1-x0) != 0)
  291.     {
  292.         fdata = 1.0*(y1-y0)/(x1-x0);
  293.         fdata += (fdata>=0) ? 0.5 : -0.5 ;
  294.         adc_data.i_ADCSlope[i_BATTERY_CHANNEL] = (int)fdata;
  295.         fdata = y0 - 1.0*(y1-y0)/(x1-x0)*x0;
  296.         fdata += (fdata>=0) ? 0.5 : -0.5 ;
  297.         adc_data.i_ADCOffset[i_BATTERY_CHANNEL] = (int)fdata;
  298.         MF_BB_ADC_ptr->Set_AdcData( adc_data );
  299.         sprintf( tempbuf, "%d", adc_data.i_ADCSlope[i_BATTERY_CHANNEL] );
  300.         m_pCal->as_ResultBuf = m_pCal->as_ResultBuf + tempbuf + ", ";
  301.         sprintf( tempbuf, "%d", adc_data.i_ADCOffset[i_BATTERY_CHANNEL] );
  302.         m_pCal->as_ResultBuf = m_pCal->as_ResultBuf + tempbuf + ", ";
  303.     }
  304.     else
  305.     {
  306.         CalErrorHandler(WM_MF_ADC_EVALUATE_SLOPE_OFFSET_FAIL);
  307.         log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() + " FAIL: ADC calibration evaluate battery slope and offset fail = ");
  308.         return false;
  309.     }
  310.     log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() + " BATTERY_ADC_Slope = " +
  311.              IntToStr(adc_data.i_ADCSlope[i_BATTERY_CHANNEL])
  312.              );
  313.     log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() + " BATTERY_ADC_Offset = " +
  314.              IntToStr(adc_data.i_ADCOffset[i_BATTERY_CHANNEL])
  315.              );
  316.     //////////////////// set slope and offset of other channel to same as battery channel ////////
  317.     int i;
  318.     int total_adc_num;
  319.     //BBCHIP_TYPE bb_chip = frmMainSel->Get_FinalBBChip();
  320.     if ((MT6205 == m_pCal->e_bb_chip) || (MT6205B == m_pCal->e_bb_chip))
  321.     {
  322.          total_adc_num = TOTAL_6205B_ADC_NUM;
  323.     }
  324.     else
  325.     {
  326.          total_adc_num = TOTAL_6218_ADC_NUM;
  327.     }
  328.     for (i=0; i<total_adc_num; i++)
  329.     {
  330.         if ((i != i_BATTERY_CHANNEL) && (i!= i_CHARGER_CHANNEL))
  331.         {
  332.             adc_data.i_ADCSlope[i] = adc_data.i_ADCSlope[i_BATTERY_CHANNEL];
  333.             adc_data.i_ADCOffset[i] = adc_data.i_ADCOffset[i_BATTERY_CHANNEL];
  334.         }
  335.     }
  336.     ////////////////////////////// Calculate CHARGER ADC slope and offset /////////////////////////
  337.     y0 = ADC_Measure_Voltage[0]*1000000.0;
  338.     y1 = ADC_Measure_Voltage[1]*1000000.0;
  339.     x0 = CHARGER_ADC_Output[0];
  340.     x1 = CHARGER_ADC_Output[1];
  341.     fdata = 0.0;
  342.     if( (x1-x0) != 0)
  343.     {
  344.         fdata = 1.0*(y1-y0)/(x1-x0);
  345.         fdata += (fdata>=0) ? 0.5 : -0.5 ;
  346.         adc_data.i_ADCSlope[i_CHARGER_CHANNEL] = (int)fdata;
  347.         fdata = y0 - 1.0*(y1-y0)/(x1-x0)*x0;
  348.         fdata += (fdata>=0) ? 0.5 : -0.5 ;
  349.         adc_data.i_ADCOffset[i_CHARGER_CHANNEL] = (int)fdata;
  350.         sprintf(tempbuf, "%d", adc_data.i_ADCSlope[i_CHARGER_CHANNEL] );
  351.         m_pCal->as_ResultBuf = m_pCal->as_ResultBuf + tempbuf + ", ";
  352.         sprintf(tempbuf, "%d", adc_data.i_ADCOffset[i_CHARGER_CHANNEL] );
  353.         m_pCal->as_ResultBuf = m_pCal->as_ResultBuf + tempbuf + ", ";
  354.         MF_BB_ADC_ptr->Set_AdcData( adc_data );
  355.     }
  356.     else
  357.     {
  358.         CalErrorHandler( WM_MF_ADC_EVALUATE_SLOPE_OFFSET_FAIL );
  359.         log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() + " FAIL: ADC calibration evaluate charger slope and offset fail = "
  360.                 );
  361.         return false;
  362.     }
  363.     log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() + " CHARGER_ADC_Slope = " +
  364.                 IntToStr(adc_data.i_ADCSlope[i_CHARGER_CHANNEL])
  365.                );
  366.     log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() + " CHARGER_ADC_Offset = " +
  367.                 IntToStr(adc_data.i_ADCOffset[i_CHARGER_CHANNEL])
  368.                );
  369.     //////////////////// save ADC slope and offset to flash //////////////////////////////////////
  370.     log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() + " Start writting ADC slope and offset to flash"
  371.                );
  372.     MF_BB_ADC_ptr->ConfirmCallback = ::ccb_write_ADC_to_nvram;
  373.     MF_BB_ADC_ptr->REQ_Write_To_NVRAM_Start();
  374.     if ( this->Terminated )
  375.     {
  376.         this->OnTerminate = neByUser;
  377.         return false;
  378.     }
  379.     RestartTimerADCCal(WM_MF_NVRAM_ADC_WRITE_FAIL);
  380.     is_suspend_cal = true;
  381.     this->Suspend();
  382.     is_suspend_cal = false;
  383.     E_METAAPP_RESULT_T state = MF_BB_ADC_ptr->Get_ConfirmState();
  384.     if (state != METAAPP_SUCCESS)
  385.     {
  386.         if (METAAPP_NVRAM_LID_VER_NOT_SUPPORT == state)
  387.         {
  388.             CalErrorHandler(WM_MF_NVRAM_EF_ADC_LID_VERNO_FAIL);
  389.             log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  390.                                " FAIL : NVRAM_EF_ADC_LID version is not support, please update META to latest version. "
  391.                                );
  392.         }
  393.         else
  394.         {
  395.            CalErrorHandler(WM_MF_NVRAM_ADC_WRITE_FAIL);
  396.            log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  397.                                  " FAIL:  Target< Write ADC slope and offset to flash "
  398.                                 );
  399.         }
  400.         return false;
  401.     }
  402.     log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  403.                   " Target< Write ADC slope and offset to flash "
  404.                 );
  405.     if ( this->Terminated )
  406.     {
  407.         this->OnTerminate = neByUser;
  408.         return false;
  409.     }
  410.     log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  411.               " ======================= ADC calibration end ====================== "
  412.             );
  413.     WriteADCCalResultToFile(as_ID+".cal",Application->ExeName, m_pCal->b_CalResultPath);
  414.     ///////////////////////// ADC current limit check /////////////////////////////////////////////
  415.     log->Add( "n" + DateToStr(Date()) +  " " + CurrentTimeStr() +
  416.              " ================== ADC current limit check begin ================= "
  417.            );
  418.     //******************************** evaluate BATTERY channel input voltage ***************************************
  419.     ADC_Measure_Voltage[2] = (float)measvoltage;
  420.     MF_BB_ADC_Req->channel  = i_BATTERY_CHANNEL;
  421.     MF_BB_ADC_Req->Meacount = i_ADC_MEASUREMENT_COUNT;
  422.     MetaResult = META_BB_ADCGetMeaSumData_r(m_pCal->i_MainMETAHandle, MF_BB_ADC_Req, MF_MeasureADC_cnf_cb, &BBID_ADC, NULL);
  423.     if (MetaResult != META_SUCCESS)
  424.     {
  425.        CalErrorHandler(WM_MF_ADC_MEASURE_FAIL);
  426.        log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() + " ADC measure fail (evaluate battery channel input voltage) ");
  427.        return false;
  428.     }
  429.     RestartTimerADCCal(WM_MF_ADC_MEASURE_FAIL);
  430.     is_suspend_cal = true;
  431.     this->Suspend();
  432.     is_suspend_cal = false;
  433.     if (BBCnf_ADC->status != BB_STATUS_SUCCESS)
  434.     {
  435.         CalErrorHandler(WM_MF_ADC_MEASURE_CNF_FAIL);
  436.         log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() + " ADC measure cnf fail (evaluate battery channel input voltage) ");
  437.         return false;
  438.     }
  439.     BATTERY_ADC_Output[2] = BBCnf_ADC->value / ((float) (MF_BB_ADC_Req->Meacount*1.0));
  440.     log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() + " BATTERY_ADC_Output[2] = " +
  441.              Double_To_AnsiString(BATTERY_ADC_Output[2])
  442.              );
  443.     BATTERY_ADC_Predict_Voltage = (adc_data.i_ADCOffset[i_BATTERY_CHANNEL] + adc_data.i_ADCSlope[i_BATTERY_CHANNEL]*BATTERY_ADC_Output[2])/1000000.0 ;
  444.     log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() + " BATTERY_ADC_Predict_Voltage = " +
  445.              Double_To_AnsiString(BATTERY_ADC_Predict_Voltage)
  446.              );
  447.     //******************************** evaluate CHARGER channel input voltage ***************************************
  448.     MF_BB_ADC_Req->channel  = i_CHARGER_CHANNEL;
  449.     MF_BB_ADC_Req->Meacount = i_ADC_MEASUREMENT_COUNT;
  450.     MetaResult = META_BB_ADCGetMeaSumData_r(m_pCal->i_MainMETAHandle, MF_BB_ADC_Req, MF_MeasureADC_cnf_cb, &BBID_ADC, NULL);
  451.     if (MetaResult != META_SUCCESS)
  452.     {
  453.         CalErrorHandler(WM_MF_ADC_MEASURE_FAIL);
  454.         log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() + " ADC measure fail (evaluate charger channel input voltage) ");
  455.         return false;
  456.     }
  457.     RestartTimerADCCal(WM_MF_ADC_MEASURE_FAIL);
  458.     is_suspend_cal = true;
  459.     this->Suspend();
  460.     is_suspend_cal = false;
  461.     if (BBCnf_ADC->status != BB_STATUS_SUCCESS)
  462.     {
  463.         CalErrorHandler(WM_MF_ADC_MEASURE_CNF_FAIL);
  464.         log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() + " ADC measure cnf fail (evaluate charger channel input voltage) ");
  465.         return false;
  466.     }
  467.     CHARGER_ADC_Output[2] = BBCnf_ADC->value / ((float) (MF_BB_ADC_Req->Meacount*1.0));
  468.     log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() + " CHARGER_ADC_Output[2] = " +
  469.              Double_To_AnsiString(CHARGER_ADC_Output[2])
  470.              );
  471.     CHARGER_ADC_Predict_Voltage = (adc_data.i_ADCOffset[i_CHARGER_CHANNEL] + adc_data.i_ADCSlope[i_CHARGER_CHANNEL]*CHARGER_ADC_Output[2])/1000000.0 ;
  472.     log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() + " CHARGER_ADC_Predict_Voltage = " +
  473.              Double_To_AnsiString(CHARGER_ADC_Predict_Voltage)
  474.              );
  475.     //********************************** check BATTERY and CHARGER ADC current difference *******
  476.     double current_difference;
  477.     if (CHARGER_ADC_Predict_Voltage > BATTERY_ADC_Predict_Voltage)
  478.     {
  479.         current_difference  = (double) ((CHARGER_ADC_Predict_Voltage - BATTERY_ADC_Predict_Voltage)/d_ADC_RESISTANCE);
  480.     }
  481.     else
  482.     {   current_difference  = (double)  ((BATTERY_ADC_Predict_Voltage - CHARGER_ADC_Predict_Voltage)/d_ADC_RESISTANCE);
  483.     }
  484.     if (current_difference >= d_MAX_CURRENT_DIFFERENCE)
  485.     {
  486.         CalErrorHandler(WM_MF_ADC_CHECK_CURRENT_DIFFERENCE_FAIL);
  487.         log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() + " FAIL : ADC calibration check current difference, difference = " +
  488.                   Double_To_AnsiString(current_difference)
  489.                 );
  490.         return false;
  491.     }
  492.     else
  493.     {
  494.         log->Add( DateToStr(Date()) + " " + CurrentTimeStr() + " PASS : ADC calibration check current difference, difference = " +
  495.                   Double_To_AnsiString(current_difference)
  496.                 );
  497.     }
  498.     log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  499.              " =================== ADC current limit check end =================== "
  500.            );
  501.     ///////////////////////// ADC voltage limit check /////////////////////////////////////////////
  502.     /* Set output voltage and current levels, turn output on*/
  503.     log->Add( "n" + DateToStr(Date()) +  " " + CurrentTimeStr() +
  504.              " =================== ADC voltage limit check begin ================= "
  505.            );
  506.     // set output voltage = check voltage
  507.     if (!m_dcs_ctrl.DCS_outputVoltCurr(m_pDcs, i_ADC_CHECK_VOLTAGE/1000.0, i_CURRENT_LIMIT/1000.0))
  508.     {
  509.         return false;
  510.     }
  511.     log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() + " Set power supply vlotage = " +
  512.              Double_To_AnsiString(i_ADC_CHECK_VOLTAGE /1000.0)
  513.              );
  514.     /* Measure the dc voltage level at the output terminals */
  515.     Sleep (50);
  516.     if (!m_dcs_ctrl.DCS_measureVolt(m_pDcs, measvoltage))
  517.     {
  518.         return false;
  519.     }
  520.     log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() + " Power supply measure vlotage = " +
  521.              Double_To_AnsiString(measvoltage)
  522.              );
  523.     //**************** evaluate BATTERY channel input voltage *****************
  524.     ADC_Measure_Voltage[2] = (float)measvoltage;
  525.     MF_BB_ADC_Req->channel  = i_BATTERY_CHANNEL;
  526.     MF_BB_ADC_Req->Meacount = i_ADC_MEASUREMENT_COUNT;
  527.     MetaResult = META_BB_ADCGetMeaSumData_r(m_pCal->i_MainMETAHandle, MF_BB_ADC_Req, MF_MeasureADC_cnf_cb, &BBID_ADC, NULL );
  528.     if (MetaResult != META_SUCCESS)
  529.     {
  530.         CalErrorHandler(WM_MF_ADC_MEASURE_FAIL);
  531.         log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() + " ADC measure fail (evaluate battery channel voltage) "
  532.                );
  533.         return false;
  534.     }
  535.     RestartTimerADCCal(WM_MF_ADC_MEASURE_FAIL);
  536.     is_suspend_cal = true;
  537.     this->Suspend();
  538.     is_suspend_cal = false;
  539.     if (BBCnf_ADC->status != BB_STATUS_SUCCESS)
  540.     {
  541.         CalErrorHandler(WM_MF_ADC_MEASURE_CNF_FAIL);
  542.         log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() + " ADC measure cnf fail (evaluate battery channel input voltage) ");
  543.         return false;
  544.     }
  545.     BATTERY_ADC_Output[2] = BBCnf_ADC->value / ((float) (MF_BB_ADC_Req->Meacount*1.0));
  546.     log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() + " BATTERY_ADC_Output[2] = " +
  547.                 Double_To_AnsiString(BATTERY_ADC_Output[2])
  548.                );
  549.     BATTERY_ADC_Predict_Voltage = (adc_data.i_ADCOffset[i_BATTERY_CHANNEL] + adc_data.i_ADCSlope[i_BATTERY_CHANNEL]*BATTERY_ADC_Output[2])/1000000.0 ;
  550.     log->Add( DateToStr(Date()) + " " + CurrentTimeStr() + " BATTERY_ADC_Predict_Voltage = " +
  551.                 Double_To_AnsiString(BATTERY_ADC_Predict_Voltage)
  552.                );
  553.     //******************************** evaluate CHARGER channel input voltage ***************************************
  554.     MF_BB_ADC_Req->channel  = i_CHARGER_CHANNEL;
  555.     MF_BB_ADC_Req->Meacount = i_ADC_MEASUREMENT_COUNT;
  556.     MetaResult = META_BB_ADCGetMeaSumData_r(m_pCal->i_MainMETAHandle, MF_BB_ADC_Req, MF_MeasureADC_cnf_cb, &BBID_ADC, NULL);
  557.     if (MetaResult != META_SUCCESS)
  558.     {
  559.         CalErrorHandler(WM_MF_ADC_MEASURE_FAIL);
  560.         log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() + " ADC measure fail (evaluate charger voltage) "
  561.                 );
  562.         return false;
  563.     }
  564.     RestartTimerADCCal(WM_MF_ADC_MEASURE_FAIL);
  565.     is_suspend_cal = true;
  566.     this->Suspend();
  567.     is_suspend_cal = false;
  568.     if (BBCnf_ADC->status != BB_STATUS_SUCCESS)
  569.     {
  570.         CalErrorHandler(WM_MF_ADC_MEASURE_CNF_FAIL);
  571.         log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() + " ADC measure cnf fail (evaluate charger channel input voltage) ");
  572.         return false;
  573.     }
  574.     CHARGER_ADC_Output[2] = BBCnf_ADC->value / ((float) (MF_BB_ADC_Req->Meacount*1.0));
  575.     log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() + " CHARGER_ADC_Output[2] = " +
  576.              Double_To_AnsiString(CHARGER_ADC_Output[2])
  577.              );
  578.     CHARGER_ADC_Predict_Voltage = (adc_data.i_ADCOffset[i_CHARGER_CHANNEL] + adc_data.i_ADCSlope[i_CHARGER_CHANNEL]*CHARGER_ADC_Output[2])/1000000.0 ;
  579.     log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() + " CHARGER_ADC_Predict_Voltage = " +
  580.              Double_To_AnsiString(CHARGER_ADC_Predict_Voltage)
  581.              );
  582.     //********************* check BATTERY input voltage ************************
  583.     float difference;
  584.     if (BATTERY_ADC_Predict_Voltage > ADC_Measure_Voltage[2])
  585.     {
  586.         difference = BATTERY_ADC_Predict_Voltage - ADC_Measure_Voltage[2];
  587.     }
  588.     else
  589.     {
  590.         difference =  ADC_Measure_Voltage[2] - BATTERY_ADC_Predict_Voltage;
  591.     }
  592.     if (difference > (float)d_MAX_VOLTAGE_DIFFERENCE)
  593.     {
  594.         CalErrorHandler(WM_MF_ADC_CHECK_CURRENT_DIFFERENCE_FAIL);
  595.         log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() + " FAIL : ADC calibration check battery channel vlotage difference, difference = " +
  596.                  Double_To_AnsiString(ADC_Measure_Voltage[2] - BATTERY_ADC_Predict_Voltage)
  597.                 );
  598.         return false;
  599.     }
  600.     log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() + " Pass : ADC calibration check battery channel vlotage difference = " +
  601.              Double_To_AnsiString(ADC_Measure_Voltage[2] - BATTERY_ADC_Predict_Voltage)
  602.              );
  603.     cfg->get_MAX_BATTERY_ADC_SLOPE(i_MAX_BATTERY_ADC_SLOPE);
  604.     cfg->get_MIN_BATTERY_ADC_SLOPE(i_MIN_BATTERY_ADC_SLOPE);
  605.     cfg->get_MAX_BATTERY_ADC_OFFSET(i_MAX_BATTERY_ADC_OFFSET);
  606.     cfg->get_MIN_BATTERY_ADC_OFFSET(i_MIN_BATTERY_ADC_OFFSET);
  607.   //******************** check BATTERY ADC slope and offset ********************
  608.     if ((adc_data.i_ADCSlope[i_BATTERY_CHANNEL] >= i_MIN_BATTERY_ADC_SLOPE) &&
  609.         (adc_data.i_ADCSlope[i_BATTERY_CHANNEL] <= i_MAX_BATTERY_ADC_SLOPE) &&
  610.         (adc_data.i_ADCOffset[i_BATTERY_CHANNEL] >= i_MIN_BATTERY_ADC_OFFSET) &&
  611.         (adc_data.i_ADCOffset[i_BATTERY_CHANNEL] <= i_MAX_BATTERY_ADC_OFFSET)
  612.       )
  613.     {
  614.         CalErrorHandler(WM_MF_ADC_CHECK_SLOPE_OFFSET_PASS);
  615.         log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  616.                  " Pass: ADC calibration check slope and offset ." +
  617.                  " BATTERY ADC slope = " + adc_data.i_ADCSlope[i_BATTERY_CHANNEL] +  "n" +
  618.                  "                         min battery ADC slope = " + IntToStr(i_MIN_BATTERY_ADC_SLOPE) + "n" +
  619.                  "                         max battery ADC slope = " +  IntToStr(i_MAX_BATTERY_ADC_SLOPE) + "n" +
  620.                  "                         BATTERY ADC offset = " + adc_data.i_ADCOffset[i_BATTERY_CHANNEL] +  "n" +
  621.                  "                         min BATTERY ADC offset = " +  IntToStr(i_MIN_BATTERY_ADC_OFFSET) + "n" +
  622.                  "                         max BATTERY ADC offset = " +  IntToStr(i_MAX_BATTERY_ADC_OFFSET)
  623.             );
  624.     }
  625.     else
  626.     {
  627.         CalErrorHandler(WM_MF_ADC_CHECK_SLOPE_OFFSET_FAIL);
  628.         log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  629.                  " Fail: ADC calibration check slope and offset ." +
  630.                  " BATTERY ADC slope = " + adc_data.i_ADCSlope[i_BATTERY_CHANNEL] +  "n" +
  631.                  "                         min BATTERY ADC slope = " +  IntToStr(i_MIN_BATTERY_ADC_SLOPE) + "n" +
  632.                  "                         max BATTERY ADC slope = " +  IntToStr(i_MAX_BATTERY_ADC_SLOPE) + "n" +
  633.                  "                         BATTERY ADC offset = " + adc_data.i_ADCOffset[i_BATTERY_CHANNEL] +  "n" +
  634.                  "                         min BATTERY ADC offset = " +  IntToStr(i_MIN_BATTERY_ADC_OFFSET) + "n" +
  635.                  "                         max BATTERY ADC offset = " +  IntToStr(i_MAX_BATTERY_ADC_OFFSET)
  636.                 );
  637.          return false;
  638.     }
  639.     PostMessage(ctrl.hPostMsgDestHandle,
  640.                 WM_MF_ADC_CALIBRATION_DONE,
  641.                 0,
  642.                 0
  643.                 );
  644.     log->Add(DateToStr(Date()) +  " " + CurrentTimeStr() +
  645.              " =================== ADC voltage limit check end ================= "
  646.             );
  647.     frmFatcory->DisableAllCalTimer();
  648.     return true;
  649. }