303 lines
10 KiB
C++
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;
|
|
}
|