133 lines
3.8 KiB
Markdown
133 lines
3.8 KiB
Markdown
|
|
# 蓝牙原始数据显示测试指南
|
|||
|
|
|
|||
|
|
## 🎯 功能说明
|
|||
|
|
|
|||
|
|
现在应用已经支持**立即显示蓝牙接收到的原始数据**,无需等待信号处理完成。
|
|||
|
|
|
|||
|
|
### 数据流处理顺序
|
|||
|
|
1. **蓝牙数据接收** → 立即解析
|
|||
|
|
2. **原始数据显示** → 立即画图(新增)
|
|||
|
|
3. **信号处理** → 后台处理
|
|||
|
|
4. **处理后数据显示** → 可选显示
|
|||
|
|
|
|||
|
|
## 📱 测试步骤
|
|||
|
|
|
|||
|
|
### 第一步:连接蓝牙设备
|
|||
|
|
1. **点击"连接蓝牙"按钮**
|
|||
|
|
2. **等待扫描完成**
|
|||
|
|
3. **选择你的ECG设备**
|
|||
|
|
4. **等待连接成功**
|
|||
|
|
|
|||
|
|
### 第二步:验证原始数据显示
|
|||
|
|
1. **观察状态信息**:
|
|||
|
|
```
|
|||
|
|
蓝牙状态: 设备已连接
|
|||
|
|
蓝牙状态: 服务发现成功
|
|||
|
|
蓝牙状态: 数据通道已建立,开始接收数据
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
2. **检查数据接收日志**:
|
|||
|
|
```
|
|||
|
|
接收到蓝牙数据: X 字节
|
|||
|
|
解析出 X 个数据包
|
|||
|
|
立即发送原始数据到图表,处理 X 个数据包
|
|||
|
|
发送原始数据到通道 X,数据长度: X
|
|||
|
|
显示原始数据到图表,通道: X,数据长度: X
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
3. **观察图表显示**:
|
|||
|
|
- ✅ ECG图表立即变为可见
|
|||
|
|
- ✅ 原始波形立即开始显示
|
|||
|
|
- ✅ 双视图同步更新(10秒节奏视图 + 2.5秒波形视图)
|
|||
|
|
|
|||
|
|
### 第三步:验证实时性
|
|||
|
|
1. **数据接收延迟**:应该几乎无延迟
|
|||
|
|
2. **图表更新频率**:与蓝牙数据接收频率一致
|
|||
|
|
3. **波形连续性**:原始数据应该连续显示
|
|||
|
|
|
|||
|
|
## 🔍 关键代码位置
|
|||
|
|
|
|||
|
|
### 1. 原始数据发送
|
|||
|
|
```kotlin
|
|||
|
|
// DataManager.kt - 第97行
|
|||
|
|
sendRawDataToCharts(packets)
|
|||
|
|
|
|||
|
|
// DataManager.kt - 第177行
|
|||
|
|
private fun sendRawDataToCharts(packets: List<SensorData>) {
|
|||
|
|
// 直接处理原始数据包,不进行通道映射
|
|||
|
|
for (packet in packets) {
|
|||
|
|
val channelData = packet.getChannelData()
|
|||
|
|
if (channelData != null) {
|
|||
|
|
for ((channelIndex, channel) in channelData.withIndex()) {
|
|||
|
|
// 立即发送原始数据到图表
|
|||
|
|
realTimeCallback?.onRawDataAvailable(channelIndex, channel)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2. 原始数据显示
|
|||
|
|
```kotlin
|
|||
|
|
// MainActivity.kt - 第572行
|
|||
|
|
override fun onRawDataAvailable(channelIndex: Int, rawData: List<Float>) {
|
|||
|
|
// 立即显示原始数据到图表
|
|||
|
|
binding.ecgChartContainer.visibility = View.VISIBLE
|
|||
|
|
binding.ecgRhythmView.updateData(rawData)
|
|||
|
|
binding.ecgWaveformView.updateData(rawData)
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 🎉 预期效果
|
|||
|
|
|
|||
|
|
### 连接成功时:
|
|||
|
|
- ✅ 蓝牙设备连接成功
|
|||
|
|
- ✅ 数据通道建立
|
|||
|
|
- ✅ 开始接收ECG数据
|
|||
|
|
|
|||
|
|
### 原始数据显示时:
|
|||
|
|
- ✅ ECG图表立即可见
|
|||
|
|
- ✅ 原始波形立即显示
|
|||
|
|
- ✅ 双视图同步更新
|
|||
|
|
- ✅ 无延迟实时显示
|
|||
|
|
|
|||
|
|
### 数据特点:
|
|||
|
|
- **原始性**:未经任何滤波处理
|
|||
|
|
- **实时性**:接收即显示
|
|||
|
|
- **连续性**:数据流连续
|
|||
|
|
- **完整性**:包含所有通道数据
|
|||
|
|
|
|||
|
|
## ⚠️ 注意事项
|
|||
|
|
|
|||
|
|
### 1. 数据格式
|
|||
|
|
- **支持的数据类型**:所有已定义的数据类型
|
|||
|
|
- **通道数量**:根据设备类型自动识别
|
|||
|
|
- **采样率**:根据数据类型自动设置
|
|||
|
|
|
|||
|
|
### 2. 显示特点
|
|||
|
|
- **原始信号**:包含噪声和基线漂移
|
|||
|
|
- **实时更新**:与蓝牙数据接收同步
|
|||
|
|
- **多通道**:支持多通道同时显示
|
|||
|
|
|
|||
|
|
### 3. 性能考虑
|
|||
|
|
- **UI线程**:原始数据显示在主线程
|
|||
|
|
- **内存使用**:图表自动管理数据缓冲
|
|||
|
|
- **更新频率**:与蓝牙数据接收频率一致
|
|||
|
|
|
|||
|
|
## 🔧 调试信息
|
|||
|
|
|
|||
|
|
### 关键日志
|
|||
|
|
```
|
|||
|
|
DataManager: 立即发送原始数据到图表,处理 X 个数据包
|
|||
|
|
DataManager: 发送原始数据到通道 X,数据长度: X
|
|||
|
|
MainActivity: 显示原始数据到图表,通道: X,数据长度: X
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 状态检查
|
|||
|
|
- 蓝牙连接状态
|
|||
|
|
- 数据接收频率
|
|||
|
|
- 图表更新状态
|
|||
|
|
- 通道数据完整性
|
|||
|
|
|
|||
|
|
现在你的应用可以立即显示蓝牙接收到的原始数据了!连接设备后就能看到实时波形。🚀
|