bt_script.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) 2001
  8. *
  9. *****************************************************************************/
  10. /*****************************************************************************
  11.  *
  12.  * Filename:
  13.  * ---------
  14.  *   bt_script.cpp
  15.  *
  16.  * Project:
  17.  * --------
  18.  *   Maui META APP
  19.  *
  20.  * Description:
  21.  * ------------
  22.  *   BT HCI command script test source
  23.  *
  24.  * Author:
  25.  * -------
  26.  *  Andy Ueng (mtk00490)
  27.  *
  28.  *============================================================================
  29.  *             HISTORY
  30.  * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
  31.  *------------------------------------------------------------------------------
  32.  * $Revision$
  33.  * $Modtime$
  34.  * $Log$
  35.  *
  36.  *------------------------------------------------------------------------------
  37.  * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
  38.  *============================================================================
  39.  ****************************************************************************/
  40. //===========================================================================
  41. #pragma hdrstop
  42. #ifndef  _BT_COMMON_H_
  43. #include "bt_common.h"
  44. #endif
  45. #ifndef  _BT_SCRIPT_H_
  46. #include "bt_script.h"
  47. #endif
  48. #ifndef  _BT_HCI_COMMON_H_
  49. #include "bt_hci_common.h"
  50. #endif
  51. // man
  52. #ifndef  _MAN_ACTIVE_H_
  53. #include "man_active.h"
  54. #endif
  55. // misc
  56. #ifndef  _STR_UTILS_H_
  57. #include "str_utils.h"
  58. #endif
  59. #ifndef  _FILE_UTILS_H_
  60. #include "file_utils.h"
  61. #endif
  62. #ifndef  _FT_UTILS_H_
  63. #include "ft_utils.h"
  64. #endif
  65. #ifndef  _MISC_BT_H_
  66. #include "misc_bt.h"
  67. #endif
  68. // message
  69. #ifndef _META_LAB_MSG_H_
  70. #include "meta_lab_msg.h"
  71. #endif
  72. #define INVALID_TAG  -1
  73. const AnsiString HEADER_WORD[]=
  74. {
  75.     "B1:",
  76.     "B2:",
  77.     "B3:",
  78.     "B4:",
  79.     "B5:",
  80.     "B6:",
  81.     "B7:",
  82.     "B8:",
  83.     "B9:",
  84.     "B10",
  85.     "B11:",
  86.     "B12:",
  87.     "B13:",
  88.     "B14:",
  89.     "B15:",
  90.     "B16:",
  91.     "B17:",
  92.     "B18:",
  93.     "B19:",
  94.     "B20",
  95.     "B21:",
  96.     "B22:",
  97.     "B23:",
  98.     "B24:",
  99.     "B25:",
  100.     "B26:",
  101.     "B27:",
  102.     "B28:",
  103.     "B29:",
  104.     "B30",
  105.     "B31:",
  106.     "B32:",
  107.     "B33:",
  108.     "B34:",
  109.     "B35:",
  110.     "B36:",
  111.     "B37:",
  112.     "B38:",
  113.     "B39:",
  114.     "B40",
  115.     "B41:",
  116.     "B42:",
  117.     "B43:",
  118.     "B44:",
  119.     "B45:",
  120.     "B46:",
  121.     "B47:",
  122.     "B48:",
  123.     "B49:",
  124.     "BYTE",
  125.     "WORD",
  126.     "DWORD",
  127. };
  128. //----------------------------------------------------------------------------
  129. static CBTSCT*  gs_bt_sct_ptr;
  130. static bool g_bIsRunning = false;
  131. //==============================================================================
  132. static void  REQ_Read_From_File( void )
  133. {   gs_bt_sct_ptr->REQ_Read_From_File();
  134. }
  135. //----------------------------------------------------------------------------
  136. static void  REQ_Test_Script( void )
  137. {   gs_bt_sct_ptr->REQ_Test_Script();
  138. }
  139. //----------------------------------------------------------------------------
  140. //static void  REQ_Send_HCI_Command( void )
  141. //{   gs_bt_sct_ptr->REQ_Send_HCI_Command();
  142. //}
  143. //------------------------------------------------------------------------------
  144. static void __stdcall CNF_HCIEvent(const BT_HCI_EVENT *cnf, const short token, void *usrData)
  145. {   gs_bt_sct_ptr->CNF_HCIEvent( cnf, token, usrData );
  146. }
  147. //===========================================================================
  148. CBTSCT::CBTSCT(void)
  149. {
  150.     g_bIsRunning = false;
  151.     ConfirmCallback = 0;
  152.     AllocateVector();
  153. }
  154. //---------------------------------------------------------------------------
  155. CBTSCT::~CBTSCT(void)
  156. {
  157.     DeAllocateVector();
  158. }
  159. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  160. void CBTSCT::AllocateVector(void)
  161. {
  162.     if (NULL == m_pvScript)
  163.     {
  164.         m_pvScript = new vector<S_BT_SCT_SCRIPT>;
  165.     }
  166.     if (NULL == m_pvBVar)
  167.     {
  168.         m_pvBVar = new vector<S_BT_B_VAR>;
  169.     }
  170.     if (NULL == m_pvWVar)
  171.     {
  172.         m_pvWVar = new vector<S_BT_W_VAR>;
  173.     }
  174.     if (NULL == m_pvDVar)
  175.     {
  176.         m_pvDVar = new vector<S_BT_D_VAR>;
  177.     }
  178. }
  179. //---------------------------------------------------------------------------
  180. void CBTSCT::DeAllocateVector(void)
  181. {
  182.     if (NULL != m_pvScript)
  183.     {
  184.         if (!m_pvScript->empty())
  185.         {
  186.             m_pvScript->erase(m_pvScript->begin(), m_pvScript->end());
  187.         }
  188.         delete m_pvScript;
  189.         m_pvScript = NULL;
  190.     }
  191.     if (NULL != m_pvBVar)
  192.     {
  193.         if (!m_pvBVar->empty())
  194.         {
  195.             m_pvBVar->erase(m_pvBVar->begin(), m_pvBVar->end());
  196.         }
  197.         delete m_pvBVar;
  198.         m_pvBVar = NULL;
  199.     }
  200.     if (NULL != m_pvWVar)
  201.     {
  202.         if (!m_pvWVar->empty())
  203.         {
  204.             m_pvWVar->erase(m_pvWVar->begin(), m_pvWVar->end());
  205.         }
  206.         delete m_pvWVar;
  207.         m_pvWVar = NULL;
  208.     }
  209.     if (NULL != m_pvDVar)
  210.     {
  211.         if (!m_pvDVar->empty())
  212.         {
  213.             m_pvDVar->erase(m_pvDVar->begin(), m_pvDVar->end());
  214.         }
  215.         delete m_pvDVar;
  216.         m_pvDVar = NULL;
  217.     }
  218. }
  219. //---------------------------------------------------------------------------
  220. void  CBTSCT::EraseVector(void)
  221. {
  222.     if (!m_pvScript->empty())
  223.     {
  224.         m_pvScript->erase(m_pvScript->begin(), m_pvScript->end());
  225.     }
  226.     if (NULL != m_pvBVar)
  227.     {
  228.         if (!m_pvBVar->empty())
  229.         {
  230.             m_pvBVar->erase(m_pvBVar->begin(), m_pvBVar->end());
  231.         }
  232.     }
  233.     if (NULL != m_pvWVar)
  234.     {
  235.         if (!m_pvWVar->empty())
  236.         {
  237.             m_pvWVar->erase(m_pvWVar->begin(), m_pvWVar->end());
  238.         }
  239.     }
  240.     if (NULL != m_pvDVar)
  241.     {
  242.         if (!m_pvDVar->empty())
  243.         {
  244.             m_pvDVar->erase(m_pvDVar->begin(), m_pvDVar->end());
  245.         }
  246.     }
  247. }
  248. //---------------------------------------------------------------------------
  249. void CBTSCT::ResetBVarData(void)
  250. {
  251.     if (NULL != m_pvBVar)
  252.     {
  253.         if (!m_pvBVar->empty())
  254.         {
  255.             vector<S_BT_B_VAR>:: iterator iter_b_var;
  256.             for (iter_b_var = m_pvBVar->begin(); iter_b_var != m_pvBVar->end(); iter_b_var++)
  257.             {
  258.                 iter_b_var->b_valid = false;
  259.             }
  260.         }
  261.     }
  262. }
  263. //---------------------------------------------------------------------------
  264. void CBTSCT::REQ_Stop(void)
  265. {
  266.     if (!g_bIsRunning)
  267.     {
  268.         return;
  269.     }
  270.     Confirm(METAAPP_STOP);
  271. }
  272. //---------------------------------------------------------------------------
  273. void CBTSCT::Confirm(E_METAAPP_RESULT_T confirm_state )
  274. {
  275.     if (!g_bIsRunning)
  276.     {
  277.         return;
  278.     }
  279.     g_bIsRunning = false;
  280.     // CloseFile();
  281.     if (NULL == ConfirmCallback)
  282.     {
  283.         return;
  284.     }
  285.     m_eConfirmState = confirm_state;
  286.     ActiveMan->SetActiveFunction(ConfirmCallback);
  287. }
  288. //============================================================================
  289. void CBTSCT::REQ_Start(S_BT_SCT &bt_sct)
  290. {
  291.     gs_bt_sct_ptr  = this;
  292.     g_bIsRunning    = true;
  293.     m_sBTSCT = bt_sct;
  294.     ResetBVarData();
  295.     for (m_IterScript = m_pvScript->begin(); m_IterScript != m_pvScript->end(); m_IterScript++)
  296.     {
  297.         if (m_IterScript->as_script_name.AnsiCompareIC(m_sBTSCT.as_script_name) == 0)
  298.         {
  299.             break;
  300.         }
  301.     }
  302.     m_IterCmd = m_IterScript->v_cmd.begin();
  303.     ActiveMan->SetActiveFunction(::REQ_Test_Script);
  304. }
  305. //---------------------------------------------------------------------------
  306. void CBTSCT::REQ_Test_Script(void)
  307. {
  308.     if (!g_bIsRunning)
  309.     {
  310.         return;
  311.     }
  312.     if (m_IterCmd != m_IterScript->v_cmd.end())
  313.     {
  314.         m_IterEvent = m_IterCmd->v_hci_event.begin();
  315.         BT_HCI_COMMAND hci_cmd;
  316.         InterpretCommand(m_IterCmd->as_hci_cmd, hci_cmd);
  317.         REQ_Send_HCI_Command(hci_cmd, m_IterCmd->ui_ms_timeout, m_IterCmd->uc_last_event);
  318.         m_IterCmd++;
  319.     }
  320.     else
  321.     {
  322.         Confirm(METAAPP_SUCCESS);
  323.     }
  324. }
  325. //---------------------------------------------------------------------------
  326. void CBTSCT::REQ_Send_HCI_Command( BT_HCI_COMMAND hci_cmd, unsigned int  ms_timeout, unsigned last_event )
  327. {
  328.     if (!g_bIsRunning)
  329.     {
  330.         return;
  331.     }
  332.     AddTxLogToStringList(hci_cmd);
  333.     META_RESULT MetaResult = META_BT_SendHCICommand_r(m_META_HANDLE_Obj.Get_MainHandle(), ms_timeout, &hci_cmd, ::CNF_HCIEvent, NULL, last_event);
  334.     if (META_SUCCESS != MetaResult)
  335.     {
  336.         if (META_TIMEOUT == MetaResult)
  337.         {
  338.             Confirm(METAAPP_TIMEOUT);
  339.             return;
  340.         }
  341.         else if (META_CANCEL == MetaResult)
  342.         {
  343.             Confirm(METAAPP_CANCEL);
  344.             return;
  345.         }
  346.         else
  347.         {
  348.             Confirm(METAAPP_FAIL);
  349.             return;
  350.         }
  351.     }
  352. }
  353. //---------------------------------------------------------------------------
  354. void __stdcall CBTSCT::CNF_HCIEvent(const BT_HCI_EVENT *cnf, const short token, void *usrData)
  355. {
  356.    // if(!g_bIsRunning)  return;
  357.    // m_IterEvent
  358.     m_sHCIEvent = *cnf;
  359.     AddRxLogToStringList(*cnf);
  360.     if (!InterpretEvent(m_sHCIEvent, *m_IterEvent))
  361.     {
  362.         AddParseLogToStringList("Receive unexpected event");
  363.         Confirm(METAAPP_FAIL);
  364.         return;
  365.     }
  366.     if (m_IterEvent != m_IterCmd->v_hci_event.end())
  367.     {
  368.         m_IterEvent++;
  369.     }
  370.     ActiveMan->SetActiveFunction(::REQ_Test_Script);
  371. }
  372. //===========================================================================
  373. void CBTSCT::REQ_Read_From_File_Start(S_BT_SCT &bt_sct)
  374. {
  375.     gs_bt_sct_ptr  = this;
  376.     g_bIsRunning    = true;
  377.     m_sBTSCT = bt_sct;
  378.     EraseVector();
  379.     ActiveMan->SetActiveFunction(::REQ_Read_From_File);
  380. }
  381. //----------------------------------------------------------------------------
  382. bool CBTSCT::REQ_Read_Last_SCT_File_Start(S_BT_SCT &bt_sct)
  383. {
  384.      m_sBTSCT = bt_sct;
  385.      EraseVector();
  386.     if (!OpenFile())
  387.     {
  388.         CloseFile();
  389.         return false;
  390.     }
  391.     if (!ParseFile())
  392.     {
  393.         CloseFile();
  394.         return false;
  395.     }
  396.     CloseFile();
  397.     return true;
  398. }
  399. //----------------------------------------------------------------------------
  400. void CBTSCT::REQ_Read_From_File(void)
  401. {
  402.     if (!g_bIsRunning)
  403.     {
  404.         return;
  405.     }
  406.     if (!OpenFile())
  407.     {
  408.         CloseFile();
  409.         Confirm( METAAPP_FAIL );
  410.         return;
  411.     }
  412.     if (!ParseFile())
  413.     {
  414.         CloseFile();
  415.         Confirm(METAAPP_FAIL);
  416.         return;
  417.     }
  418.     CloseFile();
  419.     Confirm(METAAPP_SUCCESS);
  420. }
  421. //----------------------------------------------------------------------------
  422. bool  CBTSCT::OpenFile(void)
  423. {
  424.    // if( m_ifs.is_open() )
  425.    // {
  426.    //     CloseFile();
  427.    // }
  428.     if (!CheckFileExist(m_sBTSCT.filename))
  429.     {
  430.         return false;
  431.     }
  432.     m_pifs = new ifstream;
  433.     m_pifs->open(m_sBTSCT.filename.c_str());
  434.     //m_ifs.seekg( ios::beg );
  435.         //m_ifs.setmode( filebuf::text ); // set to text mode
  436.     //m_pFBuf = m_ifs.rdbuf();
  437.     return true;
  438. }
  439. //---------------------------------------------------------------------------
  440. void CBTSCT::CloseFile(void)
  441. {
  442.     if (m_pifs->is_open())
  443.     {
  444.         m_pifs->close();
  445.         delete m_pifs;
  446.     }
  447. }
  448. //---------------------------------------------------------------------------
  449. bool CBTSCT::ParseFile(void)
  450. {
  451.     const int str_size = 256;
  452.     char str[str_size];
  453.     m_eSCTSec = BT_SCT_UNKNOW;
  454.     while (!m_pifs->eof())
  455.     {
  456.         m_pifs->getline(str, str_size, 'n');
  457.         if (!ParseCommandLine(str))
  458.         {
  459.             AnsiString as_str = str;
  460.             AddParseLogToStringList(as_str + " error");
  461.             return false;
  462.         }
  463.        // streampos pos = m_ifs.tellg();
  464.        // m_ifs.tellg();
  465.     }
  466.     return true;
  467. }
  468. //---------------------------------------------------------------------------
  469. bool CBTSCT::ParseCommandLine(AnsiString as_cmd)
  470. {
  471.     bool ok;
  472.     as_cmd = as_cmd.UpperCase();
  473.     as_cmd = as_cmd.Trim();
  474.     if (as_cmd.AnsiCompareIC("") == 0)
  475.     {
  476.         return true;  // NULL
  477.     }
  478.     if (as_cmd.AnsiPos("//") != 0)
  479.     {
  480.         return true; // note
  481.     }
  482.     for (int i=0; i<sizeof(HEADER_WORD)/sizeof(HEADER_WORD[0]); i++)
  483.     {
  484.         if (as_cmd.AnsiPos(HEADER_WORD[i] ) != 0)
  485.         {
  486.             m_eSCTSec = (E_BT_SCT_TAG) i;
  487.             bool ok = ParseSCTHeader(as_cmd);
  488.             {
  489.                 return ok;
  490.             }
  491.         }
  492.     }
  493.     ok = ParseSCTBody(as_cmd);
  494.     return ok;
  495. }
  496. //---------------------------------------------------------------------------
  497. AnsiString CBTSCT::Get_ScriptTagString(E_BT_SCT_TAG eTag)
  498. {
  499.     AnsiString as_tag;
  500.     if ((eTag >= BT_SCT_B1_TAG) && (eTag <= BT_SCT_B49_TAG))
  501.     {
  502.         as_tag = "B" + IntToStr(eTag + 1);
  503.     }
  504.     return as_tag;
  505. }
  506. //---------------------------------------------------------------------------
  507. bool CBTSCT::ParseSCTHeader(AnsiString as_cmd)
  508. {
  509.     S_BT_SCT_SCRIPT script;
  510.     int iLD_l = as_cmd.AnsiPos(": ");
  511.     if (iLD_l != 0)
  512.     {
  513.         script.as_script_name = as_cmd.SubString(iLD_l+2, as_cmd.Length()-iLD_l-1);
  514.         RemoveLastSpaceFromStr(script.as_script_name);
  515.         if ((m_eSCTSec >= BT_SCT_B1_TAG) && (m_eSCTSec <= BT_SCT_B49_TAG))
  516.         {
  517.             script.as_script_tag = Get_ScriptTagString(m_eSCTSec);
  518.         }
  519.         m_pvScript->push_back(script);
  520.     }
  521.     else
  522.     {
  523.         S_BT_SCT_OP op;
  524.         AnsiString as_rem;
  525.         int iLD_space = as_cmd.LastDelimiter( " " );
  526.         int iLD_comma = as_cmd.AnsiPos( "," );
  527.         if( iLD_comma != 0 )
  528.         {
  529.             if( iLD_comma > iLD_space )
  530.             {
  531.                 op.as_op2 = as_cmd.SubString( iLD_comma+1, as_cmd.Length()-iLD_comma );
  532.             }
  533.             else
  534.             {
  535.                 op.as_op2 = as_cmd.SubString( iLD_space+1, as_cmd.Length()-iLD_space );
  536.             }
  537.             as_rem = as_cmd.SubString( 1, iLD_comma-1 );
  538.             iLD_space = as_rem.LastDelimiter( " " );
  539.             op.as_op1 = as_rem.SubString( iLD_space+1, as_cmd.Length()-iLD_space );
  540.         }
  541.         else // no op2
  542.         {
  543.             if( as_cmd.AnsiPos(""") == 0 ) // no " "
  544.             {
  545.                 op.as_op1 = as_cmd.SubString( iLD_space+1, as_cmd.Length() - iLD_comma );
  546.                 as_rem = as_cmd;
  547.             }
  548.             else
  549.             {
  550.                 int iLD_1stQuotes = as_cmd.AnsiPos(""");
  551.                 int iLD_2ndQuotes = as_cmd.LastDelimiter(""");
  552.                 op.as_op1 = as_cmd.SubString( iLD_1stQuotes+1, iLD_2ndQuotes - iLD_1stQuotes -1 );
  553.                 as_rem = as_cmd.SubString( 1, iLD_1stQuotes - 1 );
  554.             }
  555.             op.as_op2 = "";
  556.         }
  557.         switch( m_eSCTSec )
  558.         {
  559.             case BT_SCT_B_TAG:                    // "B",
  560.             {
  561.                 S_BT_B_VAR b_var;
  562.                 b_var.as_name = op.as_op1;
  563.                 if( op.as_op2.AnsiCompareIC("") == 0 )
  564.                 {
  565.                   //  b_var.uc_value = 0;
  566.                     b_var.b_valid  = false;
  567.                 }
  568.                 else
  569.                 {
  570.                     AnsiString_Hex_To_UnsignedChar( op.as_op2, b_var.uc_value );
  571.                     b_var.b_valid   = true;
  572.                 }
  573.                 m_pvBVar->push_back( b_var );
  574.             }
  575.             break;
  576.             case BT_SCT_W_TAG:                    // "W",
  577.             {
  578.                 S_BT_W_VAR w_var;
  579.                 w_var.as_name = op.as_op1;
  580.                 if( op.as_op2.AnsiCompareIC("") == 0 )
  581.                 {   w_var.us_value = 0;
  582.                 }
  583.                 else
  584.                 {
  585.                     AnsiString_Hex_To_UnsignedShort( op.as_op2, w_var.us_value );
  586.                 }
  587.                 m_pvWVar->push_back( w_var );
  588.             }
  589.             break;
  590.             case BT_SCT_D_TAG:                    // "D",
  591.             {
  592.                 S_BT_D_VAR d_var;
  593.                 d_var.as_name = op.as_op1;
  594.                 if( op.as_op2.AnsiCompareIC("") == 0 )
  595.                 {   d_var.ui_value = 0;
  596.                 }
  597.                 else
  598.                 {
  599.                     AnsiString_Hex_To_UnsignedInt( op.as_op2, d_var.ui_value );
  600.                 }
  601.                 m_pvDVar->push_back( d_var );
  602.             }
  603.             break;
  604.         } // switch()
  605.     } // else
  606.     return true;
  607. }
  608. //---------------------------------------------------------------------------
  609. bool CBTSCT::ParseSCTBody( AnsiString as_cmd )
  610. {
  611.     vector<S_BT_SCT_SCRIPT>:: iterator iter_script = m_pvScript->end()-1;
  612.     vector<S_BT_SCT_CMD>:: iterator iter_cmd = iter_script->v_cmd.end()-1;
  613.     S_BT_SCT_CMD cmd;
  614.     int i;
  615.     unsigned char array[HCI_CMD_MAX_LEN];
  616.    // for( i=0; i<HCI_CMD_MAX_LEN; i++ )
  617.    //     cmd.s_hci_cmd.m_cmd[i] = 0;
  618.     if( as_cmd.AnsiPos("TX:") != 0 )
  619.     {
  620.         int iLD_l = as_cmd.AnsiPos("TX:");
  621.         AnsiString as_TX_cmd = as_cmd.SubString( iLD_l+4, as_cmd.Length() );
  622.        // if( ! InterpretCommand( as_TX_cmd ) )
  623.        //     return false;
  624.        // int count = String_Hex_To_Array_UnsignedChar( as_TX_cmd.c_str(), array, HCI_CMD_MAX_LEN );
  625.        // cmd.s_hci_cmd.m_opcode = (array[HCI_CMD_OPCODE_HIGH_IDX] << 8) | array[HCI_CMD_OPCODE_LOW_IDX];
  626.        // cmd.s_hci_cmd.m_len    =  array[HCI_CMD_LEN_IDX];
  627.        // for( i=HCI_CMD_PARAMETER_START_IDX; i<count; i++ )
  628.        // {   cmd.s_hci_cmd.m_cmd[i-HCI_CMD_PARAMETER_START_IDX] = array[i];
  629.        // }
  630.        // cmd.s_hci_cmd.m_opcode = Get_OpCode( as_TX_cmd );
  631.        // cmd.s_hci_cmd.m_len    = Get_CommandParameterLen( as_TX_cmd );
  632.         cmd.as_hci_cmd = as_TX_cmd;
  633.         iter_script->v_cmd.push_back( cmd );
  634.     }
  635.     else if( as_cmd.AnsiPos("RX:") != 0 )
  636.     {
  637.         //BT_HCI_EVENT event;
  638.         int iLD_l = as_cmd.AnsiPos("RX:");
  639.         AnsiString as_RX_event = as_cmd.SubString( iLD_l+4, as_cmd.Length() ).Trim();
  640.        // if( ! InterpretCommand( as_RX_event ) )
  641.        //     return false;
  642.        // int count = String_Hex_To_Array_UnsignedChar( as_RX_event.c_str(), array, HCI_CMD_MAX_LEN );
  643.        // event.m_event = array[HCI_EVENT_ID_IDX];
  644.        // event.m_len   = array[HCI_EVENT_LEN_IDX];
  645.        // for( i=HCI_EVENT_PARAMETER_START_IDX; i<count; i++ )
  646.        // {   event.m_parms[i-HCI_EVENT_PARAMETER_START_IDX] = array[i];
  647.        // }
  648.         //vector<BT_HCI_EVENT>:: iterator iter_event = iter_cmd->v_hci_event.end()-1;
  649.         //event.m_event = Get_LastEvent( as_RX_event );
  650.         //event.m_len   = Get_EventParameterLen( as_RX_event );
  651.         iter_cmd->uc_last_event = Get_LastEvent( as_RX_event );
  652.         iter_cmd->ui_ms_timeout = 20000;
  653.         iter_cmd->v_hci_event.push_back( as_RX_event );
  654.     }
  655.     return true;
  656. }
  657. //---------------------------------------------------------------------------
  658. bool  CBTSCT::InterpretCommand( AnsiString as_cmd, BT_HCI_COMMAND &hci_cmd )
  659. {
  660.     bool b_find;
  661.     vector<S_BT_B_VAR>:: iterator iter_b_var;
  662.     unsigned char array[HCI_CMD_MAX_LEN];
  663.     int count = ::Get_CharAppearCount( as_cmd, '&' );
  664.     AnsiString as_var_name;
  665.     for(int i=0; i<count; i++ )
  666.     {
  667.         b_find = false;
  668.         int iLD_l = Get_CharAppearPosition( as_cmd, '&', 1 );;
  669.         int iLD_r = Get_CharAppearPosition( as_cmd, '&', ',', 1 );
  670.         if( iLD_r < iLD_l )
  671.         {
  672.             iLD_r = as_cmd.Length()+1;
  673.         }
  674.         as_var_name = as_cmd.SubString( iLD_l+1, iLD_r-iLD_l-1 );
  675.         for( iter_b_var = m_pvBVar->begin(); iter_b_var != m_pvBVar->end(); iter_b_var++ )
  676.         {
  677.             if( iter_b_var->as_name.AnsiCompareIC(as_var_name) == 0 )
  678.             {
  679.                 char str_value[HCI_CMD_MAX_LEN];
  680.                 sprintf( str_value, "%X", iter_b_var->uc_value );
  681.                 AnsiString as_value(str_value);
  682.                 as_cmd = as_cmd.SubString(1, iLD_l-1) + as_value + as_cmd.SubString(iLD_r, as_cmd.Length()-iLD_r+1);
  683.                 b_find = true;
  684.                 break;
  685.             }
  686.         }
  687.         if( ! b_find )
  688.             return false;
  689.        // String_Hex_To_Array_UnsignedChar( as_cmd.c_str(), hci_cmd.m_cmd, HCI_CMD_MAX_LEN );
  690.     }  // for
  691.     hci_cmd.m_opcode = Get_OpCode( as_cmd );
  692.     hci_cmd.m_len    = Get_CommandParameterLen( as_cmd );
  693.     count = AnsiString_Hex_To_Array_UnsignedChar( as_cmd.c_str(), array, HCI_CMD_MAX_LEN, ',' );
  694.     for( int i=0; i<hci_cmd.m_len; i++ )
  695.     {   hci_cmd.m_cmd[i] = array[i+HCI_CMD_PARAMETER_START_IDX];
  696.     }
  697.     return true;
  698. }
  699. //---------------------------------------------------------------------------
  700. bool  CBTSCT::InterpretEvent( BT_HCI_EVENT hci_event, AnsiString as_event )
  701. {
  702.     bool b_find;
  703.     AnsiString as_var_name;
  704.     vector<S_BT_B_VAR>:: iterator iter_b_var;
  705.     unsigned char str[2*HCI_CMD_MAX_LEN+1];
  706.     int count = ::Get_CharAppearCount( as_event, '&' );
  707.     for(int i=0; i<count; i++ )
  708.     {
  709.         b_find = false;
  710.         int iLD_l = Get_CharAppearPosition( as_event, '&', 1 );;
  711.         int iLD_r = Get_CharAppearPosition( as_event, '&', ',', 1 );
  712.         if( iLD_r < iLD_l )
  713.         {
  714.             iLD_r = as_event.Length()+1;
  715.         }
  716.         as_var_name = as_event.SubString( iLD_l+1, iLD_r-iLD_l-1 );
  717.         for( iter_b_var = m_pvBVar->begin(); iter_b_var != m_pvBVar->end(); iter_b_var++ )
  718.         {
  719.             if( iter_b_var->as_name.AnsiCompareIC(as_var_name) == 0 )
  720.             {
  721.                // as_event = as_event.SubString(1, iLD_l-1) + IntToStr(iter_b_var->uc_value) + as_event.SubString(iLD_r, as_event.Length()-iLD_r+1);
  722.                 int count_seq = Get_CharAppearCount( as_event, ',' );
  723.                 int index = Get_VariableIndex( as_event, as_var_name, count_seq+1  );
  724.                 if( index < 0 )
  725.                     return false;
  726.                 if( ! iter_b_var->b_valid )
  727.                 {
  728.                     iter_b_var->uc_value = hci_event.m_parms[index-HCI_EVENT_PARAMETER_START_IDX];
  729.                     iter_b_var->b_valid  = true;
  730.                 }
  731.                 else
  732.                 {
  733.                     if( iter_b_var->uc_value != hci_event.m_parms[index-HCI_EVENT_PARAMETER_START_IDX] )
  734.                         return false;
  735.                 }
  736.                 char str_value[HCI_CMD_MAX_LEN];
  737.                 sprintf( str_value, "%X", iter_b_var->uc_value );
  738.                 AnsiString as_value(str_value);
  739.                 as_event = as_event.SubString(1, iLD_l-1) + as_value + as_event.SubString(iLD_r, as_event.Length()-iLD_r+1);
  740.                 b_find = true;
  741.                 break;
  742.             }
  743.         }
  744.         if( ! b_find )
  745.             return false;
  746.     }  // for
  747.     AnsiString_Hex_To_Array_UnsignedChar( as_event.c_str(), str, HCI_CMD_MAX_LEN, ','  );
  748.     if( str[HCI_EVENT_ID_IDX] != hci_event.m_event )   return false;
  749.     if( str[HCI_EVENT_LEN_IDX]!= hci_event.m_len )     return false;
  750.     for( int i=0; i<hci_event.m_len; i++ )
  751.     {
  752.         if( str[HCI_EVENT_PARAMETER_START_IDX+i] != hci_event.m_parms[i] )
  753.             return false;
  754.     }        
  755.     //sprintf( str, "%X,", hci_event.m_event );
  756.     //AnsiString as_last_event( str );
  757.     //sprintf( str, "%X,", hci_event.m_len );
  758.     //AnsiString as_par_len( str );
  759.     //Array_To_Hex_String_UnsignedChar( str, hci_event.m_parms, hci_event.m_len, ',' );
  760.     //AnsiString as_par( (const char*) str );
  761.     //AnsiString as_receive_event = as_last_event + as_par_len + as_par;
  762.    // if( as_receive_event.AnsiCompareIC(as_event) != 0 )
  763.    //     return false;
  764.   //  int count = ::Get_CharAppearCount( as_cmd, '&' );
  765.   //  for(int i=0; i<count; i++ )
  766.   //  {
  767.   //  }
  768.     return true;
  769. }
  770. //---------------------------------------------------------------------------
  771. unsigned short CBTSCT::Get_OpCode( AnsiString as_cmd )
  772. {
  773.     unsigned short opcode;
  774.     unsigned short opcode_low, opcode_hi;
  775.     AnsiString as_opcode_low, as_opcode_hi;
  776.     int iLD = as_cmd.AnsiPos(",");
  777.     as_opcode_low = as_cmd.SubString( 1, iLD-1 );
  778.     AnsiString_Hex_To_UnsignedShort( as_opcode_low, opcode_low );
  779.     as_cmd = as_cmd.SubString( iLD+1, as_cmd.Length() );
  780.     iLD = as_cmd.AnsiPos(",");
  781.     as_opcode_hi = as_cmd.SubString( 1, iLD-1 );
  782.     AnsiString_Hex_To_UnsignedShort( as_opcode_hi, opcode_hi );
  783.     opcode = ((opcode_hi & 0x00FF) << 8) | (opcode_low & 0x00FF);
  784.     return opcode;
  785. }
  786. //---------------------------------------------------------------------------
  787. unsigned char CBTSCT::Get_CommandParameterLen( AnsiString as_cmd )
  788. {
  789.     unsigned char len;
  790.     int iLD;
  791.     for(int i=0; i<2; i++ )
  792.     {
  793.         iLD = as_cmd.AnsiPos(",");
  794.         as_cmd = as_cmd.SubString( iLD+1, as_cmd.Length() );
  795.     }
  796.     iLD = as_cmd.AnsiPos(",");
  797.     AnsiString as_len = as_cmd.SubString( 1, iLD-1 );
  798.     AnsiString_Hex_To_UnsignedChar( as_len, len );
  799.     return len;
  800. }
  801. //---------------------------------------------------------------------------
  802. unsigned char CBTSCT::Get_LastEvent( AnsiString as_event )
  803. {
  804.     unsigned char last_event;
  805.     int iLD = as_event.AnsiPos(",");
  806.     AnsiString as_last_event = as_event.SubString( 1, iLD-1 );
  807.     AnsiString_Hex_To_UnsignedChar( as_last_event, last_event );
  808.     return last_event;
  809. }
  810. //---------------------------------------------------------------------------
  811. unsigned char CBTSCT::Get_EventParameterLen( AnsiString as_event )
  812. {
  813.     unsigned char len;
  814.     int iLD = as_event.AnsiPos(",");
  815.     as_event = as_event.SubString( iLD+1, as_event.Length() );
  816.     iLD = as_event.AnsiPos(",");
  817.     AnsiString as_len = as_event.SubString( 1, iLD-1 );
  818.     AnsiString_Hex_To_UnsignedChar( as_len, len );
  819.     return len;
  820. }
  821. //---------------------------------------------------------------------------
  822. int CBTSCT::Get_VariableIndex( AnsiString as, AnsiString as_var, unsigned char len )
  823. {
  824.    // unsigned char str[2*HCI_CMD_MAX_LEN+1];
  825.    // String_Hex_To_Array_UnsignedChar( as.c_str(), str, len  );
  826.     int index = -1;
  827.     AnsiString as_temp;
  828.     for( int i=0; i<len; i++ )
  829.     {
  830.         int iLD = as.AnsiPos(",");
  831.         if( iLD < 1 )
  832.             iLD = as.Length()+1;
  833.         as_temp = as.SubString( 1, iLD-1 );
  834.         as = as.SubString(iLD+1, as.Length()-iLD);
  835.         if( as_temp.AnsiPos("&") != 0 )
  836.         {
  837.             iLD = as_temp.AnsiPos("&");
  838.             as_temp = as_temp.SubString(iLD+1, as_temp.Length()-iLD).Trim();
  839.             if( as_temp.AnsiCompareIC(as_var) == 0 )
  840.             {
  841.                 index = i;
  842.                 break;
  843.             }
  844.         }
  845.     }
  846.     return index;
  847. }
  848. //===========================================================================
  849. ////////////////////////////   Log  information   ////////////////////////
  850. //===========================================================================
  851. void CBTSCT::AddParseLogToStringList(AnsiString as_log)
  852. {
  853.     m_sBTSCT.log->Add(as_log);
  854.     PostMessage(
  855.                          m_sBTSCT.hPostMsgDestHandle,
  856.                          WM_ML_BT_PRINT_MSG,
  857.                          PAGEIDX_BT_SCT,
  858.                          0
  859.                         );
  860. }
  861. //----------------------------------------------------------------------------
  862. void  CBTSCT::AddTxLogToStringList(BT_HCI_COMMAND hci_cmd)
  863. {
  864. #if 0
  865.     unsigned char        str[1024];
  866.     Array_To_Hex_String_UnsignedChar( str, hci_cmd.m_cmd, hci_cmd.m_len, ',' );
  867.     AnsiString as_cmd( (const char*)str );
  868.     AnsiString as_log = "[" + TimeToStr(Time()) + "] TX: " + as_cmd;
  869. #endif
  870.     char        str[1024];
  871.     AnsiString as_log;
  872.     sprintf( str, "%X,", hci_cmd.m_opcode & 0x00FF );
  873.     AnsiString as_opcode_low(str);
  874.     sprintf( str, "%X,", (hci_cmd.m_opcode & 0xFF00)>>8 );
  875.     AnsiString as_opcode_high(str);
  876.     Array_To_Hex_String_UnsignedChar( str, hci_cmd.m_cmd, hci_cmd.m_len, ',' );
  877.     AnsiString as_cmd( (const char*)str );
  878.     if( 0 == hci_cmd.m_len )
  879.        as_cmd = "";
  880.     sprintf( str, "%X,", hci_cmd.m_len );
  881.     AnsiString as_length(str);
  882.     as_log = "[" + TimeToStr(Time()) + "] TX: " + as_opcode_low + as_opcode_high + as_length  + as_cmd;
  883.     m_sBTSCT.log->Add( as_log );
  884.     PostMessage(
  885.                          m_sBTSCT.hPostMsgDestHandle,
  886.                          WM_ML_BT_PRINT_MSG,
  887.                          PAGEIDX_BT_SCT,
  888.                          0
  889.                         );
  890. }
  891. //--------------------------------------------------------------------------
  892. void  CBTSCT::AddRxLogToStringList(BT_HCI_EVENT hci_event)
  893. {
  894. #if 0
  895.     unsigned char        str[1024];
  896.     Array_To_Hex_String_UnsignedChar( str, hci_event.m_parms, hci_event.m_len, ',' );
  897.     AnsiString as_event( (const char*) str );
  898.     AnsiString as_log = "[" + TimeToStr(Time()) + "] RX: " + as_event;
  899. #endif
  900.     unsigned char        str[1024];
  901.     AnsiString as_log;
  902.     sprintf( str, "%X,", hci_event.m_event );
  903.     AnsiString as_event( (const char*) str );
  904.     sprintf( str, "%X,", hci_event.m_len );
  905.     AnsiString as_length( (const char*) str );
  906.     Array_To_Hex_String_UnsignedChar( str, hci_event.m_parms, hci_event.m_len, ',' );
  907.     AnsiString as_param( (const char*) str );
  908.     if(  0 == hci_event.m_len )
  909.         as_param = "";
  910.         
  911.     as_log = "[" + TimeToStr(Time()) + "] RX: " + as_event + as_length + as_param;
  912.     m_sBTSCT.log->Add( as_log );
  913.     PostMessage(
  914.                          m_sBTSCT.hPostMsgDestHandle,
  915.                          WM_ML_BT_PRINT_MSG,
  916.                          PAGEIDX_BT_SCT,
  917.                          0
  918.                         );
  919. }
  920. //===========================================================================
  921. ////////////////////////////   Global  information   ////////////////////////
  922. //===========================================================================
  923. E_METAAPP_RESULT_T CBTSCT::Get_ConfirmState(void)
  924. {
  925.     return  m_eConfirmState;
  926. }
  927. //---------------------------------------------------------------------------
  928. BT_HCI_EVENT CBTSCT::Get_HCIEvent(void)
  929. {   return m_sHCIEvent;
  930. }
  931. //---------------------------------------------------------------------------
  932. vector<S_BT_SCT_SCRIPT>*  CBTSCT::Get_ScriptVector( void )
  933. {
  934.     return m_pvScript;
  935. }