|
|
@ -14,17 +14,21 @@ BLE_DB_DISCOVERY_DEF(m_db_disc); |
|
|
|
NRF_BLE_SCAN_DEF(m_scan); /**< Scanning Module instance. */ |
|
|
|
NRF_BLE_GQ_DEF(m_ble_gatt_queue, NRF_SDH_BLE_CENTRAL_LINK_COUNT, NRF_BLE_GQ_QUEUE_SIZE); /**< BLE GATT Queue instance. */ |
|
|
|
|
|
|
|
static uint16_t m_ble_nus_max_data_len = BLE_GATT_ATT_MTU_DEFAULT - OPCODE_LENGTH - HANDLE_LENGTH; |
|
|
|
static ble_uuid_t const m_nus_uuid = {.uuid = BLE_UUID_NUS_SERVICE, .type = NUS_SERVICE_UUID_TYPE}; |
|
|
|
static on_sdk_event_cb_t m_on_sdk_event_cb; |
|
|
|
static char m_target_periph_name0[20] = BLE_CLIENT_NAME; |
|
|
|
static uint16_t m_ble_connect_handle; |
|
|
|
static uint16_t m_ble_nus_max_data_len = BLE_GATT_ATT_MTU_DEFAULT - OPCODE_LENGTH - HANDLE_LENGTH; |
|
|
|
static ble_uuid_t const m_nus_uuid = {.uuid = BLE_UUID_NUS_SERVICE, .type = NUS_SERVICE_UUID_TYPE}; |
|
|
|
static on_sdk_event_t m_onSdkEvent; |
|
|
|
static uint16_t m_ble_connect_handle; |
|
|
|
static char m_bleScanFilterName[40]; |
|
|
|
static char m_slaveName[40]; |
|
|
|
static bool m_autoConnect = false; |
|
|
|
|
|
|
|
void assert_nrf_callback(uint16_t line_num, const uint8_t* p_file_name) { app_error_handler(0xDEADBEEF, line_num, p_file_name); } |
|
|
|
static void nus_error_handler(uint32_t nrf_error) { APP_ERROR_HANDLER(nrf_error); } |
|
|
|
static bool shutdown_handler(nrf_pwr_mgmt_evt_t event) { return true; } |
|
|
|
NRF_PWR_MGMT_HANDLER_REGISTER(shutdown_handler, APP_SHUTDOWN_HANDLER_PRIORITY); |
|
|
|
|
|
|
|
extern uint16_t ble_advdata_search(uint8_t const* p_encoded_data, uint16_t data_len, uint16_t* p_offset, uint8_t ad_type); |
|
|
|
|
|
|
|
static void scan_start(void) { |
|
|
|
ret_code_t ret; |
|
|
|
ret = nrf_ble_scan_start(&m_scan); |
|
|
@ -87,10 +91,14 @@ static void onScanEvent(scan_evt_t const* p_scan_evt) { |
|
|
|
} break; |
|
|
|
|
|
|
|
case NRF_BLE_SCAN_EVT_FILTER_MATCH: { |
|
|
|
NRF_LOG_INFO("Device \"%s\" found, sending a connection request.", ble_find_name(p_adv->data.p_data, p_adv->data.len)); |
|
|
|
err_code = sd_ble_gap_connect(&p_adv->peer_addr, p_scan_param, &m_conn_param, APP_BLE_CONN_CFG_TAG); |
|
|
|
if (err_code != NRF_SUCCESS) { |
|
|
|
NRF_LOG_ERROR("sd_ble_gap_connect() failed: 0x%x.", err_code); |
|
|
|
if (m_autoConnect) { |
|
|
|
if (strcmp(ble_find_name(p_adv->data.p_data, p_adv->data.len), m_slaveName) == 0) { |
|
|
|
NRF_LOG_INFO("Device \"%s\" found, sending a connection request.", ble_find_name(p_adv->data.p_data, p_adv->data.len)); |
|
|
|
err_code = sd_ble_gap_connect(&p_adv->peer_addr, p_scan_param, &m_conn_param, APP_BLE_CONN_CFG_TAG); |
|
|
|
if (err_code != NRF_SUCCESS) { |
|
|
|
NRF_LOG_ERROR("sd_ble_gap_connect() failed: 0x%x.", err_code); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} break; |
|
|
|
default: |
|
|
@ -112,25 +120,25 @@ static void onBleNusEvent(ble_nus_c_t* p_ble_nus_c, ble_nus_c_evt_t const* p_ble |
|
|
|
|
|
|
|
NRF_LOG_INFO("Connected to device with Nordic UART Service."); |
|
|
|
event.event = kevent_connected; |
|
|
|
m_on_sdk_event_cb(&event); |
|
|
|
m_onSdkEvent(&event); |
|
|
|
break; |
|
|
|
case BLE_NUS_C_EVT_NUS_TX_EVT: |
|
|
|
event.event = kevent_on_rx_data; |
|
|
|
event.event = kevent_onRxData; |
|
|
|
event.data.on_ble_data.data = p_ble_nus_evt->p_data; |
|
|
|
event.data.on_ble_data.length = p_ble_nus_evt->data_len; |
|
|
|
m_on_sdk_event_cb(&event); |
|
|
|
m_onSdkEvent(&event); |
|
|
|
break; |
|
|
|
case BLE_NUS_C_EVT_NUS_TX_EVT_2: |
|
|
|
event.event = kevent_on_rx_data; |
|
|
|
event.event = kevent_onRxData; |
|
|
|
event.data.on_ble_data.data = p_ble_nus_evt->p_data; |
|
|
|
event.data.on_ble_data.length = p_ble_nus_evt->data_len; |
|
|
|
m_on_sdk_event_cb(&event); |
|
|
|
m_onSdkEvent(&event); |
|
|
|
break; |
|
|
|
|
|
|
|
case BLE_NUS_C_EVT_DISCONNECTED: |
|
|
|
NRF_LOG_INFO("Disconnected."); |
|
|
|
event.event = kevent_disconnected; |
|
|
|
m_on_sdk_event_cb(&event); |
|
|
|
event.event = kevent_disConnected; |
|
|
|
m_onSdkEvent(&event); |
|
|
|
scan_start(); |
|
|
|
break; |
|
|
|
} |
|
|
@ -149,7 +157,7 @@ static void onBleEvent(ble_evt_t const* p_ble_evt, void* p_context) { |
|
|
|
break; |
|
|
|
case BLE_GAP_EVT_DISCONNECTED: |
|
|
|
NRF_LOG_INFO("Disconnected. conn_handle: 0x%x, reason: 0x%x", p_gap_evt->conn_handle, p_gap_evt->params.disconnected.reason); |
|
|
|
m_ble_connect_handle = -1; |
|
|
|
m_ble_connect_handle = 0; |
|
|
|
break; |
|
|
|
case BLE_GAP_EVT_TIMEOUT: |
|
|
|
if (p_gap_evt->params.timeout.src == BLE_GAP_TIMEOUT_SRC_CONN) { |
|
|
@ -214,7 +222,7 @@ static void scan_init(void) { |
|
|
|
err_code = nrf_ble_scan_init(&m_scan, &init_scan, onScanEvent); |
|
|
|
APP_ERROR_CHECK(err_code); |
|
|
|
|
|
|
|
APP_ERROR_CHECK(nrf_ble_scan_filter_set(&m_scan, SCAN_NAME_FILTER, m_target_periph_name0)); |
|
|
|
APP_ERROR_CHECK(nrf_ble_scan_filter_set(&m_scan, SCAN_NAME_FILTER, m_bleScanFilterName)); |
|
|
|
err_code = nrf_ble_scan_filters_enable(&m_scan, NRF_BLE_SCAN_NAME_FILTER, false); |
|
|
|
APP_ERROR_CHECK(err_code); |
|
|
|
} |
|
|
@ -253,13 +261,18 @@ static void nus_c_init(void) { |
|
|
|
APP_ERROR_CHECK(err_code); |
|
|
|
} |
|
|
|
|
|
|
|
void sdk_initer(on_sdk_event_cb_t on_sdk_event_cb) { |
|
|
|
m_on_sdk_event_cb = on_sdk_event_cb; |
|
|
|
void zble_master_sdk_init(const char* bleScanFilterName, const char* slaveName, bool autoConnect, on_sdk_event_t onSdkEvent) { |
|
|
|
APP_ERROR_HANDLER(onSdkEvent != NULL); |
|
|
|
APP_ERROR_HANDLER(bleScanFilterName != NULL); |
|
|
|
|
|
|
|
memcpy(m_bleScanFilterName, bleScanFilterName, strlen(bleScanFilterName)); |
|
|
|
if (slaveName) memcpy(m_slaveName, slaveName, strlen(slaveName)); |
|
|
|
m_onSdkEvent = onSdkEvent; |
|
|
|
m_autoConnect = autoConnect; |
|
|
|
|
|
|
|
// log init |
|
|
|
APP_ERROR_CHECK(NRF_LOG_INIT(NULL)); |
|
|
|
NRF_LOG_DEFAULT_BACKENDS_INIT(); |
|
|
|
|
|
|
|
APP_ERROR_CHECK(app_timer_init()); |
|
|
|
{ |
|
|
|
ble_db_discovery_init_t db_init = {0}; |
|
|
@ -279,6 +292,31 @@ void sdk_initer(on_sdk_event_cb_t on_sdk_event_cb) { |
|
|
|
scan_start(); |
|
|
|
} |
|
|
|
|
|
|
|
void sdk_ble_tx(uint8_t* data, int32_t len) { ble_nus_c_string_send(&m_ble_nus_c, data, len); } |
|
|
|
void sdk_scan_start(const char* name, bool autoconnected) {} |
|
|
|
void sdk_scan_stop(const char* name); |
|
|
|
void zble_master_sdk_ble_tx(uint8_t* data, int32_t len) { ble_nus_c_string_send(&m_ble_nus_c, data, len); } |
|
|
|
void zble_master_sdk_rescan(const char* slaveName, bool autoConnected) { |
|
|
|
// |
|
|
|
uint16_t connect_handle = 0; |
|
|
|
CRITICAL_REGION_ENTER(); |
|
|
|
if (slaveName == NULL) { |
|
|
|
memset(m_slaveName, 0, sizeof(m_slaveName)); |
|
|
|
} else { |
|
|
|
memcpy(m_slaveName, slaveName, strlen(slaveName)); |
|
|
|
} |
|
|
|
m_autoConnect = autoConnected; |
|
|
|
connect_handle = m_ble_connect_handle; |
|
|
|
CRITICAL_REGION_EXIT(); |
|
|
|
|
|
|
|
if (connect_handle != 0) { |
|
|
|
sd_ble_gap_disconnect(connect_handle, BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void zble_master_sdk_set_slave_name(const char* slaveName) { |
|
|
|
CRITICAL_REGION_ENTER(); |
|
|
|
if (slaveName == NULL) { |
|
|
|
memset(m_slaveName, 0, sizeof(m_slaveName)); |
|
|
|
} else { |
|
|
|
memcpy(m_slaveName, slaveName, strlen(slaveName)); |
|
|
|
} |
|
|
|
CRITICAL_REGION_EXIT(); |
|
|
|
} |