ux: Sensor Alignment 4종 개선 (demo-final) — feature/tab-navigation 와 동등

1) 배너 거짓 양성 — BLE 데이터 수신 중인데 "기기 응답 없음" 뜨던 문제
   - BleManager.lastBleRxAt 추가, reb 수신마다 갱신
   - FirmwareWarningBanner: 최근 5초 내 RX 있으면 timedOut 무시
   - 1초 tick 으로 자동 재평가

2) Sensor Alignment 타이틀 26 → 32sp ExtraBold

3) 본문 레이아웃 재배치
   기존: Step → Hint → 일러스트
   변경: Step → 일러스트 (위로) → Hint (그림 아래, 22sp)

4) PNG 화살표 더 크게 + 살색 안 비치는 깜빡임
   - arrowDrawW 90 → 130 (44% 키움, 두꺼움 효과)
   - alpha 1.0 ↔ 0.85 (was 1.0 ↔ 0.35) — 살색 비침 차단
   - tween 180 → 220ms

추가:
  - mls 로그 파서 16bit BE 수정 (feature 와 동일 — 이전엔 항상 "mode 0" 표시)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-06-16 10:32:55 +09:00
parent e699567897
commit 5e39237a36
3 changed files with 47 additions and 23 deletions
@@ -85,6 +85,9 @@ class BleManager private constructor(private val context: Context) {
val firmwareVersion = mutableStateOf("") // "VBTFW0116"
val hardwareVersion = mutableStateOf("") // "VBTHW0100"
val serialNumber = mutableStateOf("") // "VBT26040001"
/** 마지막으로 의미있는 BLE RX (reb 등) 가 도착한 시각 ms.
* FirmwareWarningBanner false-positive 차단용. */
val lastBleRxAt = mutableStateOf(0L)
/** "VBTFW0116" → 116, 형식 안 맞으면 null. */
fun parseFirmwareBuild(raw: String): Int? {
@@ -460,7 +463,11 @@ class BleManager private constructor(private val context: Context) {
"mag" -> "NIRS gain query"
"mcj" -> "NIRS MCJ query"
"mid" -> "device info query"
"mls" -> "LED mode ${if (data.size > 4) data[4].toInt() and 0xFF else "?"}"
// mls 는 buildCommandBE 로 16bit BE 인코딩 → data[4]=High, data[5]=Low
"mls" -> "LED mode ${
if (data.size > 5) ((data[4].toInt() and 0xFF) shl 8) or (data[5].toInt() and 0xFF)
else "?"
}"
"msp" -> "IMU query"
"mbb" -> "full measurement (battery+IMU+temp+6ch)"
else -> ""
@@ -1130,6 +1137,7 @@ class BleManager private constructor(private val context: Context) {
val chNum = if (data.size > 5) data[5].toInt() and 0xFF else -1
debugLogger.rx("reb", data.size, "session=$chSession ch=$chNum ${samples}samples")
piezoCollector.addPacket(data)
lastBleRxAt.value = System.currentTimeMillis() // 기기 alive 마크
}
"red:" -> {
debugLogger.rx("red", data.size, "continuation")