pinebuds/services/app_ibrt/src/app_ibrt_ble_adv.cpp

303 lines
10 KiB
C++

#include "app_ibrt_ble_adv.h"
#include "app_tws_ibrt.h"
#include "cmsis_os.h"
#include "co_bt_defines.h"
#include "factory_section.h"
#include "hal_trace.h"
#include "me_api.h"
SLAVE_BLE_MODE_T slaveBleMode;
static app_ble_adv_para_data_t app_ble_adv_para_data_cfg;
#define APP_IBRT_BLE_ADV_DATA_MAX_LEN (31)
#define APP_IBRT_BLE_SCAN_RSP_DATA_MAX_LEN (31)
const char *g_slave_ble_state_str[] = {
"BLE_STATE_IDLE",
"BLE_ADVERTISING",
"BLE_STARTING_ADV",
"BLE_STOPPING_ADV",
};
const char *g_slave_ble_op_str[] = {
"BLE_OP_IDLE",
"BLE_START_ADV",
"BLE_STOP_ADV",
"BLE_STOPPING_ADV",
};
#define SET_SLAVE_BLE_STATE(newState) \
do { \
TRACE(3, "[BLE][STATE]%s->%s at line %d", \
g_slave_ble_state_str[slaveBleMode.state], \
g_slave_ble_state_str[newState], __LINE__); \
slaveBleMode.state = (newState); \
} while (0);
#define SET_SLAVE_BLE_OP(newOp) \
do { \
TRACE(3, "[BLE][OP]%s->%s at line %d", \
g_slave_ble_op_str[slaveBleMode.op], g_slave_ble_op_str[newOp], \
__LINE__); \
slaveBleMode.op = (newOp); \
} while (0);
/*****************************************************************************
Prototype : app_slave_ble_cmd_complete_callback
Description : stop ble adv
Input : const void *para
Output : None
Return Value :
Calls :
Called By :
History :
Date : 2019/12/28
Author : bestechnic
Modification : Created function
*****************************************************************************/
void app_ibrt_slave_ble_cmd_complete_callback(const void *para) {
slave_ble_cmd_comp_t *p_cmd_complete = (slave_ble_cmd_comp_t *)para;
switch (p_cmd_complete->cmd_opcode) {
case HCI_BLE_ADV_CMD_OPCODE:
if (!p_cmd_complete->param[0])
app_ibrt_ble_switch_activities();
else {
TRACE(2, "%s error p_cmd_complete->param[0] %d", __func__,
p_cmd_complete->param[0]);
SET_SLAVE_BLE_STATE(BLE_STATE_IDLE);
SET_SLAVE_BLE_OP(BLE_OP_IDLE);
}
default:
break;
}
}
/*****************************************************************************
Prototype : app_ibrt_ble_adv_para_data_init
Description : initialize ble adv parameter and adv data
Input : None
Output : None
Return Value :
Calls :
Called By :
History :
Date : 2019/12/28
Author : bestechnic
Modification : Created function
*****************************************************************************/
void app_ibrt_ble_adv_para_data_init(void) {
app_ble_adv_para_data_t *adv_para_cfg = &app_ble_adv_para_data_cfg;
adv_para_cfg->adv_type = ADV_CONN_UNDIR;
adv_para_cfg->advInterval_Ms = APP_IBRT_BLE_ADV_INTERVAL;
adv_para_cfg->own_addr_type = ADDR_PUBLIC;
adv_para_cfg->peer_addr_type = ADDR_PUBLIC;
adv_para_cfg->adv_chanmap = ADV_ALL_CHNLS_EN;
adv_para_cfg->adv_filter_policy = ADV_ALLOW_SCAN_ANY_CON_ANY;
memset(adv_para_cfg->bd_addr.address, 0, BTIF_BD_ADDR_SIZE);
const char *ble_name_in_nv = (const char *)factory_section_get_ble_name();
uint32_t nameLen = strlen(ble_name_in_nv);
ASSERT(APP_IBRT_BLE_ADV_DATA_MAX_LEN >= nameLen, "ble adv data exceed");
adv_para_cfg->adv_data_len = 0;
adv_para_cfg->adv_data[adv_para_cfg->adv_data_len++] = nameLen + 1;
adv_para_cfg->adv_data[adv_para_cfg->adv_data_len++] = 0x08;
memcpy(&adv_para_cfg->adv_data[adv_para_cfg->adv_data_len], ble_name_in_nv,
nameLen);
adv_para_cfg->adv_data_len += nameLen;
adv_para_cfg->scan_rsp_data_len = 0;
memset(adv_para_cfg->scan_rsp_data, 0, sizeof(adv_para_cfg->scan_rsp_data));
memset(&slaveBleMode, 0, sizeof(slaveBleMode));
btif_me_register_cmd_complete_callback(
HCI_CMD_COMPLETE_USER_BLE, app_ibrt_slave_ble_cmd_complete_callback);
}
/*****************************************************************************
Prototype : app_ibrt_ble_set_adv_para_handler
Description : config ble adv parameter
Input : app_ble_adv_para_data_t *adv_para_cfg
Output : None
Return Value :
Calls :
Called By :
History :
Date : 2019/12/28
Author : bestechnic
Modification : Created function
*****************************************************************************/
void app_ibrt_ble_set_adv_para_handler(app_ble_adv_para_data_t *adv_para_cfg) {
btif_adv_para_struct_t adv_para;
adv_para.adv_type = adv_para_cfg->adv_type;
adv_para.interval_max = adv_para_cfg->advInterval_Ms * 8 / 5;
adv_para.interval_min = adv_para_cfg->advInterval_Ms * 8 / 5;
adv_para.own_addr_type = adv_para_cfg->own_addr_type;
adv_para.peer_addr_type = adv_para_cfg->peer_addr_type;
adv_para.adv_chanmap = adv_para_cfg->adv_chanmap;
adv_para.adv_filter_policy = adv_para_cfg->adv_filter_policy;
memcpy(adv_para.bd_addr.address, adv_para_cfg->bd_addr.address,
BTIF_BD_ADDR_SIZE);
btif_me_ble_set_adv_parameters(&adv_para);
}
/*****************************************************************************
Prototype : app_ibrt_ble_set_adv_data_handler
Description : config ble adv data and scan response data
Input : app_ble_adv_para_data_t *adv_data_cfg
Output : None
Return Value :
Calls :
Called By :
History :
Date : 2019/12/28
Author : bestechnic
Modification : Created function
*****************************************************************************/
void app_ibrt_ble_set_adv_data_handler(app_ble_adv_para_data_t *adv_data_cfg) {
btif_me_ble_set_adv_data(adv_data_cfg->adv_data_len, adv_data_cfg->adv_data);
btif_me_ble_set_scan_rsp_data(adv_data_cfg->scan_rsp_data_len,
adv_data_cfg->scan_rsp_data);
}
/*****************************************************************************
Prototype : app_ibrt_ble_adv_start
Description : enable ble adv
Input : uint8_t adv_type, uint16_t advInterval
Output : None
Return Value :
Calls :
Called By :
History :
Date : 2019/12/28
Author : bestechnic
Modification : Created function
*****************************************************************************/
void app_ibrt_ble_adv_start(uint8_t adv_type, uint16_t advInterval) {
TRACE(2, "ble adv start with adv_type %d advIntervalms %dms", adv_type,
advInterval);
app_ble_adv_para_data_cfg.adv_type = adv_type;
app_ble_adv_para_data_cfg.advInterval_Ms = advInterval;
switch (slaveBleMode.state) {
case BLE_ADVERTISING:
SET_SLAVE_BLE_STATE(BLE_STOPPING_ADV);
SET_SLAVE_BLE_OP(BLE_START_ADV);
btif_me_ble_set_adv_en(false);
break;
case BLE_STARTING_ADV:
case BLE_STOPPING_ADV:
SET_SLAVE_BLE_OP(BLE_START_ADV);
break;
case BLE_STATE_IDLE:
SET_SLAVE_BLE_STATE(BLE_STARTING_ADV);
app_ibrt_ble_set_adv_para_handler(&app_ble_adv_para_data_cfg);
app_ibrt_ble_set_adv_data_handler(&app_ble_adv_para_data_cfg);
btif_me_ble_set_adv_en(true);
break;
default:
break;
}
}
/*****************************************************************************
Prototype : app_ibrt_ble_adv_stop
Description : disable ble adv
Input : None
Output : None
Return Value :
Calls :
Called By :
History :
Date : 2019/12/28
Author : bestechnic
Modification : Created function
*****************************************************************************/
void app_ibrt_ble_adv_stop(void) {
TRACE(1, "%s", __func__);
SET_SLAVE_BLE_STATE(BLE_STOPPING_ADV);
SET_SLAVE_BLE_OP(BLE_STOP_ADV);
btif_me_ble_set_adv_en(false);
}
/*****************************************************************************
Prototype : app_ibrt_ble_switch_activities
Description : ble adv state machine switch
Input : None
Output : None
Return Value :
Calls :
Called By :
History :
Date : 2019/12/28
Author : bestechnic
Modification : Created function
*****************************************************************************/
void app_ibrt_ble_switch_activities(void) {
switch (slaveBleMode.state) {
case BLE_STARTING_ADV:
SET_SLAVE_BLE_STATE(BLE_ADVERTISING);
if (slaveBleMode.op == BLE_START_ADV) {
SET_SLAVE_BLE_OP(BLE_OP_IDLE);
}
break;
case BLE_STOPPING_ADV:
SET_SLAVE_BLE_STATE(BLE_STATE_IDLE);
if (slaveBleMode.op == BLE_STOP_ADV) {
SET_SLAVE_BLE_OP(BLE_OP_IDLE);
}
break;
default:
break;
}
switch (slaveBleMode.op) {
case BLE_START_ADV:
app_ibrt_ble_adv_start(ADV_CONN_UNDIR,
app_ble_adv_para_data_cfg.advInterval_Ms);
break;
default:
break;
}
}
/*****************************************************************************
Prototype : app_ibrt_ble_adv_data_config
Description : config ble adv data and scan response data by customer
Input : uint8_t *advData, uint8_t advDataLen
: uint8_t *scanRspData, uint8_t scanRspDataLen
Output : None
Return Value :
Calls :
Called By :
History :
Date : 2019/12/28
Author : bestechnic
Modification : Created function
*****************************************************************************/
void app_ibrt_ble_adv_data_config(uint8_t *advData, uint8_t advDataLen,
uint8_t *scanRspData,
uint8_t scanRspDataLen) {
ASSERT(APP_IBRT_BLE_ADV_DATA_MAX_LEN >= advDataLen,
"ble adv data len exceed");
ASSERT(APP_IBRT_BLE_SCAN_RSP_DATA_MAX_LEN >= scanRspDataLen,
"scan response data len exceed")
memcpy(app_ble_adv_para_data_cfg.adv_data, advData, advDataLen);
memcpy(app_ble_adv_para_data_cfg.scan_rsp_data, scanRspData, scanRspDataLen);
app_ble_adv_para_data_cfg.adv_data_len = advDataLen;
app_ble_adv_para_data_cfg.scan_rsp_data_len = scanRspDataLen;
}