增加主机端0x9C与0x9D功能码

0x9C调整心率拟合公式
0x9D告知治疗阶段与疾病类型
This commit is contained in:
2025-08-19 11:55:25 +08:00
parent 0be829f720
commit 42739b7bab

View File

@ -29,6 +29,7 @@ To view a copy of this license, visit [https://creativecommons.org/licenses/by-n
2.增加头戴设备部分功能码
* V0.4: 2025.0729.1457 江鑫辉
1.增加头戴设备功能控制指令
2.增加主机端0x9C与0x9D功能码
---
@ -128,16 +129,18 @@ HEX: 5A 01 FF 40 00 64 00 00 00 93 9E FF 3F 93 9E FF 3F 93 9E FF 3F 7F 4B 00 00
#### 5.1. 0x80~0x9f: 向头戴设备发送数据或指令
| 功能码 | 功能名称 | 数据段数据个数 | 每个数据的类型 | 备注 |
| ------ | ------------------ | -------------- | -------------- | ---------------------------------------------------- |
| 0x80 | 一个表示正常的编码 | 0 | \\ | 直接被头戴设备丢弃 |
| 0x81 | 接收的信息出错 | 1 | uint8_t | 提示接收出现问题,不一定被处理 |
| 0x90 | 启动配对流程 | 0 | \\ | 头戴设备接收此指令后清除设备ID等信息并重新尝试配对 |
| 0x91 | 告知设备ID | 1 | uint8_t | 告知设备ID |
| 0x98 | 控制开启下位机功能 | 1 | uint16_t | 开启 FFT LPF HPF NOTCH 等功能 |
| 0x99 | 控制关闭下位机功能 | 1 | uint16_t | 关闭 FFT LPF HPF NOTCH 等功能 |
| 0x9A | 控制下位机灯光 | 1 | uint8_t | 控制LED灯 |
| 0x9B | 控制播放音频与音量 | 2 | uint8_t | |
| 功能码 | 功能名称 | 数据段数据个数 | 每个数据的类型 | 备注 |
| ------ | ---------------------- | -------------- | -------------- | ---------------------------------------------------- |
| 0x80 | 一个表示正常的编码 | 0 | \\ | 直接被头戴设备丢弃 |
| 0x81 | 接收的信息出错 | 1 | uint8_t | 提示接收出现问题,不一定被处理 |
| 0x90 | 启动配对流程 | 0 | \\ | 头戴设备接收此指令后清除设备ID等信息并重新尝试配对 |
| 0x91 | 告知设备ID | 1 | uint8_t | 告知设备ID |
| 0x98 | 控制开启下位机功能 | 1 | uint16_t | 开启 FFT LPF HPF NOTCH 等功能 |
| 0x99 | 控制关闭下位机功能 | 1 | uint16_t | 关闭 FFT LPF HPF NOTCH 等功能 |
| 0x9A | 控制下位机灯光 | 1 | uint8_t | 控制LED灯 可用于寻找设备 |
| 0x9B | 控制播放音频与音量 | 2 | uint8_t | |
| 0x9C | 修改下位机心率拟合系数 | 9 | int32_t | 微调心率计算结果 |
| 0x9D | 告知治疗阶段与疾病类型 | 2 | uint8_t | 告知治疗阶段与疾病类型 |
### 5.2 功能码详解
@ -218,17 +221,17 @@ HEX: 5A 00 00 98 00 02 00 00 00 data1_L data1_H crc16_L crc16_H A5
**data1参数值对应功能描述**
| bit Num | 对应功能 | 参数值对应功能描述 |
| ---------- | ------------- | ------------------ |
| MSB ==> 15 | 暂无 | |
| 7~14 | 暂无 | |
| bit Num | 对应功能 | 参数值对应功能描述 |
| ---------- | -------------- | ------------------ |
| MSB ==> 15 | 暂无 | |
| 7~14 | 暂无 | |
| 6 | EMG 带通滤波器 | NOTCH |
| 5 | EMG 高通滤波器 | HPF |
| 4 | EMG 低通滤波器 | LPF |
| 3 | EEG 带通滤波器 | NOTCH |
| 2 | EEG 高通滤波器 | HPF |
| 1 | EEG 低通滤波器 | LPF |
| LSB ==> 0 | FFT 脑波分解 | |
| LSB ==> 0 | FFT 脑波分解 | |
#### 5.2. 0x99 控制关闭下位机功能
@ -282,6 +285,113 @@ HEX: 5A 00 00 9B 00 02 00 00 00 audio_id volume crc16_L crc16_H A5
| volume | 设置音量 | uint8_t | 0xFF | 不设置音量仅播放音频 |
| crc16 | crc16校验值 | uint16_t | xx | \\ |
#### 5.2. 0x9C 微调心率计算结果
数据帧示例:
``` HEX
HEX: 5A 00 00 9C 00 24 00 00 00 data1_LL data1_LH data1_HL data1_HH (data2_ * 4) (data3_ * 4) ... (data9_ * 4) crc16_L crc16_H A5
```
| 参数名称 | 参数描述 | 参数类型 | 参数值 | 参数值对应功能描述 |
| -------- | ------------------ | -------- | --------- | ----------------------------------------------------------------------------------------------------- |
| data_n | 对应下方公式的参数 | uint8_t | 0x00~0xFE | 接收到的9个数据会作为数组传入下方代码中的HR_fitting_update_parameters (int32 *HR_fitting_parameters); |
| crc16 | crc16校验值 | uint16_t | xx | \\ |
```C
// ====== HR 三段拟合的9个参数 =======
// a与b需乘以0.000001保证小数点后6位
static int32_t HR_fitting_parameters_f1;
static float HR_fitting_parameters_a1;
static float HR_fitting_parameters_b1;
static int32_t HR_fitting_parameters_f2;
static float HR_fitting_parameters_a2;
static float HR_fitting_parameters_b2;
static int32_t HR_fitting_parameters_f3;
static float HR_fitting_parameters_a3;
static float HR_fitting_parameters_b3;
// ===== 更新 HR 三段拟合的9个参数 ========
static void
HR_fitting_update_parameters (int32 *HR_fitting_parameters)
{
HR_fitting_parameters_f1 = HR_fitting_parameters[0];
HR_fitting_parameters_a1 = HR_fitting_parameters[1] * 0.000001;
HR_fitting_parameters_b1 = HR_fitting_parameters[2] * 0.000001;
HR_fitting_parameters_f2 = HR_fitting_parameters[3];
HR_fitting_parameters_a2 = HR_fitting_parameters[4] * 0.000001;
HR_fitting_parameters_b2 = HR_fitting_parameters[5] * 0.000001;
HR_fitting_parameters_f3 = HR_fitting_parameters[6];
HR_fitting_parameters_a3 = HR_fitting_parameters[7] * 0.000001;
HR_fitting_parameters_b3 = HR_fitting_parameters[8] * 0.000001;
WriteParametersIntoFlash (); // 保存参数
};
// ===== HR 三段拟合 ========
static void
HR_fitting (uint16_t *inputHR_p, uint16_t *outputHR_p)
{
uint16_t HR_temp = *inputHR_p;
if (HR_temp < HR_fitting_parameters_f1)
{
*outputHR_p = (uint16_t)(HR_fitting_parameters_a1 * HR_temp
+ HR_fitting_parameters_b1);
}
else if (HR_temp < HR_fitting_parameters_f2)
{
*outputHR_p = (uint16_t)(HR_fitting_parameters_a2 * HR_temp
+ HR_fitting_parameters_b2);
}
else if (HR_temp < HR_fitting_parameters_f3)
{
*outputHR_p = (uint16_t)(HR_fitting_parameters_a3 * HR_temp
+ HR_fitting_parameters_b3);
}
else
{
*outputHR_p = HR_temp;
}
}
```
```mermaid
flowchart TD
A[开始] --> B{更新矫正参数}
B --> C[从输入获取新参数]
C --> D[对a/b乘以0.000001转小数]
D --> E[保存到存储器]
E --> F[参数更新完成]
G[心率矫正] --> H{判断心率值}
H --> |心率 < f1| I[用第一段公式矫正:\n输出 = a1*心率 + b1]
H --> |f1 ≤ 心率 < f2| J[用第二段公式矫正:\n输出 = a2*心率 + b2]
H --> |f2 ≤ 心率 < f3| K[用第三段公式矫正:\n输出 = a3*心率 + b3]
H --> |心率 ≥ f3| L[直接输出原始心率]
L --> M[矫正结束]
```
#### 5.2. 0x9D 告诉下位机当前治疗阶段与疾病类型
数据帧示例:
``` HEX
HEX: 5A 00 00 9D 00 02 00 00 00 TreatmentPhase DiseaseTypes crc16_L crc16_H A5
```
| 参数名称 | 参数描述 | 参数类型 | 参数值 | 参数值对应功能描述 |
| -------------- | -------------- | -------- | --------- | ------------------------------------------------ |
| TreatmentPhase | 治疗阶段的编号 | uint8_t | 0x00 | 待机阶段 用于停止基线采集 或 仅指定疾病类型 |
| TreatmentPhase | 治疗阶段的编号 | uint8_t | 0x01 | 前基线评估 开始记录各指标平均值 直到切换模式结束 |
| TreatmentPhase | 治疗阶段的编号 | uint8_t | 0x02 | 后基线评估 开始记录各指标平均值 直到切换模式结束 |
| DiseaseTypes | 疾病类型编号 | uint8_t | 0x00 | 不传输疾病类型 仅传输治疗阶段的编号 |
| DiseaseTypes | 疾病类型编号 | uint8_t | 0x01~0xFE | 疾病类型编号 |
| crc16 | crc16校验值 | uint16_t | xx | \\ |
治疗阶段的编号
疾病类型编号
## 六.头戴设备功能码表
当连接建立后,头戴设备向电脑发送数据时的功能码对应的功能
@ -504,3 +614,5 @@ HEX: 5A 01 ID 60 00 02 00 00 00 AA_L AA_H crc16_L crc16_H A5
### 7.1 TODO
--TODO
## 附录