# [002] `DevReport_Active` 부팅 기본값 + 재연결 시 유지 여부

- **Status:** Open
- **Priority:** High
- **Raised:** 2026-04-08
- **Raised by:** 앱 팀 (Bruce)
- **앱 측 영향 코드:**
  - `packages/roomfit_protocol/lib/src/responses/response.dart` — `ReportResponse` 파서 (dev 36B 전용)
  - 앱은 `0xF5 0x20`을 자동 전송하지 **않음** (의도적 결정)

---

## 배경

앱은 `0x41` 리포트를 **dev 36B 단일 포맷**으로 처리하도록 정리했습니다.
이 결정은 v3 12B fallback 코드와 앱 측 활성화 절차를 모두 제거하면서
이루어졌으며, 자세한 사유는 `CLAUDE.md`의 *ReportResponse 포맷* 섹션과
`docs/reference/rep-detection-research.md` §8에 정리되어 있습니다.

핵심: VBT 메트릭(MCV, peak power, ROM)과 mode-aware 분석은 dev 36B에만
포함된 speed/accel/icmd/region/weightMode 바이트가 필수입니다. v3 12B는
사실상 무용지물이라 앱이 받지 않습니다.

그런데 MCU 소스를 보면:

```c
// docs/reference/mcu-source/Core/Src/protocol.c:220
uint8_t DevReport_Active = 0;  // 0=v3, 1=dev
```

부팅 시 기본값은 **v3 모드**입니다. dev로 전환하려면 `0xF5 0x20`을
누군가 보내야 합니다 (`protocol.c:1392-1396`).

## 질문

### Q1. 부팅 시 `DevReport_Active = 1` 로 바꿀 수 있습니까?

가능하다면 `protocol.c:220`에서 `= 0` → `= 1`로 한 줄만 바꾸면 됩니다.
이 경우 부팅 직후 `Start_Report()` 호출 시점부터 dev 36B가 흐릅니다.

영향 받을 만한 곳:
- 기존 v3만 받는 클라이언트(있다면 어떤 게 있는지 알려주세요). 우리 앱은
  v3 패킷을 받으면 그냥 drop하므로 괜찮습니다만, 다른 유틸리티/테스터
  툴이 있다면 같이 점검 필요합니다.

### Q2. BLE 연결이 끊어졌다 다시 연결되면 `DevReport_Active`는 어떻게 됩니까?

세 가지 시나리오 중 어느 쪽인지 확인 부탁드립니다:

- **(a) 재연결 후에도 마지막 값 유지** — 재연결 후 별도 작업 없음. 가장 깔끔.
- **(b) 재연결 시 0으로 리셋** — Q1에서 부팅 기본값을 1로 바꿔도 disconnect
  한 번이면 v3로 돌아감. 이 경우 매 연결마다 펌웨어가 자동으로 1로
  복귀시키거나, 앱이 매 연결마다 `0xF5 0x20`을 다시 보내는 수밖에 없음.
- **(c) 부팅 시점의 값(`= 0`)으로 리셋** — (b)와 동일한 문제.

### Q3. 만약 (b)/(c) 라면, 펌웨어 측 자동 복귀 가능합니까?

예: BLE on-connect 콜백에서 `DevReport_Active = 1; Start_Report();`을 자동
실행. 이렇게 하면 앱이 활성화 명령을 보낼 책임이 없어집니다.

## 우리가 하지 않으려는 이유 (참고)

앱이 매 연결마다 `0xF5 0x20`을 자동 전송하는 방식은 명시적으로 거부했습니다:
- 활성화 명령의 ACK를 기다리는 동안 무엇이 도착할지 정의되지 않음 (v3 12B?
  아무것도 안 옴? race condition).
- 앱이 disconnect 직전에 보낸 명령의 결과(reboot 등)와 reconnect 후 활성화
  명령이 시간상 겹칠 위험.
- 펌웨어가 "정식 운동 데이터 = dev 36B"라는 정책의 주체이길 원함. 클라이언트가
  포맷을 결정하는 구조는 깨지기 쉬움.

## 참고 (References)

- 활성화 토글 코드: `docs/reference/mcu-source/Core/Src/protocol.c:1392-1401`
- `Start_Report()` 분기: `docs/reference/mcu-source/Core/Src/protocol.c:401-409`
- 앱 측 design decision 메모: `CLAUDE.md` *ReportResponse 포맷 (CRITICAL)* 섹션

---

## MCU 측 응답

<!-- 펌웨어 팀이 작성. 자유 형식. 작성자/날짜/펌웨어 버전 함께 부탁드립니다. -->

_(미응답)_

---

## 결과 (Outcome)

<!-- 응답 받은 후 앱 팀이 정리. 적용된 펌웨어 버전, 앱 측 후속 PR 번호, 검증 결과 등. -->

_(N/A)_
