From 6753136ea1d8e5750c8fa38e5f591125908e39ce Mon Sep 17 00:00:00 2001 From: jhchun Date: Wed, 5 Aug 2026 13:57:44 +0900 Subject: [PATCH] =?UTF-8?q?=EB=B3=B8=EB=94=A9=20=EC=82=AD=EC=A0=9C=20?= =?UTF-8?q?=ED=9B=84=20=EC=9E=AC=EB=B6=80=ED=8C=85=20=EB=B3=B5=EA=B7=80=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 초록 power-on LED 2초 → advertising LED 패턴으로 정상 전환 --- src/ble/ble_service.c | 57 ++++++++++++++++++++++++++++++++++++++++--- src/ble/ble_service.h | 2 ++ src/main.c | 2 +- 3 files changed, 57 insertions(+), 4 deletions(-) diff --git a/src/ble/ble_service.c b/src/ble/ble_service.c index 05a6625..570ed21 100644 --- a/src/ble/ble_service.c +++ b/src/ble/ble_service.c @@ -36,6 +36,7 @@ static struct bt_conn *current_conn; static ble_data_rx_cb_t rx_callback; static bool dfu_advertising_mode; static bool advertising_unlimited; +static bool advertising_restart_suspended; static uint8_t conn_param_update_attempts; static int64_t last_rx_conn_param_update_ms; static uint16_t current_notify_mtu = 23U; @@ -203,18 +204,33 @@ static void ble_pairing_window_init_from_bonds(void) { bool reset_request = ble_consume_pairing_window_reset_request(); + if (reset_request) + { + int err = bt_unpair(BT_ID_DEFAULT, NULL); + + if (err) + { + DBG_ERR("[BLE] Reset-window bt_unpair retry failed err=%d\r\n", err); + } + } + bond_peer_exists = false; bt_foreach_bond(BT_ID_DEFAULT, bond_check_cb, &bond_peer_exists); DBG_CORE("[BLE] Bond peer exists=%u reset_window=%u\r\n", bond_peer_exists ? 1U : 0U, reset_request ? 1U : 0U); - if (bond_peer_exists) + if (reset_request) + { + bond_peer_exists = false; + pairing_window_open_set(true); + } + else if (bond_peer_exists) { pairing_window_close(); } else { - pairing_window_open_set(reset_request); + pairing_window_open_set(false); } } @@ -389,6 +405,13 @@ static int ble_security_init(void) static void adv_restart_handler(struct k_work *work) { ARG_UNUSED(work); + + if (advertising_restart_suspended) + { + DBG_CORE("[BLE] Advertising restart skipped (suspended)\r\n"); + return; + } + ble_advertising_start(); led_set_state(LED_STATE_ADVERTISING); } @@ -539,7 +562,10 @@ static void connected(struct bt_conn *conn, uint8_t err) if (err) { DBG_ERR("[BLE] Connect failed (err %d) -> re-adv\r\n", err); - k_work_submit(&adv_restart_work); + if (!advertising_restart_suspended) + { + k_work_submit(&adv_restart_work); + } return; } @@ -610,6 +636,12 @@ static void disconnected(struct bt_conn *conn, uint8_t reason) reason, advertising_unlimited ? "unlimited" : "10min"); + if (advertising_restart_suspended) + { + DBG_CORE("[BLE] Disconnected while adv restart suspended\r\n"); + return; + } + // 워크큐에서 advertising 재시작 k_work_submit(&adv_restart_work); } @@ -814,6 +846,7 @@ int ble_advertising_start(void) } ble_tx_power_apply_advertising(); + led_set_state(LED_STATE_ADVERTISING); k_work_cancel_delayable(&adv_timeout_work); if (!advertising_unlimited) // DFU 광고 포함, 미연결 10분 시 전원 OFF @@ -974,6 +1007,24 @@ void ble_pairing_window_mark_reset_open(void) #endif } +bool ble_pairing_window_reset_requested(void) +{ +#if IS_ENABLED(CONFIG_BT_SMP) && NRF_POWER_HAS_GPREGRET + return (nrf_power_gpregret_get(NRF_POWER, PAIRING_WINDOW_GPREGRET_REG) == PAIRING_WINDOW_GPREGRET_MAGIC); +#else + return false; +#endif +} + +void ble_advertising_restart_suspend(bool suspend) +{ + advertising_restart_suspended = suspend; + if (suspend) + { + k_work_cancel(&adv_restart_work); + } +} + bool ble_is_connected(void) { return (current_conn != NULL); diff --git a/src/ble/ble_service.h b/src/ble/ble_service.h index 44ff1a8..2c1943a 100644 --- a/src/ble/ble_service.h +++ b/src/ble/ble_service.h @@ -37,5 +37,7 @@ bool ble_dfu_advertising_is_enabled(void); bool ble_is_connected(void); int ble_disconnect_active(void); void ble_pairing_window_mark_reset_open(void); +bool ble_pairing_window_reset_requested(void); +void ble_advertising_restart_suspend(bool suspend); #endif /* BLE_SERVICE_H__ */ diff --git a/src/main.c b/src/main.c index a081e83..0844c3f 100644 --- a/src/main.c +++ b/src/main.c @@ -62,7 +62,7 @@ static void boot_context_detect(void) #endif // soft reset 후 복귀 (전원 버튼 새 부팅 X) - resume_without_power_button = (boot_reset_reason & (NRF_POWER_RESETREAS_SREQ_MASK | NRF_POWER_RESETREAS_DOG_MASK | NRF_POWER_RESETREAS_LOCKUP_MASK | NRF_POWER_RESETREAS_RESETPIN_MASK)) != 0U; + resume_without_power_button = ((boot_reset_reason & (NRF_POWER_RESETREAS_SREQ_MASK | NRF_POWER_RESETREAS_DOG_MASK | NRF_POWER_RESETREAS_LOCKUP_MASK | NRF_POWER_RESETREAS_RESETPIN_MASK)) != 0U) || ble_pairing_window_reset_requested(); // 다음 부팅 오판 방지를 위해 RESETREAS 플래그 정리 if (boot_reset_reason != 0U)