1/******************************************************************************
2 *
3 *  Copyright (C) 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/*******************************************************************************
23**  Constants & Macros
24********************************************************************************/
25
26#define BTIF_HL_DATA_TYPE_NONE               0x0000
27#define BTIF_HL_DATA_TYPE_PULSE_OXIMETER     0x1004   /* from BT assigned number */
28#define BTIF_HL_DATA_TYPE_BLOOD_PRESSURE_MON 0x1007
29#define BTIF_HL_DATA_TYPE_BODY_THERMOMETER   0x1008
30#define BTIF_HL_DATA_TYPE_BODY_WEIGHT_SCALE  0x100F
31#define BTIF_HL_DATA_TYPE_GLUCOSE_METER      0x1011
32#define BTIF_HL_DATA_TYPE_STEP_COUNTER       0x1068
33
34#define BTIF_HL_CCH_NUM_FILTER_ELEMS            3
35#define BTIF_HL_APPLICATION_NAME_LEN          512
36
37#define BTIF_HL_NV_MAX_APPS   16
38
39
40/*******************************************************************************
41**  Type definitions and return values
42********************************************************************************/
43
44typedef enum
45{
46    BTIF_HL_SOC_STATE_IDLE,
47    BTIF_HL_SOC_STATE_W4_ADD,
48    BTIF_HL_SOC_STATE_W4_CONN,
49    BTIF_HL_SOC_STATE_W4_READ,
50    BTIF_HL_SOC_STATE_W4_REL
51} btif_hl_soc_state_t;
52
53typedef enum
54{
55    BTIF_HL_STATE_DISABLED,
56    BTIF_HL_STATE_DISABLING,
57    BTIF_HL_STATE_ENABLED,
58    BTIF_HL_STATE_ENABLING,
59} btif_hl_state_t;
60
61typedef enum
62{
63    BTIF_HL_CCH_OP_NONE,
64    BTIF_HL_CCH_OP_MDEP_FILTERING,
65    BTIF_HL_CCH_OP_MATCHED_CTRL_PSM,
66    BTIF_HL_CCH_OP_DCH_OPEN,
67    BTIF_HL_CCH_OP_DCH_RECONNECT,
68    BTIF_HL_CCH_OP_DCH_ECHO_TEST
69} btif_hl_cch_op_t;
70
71typedef enum
72{
73    BTIF_HL_PEND_DCH_OP_NONE,
74    BTIF_HL_PEND_DCH_OP_DELETE_MDL,
75    BTIF_HL_PEND_DCH_OP_OPEN,
76    BTIF_HL_PEND_DCH_OP_RECONNECT
77} btif_hl_pend_dch_op_t;
78
79typedef enum
80{
81    BTIF_HL_DCH_OP_NONE,
82    BTIF_HL_DCH_OP_DISC
83} btif_hl_dch_op_t;
84
85typedef enum
86{
87    BTIF_HL_CHAN_CB_STATE_NONE,
88    BTIF_HL_CHAN_CB_STATE_CONNECTING_PENDING,
89    BTIF_HL_CHAN_CB_STATE_CONNECTED_PENDING,
90
91    BTIF_HL_CHAN_CB_STATE_DISCONNECTING_PENDING,
92    BTIF_HL_CHAN_CB_STATE_DISCONNECTED_PENDING,
93    BTIF_HL_CHAN_CB_STATE_DESTROYED_PENDING,
94} btif_hl_chan_cb_state_t;
95
96enum
97{
98    BTIF_HL_SEND_CONNECTED_CB,
99    BTIF_HL_SEND_DISCONNECTED_CB,
100    BTIF_HL_REG_APP,
101    BTIF_HL_UNREG_APP,
102    BTIF_HL_UPDATE_MDL,
103};
104
105typedef struct
106{
107    UINT8 mdep_cfg_idx;
108    int data_type;
109    tBTA_HL_MDEP_ID peer_mdep_id;
110} btif_hl_extra_mdl_cfg_t;
111
112typedef struct
113{
114    tBTA_HL_MDL_CFG         base;
115    btif_hl_extra_mdl_cfg_t extra;
116} btif_hl_mdl_cfg_t;
117
118typedef struct
119{
120    btif_hl_mdl_cfg_t       mdl_cfg[BTA_HL_NUM_MDL_CFGS];
121} btif_hl_nv_mdl_data_t;
122
123typedef struct
124{
125    tBTA_HL_SUP_FEATURE     sup_feature;
126    tBTA_HL_DCH_CFG         channel_type[BTA_HL_NUM_MDEPS];
127    char                    srv_name[BTA_SERVICE_NAME_LEN +1];
128    char                    srv_desp[BTA_SERVICE_DESP_LEN +1];
129    char                    provider_name[BTA_PROVIDER_NAME_LEN +1];
130    char                    application_name[BTIF_HL_APPLICATION_NAME_LEN +1];
131} btif_hl_nv_app_data_t;
132
133typedef struct
134{
135    BOOLEAN in_use;
136    UINT16  use_freq;
137} btif_hl_nv_app_t;
138
139typedef struct
140{
141    btif_hl_nv_app_t   app[BTIF_HL_NV_MAX_APPS];
142} btif_hl_nv_app_cb_t;
143
144typedef struct
145{
146    UINT8 app_nv_idx;
147    BOOLEAN active;
148    UINT8 app_idx;
149    btif_hl_nv_app_data_t   app_data;
150} btif_hl_app_data_t;
151
152typedef struct
153{
154    BOOLEAN                 is_app_read;
155    btif_hl_nv_app_cb_t     app_cb;
156    BUFFER_Q                app_queue;
157} btif_hl_nv_cb_t;
158
159typedef struct
160{
161    int                     channel_id;
162    BD_ADDR                 bd_addr;
163    UINT8                   mdep_cfg_idx;
164    int                     max_s;
165    int                     socket_id[2];
166    UINT8                   app_idx;
167    UINT8                   mcl_idx;
168    UINT8                   mdl_idx;
169    btif_hl_soc_state_t     state;
170}btif_hl_soc_cb_t;
171
172typedef struct
173{
174    UINT16                  data_type;
175    UINT16                  max_tx_apdu_size;
176    UINT16                  max_rx_apdu_size;
177} btif_hl_data_type_cfg_t;
178
179typedef struct
180{
181    UINT16                  data_type;
182    tBTA_HL_MDEP_ROLE       peer_mdep_role;
183} btif_hl_filter_elem_t;
184
185typedef struct
186{
187    UINT8                   num_elems;
188    btif_hl_filter_elem_t   elem[BTIF_HL_CCH_NUM_FILTER_ELEMS];
189} btif_hl_cch_filter_t;
190
191typedef struct
192{
193    BOOLEAN                 in_use;
194    UINT16                  mdl_id;
195    tBTA_HL_MDL_HANDLE      mdl_handle;
196    btif_hl_dch_op_t        dch_oper;
197    tBTA_HL_MDEP_ID         local_mdep_id;
198    UINT8                   local_mdep_cfg_idx;
199    tBTA_HL_DCH_CFG         local_cfg;
200    tBTA_HL_MDEP_ID         peer_mdep_id;
201    UINT16                  peer_data_type;
202    tBTA_HL_MDEP_ROLE       peer_mdep_role;
203    tBTA_HL_DCH_MODE        dch_mode;
204    tBTA_SEC                sec_mask;
205    BOOLEAN                 is_the_first_reliable;
206    BOOLEAN                 delete_mdl;
207    UINT16                  mtu;
208    tMCA_CHNL_CFG           chnl_cfg;
209    UINT16                  tx_size;
210    UINT8                   *p_tx_pkt;
211    UINT8                   *p_rx_pkt;
212    BOOLEAN                 cong;
213    btif_hl_soc_cb_t        *p_scb;
214    int                     channel_id;
215} btif_hl_mdl_cb_t;
216
217typedef struct
218{
219    int                     channel_id;
220    int                     mdep_cfg_idx;
221    BOOLEAN                 in_use;
222    btif_hl_chan_cb_state_t cb_state;
223    btif_hl_pend_dch_op_t   op;
224    BD_ADDR                 bd_addr;
225    BOOLEAN                 abort_pending;
226} btif_hl_pending_chan_cb_t;
227
228typedef struct
229{
230    btif_hl_mdl_cb_t        mdl[BTA_HL_NUM_MDLS_PER_MCL];
231    BOOLEAN                 in_use;
232    BOOLEAN                 is_connected;
233    UINT16                  req_ctrl_psm;
234    UINT16                  ctrl_psm;
235    UINT16                  data_psm;
236    BD_ADDR                 bd_addr;
237    UINT16                  cch_mtu;
238    tBTA_SEC                sec_mask;
239    tBTA_HL_MCL_HANDLE      mcl_handle;
240    btif_hl_pending_chan_cb_t pcb;
241    BOOLEAN                 valid_sdp_idx;
242    UINT8                   sdp_idx;
243    tBTA_HL_SDP             sdp;
244    btif_hl_cch_op_t        cch_oper;
245    BOOLEAN                 cch_timer_active;
246    TIMER_LIST_ENT          cch_timer;
247} btif_hl_mcl_cb_t;
248
249typedef struct
250{
251    BOOLEAN                 active;
252    UINT16                  mdl_id;
253    UINT8                   mdep_cfg_idx;
254    BD_ADDR                 bd_addr;
255    int                     channel_id;
256} btif_hl_delete_mdl_t;
257
258typedef struct
259{
260    btif_hl_mcl_cb_t        mcb[BTA_HL_NUM_MCLS]; /* application Control Blocks */
261    BOOLEAN                 in_use;              /* this CB is in use*/
262    BOOLEAN                 reg_pending;
263    BOOLEAN                 is_new_app;
264    UINT8                   app_nv_idx;
265    UINT8                   app_id;
266
267    tBTA_HL_SUP_FEATURE     sup_feature;
268    tBTA_HL_DCH_CFG         channel_type[BTA_HL_NUM_MDEPS];
269    tBTA_HL_SDP_INFO_IND    sdp_info_ind;
270    btif_hl_cch_filter_t    filter;
271
272    btif_hl_mdl_cfg_t       mdl_cfg[BTA_HL_NUM_MDL_CFGS];
273    int                     mdl_cfg_channel_id[BTA_HL_NUM_MDL_CFGS];
274
275    btif_hl_delete_mdl_t    delete_mdl;
276    tBTA_HL_DEVICE_TYPE     dev_type;
277    tBTA_HL_APP_HANDLE      app_handle;
278    UINT16                  sec_mask;   /* Security mask for BTM_SetSecurityLevel() */
279    char                    srv_name[BTA_SERVICE_NAME_LEN +1];        /* service name to be used in the SDP; null terminated*/
280    char                    srv_desp[BTA_SERVICE_DESP_LEN +1];        /* service description to be used in the SDP; null terminated */
281    char                    provider_name[BTA_PROVIDER_NAME_LEN +1];   /* provide name to be used in the SDP; null terminated */
282    char                    application_name[BTIF_HL_APPLICATION_NAME_LEN +1];   /* applicaiton name */
283} btif_hl_app_cb_t;
284
285typedef struct
286{
287    BOOLEAN                 in_use;
288    UINT8                   app_idx;
289} btif_hl_pending_reg_cb_t;
290
291/* BTIF-HL control block  */
292typedef struct
293{
294    btif_hl_app_cb_t        acb[BTA_HL_NUM_APPS];      /* HL Control Blocks */
295    tBTA_HL_CTRL_CBACK      *p_ctrl_cback;             /* pointer to control callback function */
296    UINT8                   next_app_id;
297    UINT16                  next_channel_id;
298    btif_hl_state_t         state;
299    btif_hl_nv_cb_t         ncb;
300} btif_hl_cb_t;
301
302typedef UINT8 btif_hl_evt_t;
303
304typedef struct
305{
306    int                     app_id;
307    BD_ADDR                 bd_addr;
308    int                     mdep_cfg_index;
309    int                     channel_id;
310    btif_hl_chan_cb_state_t cb_state;
311    int                     fd;
312} btif_hl_send_chan_state_cb_t;
313
314
315typedef struct
316{
317    UINT8 app_idx;
318} btif_hl_reg_t;
319
320typedef btif_hl_reg_t btif_hl_unreg_t;
321typedef btif_hl_reg_t btif_hl_update_mdl_t;
322
323typedef union
324{
325    btif_hl_send_chan_state_cb_t    chan_cb;
326    btif_hl_reg_t           reg;
327    btif_hl_unreg_t         unreg;
328    btif_hl_update_mdl_t    update_mdl;
329} btif_hl_evt_cb_t;
330
331
332/*******************************************************************************
333**  Functions
334********************************************************************************/
335
336#define BTIF_HL_GET_CB_PTR() &(btif_hl_cb)
337#define BTIF_HL_GET_APP_CB_PTR(app_idx) &(btif_hl_cb.acb[(app_idx)])
338#define BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx) &(btif_hl_cb.acb[(app_idx)].mcb[(mcl_idx)])
339#define BTIF_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx) &(btif_hl_cb.acb[(app_idx)].mcb[(mcl_idx)].mdl[mdl_idx])
340#define BTIF_HL_GET_PCB_PTR(app_idx, mcl_idx) &(btif_hl_cb.acb[app_idx].mcb[mcl_idx].pcb)
341#define BTIF_HL_GET_MDL_CFG_PTR(app_idx, item_idx) &(btif_hl_cb.acb[(app_idx)].mdl_cfg[(item_idx)])
342#define BTIF_HL_GET_MDL_CFG_CHANNEL_ID_PTR(app_idx, item_idx) &(btif_hl_cb.acb[(app_idx)].mdl_cfg_channel_id[(item_idx)])
343
344extern btif_hl_cb_t  btif_hl_cb;
345extern btif_hl_cb_t *p_btif_hl_cb;
346extern btif_hl_nv_cb_t *p_ncb;
347
348extern BOOLEAN btif_hl_find_mcl_idx(UINT8 app_idx, BD_ADDR p_bd_addr, UINT8 *p_mcl_idx);
349extern BOOLEAN btif_hl_find_app_idx(UINT8 app_id, UINT8 *p_app_idx);
350extern BOOLEAN btif_hl_find_avail_mcl_idx(UINT8 app_idx, UINT8 *p_mcl_idx);
351extern BOOLEAN btif_hl_find_avail_mdl_idx(UINT8 app_idx, UINT8 mcl_idx,
352                                          UINT8 *p_mdl_idx);
353extern BOOLEAN btif_hl_find_mcl_idx_using_handle( tBTA_HL_MCL_HANDLE mcl_handle,
354                                                  UINT8 *p_app_idx, UINT8 *p_mcl_idx);
355extern BOOLEAN  btif_hl_save_mdl_cfg(UINT8 app_id, UINT8 item_idx, tBTA_HL_MDL_CFG *p_mdl_cfg);
356extern BOOLEAN  btif_hl_delete_mdl_cfg(UINT8 app_id, UINT8 item_idx);
357extern void * btif_hl_get_buf(UINT16 size);
358extern void btif_hl_free_buf(void **p);
359extern BOOLEAN btif_hl_find_mdl_idx_using_handle(tBTA_HL_MDL_HANDLE mdl_handle,
360                                                 UINT8 *p_app_idx,UINT8 *p_mcl_idx,
361                                                 UINT8 *p_mdl_idx);
362extern void btif_hl_abort_pending_chan_setup(UINT8 app_idx, UINT8 mcl_idx);
363extern BOOLEAN btif_hl_proc_pending_op(UINT8 app_idx, UINT8 mcl_idx);
364extern BOOLEAN btif_hl_load_mdl_config (UINT8 app_id, UINT8 buffer_size,
365                                        tBTA_HL_MDL_CFG *p_mdl_buf );
366#endif
367