BLE fix: msn? ASCII " " 포맷 변경 + PiezoMonitoring 진입 시 강제 polling

사용자 검증: ble.log에 rsn 응답이 보이지만 도넛차트는 0% 표시.

원인 1 — msn? 송신 포맷:
  기존: CRC16.buildCommandBE("msn", intArrayOf(0))
  → bytes: 6D 73 6E 3F 00 00 03 FE (BE param 2B)
  → 펌웨어가 응답 안 함 (rsn: 자체가 안 옴)

  다른 query 명령(mid?, mtb?, maa?, mqq?, mag?)은 모두 ASCII " " 포맷.
  msn?만 BE param 포맷이라 펌웨어가 인식 못 한 듯.

  수정: CRC16.buildCommandASCII("msn", " ")
  → bytes: 6D 73 6E 3F 20 ?? ?? (다른 query와 동일 패턴)

원인 2 — Clinical → Unpair → 새 연결 후 도넛차트 진입 시 batteryLevel=0:
  disconnectAndUnbond()에서 batteryLevel.value=0 reset됨.
  새 BLE 연결의 onDescriptorWrite → startBatteryPolling 호출은 PiezoMonitoring
  진입 전에 이미 완료. PiezoMonitoring의 LaunchedEffect에서 등록하는
  onConnectionStateChanged 콜백은 '상태 변경 시점'에만 트리거되므로
  이미 connected인 상태로 진입하면 호출 안 됨.

  수정: PiezoMonitoring 진입 시 isConnected.value==true이면 명시적으로
  startBatteryPolling() 한 번 더 호출 (idempotent — stopBatteryPolling 후 재시작).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-08 16:21:41 +09:00
parent 2801d2ae53
commit fb6f722b53
2 changed files with 10 additions and 1 deletions
@@ -461,7 +461,9 @@ class BleManager private constructor(private val context: Context) {
// ── Common Commands ──
fun sendBatteryQuery() {
sendRaw(CRC16.buildCommandBE("msn", intArrayOf(0)))
// mid?/mtb?/maa? 등 다른 단순 query와 동일한 ASCII " " 형식 — BE [0]은
// 펌웨어가 응답 안 함이 확인됨 (rsn: 자체가 안 옴, 2026-06-08).
sendRaw(CRC16.buildCommandASCII("msn", " "))
}
fun sendDeviceInfoQuery() {