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

MTK

开发平台:

C++ Builder

  1. #ifndef  _BT_COMMON_H_
  2. #include "bt_common.h"
  3. #endif
  4. #ifndef _BT_MT_META_H_
  5. #include "bt_mt_meta.h"
  6. #endif
  7. //=============================================================================
  8. static CBTMTMETA* gs_bt_mt_meta_ptr;
  9. static bool g_bIsRunning = false;
  10. //------------------------------------------------------------------------------
  11. static void __stdcall CNF_AutoHCIEvent0(const BT_HCI_EVENT *cnf, const short token, void *usrData)
  12. {
  13.     gs_bt_mt_meta_ptr->CNF_AutoHCIEvent0(cnf, token, usrData);
  14. }
  15. //------------------------------------------------------------------------------
  16. static void __stdcall CNF_AutoHCIEvent1(const BT_HCI_EVENT *cnf, const short token, void *usrData)
  17. {
  18.     gs_bt_mt_meta_ptr->CNF_AutoHCIEvent1(cnf, token, usrData);
  19. }
  20. //------------------------------------------------------------------------------
  21. static void __stdcall CNF_HCIEvent0(const BT_HCI_EVENT *cnf, const short token, void *usrData)
  22. {
  23.     gs_bt_mt_meta_ptr->CNF_HCIEvent0(cnf, token, usrData);
  24. }
  25. //------------------------------------------------------------------------------
  26. static void __stdcall CNF_HCIEvent1(const BT_HCI_EVENT *cnf, const short token, void *usrData)
  27. {
  28.     gs_bt_mt_meta_ptr->CNF_HCIEvent1(cnf, token, usrData);
  29. }
  30. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  31. static void __stdcall CNF_TxAclCallback0(const BT_HCI_PACKET *cnf, const short token, void *usrData)
  32. {
  33.     gs_bt_mt_meta_ptr->CNF_TxAclCallback0(cnf, token, usrData);
  34. }
  35. //-----------------------------------------------------------------------------
  36. static void __stdcall CNF_TxAclCallback1(const BT_HCI_PACKET *cnf, const short token, void *usrData)
  37. {
  38.     gs_bt_mt_meta_ptr->CNF_TxAclCallback1(cnf, token, usrData);
  39. }
  40. //-----------------------------------------------------------------------------
  41. static void __stdcall CNF_RxAclCallback0(const BT_HCI_BUFFER *cnf, const short token, void *usrData)
  42. {
  43.     gs_bt_mt_meta_ptr->CNF_RxAclCallback0(cnf, token, usrData);
  44. }
  45. //-----------------------------------------------------------------------------
  46. static void __stdcall CNF_RxAclCallback1(const BT_HCI_BUFFER *cnf, const short token, void *usrData)
  47. {
  48.     gs_bt_mt_meta_ptr->CNF_RxAclCallback1(cnf, token, usrData);
  49. }
  50. //=============================================================================
  51. CBTMTMETA::CBTMTMETA(void)
  52. {
  53.     //m_iEventLen  = 0;
  54.     //m_iEventType = EVTTYPE_NONE;
  55.     g_bIsRunning = false;
  56.     m_bRegAutoCallback[0] = false;
  57.     m_bRegAutoCallback[1] = false;
  58.     m_bCallAutoCallback[0] = false;
  59.     m_bCallAutoCallback[1] = false;
  60.     //m_bRegAclRxCallback[0] = false;
  61. }
  62. //=============================================================================
  63. ////////////////////////////  HCI command/event   /////////////////////////////
  64. //=============================================================================
  65. bool CBTMTMETA::RegAutoCallBack0(void)
  66. {
  67.     m_bCallAutoCallback[0] = false;
  68.     META_RESULT MetaResult = META_BT_RegisterAutoCallback_r(m_META_HANDLE_Obj.Get_MainHandle(), ::CNF_AutoHCIEvent0);
  69.     if (META_SUCCESS != MetaResult)
  70.     {
  71.         return false;
  72.     }
  73.     m_bRegAutoCallback[0] = true;
  74.     return true;
  75. }
  76. //-----------------------------------------------
  77. bool CBTMTMETA::SendCommand(BT_META_HCI_T cmd)
  78. {
  79.     g_bIsRunning = true;
  80.     gs_bt_mt_meta_ptr = this;
  81.     META_RESULT MetaResult;
  82.     m_iEventIdx = 0;
  83.     m_iAutoEventIdx = 0;
  84.     m_bEventOk = false;
  85.     m_sHciCmd = cmd;
  86.     unsigned char uc_last_event = cmd.s_hci_event[cmd.i_event_num - 1].m_event;
  87.     if (BT1 == cmd.e_bt_device)
  88.     {
  89.         if (BT_META == cmd.e_bt_trans[1])
  90.         {
  91.             if (!m_bCallAutoCallback[1])
  92.             {
  93.                 MetaResult = META_BT_RegisterAutoCallback_r(m_META_HANDLE_Obj.Get_SecondHandle(), ::CNF_AutoHCIEvent1);
  94.                 if (META_SUCCESS != MetaResult)
  95.                 {
  96.                     return false;
  97.                 }
  98.                 m_bRegAutoCallback[1] = true;
  99.             }
  100.         }
  101.         if (m_bRegAutoCallback[0])
  102.         {
  103.             MetaResult = META_BT_RemoveAutoCallback_r(m_META_HANDLE_Obj.Get_MainHandle());
  104.             if (META_SUCCESS != MetaResult)
  105.             {
  106.                 return false;
  107.             }
  108.             m_bRegAutoCallback[0] = false;
  109.         }
  110.         MetaResult = META_BT_SendHCICommand_r(m_META_HANDLE_Obj.Get_MainHandle(), 10000, &cmd.s_hci_cmd, ::CNF_HCIEvent0, NULL, uc_last_event);
  111.         if ((META_SUCCESS != MetaResult) || (!m_bEventOk))
  112.         {
  113.             return false;
  114.         }
  115.     }
  116.     else
  117.     {
  118.         if (!m_bCallAutoCallback[0])
  119.         {
  120.             MetaResult = META_BT_RegisterAutoCallback_r(m_META_HANDLE_Obj.Get_MainHandle(), ::CNF_AutoHCIEvent0);
  121.             if (META_SUCCESS != MetaResult)
  122.             {
  123.                 return false;
  124.             }
  125.             m_bRegAutoCallback[0] = true;
  126.         }
  127.         if (m_bRegAutoCallback[1])
  128.         {
  129.             MetaResult = META_BT_RemoveAutoCallback_r(m_META_HANDLE_Obj.Get_SecondHandle());
  130.             if (META_SUCCESS != MetaResult)
  131.             {
  132.                 return false;
  133.             }
  134.             m_bRegAutoCallback[1] = false;
  135.         }
  136.         MetaResult = META_BT_SendHCICommand_r(m_META_HANDLE_Obj.Get_SecondHandle(), 10000, &cmd.s_hci_cmd, ::CNF_HCIEvent1, NULL, uc_last_event);
  137.         if ((META_SUCCESS != MetaResult) || (!m_bEventOk))
  138.         {
  139.             return false;
  140.         }
  141.     }
  142.     return true;
  143. }
  144. //---------------------------------------------------------------------------
  145. void __stdcall CBTMTMETA::CNF_AutoHCIEvent0(const BT_HCI_EVENT *cnf, const short token, void *usrData)
  146. {
  147.     if (!g_bIsRunning)
  148.     {
  149.         return;
  150.     }
  151.     m_bCallAutoCallback[0] = true;
  152.     if ((BT_STATUS_SUCCESS != cnf->m_status)                                  ||
  153.         (m_sHciCmd.s_hci_auto_event[m_iAutoEventIdx].m_event != cnf->m_event) ||
  154.         (m_sHciCmd.s_hci_auto_event[m_iAutoEventIdx].m_len  != cnf->m_len)
  155.        )
  156.     {
  157.         m_bEventOk = false;
  158.         g_bIsRunning = false;
  159.         return;
  160.     }
  161.     for (int i = 0; i < m_sHciCmd.s_hci_auto_event[m_iAutoEventIdx].m_len; i++)
  162.     {
  163.         if (m_sHciCmd.s_hci_auto_event[m_iAutoEventIdx].m_parms[i] != cnf->m_parms[i])
  164.         {
  165.             m_bEventOk = false;
  166.             g_bIsRunning = false;
  167.             return;
  168.         }
  169.     }
  170.     m_iAutoEventIdx++;
  171.     m_bEventOk = true;
  172. }
  173. //---------------------------------------------------------------------------
  174. void __stdcall CBTMTMETA::CNF_AutoHCIEvent1(const BT_HCI_EVENT *cnf, const short token, void *usrData)
  175. {
  176.     if (!g_bIsRunning)
  177.     {
  178.         return;
  179.     }
  180.     m_bCallAutoCallback[1] = true;
  181.     if ((BT_STATUS_SUCCESS != cnf->m_status)                                  ||
  182.         (m_sHciCmd.s_hci_auto_event[m_iAutoEventIdx].m_event != cnf->m_event) ||
  183.         (m_sHciCmd.s_hci_auto_event[m_iAutoEventIdx].m_len  != cnf->m_len)
  184.        )
  185.     {
  186.         m_bEventOk = false;
  187.         g_bIsRunning = false;
  188.         return;
  189.     }
  190.     for (int i = 0; i < m_sHciCmd.s_hci_auto_event[m_iAutoEventIdx].m_len; i++)
  191.     {
  192.         if (m_sHciCmd.s_hci_auto_event[m_iAutoEventIdx].m_parms[i] != cnf->m_parms[i])
  193.         {
  194.             m_bEventOk = false;
  195.             g_bIsRunning = false;
  196.             return;
  197.         }
  198.     }
  199.     m_iAutoEventIdx++;
  200.     m_bEventOk = true;
  201. }
  202. //---------------------------------------------------------------------------
  203. void __stdcall CBTMTMETA::CNF_HCIEvent0(const BT_HCI_EVENT *cnf, const short token, void *usrData)
  204. {
  205.     if (!g_bIsRunning)
  206.     {
  207.         return;
  208.     }
  209.     if ((BT_STATUS_SUCCESS != cnf->m_status)                         ||
  210.         (m_sHciCmd.s_hci_event[m_iEventIdx].m_event != cnf->m_event) ||
  211.         (m_sHciCmd.s_hci_event[m_iEventIdx].m_len  != cnf->m_len)
  212.        )
  213.     {
  214.         m_bEventOk = false;
  215.         g_bIsRunning = false;
  216.         return;
  217.     }
  218.     for (int i = 0; i < m_sHciCmd.s_hci_event[m_iEventIdx].m_len; i++)
  219.     {
  220.         if (m_sHciCmd.s_hci_event[m_iEventIdx].m_parms[i] != cnf->m_parms[i])
  221.         {
  222.             m_bEventOk = false;
  223.             g_bIsRunning = false;
  224.             return;
  225.         }
  226.     }
  227.     m_iEventIdx++;
  228.     m_bEventOk = true;
  229. }
  230. //---------------------------------------------------------------------------
  231. void __stdcall CBTMTMETA::CNF_HCIEvent1(const BT_HCI_EVENT *cnf, const short token, void *usrData)
  232. {
  233.     if (!g_bIsRunning)
  234.     {
  235.         return;
  236.     }
  237.     if ((BT_STATUS_SUCCESS != cnf->m_status)                         ||
  238.         (m_sHciCmd.s_hci_event[m_iEventIdx].m_event != cnf->m_event) ||
  239.         (m_sHciCmd.s_hci_event[m_iEventIdx].m_len  != cnf->m_len)
  240.        )
  241.     {
  242.         m_bEventOk = false;
  243.         g_bIsRunning = false;
  244.         return;
  245.     }
  246.     for (int i = 0; i < m_sHciCmd.s_hci_event[m_iEventIdx].m_len; i++)
  247.     {
  248.         if (m_sHciCmd.s_hci_event[m_iEventIdx].m_parms[i] != cnf->m_parms[i])
  249.         {
  250.             m_bEventOk = false;
  251.             g_bIsRunning = false;
  252.             return;
  253.         }
  254.     }
  255.     m_iEventIdx++;
  256.     m_bEventOk = true;
  257. }
  258. //=============================================================================
  259. ////////////////////////////////   ACL data      //////////////////////////////
  260. //=============================================================================
  261. bool CBTMTMETA::RegAclRxData0(void)
  262. {
  263.     m_bRegAclRxCallback[0] = false;
  264.     META_RESULT MetaResult = META_BT_ReceiveHCIData_r(m_META_HANDLE_Obj.Get_MainHandle(), ::CNF_RxAclCallback0);
  265.     if (META_SUCCESS != MetaResult)
  266.     {
  267.         return false;
  268.     }
  269.     m_bRegAclRxCallback[0] = true;
  270.     return true;
  271. }
  272. //-----------------------------------------------------------------------------
  273. bool CBTMTMETA::SendAclData(BT_META_ACL_DATA_T acl_data)
  274. {
  275.     g_bIsRunning = true;
  276.     gs_bt_mt_meta_ptr = this;
  277.     META_RESULT MetaResult;
  278.     m_bAclDataOk = false;
  279.     m_sTxAclData = acl_data;
  280.     if (BT1 == acl_data.e_bt_device)
  281.     {
  282.         if (BT_META == acl_data.e_bt_trans[1])
  283.         {
  284.             if (!m_bCallAclRxCallback[1])
  285.             {
  286.                 MetaResult = META_BT_ReceiveHCIData_r(m_META_HANDLE_Obj.Get_SecondHandle(), ::CNF_RxAclCallback1);
  287.                 if (META_SUCCESS != MetaResult)
  288.                 {
  289.                    return false;
  290.                 }
  291.                 m_bCallAclRxCallback[1] = true;
  292.             }    
  293.         }
  294.         if (m_bRegAclRxCallback[0])
  295.         {
  296.             MetaResult = META_BT_RemoveReceiveHCIDataCallback_r(m_META_HANDLE_Obj.Get_MainHandle());
  297.             if (META_SUCCESS != MetaResult)
  298.             {
  299.                 return false;
  300.             }
  301.             m_bRegAclRxCallback[0] = false;
  302.         }
  303.         MetaResult = META_BT_SendHCIData_r(m_META_HANDLE_Obj.Get_MainHandle(), 10000, &acl_data.s_tx_acl_data, ::CNF_TxAclCallback0, NULL);
  304.         if ((META_SUCCESS != MetaResult) || (!m_bAclDataOk))
  305.         {
  306.             return false;
  307.         }
  308.     }
  309.     else
  310.     {
  311.         if (!m_bRegAclRxCallback[0])
  312.         {
  313.             MetaResult = META_BT_ReceiveHCIData_r(m_META_HANDLE_Obj.Get_MainHandle(), ::CNF_RxAclCallback0);
  314.             if (META_SUCCESS != MetaResult)
  315.             {
  316.                 return false;
  317.             }
  318.             m_bRegAclRxCallback[0] = true;
  319.         }
  320.         if (m_bRegAclRxCallback[1])
  321.         {
  322.             MetaResult = META_BT_RemoveReceiveHCIDataCallback_r(m_META_HANDLE_Obj.Get_SecondHandle());
  323.             if (META_SUCCESS != MetaResult)
  324.             {
  325.                 return false;
  326.             }
  327.             m_bRegAclRxCallback[1] = false;
  328.         }
  329.         MetaResult = META_BT_SendHCIData_r(m_META_HANDLE_Obj.Get_SecondHandle(), 10000, &acl_data.s_tx_acl_data, ::CNF_TxAclCallback1, NULL);
  330.         if ((META_SUCCESS != MetaResult) || (!m_bAclDataOk))
  331.         {
  332.             return false;
  333.         }
  334.     }
  335.     return true;
  336. }
  337. //---------------------------------------------------------------------------
  338. void __stdcall CBTMTMETA::CNF_RxAclCallback0(const BT_HCI_BUFFER *cnf, const short token, void *usrData)
  339. {
  340.     if (!g_bIsRunning)
  341.     {
  342.         return;
  343.     }
  344.     m_bCallAclRxCallback[0] = true;
  345.     if ((m_sRxAclData.s_rx_acl_data.m_con_hdl != cnf->m_con_hdl) ||
  346.         (m_sRxAclData.s_rx_acl_data.m_len != cnf->m_len)
  347.        )
  348.     {
  349.         m_bAclDataOk = false;
  350.         g_bIsRunning = false;
  351.         return;
  352.     }
  353.     for (int i = 0; i < m_sRxAclData.s_rx_acl_data.m_len; i++)
  354.     {
  355.         if (m_sRxAclData.s_rx_acl_data.m_buffer[i] != cnf->m_buffer[i])
  356.         {
  357.             m_bAclDataOk = false;
  358.             g_bIsRunning = false;
  359.             return;
  360.         }
  361.     }
  362.     m_bAclDataOk = true;
  363. }
  364. //---------------------------------------------------------------------------
  365. void __stdcall CBTMTMETA::CNF_RxAclCallback1(const BT_HCI_BUFFER *cnf, const short token, void *usrData)
  366. {
  367.     if (!g_bIsRunning)
  368.     {
  369.         return;
  370.     }
  371.     m_bCallAclRxCallback[1] = true;
  372.     if ((m_sRxAclData.s_rx_acl_data.m_con_hdl != cnf->m_con_hdl) ||
  373.         (m_sRxAclData.s_rx_acl_data.m_len != cnf->m_len)
  374.        )
  375.     {
  376.         m_bAclDataOk = false;
  377.         g_bIsRunning = false;
  378.         return;
  379.     }
  380.     for (int i = 0; i < m_sRxAclData.s_rx_acl_data.m_len; i++)
  381.     {
  382.         if (m_sRxAclData.s_rx_acl_data.m_buffer[i] != cnf->m_buffer[i])
  383.         {
  384.             m_bAclDataOk = false;
  385.             g_bIsRunning = false;
  386.             return;
  387.         }
  388.     }
  389.     m_bAclDataOk = true;
  390. }
  391. //---------------------------------------------------------------------------
  392. void __stdcall CBTMTMETA::CNF_TxAclCallback0(const BT_HCI_PACKET *cnf, const short token, void *usrData)
  393. {
  394.     if (!g_bIsRunning)
  395.     {
  396.         return;
  397.     }
  398.     if (m_sTxAclData.s_rx_acl_data.m_len != cnf->m_len)
  399.     {
  400.         m_bAclDataOk = false;
  401.         g_bIsRunning = false;
  402.         return;
  403.     }
  404.     for (int i = 0; i < m_sTxAclData.s_tx_acl_data.m_len; i++)
  405.     {
  406.         if (m_sTxAclData.s_tx_acl_data.m_buffer[i] != cnf->m_data[i])
  407.         {
  408.             m_bAclDataOk = false;
  409.             g_bIsRunning = false;
  410.             return;
  411.         }
  412.     }
  413.     m_bAclDataOk = true;
  414. }
  415. //---------------------------------------------------------------------------
  416. void __stdcall CBTMTMETA::CNF_TxAclCallback1(const BT_HCI_PACKET *cnf, const short token, void *usrData)
  417. {
  418.     if (!g_bIsRunning)
  419.     {
  420.         return;
  421.     }
  422.     if (m_sTxAclData.s_rx_acl_data.m_len != cnf->m_len)
  423.     {
  424.         m_bAclDataOk = false;
  425.         g_bIsRunning = false;
  426.         return;
  427.     }
  428.     for (int i = 0; i < m_sTxAclData.s_rx_acl_data.m_len; i++)
  429.     {
  430.         if (m_sTxAclData.s_rx_acl_data.m_buffer[i] != cnf->m_data[i])
  431.         {
  432.             m_bAclDataOk = false;
  433.             g_bIsRunning = false;
  434.             return;
  435.         }
  436.     }
  437.     m_bAclDataOk = true;
  438. }
  439. //=============================================================================
  440. /////////////////////////////  Export  information  ///////////////////////////
  441. //=============================================================================
  442. bool CBTMTMETA::Get_EventOk(void)
  443. {
  444.     return m_bEventOk;
  445. }
  446. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  447. bool CBTMTMETA::Get_CallAutoCallback(int idx)
  448. {
  449.     return m_bCallAutoCallback[idx];
  450. }
  451. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  452. void CBTMTMETA::Set_HciCmd(BT_META_HCI_T cmd)
  453. {
  454.     m_sHciCmd = cmd;
  455. }