diff --git a/.vscode/settings.json b/.vscode/settings.json index b3a4726..bb10d5d 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -226,7 +226,7 @@ "nrf_queue.h": "c", "sdk_errors.h": "c", "nrf_ble_scan.h": "c", - "sdk_initer.h": "c", + "zble_master_sdk_init.h": "c", "uart_initer.h": "c", "protocol.h": "c", "protocol_utils.h": "c", @@ -238,7 +238,8 @@ "errorcode.h": "c", "zapp_core.h": "c", "event.h": "c", - "app_protocols.h": "c" + "app_protocols.h": "c", + "sdk_initer.h": "c" }, "files.encoding": "gbk", "search.exclude": { diff --git a/app/src/main.c b/app/src/main.c index 3faeab2..637107b 100644 --- a/app/src/main.c +++ b/app/src/main.c @@ -21,10 +21,9 @@ #include "nrf_sdh_ble.h" #include "nrf_sdh_soc.h" #include "service/sdk_initer.h" -#include "service/zble_nus_c.h" // -#include "service/uart_initer.h" #include "app_basic_service/zapp_core.h" +#include "service/uart_initer.h" // #include "app_protocols/app_protocols.h" #include "aproject_config/config.h" @@ -79,7 +78,7 @@ static void on_sdk_event_cb(sdk_event_t* event) { // } break; - case kevent_disconnected: + case kevent_disConnected: NRF_LOG_INFO("on disconnected...."); m_connected_state = false; nrf_gpio_pin_write(CONNECTED_STATE_GPIO, 0); @@ -97,7 +96,7 @@ static void on_sdk_event_cb(sdk_event_t* event) { // } break; - case kevent_on_rx_data: + case kevent_onRxData: // 透传消息到上位机 NRF_LOG_INFO("on rx data...%s", zhex2str(event->data.on_ble_data.data, event->data.on_ble_data.length)); uart_send_data(event->data.on_ble_data.data, event->data.on_ble_data.length); @@ -112,7 +111,6 @@ static void on_uart_data(uint8_t* data, int32_t len) { zble_proto_packet_t* rx = (zble_proto_packet_t*)data; // zble_proto_packet_t* tx = ble_proto_get_receipt_buf(); - if (rx->to == kzble_master) { if (rx->cmd == kzble_cmd_reset) { NVIC_SystemReset(); @@ -132,7 +130,7 @@ static void on_uart_data(uint8_t* data, int32_t len) { send_success_receipt(rx, NULL, 0); } } else { - sdk_ble_tx(data, len); + zble_master_sdk_ble_tx(data, len); } } @@ -157,8 +155,13 @@ static void board_init() { int main(void) { zappcore_init(); board_init(); - sdk_initer(on_sdk_event_cb); + // void zble_master_sdk_init(const char* bleScanFilterName, const char* slaveName, bool autoConnect, on_sdk_event_t onSdkEvent); + // void zble_master_sdk_ble_tx(uint8_t* data, int32_t len); + // void zble_master_sdk_rescan(const char* slaveName, bool autoconnected); + // void zble_master_sdk_set_slave_name(const char* slaveName); + + zble_master_sdk_init("AciDisp", "AciDisp00000", true, on_sdk_event_cb); uart_initer_init(on_uart_data); diff --git a/app/src/service/sdk_initer.c b/app/src/service/sdk_initer.c index 82fe206..b391ed8 100644 --- a/app/src/service/sdk_initer.c +++ b/app/src/service/sdk_initer.c @@ -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); \ No newline at end of file +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(); +} diff --git a/app/src/service/sdk_initer.h b/app/src/service/sdk_initer.h index e2384eb..33203b2 100644 --- a/app/src/service/sdk_initer.h +++ b/app/src/service/sdk_initer.h @@ -26,9 +26,10 @@ #define BLE_CLIENT_NAME "AciDisp" typedef enum { + kevent_onScanResult, kevent_connected, - kevent_disconnected, - kevent_on_rx_data, + kevent_disConnected, + kevent_onRxData, } sdk_event_type_t; typedef struct { @@ -41,14 +42,33 @@ typedef struct { } data; } sdk_event_t; -typedef void (*on_sdk_event_cb_t)(sdk_event_t* event); +typedef void (*on_sdk_event_t)(sdk_event_t* event); typedef struct { ble_nus_c_evt_handler_t nus_c_evt_handler; } sdk_cfg_t; -void sdk_initer(on_sdk_event_cb_t on_sdk_event_cb); -void sdk_ble_tx(uint8_t* data, int32_t len); +/** + * @brief + * + * @param bleScanFilterName 过滤名称 + * @param slaveName 从机名称 + * @param autoConnect 是否自动连接 + * @param onSdkEvent 事件回调 + */ +void zble_master_sdk_init(const char* bleScanFilterName, const char* slaveName, bool autoConnect, on_sdk_event_t onSdkEvent); +void zble_master_sdk_ble_tx(uint8_t* data, int32_t len); -void sdk_scan_start(const char* name, bool autoconnected); -void sdk_scan_stop(const char* name); +/** + * @brief 重新开始扫描 + * + * @param slaveName + * @param autoconnected + */ +void zble_master_sdk_rescan(const char* slaveName, bool autoconnected); +/** + * @brief 设置从机设备 + * + * @param slaveName + */ +void zble_master_sdk_set_slave_name(const char* slaveName);