/******************************************************************************
 *
 *  Copyright (C) 2005-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.
 *
 ******************************************************************************/

/******************************************************************************
 *
 *  This is the interface file for hid host call-out functions.
 *
 ******************************************************************************/
#ifndef BTA_HH_CO_H
#define BTA_HH_CO_H

#include "bta_hh_api.h"

typedef struct {
  uint16_t rpt_uuid;
  uint8_t rpt_id;
  tBTA_HH_RPT_TYPE rpt_type;
  uint8_t srvc_inst_id;
  uint8_t char_inst_id;
} tBTA_HH_RPT_CACHE_ENTRY;

/*******************************************************************************
 *
 * Function         bta_hh_co_data
 *
 * Description      This callout function is executed by HH when data is
 *                  received
 *                  in interupt channel.
 *
 *
 * Returns          void.
 *
 ******************************************************************************/
extern void bta_hh_co_data(uint8_t dev_handle, uint8_t* p_rpt, uint16_t len,
                           tBTA_HH_PROTO_MODE mode, uint8_t sub_class,
                           uint8_t ctry_code, const RawAddress& peer_addr,
                           uint8_t app_id);

/*******************************************************************************
 *
 * Function         bta_hh_co_open
 *
 * Description      This callout function is executed by HH when connection is
 *                  opened, and application may do some device specific
 *                  initialization.
 *
 * Returns          void.
 *
 ******************************************************************************/
extern void bta_hh_co_open(uint8_t dev_handle, uint8_t sub_class,
                           uint16_t attr_mask, uint8_t app_id);

/*******************************************************************************
 *
 * Function         bta_hh_co_close
 *
 * Description      This callout function is executed by HH when connection is
 *                  closed, and device specific finalizatio nmay be needed.
 *
 * Returns          void.
 *
 ******************************************************************************/
extern void bta_hh_co_close(uint8_t dev_handle, uint8_t app_id);

#if (BTA_HH_LE_INCLUDED == TRUE)
/*******************************************************************************
 *
 * Function         bta_hh_le_co_rpt_info
 *
 * Description      This callout function is to convey the report information on
 *                  a HOGP device to the application. Application can save this
 *                  information in NV if device is bonded and load it back when
 *                  stack reboot.
 *
 * Parameters       remote_bda  - remote device address
 *                  p_entry     - report entry pointer
 *                  app_id      - application id
 *
 * Returns          void.
 *
 ******************************************************************************/
extern void bta_hh_le_co_rpt_info(const RawAddress& remote_bda,
                                  tBTA_HH_RPT_CACHE_ENTRY* p_entry,
                                  uint8_t app_id);

/*******************************************************************************
 *
 * Function         bta_hh_le_co_cache_load
 *
 * Description      This callout function is to request the application to load
 *                  the cached HOGP report if there is any. When cache reading
 *                  is completed, bta_hh_le_ci_cache_load() is called by the
 *                  application.
 *
 * Parameters       remote_bda  - remote device address
 *                  p_num_rpt: number of cached report
 *                  app_id      - application id
 *
 * Returns          the acched report array
 *
 ******************************************************************************/
extern tBTA_HH_RPT_CACHE_ENTRY* bta_hh_le_co_cache_load(
    const RawAddress& remote_bda, uint8_t* p_num_rpt, uint8_t app_id);

/*******************************************************************************
 *
 * Function         bta_hh_le_co_reset_rpt_cache
 *
 * Description      This callout function is to reset the HOGP device cache.
 *
 * Parameters       remote_bda  - remote device address
 *
 * Returns          none
 *
 ******************************************************************************/
extern void bta_hh_le_co_reset_rpt_cache(const RawAddress& remote_bda,
                                         uint8_t app_id);

#endif /* #if (BTA_HH_LE_INCLUDED == TRUE) */

#endif /* BTA_HH_CO_H */
