196 lines
5.8 KiB
C
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, ¬ification_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);
|
|
} |