diff --git a/app/src/main/java/com/example/medilightv2android/ble/BleManager.kt b/app/src/main/java/com/example/medilightv2android/ble/BleManager.kt index 8bbd079..07090c6 100644 --- a/app/src/main/java/com/example/medilightv2android/ble/BleManager.kt +++ b/app/src/main/java/com/example/medilightv2android/ble/BleManager.kt @@ -613,9 +613,10 @@ class BleManager private constructor(private val context: Context) { if (idx >= 0) discoveredDevices[idx] = discoveredDevices[idx].copy(isConnected = true, isConnecting = false) isConnected.value = true connectedDeviceName.value = try { gatt.device.name ?: "Unknown" } catch (_: Exception) { "Unknown" } - // Auto-detect device preset from name + // Auto-detect device preset + endian from name com.example.medilightv2android.managers.PiezoHW.autoDetectPreset(connectedDeviceName.value) - logd { "Device preset: ${com.example.medilightv2android.managers.PiezoHW.presetName} (from '${connectedDeviceName.value}')" } + piezoCollector.forceBigEndian = connectedDeviceName.value.startsWith("VBT") + logd { "Device preset: ${com.example.medilightv2android.managers.PiezoHW.presetName}, endian: ${if (piezoCollector.forceBigEndian) "BE" else "LE"} (from '${connectedDeviceName.value}')" } lastConnectedAddress = gatt.device.address reconnectAttempt = 0 diff --git a/app/src/main/java/com/example/medilightv2android/ble/PiezoPacketCollector.kt b/app/src/main/java/com/example/medilightv2android/ble/PiezoPacketCollector.kt index 2ab6947..1678206 100644 --- a/app/src/main/java/com/example/medilightv2android/ble/PiezoPacketCollector.kt +++ b/app/src/main/java/com/example/medilightv2android/ble/PiezoPacketCollector.kt @@ -24,6 +24,7 @@ class PiezoPacketCollector { private var rawData = mutableListOf() private var hasFirstPacket = false private var detectedBigEndian = false + var forceBigEndian: Boolean = true // VBT 기기 기본 BE, 기기 연결 시 설정 // Multi-channel var isMultiChannel: Boolean = false; private set @@ -87,13 +88,21 @@ class PiezoPacketCollector { hasFirstPacket = true rawData.clear() - // Endian detection: first channel only → lock for remaining - if (currentChannel == 0 || !hasFirstPacket) { + // Endian detection: first channel → lock for remaining + // VBT 기기 = Big Endian, 2025MEDIP = Little Endian + // 자동 감지 fallback: 첫 샘플 기반 + if (currentChannel == 0) { val b6 = bytes.getOrElse(6) { 0 }.toInt() and 0xFF val b7 = bytes.getOrElse(7) { 0 }.toInt() and 0xFF val firstSampleLE = b6 or (b7 shl 8) val firstSampleBE = (b6 shl 8) or b7 - detectedBigEndian = firstSampleLE > 4095 && firstSampleBE <= 4095 + + detectedBigEndian = when { + firstSampleLE > 4095 && firstSampleBE <= 4095 -> true // 확실히 BE + firstSampleBE > 4095 && firstSampleLE <= 4095 -> false // 확실히 LE + else -> forceBigEndian // 둘 다 범위 내면 기기 기반 기본값 사용 + } + onLog?.invoke("Endian: ${if (detectedBigEndian) "BE" else "LE"} (LE=$firstSampleLE BE=$firstSampleBE force=$forceBigEndian)") } // Parse repeat count