1 /******************************************************************************
2  *
3  *  Copyright 2009-2012 Broadcom Corporation
4  *
5  *  Licensed under the Apache License, Version 2.0 (the "License");
6  *  you may not use this file except in compliance with the License.
7  *  You may obtain a copy of the License at:
8  *
9  *  http://www.apache.org/licenses/LICENSE-2.0
10  *
11  *  Unless required by applicable law or agreed to in writing, software
12  *  distributed under the License is distributed on an "AS IS" BASIS,
13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  *  See the License for the specific language governing permissions and
15  *  limitations under the License.
16  *
17  ******************************************************************************/
18 
19 #ifndef BTIF_HL_H
20 #define BTIF_HL_H
21 
22 #include <hardware/bluetooth.h>
23 
24 #include "bt_common.h"
25 #include "bta_hl_api.h"
26 #include "osi/include/alarm.h"
27 
28 /*******************************************************************************
29  *  Constants & Macros
30  ******************************************************************************/
31 
32 #define BTIF_HL_DATA_TYPE_NONE 0x0000
33 #define BTIF_HL_DATA_TYPE_PULSE_OXIMETER 0x1004 /* from BT assigned number */
34 #define BTIF_HL_DATA_TYPE_BLOOD_PRESSURE_MON 0x1007
35 #define BTIF_HL_DATA_TYPE_BODY_THERMOMETER 0x1008
36 #define BTIF_HL_DATA_TYPE_BODY_WEIGHT_SCALE 0x100F
37 #define BTIF_HL_DATA_TYPE_GLUCOSE_METER 0x1011
38 #define BTIF_HL_DATA_TYPE_STEP_COUNTER 0x1068
39 #define BTIF_HL_DATA_TYPE_BCA 0x1014
40 #define BTIF_HL_DATA_TYPE_PEAK_FLOW 0x1015
41 #define BTIF_HL_DATA_TYPE_CARDIO 0x1029
42 #define BTIF_HL_DATA_TYPE_ACTIVITY_HUB 0x1047
43 #define BTIF_HL_DATA_TYPE_AMM 0x1048
44 
45 #define BTIF_HL_CCH_NUM_FILTER_ELEMS 3
46 #define BTIF_HL_APPLICATION_NAME_LEN 512
47 
48 /*******************************************************************************
49  *  Type definitions and return values
50  ******************************************************************************/
51 
52 typedef enum {
53   BTIF_HL_SOC_STATE_IDLE,
54   BTIF_HL_SOC_STATE_W4_ADD,
55   BTIF_HL_SOC_STATE_W4_CONN,
56   BTIF_HL_SOC_STATE_W4_READ,
57   BTIF_HL_SOC_STATE_W4_REL
58 } btif_hl_soc_state_t;
59 
60 typedef enum {
61   BTIF_HL_STATE_DISABLED,
62   BTIF_HL_STATE_DISABLING,
63   BTIF_HL_STATE_ENABLED,
64   BTIF_HL_STATE_ENABLING,
65 } btif_hl_state_t;
66 
67 typedef enum {
68   BTIF_HL_CCH_OP_NONE,
69   BTIF_HL_CCH_OP_MDEP_FILTERING,
70   BTIF_HL_CCH_OP_MATCHED_CTRL_PSM,
71   BTIF_HL_CCH_OP_DCH_OPEN,
72   BTIF_HL_CCH_OP_DCH_RECONNECT,
73   BTIF_HL_CCH_OP_DCH_ECHO_TEST
74 } btif_hl_cch_op_t;
75 
76 typedef enum {
77   BTIF_HL_PEND_DCH_OP_NONE,
78   BTIF_HL_PEND_DCH_OP_DELETE_MDL,
79   BTIF_HL_PEND_DCH_OP_OPEN,
80   BTIF_HL_PEND_DCH_OP_RECONNECT
81 } btif_hl_pend_dch_op_t;
82 
83 typedef enum { BTIF_HL_DCH_OP_NONE, BTIF_HL_DCH_OP_DISC } btif_hl_dch_op_t;
84 
85 typedef enum {
86   BTIF_HL_CHAN_CB_STATE_NONE,
87   BTIF_HL_CHAN_CB_STATE_CONNECTING_PENDING,
88   BTIF_HL_CHAN_CB_STATE_CONNECTED_PENDING,
89 
90   BTIF_HL_CHAN_CB_STATE_DISCONNECTING_PENDING,
91   BTIF_HL_CHAN_CB_STATE_DISCONNECTED_PENDING,
92   BTIF_HL_CHAN_CB_STATE_DESTROYED_PENDING,
93 } btif_hl_chan_cb_state_t;
94 
95 enum {
96   BTIF_HL_SEND_CONNECTED_CB,
97   BTIF_HL_SEND_DISCONNECTED_CB,
98   BTIF_HL_REG_APP,
99   BTIF_HL_UNREG_APP,
100   BTIF_HL_UPDATE_MDL,
101 };
102 
103 typedef struct {
104   uint8_t mdep_cfg_idx;
105   int data_type;
106   tBTA_HL_MDEP_ID peer_mdep_id;
107 } btif_hl_extra_mdl_cfg_t;
108 
109 typedef struct {
110   tBTA_HL_MDL_CFG base;
111   btif_hl_extra_mdl_cfg_t extra;
112 } btif_hl_mdl_cfg_t;
113 
114 typedef struct {
115   bool active;
116   uint8_t app_idx;
117 } btif_hl_app_data_t;
118 
119 typedef struct {
120   int channel_id;
121   RawAddress bd_addr;
122   uint8_t mdep_cfg_idx;
123   int max_s;
124   int socket_id[2];
125   uint8_t app_idx;
126   uint8_t mcl_idx;
127   uint8_t mdl_idx;
128   btif_hl_soc_state_t state;
129 } btif_hl_soc_cb_t;
130 
131 typedef struct {
132   uint16_t data_type;
133   uint16_t max_tx_apdu_size;
134   uint16_t max_rx_apdu_size;
135 } btif_hl_data_type_cfg_t;
136 
137 typedef struct {
138   uint16_t data_type;
139   tBTA_HL_MDEP_ROLE peer_mdep_role;
140 } btif_hl_filter_elem_t;
141 
142 typedef struct {
143   uint8_t num_elems;
144   btif_hl_filter_elem_t elem[BTIF_HL_CCH_NUM_FILTER_ELEMS];
145 } btif_hl_cch_filter_t;
146 
147 typedef struct {
148   bool in_use;
149   uint16_t mdl_id;
150   tBTA_HL_MDL_HANDLE mdl_handle;
151   btif_hl_dch_op_t dch_oper;
152   tBTA_HL_MDEP_ID local_mdep_id;
153   uint8_t local_mdep_cfg_idx;
154   tBTA_HL_DCH_CFG local_cfg;
155   tBTA_HL_MDEP_ID peer_mdep_id;
156   uint16_t peer_data_type;
157   tBTA_HL_MDEP_ROLE peer_mdep_role;
158   tBTA_HL_DCH_MODE dch_mode;
159   tBTA_SEC sec_mask;
160   bool is_the_first_reliable;
161   bool delete_mdl;
162   uint16_t mtu;
163   tMCA_CHNL_CFG chnl_cfg;
164   uint16_t tx_size;
165   uint8_t* p_tx_pkt;
166   uint8_t* p_rx_pkt;
167   bool cong;
168   btif_hl_soc_cb_t* p_scb;
169   int channel_id;
170 } btif_hl_mdl_cb_t;
171 
172 typedef struct {
173   int channel_id;
174   int mdep_cfg_idx;
175   bool in_use;
176   btif_hl_chan_cb_state_t cb_state;
177   btif_hl_pend_dch_op_t op;
178   RawAddress bd_addr;
179   bool abort_pending;
180 } btif_hl_pending_chan_cb_t;
181 
182 typedef struct {
183   btif_hl_mdl_cb_t mdl[BTA_HL_NUM_MDLS_PER_MCL];
184   bool in_use;
185   bool is_connected;
186   uint16_t req_ctrl_psm;
187   uint16_t ctrl_psm;
188   uint16_t data_psm;
189   RawAddress bd_addr;
190   uint16_t cch_mtu;
191   tBTA_SEC sec_mask;
192   tBTA_HL_MCL_HANDLE mcl_handle;
193   btif_hl_pending_chan_cb_t pcb;
194   bool valid_sdp_idx;
195   uint8_t sdp_idx;
196   tBTA_HL_SDP sdp;
197   btif_hl_cch_op_t cch_oper;
198   alarm_t* cch_timer;
199 } btif_hl_mcl_cb_t;
200 
201 typedef struct {
202   bool active;
203   uint16_t mdl_id;
204   uint8_t mdep_cfg_idx;
205   RawAddress bd_addr;
206   int channel_id;
207 } btif_hl_delete_mdl_t;
208 
209 typedef struct {
210   btif_hl_mcl_cb_t mcb[BTA_HL_NUM_MCLS]; /* application Control Blocks */
211   bool in_use;                           /* this CB is in use*/
212   bool reg_pending;
213   uint8_t app_id;
214 
215   tBTA_HL_SUP_FEATURE sup_feature;
216   tBTA_HL_DCH_CFG channel_type[BTA_HL_NUM_MDEPS];
217   tBTA_HL_SDP_INFO_IND sdp_info_ind;
218   btif_hl_cch_filter_t filter;
219 
220   btif_hl_mdl_cfg_t mdl_cfg[BTA_HL_NUM_MDL_CFGS];
221   int mdl_cfg_channel_id[BTA_HL_NUM_MDL_CFGS];
222 
223   btif_hl_delete_mdl_t delete_mdl;
224   tBTA_HL_DEVICE_TYPE dev_type;
225   tBTA_HL_APP_HANDLE app_handle;
226   uint16_t sec_mask; /* Security mask for BTM_SetSecurityLevel() */
227   char srv_name[BTA_SERVICE_NAME_LEN +
228                 1]; /* service name to be used in the SDP; null terminated*/
229   char srv_desp[BTA_SERVICE_DESP_LEN + 1]; /* service description to be used in
230                                               the SDP; null terminated */
231   char provider_name[BTA_PROVIDER_NAME_LEN + 1]; /* provide name to be used in
232                                                     the SDP; null terminated */
233   char
234       application_name[BTIF_HL_APPLICATION_NAME_LEN + 1]; /* applicaiton name */
235 } btif_hl_app_cb_t;
236 
237 typedef struct {
238   bool in_use;
239   uint8_t app_idx;
240 } btif_hl_pending_reg_cb_t;
241 
242 /* BTIF-HL control block  */
243 typedef struct {
244   btif_hl_app_cb_t acb[BTA_HL_NUM_APPS]; /* HL Control Blocks */
245   tBTA_HL_CTRL_CBACK* p_ctrl_cback; /* pointer to control callback function */
246   uint8_t next_app_id;
247   uint16_t next_channel_id;
248   btif_hl_state_t state;
249 } btif_hl_cb_t;
250 
251 typedef uint8_t btif_hl_evt_t;
252 
253 typedef struct {
254   int app_id;
255   RawAddress bd_addr;
256   int mdep_cfg_index;
257   int channel_id;
258   btif_hl_chan_cb_state_t cb_state;
259   int fd;
260 } btif_hl_send_chan_state_cb_t;
261 
262 typedef struct { uint8_t app_idx; } btif_hl_reg_t;
263 
264 typedef btif_hl_reg_t btif_hl_unreg_t;
265 typedef btif_hl_reg_t btif_hl_update_mdl_t;
266 
267 typedef union {
268   btif_hl_send_chan_state_cb_t chan_cb;
269   btif_hl_reg_t reg;
270   btif_hl_unreg_t unreg;
271   btif_hl_update_mdl_t update_mdl;
272 } btif_hl_evt_cb_t;
273 
274 /*******************************************************************************
275  *  Functions
276  ******************************************************************************/
277 
278 #define BTIF_HL_GET_CB_PTR() &(btif_hl_cb)
279 #define BTIF_HL_GET_APP_CB_PTR(app_idx) &(btif_hl_cb.acb[(app_idx)])
280 #define BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx) \
281   &(btif_hl_cb.acb[(app_idx)].mcb[(mcl_idx)])
282 #define BTIF_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx) \
283   &(btif_hl_cb.acb[(app_idx)].mcb[(mcl_idx)].mdl[mdl_idx])
284 #define BTIF_HL_GET_PCB_PTR(app_idx, mcl_idx) \
285   &(btif_hl_cb.acb[app_idx].mcb[mcl_idx].pcb)
286 #define BTIF_HL_GET_MDL_CFG_PTR(app_idx, item_idx) \
287   &(btif_hl_cb.acb[(app_idx)].mdl_cfg[(item_idx)])
288 #define BTIF_HL_GET_MDL_CFG_CHANNEL_ID_PTR(app_idx, item_idx) \
289   &(btif_hl_cb.acb[(app_idx)].mdl_cfg_channel_id[(item_idx)])
290 
291 extern btif_hl_cb_t btif_hl_cb;
292 extern btif_hl_cb_t* p_btif_hl_cb;
293 
294 extern bool btif_hl_find_mcl_idx(uint8_t app_idx, const RawAddress& p_bd_addr,
295                                  uint8_t* p_mcl_idx);
296 extern bool btif_hl_find_app_idx(uint8_t app_id, uint8_t* p_app_idx);
297 extern bool btif_hl_find_avail_mcl_idx(uint8_t app_idx, uint8_t* p_mcl_idx);
298 extern bool btif_hl_find_avail_mdl_idx(uint8_t app_idx, uint8_t mcl_idx,
299                                        uint8_t* p_mdl_idx);
300 extern bool btif_hl_find_mcl_idx_using_handle(tBTA_HL_MCL_HANDLE mcl_handle,
301                                               uint8_t* p_app_idx,
302                                               uint8_t* p_mcl_idx);
303 extern bool btif_hl_save_mdl_cfg(uint8_t app_id, uint8_t item_idx,
304                                  tBTA_HL_MDL_CFG* p_mdl_cfg);
305 extern bool btif_hl_delete_mdl_cfg(uint8_t app_id, uint8_t item_idx);
306 extern bool btif_hl_find_mdl_idx_using_handle(tBTA_HL_MDL_HANDLE mdl_handle,
307                                               uint8_t* p_app_idx,
308                                               uint8_t* p_mcl_idx,
309                                               uint8_t* p_mdl_idx);
310 extern void btif_hl_abort_pending_chan_setup(uint8_t app_idx, uint8_t mcl_idx);
311 extern bool btif_hl_proc_pending_op(uint8_t app_idx, uint8_t mcl_idx);
312 extern bool btif_hl_load_mdl_config(uint8_t app_id, uint8_t buffer_size,
313                                     tBTA_HL_MDL_CFG* p_mdl_buf);
314 
315 #endif
316