2 Commits

Author SHA1 Message Date
f5a2777abf feat(rtc+ble): A+B+C 三件套 RTC 偶发连接失败修复 + BLE 配网 reboot 修复 (移植自 Baji)
============ 问题与修复 ============

### 问题 1: 配网模式按 BOOT 进入配网 → 设备 reboot
  日志:
    E BT_OSI: future_new unable to allocate memory for the semaphore.
    assert failed: future_ready future.c:64 (future != NULL)

  根因:
    BLE Bluedroid 协议栈初始化时, future_new 分配 semaphore 失败 → 后续 future_ready
    拿到 NULL → assert. 跟 Baji 的 vQueueDelete(NULL) 同性质 — DRAM 不足.
    Kapi 用 LVGL (~50-80 KB DRAM) + RTC SDK 静态 .bss (~30-50 KB),
    BLE Bluedroid stack 抢不到所需内存.

  修复 (sdkconfig):
    CONFIG_BT_ALLOCATION_FROM_SPIRAM_FIRST=y
    让 BLE Bluedroid 全局变量动态分配优先走 PSRAM, 释放 ~30 KB DRAM
    给 controller / GATT / WiFi 使用. 修复后 BLE 配网正常.

### A+B+C 三件套 (移植自 Baji commit 70f0cdd, 解决 RTC 偶发连接失败)

  [A] sdkconfig: CONFIG_LWIP_MAX_SOCKETS=10 → 20
    根治火山 RTC SDK 启动时 lwIP socket fd 不足触发 SocketConnection-Lite.c:191
    bind local ip failed → ICE 协商失败 → wait connect bits=0x0 超时.

  [B] application.h/cc + volc_rtc_protocol.h/cc: 失败 3 次后销毁 + 重建 engine
    新增 VolcRtcProtocol::ForceRebuildEngine() public 方法.
    application.cc 加 audio_channel_retry_count_ 重试计数,
    OpenAudioChannel 连续失败 3 次时调用 ForceRebuildEngine 清理 SDK 状态.
    应对 A 修复后仍可能出现的 SDK 内部状态污染 (ICE Agent 异常等).

  [C] volc_rtc_protocol.cc: DIAG_RTC_BIND_ENABLE 一键开关诊断埋点
    在 join_room 前/后 + ForceRebuildEngine 前/后打印 lwIP socket fd / heap /
    psram / WiFi rssi / errno, 偶发失败时直接定位根因.
    验证完成后改 0 关闭, 编译器消除 #if 块, 零运行时开销.

============ 文件改动 ============

  sdkconfig:
    +CONFIG_BT_ALLOCATION_FROM_SPIRAM_FIRST=y    (BLE 配网修复)
    +CONFIG_LWIP_MAX_SOCKETS=10 → 20             (方案 A)

  main/application.h:
    +int audio_channel_retry_count_ = 0;         (RTC 重试计数)

  main/application.cc:
    OpenAudioChannel 失败处加重试计数 + 连续失败 3 次调 ForceRebuildEngine,
    static_cast<VolcRtcProtocol*>(protocol_.get()) (ESP-IDF 默认 -fno-rtti).

  main/protocols/volc_rtc_protocol.h:
    +void ForceRebuildEngine() 声明.

  main/protocols/volc_rtc_protocol.cc:
    +DIAG_RTC_BIND_ENABLE 开关 + diag_count_used_sockets() 工具函数,
    +OpenAudioChannel Pre-Join / Post-Fail DIAG 埋点,
    +ForceRebuildEngine() 实现 (volc_rtc_stop + volc_rtc_destroy + 等 2 秒 + 触发重建).

============ 关联资源 ============
  Baji commit 70f0cdd: feat(rtc): 偶发连接失败完整修复 (A+B+C 三件套)
  Baji commit bffd316: feat(provisioning): BLE 配网完整修复
  全局 CLAUDE.md "BLE 配网 DRAM 紧张完整排查流程" 章节
  项目记忆 project_ble_provisioning_issues.md

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-21 15:15:34 +08:00
f3cc5b4f5a chore: 跟踪 sdkconfig 保证多电脑 clone 后可直接编译
.gitignore 移除 sdkconfig 那行 (sdkconfig.old 仍忽略),
首次提交当前 sdkconfig (kapi 软件 AEC + 火山 RTC 已验证配置).

Why: 后续在其他电脑拉取代码时无需 idf.py reconfigure,
     避免 menuconfig 默认值与已验证配置不一致导致项目跑不起来.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-19 16:23:40 +08:00