/******************************************************************************
 *
 *  Copyright 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.
 *
 ******************************************************************************/

/******************************************************************************
 *
 *  This is the implementation file for the HeaLth device profile (HL)
 *  subsystem call-in functions.
 *
 ******************************************************************************/

#include <stddef.h>

#include "bta_api.h"
#include "bta_hl_api.h"
#include "bta_hl_ci.h"
#include "bta_hl_co.h"
#include "bta_hl_int.h"
#include "bta_sys.h"
#include "btm_api.h"

/*******************************************************************************
 *
 * Function         bta_hl_ci_get_tx_data
 *
 * Description      This function is called in response to the
 *                  bta_hl_co_get_tx_data call-out function.
 *
 * Parameters       mdl_handle -MDL handle
 *                  status - BTA_MA_STATUS_OK if operation is successful
 *                           BTA_MA_STATUS_FAIL if any errors have occurred.
 *                  evt    - evt from the call-out function
 *
 * Returns          void
 *
 ******************************************************************************/
void bta_hl_ci_get_tx_data(tBTA_HL_MDL_HANDLE mdl_handle, tBTA_HL_STATUS status,
                           uint16_t evt) {
  tBTA_HL_CI_GET_PUT_DATA* p_evt =
      (tBTA_HL_CI_GET_PUT_DATA*)osi_malloc(sizeof(tBTA_HL_CI_GET_PUT_DATA));

#if (BTA_HL_DEBUG == TRUE)
  APPL_TRACE_DEBUG("%s mdl_handle=%d status=%d evt=%d\n", __func__, mdl_handle,
                   status, evt);
#endif

  p_evt->hdr.event = evt;
  p_evt->mdl_handle = mdl_handle;
  p_evt->status = status;

  bta_sys_sendmsg(p_evt);
}

/*******************************************************************************
 *
 * Function         bta_hl_ci_put_rx_data
 *
 * Description      This function is called in response to the
 *                  bta_hl_co_put_rx_data call-out function.
 *
 * Parameters       mdl_handle -MDL handle
 *                  status - BTA_MA_STATUS_OK if operation is successful
 *                           BTA_MA_STATUS_FAIL if any errors have occurred.
 *                  evt    - evt from the call-out function
 *
 * Returns          void
 *
 ******************************************************************************/
extern void bta_hl_ci_put_rx_data(tBTA_HL_MDL_HANDLE mdl_handle,
                                  tBTA_HL_STATUS status, uint16_t evt) {
  tBTA_HL_CI_GET_PUT_DATA* p_evt =
      (tBTA_HL_CI_GET_PUT_DATA*)osi_malloc(sizeof(tBTA_HL_CI_GET_PUT_DATA));

#if (BTA_HL_DEBUG == TRUE)
  APPL_TRACE_DEBUG("%s mdl_handle=%d status=%d evt=%d\n", __func__, mdl_handle,
                   status, evt);
#endif

  p_evt->hdr.event = evt;
  p_evt->mdl_handle = mdl_handle;
  p_evt->status = status;

  bta_sys_sendmsg(p_evt);
}

/*******************************************************************************
 *
 * Function         bta_hl_ci_get_echo_data
 *
 * Description      This function is called in response to the
 *                  bta_hl_co_get_echo_data call-out function.
 *
 * Parameters       mcl_handle -MCL handle
 *                  status - BTA_MA_STATUS_OK if operation is successful
 *                           BTA_MA_STATUS_FAIL if any errors have occurred.
 *                  evt    - evt from the call-out function
 *
 * Returns          void
 *
 ******************************************************************************/
extern void bta_hl_ci_get_echo_data(tBTA_HL_MCL_HANDLE mcl_handle,
                                    tBTA_HL_STATUS status, uint16_t evt) {
  tBTA_HL_CI_ECHO_DATA* p_evt =
      (tBTA_HL_CI_ECHO_DATA*)osi_malloc(sizeof(tBTA_HL_CI_ECHO_DATA));

#if (BTA_HL_DEBUG == TRUE)
  APPL_TRACE_DEBUG("%s mcl_handle=%d status=%d evt=%d\n", __func__, mcl_handle,
                   status, evt);
#endif

  p_evt->hdr.event = evt;
  p_evt->mcl_handle = mcl_handle;
  p_evt->status = status;

  bta_sys_sendmsg(p_evt);
}

/*******************************************************************************
 *
 * Function         bta_hl_ci_put_echo_data
 *
 * Description      This function is called in response to the
 *                  bta_hl_co_put_echo_data call-out function.
 *
 * Parameters       mcl_handle -MCL handle
 *                  status - BTA_MA_STATUS_OK if operation is successful
 *                           BTA_MA_STATUS_FAIL if any errors have occurred.
 *                  evt    - evt from the call-out function
 *
 * Returns          void
 *
 ******************************************************************************/
extern void bta_hl_ci_put_echo_data(tBTA_HL_MCL_HANDLE mcl_handle,
                                    tBTA_HL_STATUS status, uint16_t evt) {
  tBTA_HL_CI_ECHO_DATA* p_evt =
      (tBTA_HL_CI_ECHO_DATA*)osi_malloc(sizeof(tBTA_HL_CI_ECHO_DATA));

#if (BTA_HL_DEBUG == TRUE)
  APPL_TRACE_DEBUG("%s mcl_handle=%d status=%d evt=%d\n", __func__, mcl_handle,
                   status, evt);
#endif

  p_evt->hdr.event = evt;
  p_evt->mcl_handle = mcl_handle;
  p_evt->status = status;

  bta_sys_sendmsg(p_evt);
}
