Home | History | Annotate | Download | only in hf_client
      1 /******************************************************************************
      2  *
      3  *  Copyright (c) 2014 The Android Open Source Project
      4  *  Copyright (C) 2003-2012 Broadcom Corporation
      5  *
      6  *  Licensed under the Apache License, Version 2.0 (the "License");
      7  *  you may not use this file except in compliance with the License.
      8  *  You may obtain a copy of the License at:
      9  *
     10  *  http://www.apache.org/licenses/LICENSE-2.0
     11  *
     12  *  Unless required by applicable law or agreed to in writing, software
     13  *  distributed under the License is distributed on an "AS IS" BASIS,
     14  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     15  *  See the License for the specific language governing permissions and
     16  *  limitations under the License.
     17  *
     18  ******************************************************************************/
     19 
     20 /******************************************************************************
     21  *
     22  *  This is the implementation of the API for the handsfree (HF role)
     23  *  subsystem of BTA
     24  *
     25  ******************************************************************************/
     26 
     27 #include <string.h>
     28 #include "bta_hf_client_api.h"
     29 #include "bta_hf_client_int.h"
     30 #include "bd.h"
     31 
     32 /*****************************************************************************
     33 **  Constants and data types
     34 *****************************************************************************/
     35 static const tBTA_SYS_REG bta_hf_client_reg =
     36 {
     37     bta_hf_client_hdl_event,
     38     BTA_HfClientDisable
     39 };
     40 
     41 
     42 /*****************************************************************************
     43 **  External Function Declarations
     44 *****************************************************************************/
     45 
     46 /*******************************************************************************
     47 **
     48 ** Function         BTA_HfClientEnable
     49 **
     50 ** Description      Enable the HF CLient service. When the enable
     51 **                  operation is complete the callback function will be
     52 **                  called with a BTA_HF_CLIENT_ENABLE_EVT. This function must
     53 **                  be called before other function in the HF CLient API are
     54 **                  called.
     55 **
     56 ** Returns          BTA_SUCCESS if OK, BTA_FAILURE otherwise.
     57 **
     58 *******************************************************************************/
     59 BTA_API tBTA_STATUS BTA_HfClientEnable(tBTA_HF_CLIENT_CBACK *p_cback)
     60 {
     61     tBTA_HF_CLIENT_API_ENABLE  *p_buf;
     62     UINT8       idx;
     63 
     64     if (bta_sys_is_register (BTA_ID_HS))
     65     {
     66         APPL_TRACE_ERROR("BTA HF Client is already enabled, ignoring ...");
     67         return BTA_FAILURE;
     68     }
     69 
     70     /* register with BTA system manager */
     71     bta_sys_register(BTA_ID_HS, &bta_hf_client_reg);
     72 
     73     if ((p_buf = (tBTA_HF_CLIENT_API_ENABLE *) GKI_getbuf(sizeof(tBTA_HF_CLIENT_API_ENABLE))) != NULL)
     74     {
     75         p_buf->hdr.event = BTA_HF_CLIENT_API_ENABLE_EVT;
     76         p_buf->p_cback = p_cback;
     77         bta_sys_sendmsg(p_buf);
     78     }
     79 
     80     return BTA_SUCCESS;
     81 }
     82 
     83 /*******************************************************************************
     84 **
     85 ** Function         BTA_HfClientDisable
     86 **
     87 ** Description      Disable the HF Client service
     88 **
     89 **
     90 ** Returns          void
     91 **
     92 *******************************************************************************/
     93 BTA_API void BTA_HfClientDisable(void)
     94 {
     95     BT_HDR  *p_buf;
     96 
     97     if ((p_buf = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL)
     98     {
     99         p_buf->event = BTA_HF_CLIENT_API_DISABLE_EVT;
    100         bta_sys_sendmsg(p_buf);
    101     }
    102 }
    103 
    104 /*******************************************************************************
    105 **
    106 ** Function         BTA_HfClientRegister
    107 **
    108 ** Description      Register an HF Client service.
    109 **
    110 **
    111 ** Returns          void
    112 **
    113 *******************************************************************************/
    114 BTA_API void BTA_HfClientRegister(tBTA_SEC sec_mask, tBTA_HF_CLIENT_FEAT features,
    115                                                         char *p_service_name)
    116 {
    117     tBTA_HF_CLIENT_API_REGISTER    *p_buf;
    118 
    119     if ((p_buf = (tBTA_HF_CLIENT_API_REGISTER *) GKI_getbuf(sizeof(tBTA_HF_CLIENT_API_REGISTER))) != NULL)
    120     {
    121         p_buf->hdr.event = BTA_HF_CLIENT_API_REGISTER_EVT;
    122         p_buf->features = features;
    123         p_buf->sec_mask = sec_mask;
    124         if(p_service_name)
    125         {
    126             BCM_STRNCPY_S(p_buf->name, BTA_SERVICE_NAME_LEN+1, p_service_name, BTA_SERVICE_NAME_LEN);
    127             p_buf->name[BTA_SERVICE_NAME_LEN] = 0;
    128         }
    129         else
    130         {
    131             p_buf->name[0] = '\0';
    132         }
    133         bta_sys_sendmsg(p_buf);
    134     }
    135 }
    136 
    137 /*******************************************************************************
    138 **
    139 ** Function         BTA_HfClientDeregister
    140 **
    141 ** Description      Deregister an HF Client service.
    142 **
    143 **
    144 ** Returns          void
    145 **
    146 *******************************************************************************/
    147 BTA_API void BTA_HfClientDeregister(UINT16 handle)
    148 {
    149     BT_HDR  *p_buf;
    150 
    151      if ((p_buf = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL)
    152      {
    153          p_buf->event = BTA_HF_CLIENT_API_DEREGISTER_EVT;
    154          p_buf->layer_specific = handle;
    155          bta_sys_sendmsg(p_buf);
    156      }
    157 }
    158 
    159 /*******************************************************************************
    160 **
    161 ** Function         BTA_HfClientOpen
    162 **
    163 ** Description      Opens a connection to an audio gateway.
    164 **                  When connection is open callback function is called
    165 **                  with a BTA_AG_OPEN_EVT. Only the data connection is
    166 **                  opened. The audio connection is not opened.
    167 **
    168 **
    169 ** Returns          void
    170 **
    171 *******************************************************************************/
    172 BTA_API void BTA_HfClientOpen(UINT16 handle, BD_ADDR bd_addr, tBTA_SEC sec_mask)
    173 {
    174     tBTA_HF_CLIENT_API_OPEN  *p_buf;
    175 
    176     if ((p_buf = (tBTA_HF_CLIENT_API_OPEN *) GKI_getbuf(sizeof(tBTA_HF_CLIENT_API_OPEN))) != NULL)
    177     {
    178         p_buf->hdr.event = BTA_HF_CLIENT_API_OPEN_EVT;
    179         p_buf->hdr.layer_specific = handle;
    180         bdcpy(p_buf->bd_addr, bd_addr);
    181         p_buf->sec_mask = sec_mask;
    182         bta_sys_sendmsg(p_buf);
    183     }
    184 }
    185 
    186 /*******************************************************************************
    187 **
    188 ** Function         BTA_HfClientClose
    189 **
    190 ** Description      Close the current connection to an audio gateway.
    191 **                  Any current audio connection will also be closed
    192 **
    193 **
    194 ** Returns          void
    195 **
    196 *******************************************************************************/
    197 BTA_API void BTA_HfClientClose(UINT16 handle)
    198 {
    199     BT_HDR  *p_buf;
    200 
    201     if ((p_buf = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL)
    202     {
    203         p_buf->event = BTA_HF_CLIENT_API_CLOSE_EVT;
    204         p_buf->layer_specific = handle;
    205         bta_sys_sendmsg(p_buf);
    206     }
    207 }
    208 
    209 /*******************************************************************************
    210 **
    211 ** Function         BTA_HfCllientAudioOpen
    212 **
    213 ** Description      Opens an audio connection to the currently connected
    214 **                 audio gateway
    215 **
    216 **
    217 ** Returns          void
    218 **
    219 *******************************************************************************/
    220 BTA_API void BTA_HfClientAudioOpen(UINT16 handle)
    221 {
    222     BT_HDR  *p_buf;
    223 
    224     if ((p_buf = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL)
    225     {
    226         p_buf->event = BTA_HF_CLIENT_API_AUDIO_OPEN_EVT;
    227         p_buf->layer_specific = handle;
    228         bta_sys_sendmsg(p_buf);
    229     }
    230 }
    231 
    232 /*******************************************************************************
    233 **
    234 ** Function         BTA_HfClientAudioClose
    235 **
    236 ** Description      Close the currently active audio connection to an audio
    237 **                  gateway. The data connection remains open
    238 **
    239 **
    240 ** Returns          void
    241 **
    242 *******************************************************************************/
    243 BTA_API void BTA_HfClientAudioClose(UINT16 handle)
    244 {
    245     BT_HDR  *p_buf;
    246 
    247     if ((p_buf = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL)
    248     {
    249         p_buf->event = BTA_HF_CLIENT_API_AUDIO_CLOSE_EVT;
    250         p_buf->layer_specific = handle;
    251         bta_sys_sendmsg(p_buf);
    252     }
    253 }
    254 
    255 /*******************************************************************************
    256 **
    257 ** Function         BTA_HfClientSendAT
    258 **
    259 ** Description      send AT command
    260 **
    261 **
    262 ** Returns          void
    263 **
    264 *******************************************************************************/
    265 BTA_API void BTA_HfClientSendAT(UINT16 handle, tBTA_HF_CLIENT_AT_CMD_TYPE at, UINT32 val1, UINT32 val2, const char *str)
    266 {
    267     tBTA_HF_CLIENT_DATA_VAL  *p_buf;
    268 
    269     if ((p_buf = (tBTA_HF_CLIENT_DATA_VAL *) GKI_getbuf(sizeof(tBTA_HF_CLIENT_DATA_VAL))) != NULL)
    270     {
    271         p_buf->hdr.event = BTA_HF_CLIENT_SEND_AT_CMD_EVT;
    272         p_buf->uint8_val = at;
    273         p_buf->uint32_val1 = val1;
    274         p_buf->uint32_val2 = val2;
    275 
    276         if (str)
    277         {
    278             strlcpy(p_buf->str, str, BTA_HF_CLIENT_NUMBER_LEN + 1);
    279             p_buf->str[BTA_HF_CLIENT_NUMBER_LEN] = '\0';
    280         }
    281         else
    282         {
    283             p_buf->str[0] = '\0';
    284         }
    285 
    286         p_buf->hdr.layer_specific = handle;
    287         bta_sys_sendmsg(p_buf);
    288     }
    289 }
    290