From 87fbccf650b02c7adbb82b4452e980c019d57710 Mon Sep 17 00:00:00 2001 From: jhchun Date: Wed, 15 Apr 2026 17:50:33 +0900 Subject: [PATCH] =?UTF-8?q?BLE=20=EC=97=B0=EA=B2=B0=20=ED=95=B4=EC=A0=9C?= =?UTF-8?q?=20=EC=9B=90=EC=9D=B8=EC=97=90=20=EB=94=B0=EB=A5=B8=20=EA=B4=91?= =?UTF-8?q?=EA=B3=A0=20=EC=A7=80=EC=86=8D=EC=8B=9C=EA=B0=84=20=EB=B6=84?= =?UTF-8?q?=EA=B8=B0=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 의도치 않은 연결 해제: 광고 무한 지속 - 부팅 후 첫 광고 및 그외: 10분 --- .../ble_app_bladder_patch/main.c | 51 +++++++++++++------ .../pca10056/s140/config/sdk_config.h | 6 --- 2 files changed, 36 insertions(+), 21 deletions(-) diff --git a/project/ble_peripheral/ble_app_bladder_patch/main.c b/project/ble_peripheral/ble_app_bladder_patch/main.c index 5ad552a..2bdc58a 100644 --- a/project/ble_peripheral/ble_app_bladder_patch/main.c +++ b/project/ble_peripheral/ble_app_bladder_patch/main.c @@ -137,11 +137,9 @@ #define APP_BLE_OBSERVER_PRIO 3 /* BLE 이벤트 옵저버 우선순위 */ #define APP_ADV_INTERVAL 64 /* 광고 간격: 64 x 0.625ms = 40ms */ -#if FEATURE_NO_SLEEP -#define APP_ADV_DURATION 0 /* 슬립 비활성화(테스트) 시: 무한 광고 */ -#else -#define APP_ADV_DURATION 18000 /* 광고 지속시간: 18000 x 10ms = 3분 → 타임아웃 시 슬립 */ -#endif +#define APP_ADV_DURATION_NORMAL 60000 /* 일반 disconnect 시 광고 지속시간: 60000 x 10ms = 10분 */ +#define APP_ADV_DURATION_UNLIMITED 0 /* 의도치 않은 disconnect 시: 무한 광고 */ +#define APP_ADV_DURATION APP_ADV_DURATION_NORMAL /* 기본 광고 지속시간 (disconnect reason에 따라 런타임 변경) */ #define MIN_CONN_INTERVAL MSEC_TO_UNITS(30, UNIT_1_25_MS) /* 최소 연결 간격: 30ms */ #define MAX_CONN_INTERVAL MSEC_TO_UNITS(30, UNIT_1_25_MS) /* 최대 연결 간격: 30ms */ @@ -816,7 +814,8 @@ static void on_adv_evt(ble_adv_evt_t ble_adv_evt) * @brief BLE 광고 초기화 * * 광고 데이터 설정: 디바이스 이름(전체), NUS UUID - * 광고 모드: Fast (40ms 간격), 지속시간 3분 (FEATURE_NO_SLEEP 시 무한) + * 광고 모드: Fast (40ms 간격), 기본 지속시간 10분 + * disconnect reason에 따라 런타임에 무한 광고로 전환될 수 있음 */ static void advertising_init(void) { @@ -827,12 +826,7 @@ static void advertising_init(void) init.advdata.name_type = BLE_ADVDATA_FULL_NAME; init.advdata.include_appearance = true; - -#if FEATURE_NO_SLEEP init.advdata.flags = BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE; -#else - init.advdata.flags = BLE_GAP_ADV_FLAGS_LE_ONLY_LIMITED_DISC_MODE; -#endif init.srdata.uuids_complete.uuid_cnt = sizeof(m_adv_uuids) / sizeof(m_adv_uuids[0]); init.srdata.uuids_complete.p_uuids = m_adv_uuids; @@ -1025,8 +1019,22 @@ static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context) { /* BLE 연결이 끊어지는 경우 */ case BLE_GAP_EVT_DISCONNECTED: - DBG_PRINTF("[BLE] Disconnected (reason 0x%02X)\r\n", - p_ble_evt->evt.gap_evt.params.disconnected.reason); + { + uint8_t disc_reason = p_ble_evt->evt.gap_evt.params.disconnected.reason; + + /* 의도치 않은 disconnect 판별: + * 0x08 supervision timeout, 0x22 LMP response timeout, + * 0x3D MIC failure, 0x3E connection failed to be established + * → 무한 광고 유지 + 슬립 진입 차단 + */ + bool unintended_disc = (disc_reason == BLE_HCI_CONNECTION_TIMEOUT) || + (disc_reason == BLE_HCI_STATUS_CODE_LMP_RESPONSE_TIMEOUT) || + (disc_reason == BLE_HCI_CONN_TERMINATED_DUE_TO_MIC_FAILURE)|| + (disc_reason == BLE_HCI_CONN_FAILED_TO_BE_ESTABLISHED); + + DBG_PRINTF("[BLE] Disconnected (reason 0x%02X)%s\r\n", + disc_reason, unintended_disc ? " [UNINTENDED]" : ""); + ble_connection_st = 0; m_conn_handle = BLE_CONN_HANDLE_INVALID; m_tx_in_progress = false; @@ -1034,14 +1042,27 @@ static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context) maa_async_abort(); // 비동기 측정 상태에 의한 먹통 현상 방지 s_tx_pending = false; // pending TX 클리어 - if (device_status == true) + /* 광고 지속시간을 disconnect 원인에 따라 런타임 조정 */ + (void)sd_ble_gap_adv_stop(m_advertising.adv_handle); + m_advertising.adv_modes_config.ble_adv_fast_timeout = + unintended_disc ? APP_ADV_DURATION_UNLIMITED : APP_ADV_DURATION_NORMAL; + + ret_code_t adv_err = ble_advertising_start(&m_advertising, BLE_ADV_MODE_FAST); + if (adv_err != NRF_SUCCESS && adv_err != NRF_ERROR_INVALID_STATE) + { + APP_ERROR_CHECK(adv_err); + } + + /* 의도치 않은 disconnect: 슬립 진입 차단하여 지속 광고 보장 */ + if (!unintended_disc && device_status == true) { if (device_sleep_mode() == 0) { device_status = false; } } - break; + } + break; case BLE_GAP_EVT_CONNECTED: DBG_PRINTF("[BLE] Connected\r\n"); diff --git a/project/ble_peripheral/ble_app_bladder_patch/pca10056/s140/config/sdk_config.h b/project/ble_peripheral/ble_app_bladder_patch/pca10056/s140/config/sdk_config.h index 004ab63..fdb29de 100644 --- a/project/ble_peripheral/ble_app_bladder_patch/pca10056/s140/config/sdk_config.h +++ b/project/ble_peripheral/ble_app_bladder_patch/pca10056/s140/config/sdk_config.h @@ -50,12 +50,6 @@ #define FEATURE_PRINTF 0 #endif -//========================================================== -// FEATURE_NO_SLEEP -// 테스트를 위하여 슬립에 들어가지 않도록. -#ifndef FEATURE_NO_SLEEP -#define FEATURE_NO_SLEEP 0 -#endif //========================================================== // FEATURE_DELAY // 테스트를 위하여 SEND timer 500ms