From ae079c1fc5d990ba55714d4b3a51b19f96edaec4 Mon Sep 17 00:00:00 2001
From: WXK <287788329@qq.com>
Date: 星期四, 24 四月 2025 16:01:43 +0800
Subject: [PATCH] 改为中断来低电平触发发送当前扫描数据,3s内扫描不到的会退出,串口来55 AA 75 70 64 61 74 65,进入升级模式

---
 01_SDK/nimble/host/nimble/nimble/host/src/ble_gap.c |  110 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 109 insertions(+), 1 deletions(-)

diff --git a/01_SDK/nimble/host/nimble/nimble/host/src/ble_gap.c b/01_SDK/nimble/host/nimble/nimble/host/src/ble_gap.c
index d9193f7..ffbe9cc 100644
--- a/01_SDK/nimble/host/nimble/nimble/host/src/ble_gap.c
+++ b/01_SDK/nimble/host/nimble/nimble/host/src/ble_gap.c
@@ -1785,7 +1785,7 @@
 #endif
 
 #if NIMBLE_BLE_CONNECT
-static int
+int
 ble_gap_rd_rem_sup_feat_tx(uint16_t handle)
 {
     struct ble_hci_le_rd_rem_feat_cp cmd;
@@ -2580,6 +2580,10 @@
         ble_gap_slave_reset_state(0);
         goto done;
     }
+	
+#if SMP_MULTI_ADDR_MODE_EN
+    ble_hs_id_set_used_addr_type(own_addr_type);
+#endif
 
     if (duration_ms != BLE_HS_FOREVER) {
         ble_gap_slave_set_timer(duration_ticks);
@@ -5713,6 +5717,109 @@
 #endif
 }
 
+#if SMP_MULTI_ADDR_MODE_EN
+#include "host/ble_store.h"
+
+int
+ble_gap_unpair(const ble_addr_t *peer_addr, const ble_addr_t *own_addr)
+{
+#if NIMBLE_BLE_SM
+    struct ble_hs_conn *conn;
+
+    if (ble_addr_cmp(peer_addr, BLE_ADDR_ANY) == 0) {
+        return BLE_HS_EINVAL;
+    }
+
+    ble_hs_lock();
+
+    conn = ble_hs_conn_find_by_addr(peer_addr);
+    if (conn != NULL) {
+    	ble_addr_t cur_own_addr = {0};
+    	cur_own_addr.type = conn->bhc_our_addr_type;
+        ble_hs_id_copy_addr(conn->bhc_our_addr_type, cur_own_addr.val, NULL);
+
+    	if(ble_addr_cmp(own_addr, &cur_own_addr) == 0){
+    		ble_gap_terminate_with_conn(conn, BLE_ERR_REM_USER_CONN_TERM);
+    	}
+    }
+
+    ble_hs_unlock();
+
+    ble_hs_pvcy_remove_entry(peer_addr->type, peer_addr->val);
+
+    return ble_store_util_delete_peer(peer_addr, own_addr);
+#else
+    return BLE_HS_ENOTSUP;
+#endif
+}
+
+int
+ble_gap_unpair_oldest_peer(void)
+{
+#if NIMBLE_BLE_SM
+    int num_peers;
+    int rc;
+
+    num_peers = ble_store_config_get_our_secs_num();
+    if(num_peers == 0){
+        return BLE_HS_ENOENT;
+    }
+
+    struct ble_store_value_sec *oldest_val_sec = ble_store_config_get_our_secs(0);
+
+    rc = ble_gap_unpair(&oldest_val_sec->peer_addr, &oldest_val_sec->own_addr);
+    if (rc != 0) {
+        return rc;
+    }
+
+    return 0;
+#else
+    return BLE_HS_ENOTSUP;
+#endif
+}
+
+int
+ble_gap_unpair_oldest_except(const ble_addr_t *peer_addr)
+{
+#if NIMBLE_BLE_SM
+    int num_peers;
+    int rc, i;
+
+    num_peers = ble_store_config_get_cccds_num();
+    if (num_peers == 0) {
+        return BLE_HS_ENOENT;
+    }
+
+    ble_addr_t own_addr;
+	own_addr.type = ble_hs_id_get_used_addr_type();
+	rc = ble_hs_id_copy_addr(own_addr.type, own_addr.val, NULL);
+	if(rc != 0){
+		return -1;
+	}
+
+    struct ble_store_value_cccd *oldest_val_cccd = ble_store_config_get_cccds(0);
+
+    for (i = 0; i < num_peers; i++) {
+        struct ble_store_value_cccd *cur = oldest_val_cccd + i;
+        if (ble_addr_cmp(peer_addr, &cur->peer_addr) != 0 ||
+            ble_addr_cmp(&own_addr, &cur->own_addr) != 0) {
+            break;
+        }
+    }
+
+    if (i >= num_peers) {
+        return BLE_HS_ENOMEM;
+    }
+
+    oldest_val_cccd = oldest_val_cccd + i;
+
+    return ble_gap_unpair(&oldest_val_cccd->peer_addr, &oldest_val_cccd->own_addr);
+#else
+    return BLE_HS_ENOTSUP;
+#endif
+}
+
+#else
 int
 ble_gap_unpair(const ble_addr_t *peer_addr)
 {
@@ -5803,6 +5910,7 @@
     return BLE_HS_ENOTSUP;
 #endif
 }
+#endif
 
 void
 ble_gap_passkey_event(uint16_t conn_handle,

--
Gitblit v1.9.3