/******************************************************************************
 *
 *  Copyright (C) 2009-2012 Broadcom Corporation
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at:
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *
 ******************************************************************************/

#ifndef BTIF_HL_H
#define BTIF_HL_H

#include <hardware/bluetooth.h>

#include "bt_common.h"
#include "bta_hl_api.h"
#include "osi/include/alarm.h"

/*******************************************************************************
 *  Constants & Macros
 ******************************************************************************/

#define BTIF_HL_DATA_TYPE_NONE 0x0000
#define BTIF_HL_DATA_TYPE_PULSE_OXIMETER 0x1004 /* from BT assigned number */
#define BTIF_HL_DATA_TYPE_BLOOD_PRESSURE_MON 0x1007
#define BTIF_HL_DATA_TYPE_BODY_THERMOMETER 0x1008
#define BTIF_HL_DATA_TYPE_BODY_WEIGHT_SCALE 0x100F
#define BTIF_HL_DATA_TYPE_GLUCOSE_METER 0x1011
#define BTIF_HL_DATA_TYPE_STEP_COUNTER 0x1068
#define BTIF_HL_DATA_TYPE_BCA 0x1014
#define BTIF_HL_DATA_TYPE_PEAK_FLOW 0x1015
#define BTIF_HL_DATA_TYPE_CARDIO 0x1029
#define BTIF_HL_DATA_TYPE_ACTIVITY_HUB 0x1047
#define BTIF_HL_DATA_TYPE_AMM 0x1048

#define BTIF_HL_CCH_NUM_FILTER_ELEMS 3
#define BTIF_HL_APPLICATION_NAME_LEN 512

/*******************************************************************************
 *  Type definitions and return values
 ******************************************************************************/

typedef enum {
  BTIF_HL_SOC_STATE_IDLE,
  BTIF_HL_SOC_STATE_W4_ADD,
  BTIF_HL_SOC_STATE_W4_CONN,
  BTIF_HL_SOC_STATE_W4_READ,
  BTIF_HL_SOC_STATE_W4_REL
} btif_hl_soc_state_t;

typedef enum {
  BTIF_HL_STATE_DISABLED,
  BTIF_HL_STATE_DISABLING,
  BTIF_HL_STATE_ENABLED,
  BTIF_HL_STATE_ENABLING,
} btif_hl_state_t;

typedef enum {
  BTIF_HL_CCH_OP_NONE,
  BTIF_HL_CCH_OP_MDEP_FILTERING,
  BTIF_HL_CCH_OP_MATCHED_CTRL_PSM,
  BTIF_HL_CCH_OP_DCH_OPEN,
  BTIF_HL_CCH_OP_DCH_RECONNECT,
  BTIF_HL_CCH_OP_DCH_ECHO_TEST
} btif_hl_cch_op_t;

typedef enum {
  BTIF_HL_PEND_DCH_OP_NONE,
  BTIF_HL_PEND_DCH_OP_DELETE_MDL,
  BTIF_HL_PEND_DCH_OP_OPEN,
  BTIF_HL_PEND_DCH_OP_RECONNECT
} btif_hl_pend_dch_op_t;

typedef enum { BTIF_HL_DCH_OP_NONE, BTIF_HL_DCH_OP_DISC } btif_hl_dch_op_t;

typedef enum {
  BTIF_HL_CHAN_CB_STATE_NONE,
  BTIF_HL_CHAN_CB_STATE_CONNECTING_PENDING,
  BTIF_HL_CHAN_CB_STATE_CONNECTED_PENDING,

  BTIF_HL_CHAN_CB_STATE_DISCONNECTING_PENDING,
  BTIF_HL_CHAN_CB_STATE_DISCONNECTED_PENDING,
  BTIF_HL_CHAN_CB_STATE_DESTROYED_PENDING,
} btif_hl_chan_cb_state_t;

enum {
  BTIF_HL_SEND_CONNECTED_CB,
  BTIF_HL_SEND_DISCONNECTED_CB,
  BTIF_HL_REG_APP,
  BTIF_HL_UNREG_APP,
  BTIF_HL_UPDATE_MDL,
};

typedef struct {
  uint8_t mdep_cfg_idx;
  int data_type;
  tBTA_HL_MDEP_ID peer_mdep_id;
} btif_hl_extra_mdl_cfg_t;

typedef struct {
  tBTA_HL_MDL_CFG base;
  btif_hl_extra_mdl_cfg_t extra;
} btif_hl_mdl_cfg_t;

typedef struct {
  bool active;
  uint8_t app_idx;
} btif_hl_app_data_t;

typedef struct {
  int channel_id;
  RawAddress bd_addr;
  uint8_t mdep_cfg_idx;
  int max_s;
  int socket_id[2];
  uint8_t app_idx;
  uint8_t mcl_idx;
  uint8_t mdl_idx;
  btif_hl_soc_state_t state;
} btif_hl_soc_cb_t;

typedef struct {
  uint16_t data_type;
  uint16_t max_tx_apdu_size;
  uint16_t max_rx_apdu_size;
} btif_hl_data_type_cfg_t;

typedef struct {
  uint16_t data_type;
  tBTA_HL_MDEP_ROLE peer_mdep_role;
} btif_hl_filter_elem_t;

typedef struct {
  uint8_t num_elems;
  btif_hl_filter_elem_t elem[BTIF_HL_CCH_NUM_FILTER_ELEMS];
} btif_hl_cch_filter_t;

typedef struct {
  bool in_use;
  uint16_t mdl_id;
  tBTA_HL_MDL_HANDLE mdl_handle;
  btif_hl_dch_op_t dch_oper;
  tBTA_HL_MDEP_ID local_mdep_id;
  uint8_t local_mdep_cfg_idx;
  tBTA_HL_DCH_CFG local_cfg;
  tBTA_HL_MDEP_ID peer_mdep_id;
  uint16_t peer_data_type;
  tBTA_HL_MDEP_ROLE peer_mdep_role;
  tBTA_HL_DCH_MODE dch_mode;
  tBTA_SEC sec_mask;
  bool is_the_first_reliable;
  bool delete_mdl;
  uint16_t mtu;
  tMCA_CHNL_CFG chnl_cfg;
  uint16_t tx_size;
  uint8_t* p_tx_pkt;
  uint8_t* p_rx_pkt;
  bool cong;
  btif_hl_soc_cb_t* p_scb;
  int channel_id;
} btif_hl_mdl_cb_t;

typedef struct {
  int channel_id;
  int mdep_cfg_idx;
  bool in_use;
  btif_hl_chan_cb_state_t cb_state;
  btif_hl_pend_dch_op_t op;
  RawAddress bd_addr;
  bool abort_pending;
} btif_hl_pending_chan_cb_t;

typedef struct {
  btif_hl_mdl_cb_t mdl[BTA_HL_NUM_MDLS_PER_MCL];
  bool in_use;
  bool is_connected;
  uint16_t req_ctrl_psm;
  uint16_t ctrl_psm;
  uint16_t data_psm;
  RawAddress bd_addr;
  uint16_t cch_mtu;
  tBTA_SEC sec_mask;
  tBTA_HL_MCL_HANDLE mcl_handle;
  btif_hl_pending_chan_cb_t pcb;
  bool valid_sdp_idx;
  uint8_t sdp_idx;
  tBTA_HL_SDP sdp;
  btif_hl_cch_op_t cch_oper;
  alarm_t* cch_timer;
} btif_hl_mcl_cb_t;

typedef struct {
  bool active;
  uint16_t mdl_id;
  uint8_t mdep_cfg_idx;
  RawAddress bd_addr;
  int channel_id;
} btif_hl_delete_mdl_t;

typedef struct {
  btif_hl_mcl_cb_t mcb[BTA_HL_NUM_MCLS]; /* application Control Blocks */
  bool in_use;                           /* this CB is in use*/
  bool reg_pending;
  uint8_t app_id;

  tBTA_HL_SUP_FEATURE sup_feature;
  tBTA_HL_DCH_CFG channel_type[BTA_HL_NUM_MDEPS];
  tBTA_HL_SDP_INFO_IND sdp_info_ind;
  btif_hl_cch_filter_t filter;

  btif_hl_mdl_cfg_t mdl_cfg[BTA_HL_NUM_MDL_CFGS];
  int mdl_cfg_channel_id[BTA_HL_NUM_MDL_CFGS];

  btif_hl_delete_mdl_t delete_mdl;
  tBTA_HL_DEVICE_TYPE dev_type;
  tBTA_HL_APP_HANDLE app_handle;
  uint16_t sec_mask; /* Security mask for BTM_SetSecurityLevel() */
  char srv_name[BTA_SERVICE_NAME_LEN +
                1]; /* service name to be used in the SDP; null terminated*/
  char srv_desp[BTA_SERVICE_DESP_LEN + 1]; /* service description to be used in
                                              the SDP; null terminated */
  char provider_name[BTA_PROVIDER_NAME_LEN + 1]; /* provide name to be used in
                                                    the SDP; null terminated */
  char
      application_name[BTIF_HL_APPLICATION_NAME_LEN + 1]; /* applicaiton name */
} btif_hl_app_cb_t;

typedef struct {
  bool in_use;
  uint8_t app_idx;
} btif_hl_pending_reg_cb_t;

/* BTIF-HL control block  */
typedef struct {
  btif_hl_app_cb_t acb[BTA_HL_NUM_APPS]; /* HL Control Blocks */
  tBTA_HL_CTRL_CBACK* p_ctrl_cback; /* pointer to control callback function */
  uint8_t next_app_id;
  uint16_t next_channel_id;
  btif_hl_state_t state;
} btif_hl_cb_t;

typedef uint8_t btif_hl_evt_t;

typedef struct {
  int app_id;
  RawAddress bd_addr;
  int mdep_cfg_index;
  int channel_id;
  btif_hl_chan_cb_state_t cb_state;
  int fd;
} btif_hl_send_chan_state_cb_t;

typedef struct { uint8_t app_idx; } btif_hl_reg_t;

typedef btif_hl_reg_t btif_hl_unreg_t;
typedef btif_hl_reg_t btif_hl_update_mdl_t;

typedef union {
  btif_hl_send_chan_state_cb_t chan_cb;
  btif_hl_reg_t reg;
  btif_hl_unreg_t unreg;
  btif_hl_update_mdl_t update_mdl;
} btif_hl_evt_cb_t;

/*******************************************************************************
 *  Functions
 ******************************************************************************/

#define BTIF_HL_GET_CB_PTR() &(btif_hl_cb)
#define BTIF_HL_GET_APP_CB_PTR(app_idx) &(btif_hl_cb.acb[(app_idx)])
#define BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx) \
  &(btif_hl_cb.acb[(app_idx)].mcb[(mcl_idx)])
#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])
#define BTIF_HL_GET_PCB_PTR(app_idx, mcl_idx) \
  &(btif_hl_cb.acb[app_idx].mcb[mcl_idx].pcb)
#define BTIF_HL_GET_MDL_CFG_PTR(app_idx, item_idx) \
  &(btif_hl_cb.acb[(app_idx)].mdl_cfg[(item_idx)])
#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)])

extern btif_hl_cb_t btif_hl_cb;
extern btif_hl_cb_t* p_btif_hl_cb;

extern bool btif_hl_find_mcl_idx(uint8_t app_idx, const RawAddress& p_bd_addr,
                                 uint8_t* p_mcl_idx);
extern bool btif_hl_find_app_idx(uint8_t app_id, uint8_t* p_app_idx);
extern bool btif_hl_find_avail_mcl_idx(uint8_t app_idx, uint8_t* p_mcl_idx);
extern bool btif_hl_find_avail_mdl_idx(uint8_t app_idx, uint8_t mcl_idx,
                                       uint8_t* p_mdl_idx);
extern bool btif_hl_find_mcl_idx_using_handle(tBTA_HL_MCL_HANDLE mcl_handle,
                                              uint8_t* p_app_idx,
                                              uint8_t* p_mcl_idx);
extern bool btif_hl_save_mdl_cfg(uint8_t app_id, uint8_t item_idx,
                                 tBTA_HL_MDL_CFG* p_mdl_cfg);
extern bool btif_hl_delete_mdl_cfg(uint8_t app_id, uint8_t item_idx);
extern bool btif_hl_find_mdl_idx_using_handle(tBTA_HL_MDL_HANDLE mdl_handle,
                                              uint8_t* p_app_idx,
                                              uint8_t* p_mcl_idx,
                                              uint8_t* p_mdl_idx);
extern void btif_hl_abort_pending_chan_setup(uint8_t app_idx, uint8_t mcl_idx);
extern bool btif_hl_proc_pending_op(uint8_t app_idx, uint8_t mcl_idx);
extern bool btif_hl_load_mdl_config(uint8_t app_id, uint8_t buffer_size,
                                    tBTA_HL_MDL_CFG* p_mdl_buf);

#endif
