1/******************************************************************************
2 *
3 *  Copyright (C) 2014  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#include <string.h>
20#include "bt_target.h"
21
22#include "bt_types.h"
23#include "bt_utils.h"
24#include "btm_ble_api.h"
25#include "btm_int.h"
26#include "btu.h"
27#include "hcidefs.h"
28#include "hcimsgs.h"
29
30tBTM_BLE_ENERGY_INFO_CB ble_energy_info_cb;
31
32/*******************************************************************************
33 *
34 * Function         btm_ble_cont_energy_cmpl_cback
35 *
36 * Description      Controller VSC complete callback
37 *
38 * Parameters
39 *
40 * Returns          void
41 *
42 ******************************************************************************/
43void btm_ble_cont_energy_cmpl_cback(tBTM_VSC_CMPL* p_params) {
44  uint8_t* p = p_params->p_param_buf;
45  uint16_t len = p_params->param_len;
46  uint8_t status = 0;
47  uint32_t total_tx_time = 0, total_rx_time = 0, total_idle_time = 0,
48           total_energy_used = 0;
49
50  if (len < 17) {
51    BTM_TRACE_ERROR("wrong length for btm_ble_cont_energy_cmpl_cback");
52    return;
53  }
54
55  STREAM_TO_UINT8(status, p);
56  STREAM_TO_UINT32(total_tx_time, p);
57  STREAM_TO_UINT32(total_rx_time, p);
58  STREAM_TO_UINT32(total_idle_time, p);
59  STREAM_TO_UINT32(total_energy_used, p);
60
61  BTM_TRACE_DEBUG(
62      "energy_info status=%d,tx_t=%ld, rx_t=%ld, ener_used=%ld, idle_t=%ld",
63      status, total_tx_time, total_rx_time, total_energy_used, total_idle_time);
64
65  if (NULL != ble_energy_info_cb.p_ener_cback)
66    ble_energy_info_cb.p_ener_cback(total_tx_time, total_rx_time,
67                                    total_idle_time, total_energy_used, status);
68
69  return;
70}
71
72/*******************************************************************************
73 *
74 * Function         BTM_BleGetEnergyInfo
75 *
76 * Description      This function obtains the energy info
77 *
78 * Parameters      p_ener_cback - Callback pointer
79 *
80 * Returns          status
81 *
82 ******************************************************************************/
83tBTM_STATUS BTM_BleGetEnergyInfo(tBTM_BLE_ENERGY_INFO_CBACK* p_ener_cback) {
84  tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
85
86  BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
87
88  BTM_TRACE_EVENT("BTM_BleGetEnergyInfo");
89
90  if (0 == cmn_ble_vsc_cb.energy_support) {
91    BTM_TRACE_ERROR("Controller does not support get energy info");
92    return BTM_ERR_PROCESSING;
93  }
94
95  ble_energy_info_cb.p_ener_cback = p_ener_cback;
96  BTM_VendorSpecificCommand(HCI_BLE_ENERGY_INFO_OCF, 0, NULL,
97                            btm_ble_cont_energy_cmpl_cback);
98  return BTM_CMD_STARTED;
99}
100