# 蓝牙数据流处理指南

## 🎯 数据流处理架构

### 数据流向
```
蓝牙设备 → BluetoothManager → MainActivity → DataManager → ECG图表显示
```

### 处理流程
1. **蓝牙数据接收**: `BluetoothManager.onCharacteristicChanged`
2. **数据传递**: `MainActivity.onDataReceived`
3. **数据解析**: `DataManager.onBleNotify`
4. **信号处理**: `DataManager.processStreamingData`
5. **图表更新**: `MainActivity.onProcessedDataAvailable`

## 🔧 已完成的修改

### 1. BluetoothManager ✅
- **Nordic UART Service (NUS)** 协议支持
- **自动UUID匹配**: `6e400001-b5a3-f393-e0a9-68716563686f`
- **数据接收**: `onCharacteristicChanged` 回调
- **状态管理**: 连接状态、错误处理

### 2. MainActivity ✅
- **蓝牙回调实现**: `BluetoothManager.BluetoothCallback`
- **数据接收处理**: `onDataReceived` 方法
- **实时数据回调**: `DataManager.RealTimeDataCallback`
- **图表更新**: `onProcessedDataAvailable` 方法

### 3. DataManager ✅
- **蓝牙数据处理**: `onBleNotify` 方法
- **流式数据处理**: `processStreamingData` 方法
- **信号处理**: 高通滤波 → 低通滤波 → 陷波滤波
- **实时回调**: `onProcessedDataAvailable` 回调

### 4. ECG图表 ✅
- **实时更新**: `ECGRhythmView` 和 `ECGWaveformView`
- **数据缓冲**: 性能优化的数据缓冲机制
- **双视图显示**: 10秒节奏视图 + 2.5秒波形视图

## 📱 测试步骤

### 第一步：连接蓝牙设备
1. **点击"连接蓝牙"按钮**
2. **等待扫描完成**
3. **选择你的ECG设备**
4. **等待连接成功**

### 第二步：验证数据接收
1. **观察状态信息**：
   ```
   蓝牙状态: 设备已连接
   蓝牙状态: 服务发现成功
   蓝牙状态: 发现服务: 6e400001-b5a3-f393-e0a9-68716563686f
   蓝牙状态: 发现特征: 6e400002-b5a3-f393-e0a9-68716563686f
   蓝牙状态: 数据通道已建立，开始接收数据
   ```

2. **检查数据接收**：
   ```
   接收到蓝牙数据: X 字节
   解析出 X 个数据包
   ```

### 第三步：验证图表显示
1. **ECG图表变为可见**
2. **实时波形开始显示**
3. **双视图同步更新**：
   - **节奏视图**: 10秒显示窗口
   - **波形视图**: 2.5秒显示窗口

### 第四步：验证信号处理
1. **观察处理进度**：
   ```
   === 实时流式处理 ===
   处理进度: XX%
   总样本数: XXX
   已处理样本: XXX
   实时曲线图已更新 ✓
   ```

2. **检查滤波效果**：
   - 信号应该更加平滑
   - 噪声应该被有效抑制
   - 波形应该清晰可见

## 🔍 关键代码位置

### 1. 蓝牙数据接收
```kotlin
// BluetoothManager.kt - 第468行
override fun onCharacteristicChanged(gatt: BluetoothGatt, characteristic: BluetoothGattCharacteristic) {
    val data = characteristic.value
    callback?.onDataReceived(data)
}
```

### 2. 数据传递处理
```kotlin
// MainActivity.kt - 第656行
override fun onDataReceived(data: ByteArray) {
    Thread {
        dataManager.onBleNotify(data)
        runOnUiThread {
            binding.ecgChartContainer.visibility = View.VISIBLE
        }
    }.start()
}
```

### 3. 数据解析处理
```kotlin
// DataManager.kt - 第73行
fun onBleNotify(chunk: ByteArray) {
    ensureParser()
    nativeCallback.streamParserAppend(parserHandle, chunk)
    val packets = nativeCallback.streamParserDrainPackets(parserHandle)
    processStreamingData(packets)
}
```

### 4. 图表更新
```kotlin
// MainActivity.kt - 第558行
override fun onProcessedDataAvailable(channelIndex: Int, processedData: List<Float>) {
    binding.ecgRhythmView.updateData(processedData)
    binding.ecgWaveformView.updateData(processedData)
}
```

## 🎉 预期效果

### 连接成功时：
- ✅ 蓝牙设备连接成功
- ✅ 数据通道建立
- ✅ 开始接收ECG数据

### 数据处理时：
- ✅ 实时数据解析
- ✅ 信号滤波处理
- ✅ 通道映射完成

### 图表显示时：
- ✅ ECG图表可见
- ✅ 实时波形显示
- ✅ 双视图同步更新
- ✅ 平滑的动画效果

### 性能优化：
- ✅ 后台数据处理
- ✅ UI线程不阻塞
- ✅ 数据缓冲机制
- ✅ 实时回调更新

## ⚠️ 注意事项

### 1. 数据格式
- **Nordic UART Service**: 原始字节流
- **数据解析**: 自动协议解析
- **通道映射**: 8通道 → 12通道

### 2. 性能考虑
- **后台处理**: 避免UI阻塞
- **数据缓冲**: 优化内存使用
- **更新频率**: 平衡实时性和性能

### 3. 错误处理
- **连接失败**: 自动重试机制
- **数据异常**: 错误日志记录
- **UI异常**: 异常捕获处理

现在你的应用已经完全支持蓝牙数据流处理，可以实时接收、处理和显示ECG数据了！🚀
