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