본딩 삭제 후 재부팅 복귀 처리 수정

- 초록 power-on LED 2초 → advertising LED 패턴으로 정상 전환
This commit is contained in:
2026-08-05 13:57:44 +09:00
parent 2e3fca2f80
commit 6753136ea1
3 changed files with 57 additions and 4 deletions
+54 -3
View File
@@ -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);
+2
View File
@@ -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__ */
+1 -1
View File
@@ -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)