N32WB031_MysteryLight/src/app_ble_support.c
Yilin Sun 31447e4249
Added global lock for BLE stack.
Signed-off-by: Yilin Sun <imi415@imi.moe>
2023-10-28 13:55:02 +08:00

196 lines
5.8 KiB
C

/* FreeRTOS */
#include "FreeRTOS.h"
#include "semphr.h"
#include "task.h"
/* BLE Stack */
#include "ns_ble.h"
#include "ns_ble_task.h"
#include "ns_sec.h"
/* Profiles */
#include "app_ble_profiles/app_ble_bass.h"
#include "app_ble_profiles/app_ble_diss.h"
/* Board */
#include "board.h"
static TaskHandle_t s_ble_task_handle;
static SemaphoreHandle_t s_ble_lock_handle;
static void app_ble_task(void *parameters);
static void app_ble_msg_handler(struct ble_msg_t const *p_ble_msg);
static void app_user_msg_handler(ke_msg_id_t msgid, void const *p_param);
static void app_ble_gap_params_init(void);
static void app_ble_adv_init(void);
static void app_ble_sec_init(void);
static void app_ble_prf_init(void);
int app_ble_init(void) {
struct ns_stack_cfg_t app_handler = {0};
app_handler.ble_msg_handler = app_ble_msg_handler;
app_handler.user_msg_handler = app_user_msg_handler;
app_handler.lsc_cfg = BLE_LSC_LSE_32768HZ;
ns_ble_stack_init(&app_handler);
app_ble_gap_params_init();
app_ble_sec_init();
app_ble_adv_init();
app_ble_prf_init();
// start advertising
ns_ble_adv_start();
s_ble_lock_handle = xSemaphoreCreateMutex();
if (s_ble_lock_handle == NULL) {
return -1;
}
if (xTaskCreate(app_ble_task, "BLE", 1536, NULL, 5, &s_ble_task_handle) != pdPASS) {
return -2;
}
NVIC_SetPriority(RESERVED_IRQn, 2);
NVIC_EnableIRQ(RESERVED_IRQn);
return 0;
}
int app_ble_lock(uint32_t block_ms) {
if (xSemaphoreTake(s_ble_lock_handle, pdMS_TO_TICKS(block_ms)) != pdPASS) {
return -1;
}
return 0;
}
int app_ble_unlock(void) {
xSemaphoreGive(s_ble_lock_handle);
return 0;
}
void RESERVED_IRQHandler(void) {
BaseType_t hp_woken = pdFALSE;
xTaskNotifyFromISR(s_ble_task_handle, 0, eNoAction, &hp_woken);
portYIELD_FROM_ISR(hp_woken);
}
static void app_ble_task(void *parameters) {
uint32_t notification_value;
for (;;) {
rwip_schedule();
xTaskNotifyWait(0, 0, &notification_value, portMAX_DELAY);
}
}
static void app_ble_msg_handler(struct ble_msg_t const *p_ble_msg) {
switch (p_ble_msg->msg_id) {
case APP_BLE_OS_READY:
break;
case APP_BLE_GAP_CONNECTED:
board_led_set(1, true);
app_ble_bass_enable_prf(app_env.conidx);
break;
case APP_BLE_GAP_DISCONNECTED:
ns_ble_adv_start();
board_led_set(1, false);
break;
default:
break;
}
}
static void app_ble_adv_msg_handler(enum app_adv_mode adv_mode) {
}
static void app_user_msg_handler(ke_msg_id_t const msgid, void const *p_param) {
}
static void app_ble_gap_params_init(void) {
struct ns_gap_params_t dev_info = {0};
uint8_t *p_mac = SystemGetMacAddr();
if (p_mac != NULL) {
memcpy(dev_info.mac_addr.addr, p_mac, BD_ADDR_LEN);
} else {
memcpy(dev_info.mac_addr.addr, "\x01\x02\x03\x04\x05\x06", BD_ADDR_LEN);
}
dev_info.mac_addr_type = GAPM_STATIC_ADDR;
dev_info.appearance = 0;
dev_info.dev_role = GAP_ROLE_PERIPHERAL;
dev_info.dev_name_len = sizeof(CUSTOM_DEVICE_NAME) - 1;
memcpy(dev_info.dev_name, CUSTOM_DEVICE_NAME, dev_info.dev_name_len);
dev_info.dev_conn_param.intv_min = MSECS_TO_UNIT(MIN_CONN_INTERVAL, MSECS_UNIT_1_25_MS);
dev_info.dev_conn_param.intv_max = MSECS_TO_UNIT(MAX_CONN_INTERVAL, MSECS_UNIT_1_25_MS);
dev_info.dev_conn_param.latency = SLAVE_LATENCY;
dev_info.dev_conn_param.time_out = MSECS_TO_UNIT(CONN_SUP_TIMEOUT, MSECS_UNIT_10_MS);
dev_info.conn_param_update_delay = FIRST_CONN_PARAMS_UPDATE_DELAY;
ns_ble_gap_init(&dev_info);
}
static void app_ble_adv_init(void) {
struct ns_adv_params_t user_adv = {0};
// init advertising data
user_adv.adv_data_len = CUSTOM_USER_ADVERTISE_DATA_LEN;
memcpy(user_adv.adv_data, CUSTOM_USER_ADVERTISE_DATA, CUSTOM_USER_ADVERTISE_DATA_LEN);
user_adv.scan_rsp_data_len = CUSTOM_USER_ADV_SCAN_RESP_DATA_LEN;
memcpy(user_adv.scan_rsp_data, CUSTOM_USER_ADV_SCAN_RESP_DATA, CUSTOM_USER_ADV_SCAN_RESP_DATA_LEN);
user_adv.attach_appearance = false;
user_adv.attach_name = true;
user_adv.ex_adv_enable = false;
user_adv.adv_phy = PHY_1MBPS_VALUE;
// init advertising params
user_adv.directed_adv.enable = false;
user_adv.fast_adv.enable = true;
user_adv.fast_adv.duration = CUSTOM_ADV_FAST_DURATION;
user_adv.fast_adv.adv_intv = CUSTOM_ADV_FAST_INTERVAL;
user_adv.slow_adv.enable = true;
user_adv.slow_adv.duration = CUSTOM_ADV_SLOW_DURATION;
user_adv.slow_adv.adv_intv = CUSTOM_ADV_SLOW_INTERVAL;
user_adv.ble_adv_msg_handler = app_ble_adv_msg_handler;
ns_ble_adv_init(&user_adv);
}
static void app_ble_sec_init(void) {
struct ns_sec_init_t sec_init = {0};
sec_init.rand_pin_enable = false;
sec_init.pin_code = 123456;
sec_init.pairing_feat.auth =
(SEC_PARAM_BOND | (SEC_PARAM_MITM << 2) | (SEC_PARAM_LESC << 3) | (SEC_PARAM_KEYPRESS << 4));
sec_init.pairing_feat.iocap = SEC_PARAM_IO_CAPABILITIES;
sec_init.pairing_feat.key_size = SEC_PARAM_KEY_SIZE;
sec_init.pairing_feat.oob = SEC_PARAM_OOB;
sec_init.pairing_feat.ikey_dist = SEC_PARAM_IKEY;
sec_init.pairing_feat.rkey_dist = SEC_PARAM_RKEY;
sec_init.pairing_feat.sec_req = SEC_PARAM_SEC_MODE_LEVEL;
sec_init.bond_enable = BOND_STORE_ENABLE;
sec_init.bond_db_addr = BOND_DATA_BASE_ADDR;
sec_init.bond_max_peer = MAX_BOND_PEER;
sec_init.bond_sync_delay = 2000;
sec_init.ns_sec_msg_handler = NULL;
ns_sec_init(&sec_init);
}
static void app_ble_prf_init(void) {
ns_ble_add_prf_func_register(app_ble_bass_init);
ns_ble_add_prf_func_register(app_ble_diss_init);
}