/****************************************************************************** * @file app_pair.c * @brief 配对会话计时实现 * @author cyWu <1917507415@qq.com> * @date 2026.09.10 * @version V1.1.0 * @history * - V1.0.0, 2026.08.25, cyWu, 首次发布,实现配对会话计时与成功/超时判定 * - V1.1.0, 2026.09.10, cyWu, 窗口超时停止绑定广播 ******************************************************************************/ #include "app_pair.h" #include "board_pin.h" #include "usr_le_api.h" #include "system/includes.h" #define LOG_TAG_CONST APP #define LOG_TAG "[APP_PAIR]" #define LOG_INFO_ENABLE #include "debug.h" /** 配对会话状态,替代原来散落的 s_pairing / s_pair_ms */ typedef struct { uint8_t active; uint32_t elapsed_ms; } AppPairCtx_t; static AppPairCtx_t s_pair; /** * @brief 配对超时回调:从任务上下文停绑定广播 * @note app_pair_tick 跑在 usr_timer 硬件时基里,不断开/不停广播, * 把 BLE 动作丢到 sys_timeout,避免占中断时间。 * @param priv 未使用 * @return 无 */ static void pair_timeout_stop_adv(void *priv) { (void)priv; usr_stop_bind_adv(); } /** * @brief 开始一次配对会话(计时清零) * @return 无 */ void app_pair_start(void) { s_pair.active = 1; s_pair.elapsed_ms = 0; } /** * @brief 推进配对计时并检查结果,每个业务 tick 调用一次 * @param dt 距上次调用的毫秒数 * @return APP_PAIR_EVT_OK=配对成功,APP_PAIR_EVT_FAIL=超时,否则 NONE */ AppPairEvt_t app_pair_tick_1ms(uint16_t dt) { if (!s_pair.active) { return APP_PAIR_EVT_NONE; } /* BLE 侧绑定成功:结束本次配对会话 */ if (usr_get_pair_flag()) { s_pair.active = 0; s_pair.elapsed_ms = 0; log_info("pair ok\n"); return APP_PAIR_EVT_OK; } s_pair.elapsed_ms += dt; if (s_pair.elapsed_ms >= BOARD_PAIR_TIMEOUT_MS) { s_pair.active = 0; s_pair.elapsed_ms = 0; log_info("pair timeout 120s, stop bind adv\n"); sys_timeout_add(NULL, pair_timeout_stop_adv, 10); return APP_PAIR_EVT_FAIL; } return APP_PAIR_EVT_NONE; } /** * @brief 查询是否仍在配对会话中 * @return 1=进行中,0=未在配对 */ uint8_t app_pair_is_active(void) { return s_pair.active; }