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

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_throughput.cpp
  15.  *
  16.  * Project:
  17.  * --------
  18.  *   Maui META APP
  19.  *
  20.  * Description:
  21.  * ------------
  22.  *   BT throughput 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. #include <stdio.h>
  42. #include <stdlib.h>
  43. #pragma hdrstop
  44. // BT
  45. #ifndef  _BT_THROUGHPUT_H_
  46. #include "bt_throughput.h"
  47. #endif
  48. #ifndef  _BT_HCI_COMMON_H_
  49. #include "bt_hci_common.h"
  50. #endif
  51. // man
  52. #ifndef  _MAN_TIMER_H_
  53. #include "man_timer.h"
  54. #endif
  55. #ifndef  _MAN_ACTIVE_H_
  56. #include "man_active.h"
  57. #endif
  58. // misc
  59. #ifndef  _FT_UTILS_H_
  60. #include "ft_utils.h"
  61. #endif
  62. // message
  63. #ifndef _META_LAB_MSG_H_
  64. #include "meta_lab_msg.h"
  65. #endif
  66. //==============================================================================
  67. static CBTTT*  gs_bt_tt_ptr;
  68. static bool g_bIsRunning = false;
  69. static bool g_bTxStop = false;
  70. static bool g_bRxStop = false;
  71. //static S_BT_TT_MONITOR_RX_CNF g_sBTRxCnf;
  72. //==============================================================================
  73. static void  REQ_TimeOut( void )
  74. {   gs_bt_tt_ptr->REQ_TimeOut();
  75. }
  76. //------------------------------------------------------------------------------
  77. static void  REQ_Stop( void )
  78. {   gs_bt_tt_ptr->REQ_Stop();
  79. }
  80. //------------------------------------------------------------------------------
  81. static void  REQ_Finish( void )
  82. {   gs_bt_tt_ptr->REQ_Finish();
  83. }
  84. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  85. static void  REQ_Send_Scan_HCI_command( void )
  86. {   gs_bt_tt_ptr->REQ_Send_Scan_HCI_command();
  87. }
  88. //---------------------------------------------------------------------------
  89. static void __stdcall CNF_ScanHCIEvent(const BT_HCI_EVENT *cnf, const short token, void *usrData)
  90. {   gs_bt_tt_ptr->CNF_ScanHCIEvent( cnf, token, usrData );
  91. }
  92. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  93. static void  REQ_Send_Auto_Accept_HCI_command( void )
  94. {   gs_bt_tt_ptr->REQ_Send_Auto_Accept_HCI_command();
  95. }
  96. //---------------------------------------------------------------------------
  97. void __stdcall CNF_ConnectACLAutoHCIEvent(const BT_HCI_EVENT *hci_event, const short token, void *usrData)
  98. {    gs_bt_tt_ptr->CNF_ConnectACLAutoHCIEvent( hci_event, token, usrData );
  99. }
  100. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  101. static void  REQ_Send_ConnectACL_HCI_command( void )
  102. {   gs_bt_tt_ptr->REQ_Send_ConnectACL_HCI_command();
  103. }
  104. //---------------------------------------------------------------------------
  105. static void __stdcall CNF_ConnectACLHCIEvent(const BT_HCI_EVENT *cnf, const short token, void *usrData)
  106. {   gs_bt_tt_ptr->CNF_ConnectACLHCIEvent( cnf, token, usrData );
  107. }
  108. //---------------------------------------------------------------------------
  109. static void __stdcall CNF_DisconnectACLAutoHCIEvent(const BT_HCI_EVENT *cnf, const short token, void *usrData)
  110. {   gs_bt_tt_ptr->CNF_DisconnectACLAutoHCIEvent( cnf, token, usrData );
  111. }
  112. //---------------------------------------------------------------------------
  113. static void __stdcall CNF_LinkKeyNegReplyHCIEvent(const BT_HCI_EVENT *cnf, const short token, void *usrData)
  114. {   gs_bt_tt_ptr->CNF_LinkKeyNegReplyHCIEvent( cnf, token, usrData );
  115. }
  116. //---------------------------------------------------------------------------
  117. static void  REQ_Send_DisconnectACL_HCI_command( void )
  118. {   gs_bt_tt_ptr->REQ_Send_DisconnectACL_HCI_command();
  119. }
  120. //---------------------------------------------------------------------------
  121. static void __stdcall CNF_DisconnectACLHCIEvent(const BT_HCI_EVENT *cnf, const short token, void *usrData)
  122. {   gs_bt_tt_ptr->CNF_DisconnectACLHCIEvent( cnf, token, usrData );
  123. }
  124. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  125. static void  REQ_Send_Change_ACL_Packet_Type_HCI_command( void )
  126. {   gs_bt_tt_ptr->REQ_Send_Change_ACL_Packet_Type_HCI_command();
  127. }
  128. //---------------------------------------------------------------------------
  129. static void __stdcall CNF_ChangeACLPacketTypeHCIEvent(const BT_HCI_EVENT *cnf, const short token, void *usrData)
  130. {   gs_bt_tt_ptr->CNF_ChangeACLPacketTypeHCIEvent( cnf, token, usrData );
  131. }
  132. //---------------------------------------------------------------------------
  133. static void  REQ_TX_Data( void )
  134. {   gs_bt_tt_ptr->REQ_TX_Data();
  135. }
  136. //---------------------------------------------------------------------------
  137. void __stdcall CNF_TX_Data_V0(const BT_HCI_PACKET *cnf, const short token, void *usrData)
  138. {   gs_bt_tt_ptr->CNF_TX_Data_V0( cnf, token, usrData );
  139. }
  140. //---------------------------------------------------------------------------
  141. void __stdcall CNF_TX_Data_V1(const BT_HCI_TX_PURE_TEST_STAT *cnf, const short token, void *usrData)
  142. {   gs_bt_tt_ptr->CNF_TX_Data_V1( cnf, token, usrData );
  143. }
  144. //---------------------------------------------------------------------------
  145. void __stdcall CNF_TX_Data_V2(const BT_HCI_TX_PURE_TEST_STAT_V2 *cnf, const short token, void *usrData)
  146. {
  147.     gs_bt_tt_ptr->CNF_TX_Data_V2(cnf, token, usrData);
  148. }
  149. //---------------------------------------------------------------------------
  150. void  REQ_RX_Data( void )
  151. {   gs_bt_tt_ptr->REQ_RX_Data();
  152. }
  153. //---------------------------------------------------------------------------
  154. void __stdcall CNF_RX_Data_V0(const BT_HCI_BUFFER *cnf, const short token, void *usrData)
  155. {   gs_bt_tt_ptr->CNF_RX_Data_V0( cnf, token, usrData );
  156. }
  157. //---------------------------------------------------------------------------
  158. void __stdcall CNF_RX_Data_V2(const BT_HCI_RX_PURE_TEST_STAT *cnf, const short token, void *usrData)
  159. {   gs_bt_tt_ptr->CNF_RX_Data_V2( cnf, token, usrData );
  160. }
  161. //---------------------------------------------------------------------------
  162. void  REQ_Stop_RX_Data(void)
  163. {   gs_bt_tt_ptr->REQ_Stop_RX_Data();
  164. }
  165. //===========================================================================
  166. CBTTT::CBTTT( void )
  167. {
  168.     g_bIsRunning = false;
  169.     ConfirmCallback = 0;
  170. }
  171. //---------------------------------------------------------------------------
  172. CBTTT::~CBTTT( void )
  173. {
  174.     g_bIsRunning = false;
  175.     ConfirmCallback = 0;
  176. }
  177. //---------------------------------------------------------------------------
  178. void  CBTTT::REQ_Finish( void )
  179. {
  180.    if( ! g_bIsRunning )  return;
  181.    Confirm(METAAPP_SUCCESS);
  182.    g_bIsRunning = false;
  183. }
  184. //==========================================================================
  185. void  CBTTT::REQ_Stop_Start(void)
  186. {
  187.     gs_bt_tt_ptr  = this;
  188.     g_bIsRunning  = true;
  189.     g_bTxStop = true;
  190.     META_CancelAllBlockingCall_r(m_META_HANDLE_Obj.Get_MainHandle());
  191.     REQ_Stop();
  192. }
  193. //---------------------------------------------------------------------------
  194. void  CBTTT::REQ_Stop( void )
  195. {
  196.     if( ! g_bIsRunning )  return;
  197.     Confirm(METAAPP_STOP);
  198.     g_bIsRunning = false;
  199. }
  200. //---------------------------------------------------------------------------
  201. void  CBTTT::REQ_TimeOut( void )
  202. {
  203.     if( ! g_bIsRunning )  return;
  204.     Confirm( METAAPP_TIMEOUT );
  205.     g_bIsRunning = false;
  206. }
  207. //---------------------------------------------------------------------------
  208. void CBTTT::Confirm(E_METAAPP_RESULT_T confirm_state)
  209. {
  210.     if (!g_bIsRunning)
  211.     {
  212.         return;
  213.     }
  214.     if(ConfirmCallback==0)  return;
  215.     m_eConfirmState = confirm_state;
  216.     ActiveMan->SetActiveFunction( ConfirmCallback );
  217. }
  218. //===========================================================================
  219. ////////////////////////////       Scan            //////////////////////////
  220. //===========================================================================
  221. void  CBTTT::REQ_Scan_Start( S_BT_TT bt_tt )
  222. {
  223.     gs_bt_tt_ptr  = this;
  224.     g_bIsRunning  = true;
  225.     m_sBTTT = bt_tt;
  226.     ActiveMan->SetActiveFunction( ::REQ_Send_Scan_HCI_command );
  227. }
  228. //---------------------------------------------------------------------------
  229. void  CBTTT::REQ_Send_Scan_HCI_command( void )
  230. {
  231.     if(!g_bIsRunning)  return;
  232.     m_bEventOk = false;
  233.     BT_HCI_COMMAND hci_cmd;
  234.     // interlaced inquiry scan
  235.     Compose_Inquiry_Scan_Type_HCI_Command( hci_cmd, m_sScan );
  236.     AddTxLogToStringList( hci_cmd );
  237.     META_RESULT MetaResult = META_BT_SendHCICommand_r( m_META_HANDLE_Obj.Get_MainHandle(), 5000, &hci_cmd, ::CNF_ScanHCIEvent, NULL, HCE_COMMAND_COMPLETE );
  238.     if( (META_SUCCESS != MetaResult) || (!m_bEventOk) )
  239.     {
  240.         if( META_TIMEOUT == MetaResult )
  241.         {
  242.             Confirm( METAAPP_TIMEOUT );
  243.             return;
  244.         }
  245.         else if( META_CANCEL == MetaResult )
  246.         {
  247.             Confirm( METAAPP_CANCEL );
  248.             return;
  249.         }
  250.         else
  251.         {
  252.             Confirm( METAAPP_FAIL );
  253.             return;
  254.         }
  255.     }
  256.     // interlaced page scan
  257.     Compose_Page_Scan_Type_HCI_Command( hci_cmd, m_sScan );
  258.     AddTxLogToStringList( hci_cmd );
  259.     MetaResult = META_BT_SendHCICommand_r( m_META_HANDLE_Obj.Get_MainHandle(), 5000, &hci_cmd, ::CNF_ScanHCIEvent, NULL, HCE_COMMAND_COMPLETE );
  260.     if( (META_SUCCESS != MetaResult) || (!m_bEventOk) )
  261.     {
  262.         if( META_TIMEOUT == MetaResult )
  263.         {
  264.             Confirm( METAAPP_TIMEOUT );
  265.             return;
  266.         }
  267.         else if( META_CANCEL == MetaResult )
  268.         {
  269.             Confirm( METAAPP_CANCEL );
  270.             return;
  271.         }
  272.         else
  273.         {
  274.             Confirm( METAAPP_FAIL );
  275.             return;
  276.         }
  277.     }
  278.     //  scan type
  279.     Compose_Scan_Enable_HCI_Command( hci_cmd, m_sScan );
  280.     AddTxLogToStringList( hci_cmd );
  281.     MetaResult = META_BT_RegisterAutoCallback_r( m_META_HANDLE_Obj.Get_MainHandle(), ::CNF_ConnectACLAutoHCIEvent );
  282.     MetaResult = META_BT_SendHCICommand_r( m_META_HANDLE_Obj.Get_MainHandle(), 5000, &hci_cmd, ::CNF_ScanHCIEvent, NULL, HCE_COMMAND_COMPLETE );
  283.     if( (META_SUCCESS != MetaResult) || (!m_bEventOk) )
  284.     {
  285.         if( META_TIMEOUT == MetaResult )
  286.         {
  287.             Confirm( METAAPP_TIMEOUT );
  288.             return;
  289.         }
  290.         else if( META_CANCEL == MetaResult )
  291.         {
  292.             Confirm( METAAPP_CANCEL );
  293.             return;
  294.         }
  295.         else
  296.         {
  297.             Confirm( METAAPP_FAIL );
  298.             return;
  299.         }
  300.     }
  301.     ActiveMan->SetActiveFunction( ::REQ_Finish );
  302. }
  303. //---------------------------------------------------------------------------
  304. void __stdcall CBTTT::CNF_ScanHCIEvent(const BT_HCI_EVENT *cnf, const short token, void *usrData)
  305. {
  306.     if(!g_bIsRunning)  return;
  307.     if( 0xFF == cnf->m_event )  return; // LMP
  308.     AddRxLogToStringList( *cnf );
  309.     m_bEventOk = DeCompose_Scan_HCI_Event( *cnf );
  310. }
  311. //--------------------------------------------------------------------------
  312. void  CBTTT::Compose_Inquiry_Scan_Type_HCI_Command( BT_HCI_COMMAND &hci_cmd, S_BT_SCAN scan )
  313. {
  314.     hci_cmd.m_opcode = 0x0C43;
  315.     hci_cmd.m_len    = 1;
  316.     Reset_HCI_Command( hci_cmd );
  317.     if( scan.b_interlaced_inquiry_scan )
  318.         hci_cmd.m_cmd[0] = 1;
  319.     else
  320.         hci_cmd.m_cmd[0] = 0;
  321. }
  322. //--------------------------------------------------------------------------
  323. void  CBTTT::Compose_Page_Scan_Type_HCI_Command( BT_HCI_COMMAND &hci_cmd, S_BT_SCAN scan )
  324. {
  325.     hci_cmd.m_opcode = 0x0C47;
  326.     hci_cmd.m_len    = 1;
  327.     Reset_HCI_Command( hci_cmd );
  328.     if( scan.b_interlaced_page_scan )
  329.         hci_cmd.m_cmd[0] = 1;
  330.     else
  331.         hci_cmd.m_cmd[0] = 0;
  332. }
  333. //--------------------------------------------------------------------------
  334. void  CBTTT::Compose_Scan_Enable_HCI_Command( BT_HCI_COMMAND &hci_cmd, S_BT_SCAN scan )
  335. {
  336.     hci_cmd.m_opcode = 0x0C1A;
  337.     hci_cmd.m_len    = 1;
  338.     Reset_HCI_Command( hci_cmd );
  339.     hci_cmd.m_cmd[0] = (unsigned char) scan.e_scan_type;
  340. }
  341. //--------------------------------------------------------------------------
  342. bool  CBTTT::DeCompose_Scan_HCI_Event( BT_HCI_EVENT hci_event )
  343. {
  344.     if(
  345.         0x00 != hci_event.m_parms[3]
  346.        )
  347.      {  return false;
  348.      }
  349.     return true;
  350. }
  351. //===========================================================================
  352. ////////////////////////////       auto accept     //////////////////////////
  353. //===========================================================================
  354. void  CBTTT::REQ_Auto_Accept_Start( S_BT_TT bt_tt )
  355. {
  356.     gs_bt_tt_ptr  = this;
  357.     g_bIsRunning  = true;
  358.     m_sBTTT = bt_tt;
  359.     ActiveMan->SetActiveFunction( ::REQ_Send_Auto_Accept_HCI_command );
  360. }
  361. //---------------------------------------------------------------------------
  362. void  CBTTT::REQ_Send_Auto_Accept_HCI_command( void )
  363. {
  364.     if(!g_bIsRunning)  return;
  365.     m_bEventOk = false;
  366.     BT_HCI_COMMAND hci_cmd;
  367.     // interlaced inquiry scan
  368.     Compose_Auto_Accept_HCI_Command( hci_cmd );
  369.     AddTxLogToStringList( hci_cmd );
  370.     META_RESULT MetaResult = META_BT_RegisterAutoCallback_r( m_META_HANDLE_Obj.Get_MainHandle(), ::CNF_ConnectACLAutoHCIEvent );
  371.     MetaResult = META_BT_SendHCICommand_r( m_META_HANDLE_Obj.Get_MainHandle(), 5000, &hci_cmd, ::CNF_ScanHCIEvent, NULL, HCE_COMMAND_COMPLETE );
  372.     if( (META_SUCCESS != MetaResult) || (!m_bEventOk) )
  373.     {
  374.         if( META_TIMEOUT == MetaResult )
  375.         {
  376.             Confirm( METAAPP_TIMEOUT );
  377.             return;
  378.         }
  379.         else if( META_CANCEL == MetaResult )
  380.         {
  381.             Confirm( METAAPP_CANCEL );
  382.             return;
  383.         }
  384.         else
  385.         {
  386.             Confirm( METAAPP_FAIL );
  387.             return;
  388.         }
  389.     }
  390.     ActiveMan->SetActiveFunction( ::REQ_Finish );
  391. }
  392. //---------------------------------------------------------------------------
  393. void __stdcall CBTTT::CNF_AutoAcceptHCIEvent(const BT_HCI_EVENT *cnf, const short token, void *usrData)
  394. {
  395.     if(!g_bIsRunning)  return;
  396.     if( 0xFF == cnf->m_event )  return; // LMP
  397.     AddRxLogToStringList( *cnf );
  398.     m_bEventOk = DeCompose_Scan_HCI_Event( *cnf );
  399. }
  400. //--------------------------------------------------------------------------
  401. void __stdcall CBTTT::CNF_ConnectACLAutoHCIEvent(const BT_HCI_EVENT *hci_event, const short token, void *usrData)
  402. {
  403.     AddRxLogToStringList( *hci_event );
  404.     if( 0x03 == hci_event->m_event )
  405.     {
  406.         if( 0x00 == hci_event->m_parms[0] ) // success
  407.         {
  408.             m_sBTTTRes.e_acl_status = BT_ACL_STATUS_SUCCESS;
  409.             m_sBTTTRes.uc_h1_acl    = hci_event->m_parms[1];
  410.             m_sBTTTRes.uc_h2_acl    = hci_event->m_parms[2];
  411.             for( int i=0; i<BD_ADDRESS_LEN; i++ )
  412.             {
  413.                 m_sBTTTRes.s_bd_addr.uc_BD_Addr[i] = hci_event->m_parms[3+i];
  414.             }
  415.         }
  416.         else if( 0x04 == hci_event->m_parms[0] ) // page timeout
  417.         {
  418.             m_sBTTTRes.e_acl_status = BT_ACL_STATUS_PAGE_TIMEOUT;
  419.         }
  420.         else // fail
  421.         {
  422.             m_sBTTTRes.e_acl_status = BT_ACL_STATUS_FAIL;
  423.         }
  424.         PostMessage(
  425.                          m_sBTTT.hPostMsgDestHandle,
  426.                          MW_ML_BT_CONNECT_MSG,
  427.                          PAGEIDX_BT_TT,
  428.                          0
  429.                         );
  430.     }
  431. }
  432. //--------------------------------------------------------------------------
  433. void  CBTTT::Compose_Auto_Accept_HCI_Command( BT_HCI_COMMAND &hci_cmd )
  434. {
  435.     hci_cmd.m_opcode = 0x0C05;
  436.     hci_cmd.m_len    = 3;
  437.     Reset_HCI_Command( hci_cmd );
  438.     hci_cmd.m_cmd[0] = 0x02;
  439.     hci_cmd.m_cmd[1] = 0x00;
  440.     hci_cmd.m_cmd[2] = 0x02;
  441. }
  442. //--------------------------------------------------------------------------
  443. bool  CBTTT::DeCompose_Auto_Accept_HCI_Event( BT_HCI_EVENT hci_event )
  444. {
  445.     if(
  446.         0x00 != hci_event.m_parms[3]
  447.        )
  448.      {  return false;
  449.      }
  450.     return true;
  451. }
  452. //===========================================================================
  453. ///////////////////////////        Connect           ////////////////////////
  454. //===========================================================================
  455. void  CBTTT::REQ_ConnectACL_Start( S_BT_TT bt_tt )
  456. {
  457.     gs_bt_tt_ptr  = this;
  458.     g_bIsRunning  = true;
  459.     m_sBTTT = bt_tt;
  460.     ActiveMan->SetActiveFunction( ::REQ_Send_ConnectACL_HCI_command );
  461. }
  462. //---------------------------------------------------------------------------
  463. void  CBTTT::REQ_Send_ConnectACL_HCI_command( void )
  464. {
  465.     if(!g_bIsRunning)  return;
  466.     m_bEventOk = false;
  467.     BT_HCI_COMMAND hci_cmd;
  468.     //m_uiEventCount = 0;
  469.     Compose_ConnectACL_HCI_Command( hci_cmd, m_sConnectACL );
  470.     AddTxLogToStringList( hci_cmd );
  471.     META_RESULT MetaResult = META_BT_RegisterAutoCallback_r( m_META_HANDLE_Obj.Get_MainHandle(), ::CNF_DisconnectACLAutoHCIEvent );
  472.     MetaResult = META_BT_SendHCICommand_r( m_META_HANDLE_Obj.Get_MainHandle(), 40000, &hci_cmd, ::CNF_ConnectACLHCIEvent, NULL, 0x1D );
  473.     if( (META_SUCCESS != MetaResult) || (!m_bEventOk) )
  474.     {
  475.         if( META_TIMEOUT == MetaResult )
  476.         {
  477.             Confirm( METAAPP_TIMEOUT );
  478.             return;
  479.         }
  480.         else if( META_CANCEL == MetaResult )
  481.         {
  482.             Confirm( METAAPP_CANCEL );
  483.             return;
  484.         }
  485.         else
  486.         {
  487.             Confirm( METAAPP_FAIL );
  488.             return;
  489.         }
  490.     }
  491.     ActiveMan->SetActiveFunction( ::REQ_Finish );
  492. }
  493. //---------------------------------------------------------------------------
  494. void __stdcall CBTTT::CNF_ConnectACLHCIEvent(const BT_HCI_EVENT *cnf, const short token, void *usrData)
  495. {
  496.     if(!g_bIsRunning)  return;
  497.     if( 0xFF == cnf->m_event )  return; // LMP
  498.    // m_uiEventCount++;
  499.     AddRxLogToStringList( *cnf );
  500.     m_bEventOk = DeCompose_ConnectACL_HCI_Event( *cnf );
  501. }
  502. //--------------------------------------------------------------------------
  503. void __stdcall CBTTT::CNF_DisconnectACLAutoHCIEvent(const BT_HCI_EVENT *hci_event, const short token, void *usrData)
  504. {
  505.     AddRxLogToStringList( *hci_event );
  506.     if( (0x05 == hci_event->m_event) && (0x00 == hci_event->m_parms[0]) ) // receive disconnect event
  507.     {
  508.         m_sBTTTRes.e_acl_status = BT_ACL_STATUS_NONE;
  509.     }
  510. }
  511. //--------------------------------------------------------------------------
  512. void  CBTTT::Compose_ConnectACL_HCI_Command( BT_HCI_COMMAND &hci_cmd, S_BT_CONNECT_ACL connect )
  513. {
  514.     // 33 8B 9E 30 0A
  515.     hci_cmd.m_opcode = 0x0405;
  516.     hci_cmd.m_len    = 13;
  517.     Reset_HCI_Command( hci_cmd );
  518.     for(int i=0; i<BD_ADDRESS_LEN; i++ )
  519.         hci_cmd.m_cmd[i] = connect.s_bd_addr.uc_BD_Addr[i];
  520.     hci_cmd.m_cmd[6] = connect.us_acl_pkt_type & 0x00FF;
  521.     hci_cmd.m_cmd[7] = (connect.us_acl_pkt_type & 0xFF00) >> 8;
  522.     hci_cmd.m_cmd[8] = 0x01;
  523.     hci_cmd.m_cmd[9] = 0x00;
  524.     hci_cmd.m_cmd[10]= 0x00;
  525.     hci_cmd.m_cmd[11]= 0x00;
  526.     hci_cmd.m_cmd[12]= 0x01;
  527. }
  528. //--------------------------------------------------------------------------
  529. bool  CBTTT::DeCompose_ConnectACL_HCI_Event( BT_HCI_EVENT hci_event )
  530. {
  531.     if( 0x03 == hci_event.m_event )
  532.     {
  533.         S_BT_TT_RES tt_res;
  534.         // status
  535.         tt_res.e_acl_status = (E_BT_ACL_STATUS) hci_event.m_parms[0];
  536.         if( (tt_res.e_acl_status != BT_ACL_STATUS_SUCCESS) &&
  537.             (tt_res.e_acl_status != BT_ACL_STATUS_PAGE_TIMEOUT)
  538.           )
  539.         {   tt_res.e_acl_status = BT_ACL_STATUS_FAIL;
  540.         }
  541.         // connection handle
  542.         tt_res.uc_h1_acl = hci_event.m_parms[1];
  543.         tt_res.uc_h2_acl = hci_event.m_parms[2];
  544.         // bd address
  545.         for( int i=0; i<BD_ADDRESS_LEN; i++ )
  546.         {
  547.             tt_res.s_bd_addr.uc_BD_Addr[i] = hci_event.m_parms[3+i];
  548.         }
  549.         m_sBTTTRes = tt_res;
  550.     }
  551.     else if( 0x17 == hci_event.m_event )
  552.     {
  553. #if 0
  554.         BT_HCI_COMMAND hci_cmd;
  555.         Compose_Link_Key_Negative_Reply_HCI_Command( hci_cmd, m_sConnectACL );
  556.         AddTxLogToStringList( hci_cmd );
  557.         m_bEvent2Ok = false;
  558.         META_RESULT MetaResult = META_BT_SendHCICommand_r( m_META_HANDLE_Obj.Get_MainHandle(), 5000, &hci_cmd, ::CNF_LinkKeyNegReplyHCIEvent, NULL, HCE_COMMAND_COMPLETE );
  559.         if( (META_SUCCESS != MetaResult) || (!m_bEvent2Ok) )
  560.         {
  561.             if( META_TIMEOUT == MetaResult )
  562.             {
  563.                 Confirm( METAAPP_TIMEOUT );
  564.                 return false;
  565.             }
  566.             else if( META_CANCEL == MetaResult )
  567.             {
  568.                 Confirm( METAAPP_CANCEL );
  569.                 return false;
  570.             }
  571.             else
  572.             {
  573.                 Confirm( METAAPP_FAIL );
  574.                 return false;
  575.             }
  576.         }
  577. #endif
  578.     }
  579.     else if( 0x16 == hci_event.m_event )
  580.     {
  581.         PostMessage(
  582.                          m_sBTTT.hPostMsgDestHandle,
  583.                          WM_ML_BT_PIN_MSG,
  584.                          PAGEIDX_BT_TT,
  585.                          0
  586.                         );
  587.     }
  588.     return true;
  589. }
  590. //---------------------------------------------------------------------------
  591. void __stdcall CBTTT::CNF_LinkKeyNegReplyHCIEvent(const BT_HCI_EVENT *cnf, const short token, void *usrData)
  592. {
  593.     if(!g_bIsRunning)  return;
  594.     if( 0xFF == cnf->m_event )  return; // LMP
  595.    // m_uiEventCount++;
  596.     AddRxLogToStringList( *cnf );
  597.     m_bEvent2Ok = DeCompose_Link_Key_Negative_Reply_HCI_Event( *cnf, m_sConnectACL );
  598. }
  599. //--------------------------------------------------------------------------
  600. void  CBTTT::Compose_Link_Key_Negative_Reply_HCI_Command( BT_HCI_COMMAND &hci_cmd, S_BT_CONNECT_ACL connect )
  601. {
  602.     // 33 8B 9E 30 0A
  603.     hci_cmd.m_opcode = 0x040C;
  604.     hci_cmd.m_len    = 6;
  605.     Reset_HCI_Command( hci_cmd );
  606.     for(int i=0; i<BD_ADDRESS_LEN; i++ )
  607.         hci_cmd.m_cmd[i] = connect.s_bd_addr.uc_BD_Addr[i];
  608.     
  609. }
  610. //---------------------------------------------------------------------------
  611. bool CBTTT::DeCompose_Link_Key_Negative_Reply_HCI_Event( BT_HCI_EVENT hci_event, S_BT_CONNECT_ACL connect )
  612. {
  613.     if( 0x00 != hci_event.m_parms[3] )
  614.      {  return false;
  615.      }
  616.     for( int i=0; i<BD_ADDRESS_LEN; i++ )
  617.     {
  618.         if( connect.s_bd_addr.uc_BD_Addr[i] != hci_event.m_parms[4+i] )
  619.             return false;
  620.     }        
  621.     return true;
  622. }
  623. //===========================================================================
  624. ///////////////////////////  Change ACL packet type  ////////////////////////
  625. //===========================================================================
  626. void  CBTTT::REQ_Change_ACL_Packet_Type_Start( S_BT_TT bt_tt )
  627. {
  628.     gs_bt_tt_ptr  = this;
  629.     g_bIsRunning  = true;
  630.     m_sBTTT = bt_tt;
  631.     ActiveMan->SetActiveFunction( ::REQ_Send_Change_ACL_Packet_Type_HCI_command );
  632. }
  633. //---------------------------------------------------------------------------
  634. void  CBTTT::REQ_Send_Change_ACL_Packet_Type_HCI_command( void )
  635. {
  636.     if(!g_bIsRunning)  return;
  637.     m_bEventOk = false;
  638.     BT_HCI_COMMAND hci_cmd;
  639.     //m_uiEventCount = 0;
  640.     Compose_Change_ACL_Packet_Type_HCI_Command( hci_cmd, m_sConnectACL );
  641.     AddTxLogToStringList( hci_cmd );
  642.     META_RESULT MetaResult = META_BT_SendHCICommand_r( m_META_HANDLE_Obj.Get_MainHandle(), 10000, &hci_cmd, ::CNF_ChangeACLPacketTypeHCIEvent, NULL, 0x1D );
  643.     if( (META_SUCCESS != MetaResult) || (!m_bEventOk) )
  644.     {
  645.         if( META_TIMEOUT == MetaResult )
  646.         {
  647.             Confirm( METAAPP_TIMEOUT );
  648.             return;
  649.         }
  650.         else if( META_CANCEL == MetaResult )
  651.         {
  652.             Confirm( METAAPP_CANCEL );
  653.             return;
  654.         }
  655.         else
  656.         {
  657.             Confirm( METAAPP_FAIL );
  658.             return;
  659.         }
  660.     }
  661.     ActiveMan->SetActiveFunction( ::REQ_Finish );
  662. }
  663. //---------------------------------------------------------------------------
  664. void __stdcall CBTTT::CNF_ChangeACLPacketTypeHCIEvent(const BT_HCI_EVENT *cnf, const short token, void *usrData)
  665. {
  666.     if(!g_bIsRunning)  return;
  667.     if( 0xFF == cnf->m_event )  return; // LMP
  668.    // m_uiEventCount++;
  669.     AddRxLogToStringList( *cnf );
  670.     m_bEventOk = DeCompose_Change_ACL_Packet_Type_HCI_Event( *cnf );
  671. }
  672. //--------------------------------------------------------------------------
  673. void  CBTTT::Compose_Change_ACL_Packet_Type_HCI_Command( BT_HCI_COMMAND &hci_cmd, S_BT_CONNECT_ACL connect )
  674. {
  675.     hci_cmd.m_opcode = 0x040F;
  676.     hci_cmd.m_len    = 4;
  677.     Reset_HCI_Command( hci_cmd );
  678.     hci_cmd.m_cmd[0] = m_sBTTTRes.uc_h1_acl;
  679.     hci_cmd.m_cmd[1] = m_sBTTTRes.uc_h2_acl;
  680.     hci_cmd.m_cmd[2] = connect.us_acl_pkt_type & 0x00FF;
  681.     hci_cmd.m_cmd[3] = (connect.us_acl_pkt_type & 0xFF00) >> 8;
  682. }
  683. //--------------------------------------------------------------------------
  684. bool  CBTTT::DeCompose_Change_ACL_Packet_Type_HCI_Event( BT_HCI_EVENT hci_event )
  685. {
  686.     return true;
  687. }
  688. //===========================================================================
  689. ///////////////////////////      Disonnect  ACL      ////////////////////////
  690. //===========================================================================
  691. void  CBTTT::REQ_DisconnectACL_Start( S_BT_TT bt_tt )
  692. {
  693.     gs_bt_tt_ptr  = this;
  694.     g_bIsRunning  = true;
  695.     m_sBTTT = bt_tt;
  696.     ActiveMan->SetActiveFunction( ::REQ_Send_DisconnectACL_HCI_command );
  697. }
  698. //---------------------------------------------------------------------------
  699. void  CBTTT::REQ_Send_DisconnectACL_HCI_command( void )
  700. {
  701.     if(!g_bIsRunning)  return;
  702.     m_bEventOk = false;
  703.     BT_HCI_COMMAND hci_cmd;
  704.     //m_uiEventCount = 0;
  705.     Compose_DisconnectACL_HCI_Command( hci_cmd, m_sDisconnectACL );
  706.     AddTxLogToStringList( hci_cmd );
  707.     META_RESULT MetaResult = META_BT_SendHCICommand_r( m_META_HANDLE_Obj.Get_MainHandle(), 10000, &hci_cmd, ::CNF_DisconnectACLHCIEvent, NULL, 0x05 );
  708.     if( (META_SUCCESS != MetaResult) || (!m_bEventOk) )
  709.     {
  710.         if( META_TIMEOUT == MetaResult )
  711.         {
  712.             Confirm( METAAPP_TIMEOUT );
  713.             return;
  714.         }
  715.         else if( META_CANCEL == MetaResult )
  716.         {
  717.             Confirm( METAAPP_CANCEL );
  718.             return;
  719.         }
  720.         else
  721.         {
  722.             Confirm( METAAPP_FAIL );
  723.             return;
  724.         }
  725.     }
  726.     ActiveMan->SetActiveFunction( ::REQ_Finish );
  727. }
  728. //---------------------------------------------------------------------------
  729. void __stdcall CBTTT::CNF_DisconnectACLHCIEvent(const BT_HCI_EVENT *cnf, const short token, void *usrData)
  730. {
  731.     if(!g_bIsRunning)  return;
  732.     if( 0xFF == cnf->m_event )  return; // LMP
  733.    // m_uiEventCount++;
  734.     AddRxLogToStringList( *cnf );
  735.     m_bEventOk = DeCompose_DisconnectACL_HCI_Event( *cnf, m_sDisconnectACL );
  736. }
  737. //--------------------------------------------------------------------------
  738. void  CBTTT::Compose_DisconnectACL_HCI_Command( BT_HCI_COMMAND &hci_cmd, S_BT_DISCONNECT_ACL disconnect )
  739. {
  740.     // 33 8B 9E 30 0A
  741.     hci_cmd.m_opcode = 0x0406;
  742.     hci_cmd.m_len    = 3;
  743.     Reset_HCI_Command( hci_cmd );
  744.     hci_cmd.m_cmd[0] = m_sBTTTRes.uc_h1_acl;
  745.     hci_cmd.m_cmd[1] = m_sBTTTRes.uc_h2_acl;
  746.     hci_cmd.m_cmd[2] = 0x13;
  747. }
  748. //--------------------------------------------------------------------------
  749. bool  CBTTT::DeCompose_DisconnectACL_HCI_Event( BT_HCI_EVENT hci_event, S_BT_DISCONNECT_ACL disconnect )
  750. {
  751.     if( (0x05 == hci_event.m_event) && (0x00 == hci_event.m_parms[0]) )
  752.     {
  753.         m_sBTTTRes.e_acl_status = BT_ACL_STATUS_NONE;
  754.     }
  755.     return true;
  756. }
  757. //===========================================================================
  758. ///////////////////////////         TX data          ////////////////////////
  759. //===========================================================================
  760. void  CBTTT::REQ_TX_Data_Start(E_BT_TT_VER_T ver, S_BT_TT bt_tt)
  761. {
  762.     gs_bt_tt_ptr  = this;
  763.     //g_bIsRunning  = true;
  764.     m_eTtVer = ver;
  765.     m_sBTTT = bt_tt;
  766.     m_sBTTxCnf.ui_tx_pkt_length = 0;
  767.     m_sBTTxCnf.ui_used_time     = 0;
  768.     g_bTxStop = false;
  769.     ActiveMan->SetActiveFunction(::REQ_TX_Data);
  770. }
  771. //---------------------------------------------------------------------------
  772. void CBTTT::REQ_TX_Data(void)
  773. {
  774.     if (g_bTxStop)
  775.     {
  776.         return;
  777.     }
  778.     META_RESULT MetaResult;
  779.     if (BT_TT_VER_0 == m_eTtVer)
  780.     {
  781.         BT_HCI_BUFFER buffer;
  782.         buffer.m_con_hdl = (m_sBTTTRes.uc_h2_acl<<8) | m_sBTTTRes.uc_h1_acl;
  783.         buffer.m_len     = m_sBTTxPar.us_data_len;
  784.         MetaResult = META_BT_SendHCIData_r(m_META_HANDLE_Obj.Get_MainHandle(), 30000, &buffer, ::CNF_TX_Data_V0, NULL);
  785.     }
  786.     else
  787.     {
  788.         BT_HCI_TX_PURE_TEST tx_pure_req;
  789.         tx_pure_req.m_con_hdl   = (m_sBTTTRes.uc_h2_acl<<8) | m_sBTTTRes.uc_h1_acl;
  790.         tx_pure_req.m_len       = m_sBTTxPar.us_data_len;
  791.         tx_pure_req.m_total_pks = m_sBTTxPar.us_packet_count;
  792.         unsigned int timeout;
  793.         if (30000 < (tx_pure_req.m_len * tx_pure_req.m_total_pks / 10))
  794.         {
  795.             timeout = tx_pure_req.m_len * tx_pure_req.m_total_pks / 10;
  796.         }
  797.         else
  798.         {
  799.             timeout = 30000;
  800.         }
  801.         if (BT_TT_VER_1 == m_eTtVer)
  802.         {
  803.             MetaResult = META_BT_TxPureTest_r(m_META_HANDLE_Obj.Get_MainHandle(), timeout, &tx_pure_req, ::CNF_TX_Data_V1, NULL);
  804.         }
  805.         else
  806.         {
  807.             MetaResult = META_BT_TxPureTest_V2_r(m_META_HANDLE_Obj.Get_MainHandle(), timeout, &tx_pure_req, ::CNF_TX_Data_V2, NULL);
  808.         }
  809.     }
  810.     if (META_SUCCESS != MetaResult)
  811.     {
  812.         g_bTxStop = true;
  813.         if (META_TIMEOUT == MetaResult)
  814.         {
  815.             Confirm(METAAPP_TIMEOUT);
  816.         }
  817.         else if (META_CANCEL == MetaResult)
  818.         {
  819.             Confirm(METAAPP_CANCEL);
  820.         }
  821.         else
  822.         {
  823.             Confirm(METAAPP_FAIL );
  824.         }
  825.         return;
  826.     }
  827.     Confirm(METAAPP_SUCCESS);
  828. }
  829. //---------------------------------------------------------------------------
  830. void __stdcall CBTTT::CNF_TX_Data_V0(const BT_HCI_PACKET *cnf, const short token, void *usrData)
  831. {
  832.     if (g_bTxStop)
  833.     {
  834.         return;
  835.     }
  836.     //m_sBTTxCnf.ui_tx_pkt_count++;
  837.     m_sBTTxCnf.ui_tx_pkt_length += cnf->m_len;
  838.    // PostMessage(
  839.    //                      m_sBTTT.hPostMsgDestHandle,
  840.    //                      WM_ML_BT_TT_TX_STATUS,
  841.    //                      m_sBTTxCnf.ui_tx_pkt_count,
  842.    //                      0
  843.    //                     );
  844.     PostMessage(m_sBTTT.hPostMsgDestHandle,
  845.                 WM_ML_BT_TT_TX_STATUS,
  846.                 m_sBTTxCnf.ui_tx_pkt_length,
  847.                 0
  848.                 );
  849.     if (m_sBTTxCnf.ui_tx_pkt_length >= (unsigned int) (m_sBTTxPar.us_packet_count*m_sBTTxPar.us_data_len))
  850.     {
  851.         g_bTxStop = true;
  852.     }
  853.     else
  854.     {
  855.         ActiveMan->SetActiveFunction(::REQ_TX_Data );
  856.         return;
  857.     }
  858. }
  859. //---------------------------------------------------------------------------
  860. //void __stdcall CBTTT::CNF_TX_Data(const BT_HCI_PACKET *cnf, const short token, void *usrData)
  861. void __stdcall CBTTT::CNF_TX_Data_V1(const BT_HCI_TX_PURE_TEST_STAT *cnf, const short token, void *usrData)
  862. {
  863.     if (g_bTxStop)
  864.     {
  865.         return;
  866.     }
  867.    // if (cnf->status != 0)
  868.    // {
  869.    //     Confirm(METAAPP_FAIL);
  870.    //     return;
  871.    // }
  872.     m_sBTTxCnf.ui_tx_pkt_length += cnf->m_len;
  873.     m_sBTTxCnf.ui_used_time     += cnf->m_used_time;
  874.     PostMessage(
  875.                          m_sBTTT.hPostMsgDestHandle,
  876.                          WM_ML_BT_TT_TX_STATUS,
  877.                          m_sBTTxCnf.ui_tx_pkt_length,
  878.                          m_sBTTxCnf.ui_used_time
  879.                         );
  880.    // if( (m_sBTTxCnf.us_tx_pkt_count < m_sBTTxPar.us_packet_count) && (! g_bTxStop) )
  881.    // {
  882.    //     ActiveMan->SetActiveFunction( ::REQ_TX_Data );
  883.    //     return;
  884.    // }
  885.     if (m_sBTTxCnf.ui_tx_pkt_length >= (unsigned int) (m_sBTTxPar.us_packet_count*m_sBTTxPar.us_data_len))
  886.     {
  887.         g_bTxStop = true;
  888.     }
  889. }
  890. //---------------------------------------------------------------------------
  891. void __stdcall CBTTT::CNF_TX_Data_V2(const BT_HCI_TX_PURE_TEST_STAT_V2 *cnf, const short token, void *usrData)
  892. {
  893.     if (g_bTxStop)
  894.     {
  895.         return;
  896.     }
  897.     m_sBTTxCnf.ui_tx_pkt_length = cnf->m_u2PktSentNum * m_sBTTxPar.us_data_len;
  898.     m_sBTTxCnf.ui_used_time     = cnf->m_u4UsedTime;
  899.     PostMessage(
  900.                          m_sBTTT.hPostMsgDestHandle,
  901.                          WM_ML_BT_TT_TX_STATUS,
  902.                          m_sBTTxCnf.ui_tx_pkt_length,
  903.                          m_sBTTxCnf.ui_used_time
  904.                         );
  905.     if (m_sBTTxCnf.ui_tx_pkt_length >= (unsigned int) (m_sBTTxPar.us_packet_count*m_sBTTxPar.us_data_len))
  906.     {
  907.         g_bTxStop = true;
  908.     }
  909. }
  910. //===========================================================================
  911. ///////////////////////////         RX data          ////////////////////////
  912. //===========================================================================
  913. void CBTTT::REQ_RX_Data_Start(E_BT_TT_VER_T ver, S_BT_TT bt_tt)
  914. {
  915.     gs_bt_tt_ptr  = this;
  916. //    g_bIsRunning  = true;
  917.     m_eTtVer = ver;
  918.     m_sBTTT = bt_tt;
  919.     m_sBTRxCnf.ui_rx_pkt_length = 0;
  920.     m_sBTRxCnf.ui_used_time     = 0;
  921.     g_bRxStop = false;
  922.     ActiveMan->SetActiveFunction(::REQ_RX_Data);
  923. }
  924. //---------------------------------------------------------------------------
  925. void CBTTT::REQ_RX_Data(void)
  926. {
  927.     if (g_bRxStop)
  928.     {
  929.         return;
  930.     }
  931.     BT_HCI_BUFFER buffer;
  932.     buffer.m_con_hdl = (m_sBTTTRes.uc_h2_acl << 8) | m_sBTTTRes.uc_h1_acl;
  933.     buffer.m_len     = m_sBTTxPar.us_data_len;
  934.     META_RESULT MetaResult;
  935.     switch (m_eTtVer)
  936.     {
  937.         case BT_TT_VER_0:
  938.         {
  939.             MetaResult = META_BT_ReceiveHCIData_r(m_META_HANDLE_Obj.Get_MainHandle(), ::CNF_RX_Data_V0);
  940.         }
  941.         break;
  942.         case BT_TT_VER_1:
  943.         {
  944.             MetaResult = META_BT_RxTestStart_r(m_META_HANDLE_Obj.Get_MainHandle(), 4294967295, ::CNF_RX_Data_V2);
  945.         }
  946.         break;
  947.         case BT_TT_VER_2:
  948.         {
  949.             MetaResult = META_BT_RxTestStart_V2_r(m_META_HANDLE_Obj.Get_MainHandle(), 4294967295, ::CNF_RX_Data_V2);
  950.         }
  951.         break;
  952.     }    
  953.     if (META_SUCCESS != MetaResult)
  954.     {
  955.         g_bRxStop = true;
  956.         if (META_TIMEOUT == MetaResult)
  957.         {
  958.             Confirm( METAAPP_TIMEOUT );
  959.             return;
  960.         }
  961.         else if (META_CANCEL == MetaResult)
  962.         {
  963.             Confirm(METAAPP_CANCEL);
  964.             return;
  965.         }
  966.         else
  967.         {
  968.             Confirm(METAAPP_FAIL);
  969.             return;
  970.         }
  971.     }
  972.     Confirm(METAAPP_SUCCESS);
  973. }
  974. //---------------------------------------------------------------------------
  975. void __stdcall CBTTT::CNF_RX_Data_V0(const BT_HCI_BUFFER *cnf, const short token, void *usrData)
  976. {
  977.    // if(!g_bIsRunning)  return;
  978.     if (g_bRxStop)
  979.     {
  980.         return;
  981.     }
  982.     //g_sBTRxCnf.ui_rx_pkt_count += (cnf->m_len);
  983.     m_sBTRxCnf.ui_rx_pkt_length += cnf->m_len;
  984.     
  985.    // PostMessage(
  986.    //                      m_sBTTT.hPostMsgDestHandle,
  987.    //                      WM_ML_BT_TT_RX_STATUS,
  988.    //                      g_sBTRxCnf.ui_rx_pkt_count,
  989.    //                      0
  990.    //                     );
  991.      PostMessage(
  992.                          m_sBTTT.hPostMsgDestHandle,
  993.                          WM_ML_BT_TT_RX_STATUS,
  994.                          m_sBTRxCnf.ui_rx_pkt_length,
  995.                          0
  996.                         );
  997. }
  998. //---------------------------------------------------------------------------
  999. //void __stdcall CBTTT::CNF_RX_Data(const BT_HCI_BUFFER *cnf, const short token, void *usrData)
  1000. void __stdcall CBTTT::CNF_RX_Data_V2(const BT_HCI_RX_PURE_TEST_STAT *cnf, const short token, void *usrData)
  1001. {
  1002.     if (!g_bIsRunning || g_bRxStop)  return;
  1003.   //  if (cnf->status != 0)
  1004.   //  {
  1005.   //      Confirm(METAAPP_FAIL);
  1006.   //      return;
  1007.   //  }
  1008.     m_sBTRxCnf.ui_rx_pkt_length += cnf->m_len;
  1009.     m_sBTRxCnf.ui_used_time     += cnf->m_used_time;
  1010.     PostMessage(
  1011.                          m_sBTTT.hPostMsgDestHandle,
  1012.                          WM_ML_BT_TT_RX_STATUS,
  1013.                          m_sBTRxCnf.ui_rx_pkt_length,
  1014.                          m_sBTRxCnf.ui_used_time
  1015.                         );
  1016. }
  1017. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  1018. void  CBTTT::REQ_Stop_RX_Data_Start(S_BT_TT bt_tt)
  1019. {
  1020.     gs_bt_tt_ptr  = this;
  1021.     g_bIsRunning  = true;
  1022.     m_sBTTT = bt_tt;
  1023.     m_sBTRxCnf.ui_rx_pkt_length = 0;
  1024.     m_sBTRxCnf.ui_used_time     = 0;
  1025.     g_bRxStop = true;
  1026.     META_CancelAllBlockingCall_r(m_META_HANDLE_Obj.Get_MainHandle());
  1027.     ActiveMan->SetActiveFunction(::REQ_Stop_RX_Data);
  1028. }
  1029. //---------------------------------------------------------------------------
  1030. void  CBTTT::REQ_Stop_RX_Data(void)
  1031. {
  1032.     if(!g_bIsRunning)  return;
  1033.     META_RESULT MetaResult = META_BT_RxTestEnd_r(m_META_HANDLE_Obj.Get_MainHandle(), 500);
  1034.     if (META_SUCCESS != MetaResult)
  1035.     {
  1036.         if (META_TIMEOUT == MetaResult)
  1037.         {
  1038.             Confirm( METAAPP_TIMEOUT );
  1039.             return;
  1040.         }
  1041.         else if (META_CANCEL == MetaResult)
  1042.         {
  1043.             Confirm(METAAPP_CANCEL);
  1044.             return;
  1045.         }
  1046.         else
  1047.         {
  1048.             Confirm(METAAPP_FAIL);
  1049.             return;
  1050.         }
  1051.     }
  1052. }
  1053. //---------------------------------------------------------------------------
  1054. void  CBTTT::Reset_HCI_Command( BT_HCI_COMMAND &hci_cmd )
  1055. {
  1056.     for( int i=0; i<(sizeof(hci_cmd.m_cmd)/sizeof(hci_cmd.m_cmd[0])); i++ )
  1057.     {
  1058.         hci_cmd.m_cmd[i] = 0;
  1059.     }
  1060. }
  1061. //===========================================================================
  1062. ////////////////////////////        Query          //////////////////////////
  1063. //===========================================================================
  1064. E_BT_TT_VER_T CBTTT::Query_TtTestVersion(void)
  1065. {
  1066.     META_RESULT MetaResult = META_QueryIfFunctionSupportedByTarget_r(m_META_HANDLE_Obj.Get_MainHandle(), 1000, "META_BT_TxPureTest_V2_r");
  1067.     if (META_SUCCESS != MetaResult)
  1068.     {
  1069.         return BT_TT_VER_0;
  1070.     }
  1071.     return BT_TT_VER_2;
  1072. }
  1073. //===========================================================================
  1074. ////////////////////////////   Log  information   ///////////////////////////
  1075. //===========================================================================
  1076. void  CBTTT::AddTxLogToStringList( BT_HCI_COMMAND hci_cmd  )
  1077. {
  1078.     char        str[1024];
  1079.     AnsiString as_log;
  1080.     sprintf( str, "%X,", hci_cmd.m_opcode & 0x00FF );
  1081.     AnsiString as_opcode_low(str);
  1082.     sprintf( str, "%X,", (hci_cmd.m_opcode & 0xFF00)>>8 );
  1083.     AnsiString as_opcode_high(str);
  1084.     Array_To_Hex_String_UnsignedChar( str, hci_cmd.m_cmd, hci_cmd.m_len, ',' );
  1085.     AnsiString as_cmd( (const char*)str );
  1086.     if( 0 == hci_cmd.m_len )
  1087.        as_cmd = "";
  1088.     sprintf( str, "%X,", hci_cmd.m_len );
  1089.     AnsiString as_length(str);
  1090.     as_log = "[" + TimeToStr(Time()) + "] TX: " + as_opcode_low + as_opcode_high + as_length  + as_cmd;
  1091.     m_sBTTT.log->Add( as_log );
  1092.     PostMessage(
  1093.                          m_sBTTT.hPostMsgDestHandle,
  1094.                          WM_ML_BT_PRINT_MSG,
  1095.                          PAGEIDX_BT_TT,
  1096.                          0
  1097.                         );
  1098. }
  1099. //--------------------------------------------------------------------------
  1100. void  CBTTT::AddRxLogToStringList( BT_HCI_EVENT hci_event )
  1101. {
  1102.     unsigned char        str[1024];
  1103.     AnsiString as_log;
  1104.     sprintf( str, "%X,", hci_event.m_event );
  1105.     AnsiString as_event( (const char*) str );
  1106.     sprintf( str, "%X,", hci_event.m_len );
  1107.     AnsiString as_length( (const char*) str );
  1108.     Array_To_Hex_String_UnsignedChar( str, hci_event.m_parms, hci_event.m_len, ',' );
  1109.     AnsiString as_param( (const char*) str );
  1110.     if(  0 == hci_event.m_len )
  1111.         as_param = "";
  1112.     as_log = "[" + TimeToStr(Time()) + "] RX: " + as_event + as_length + as_param;
  1113.     m_sBTTT.log->Add( as_log );
  1114.     PostMessage(
  1115.                          m_sBTTT.hPostMsgDestHandle,
  1116.                          WM_ML_BT_PRINT_MSG,
  1117.                          PAGEIDX_BT_TT,
  1118.                          0
  1119.                         );
  1120. }
  1121. //===========================================================================
  1122. ////////////////////////////   Global  information   ////////////////////////
  1123. //===========================================================================
  1124. E_METAAPP_RESULT_T CBTTT::Get_ConfirmState(void)
  1125. {
  1126.     return  m_eConfirmState;
  1127. }
  1128. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  1129. void CBTTT::Set_ScanParameter( S_BT_SCAN scan )
  1130. {   m_sScan = scan;
  1131. }
  1132. //--------------------------------------------------------------------------
  1133. void CBTTT::Set_ConnectACLParameter( S_BT_CONNECT_ACL connect )
  1134. {   m_sConnectACL = connect;
  1135. }
  1136. //---------------------------------------------------------------------------
  1137. void CBTTT::Set_DisconnectACLParameter( S_BT_DISCONNECT_ACL disconnect )
  1138. {   m_sDisconnectACL = disconnect;
  1139. }
  1140. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  1141. void  CBTTT::Set_TxParameter( S_BT_TT_TX_PARAMETER  par)
  1142. {   m_sBTTxPar = par;
  1143. }
  1144. //---------------------------------------------------------------------------
  1145. S_BT_TT_RES CBTTT::Get_TTResult( void )
  1146. {   return  m_sBTTTRes;
  1147. }
  1148. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  1149. E_BT_TT_VER_T CBTTT::Get_TtTestVer(void)
  1150. {
  1151.     return m_eTtVer;
  1152. }