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

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.  *   NVRAMEditor.cpp
  40.  *
  41.  * Project:
  42.  * --------
  43.  *   Maui META APP
  44.  *
  45.  * Description:
  46.  * ------------
  47.  *   META NVRAM editor 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. //---------------------------------------------------------------------------
  66. #include <vcl.h>
  67. #pragma hdrstop
  68. #include "form_main.h"
  69. #include "NVRAMEditor.h"
  70. #include "man_fdm.h"
  71. //---------------------------------------------------------------------------
  72. #pragma package(smart_init)
  73. #pragma resource "*.dfm"
  74. //#define MAX_RID_NUM_IN_LID 3000
  75. TfrmNVRAMEditor *frmNVRAMEditor;
  76. // added by Andy Ueng
  77. int iNVRAM_TreeItemIndex=0;
  78. // new tree ds.
  79. int iTotalTreeItemCount=0;
  80. extern int Determine_LID_Category(char *LID_Name_para);
  81. //============================================================================
  82. static void __stdcall NVRAM_node_read_rec_cnf_cb( const FT_NVRAM_READ_CNF *cnf, const short token, void *usrData)
  83. {   frmNVRAMEditor->NVRAM_node_read_rec_cnf_cb(cnf, token, usrData );
  84. }
  85. //----------------------------------------------------------------------------
  86. static void __stdcall NVRAM_node_write_rec_cnf_cb(const FT_NVRAM_WRITE_CNF *cnf, const short token, void *usrData)
  87. {
  88.     frmNVRAMEditor->NVRAM_node_write_rec_cnf_cb(cnf, token, usrData );
  89. }
  90. //----------------------------------------------------------------------------
  91. static void CNF_NVRAMLock( void )
  92. {   frmNVRAMEditor->CNF_NVRAMLock();
  93. }
  94. //============================================================================
  95. //---------------------------------------------------------------------------
  96. __fastcall TfrmNVRAMEditor::TfrmNVRAMEditor(TComponent* Owner)
  97.         : TForm(Owner)
  98. {
  99.    // tbReadFromNVRAM->Enabled = true;
  100.    // tbSaveToNVRAM->Enabled = true;
  101.    // tbNVRAMClear->Enabled = true;
  102.    // tbLockNVRAM->Enabled = true;
  103.     m_NVRAM_ReadReq = NULL;
  104.     m_NVRAM_WriteReq = NULL;
  105.     m_NVRAM_node_read_rec.buf = NULL;
  106.     m_pc_all_LID_name_buf = NULL;
  107.     m_pNVRAM_TreeItem = NULL;
  108.     m_psl_NVRAM_list = NULL;
  109.     m_psl_LID_list = NULL;
  110.     m_ptn_LIDNode  = NULL;
  111.     m_ptn_RIDNode  = NULL;
  112. }
  113. //---------------------------------------------------------------------------
  114. __fastcall  TfrmNVRAMEditor::~TfrmNVRAMEditor(void)
  115. {
  116.     FreeDynMem();
  117. }
  118. //---------------------------------------------------------------------------
  119. void  TfrmNVRAMEditor::FreeDynMem(void)
  120. {
  121.     if( m_NVRAM_ReadReq != NULL )
  122.     {
  123.         delete m_NVRAM_ReadReq;
  124.         m_NVRAM_ReadReq = NULL;
  125.     }
  126.     if( m_NVRAM_WriteReq != NULL)
  127.     {
  128.         delete m_NVRAM_WriteReq;
  129.         m_NVRAM_WriteReq = NULL;
  130.     }
  131.     if( m_NVRAM_node_read_rec.buf != NULL )
  132.     {
  133.         delete m_NVRAM_node_read_rec.buf;
  134.         m_NVRAM_node_read_rec.buf = NULL;
  135.     }
  136.     if( m_pc_all_LID_name_buf != NULL )
  137.     {
  138.         delete [] m_pc_all_LID_name_buf;
  139.         m_pc_all_LID_name_buf = NULL;
  140.     }
  141.     if( m_pNVRAM_TreeItem != NULL )
  142.     {
  143.         delete m_pNVRAM_TreeItem;
  144.         m_pNVRAM_TreeItem = NULL;
  145.     }
  146.     if( m_psl_NVRAM_list != NULL )
  147.     {
  148.         delete m_psl_NVRAM_list;
  149.         m_psl_NVRAM_list = NULL;
  150.     }
  151.     if( m_psl_LID_list != NULL )
  152.     {
  153.         delete [] m_psl_LID_list;
  154.         m_psl_LID_list = NULL;
  155.     }
  156.     if( m_ptn_LIDNode != NULL )
  157.     {
  158.         delete [] m_ptn_LIDNode;
  159.         m_ptn_LIDNode = NULL;
  160.     }
  161.     if( m_ptn_RIDNode != NULL )
  162.     {
  163.         delete [] m_ptn_RIDNode;
  164.         m_ptn_RIDNode = NULL;
  165.     }
  166. }
  167. //===========================================================================
  168. void  TfrmNVRAMEditor::CurrentPageReset( void )
  169. {
  170.     tbReadFromNVRAM->Enabled = true;
  171.     tbSaveToNVRAM->Enabled = true;
  172.     tbNVRAMTreeProperty->Enabled = true;
  173.     tbNVRAMClear->Enabled = true;
  174.     tbLockNVRAM->Enabled = true;
  175. }
  176. //---------------------------------------------------------------------------
  177. void  TfrmNVRAMEditor::CurrentPageLock( void )
  178. {
  179.     tbReadFromNVRAM->Enabled = false;
  180.     tbSaveToNVRAM->Enabled = false;
  181.     tbNVRAMTreeProperty->Enabled = false;
  182.     tbNVRAMClear->Enabled = false;
  183.     tbLockNVRAM->Enabled = false;
  184. }
  185. //===========================================================================
  186. //---------------------------------------------------------------------------
  187. bool get_StringList_from_buf( TStringList *psl, char *pc_buf,
  188.                                  int buf_len, char c_sep )
  189. {
  190.        int iStart=0;
  191.        AnsiString as_sub;
  192.        char *pc_sub = (char *) malloc( buf_len );
  193.        if ( pc_sub == NULL )
  194.        {
  195.           ShowMessage(" memory alloc error ");
  196.           return false;
  197.        }
  198.        FillMemory( pc_sub, buf_len, '' );
  199.        for ( int i=0; i< buf_len; i++)
  200.        {
  201.           if ( *(pc_buf+i) == c_sep)
  202.           {
  203.              FillMemory( pc_sub, buf_len, '' );
  204.              memcpy( pc_sub, pc_buf+iStart, i-iStart);
  205.              psl->Add( AnsiString( pc_sub ));
  206.              iStart = i+1;
  207.           }
  208.        } // for
  209.        if ( pc_sub != NULL )
  210.        {
  211.           free( pc_sub );
  212.        }
  213.        return true;
  214. } // get_StringList_from_buf
  215. //---------------------------------------------------------------------------
  216. bool TfrmNVRAMEditor::find_node_index( TreeStructType *tst, void *pNode, int &index)
  217. {
  218.      //for ( int i=0; i< MAX_ELEMENT_IN_NVRAM; i++)
  219.    // for ( int i=0; i< TOTAL_RID_COUNT ; i++)
  220.     for ( int i=0; i<m_iTotalRecNum; i++)
  221.     {
  222.         if ( tst[ i ].pNode == pNode )
  223.         {
  224.             index = i;
  225.             return true;
  226.         }
  227.     }
  228.     return false;
  229. }
  230. //---------------------------------------------------------------------------
  231. void  TfrmNVRAMEditor::fill_StringGrid( TStringGrid *sg,
  232.                                              int iStartCol, int iStartRow,
  233.                                              int iDisplayColCount, int iDataLen,
  234.                                              AnsiString as )
  235. {
  236.     int iTotalRow = iDataLen/iDisplayColCount;
  237.     int I, J;
  238.     for (I=iStartCol; I<=(iDisplayColCount+iStartCol-1); I++)
  239.     {
  240.        for (J=iStartRow; J<=(iTotalRow+iStartRow-1); J++)
  241.        {
  242.           sg->Cells[I][J] = as;
  243.        }
  244.     }
  245.     if ( iDataLen % iDisplayColCount > 0)
  246.     {
  247.        for (I=iStartCol; I<=( (iDataLen%iDisplayColCount)+iStartCol-1); I++)
  248.        {
  249.           J = iTotalRow+iStartRow;
  250.           sg->Cells[I][J] = as;
  251.        }
  252.     }
  253. }
  254. //------------------------------------------------------------------------------
  255. void TfrmNVRAMEditor::show_Raw_Data_on_StringGrid( TStringGrid *sg,
  256.                                                       char *buf,
  257.                                                       int buf_len)
  258. {
  259.     AnsiString as;
  260.     int I,J;
  261.     for (I = 0; I < sg->ColCount; I++)
  262.     {
  263.        for (J = 0; J < sg->RowCount; J++)
  264.        {
  265.           sg->Cells[I][J] = "";
  266.        }
  267.     }
  268.     for ( int index=0; index < buf_len; index++ )
  269.     {
  270.         I = (index % ( RAW_DATA_COL_COUNTS )) + sg->FixedCols;
  271.         J = (index / ( RAW_DATA_COL_COUNTS )) + sg->FixedRows;
  272.         sg->Cells[I][J] = IntToHex( (unsigned char)(*(buf+index)), 2 ); // to Hex String
  273.     }
  274. }
  275. //---------------------------------------------------------------------------
  276. void  TfrmNVRAMEditor::InitializeNVRAMEditor( void )
  277. {
  278.     iNVRAM_TreeItemIndex=0;
  279.     iTotalTreeItemCount=0;
  280.     FreeDynMem();
  281.     tb_Init_NVRAMClick(NULL);
  282.     NVRAM_RawDataTree->InitDataBase( NVRAMMan->Get_NvramDbVariant() );
  283. }
  284. //---------------------------------------------------------------------------
  285. void __fastcall TfrmNVRAMEditor::tb_Init_NVRAMClick(TObject *Sender)
  286. {
  287.     META_RESULT MetaResult;
  288.     tv_NVRAM->Items->Clear();
  289.    // TTreeNode *ptn_Node;
  290.     int i_LID_name_buf_len=0;
  291.     if( NULL == m_psl_NVRAM_list )
  292.     {
  293.         m_psl_NVRAM_list = new TStringList();
  294.     }
  295.    // int i_n_of_LID=0;
  296.    // {
  297.     MetaResult = META_NVRAM_GetAllLIDNameLength( &i_LID_name_buf_len );
  298.     if ( MetaResult != META_SUCCESS )
  299.     {
  300.         META_result_handler( MetaResult );
  301.     }
  302.     if ( i_LID_name_buf_len <= 0 )
  303.     {
  304.         Application->MessageBox( "Execution Failure : LID name length error", "FAILURE", MB_OK );
  305.         return;
  306.     }
  307.     if(  m_pc_all_LID_name_buf == NULL)
  308.     {
  309.         m_pc_all_LID_name_buf = new char[i_LID_name_buf_len];
  310.     }
  311.     MetaResult = META_NVRAM_GetAllLIDName(
  312.                                          m_pc_all_LID_name_buf,
  313.                                          i_LID_name_buf_len,
  314.                                          &m_iTotalLidNum );
  315.     if ( MetaResult != META_SUCCESS )
  316.     {
  317.         META_result_handler( MetaResult );
  318.     }
  319.     if( NULL == m_psl_LID_list )
  320.     {   m_psl_LID_list = new TStringList*[m_iTotalLidNum];
  321.     }
  322.     if( NULL == m_ptn_LIDNode )
  323.     {   m_ptn_LIDNode = new TTreeNode*[m_iTotalLidNum];
  324.     }
  325.     
  326.    //  TStringList* psl_NVRAM_list;
  327.     
  328.     if (! get_StringList_from_buf( m_psl_NVRAM_list, m_pc_all_LID_name_buf,
  329.                             i_LID_name_buf_len, ''))
  330.     {
  331.         Application->MessageBox( "Execution Failure : parse NVRAM LID name error", "FAILURE", MB_OK );
  332.         return;
  333.     }
  334.     TTreeNode *ptn_SysNode, *ptn_L1CalNode, *ptn_OtherNode;
  335.     int rec_num=0, rec_index;
  336.     
  337.     char rec_buf[20];
  338.     if(! Get_Max_RecNum( m_psl_NVRAM_list, m_iTotalLidNum, m_iMaxRecNum ) )
  339.     {
  340.          Application->MessageBox( "Execution Failure : Get maximum record number fail", "FAILURE", MB_OK );
  341.          return;
  342.     }
  343.     if(! Get_Total_RecNum( m_psl_NVRAM_list, m_iTotalLidNum, m_iTotalRecNum ) )
  344.     {
  345.          Application->MessageBox( "Execution Failure : Get total record number fail", "FAILURE", MB_OK );
  346.          return;
  347.     }
  348.     if( NULL == m_ptn_RIDNode )
  349.     {
  350.         m_ptn_RIDNode = new TTreeNode**[m_iTotalLidNum];
  351.         for( int j = 0; j <m_iTotalLidNum; j++ )
  352.         {
  353.             m_ptn_RIDNode[j] = new TTreeNode*[m_iMaxRecNum];
  354.         }
  355.     }
  356.     if( NULL == m_pNVRAM_TreeItem )
  357.     {   m_pNVRAM_TreeItem = new TreeStructType[m_iTotalRecNum];
  358.     }
  359.     // add LID to tree list
  360.     ptn_SysNode = tv_NVRAM->Items->Add( NULL , "System related LID" );
  361.     ptn_L1CalNode = tv_NVRAM->Items->Add( NULL , "L1 LID" );
  362.     ptn_OtherNode = tv_NVRAM->Items->Add( NULL , "Other LID" );
  363.     for ( int j=0; j<m_iTotalLidNum; j++)
  364.     {
  365.         int LID_category;
  366.         LID_category = Determine_LID_Category(m_psl_NVRAM_list->Strings[j].c_str());
  367.         switch(LID_category)
  368.         {
  369.             case SYSTEM_RELATED_LID_CATEGORY:
  370.             {
  371.                 m_ptn_LIDNode[j] = tv_NVRAM->Items->AddChild( ptn_SysNode , m_psl_NVRAM_list->Strings[j] );
  372.                 MetaResult = META_NVRAM_GetRecNum(m_psl_NVRAM_list->Strings[j].c_str(), &rec_num);
  373.                 if( MetaResult != META_SUCCESS )
  374.                 {
  375.                     META_result_handler(MetaResult);
  376.                 }
  377.                 for(rec_index = 0; rec_index < rec_num; rec_index++)
  378.                 {
  379.                     sprintf(rec_buf, "%d", rec_index+1);
  380.                     m_ptn_RIDNode[j][rec_index] = tv_NVRAM->Items->AddChild( m_ptn_LIDNode[j] , rec_buf );
  381.                 }
  382.             }
  383.             break;
  384.             case L1_CALIBRATION_LID_CATEGORY:
  385.             {
  386.                 m_ptn_LIDNode[j] = tv_NVRAM->Items->AddChild( ptn_L1CalNode , m_psl_NVRAM_list->Strings[j] );
  387.                 MetaResult = META_NVRAM_GetRecNum(m_psl_NVRAM_list->Strings[j].c_str(), &rec_num);
  388.                 if( MetaResult != META_SUCCESS )
  389.                 {
  390.                     META_result_handler(MetaResult);
  391.                 }
  392.                 for(rec_index = 0; rec_index < rec_num; rec_index++)
  393.                 {
  394.                     sprintf(rec_buf, "%d", rec_index+1);
  395.                     m_ptn_RIDNode[j][rec_index] = tv_NVRAM->Items->AddChild( m_ptn_LIDNode[j] , rec_buf );
  396.                 }
  397.             }
  398.             break;
  399.             case OTHER_LID_CATEGORY:
  400.             {
  401.                 m_ptn_LIDNode[j] = tv_NVRAM->Items->AddChild( ptn_OtherNode , m_psl_NVRAM_list->Strings[j] );
  402.                 MetaResult = META_NVRAM_GetRecNum(m_psl_NVRAM_list->Strings[j].c_str(), &rec_num);
  403.                 if( MetaResult != META_SUCCESS )
  404.                 {
  405.                     META_result_handler(MetaResult);
  406.                 }
  407.                 for(rec_index = 0; rec_index < rec_num; rec_index++)
  408.                 {
  409.                     sprintf(rec_buf, "%d", rec_index+1);
  410.                     m_ptn_RIDNode[j][rec_index] = tv_NVRAM->Items->AddChild( m_ptn_LIDNode[j] , rec_buf );
  411.                 }
  412.             }
  413.             break;
  414.         }
  415.         for(rec_index = 0; rec_index < rec_num; rec_index++)
  416.         {
  417.             m_pNVRAM_TreeItem[ iNVRAM_TreeItemIndex ].pNode = m_ptn_RIDNode[j][rec_index];
  418.             strcpy( m_pNVRAM_TreeItem[ iNVRAM_TreeItemIndex ].LIDNAME, m_psl_NVRAM_list->Strings[j].c_str());
  419.             iNVRAM_TreeItemIndex++;
  420.             iTotalTreeItemCount++;
  421.         }
  422.     } // for  j
  423.  //  } // for  i
  424. }
  425. //---------------------------------------------------------------------------
  426. void TfrmNVRAMEditor::read_Raw_Data_from_StringGrid( TStringGrid *sg,
  427.                                             int iStartCol, int iStartRow,
  428.                                             int iDisplayColCount, int iDataLen,
  429.                                             char *buf )
  430. {
  431.      int I,J;
  432.      for ( int index=0; index < iDataLen; index++ )
  433.      {
  434.           I = (index % ( RAW_DATA_COL_COUNTS )) + sg->FixedCols;
  435.           J = (index / ( RAW_DATA_COL_COUNTS )) + sg->FixedRows;
  436.           (*(buf+index)) = StrToInt ( AnsiString("0x")+ sg->Cells[I][J] );
  437.      }
  438. }
  439. //-----------------------------------------------------------------------------
  440.  // modified by Andy Ueng
  441. //  bool TfrmNVRAMEditor::get_index_from_group_element_name( char * group_name,
  442. //                                                              char * element_name,
  443. //                                                              int &index )
  444. // modified by Andy Ueng
  445. //  bool TfrmNVRAMEditor::get_index_from_LID( char *LID_para, int &index )
  446. bool TfrmNVRAMEditor::get_index_from_LID( char *LID_para, int *index )
  447. // end of modified
  448. {
  449.     for ( int I=0; I < iTotalTreeItemCount; I++)
  450.     {
  451.         // modified by Andy Ueng
  452.         // if ( ( strcmp( FDM_TreeItem[I].GroupName, group_name ) == 0 ) &&
  453.         //      ( strcmp( FDM_TreeItem[I].ElementName, element_name ) == 0 ) )
  454.         if ( ( strcmp( m_pNVRAM_TreeItem[I].LIDNAME, LID_para ) == 0 ) )
  455.         // end of modified
  456.         {
  457.             *index = I;
  458.             return true;
  459.         }
  460.     }
  461.     return false;
  462. }
  463. //---------------------------------------------------------------------------
  464. // end of added
  465. //---------------------------------------------------------------------------
  466. void __fastcall TfrmNVRAMEditor::tbReadFromNVRAMClick(TObject *Sender)
  467. {
  468.     META_RESULT MetaResult;
  469.     if( ! NVRAMMan->Get_IsInit() )
  470.     {
  471.         frmMainSel->mnuFDMDatabaseClick(Sender);
  472.     }
  473.     if( ! NVRAMMan->Get_IsInit() )
  474.     {
  475.         Application->MessageBox( "Execution Failure : NVRAM database file initialize fail", "FAILURE", MB_OK );
  476.         return;
  477.     }
  478.     sb_NVRAM_editor->Panels->Items[0]->Text = (AnsiString) "";
  479.     sb_NVRAM_editor->Panels->Items[1]->Text = (AnsiString) "";
  480.     sb_NVRAM_editor->Panels->Items[2]->Text = (AnsiString) "";
  481.     if ( NULL == tv_NVRAM->Selected )
  482.     {
  483.         Application->MessageBox( " You need to select a record from left tree view window ", "Notice", MB_OK );
  484.         return;
  485.     }
  486.     m_ptn_selected = tv_NVRAM->Selected ;
  487.     if ( NULL == m_ptn_selected  )
  488.         return;
  489.     if (! find_node_index( m_pNVRAM_TreeItem, tv_NVRAM->Selected, iNVRAM_TreeItemIndex ))
  490.     {
  491.         Application->MessageBox( "Execution Failure : NVRAM editor can't find this node", "FAILURE", MB_OK );
  492.         return;
  493.     }
  494.     if ( Sender != NULL )
  495.     {
  496.         dynamic_cast <TControl *>(Sender)->Enabled = false;
  497.     }
  498.     if ( m_pNVRAM_TreeItem[iNVRAM_TreeItemIndex].vTreeItemHandle.intVal == 0 )
  499.     {
  500.          // do nothing
  501.     }
  502.     else
  503.     {
  504.         long lModified;
  505.         NVRAM_RawDataTree->TreeGetModify( m_pNVRAM_TreeItem[iNVRAM_TreeItemIndex].vTreeItemHandle, &lModified );
  506.         if ( lModified )
  507.         {
  508.             NVRAM_RawDataTree->TreeSetSel( m_pNVRAM_TreeItem[iNVRAM_TreeItemIndex].vTreeItemHandle );
  509.             int msg_result = Application->MessageBox( " Do you want to save this struct ? ",
  510.                                       " NVRAM editor ",
  511.                                       MB_YESNOCANCEL) ;
  512.             switch ( msg_result )
  513.             {
  514.                 case IDYES :
  515.                 {
  516.                     tbSaveToNVRAMClick( NULL );
  517.                     NVRAM_RawDataTree->TreeDeleteItem( m_pNVRAM_TreeItem[iNVRAM_TreeItemIndex].vTreeItemHandle ); // added by Andy Ueng
  518.                     m_pNVRAM_TreeItem[iNVRAM_TreeItemIndex].vTreeItemHandle.intVal = 0;
  519.                      // IDyes-> download & read back from fdm
  520.                      //return;
  521.                 }
  522.                 break;
  523.                 case IDNO :
  524.                 {
  525.                      NVRAM_RawDataTree->TreeDeleteItem( m_pNVRAM_TreeItem[iNVRAM_TreeItemIndex].vTreeItemHandle );
  526.                      m_pNVRAM_TreeItem[iNVRAM_TreeItemIndex].vTreeItemHandle.intVal = 0;
  527.                 }
  528.                 break;
  529.                 case IDCANCEL :
  530.                 {
  531.                      tbReadFromNVRAM->Enabled = true;
  532.                      return;
  533.                 }
  534.             } // switch
  535.         }  // if
  536.         else
  537.         {
  538.             NVRAM_RawDataTree->TreeDeleteItem( m_pNVRAM_TreeItem[iNVRAM_TreeItemIndex].vTreeItemHandle );
  539.             m_pNVRAM_TreeItem[iNVRAM_TreeItemIndex].vTreeItemHandle.intVal = 0;
  540.         }
  541.     }
  542.     int i_struct_name_buf_len=0;
  543.     MetaResult = META_NVRAM_GetRecStructNameLength(m_ptn_selected->Parent->Text.c_str(),
  544.                                                      &i_struct_name_buf_len );
  545.     if ( MetaResult != META_SUCCESS )
  546.     {
  547.         META_result_handler( MetaResult );
  548.         if ( Sender != NULL )
  549.         {
  550.             dynamic_cast <TControl *>(Sender)->Enabled = true;
  551.         }
  552.         return;
  553.     }
  554. //  char *pc_struct_buf;
  555. //  pc_struct_buf = ( char *) malloc( i_struct_name_buf_len );
  556.     if ( i_struct_name_buf_len > 0 )  // ==0 RawData
  557.     {
  558.         MetaResult = META_NVRAM_GetRecStructName(m_ptn_selected->Parent->Text.c_str(),
  559.                                    m_pNVRAM_TreeItem[ iNVRAM_TreeItemIndex ].StructName,
  560.                                    i_struct_name_buf_len );
  561.         if ( MetaResult != META_SUCCESS )
  562.         {
  563.             META_result_handler( MetaResult );
  564.             if ( Sender != NULL )
  565.             {
  566.                 dynamic_cast <TControl *>(Sender)->Enabled = true;
  567.             }
  568.             return;
  569.         }
  570.          MetaResult =  META_NVRAM_GetRecLen( m_ptn_selected->Parent->Text.c_str(),
  571.                                          &(m_pNVRAM_TreeItem[ iNVRAM_TreeItemIndex ].iDataLen) );
  572.         if ( MetaResult != META_SUCCESS )
  573.         {
  574.             META_result_handler( MetaResult );
  575.             if ( Sender != NULL )
  576.             {
  577.                 dynamic_cast <TControl *>(Sender)->Enabled = true;
  578.             }
  579.             return;
  580.         }
  581.         if( NULL == m_NVRAM_node_read_rec.buf )
  582.         {   m_NVRAM_node_read_rec.buf = new char[m_pNVRAM_TreeItem[ iNVRAM_TreeItemIndex ].iDataLen];
  583.         }
  584.         m_NVRAM_node_read_rec.len = m_pNVRAM_TreeItem[ iNVRAM_TreeItemIndex ].iDataLen;
  585.     }
  586.     else
  587.     {
  588.         m_pNVRAM_TreeItem[ iNVRAM_TreeItemIndex ].iDataLen = 0;
  589.         strcpy ( m_pNVRAM_TreeItem[ iNVRAM_TreeItemIndex ].StructName,
  590.                m_ptn_selected->Text.c_str()
  591.               );
  592.         if( NULL == m_NVRAM_node_read_rec.buf )
  593.         {   m_NVRAM_node_read_rec.buf = new char[ RAW_DATA_BUF_LEN ];
  594.         }
  595.         m_NVRAM_node_read_rec.len = RAW_DATA_BUF_LEN ;
  596.     }
  597.     if( NULL == m_NVRAM_ReadReq )
  598.     {   m_NVRAM_ReadReq = new FT_NVRAM_READ_REQ;
  599.     }
  600.     m_NVRAM_ReadReq->LID = m_ptn_selected->Parent->Text.c_str();
  601.     m_NVRAM_ReadReq->RID = m_ptn_selected->Text.ToInt();
  602.     MetaResult = META_NVRAM_Read_r(  m_META_HANDLE_Obj.Get_MainHandle(),
  603.                                      m_NVRAM_ReadReq,
  604.                                      &m_NVRAM_node_read_rec,
  605.                                      ::NVRAM_node_read_rec_cnf_cb,
  606.                                      &m_sNVRAM_node_read_rec_token,
  607.                                      NULL );
  608.     if ( MetaResult != META_SUCCESS )
  609.     {
  610.         META_result_handler(MetaResult);
  611.         if ( Sender != NULL )
  612.         {   dynamic_cast <TControl *>(Sender)->Enabled = true;
  613.         }
  614.         return;
  615.     }
  616.     else
  617.     {
  618.         m_ptn_rec = m_ptn_selected;
  619.     }
  620. }
  621. //---------------------------------------------------------------------------
  622. void __fastcall TfrmNVRAMEditor::tbSaveToNVRAMClick(TObject *Sender)
  623. {
  624.     if( ! NVRAMMan->Get_IsInit() )
  625.     {
  626.         frmMainSel->mnuFDMDatabaseClick(Sender);
  627.     }
  628.     if( ! NVRAMMan->Get_IsInit() )
  629.     {
  630.         Application->MessageBox( "Execution Failure : NVRAM database file initialize fail", "FAILURE", MB_OK );
  631.         return;
  632.     }
  633.     sb_NVRAM_editor->Panels->Items[0]->Text = (AnsiString) "";
  634.     sb_NVRAM_editor->Panels->Items[1]->Text = (AnsiString) "";
  635.     sb_NVRAM_editor->Panels->Items[2]->Text = (AnsiString) "";
  636.     if ( NVRAM_RawDataTree->Visible )
  637.     {  // Active X tree
  638.         if (  tv_NVRAM->Selected == NULL )
  639.         {
  640.             Application->MessageBox( " You must select a element to download to NVRAM ", "Notice", MB_OK );
  641.             return;
  642.         }
  643.         m_ptn_selected = tv_NVRAM->Selected;
  644.        if ( m_ptn_selected->Parent == NULL )
  645.        {
  646.             Application->MessageBox( " You need to select a element to download to NVRAM ", "Notice", MB_OK );
  647.             return;
  648.        }
  649.        if (! get_index_from_LID( m_ptn_selected->Parent->Text.c_str(),
  650.                                               &iNVRAM_TreeItemIndex
  651.                                              ))
  652.        {
  653.             Application->MessageBox( " NVRAM editor error: can't find index", "FAILURE", MB_OK );
  654.             return;
  655.        }
  656.        iNVRAM_TreeItemIndex = iNVRAM_TreeItemIndex +  m_ptn_selected->Text.ToInt()-1;
  657.      //  if( m_pNVRAM_TreeItem[iNVRAM_TreeItemIndex].vTreeItemHandle.intVal ==0)
  658.      //  {
  659.      //       Application->MessageBox( " Please read this struct from NVRAM before downloading", "Notice", MB_OK );
  660.      //       return;
  661.      //  }
  662.        if ( Sender != NULL )
  663.        {
  664.             dynamic_cast <TControl *>(Sender)->Enabled = false;
  665.        }
  666.        if( NULL == m_NVRAM_WriteReq )
  667.        {
  668.             m_NVRAM_WriteReq = new FT_NVRAM_WRITE_REQ;
  669.        }
  670.        m_NVRAM_WriteReq->LID = m_ptn_selected->Parent->Text.c_str();
  671.        m_NVRAM_WriteReq->RID = m_ptn_selected->Text.ToInt(); // temp set to 1
  672.        m_NVRAM_WriteReq->buf = m_pNVRAM_TreeItem[iNVRAM_TreeItemIndex].Buf;
  673.        m_NVRAM_WriteReq->len = m_pNVRAM_TreeItem[iNVRAM_TreeItemIndex].iDataLen;
  674.        META_RESULT MetaResult = META_NVRAM_Write_r( m_META_HANDLE_Obj.Get_MainHandle(),
  675.                                                     m_NVRAM_WriteReq,
  676.                                                     ::NVRAM_node_write_rec_cnf_cb,
  677.                                                     &m_sNVRAM_node_write_rec_token,
  678.                                                     NULL );
  679.    
  680.      if ( MetaResult != META_SUCCESS )
  681.      {
  682.         META_result_handler(MetaResult);
  683.         if ( Sender != NULL )
  684.         {
  685.             dynamic_cast <TControl *>(Sender)->Enabled = true;
  686.         }
  687.         return;
  688.      }
  689.   }
  690.   else
  691.   {
  692.      read_Raw_Data_from_StringGrid( sg_NVRAM_editor,
  693.                                    RAW_DATA_START_COL,
  694.                                    RAW_DATA_START_ROW,
  695.                                    RAW_DATA_COL_COUNTS,
  696.                                    m_pNVRAM_TreeItem[ iNVRAM_TreeItemIndex ].iDataLen,
  697.                                    m_pNVRAM_TreeItem[ iNVRAM_TreeItemIndex ].Buf );
  698.      META_RESULT mr1 = META_NVRAM_Write_r( m_META_HANDLE_Obj.Get_MainHandle(),
  699.                                            m_NVRAM_WriteReq,
  700.                                           ::NVRAM_node_write_rec_cnf_cb,
  701.                                           &m_sNVRAM_node_write_rec_token,
  702.                                           NULL );
  703.      if ( mr1 != META_SUCCESS )
  704.      {
  705.         META_result_handler( mr1);
  706.         if ( Sender != NULL )
  707.         {
  708.             dynamic_cast <TControl *>(Sender)->Enabled = true;
  709.         }
  710.         return;
  711.      }
  712.   }
  713. }
  714. //-----------------------------------------------------------------------------
  715. void __stdcall TfrmNVRAMEditor::NVRAM_node_read_rec_cnf_cb( const FT_NVRAM_READ_CNF *cnf, const short token, void *usrData)
  716. {
  717.    tbReadFromNVRAM->Enabled = true;
  718.    if ( cnf->status != FDM_READ_SUCCESS )
  719.    {
  720.        sb_NVRAM_editor->Panels->Items[0]->Text = (AnsiString) "  NVRAM read record fail ";
  721.        sb_NVRAM_editor->Panels->Items[1]->Text = (AnsiString) "";
  722.        sb_NVRAM_editor->Panels->Items[2]->Text = (AnsiString) "";
  723.        Application->MessageBox( "NVRAM read record fail", "FAILURE", MB_OK );
  724.    }
  725.    else
  726.    {
  727.        sb_NVRAM_editor->Panels->Items[0]->Text = (AnsiString) "  NVRAM read record successfully ";
  728.        sb_NVRAM_editor->Panels->Items[1]->Text = (AnsiString) "";
  729.        sb_NVRAM_editor->Panels->Items[2]->Text = (AnsiString) "";
  730.        if (m_NVRAM_node_read_rec.len ==0)
  731.        {
  732.             sb_NVRAM_editor->Panels->Items[1]->Text = " buf length: 0 ";
  733.             return;
  734.        }
  735.        else
  736.        {
  737.             sb_NVRAM_editor->Panels->Items[1]->Text = " buf length: " +
  738.             IntToStr( m_pNVRAM_TreeItem[ iNVRAM_TreeItemIndex ].iDataLen);
  739.        }
  740.        if (m_NVRAM_node_read_rec.status == FDM_DATA_VALID)
  741.        {
  742.             sb_NVRAM_editor->Panels->Items[2]->Text = " data valid ";
  743.        }
  744.        else
  745.        {
  746.             sb_NVRAM_editor->Panels->Items[2]->Text = " data invalid ";
  747.             return;
  748.        }
  749.        if ( m_pNVRAM_TreeItem[ iNVRAM_TreeItemIndex ].iDataLen  > 0)
  750.        {
  751.             NVRAM_RawDataTree->Visible = true;
  752.             tbNVRAMTreeProperty->Enabled = true;
  753.             sg_NVRAM_editor->Visible = false;
  754.             memcpy( m_pNVRAM_TreeItem[ iNVRAM_TreeItemIndex ].Buf,
  755.                     m_NVRAM_node_read_rec.buf,
  756.                     m_pNVRAM_TreeItem[ iNVRAM_TreeItemIndex ].iDataLen
  757.                   );
  758.             if( NULL != m_NVRAM_node_read_rec.buf )
  759.             {
  760.                  delete [] m_NVRAM_node_read_rec.buf;
  761.                  m_NVRAM_node_read_rec.buf = NULL;
  762.             }
  763.             //long bStruct = true;
  764.             NVRAM_RawDataTree->EncodeNvramData( m_pNVRAM_TreeItem[ iNVRAM_TreeItemIndex ].iDataLen,
  765.                                                    TVariant((long)m_pNVRAM_TreeItem[ iNVRAM_TreeItemIndex ].Buf),
  766.                                                    TVariant((char *)m_pNVRAM_TreeItem[ iNVRAM_TreeItemIndex ].LIDNAME) ,
  767.                                                    &m_pNVRAM_TreeItem[ iNVRAM_TreeItemIndex ].vTreeItemHandle
  768.                                                   );
  769.             }
  770.             else
  771.             {
  772.                 memcpy( m_pNVRAM_TreeItem[ iNVRAM_TreeItemIndex ].Buf,
  773.                         m_NVRAM_node_read_rec.buf,
  774.                         m_NVRAM_node_read_rec.len
  775.                       );
  776.                 if( NULL != m_NVRAM_node_read_rec.buf)
  777.                 {
  778.                     delete [] m_NVRAM_node_read_rec.buf;
  779.                     m_NVRAM_node_read_rec.buf = NULL;
  780.                 }
  781.                 m_pNVRAM_TreeItem[ iNVRAM_TreeItemIndex ].iDataLen = m_NVRAM_node_read_rec.len;
  782.                 NVRAM_RawDataTree->Visible = false;
  783.                 tbNVRAMTreeProperty->Enabled = false;
  784.                 sg_NVRAM_editor->Visible = true;
  785.                 show_Raw_Data_on_StringGrid( sg_NVRAM_editor,
  786.                                              m_pNVRAM_TreeItem[ iNVRAM_TreeItemIndex ].Buf,
  787.                                              m_pNVRAM_TreeItem[ iNVRAM_TreeItemIndex ].iDataLen
  788.                                            );
  789.             }
  790.             m_pNVRAM_TreeItem[ iNVRAM_TreeItemIndex ].bRead = true;
  791.     }
  792. }
  793. //------------------------------------------------------------------------------
  794. void __stdcall TfrmNVRAMEditor::NVRAM_node_write_rec_cnf_cb( const FT_NVRAM_WRITE_CNF *cnf, const short token, void *usrData)
  795. {
  796.     tbSaveToNVRAM->Enabled = true;
  797.     if ( cnf->status == FDM_WRITE_SUCCESS )
  798.     {
  799.         sb_NVRAM_editor->Panels->Items[0]->Text = (AnsiString) "  NVRAM write record successfully ";
  800.         sb_NVRAM_editor->Panels->Items[1]->Text = (AnsiString) "";
  801.         sb_NVRAM_editor->Panels->Items[2]->Text = (AnsiString) "";
  802.         if ( NVRAM_RawDataTree->Visible )
  803.         {
  804.              NVRAM_RawDataTree->TreeSetModify( m_pNVRAM_TreeItem[iNVRAM_TreeItemIndex].vTreeItemHandle,
  805.                                                false);
  806.         }
  807.     }
  808.     else
  809.     {
  810.         sb_NVRAM_editor->Panels->Items[0]->Text = (AnsiString) "  NVRAM write record fail ";
  811.         sb_NVRAM_editor->Panels->Items[1]->Text = (AnsiString) "";
  812.         sb_NVRAM_editor->Panels->Items[2]->Text = (AnsiString) "";
  813.         Application->MessageBox( "NVRAM write record fail", "FAILURE", MB_OK );
  814.     }
  815. }
  816. //---------------------------------------------------------------------------
  817. void __fastcall TfrmNVRAMEditor::tbNVRAMTreePropertyClick(TObject *Sender)
  818. {
  819.    LPUNKNOWN pUnk = NULL;
  820.    pUnk = NVRAM_RawDataTree->ControlInterface;
  821.    IOleObject* pIOle = NULL;
  822.    if ( SUCCEEDED(  pUnk->QueryInterface( IID_IOleObject, (void**)&pIOle)))
  823.    {
  824.       IOleClientSite* pCS = NULL;
  825.       pIOle->GetClientSite(&pCS);
  826.       RECT rct;
  827.       pIOle->DoVerb(OLEIVERB_PROPERTIES,NULL,pCS,0, this->Handle ,&rct);
  828.       pIOle->Release();
  829.       pCS->Release();
  830.    }
  831. }
  832. //---------------------------------------------------------------------------
  833. bool TfrmNVRAMEditor::get_index_from_handle( TreeStructType *tst,
  834.                                                  int i,
  835.                                                  int &index )
  836. {
  837.     for( int I=0; I<iTotalTreeItemCount; I++)
  838.     {
  839.        if (tst[ I ].vTreeItemHandle.intVal == i )
  840.        {
  841.            index = I;
  842.            return true;
  843.        }
  844.     }
  845.     return false;
  846. }
  847. //---------------------------------------------------------------------------
  848. void __fastcall TfrmNVRAMEditor::tbNVRAMClearClick(TObject *Sender)
  849. {
  850.     if( ! NVRAMMan->Get_IsInit() )
  851.     {
  852.         frmMainSel->mnuFDMDatabaseClick(Sender);
  853.     }
  854.     if( ! NVRAMMan->Get_IsInit() )
  855.     {
  856.         sb_NVRAM_editor->Panels->Items[0]->Text = (AnsiString) "  NVRAM database file initialization fail";
  857.         sb_NVRAM_editor->Panels->Items[1]->Text = (AnsiString) "";
  858.         sb_NVRAM_editor->Panels->Items[2]->Text = (AnsiString) "";
  859.         Application->MessageBox( "Execution Failure : NVRAM database file initialization fail", "FAILURE", MB_OK );
  860.         return;
  861.     }
  862.     if (  NVRAM_RawDataTree->Visible )
  863.     {
  864.         if (iTotalTreeItemCount == 0)
  865.             return;
  866.         TVariant vTreeItemHandle;
  867.         NVRAM_RawDataTree->TreeGetSel( &vTreeItemHandle );
  868.         if ( vTreeItemHandle.intVal == 0 )
  869.         {
  870.             sb_NVRAM_editor->Panels->Items[0]->Text = (AnsiString) " Please select a tree item to clear ";
  871.             sb_NVRAM_editor->Panels->Items[1]->Text = (AnsiString) "";
  872.             sb_NVRAM_editor->Panels->Items[2]->Text = (AnsiString) "";
  873.             Application->MessageBox( "Please select a tree item to clear", "WARNING", MB_OK );
  874.             return;
  875.         }
  876.         int iItemIndex = -1;
  877.         if ( ! get_index_from_handle( m_pNVRAM_TreeItem,  vTreeItemHandle.intVal , iItemIndex ))
  878.         {
  879.             sb_NVRAM_editor->Panels->Items[0]->Text = (AnsiString) "  NVRAM editor error: can't get item index ";
  880.             sb_NVRAM_editor->Panels->Items[1]->Text = (AnsiString) "";
  881.             sb_NVRAM_editor->Panels->Items[2]->Text = (AnsiString) "";
  882.             Application->MessageBox( "Execution Failure : NVRAM editor error: can't get item index", "FAILURE", MB_OK );
  883.         }
  884.         else
  885.         {
  886.             long lModified;
  887.             NVRAM_RawDataTree->TreeGetModify( m_pNVRAM_TreeItem[ iItemIndex].vTreeItemHandle , &lModified );
  888.             if ( lModified )
  889.             {
  890.                 int msg_result = Application->MessageBox( " Do you want to save this struct ? ",
  891.                                                           " NVRAM editor ",
  892.                                                           MB_YESNOCANCEL) ;
  893.                 switch ( msg_result )
  894.                 {
  895.                     case IDYES :
  896.                         tbSaveToNVRAMClick( NULL );
  897.                         tbNVRAMClearClick(Sender);
  898.                         return;
  899.                     case IDNO :
  900.                         NVRAM_RawDataTree->TreeDeleteItem( m_pNVRAM_TreeItem[ iItemIndex ].vTreeItemHandle );
  901.                         m_pNVRAM_TreeItem[ iItemIndex ].vTreeItemHandle.intVal = 0 ;
  902.                         break;
  903.                     case IDCANCEL :
  904.                         return;
  905.                 } // switch
  906.             }
  907.             else
  908.             {
  909.                 NVRAM_RawDataTree->TreeDeleteItem( m_pNVRAM_TreeItem[ iItemIndex ].vTreeItemHandle );
  910.                 m_pNVRAM_TreeItem[ iItemIndex ].vTreeItemHandle.intVal = 0 ;
  911.                 sb_NVRAM_editor->Panels->Items[0]->Text = (AnsiString) "  Clear NVRAM record successfully";
  912.                 sb_NVRAM_editor->Panels->Items[1]->Text = (AnsiString) "";
  913.                 sb_NVRAM_editor->Panels->Items[2]->Text = (AnsiString) "";
  914.             }
  915.         }
  916.     }
  917.     else
  918.     {
  919.         fill_StringGrid( sg_NVRAM_editor,
  920.                          RAW_DATA_START_COL,
  921.                          RAW_DATA_START_ROW,
  922.                          RAW_DATA_COL_COUNTS,
  923.                          m_pNVRAM_TreeItem[ iNVRAM_TreeItemIndex ].iDataLen,
  924.                          AnsiString("00") );
  925.     }
  926. }
  927. //---------------------------------------------------------------------------
  928. void __fastcall TfrmNVRAMEditor::OnClick(TObject *Sender)
  929. {
  930.     if (find_node_index( m_pNVRAM_TreeItem, tv_NVRAM->Selected, iNVRAM_TreeItemIndex ))
  931.     {
  932.        if(m_pNVRAM_TreeItem[ iNVRAM_TreeItemIndex ].vTreeItemHandle.intVal != 0)
  933.        {
  934.             NVRAM_RawDataTree->TreeSetSel( m_pNVRAM_TreeItem[iNVRAM_TreeItemIndex].vTreeItemHandle );
  935.        }
  936.     }
  937. }
  938. //---------------------------------------------------------------------------
  939. bool TfrmNVRAMEditor::Get_Total_RecNum( TStringList* psl_list, int lid_num, int &total_rec_num )
  940. {
  941.     META_RESULT MetaResult;
  942.     int rec_num;
  943.     total_rec_num = 0;
  944.     for( int i=0; i<lid_num; i++ )
  945.     {
  946.         MetaResult = META_NVRAM_GetRecNum(psl_list->Strings[i].c_str(), &rec_num);
  947.         if( MetaResult != META_SUCCESS )
  948.         {
  949.             return false;
  950.         }
  951.         total_rec_num += rec_num;
  952.     }
  953.     return true;
  954. }
  955. //---------------------------------------------------------------------------
  956. bool TfrmNVRAMEditor::Get_Max_RecNum( TStringList* psl_list, int lid_num, int &max_rec_num )
  957. {
  958.     META_RESULT MetaResult;
  959.     int rec_num;
  960.     max_rec_num = 0;
  961.     for( int i=0; i<lid_num; i++ )
  962.     {
  963.         MetaResult = META_NVRAM_GetRecNum(psl_list->Strings[i].c_str(), &rec_num);
  964.         if( MetaResult != META_SUCCESS )
  965.         {
  966.             return false;
  967.         }
  968.         if( max_rec_num < rec_num )
  969.            max_rec_num = rec_num;
  970.     }
  971.     return true;
  972. }
  973. void __fastcall TfrmNVRAMEditor::tbLockNVRAMClick(TObject *Sender)
  974. {
  975.     m_NVRAM_LOCK_Obj.ConfirmCallback = ::CNF_NVRAMLock;
  976.     m_NVRAM_LOCK_Obj.REQ_Start();
  977.     CurrentPageLock();
  978.     sb_NVRAM_editor->Panels->Items[0]->Text = (AnsiString) "  Locks NVRAM progressing ";
  979.     sb_NVRAM_editor->Panels->Items[1]->Text = (AnsiString) "";
  980.     sb_NVRAM_editor->Panels->Items[2]->Text = (AnsiString) "";
  981. }
  982. //---------------------------------------------------------------------------
  983. void TfrmNVRAMEditor::CNF_NVRAMLock( void )
  984. {
  985.     int state = m_NVRAM_LOCK_Obj.Get_ConfirmState();
  986.     switch( state )
  987.     {
  988.         case STATE_NVRAM_LOCK_OK:
  989.         {
  990.             sb_NVRAM_editor->Panels->Items[0]->Text = (AnsiString) "  Locks NVRAM successfully ";
  991.         }
  992.         break;
  993.         case STATE_NVRAM_LOCK_FAIL:
  994.         {
  995.             sb_NVRAM_editor->Panels->Items[0]->Text = (AnsiString)"  Locks NVRAM  fail";
  996.             Application->MessageBox( "Execution Failure : Locks NVRAM ", "FAILURE", MB_OK );
  997.             //Force_WiFi_Stop();
  998.         }
  999.         break;
  1000.         case STATE_NVRAM_LOCK_TIMEOUT:
  1001.         {
  1002.              sb_NVRAM_editor->Panels->Items[0]->Text = (AnsiString)"  Locks NVRAM timeout";
  1003.              Application->MessageBox( "Execution Timeout : Locks NVRAM ", "TIMEOUT", MB_OK );
  1004.             // Force_WiFi_Stop();
  1005.         }
  1006.         break;
  1007.         case STATE_NVRAM_LOCK_STOP:
  1008.         {
  1009.              sb_NVRAM_editor->Panels->Items[0]->Text = (AnsiString)"  Locks NVRAM stop";
  1010.         }
  1011.         break;
  1012.     }
  1013.     CurrentPageReset();
  1014.     sb_NVRAM_editor->Panels->Items[1]->Text = (AnsiString) "";
  1015.     sb_NVRAM_editor->Panels->Items[2]->Text = (AnsiString) "";
  1016. }